@forgeax/engine-pack 0.1.20 → 0.1.23

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 (128) hide show
  1. package/README.md +159 -46
  2. package/dist/__tests__/inventory-schema.test.d.ts +2 -0
  3. package/dist/__tests__/inventory-schema.test.d.ts.map +1 -0
  4. package/dist/__tests__/parameterized-pack-authoring-gateway.unit.test.d.ts +2 -0
  5. package/dist/__tests__/parameterized-pack-authoring-gateway.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/parameterized-pack-scanner.unit.test.d.ts +2 -0
  7. package/dist/__tests__/parameterized-pack-scanner.unit.test.d.ts.map +1 -0
  8. package/dist/__tests__/parameterized-pack.unit.test.d.ts +2 -0
  9. package/dist/__tests__/parameterized-pack.unit.test.d.ts.map +1 -0
  10. package/dist/__tests__/scanner-blacklist.test.d.ts +2 -0
  11. package/dist/__tests__/scanner-blacklist.test.d.ts.map +1 -0
  12. package/dist/build.d.ts +9 -4
  13. package/dist/build.d.ts.map +1 -1
  14. package/dist/build.mjs +3317 -804
  15. package/dist/build.mjs.map +1 -1
  16. package/dist/builtin.mjs +37 -4
  17. package/dist/builtin.mjs.map +1 -1
  18. package/dist/catalog-builder.d.ts.map +1 -1
  19. package/dist/cli-asset.d.ts.map +1 -1
  20. package/dist/cli-asset.mjs +1368 -850
  21. package/dist/cli-asset.mjs.map +1 -1
  22. package/dist/deriveAssetName.d.ts +11 -7
  23. package/dist/deriveAssetName.d.ts.map +1 -1
  24. package/dist/evidence/material-cook.d.ts.map +1 -1
  25. package/dist/evidence/source-inventory.d.ts.map +1 -1
  26. package/dist/guid.d.ts +15 -0
  27. package/dist/guid.d.ts.map +1 -1
  28. package/dist/guid.mjs +53 -5
  29. package/dist/guid.mjs.map +1 -1
  30. package/dist/index.d.ts +3 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.mjs +1255 -561
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/inventory/binding.d.ts +6 -0
  35. package/dist/inventory/binding.d.ts.map +1 -0
  36. package/dist/inventory/declaration.d.ts +24 -0
  37. package/dist/inventory/declaration.d.ts.map +1 -0
  38. package/dist/inventory/index.d.ts +3 -0
  39. package/dist/inventory/index.d.ts.map +1 -0
  40. package/dist/inventory/sync.d.ts +5 -0
  41. package/dist/inventory/sync.d.ts.map +1 -0
  42. package/dist/material-cook.mjs +3 -1
  43. package/dist/material-cook.mjs.map +1 -1
  44. package/dist/name.mjs +4 -7
  45. package/dist/name.mjs.map +1 -1
  46. package/dist/package-finalizer.d.ts +2 -20
  47. package/dist/package-finalizer.d.ts.map +1 -1
  48. package/dist/parameterized-pack-node.d.ts +26 -0
  49. package/dist/parameterized-pack-node.d.ts.map +1 -0
  50. package/dist/parameterized-pack-node.mjs +11093 -0
  51. package/dist/parameterized-pack-node.mjs.map +1 -0
  52. package/dist/parameterized-pack.d.ts +233 -0
  53. package/dist/parameterized-pack.d.ts.map +1 -0
  54. package/dist/resolve-asset-source.d.ts +1 -3
  55. package/dist/resolve-asset-source.d.ts.map +1 -1
  56. package/dist/resolve-asset-source.mjs +6 -81
  57. package/dist/resolve-asset-source.mjs.map +1 -1
  58. package/dist/runtime.mjs +77 -7
  59. package/dist/runtime.mjs.map +1 -1
  60. package/dist/scanner.d.ts +19 -8
  61. package/dist/scanner.d.ts.map +1 -1
  62. package/dist/scanner.mjs +1169 -690
  63. package/dist/scanner.mjs.map +1 -1
  64. package/dist/schema-compiled.d.ts.map +1 -1
  65. package/dist/schema.mjs +79 -7
  66. package/dist/schema.mjs.map +1 -1
  67. package/dist/scriptable-pack-node.d.ts +8 -32
  68. package/dist/scriptable-pack-node.d.ts.map +1 -1
  69. package/dist/scriptable-pack-node.mjs +576 -1021
  70. package/dist/scriptable-pack-node.mjs.map +1 -1
  71. package/dist/scriptable-pack-worker.mjs +29 -11
  72. package/dist/scriptable-pack-worker.mjs.map +1 -1
  73. package/dist/scriptable-pack.d.ts +19 -532
  74. package/dist/scriptable-pack.d.ts.map +1 -1
  75. package/dist/scriptable-pack.mjs +1042 -527
  76. package/dist/scriptable-pack.mjs.map +1 -1
  77. package/package.json +7 -7
  78. package/schema/meta.schema.json +1 -1
  79. package/schema/pack.schema.json +76 -6
  80. package/src/__tests__/guid-collision.unit.test.ts +18 -9
  81. package/src/__tests__/inventory-schema.test.ts +109 -0
  82. package/src/__tests__/pack.unit.test.ts +1 -238
  83. package/src/__tests__/package-finalizer.contract.test.ts +55 -0
  84. package/src/__tests__/parameterized-pack-authoring-gateway.unit.test.ts +249 -0
  85. package/src/__tests__/parameterized-pack-scanner.unit.test.ts +123 -0
  86. package/src/__tests__/parameterized-pack.unit.test.ts +266 -0
  87. package/src/__tests__/resolve-asset-source.test.ts +15 -98
  88. package/src/__tests__/scanner-blacklist.test.ts +55 -0
  89. package/src/__tests__/scanner-inventory.contract.test.ts +14 -15
  90. package/src/__tests__/scanner-inventory.test.ts +24 -12
  91. package/src/__tests__/scriptable-pack-cli.integration.test.ts +4 -9
  92. package/src/__tests__/topology.unit.test.ts +23 -0
  93. package/src/build.ts +28 -18
  94. package/src/catalog-builder.ts +61 -34
  95. package/src/cli-asset.ts +70 -85
  96. package/src/deriveAssetName.ts +14 -13
  97. package/src/evidence/material-cook.ts +3 -1
  98. package/src/evidence/source-inventory.ts +34 -21
  99. package/src/guid.ts +65 -4
  100. package/src/index.ts +12 -11
  101. package/src/inventory/binding.ts +25 -0
  102. package/src/inventory/declaration.ts +168 -0
  103. package/src/inventory/index.ts +18 -0
  104. package/src/inventory/sync.ts +22 -0
  105. package/src/package-finalizer.ts +2 -42
  106. package/src/parameterized-pack-node.ts +1968 -0
  107. package/src/parameterized-pack.ts +1493 -0
  108. package/src/resolve-asset-source.ts +4 -76
  109. package/src/scanner.ts +241 -59
  110. package/src/schema-compiled.ts +2 -0
  111. package/src/scriptable-pack-node.ts +111 -722
  112. package/src/scriptable-pack-worker.ts +48 -16
  113. package/src/scriptable-pack.ts +27 -939
  114. package/dist/.tsbuildinfo +0 -1
  115. package/dist/__tests__/load-asset-config.test.d.ts +0 -2
  116. package/dist/__tests__/load-asset-config.test.d.ts.map +0 -1
  117. package/dist/__tests__/scriptable-pack.test-d.d.ts +0 -2
  118. package/dist/__tests__/scriptable-pack.test-d.d.ts.map +0 -1
  119. package/dist/__tests__/scriptable-pack.unit.test.d.ts +0 -2
  120. package/dist/__tests__/scriptable-pack.unit.test.d.ts.map +0 -1
  121. package/dist/config.d.ts +0 -6
  122. package/dist/config.d.ts.map +0 -1
  123. package/dist/config.mjs +0 -29
  124. package/dist/config.mjs.map +0 -1
  125. package/src/__tests__/load-asset-config.test.ts +0 -121
  126. package/src/__tests__/scriptable-pack.test-d.ts +0 -131
  127. package/src/__tests__/scriptable-pack.unit.test.ts +0 -789
  128. package/src/config.ts +0 -36
