diff --git a/scripts/check-admin-m08-b.mjs b/scripts/check-admin-m08-b.mjs index 3ecc76c..23ba329 100644 --- a/scripts/check-admin-m08-b.mjs +++ b/scripts/check-admin-m08-b.mjs @@ -1,8 +1,9 @@ import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; -const root = new URL('..', import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1'); +const root = fileURLToPath(new URL('..', import.meta.url)); const read = (path) => readFileSync(join(root, path), 'utf8'); const packageJson = JSON.parse(read('admin/package.json')); diff --git a/scripts/check-admin-m08-d.mjs b/scripts/check-admin-m08-d.mjs index bc0e60d..7d13f04 100644 --- a/scripts/check-admin-m08-d.mjs +++ b/scripts/check-admin-m08-d.mjs @@ -1,8 +1,9 @@ import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; -const root = new URL('..', import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1'); +const root = fileURLToPath(new URL('..', import.meta.url)); const read = (path) => readFileSync(join(root, path), 'utf8'); const app = read('admin/src/App.vue'); diff --git a/scripts/check-miniapp-m08-a.mjs b/scripts/check-miniapp-m08-a.mjs index 58a4720..9bc5fd7 100644 --- a/scripts/check-miniapp-m08-a.mjs +++ b/scripts/check-miniapp-m08-a.mjs @@ -1,8 +1,9 @@ import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; -const root = new URL('..', import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1'); +const root = fileURLToPath(new URL('..', import.meta.url)); const read = (path) => readFileSync(join(root, path), 'utf8'); const appJson = JSON.parse(read('miniapp/app.json')); diff --git a/scripts/check-miniapp-m08-c.mjs b/scripts/check-miniapp-m08-c.mjs index 72a0521..b662a24 100644 --- a/scripts/check-miniapp-m08-c.mjs +++ b/scripts/check-miniapp-m08-c.mjs @@ -1,8 +1,9 @@ import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; -const root = new URL('..', import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1'); +const root = fileURLToPath(new URL('..', import.meta.url)); const read = (path) => readFileSync(join(root, path), 'utf8'); const appJson = JSON.parse(read('miniapp/app.json')); diff --git a/scripts/check-script-path-portability.mjs b/scripts/check-script-path-portability.mjs new file mode 100644 index 0000000..50ff55a --- /dev/null +++ b/scripts/check-script-path-portability.mjs @@ -0,0 +1,55 @@ +import assert from 'node:assert/strict'; +import { + cpSync, + mkdtempSync, + mkdirSync, + rmSync +} from 'node:fs'; +import { tmpdir } from 'node:os'; +import { basename, join } from 'node:path'; +import { spawnSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; + +const root = fileURLToPath(new URL('..', import.meta.url)); +const temporaryRoot = mkdtempSync(join(tmpdir(), '棋牌 路径回归 ')); +const checks = [ + 'check-miniapp-m08-a.mjs', + 'check-miniapp-m08-c.mjs', + 'check-admin-m08-b.mjs', + 'check-admin-m08-d.mjs' +]; + +const copySource = (name) => { + const source = join(root, name); + const target = join(temporaryRoot, name); + cpSync(source, target, { + recursive: true, + filter: (entry) => { + const part = basename(entry); + return part !== 'node_modules' && part !== 'dist'; + } + }); +}; + +try { + copySource('admin'); + copySource('backend'); + copySource('database'); + copySource('miniapp'); + mkdirSync(join(temporaryRoot, 'scripts')); + for (const check of checks) { + cpSync(join(root, 'scripts', check), join(temporaryRoot, 'scripts', check)); + const result = spawnSync(process.execPath, [join(temporaryRoot, 'scripts', check)], { + cwd: temporaryRoot, + encoding: 'utf8' + }); + assert.equal( + result.status, + 0, + `${check} failed in ${temporaryRoot}\n${result.stdout}${result.stderr}` + ); + } + console.log(`PASS: four static checks support a Unicode/space repository path (${temporaryRoot}).`); +} finally { + rmSync(temporaryRoot, { recursive: true, force: true }); +}