@forgeax/engine-pack 0.1.29 → 0.1.30

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.
Files changed (40) hide show
  1. package/README.md +16 -0
  2. package/dist/build.mjs +65 -9
  3. package/dist/build.mjs.map +1 -1
  4. package/dist/catalog-projection.d.ts +3 -3
  5. package/dist/cli-asset.mjs +1 -1
  6. package/dist/cli-asset.mjs.map +1 -1
  7. package/dist/evidence/material-cook.d.ts +7 -1
  8. package/dist/evidence/material-cook.d.ts.map +1 -1
  9. package/dist/index.mjs +61 -5
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/material-cook.mjs +61 -5
  12. package/dist/material-cook.mjs.map +1 -1
  13. package/dist/pack-authoring-node.mjs +1 -1
  14. package/dist/pack-authoring-node.mjs.map +1 -1
  15. package/dist/pack-authoring.d.ts +8 -2
  16. package/dist/pack-authoring.d.ts.map +1 -1
  17. package/dist/pack-authoring.mjs.map +1 -1
  18. package/dist/runtime-publication.d.ts +2 -0
  19. package/dist/runtime-publication.d.ts.map +1 -1
  20. package/dist/scanner.mjs +1 -1
  21. package/dist/scanner.mjs.map +1 -1
  22. package/dist/scriptable-pack-node.d.ts.map +1 -1
  23. package/dist/scriptable-pack-node.mjs +1 -1
  24. package/dist/scriptable-pack-node.mjs.map +1 -1
  25. package/dist/scriptable-pack-worker.mjs +7 -4
  26. package/dist/scriptable-pack-worker.mjs.map +1 -1
  27. package/dist/scriptable-pack.d.ts +2 -1
  28. package/dist/scriptable-pack.d.ts.map +1 -1
  29. package/dist/scriptable-pack.mjs.map +1 -1
  30. package/package.json +2 -2
  31. package/src/__tests__/material-cook-schema.unit.test.ts +92 -1
  32. package/src/__tests__/runtime-publication.unit.test.ts +36 -0
  33. package/src/__tests__/scriptable-pack-cli.integration.test.ts +35 -1
  34. package/src/evidence/material-cook.ts +79 -5
  35. package/src/pack-authoring.ts +11 -2
  36. package/src/runtime-publication.ts +7 -3
  37. package/src/schema/material-cook.schema.json +107 -0
  38. package/src/scriptable-pack-node.ts +5 -1
  39. package/src/scriptable-pack-worker.ts +15 -4
  40. package/src/scriptable-pack.ts +2 -1
@@ -1,5 +1,5 @@
1
1
  import { createHash } from 'crypto';
2
- import { readFileSync, writeFileSync, existsSync } from 'fs';
2
+ import { readFileSync, writeFileSync, existsSync, statSync } from 'fs';
3
3
  import { extname, resolve, join, dirname } from 'path';
4
4
  import { pathToFileURL, fileURLToPath } from 'url';
5
5
  import { parentPort, workerData } from 'worker_threads';
