@forgeax/engine-pack 0.1.21 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -48
- package/dist/__tests__/inventory-schema.test.d.ts +2 -0
- package/dist/__tests__/inventory-schema.test.d.ts.map +1 -0
- package/dist/__tests__/material-cook-receipt-layer-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/material-cook-receipt-layer-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pack-authoring-gateway.unit.test.d.ts +2 -0
- package/dist/__tests__/pack-authoring-gateway.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pack-authoring.unit.test.d.ts +2 -0
- package/dist/__tests__/pack-authoring.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pack-scanner.unit.test.d.ts +2 -0
- package/dist/__tests__/pack-scanner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/scanner-blacklist.test.d.ts +2 -0
- package/dist/__tests__/scanner-blacklist.test.d.ts.map +1 -0
- package/dist/build.d.ts +9 -4
- package/dist/build.d.ts.map +1 -1
- package/dist/build.mjs +3449 -897
- package/dist/build.mjs.map +1 -1
- package/dist/builtin.mjs +37 -4
- package/dist/builtin.mjs.map +1 -1
- package/dist/catalog-builder.d.ts.map +1 -1
- package/dist/cli-asset.d.ts.map +1 -1
- package/dist/cli-asset.mjs +1361 -845
- package/dist/cli-asset.mjs.map +1 -1
- package/dist/deriveAssetName.d.ts +11 -7
- package/dist/deriveAssetName.d.ts.map +1 -1
- package/dist/evidence/material-cook.d.ts +11 -0
- package/dist/evidence/material-cook.d.ts.map +1 -1
- package/dist/evidence/source-inventory.d.ts.map +1 -1
- package/dist/guid.d.ts +15 -0
- package/dist/guid.d.ts.map +1 -1
- package/dist/guid.mjs +53 -5
- package/dist/guid.mjs.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +1297 -562
- package/dist/index.mjs.map +1 -1
- package/dist/inventory/binding.d.ts +6 -0
- package/dist/inventory/binding.d.ts.map +1 -0
- package/dist/inventory/declaration.d.ts +24 -0
- package/dist/inventory/declaration.d.ts.map +1 -0
- package/dist/inventory/index.d.ts +3 -0
- package/dist/inventory/index.d.ts.map +1 -0
- package/dist/inventory/sync.d.ts +5 -0
- package/dist/inventory/sync.d.ts.map +1 -0
- package/dist/material-cook.d.ts +1 -1
- package/dist/material-cook.d.ts.map +1 -1
- package/dist/material-cook.mjs +50 -3
- package/dist/material-cook.mjs.map +1 -1
- package/dist/name.mjs +4 -7
- package/dist/name.mjs.map +1 -1
- package/dist/pack-authoring-node.d.ts +26 -0
- package/dist/pack-authoring-node.d.ts.map +1 -0
- package/dist/pack-authoring-node.mjs +11089 -0
- package/dist/pack-authoring-node.mjs.map +1 -0
- package/dist/pack-authoring.d.ts +230 -0
- package/dist/pack-authoring.d.ts.map +1 -0
- package/dist/pack-authoring.mjs +1137 -0
- package/dist/pack-authoring.mjs.map +1 -0
- package/dist/package-finalizer.d.ts +2 -20
- package/dist/package-finalizer.d.ts.map +1 -1
- package/dist/resolve-asset-source.d.ts +1 -3
- package/dist/resolve-asset-source.d.ts.map +1 -1
- package/dist/resolve-asset-source.mjs +6 -81
- package/dist/resolve-asset-source.mjs.map +1 -1
- package/dist/runtime.mjs +77 -7
- package/dist/runtime.mjs.map +1 -1
- package/dist/scanner.d.ts +18 -7
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.mjs +1164 -687
- package/dist/scanner.mjs.map +1 -1
- package/dist/schema-compiled.d.ts.map +1 -1
- package/dist/schema.mjs +79 -7
- package/dist/schema.mjs.map +1 -1
- package/dist/scriptable-pack-node.d.ts +7 -31
- package/dist/scriptable-pack-node.d.ts.map +1 -1
- package/dist/scriptable-pack-node.mjs +572 -1019
- package/dist/scriptable-pack-node.mjs.map +1 -1
- package/dist/scriptable-pack-worker.mjs +29 -11
- package/dist/scriptable-pack-worker.mjs.map +1 -1
- package/dist/scriptable-pack.d.ts +20 -532
- package/dist/scriptable-pack.d.ts.map +1 -1
- package/dist/scriptable-pack.mjs +1038 -527
- package/dist/scriptable-pack.mjs.map +1 -1
- package/package.json +2 -7
- package/schema/meta.schema.json +1 -1
- package/schema/pack.schema.json +76 -6
- package/src/__tests__/guid-collision.unit.test.ts +18 -9
- package/src/__tests__/inventory-schema.test.ts +109 -0
- package/src/__tests__/material-cook-receipt-layer-plan.unit.test.ts +16 -0
- package/src/__tests__/material-cook-schema.unit.test.ts +62 -0
- package/src/__tests__/pack-authoring-gateway.unit.test.ts +249 -0
- package/src/__tests__/pack-authoring.unit.test.ts +266 -0
- package/src/__tests__/pack-scanner.unit.test.ts +123 -0
- package/src/__tests__/pack.unit.test.ts +1 -238
- package/src/__tests__/package-finalizer.contract.test.ts +55 -0
- package/src/__tests__/resolve-asset-source.test.ts +15 -98
- package/src/__tests__/scanner-blacklist.test.ts +55 -0
- package/src/__tests__/scanner-inventory.contract.test.ts +11 -14
- package/src/__tests__/scanner-inventory.test.ts +23 -10
- package/src/__tests__/scriptable-pack-cli.integration.test.ts +4 -9
- package/src/__tests__/topology.unit.test.ts +23 -0
- package/src/build.ts +28 -18
- package/src/catalog-builder.ts +60 -33
- package/src/cli-asset.ts +68 -83
- package/src/deriveAssetName.ts +14 -13
- package/src/evidence/material-cook.ts +79 -3
- package/src/evidence/source-inventory.ts +34 -21
- package/src/guid.ts +65 -4
- package/src/index.ts +15 -11
- package/src/inventory/binding.ts +25 -0
- package/src/inventory/declaration.ts +168 -0
- package/src/inventory/index.ts +18 -0
- package/src/inventory/sync.ts +22 -0
- package/src/material-cook.ts +1 -0
- package/src/pack-authoring-node.ts +1966 -0
- package/src/pack-authoring.ts +1478 -0
- package/src/package-finalizer.ts +2 -42
- package/src/resolve-asset-source.ts +4 -76
- package/src/scanner.ts +236 -56
- package/src/schema/material-cook.schema.json +4 -1
- package/src/schema-compiled.ts +2 -0
- package/src/scriptable-pack-node.ts +108 -719
- package/src/scriptable-pack-worker.ts +48 -16
- package/src/scriptable-pack.ts +28 -939
- package/dist/.tsbuildinfo +0 -1
- package/dist/__tests__/load-asset-config.test.d.ts +0 -2
- package/dist/__tests__/load-asset-config.test.d.ts.map +0 -1
- package/dist/__tests__/scriptable-pack.test-d.d.ts +0 -2
- package/dist/__tests__/scriptable-pack.test-d.d.ts.map +0 -1
- package/dist/__tests__/scriptable-pack.unit.test.d.ts +0 -2
- package/dist/__tests__/scriptable-pack.unit.test.d.ts.map +0 -1
- package/dist/config.d.ts +0 -6
- package/dist/config.d.ts.map +0 -1
- package/dist/config.mjs +0 -29
- package/dist/config.mjs.map +0 -1
- package/src/__tests__/load-asset-config.test.ts +0 -121
- package/src/__tests__/scriptable-pack.test-d.ts +0 -131
- package/src/__tests__/scriptable-pack.unit.test.ts +0 -789
- package/src/config.ts +0 -36
|
@@ -28,6 +28,19 @@ function failure(error) {
|
|
|
28
28
|
message: value.message
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
+
function serializableSceneComponents(value) {
|
|
32
|
+
if (!Array.isArray(value)) return void 0;
|
|
33
|
+
return value.map((component) => {
|
|
34
|
+
const candidate = component;
|
|
35
|
+
const fields = candidate.fields !== null && typeof candidate.fields === "object" && !Array.isArray(candidate.fields) ? Object.fromEntries(
|
|
36
|
+
Object.entries(candidate.fields).map(([name, field]) => [
|
|
37
|
+
name,
|
|
38
|
+
typeof field === "string" ? field : field?.type
|
|
39
|
+
])
|
|
40
|
+
) : void 0;
|
|
41
|
+
return { name: candidate.name, fields };
|
|
42
|
+
});
|
|
43
|
+
}
|
|
31
44
|
var SOURCE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".mjs", ".cjs"];
|
|
32
45
|
function resolveRelativeImport(importer, specifier) {
|
|
33
46
|
if (!specifier.startsWith(".")) return void 0;
|
|
@@ -46,12 +59,14 @@ function outputName(path) {
|
|
|
46
59
|
function resolveBareImport(importer, specifier) {
|
|
47
60
|
const resolver = import.meta.resolve;
|
|
48
61
|
if (resolver === void 0) return void 0;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
for (const parent of [pathToFileURL(importer).href, import.meta.url]) {
|
|
63
|
+
try {
|
|
64
|
+
const resolved = resolver(specifier, parent);
|
|
65
|
+
if (resolved.startsWith("file:")) return fileURLToPath(resolved);
|
|
66
|
+
} catch {
|
|
67
|
+
}
|
|
54
68
|
}
|
|
69
|
+
return void 0;
|
|
55
70
|
}
|
|
56
71
|
function resolvedModuleSpecifier(target, sources, loadId) {
|
|
57
72
|
if (sources.has(target)) {
|
|
@@ -157,10 +172,9 @@ async function loadDefinition(task) {
|
|
|
157
172
|
definition: definition === void 0 ? void 0 : {
|
|
158
173
|
schemaVersion: definition.schemaVersion,
|
|
159
174
|
packageId: definition.packageId,
|
|
160
|
-
name: definition.name,
|
|
161
|
-
|
|
162
|
-
sceneComponents: definition.sceneComponents
|
|
163
|
-
externalAssets: definition.externalAssets
|
|
175
|
+
...definition.name === void 0 ? {} : { name: definition.name },
|
|
176
|
+
...definition.parameters === void 0 ? {} : { parameters: definition.parameters },
|
|
177
|
+
...definition.sceneComponents === void 0 ? {} : { sceneComponents: serializableSceneComponents(definition.sceneComponents) }
|
|
164
178
|
}
|
|
165
179
|
});
|
|
166
180
|
}
|
|
@@ -194,13 +208,17 @@ async function handleMessage(message) {
|
|
|
194
208
|
return;
|
|
195
209
|
}
|
|
196
210
|
try {
|
|
197
|
-
const
|
|
211
|
+
const context = value.context !== null && typeof value.context === "object" ? value.context : void 0;
|
|
212
|
+
const buildContext = {
|
|
213
|
+
...Array.isArray(context?.packageId) ? { packageId: new Uint8Array(context.packageId) } : {},
|
|
214
|
+
...context?.values !== void 0 ? { values: context.values } : {},
|
|
198
215
|
readByGuid(guid) {
|
|
199
216
|
const readId = nextReadId++;
|
|
200
217
|
port.postMessage({ kind: "asset-read", buildId: value.buildId, readId, guid });
|
|
201
218
|
return new Promise((resolve2) => reads.set(readId, resolve2));
|
|
202
219
|
}
|
|
203
|
-
}
|
|
220
|
+
};
|
|
221
|
+
const result = await definition.build(buildContext);
|
|
204
222
|
port.postMessage({
|
|
205
223
|
kind: "build-result",
|
|
206
224
|
buildId: value.buildId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scriptable-pack-worker.ts"],"names":["resolve"],"mappings":"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","file":"scriptable-pack-worker.mjs","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, extname, join, resolve } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { parentPort, workerData } from 'node:worker_threads';\nimport ts from 'typescript';\n\nif (parentPort === null) throw new Error('ScriptablePack worker requires a parent port');\n\nconst port = parentPort;\nconst workerMode = workerData as {\n readonly mode?: 'single' | 'reusable';\n readonly sourcePath?: string;\n readonly compileRoot?: string;\n};\nconst reusable = workerMode.mode === 'reusable';\nlet sourcePath = workerMode.sourcePath;\nlet compileRoot = workerMode.compileRoot;\ntype LoadedDefinition = {\n readonly schemaVersion?: unknown;\n readonly packageId?: unknown;\n readonly name?: unknown;\n readonly assets?: unknown;\n readonly sceneComponents?: unknown;\n readonly externalAssets?: unknown;\n readonly build?: unknown;\n};\nlet definition: LoadedDefinition | undefined;\nlet nextReadId = 0;\nconst reads = new Map<number, (value: unknown) => void>();\n\nfunction failure(error: unknown): unknown {\n if (error === null || typeof error !== 'object') return error;\n const value = error as Record<string, unknown>;\n return {\n name: value.name,\n code: value.code,\n expected: value.expected,\n actual: value.actual,\n hint: value.hint,\n detail: value.detail,\n message: value.message,\n };\n}\n\nconst SOURCE_EXTENSIONS = ['.ts', '.tsx', '.mts', '.cts', '.js', '.mjs', '.cjs'] as const;\n\nfunction resolveRelativeImport(importer: string, specifier: string): string | undefined {\n if (!specifier.startsWith('.')) return undefined;\n const raw = resolve(dirname(importer), specifier);\n const candidates =\n extname(raw).length > 0\n ? [raw]\n : [\n raw,\n ...SOURCE_EXTENSIONS.map((extension) => `${raw}${extension}`),\n resolve(raw, 'index.ts'),\n ];\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nfunction outputName(path: string): string {\n const digest = createHash('sha256').update(path).digest('hex').slice(0, 20);\n return `${digest}.mjs`;\n}\n\nfunction resolveBareImport(importer: string, specifier: string): string | undefined {\n const resolver = (\n import.meta as ImportMeta & {\n readonly resolve?: (specifier: string, parent?: string) => string;\n }\n ).resolve;\n if (resolver === undefined) return undefined;\n try {\n const resolved = resolver(specifier, pathToFileURL(importer).href);\n return resolved.startsWith('file:') ? fileURLToPath(resolved) : undefined;\n } catch {\n // Type-only or optional imports may not be installed in the game project.\n // Preserve them for TypeScript to erase or let Node report the real load\n // failure instead of guessing a workspace root.\n return undefined;\n }\n}\n\nfunction resolvedModuleSpecifier(\n target: string,\n sources: ReadonlyMap<string, string>,\n loadId?: number,\n): string {\n if (sources.has(target)) {\n return `./${outputName(target)}${loadId === undefined ? '' : `?load=${loadId}`}`;\n }\n return pathToFileURL(target).href;\n}\n\n/**\n * Node 22 does not execute `.ts` modules. Compile the trusted local module\n * closure into one disposable ESM directory before importing it. Bare package\n * imports are resolved by Node from the original source module and rewritten\n * to their canonical file URL; relative imports are rewritten to the compiled\n * closure by identity. This keeps unrelated nested node_modules directories\n * (for example Vite's cache) from changing package resolution.\n */\nfunction compileModuleClosure(entryPath: string, outputRoot: string, loadId?: number): string {\n const pending = [resolve(entryPath)];\n const sources = new Map<string, string>();\n const imports = new Map<string, ReadonlyMap<string, string>>();\n while (pending.length > 0) {\n const path = pending.pop();\n if (path === undefined || sources.has(path)) continue;\n const source = readFileSync(path, 'utf8');\n sources.set(path, source);\n const resolvedImports = new Map<string, string>();\n for (const imported of ts.preProcessFile(source, true, true).importedFiles) {\n const target = imported.fileName.startsWith('.')\n ? resolveRelativeImport(path, imported.fileName)\n : resolveBareImport(path, imported.fileName);\n if (target === undefined) continue;\n resolvedImports.set(imported.fileName, target);\n if (imported.fileName.startsWith('.') || /\\.(?:ts|tsx|mts|cts)$/.test(target)) {\n pending.push(target);\n }\n }\n imports.set(path, resolvedImports);\n }\n\n for (const [path, source] of sources) {\n const replacements = imports.get(path) ?? new Map<string, string>();\n const rewriteRelativeImports: ts.TransformerFactory<ts.SourceFile> = (context) => {\n const visit: ts.Visitor = (node) => {\n if (\n (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&\n node.moduleSpecifier !== undefined &&\n ts.isStringLiteral(node.moduleSpecifier)\n ) {\n const target = replacements.get(node.moduleSpecifier.text);\n if (target !== undefined) {\n const moduleSpecifier = ts.factory.createStringLiteral(\n resolvedModuleSpecifier(target, sources, loadId),\n );\n return ts.isImportDeclaration(node)\n ? ts.factory.updateImportDeclaration(\n node,\n node.modifiers,\n node.importClause,\n moduleSpecifier,\n node.attributes,\n )\n : ts.factory.updateExportDeclaration(\n node,\n node.modifiers,\n node.isTypeOnly,\n node.exportClause,\n moduleSpecifier,\n node.attributes,\n );\n }\n }\n if (\n ts.isCallExpression(node) &&\n node.expression.kind === ts.SyntaxKind.ImportKeyword &&\n node.arguments.length === 1 &&\n node.arguments[0] !== undefined &&\n ts.isStringLiteral(node.arguments[0])\n ) {\n const target = replacements.get(node.arguments[0].text);\n if (target !== undefined) {\n return ts.factory.updateCallExpression(node, node.expression, node.typeArguments, [\n ts.factory.createStringLiteral(resolvedModuleSpecifier(target, sources, loadId)),\n ]);\n }\n }\n return ts.visitEachChild(node, visit, context);\n };\n return (sourceFile) => ts.visitNode(sourceFile, visit) as ts.SourceFile;\n };\n const transpiled = ts.transpileModule(source, {\n fileName: path,\n compilerOptions: {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n isolatedModules: true,\n sourceMap: false,\n },\n transformers: { before: [rewriteRelativeImports] },\n reportDiagnostics: true,\n });\n const errors =\n transpiled.diagnostics?.filter(\n (diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error,\n ) ?? [];\n if (errors.length > 0) {\n throw new Error(\n `ScriptablePack TypeScript transpile failed for ${path}: ${errors\n .map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n'))\n .join('; ')}`,\n );\n }\n writeFileSync(join(outputRoot, outputName(path)), transpiled.outputText);\n }\n return join(outputRoot, outputName(resolve(entryPath)));\n}\n\nasync function loadDefinition(task: {\n readonly sourcePath: string;\n readonly compileRoot: string;\n readonly loadId?: number;\n}): Promise<void> {\n sourcePath = task.sourcePath;\n compileRoot = task.compileRoot;\n definition = undefined;\n reads.clear();\n const executablePath = SOURCE_EXTENSIONS.includes(\n extname(task.sourcePath) as (typeof SOURCE_EXTENSIONS)[number],\n )\n ? compileModuleClosure(task.sourcePath, task.compileRoot, task.loadId)\n : task.sourcePath;\n const loaded = (await import(\n `${pathToFileURL(executablePath).href}${reusable ? `?load=${task.loadId ?? 0}` : ''}`\n )) as {\n readonly default?: unknown;\n };\n definition = loaded.default as LoadedDefinition | undefined;\n port.postMessage({\n kind: 'loaded',\n ...(task.loadId === undefined ? {} : { loadId: task.loadId }),\n definition:\n definition === undefined\n ? undefined\n : {\n schemaVersion: definition.schemaVersion,\n packageId: definition.packageId,\n name: definition.name,\n assets: definition.assets,\n sceneComponents: definition.sceneComponents,\n externalAssets: definition.externalAssets,\n },\n });\n}\n\nasync function handleMessage(message: unknown): Promise<void> {\n if (message === null || typeof message !== 'object') return;\n const value = message as Record<string, unknown>;\n if (value.kind === 'asset-result' && typeof value.readId === 'number') {\n reads.get(value.readId)?.(value.result);\n reads.delete(value.readId);\n return;\n }\n if (\n reusable &&\n value.kind === 'load' &&\n typeof value.sourcePath === 'string' &&\n typeof value.compileRoot === 'string' &&\n typeof value.loadId === 'number'\n ) {\n try {\n await loadDefinition({\n sourcePath: value.sourcePath,\n compileRoot: value.compileRoot,\n loadId: value.loadId,\n });\n } catch (error) {\n port.postMessage({ kind: 'load-threw', loadId: value.loadId, error: failure(error) });\n }\n return;\n }\n if (value.kind !== 'build' || typeof value.buildId !== 'number') return;\n if (typeof definition?.build !== 'function') {\n port.postMessage({\n kind: 'build-result',\n buildId: value.buildId,\n result: { ok: false, error: { message: 'default export has no build function' } },\n });\n return;\n }\n try {\n const result = await definition.build({\n readByGuid(guid: Uint8Array): Promise<unknown> {\n const readId = nextReadId++;\n port.postMessage({ kind: 'asset-read', buildId: value.buildId, readId, guid });\n return new Promise((resolve) => reads.set(readId, resolve));\n },\n });\n port.postMessage({\n kind: 'build-result',\n buildId: value.buildId,\n result:\n result !== null && typeof result === 'object' && 'ok' in result && !result.ok\n ? { ...result, error: failure(result.error) }\n : result,\n });\n } catch (error) {\n port.postMessage({ kind: 'build-threw', buildId: value.buildId, error: failure(error) });\n }\n}\n\nport.on('message', (message: unknown) => {\n void handleMessage(message);\n});\n\nif (!reusable && sourcePath !== undefined && compileRoot !== undefined) {\n try {\n await loadDefinition({ sourcePath, compileRoot });\n } catch (error) {\n port.postMessage({ kind: 'load-threw', error: failure(error) });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/scriptable-pack-worker.ts"],"names":["resolve"],"mappings":"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","file":"scriptable-pack-worker.mjs","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, extname, join, resolve } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { parentPort, workerData } from 'node:worker_threads';\nimport ts from 'typescript';\n\nif (parentPort === null) throw new Error('ScriptablePack worker requires a parent port');\n\nconst port = parentPort;\nconst workerMode = workerData as {\n readonly mode?: 'single' | 'reusable';\n readonly sourcePath?: string;\n readonly compileRoot?: string;\n};\nconst reusable = workerMode.mode === 'reusable';\nlet sourcePath = workerMode.sourcePath;\nlet compileRoot = workerMode.compileRoot;\ntype LoadedDefinition = {\n readonly schemaVersion?: unknown;\n readonly packageId?: unknown;\n readonly name?: unknown;\n readonly parameters?: unknown;\n readonly sceneComponents?: unknown;\n readonly build?: unknown;\n};\nlet definition: LoadedDefinition | undefined;\nlet nextReadId = 0;\nconst reads = new Map<number, (value: unknown) => void>();\n\nfunction failure(error: unknown): unknown {\n if (error === null || typeof error !== 'object') return error;\n const value = error as Record<string, unknown>;\n return {\n name: value.name,\n code: value.code,\n expected: value.expected,\n actual: value.actual,\n hint: value.hint,\n detail: value.detail,\n message: value.message,\n };\n}\n\nfunction serializableSceneComponents(value: unknown): unknown {\n if (!Array.isArray(value)) return undefined;\n return value.map((component) => {\n const candidate = component as { readonly name?: unknown; readonly fields?: unknown };\n const fields =\n candidate.fields !== null &&\n typeof candidate.fields === 'object' &&\n !Array.isArray(candidate.fields)\n ? Object.fromEntries(\n Object.entries(candidate.fields as Record<string, unknown>).map(([name, field]) => [\n name,\n typeof field === 'string' ? field : (field as { readonly type?: unknown })?.type,\n ]),\n )\n : undefined;\n return { name: candidate.name, fields };\n });\n}\n\nconst SOURCE_EXTENSIONS = ['.ts', '.tsx', '.mts', '.cts', '.js', '.mjs', '.cjs'] as const;\n\nfunction resolveRelativeImport(importer: string, specifier: string): string | undefined {\n if (!specifier.startsWith('.')) return undefined;\n const raw = resolve(dirname(importer), specifier);\n const candidates =\n extname(raw).length > 0\n ? [raw]\n : [\n raw,\n ...SOURCE_EXTENSIONS.map((extension) => `${raw}${extension}`),\n resolve(raw, 'index.ts'),\n ];\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nfunction outputName(path: string): string {\n const digest = createHash('sha256').update(path).digest('hex').slice(0, 20);\n return `${digest}.mjs`;\n}\n\nfunction resolveBareImport(importer: string, specifier: string): string | undefined {\n const resolver = (\n import.meta as ImportMeta & {\n readonly resolve?: (specifier: string, parent?: string) => string;\n }\n ).resolve;\n if (resolver === undefined) return undefined;\n // Resolve consumer dependencies from the source file first, then resolve\n // Engine self-references from this worker's package. A compiled source\n // closure lives in /tmp, so using only its path makes\n // @forgeax/engine-pack/source disappear from Node's lookup ancestry.\n for (const parent of [pathToFileURL(importer).href, import.meta.url]) {\n try {\n const resolved = resolver(specifier, parent);\n if (resolved.startsWith('file:')) return fileURLToPath(resolved);\n } catch {\n // Try the loader package before treating the import as unavailable.\n }\n }\n return undefined;\n}\n\nfunction resolvedModuleSpecifier(\n target: string,\n sources: ReadonlyMap<string, string>,\n loadId?: number,\n): string {\n if (sources.has(target)) {\n return `./${outputName(target)}${loadId === undefined ? '' : `?load=${loadId}`}`;\n }\n return pathToFileURL(target).href;\n}\n\n/**\n * Node 22 does not execute `.ts` modules. Compile the trusted local module\n * closure into one disposable ESM directory before importing it. Bare package\n * imports are resolved by Node from the original source module and rewritten\n * to their canonical file URL; relative imports are rewritten to the compiled\n * closure by identity. This keeps unrelated nested node_modules directories\n * (for example Vite's cache) from changing package resolution.\n */\nfunction compileModuleClosure(entryPath: string, outputRoot: string, loadId?: number): string {\n const pending = [resolve(entryPath)];\n const sources = new Map<string, string>();\n const imports = new Map<string, ReadonlyMap<string, string>>();\n while (pending.length > 0) {\n const path = pending.pop();\n if (path === undefined || sources.has(path)) continue;\n const source = readFileSync(path, 'utf8');\n sources.set(path, source);\n const resolvedImports = new Map<string, string>();\n for (const imported of ts.preProcessFile(source, true, true).importedFiles) {\n const target = imported.fileName.startsWith('.')\n ? resolveRelativeImport(path, imported.fileName)\n : resolveBareImport(path, imported.fileName);\n if (target === undefined) continue;\n resolvedImports.set(imported.fileName, target);\n if (imported.fileName.startsWith('.') || /\\.(?:ts|tsx|mts|cts)$/.test(target)) {\n pending.push(target);\n }\n }\n imports.set(path, resolvedImports);\n }\n\n for (const [path, source] of sources) {\n const replacements = imports.get(path) ?? new Map<string, string>();\n const rewriteRelativeImports: ts.TransformerFactory<ts.SourceFile> = (context) => {\n const visit: ts.Visitor = (node) => {\n if (\n (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) &&\n node.moduleSpecifier !== undefined &&\n ts.isStringLiteral(node.moduleSpecifier)\n ) {\n const target = replacements.get(node.moduleSpecifier.text);\n if (target !== undefined) {\n const moduleSpecifier = ts.factory.createStringLiteral(\n resolvedModuleSpecifier(target, sources, loadId),\n );\n return ts.isImportDeclaration(node)\n ? ts.factory.updateImportDeclaration(\n node,\n node.modifiers,\n node.importClause,\n moduleSpecifier,\n node.attributes,\n )\n : ts.factory.updateExportDeclaration(\n node,\n node.modifiers,\n node.isTypeOnly,\n node.exportClause,\n moduleSpecifier,\n node.attributes,\n );\n }\n }\n if (\n ts.isCallExpression(node) &&\n node.expression.kind === ts.SyntaxKind.ImportKeyword &&\n node.arguments.length === 1 &&\n node.arguments[0] !== undefined &&\n ts.isStringLiteral(node.arguments[0])\n ) {\n const target = replacements.get(node.arguments[0].text);\n if (target !== undefined) {\n return ts.factory.updateCallExpression(node, node.expression, node.typeArguments, [\n ts.factory.createStringLiteral(resolvedModuleSpecifier(target, sources, loadId)),\n ]);\n }\n }\n return ts.visitEachChild(node, visit, context);\n };\n return (sourceFile) => ts.visitNode(sourceFile, visit) as ts.SourceFile;\n };\n const transpiled = ts.transpileModule(source, {\n fileName: path,\n compilerOptions: {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n isolatedModules: true,\n sourceMap: false,\n },\n transformers: { before: [rewriteRelativeImports] },\n reportDiagnostics: true,\n });\n const errors =\n transpiled.diagnostics?.filter(\n (diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error,\n ) ?? [];\n if (errors.length > 0) {\n throw new Error(\n `ScriptablePack TypeScript transpile failed for ${path}: ${errors\n .map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n'))\n .join('; ')}`,\n );\n }\n writeFileSync(join(outputRoot, outputName(path)), transpiled.outputText);\n }\n return join(outputRoot, outputName(resolve(entryPath)));\n}\n\nasync function loadDefinition(task: {\n readonly sourcePath: string;\n readonly compileRoot: string;\n readonly loadId?: number;\n}): Promise<void> {\n sourcePath = task.sourcePath;\n compileRoot = task.compileRoot;\n definition = undefined;\n reads.clear();\n const executablePath = SOURCE_EXTENSIONS.includes(\n extname(task.sourcePath) as (typeof SOURCE_EXTENSIONS)[number],\n )\n ? compileModuleClosure(task.sourcePath, task.compileRoot, task.loadId)\n : task.sourcePath;\n const loaded = (await import(\n `${pathToFileURL(executablePath).href}${reusable ? `?load=${task.loadId ?? 0}` : ''}`\n )) as {\n readonly default?: unknown;\n };\n definition = loaded.default as LoadedDefinition | undefined;\n port.postMessage({\n kind: 'loaded',\n ...(task.loadId === undefined ? {} : { loadId: task.loadId }),\n definition:\n definition === undefined\n ? undefined\n : {\n schemaVersion: definition.schemaVersion,\n packageId: definition.packageId,\n ...(definition.name === undefined ? {} : { name: definition.name }),\n ...(definition.parameters === undefined ? {} : { parameters: definition.parameters }),\n ...(definition.sceneComponents === undefined\n ? {}\n : { sceneComponents: serializableSceneComponents(definition.sceneComponents) }),\n },\n });\n}\n\nasync function handleMessage(message: unknown): Promise<void> {\n if (message === null || typeof message !== 'object') return;\n const value = message as Record<string, unknown>;\n if (value.kind === 'asset-result' && typeof value.readId === 'number') {\n reads.get(value.readId)?.(value.result);\n reads.delete(value.readId);\n return;\n }\n if (\n reusable &&\n value.kind === 'load' &&\n typeof value.sourcePath === 'string' &&\n typeof value.compileRoot === 'string' &&\n typeof value.loadId === 'number'\n ) {\n try {\n await loadDefinition({\n sourcePath: value.sourcePath,\n compileRoot: value.compileRoot,\n loadId: value.loadId,\n });\n } catch (error) {\n port.postMessage({ kind: 'load-threw', loadId: value.loadId, error: failure(error) });\n }\n return;\n }\n if (value.kind !== 'build' || typeof value.buildId !== 'number') return;\n if (typeof definition?.build !== 'function') {\n port.postMessage({\n kind: 'build-result',\n buildId: value.buildId,\n result: { ok: false, error: { message: 'default export has no build function' } },\n });\n return;\n }\n try {\n const context =\n value.context !== null && typeof value.context === 'object'\n ? (value.context as { readonly packageId?: unknown; readonly values?: unknown })\n : undefined;\n const buildContext = {\n ...(Array.isArray(context?.packageId)\n ? { packageId: new Uint8Array(context.packageId as number[]) }\n : {}),\n ...(context?.values !== undefined ? { values: context.values } : {}),\n readByGuid(guid: Uint8Array): Promise<unknown> {\n const readId = nextReadId++;\n port.postMessage({ kind: 'asset-read', buildId: value.buildId, readId, guid });\n return new Promise((resolve) => reads.set(readId, resolve));\n },\n };\n const result = await definition.build(buildContext);\n port.postMessage({\n kind: 'build-result',\n buildId: value.buildId,\n result:\n result !== null && typeof result === 'object' && 'ok' in result && !result.ok\n ? { ...result, error: failure(result.error) }\n : result,\n });\n } catch (error) {\n port.postMessage({ kind: 'build-threw', buildId: value.buildId, error: failure(error) });\n }\n}\n\nport.on('message', (message: unknown) => {\n void handleMessage(message);\n});\n\nif (!reusable && sourcePath !== undefined && compileRoot !== undefined) {\n try {\n await loadDefinition({ sourcePath, compileRoot });\n } catch (error) {\n port.postMessage({ kind: 'load-threw', error: failure(error) });\n }\n}\n"]}
|