@@ -20,9 +20,8 @@ type LoadedDefinition = {
20
20
  readonly schemaVersion?: unknown;
21
21
  readonly packageId?: unknown;
22
22
  readonly name?: unknown;
23
- readonly assets?: unknown;
23
+ readonly parameters?: unknown;
24
24
  readonly sceneComponents?: unknown;
25
- readonly externalAssets?: unknown;
26
25
  readonly build?: unknown;
27
26
  };
28
27
  let definition: LoadedDefinition | undefined;
@@ -43,6 +42,25 @@ function failure(error: unknown): unknown {
43
42
  };
44
43
  }
45
44
 
45
+ function serializableSceneComponents(value: unknown): unknown {
46
+ if (!Array.isArray(value)) return undefined;
47
+ return value.map((component) => {
48
+ const candidate = component as { readonly name?: unknown; readonly fields?: unknown };
49
+ const fields =
50
+ candidate.fields !== null &&
51
+ typeof candidate.fields === 'object' &&
52
+ !Array.isArray(candidate.fields)
53
+ ? Object.fromEntries(
54
+ Object.entries(candidate.fields as Record<string, unknown>).map(([name, field]) => [
55
+ name,
56
+ typeof field === 'string' ? field : (field as { readonly type?: unknown })?.type,
57
+ ]),
58
+ )
59
+ : undefined;
60
+ return { name: candidate.name, fields };
61
+ });
62
+ }
63
+
46
64
  const SOURCE_EXTENSIONS = ['.ts', '.tsx', '.mts', '.cts', '.js', '.mjs', '.cjs'] as const;
