diff --git a/resources/tester/helper_298_2_b07_buttons.cjs b/resources/tester/helper_298_2_b07_buttons.cjs index f145823dd..549f1d48c 100644 --- a/resources/tester/helper_298_2_b07_buttons.cjs +++ b/resources/tester/helper_298_2_b07_buttons.cjs @@ -4,7 +4,7 @@ */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const B07 = path.join(__dirname, "..", "..", "B07_DesignDetail"); const calls = []; @@ -36,14 +36,13 @@ global.localStorage = { global.location = { reload: () => calls.push(["reload"]) }; global.document = { querySelectorAll: () => [] }; -function loadTs(file) { - const js = ts.transpileModule(fs.readFileSync(file, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - new Function("exports", "module", "require", js)(box.exports, box, (r) => STUBS[r] ?? {}); - return box.exports; -} +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), + cache: false, + requireFor: (full) => { + return (r) => STUBS[r] ?? {}; + }, +}); const Save = loadTs(path.join(B07, "B07_DesignDetail_UI_Save.ts")); diff --git a/resources/tester/helper_391_routeedit_plan_draw.cjs b/resources/tester/helper_391_routeedit_plan_draw.cjs index 91ba4ea0c..6650277c7 100644 --- a/resources/tester/helper_391_routeedit_plan_draw.cjs +++ b/resources/tester/helper_391_routeedit_plan_draw.cjs @@ -3,27 +3,18 @@ */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const B05 = path.join(__dirname, "..", "..", "B05_Profile"); const STUBS = { "./B05_Profile_UI_RouteEdit_Input": { pickHover: () => null } }; -const cache = new Map(); -function loadTs(full) { - if (cache.has(full)) return cache.get(full); - const js = ts.transpileModule(fs.readFileSync(full, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - cache.set(full, box.exports); - const localRequire = (request) => { +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), + requireFor: (full) => (request) => { if (STUBS[request]) return STUBS[request]; if (request.startsWith(".")) return loadTs(path.join(path.dirname(full), `${request}.ts`)); return require(request); - }; - new Function("exports", "module", "require", js)(box.exports, box, localRequire); - cache.set(full, box.exports); - return box.exports; -} + }, +}); /** 그린 것만 적는 가짜 캔버스 — 선 = moveTo/lineTo 점 · 점 = arc 가운데 · 획 색. */ function fakeContext() { diff --git a/resources/tester/helper_399_plan_structure_marks.cjs b/resources/tester/helper_399_plan_structure_marks.cjs index 540d11f70..a5a9b13a3 100644 --- a/resources/tester/helper_399_plan_structure_marks.cjs +++ b/resources/tester/helper_399_plan_structure_marks.cjs @@ -5,7 +5,7 @@ */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const B05 = path.join(__dirname, "..", "..", "B05_Profile"); const out = {}; @@ -94,25 +94,16 @@ const STUBS = { ], }, }; -const cache = new Map(); -function loadTs(full) { - if (cache.has(full)) return cache.get(full); - const js = ts.transpileModule(fs.readFileSync(full, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - cache.set(full, box.exports); - const localRequire = (request) => { +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), + requireFor: (full) => (request) => { if (STUBS[request]) return STUBS[request]; if (request.startsWith("@ui/")) return loadTs(path.join(B05, "..", "ui_template", `${request.slice(4)}.ts`)); if (request.startsWith(".")) return loadTs(path.join(path.dirname(full), `${request}.ts`)); return require(request); - }; - new Function("exports", "module", "require", js)(box.exports, box, localRequire); - cache.set(full, box.exports); - return box.exports; -} + }, +}); /** 그린 것만 적는 가짜 캔버스 — 획 = 색 · 굵기 · 그때 옮긴 자리(translate) · 선 점. */ function fakeContext(canvas) { diff --git a/resources/tester/helper_403_triangle_angle.cjs b/resources/tester/helper_403_triangle_angle.cjs index 72e54682e..876966f48 100644 --- a/resources/tester/helper_403_triangle_angle.cjs +++ b/resources/tester/helper_403_triangle_angle.cjs @@ -1,26 +1,22 @@ /* 403 곡선 창 하단 글 헬퍼 — `_Label.curveInfoText` 를 트랜스파일해 경우별 글을 JSON 으로 낸다. */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const B05 = path.join(__dirname, "..", "..", "B05_Profile"); const STUBS = { "@ui/ui_template_elements": { createButton: () => null }, "./B05_Profile_UI_Panel_Fields": { numberField: () => null, toggleButton: () => null }, }; -function loadTs(full) { - const js = ts.transpileModule(fs.readFileSync(full, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - const localRequire = (request) => { +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), + cache: false, + requireFor: (full) => (request) => { if (STUBS[request]) return STUBS[request]; if (request.startsWith(".")) return loadTs(path.join(path.dirname(full), `${request}.ts`)); return require(request); - }; - new Function("exports", "module", "require", js)(box.exports, box, localRequire); - return box.exports; -} + }, +}); const { curveInfoText } = loadTs(path.join(B05, "B05_Profile_UI_RouteEdit_Label.ts")); process.stdout.write( diff --git a/resources/tester/helper_411_a_cross_structure.cjs b/resources/tester/helper_411_a_cross_structure.cjs index b31414518..f575cfbfd 100644 --- a/resources/tester/helper_411_a_cross_structure.cjs +++ b/resources/tester/helper_411_a_cross_structure.cjs @@ -5,7 +5,7 @@ */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const B05 = path.join(__dirname, "..", "..", "B05_Profile"); const out = {}; @@ -84,23 +84,14 @@ const STUBS = { routeCrossSource: () => null, }, }; -const cache = new Map(); -function loadTs(full) { - if (cache.has(full)) return cache.get(full); - const js = ts.transpileModule(fs.readFileSync(full, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - cache.set(full, box.exports); - const localRequire = (request) => { +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), + requireFor: (full) => (request) => { if (STUBS[request]) return STUBS[request]; if (request.startsWith(".")) return loadTs(path.join(path.dirname(full), `${request}.ts`)); return require(request); - }; - new Function("exports", "module", "require", js)(box.exports, box, localRequire); - cache.set(full, box.exports); - return box.exports; -} + }, +}); const cross = loadTs(path.join(B05, "B05_Profile_UI_RouteEdit_Cross.ts")); const station = (key, chainageM, kind, id = null) => ({ key, chainageM, kind, id }); diff --git a/resources/tester/helper_438_1_straighten.cjs b/resources/tester/helper_438_1_straighten.cjs index 88d6355f9..ebbcb8984 100644 --- a/resources/tester/helper_438_1_straighten.cjs +++ b/resources/tester/helper_438_1_straighten.cjs @@ -4,24 +4,11 @@ */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); -const cache = new Map(); -function loadTs(file) { - const full = path.resolve(file); - if (cache.has(full)) return cache.get(full); - const js = ts.transpileModule(fs.readFileSync(full, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - cache.set(full, box.exports); - const localRequire = (request) => { - if (request.startsWith(".")) return loadTs(path.join(path.dirname(full), `${request}.ts`)); - return require(request); - }; - new Function("exports", "module", "require", js)(box.exports, box, localRequire); - return box.exports; -} +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), +}); const ground = loadTs( path.join(__dirname, "..", "..", "B05_Profile", "logic", "B05_Profile_Grade_Ground.ts"), diff --git a/resources/tester/helper_472_save_warnings.cjs b/resources/tester/helper_472_save_warnings.cjs index e1c90c6d0..3b1dbd0f1 100644 --- a/resources/tester/helper_472_save_warnings.cjs +++ b/resources/tester/helper_472_save_warnings.cjs @@ -3,24 +3,15 @@ */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); -const cache = new Map(); -function loadTs(file) { - const full = path.resolve(file); - if (cache.has(full)) return cache.get(full); - const js = ts.transpileModule(fs.readFileSync(full, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - cache.set(full, box.exports); - const localRequire = (request) => +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), + requireFor: (full) => (request) => request.startsWith(".") ? loadTs(path.join(path.dirname(full), `${request}.ts`)) - : require(request); - new Function("exports", "module", "require", js)(box.exports, box, localRequire); - return box.exports; -} + : require(request), +}); const align = loadTs( path.join(__dirname, "..", "..", "B05_Profile", "logic", "B05_Profile_UI_Profile_Alignment.ts"), diff --git a/resources/tester/helper_506_3_b07_save.cjs b/resources/tester/helper_506_3_b07_save.cjs index cd9db841b..dd4cc0d74 100644 --- a/resources/tester/helper_506_3_b07_save.cjs +++ b/resources/tester/helper_506_3_b07_save.cjs @@ -3,7 +3,7 @@ */ const fs = require("fs"); const path = require("path"); -const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); +const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const B07 = path.join(__dirname, "..", "..", "B07_DesignDetail"); const calls = []; @@ -39,14 +39,13 @@ global.localStorage = { removeItem: (key) => calls.push(["drop", key]) }; global.location = { reload: () => calls.push(["reload"]) }; global.document = { querySelectorAll: () => [] }; -function loadTs(file) { - const js = ts.transpileModule(fs.readFileSync(file, "utf8"), { - compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, - }).outputText; - const box = { exports: {} }; - new Function("exports", "module", "require", js)(box.exports, box, (r) => STUBS[r] ?? {}); - return box.exports; -} +const { loadTs } = makeLoader({ + root: path.join(__dirname, "..", ".."), + cache: false, + requireFor: (full) => { + return (r) => STUBS[r] ?? {}; + }, +}); Save = loadTs(path.join(B07, "B07_DesignDetail_UI_Save.ts"));