@@ -45,12 +45,15 @@ var SOURCE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".mjs", ".cjs"];
45
45
  function resolveRelativeImport(importer, specifier) {
46
46
  if (!specifier.startsWith(".")) return void 0;
47
47
  const raw = resolve(dirname(importer), specifier);
48
- const candidates = extname(raw).length > 0 ? [raw] : [
48
+ const extension = extname(raw);
49
+ const stem = raw.slice(0, raw.length - extension.length);
50
+ const substitutions = extension === ".js" ? [`${stem}.ts`, `${stem}.tsx`] : extension === ".mjs" ? [`${stem}.mts`] : extension === ".cjs" ? [`${stem}.cts`] : [];
51
+ const candidates = extension.length > 0 ? [...substitutions, raw] : [
49
52
  raw,
50
- ...SOURCE_EXTENSIONS.map((extension) => `${raw}${extension}`),
53
+ ...SOURCE_EXTENSIONS.map((extension2) => `${raw}${extension2}`),
51
54
  resolve(raw, "index.ts")
52
55
  ];
53
- return candidates.find((candidate) => existsSync(candidate));
56
+ return candidates.find((candidate) => existsSync(candidate) && statSync(candidate).isFile());
54
57
  }
55
58
  function outputName(path) {
56
59
  const digest = createHash("sha256").update(path).digest("hex").slice(0, 20);
@@ -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 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) => {\n const position = diagnostic.file?.getLineAndCharacterOfPosition(diagnostic.start ?? 0);\n const location =\n position === undefined\n ? path\n : `${path}:${position.line + 1}:${position.character + 1}`;\n return `${location}: ${ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')}`;\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"]}
1
+ {"version":3,"sources":["../src/scriptable-pack-worker.ts"],"names":["extension","resolve"],"mappings":"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","file":"scriptable-pack-worker.mjs","sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, statSync, 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 extension = extname(raw);\n const stem = raw.slice(0, raw.length - extension.length);\n // Authored NodeNext sources use runtime extensions even when their producer files are TypeScript.\n const substitutions =\n extension === '.js'\n ? [`${stem}.ts`, `${stem}.tsx`]\n : extension === '.mjs'\n ? [`${stem}.mts`]\n : extension === '.cjs'\n ? [`${stem}.cts`]\n : [];\n const candidates =\n extension.length > 0\n ? [...substitutions, raw]\n : [\n raw,\n ...SOURCE_EXTENSIONS.map((extension) => `${raw}${extension}`),\n resolve(raw, 'index.ts'),\n ];\n return candidates.find((candidate) => existsSync(candidate) && statSync(candidate).isFile());\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) => {\n const position = diagnostic.file?.getLineAndCharacterOfPosition(diagnostic.start ?? 0);\n const location =\n position === undefined\n ? path\n : `${path}:${position.line + 1}:${position.character + 1}`;\n return `${location}: ${ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')}`;\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"]}
@@ -1,4 +1,5 @@
1
1
  import type { Asset, AssetGuid, Result } from '@forgeax/engine-types';
2
+ import type { PackCookSource } from './pack-authoring.js';
2
3
  /**
3
4
  * Build-time Pack vocabulary shared by the source loader and output
4
5
  * producers. ScriptablePack and Pack authoring definitions live in the shared
@@ -35,7 +36,7 @@ export interface ScriptablePackSourceClosureEntry {
35
36
  }
36
37
  /** AssetReader is intentionally a small, realm-neutral source boundary. */
37
38
  export interface AssetReader {
38
- readByGuid<TAsset extends Asset = Asset>(guid: AssetGuid): Promise<Result<TAsset, ScriptablePackReadError>>;
39
+ readByGuid<TAsset extends Asset | PackCookSource = Asset>(guid: AssetGuid): Promise<Result<TAsset, ScriptablePackReadError>>;
39
40
  }
40
41
  export interface ScriptablePackReadError {
41
42
  readonly code: string;
@@ -1 +1 @@
1
- {"version":3,"file":"scriptable-pack.d.ts","sourceRoot":"","sources":["../src/scriptable-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;;;GAIG;AACH,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AAEpC,8EAA8E;AAC9E,MAAM,MAAM,uBAAuB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAEpD,eAAO,MAAM,2BAA2B,6NAkBe,CAAC;AAExD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,uBAAuB,CAEzF;AAED,eAAO,MAAM,mCAAmC;;;;;;CAMtC,CAAC;AAEX,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnD;AASD,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,SAAS,iCAAiC,EAAE,GAAG,SAAS,GACnE,SAAS,4BAA4B,EAAE,CAUzC;AAED,2EAA2E;AAC3E,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,MAAM,SAAS,KAAK,GAAG,KAAK,EACrC,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B"}
1
+ {"version":3,"file":"scriptable-pack.d.ts","sourceRoot":"","sources":["../src/scriptable-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;GAIG;AACH,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AAEpC,8EAA8E;AAC9E,MAAM,MAAM,uBAAuB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAEpD,eAAO,MAAM,2BAA2B,6NAkBe,CAAC;AAExD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,uBAAuB,CAEzF;AAED,eAAO,MAAM,mCAAmC;;;;;;CAMtC,CAAC;AAEX,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnD;AASD,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,SAAS,iCAAiC,EAAE,GAAG,SAAS,GACnE,SAAS,4BAA4B,EAAE,CAUzC;AAED,2EAA2E;AAC3E,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,MAAM,SAAS,KAAK,GAAG,cAAc,GAAG,KAAK,EACtD,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B"}