@forgeax/engine-pack 0.1.21 → 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 (124) 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 +3314 -803
  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/source-inventory.d.ts.map +1 -1
  25. package/dist/guid.d.ts +15 -0
  26. package/dist/guid.d.ts.map +1 -1
  27. package/dist/guid.mjs +53 -5
  28. package/dist/guid.mjs.map +1 -1
  29. package/dist/index.d.ts +3 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.mjs +1252 -560
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/inventory/binding.d.ts +6 -0
  34. package/dist/inventory/binding.d.ts.map +1 -0
  35. package/dist/inventory/declaration.d.ts +24 -0
  36. package/dist/inventory/declaration.d.ts.map +1 -0
  37. package/dist/inventory/index.d.ts +3 -0
  38. package/dist/inventory/index.d.ts.map +1 -0
  39. package/dist/inventory/sync.d.ts +5 -0
  40. package/dist/inventory/sync.d.ts.map +1 -0
  41. package/dist/name.mjs +4 -7
  42. package/dist/name.mjs.map +1 -1
  43. package/dist/package-finalizer.d.ts +2 -20
  44. package/dist/package-finalizer.d.ts.map +1 -1
  45. package/dist/parameterized-pack-node.d.ts +26 -0
  46. package/dist/parameterized-pack-node.d.ts.map +1 -0
  47. package/dist/parameterized-pack-node.mjs +11093 -0
  48. package/dist/parameterized-pack-node.mjs.map +1 -0
  49. package/dist/parameterized-pack.d.ts +233 -0
  50. package/dist/parameterized-pack.d.ts.map +1 -0
  51. package/dist/resolve-asset-source.d.ts +1 -3
  52. package/dist/resolve-asset-source.d.ts.map +1 -1
  53. package/dist/resolve-asset-source.mjs +6 -81
  54. package/dist/resolve-asset-source.mjs.map +1 -1
  55. package/dist/runtime.mjs +77 -7
  56. package/dist/runtime.mjs.map +1 -1
  57. package/dist/scanner.d.ts +19 -8
  58. package/dist/scanner.d.ts.map +1 -1
  59. package/dist/scanner.mjs +1169 -690
  60. package/dist/scanner.mjs.map +1 -1
  61. package/dist/schema-compiled.d.ts.map +1 -1
  62. package/dist/schema.mjs +79 -7
  63. package/dist/schema.mjs.map +1 -1
  64. package/dist/scriptable-pack-node.d.ts +8 -32
  65. package/dist/scriptable-pack-node.d.ts.map +1 -1
  66. package/dist/scriptable-pack-node.mjs +576 -1021
  67. package/dist/scriptable-pack-node.mjs.map +1 -1
  68. package/dist/scriptable-pack-worker.mjs +29 -11
  69. package/dist/scriptable-pack-worker.mjs.map +1 -1
  70. package/dist/scriptable-pack.d.ts +19 -532
  71. package/dist/scriptable-pack.d.ts.map +1 -1
  72. package/dist/scriptable-pack.mjs +1042 -527
  73. package/dist/scriptable-pack.mjs.map +1 -1
  74. package/package.json +7 -7
  75. package/schema/meta.schema.json +1 -1
  76. package/schema/pack.schema.json +76 -6
  77. package/src/__tests__/guid-collision.unit.test.ts +18 -9
  78. package/src/__tests__/inventory-schema.test.ts +109 -0
  79. package/src/__tests__/pack.unit.test.ts +1 -238
  80. package/src/__tests__/package-finalizer.contract.test.ts +55 -0
  81. package/src/__tests__/parameterized-pack-authoring-gateway.unit.test.ts +249 -0
  82. package/src/__tests__/parameterized-pack-scanner.unit.test.ts +123 -0
  83. package/src/__tests__/parameterized-pack.unit.test.ts +266 -0
  84. package/src/__tests__/resolve-asset-source.test.ts +15 -98
  85. package/src/__tests__/scanner-blacklist.test.ts +55 -0
  86. package/src/__tests__/scanner-inventory.contract.test.ts +14 -15
  87. package/src/__tests__/scanner-inventory.test.ts +24 -12
  88. package/src/__tests__/scriptable-pack-cli.integration.test.ts +4 -9
  89. package/src/__tests__/topology.unit.test.ts +23 -0
  90. package/src/build.ts +28 -18
  91. package/src/catalog-builder.ts +61 -34
  92. package/src/cli-asset.ts +70 -85
  93. package/src/deriveAssetName.ts +14 -13
  94. package/src/evidence/source-inventory.ts +34 -21
  95. package/src/guid.ts +65 -4
  96. package/src/index.ts +12 -11
  97. package/src/inventory/binding.ts +25 -0
  98. package/src/inventory/declaration.ts +168 -0
  99. package/src/inventory/index.ts +18 -0
  100. package/src/inventory/sync.ts +22 -0
  101. package/src/package-finalizer.ts +2 -42
  102. package/src/parameterized-pack-node.ts +1968 -0
  103. package/src/parameterized-pack.ts +1493 -0
  104. package/src/resolve-asset-source.ts +4 -76
  105. package/src/scanner.ts +241 -59
  106. package/src/schema-compiled.ts +2 -0
  107. package/src/scriptable-pack-node.ts +111 -722
  108. package/src/scriptable-pack-worker.ts +48 -16
  109. package/src/scriptable-pack.ts +27 -939
  110. package/dist/.tsbuildinfo +0 -1
  111. package/dist/__tests__/load-asset-config.test.d.ts +0 -2
  112. package/dist/__tests__/load-asset-config.test.d.ts.map +0 -1
  113. package/dist/__tests__/scriptable-pack.test-d.d.ts +0 -2
  114. package/dist/__tests__/scriptable-pack.test-d.d.ts.map +0 -1
  115. package/dist/__tests__/scriptable-pack.unit.test.d.ts +0 -2
  116. package/dist/__tests__/scriptable-pack.unit.test.d.ts.map +0 -1
  117. package/dist/config.d.ts +0 -6
  118. package/dist/config.d.ts.map +0 -1
  119. package/dist/config.mjs +0 -29
  120. package/dist/config.mjs.map +0 -1
  121. package/src/__tests__/load-asset-config.test.ts +0 -121
  122. package/src/__tests__/scriptable-pack.test-d.ts +0 -131
  123. package/src/__tests__/scriptable-pack.unit.test.ts +0 -789
  124. 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,