@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.
Files changed (139) hide show
  1. package/README.md +167 -48
  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__/material-cook-receipt-layer-plan.unit.test.d.ts +2 -0
  5. package/dist/__tests__/material-cook-receipt-layer-plan.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/pack-authoring-gateway.unit.test.d.ts +2 -0
  7. package/dist/__tests__/pack-authoring-gateway.unit.test.d.ts.map +1 -0
  8. package/dist/__tests__/pack-authoring.unit.test.d.ts +2 -0
  9. package/dist/__tests__/pack-authoring.unit.test.d.ts.map +1 -0
  10. package/dist/__tests__/pack-scanner.unit.test.d.ts +2 -0
  11. package/dist/__tests__/pack-scanner.unit.test.d.ts.map +1 -0
  12. package/dist/__tests__/scanner-blacklist.test.d.ts +2 -0
  13. package/dist/__tests__/scanner-blacklist.test.d.ts.map +1 -0
  14. package/dist/build.d.ts +9 -4
  15. package/dist/build.d.ts.map +1 -1
  16. package/dist/build.mjs +3449 -897
  17. package/dist/build.mjs.map +1 -1
  18. package/dist/builtin.mjs +37 -4
  19. package/dist/builtin.mjs.map +1 -1
  20. package/dist/catalog-builder.d.ts.map +1 -1
  21. package/dist/cli-asset.d.ts.map +1 -1
  22. package/dist/cli-asset.mjs +1361 -845
  23. package/dist/cli-asset.mjs.map +1 -1
  24. package/dist/deriveAssetName.d.ts +11 -7
  25. package/dist/deriveAssetName.d.ts.map +1 -1
  26. package/dist/evidence/material-cook.d.ts +11 -0
  27. package/dist/evidence/material-cook.d.ts.map +1 -1
  28. package/dist/evidence/source-inventory.d.ts.map +1 -1
  29. package/dist/guid.d.ts +15 -0
  30. package/dist/guid.d.ts.map +1 -1
  31. package/dist/guid.mjs +53 -5
  32. package/dist/guid.mjs.map +1 -1
  33. package/dist/index.d.ts +4 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.mjs +1297 -562
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/inventory/binding.d.ts +6 -0
  38. package/dist/inventory/binding.d.ts.map +1 -0
  39. package/dist/inventory/declaration.d.ts +24 -0
  40. package/dist/inventory/declaration.d.ts.map +1 -0
  41. package/dist/inventory/index.d.ts +3 -0
  42. package/dist/inventory/index.d.ts.map +1 -0
  43. package/dist/inventory/sync.d.ts +5 -0
  44. package/dist/inventory/sync.d.ts.map +1 -0
  45. package/dist/material-cook.d.ts +1 -1
  46. package/dist/material-cook.d.ts.map +1 -1
  47. package/dist/material-cook.mjs +50 -3
  48. package/dist/material-cook.mjs.map +1 -1
  49. package/dist/name.mjs +4 -7
  50. package/dist/name.mjs.map +1 -1
  51. package/dist/pack-authoring-node.d.ts +26 -0
  52. package/dist/pack-authoring-node.d.ts.map +1 -0
  53. package/dist/pack-authoring-node.mjs +11089 -0
  54. package/dist/pack-authoring-node.mjs.map +1 -0
  55. package/dist/pack-authoring.d.ts +230 -0
  56. package/dist/pack-authoring.d.ts.map +1 -0
  57. package/dist/pack-authoring.mjs +1137 -0
  58. package/dist/pack-authoring.mjs.map +1 -0
  59. package/dist/package-finalizer.d.ts +2 -20
  60. package/dist/package-finalizer.d.ts.map +1 -1
  61. package/dist/resolve-asset-source.d.ts +1 -3
  62. package/dist/resolve-asset-source.d.ts.map +1 -1
  63. package/dist/resolve-asset-source.mjs +6 -81
  64. package/dist/resolve-asset-source.mjs.map +1 -1
  65. package/dist/runtime.mjs +77 -7
  66. package/dist/runtime.mjs.map +1 -1
  67. package/dist/scanner.d.ts +18 -7
  68. package/dist/scanner.d.ts.map +1 -1
  69. package/dist/scanner.mjs +1164 -687
  70. package/dist/scanner.mjs.map +1 -1
  71. package/dist/schema-compiled.d.ts.map +1 -1
  72. package/dist/schema.mjs +79 -7
  73. package/dist/schema.mjs.map +1 -1
  74. package/dist/scriptable-pack-node.d.ts +7 -31
  75. package/dist/scriptable-pack-node.d.ts.map +1 -1
  76. package/dist/scriptable-pack-node.mjs +572 -1019
  77. package/dist/scriptable-pack-node.mjs.map +1 -1
  78. package/dist/scriptable-pack-worker.mjs +29 -11
  79. package/dist/scriptable-pack-worker.mjs.map +1 -1
  80. package/dist/scriptable-pack.d.ts +20 -532
  81. package/dist/scriptable-pack.d.ts.map +1 -1
  82. package/dist/scriptable-pack.mjs +1038 -527
  83. package/dist/scriptable-pack.mjs.map +1 -1
  84. package/package.json +2 -7
  85. package/schema/meta.schema.json +1 -1
  86. package/schema/pack.schema.json +76 -6
  87. package/src/__tests__/guid-collision.unit.test.ts +18 -9
  88. package/src/__tests__/inventory-schema.test.ts +109 -0
  89. package/src/__tests__/material-cook-receipt-layer-plan.unit.test.ts +16 -0
  90. package/src/__tests__/material-cook-schema.unit.test.ts +62 -0
  91. package/src/__tests__/pack-authoring-gateway.unit.test.ts +249 -0
  92. package/src/__tests__/pack-authoring.unit.test.ts +266 -0
  93. package/src/__tests__/pack-scanner.unit.test.ts +123 -0
  94. package/src/__tests__/pack.unit.test.ts +1 -238
  95. package/src/__tests__/package-finalizer.contract.test.ts +55 -0
  96. package/src/__tests__/resolve-asset-source.test.ts +15 -98
  97. package/src/__tests__/scanner-blacklist.test.ts +55 -0
  98. package/src/__tests__/scanner-inventory.contract.test.ts +11 -14
  99. package/src/__tests__/scanner-inventory.test.ts +23 -10
  100. package/src/__tests__/scriptable-pack-cli.integration.test.ts +4 -9
  101. package/src/__tests__/topology.unit.test.ts +23 -0
  102. package/src/build.ts +28 -18
  103. package/src/catalog-builder.ts +60 -33
  104. package/src/cli-asset.ts +68 -83
  105. package/src/deriveAssetName.ts +14 -13
  106. package/src/evidence/material-cook.ts +79 -3
  107. package/src/evidence/source-inventory.ts +34 -21
  108. package/src/guid.ts +65 -4
  109. package/src/index.ts +15 -11
  110. package/src/inventory/binding.ts +25 -0
  111. package/src/inventory/declaration.ts +168 -0
  112. package/src/inventory/index.ts +18 -0
  113. package/src/inventory/sync.ts +22 -0
  114. package/src/material-cook.ts +1 -0
  115. package/src/pack-authoring-node.ts +1966 -0
  116. package/src/pack-authoring.ts +1478 -0
  117. package/src/package-finalizer.ts +2 -42
  118. package/src/resolve-asset-source.ts +4 -76
  119. package/src/scanner.ts +236 -56
  120. package/src/schema/material-cook.schema.json +4 -1
  121. package/src/schema-compiled.ts +2 -0
  122. package/src/scriptable-pack-node.ts +108 -719
  123. package/src/scriptable-pack-worker.ts +48 -16
  124. package/src/scriptable-pack.ts +28 -939
  125. package/dist/.tsbuildinfo +0 -1
  126. package/dist/__tests__/load-asset-config.test.d.ts +0 -2
  127. package/dist/__tests__/load-asset-config.test.d.ts.map +0 -1
  128. package/dist/__tests__/scriptable-pack.test-d.d.ts +0 -2
  129. package/dist/__tests__/scriptable-pack.test-d.d.ts.map +0 -1
  130. package/dist/__tests__/scriptable-pack.unit.test.d.ts +0 -2
  131. package/dist/__tests__/scriptable-pack.unit.test.d.ts.map +0 -1
  132. package/dist/config.d.ts +0 -6
  133. package/dist/config.d.ts.map +0 -1
  134. package/dist/config.mjs +0 -29
  135. package/dist/config.mjs.map +0 -1
  136. package/src/__tests__/load-asset-config.test.ts +0 -121
  137. package/src/__tests__/scriptable-pack.test-d.ts +0 -131
  138. package/src/__tests__/scriptable-pack.unit.test.ts +0 -789
  139. 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,