47
65
 
48
66
  function resolveRelativeImport(importer: string, specifier: string): string | undefined {
@@ -71,15 +89,19 @@ function resolveBareImport(importer: string, specifier: string): string | undefi
71
89
  }
72
90
  ).resolve;
73
91
  if (resolver === undefined) return undefined;
74
- try {
75
- const resolved = resolver(specifier, pathToFileURL(importer).href);
76
- return resolved.startsWith('file:') ? fileURLToPath(resolved) : undefined;
77
- } catch {
78
- // Type-only or optional imports may not be installed in the game project.
79
- // Preserve them for TypeScript to erase or let Node report the real load
80
- // failure instead of guessing a workspace root.
81
- return undefined;
92
+ // Resolve consumer dependencies from the source file first, then resolve
93
+ // Engine self-references from this worker's package. A compiled source
94
+ // closure lives in /tmp, so using only its path makes
95
+ // @forgeax/engine-pack/source disappear from Node's lookup ancestry.
96
+ for (const parent of [pathToFileURL(importer).href, import.meta.url]) {
97
+ try {
98
+ const resolved = resolver(specifier, parent);
99
+ if (resolved.startsWith('file:')) return fileURLToPath(resolved);
100
+ } catch {
101
+ // Try the loader package before treating the import as unavailable.
102
+ }
82
103
  }
104
+ return undefined;
83
105
  }
84
106
 
85
107
  function resolvedModuleSpecifier(
@@ -231,10 +253,11 @@ async function loadDefinition(task: {
231
253
  : {
232
254
  schemaVersion: definition.schemaVersion,
233
255
  packageId: definition.packageId,
234
- name: definition.name,
235
- assets: definition.assets,
236
- sceneComponents: definition.sceneComponents,
237
- externalAssets: definition.externalAssets,
256
+ ...(definition.name === undefined ? {} : { name: definition.name }),
257
+ ...(definition.parameters === undefined ? {} : { parameters: definition.parameters }),
258
+ ...(definition.sceneComponents === undefined
259
+ ? {}
260
+ : { sceneComponents: serializableSceneComponents(definition.sceneComponents) }),
238
261
  },
239
262
  });
240
263
  }
@@ -275,13 +298,22 @@ async function handleMessage(message: unknown): Promise<void> {
275
298
  return;
276
299
  }
277
300
  try {
278
- const result = await definition.build({
301
+ const context =
302
+ value.context !== null && typeof value.context === 'object'
303
+ ? (value.context as { readonly packageId?: unknown; readonly values?: unknown })
304
+ : undefined;
305
+ const buildContext = {
306
+ ...(Array.isArray(context?.packageId)
307
+ ? { packageId: new Uint8Array(context.packageId as number[]) }
308
+ : {}),
309
+ ...(context?.values !== undefined ? { values: context.values } : {}),
279
310
  readByGuid(guid: Uint8Array): Promise<unknown> {
280
311
  const readId = nextReadId++;
281
312
  port.postMessage({ kind: 'asset-read', buildId: value.buildId, readId, guid });
282
313
  return new Promise((resolve) => reads.set(readId, resolve));
283
314
  },
284
- });
315
+ };
316
+ const result = await definition.build(buildContext);
285
317
  port.postMessage({
286
318
  kind: 'build-result',
287
319
  buildId: value.buildId,