@carbonenginejs/runtime 0.1.0-alpha.2 → 0.1.0-alpha.3

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 (45) hide show
  1. package/dist/global/model/CjsModel.js +3 -1
  2. package/dist/global/model/CjsModel.js.map +1 -1
  3. package/dist/global/model/document/CjsDocumentHydrator.js +5 -1
  4. package/dist/global/model/document/CjsDocumentHydrator.js.map +1 -1
  5. package/dist/global/schema/CjsSchema.js +98 -18
  6. package/dist/global/schema/CjsSchema.js.map +1 -1
  7. package/dist/global/schema/hydration.js +10 -8
  8. package/dist/global/schema/hydration.js.map +1 -1
  9. package/dist/index.js +2 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/resource/CjsResMan.js +177 -4
  12. package/dist/resource/CjsResMan.js.map +1 -1
  13. package/dist/resource/format/CjsBlueReader.js +8 -1
  14. package/dist/resource/format/CjsBlueReader.js.map +1 -1
  15. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +7 -1
  16. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  17. package/dist/resource/index.js +2 -0
  18. package/dist/resource/index.js.map +1 -1
  19. package/dist/resource/texture/SolidColorTextureConstructor.js +46 -0
  20. package/dist/resource/texture/SolidColorTextureConstructor.js.map +1 -0
  21. package/dist/resource/texture/TriTextureRes.js +43 -0
  22. package/dist/resource/texture/TriTextureRes.js.map +1 -1
  23. package/dist/resource/texture/index.js +2 -0
  24. package/dist/resource/texture/index.js.map +1 -1
  25. package/dist/resource/texture/solidColorTexture.js +111 -0
  26. package/dist/resource/texture/solidColorTexture.js.map +1 -0
  27. package/dist/trinity/eve/attachment/decal/EveSpaceObjectDecal.js +19 -8
  28. package/dist/trinity/eve/attachment/decal/EveSpaceObjectDecal.js.map +1 -1
  29. package/dist/trinity/eve/child/EveChildMesh.js +17 -3
  30. package/dist/trinity/eve/child/EveChildMesh.js.map +1 -1
  31. package/dist/trinity/eve/locator/EveLocatorSets.js +12 -3
  32. package/dist/trinity/eve/locator/EveLocatorSets.js.map +1 -1
  33. package/dist/trinity/eve/spaceObject/EveSpaceObject2.js +15 -2
  34. package/dist/trinity/eve/spaceObject/EveSpaceObject2.js.map +1 -1
  35. package/dist/trinity/eve/spaceObject/IEveSpaceObject2ParentData.js +44 -52
  36. package/dist/trinity/eve/spaceObject/IEveSpaceObject2ParentData.js.map +1 -1
  37. package/docs/resource/concepts/resource-lifecycle.md +10 -8
  38. package/docs/resource/formats/geometry-interchange.md +50 -0
  39. package/docs/resource/formats/webgl/decl-io.md +241 -397
  40. package/docs/resource/formats/webgl/memory-structured.md +91 -128
  41. package/docs/resource/formats/webgl/texture-sample.md +306 -469
  42. package/docs/resource/reference/classes/texture.md +11 -1
  43. package/docs/resource/reference/motherlode-cache.md +24 -11
  44. package/docs/resource/reference/queues.md +23 -1
  45. package/package.json +1 -1
@@ -124,7 +124,11 @@ class CjsDocumentHydrator {
124
124
  kind: node.kind,
125
125
  shape,
126
126
  node,
127
- options
127
+ options,
128
+ // The class this hydrator resolved for the kind, asked of the schema:
129
+ // does it declare fields to populate? A caller-supplied plain class
130
+ // does not, and keeps raw assignment.
131
+ declared: CjsSchema.getClassName(CjsDocumentHydrator.resolveClass(node.kind, options)) !== null
128
132
  });
129
133
  Object.assign(target, rawValues);
130
134
  return target;
@@ -1 +1 @@
1
- {"version":3,"file":"CjsDocumentHydrator.js","sources":["../../../../../src/global/model/document/CjsDocumentHydrator.js"],"sourcesContent":["// DEPRECATED carbon.document boundary. The collapse into plain CjsModel\n// values is decided and partially executed - the envelope was\n// over-engineered, and a _type-tagged values graph carries everything it\n// did. Kept only until the interchange retirement completes its inventory\n// (docs/contracts/model-values-interchange.md owns the rule: no document\n// producer or consumer retires without inventory and replacement proof;\n// docs/research/schema-hydration-consolidation-plan-2026-09-05.md holds\n// the enumerated remaining surfaces). Do not add new consumers.\nimport { normalizeCarbonValue } from \"../../schema/types/index.js\";\r\nimport { CjsSchema } from \"../../schema/index.js\";\r\nimport { CjsCarbonDocument } from \"./CjsCarbonDocument.js\";\r\nimport { resolveHydrationAdapter } from \"../../schema/hydration.js\";\r\n\r\n/** Constructs runtime object graphs from neutral Carbon documents. */\r\nexport class CjsDocumentHydrator\r\n{\r\n /**\r\n * Hydrates every node in a Carbon document through the selected registry and\r\n * adapter.\r\n */\r\n Hydrate(document, options = {})\r\n {\r\n return CjsDocumentHydrator.hydrate(document, options);\r\n }\r\n\r\n /** Hydrates a Carbon document and returns its first root. */\r\n HydrateRoot(document, options = {})\r\n {\r\n return CjsDocumentHydrator.hydrateRoot(document, options);\r\n }\r\n\r\n /** Hydrates a normalized document into constructed runtime objects and roots. */\r\n static hydrate(document, options = {})\r\n {\r\n const normalized = CjsCarbonDocument.normalize(document);\r\n const nodeById = new Map(normalized.nodes.map(node => [node.id, node]));\r\n const instanceById = new Map();\r\n const reports = [];\r\n const adapter = resolveHydrationAdapter(options);\r\n\r\n for (const node of normalized.nodes)\r\n {\r\n instanceById.set(node.id, CjsDocumentHydrator.createNodeTarget(node, options, reports, adapter));\r\n }\r\n\r\n for (const node of normalized.nodes)\r\n {\r\n CjsDocumentHydrator.applyNodeValues(instanceById.get(node.id), node, instanceById, options, adapter);\r\n }\r\n\r\n // Phase 3: every instance is constructed and valued, so references are\r\n // resolved - now let callers run their own post-graph init.\r\n for (const node of normalized.nodes)\r\n {\r\n adapter.finalize(instanceById.get(node.id), { kind: node.kind, node, options });\r\n }\r\n\r\n const roots = normalized.roots.map(root => ({\r\n name: root.name,\r\n value: CjsDocumentHydrator.resolveDocumentValue(root.ref, instanceById, options)\r\n }));\r\n\r\n return {\r\n root: roots[0]?.value ?? null,\r\n roots,\r\n document: normalized,\r\n reports,\r\n get(id)\r\n {\r\n return instanceById.get(Number(id)) || null;\r\n },\r\n getNode(id)\r\n {\r\n return nodeById.get(Number(id)) || null;\r\n }\r\n };\r\n }\r\n\r\n /** Returns the first hydrated root in document order. */\r\n static hydrateRoot(document, options = {})\r\n {\r\n return CjsDocumentHydrator.hydrate(document, options).root;\r\n }\r\n\r\n /**\r\n * Constructs the runtime target appropriate for one normalized document\r\n * node.\r\n */\r\n static createNodeTarget(node, options, reports, adapter)\r\n {\r\n if (adapter)\r\n {\r\n const built = adapter.construct(node.kind, { kind: node.kind, node, options });\r\n if (built !== undefined) return built;\r\n }\r\n\r\n const ClassConstructor = CjsDocumentHydrator.resolveClass(node.kind, options);\r\n if (ClassConstructor)\r\n {\r\n return new ClassConstructor();\r\n }\r\n\r\n throw new TypeError(`No class is registered for hydratable type ${node.kind}.`);\r\n }\r\n\r\n /**\r\n * Applies resolved field values to a constructed node through the hydration\r\n * adapter.\r\n */\r\n static applyNodeValues(target, node, instanceById, options, adapter)\r\n {\r\n const registeredSchema = target?.constructor\r\n ? CjsSchema.getSchema(target.constructor)\r\n : null;\r\n const shape = target?._sourceShape || (registeredSchema?.className ? registeredSchema : null);\r\n const fieldByName = new Map((shape?.fields || []).map(field => [field.name, field]));\r\n const values = {};\r\n\r\n for (const [key, item] of Object.entries(node.fields || {}))\r\n {\r\n if (CjsSchema.isFieldHidden(target?.constructor, key)) continue;\r\n const field = fieldByName.get(key) || null;\r\n values[key] = CjsDocumentHydrator.hydrateFieldValue(item, field, instanceById, options);\r\n }\r\n\r\n // node.raw is enumerable NON-SCHEMA state, and its preservation is this\r\n // deprecated path's documented contract (model-values-interchange.md).\r\n // It is applied by direct assignment AFTER the adapter: a validated\r\n // setter rightly ignores undeclared keys, so raw state is the\r\n // hydrator's own job, exactly as it is for plain fallback carriers.\r\n const rawValues = {};\r\n for (const [key, item] of Object.entries(node.raw || {}))\r\n {\r\n if (CjsSchema.isFieldHidden(target?.constructor, key)) continue;\r\n rawValues[key] = CjsDocumentHydrator.resolveDocumentValue(item, instanceById, options);\r\n }\r\n\r\n const apply = adapter || resolveHydrationAdapter(options);\r\n apply.applyValues(target, values, { kind: node.kind, shape, node, options });\r\n Object.assign(target, rawValues);\r\n return target;\r\n }\r\n\r\n /** Hydrates one field value according to its schema descriptor. */\r\n static hydrateFieldValue(value, field, instanceById, options)\r\n {\r\n const resolved = CjsDocumentHydrator.resolveDocumentValue(value, instanceById, options);\r\n const descriptor = field?.type || field?.jsType || null;\r\n const kind = descriptor?.kind;\r\n\r\n if ((kind === \"array\" || kind === \"list\") && Array.isArray(resolved)) return resolved;\r\n if ((kind === \"model\" || kind === \"objectRef\" || kind === \"struct\" || kind === \"rawStruct\" || kind === \"unknown\") && resolved && typeof resolved === \"object\") return resolved;\r\n if (CjsDocumentHydrator.isShapeIncompatibleMathArray(resolved, descriptor)) return resolved;\r\n\r\n return descriptor ? normalizeCarbonValue(resolved, descriptor) : resolved;\r\n }\r\n\r\n /** Recursively resolves document references and nested portable values. */\r\n static resolveDocumentValue(value, instanceById, options)\r\n {\r\n if (CjsCarbonDocument.isRef(value))\r\n {\r\n const id = Number(value.$ref);\r\n if (instanceById.has(id)) return instanceById.get(id);\r\n if (options.allowMissingRefs) return null;\r\n throw new TypeError(`CarbonDocument ref ${id} does not exist`);\r\n }\r\n\r\n if (Array.isArray(value)) return value.map(item => CjsDocumentHydrator.resolveDocumentValue(item, instanceById, options));\r\n if (value && typeof value === \"object\")\r\n {\r\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, CjsDocumentHydrator.resolveDocumentValue(item, instanceById, options)]));\r\n }\r\n return value;\r\n }\r\n\r\n /** Resolves a node's serialized type through the active class registry. */\r\n static resolveClass(kind, options)\r\n {\r\n const Schema = options.registry || CjsSchema;\r\n return Schema.GetConstructor(kind);\r\n }\r\n\r\n /**\r\n * Reports when source-shape metadata prevents coercion to a declared math\r\n * container.\r\n */\r\n static isShapeIncompatibleMathArray(value, descriptor)\r\n {\r\n const expectedLength = descriptor?.length;\r\n return Array.isArray(value) && Number.isInteger(expectedLength) && value.length !== expectedLength;\r\n }\r\n}\r\n"],"names":["CjsDocumentHydrator","Hydrate","document","options","hydrate","HydrateRoot","hydrateRoot","normalized","CjsCarbonDocument","normalize","nodeById","Map","nodes","map","node","id","instanceById","reports","adapter","resolveHydrationAdapter","set","createNodeTarget","applyNodeValues","get","finalize","kind","roots","root","name","value","resolveDocumentValue","ref","Number","getNode","built","construct","undefined","ClassConstructor","resolveClass","TypeError","target","registeredSchema","constructor","CjsSchema","getSchema","shape","_sourceShape","className","fieldByName","fields","field","values","key","item","Object","entries","isFieldHidden","hydrateFieldValue","rawValues","raw","apply","applyValues","assign","resolved","descriptor","type","jsType","Array","isArray","isShapeIncompatibleMathArray","normalizeCarbonValue","isRef","$ref","has","allowMissingRefs","fromEntries","Schema","registry","GetConstructor","expectedLength","length","isInteger"],"mappings":"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"}
1
+ {"version":3,"file":"CjsDocumentHydrator.js","sources":["../../../../../src/global/model/document/CjsDocumentHydrator.js"],"sourcesContent":["// DEPRECATED carbon.document boundary. The collapse into plain CjsModel\r\n// values is decided and partially executed - the envelope was\r\n// over-engineered, and a _type-tagged values graph carries everything it\r\n// did. Kept only until the interchange retirement completes its inventory\r\n// (docs/contracts/model-values-interchange.md owns the rule: no document\r\n// producer or consumer retires without inventory and replacement proof;\r\n// docs/research/schema-hydration-consolidation-plan-2026-09-05.md holds\r\n// the enumerated remaining surfaces). Do not add new consumers.\r\nimport { normalizeCarbonValue } from \"../../schema/types/index.js\";\r\nimport { CjsSchema } from \"../../schema/index.js\";\r\nimport { CjsCarbonDocument } from \"./CjsCarbonDocument.js\";\r\nimport { resolveHydrationAdapter } from \"../../schema/hydration.js\";\r\n\r\n/** Constructs runtime object graphs from neutral Carbon documents. */\r\nexport class CjsDocumentHydrator\r\n{\r\n /**\r\n * Hydrates every node in a Carbon document through the selected registry and\r\n * adapter.\r\n */\r\n Hydrate(document, options = {})\r\n {\r\n return CjsDocumentHydrator.hydrate(document, options);\r\n }\r\n\r\n /** Hydrates a Carbon document and returns its first root. */\r\n HydrateRoot(document, options = {})\r\n {\r\n return CjsDocumentHydrator.hydrateRoot(document, options);\r\n }\r\n\r\n /** Hydrates a normalized document into constructed runtime objects and roots. */\r\n static hydrate(document, options = {})\r\n {\r\n const normalized = CjsCarbonDocument.normalize(document);\r\n const nodeById = new Map(normalized.nodes.map(node => [node.id, node]));\r\n const instanceById = new Map();\r\n const reports = [];\r\n const adapter = resolveHydrationAdapter(options);\r\n\r\n for (const node of normalized.nodes)\r\n {\r\n instanceById.set(node.id, CjsDocumentHydrator.createNodeTarget(node, options, reports, adapter));\r\n }\r\n\r\n for (const node of normalized.nodes)\r\n {\r\n CjsDocumentHydrator.applyNodeValues(instanceById.get(node.id), node, instanceById, options, adapter);\r\n }\r\n\r\n // Phase 3: every instance is constructed and valued, so references are\r\n // resolved - now let callers run their own post-graph init.\r\n for (const node of normalized.nodes)\r\n {\r\n adapter.finalize(instanceById.get(node.id), { kind: node.kind, node, options });\r\n }\r\n\r\n const roots = normalized.roots.map(root => ({\r\n name: root.name,\r\n value: CjsDocumentHydrator.resolveDocumentValue(root.ref, instanceById, options)\r\n }));\r\n\r\n return {\r\n root: roots[0]?.value ?? null,\r\n roots,\r\n document: normalized,\r\n reports,\r\n get(id)\r\n {\r\n return instanceById.get(Number(id)) || null;\r\n },\r\n getNode(id)\r\n {\r\n return nodeById.get(Number(id)) || null;\r\n }\r\n };\r\n }\r\n\r\n /** Returns the first hydrated root in document order. */\r\n static hydrateRoot(document, options = {})\r\n {\r\n return CjsDocumentHydrator.hydrate(document, options).root;\r\n }\r\n\r\n /**\r\n * Constructs the runtime target appropriate for one normalized document\r\n * node.\r\n */\r\n static createNodeTarget(node, options, reports, adapter)\r\n {\r\n if (adapter)\r\n {\r\n const built = adapter.construct(node.kind, { kind: node.kind, node, options });\r\n if (built !== undefined) return built;\r\n }\r\n\r\n const ClassConstructor = CjsDocumentHydrator.resolveClass(node.kind, options);\r\n if (ClassConstructor)\r\n {\r\n return new ClassConstructor();\r\n }\r\n\r\n throw new TypeError(`No class is registered for hydratable type ${node.kind}.`);\r\n }\r\n\r\n /**\r\n * Applies resolved field values to a constructed node through the hydration\r\n * adapter.\r\n */\r\n static applyNodeValues(target, node, instanceById, options, adapter)\r\n {\r\n const registeredSchema = target?.constructor\r\n ? CjsSchema.getSchema(target.constructor)\r\n : null;\r\n const shape = target?._sourceShape || (registeredSchema?.className ? registeredSchema : null);\r\n const fieldByName = new Map((shape?.fields || []).map(field => [field.name, field]));\r\n const values = {};\r\n\r\n for (const [key, item] of Object.entries(node.fields || {}))\r\n {\r\n if (CjsSchema.isFieldHidden(target?.constructor, key)) continue;\r\n const field = fieldByName.get(key) || null;\r\n values[key] = CjsDocumentHydrator.hydrateFieldValue(item, field, instanceById, options);\r\n }\r\n\r\n // node.raw is enumerable NON-SCHEMA state, and its preservation is this\r\n // deprecated path's documented contract (model-values-interchange.md).\r\n // It is applied by direct assignment AFTER the adapter: a validated\r\n // setter rightly ignores undeclared keys, so raw state is the\r\n // hydrator's own job, exactly as it is for plain fallback carriers.\r\n const rawValues = {};\r\n for (const [key, item] of Object.entries(node.raw || {}))\r\n {\r\n if (CjsSchema.isFieldHidden(target?.constructor, key)) continue;\r\n rawValues[key] = CjsDocumentHydrator.resolveDocumentValue(item, instanceById, options);\r\n }\r\n\r\n const apply = adapter || resolveHydrationAdapter(options);\r\n apply.applyValues(target, values, {\r\n kind: node.kind,\r\n shape,\r\n node,\r\n options,\r\n // The class this hydrator resolved for the kind, asked of the schema:\r\n // does it declare fields to populate? A caller-supplied plain class\r\n // does not, and keeps raw assignment.\r\n declared: CjsSchema.getClassName(CjsDocumentHydrator.resolveClass(node.kind, options)) !== null\r\n });\r\n Object.assign(target, rawValues);\r\n return target;\r\n }\r\n\r\n /** Hydrates one field value according to its schema descriptor. */\r\n static hydrateFieldValue(value, field, instanceById, options)\r\n {\r\n const resolved = CjsDocumentHydrator.resolveDocumentValue(value, instanceById, options);\r\n const descriptor = field?.type || field?.jsType || null;\r\n const kind = descriptor?.kind;\r\n\r\n if ((kind === \"array\" || kind === \"list\") && Array.isArray(resolved)) return resolved;\r\n if ((kind === \"model\" || kind === \"objectRef\" || kind === \"struct\" || kind === \"rawStruct\" || kind === \"unknown\") && resolved && typeof resolved === \"object\") return resolved;\r\n if (CjsDocumentHydrator.isShapeIncompatibleMathArray(resolved, descriptor)) return resolved;\r\n\r\n return descriptor ? normalizeCarbonValue(resolved, descriptor) : resolved;\r\n }\r\n\r\n /** Recursively resolves document references and nested portable values. */\r\n static resolveDocumentValue(value, instanceById, options)\r\n {\r\n if (CjsCarbonDocument.isRef(value))\r\n {\r\n const id = Number(value.$ref);\r\n if (instanceById.has(id)) return instanceById.get(id);\r\n if (options.allowMissingRefs) return null;\r\n throw new TypeError(`CarbonDocument ref ${id} does not exist`);\r\n }\r\n\r\n if (Array.isArray(value)) return value.map(item => CjsDocumentHydrator.resolveDocumentValue(item, instanceById, options));\r\n if (value && typeof value === \"object\")\r\n {\r\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, CjsDocumentHydrator.resolveDocumentValue(item, instanceById, options)]));\r\n }\r\n return value;\r\n }\r\n\r\n /** Resolves a node's serialized type through the active class registry. */\r\n static resolveClass(kind, options)\r\n {\r\n const Schema = options.registry || CjsSchema;\r\n return Schema.GetConstructor(kind);\r\n }\r\n\r\n /**\r\n * Reports when source-shape metadata prevents coercion to a declared math\r\n * container.\r\n */\r\n static isShapeIncompatibleMathArray(value, descriptor)\r\n {\r\n const expectedLength = descriptor?.length;\r\n return Array.isArray(value) && Number.isInteger(expectedLength) && value.length !== expectedLength;\r\n }\r\n}\r\n"],"names":["CjsDocumentHydrator","Hydrate","document","options","hydrate","HydrateRoot","hydrateRoot","normalized","CjsCarbonDocument","normalize","nodeById","Map","nodes","map","node","id","instanceById","reports","adapter","resolveHydrationAdapter","set","createNodeTarget","applyNodeValues","get","finalize","kind","roots","root","name","value","resolveDocumentValue","ref","Number","getNode","built","construct","undefined","ClassConstructor","resolveClass","TypeError","target","registeredSchema","constructor","CjsSchema","getSchema","shape","_sourceShape","className","fieldByName","fields","field","values","key","item","Object","entries","isFieldHidden","hydrateFieldValue","rawValues","raw","apply","applyValues","declared","getClassName","assign","resolved","descriptor","type","jsType","Array","isArray","isShapeIncompatibleMathArray","normalizeCarbonValue","isRef","$ref","has","allowMissingRefs","fromEntries","Schema","registry","GetConstructor","expectedLength","length","isInteger"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { defaultValueForCarbonField, coerceCarbonMathInto, coerceCarbonTypedArrayInto, cloneCarbonValue, normalizeCarbonValue, exportCarbonValue } from './types/carbonTypes.js';
1
+ import { defaultValueForCarbonField, coerceCarbonMathInto, coerceCarbonTypedArrayInto, exportCarbonValue, cloneCarbonValue, normalizeCarbonValue } from './types/carbonTypes.js';
2
2
  import { composeNotifyDecorator } from '../compose/notify.js';
3
3
  import { cast, composeInterfaceDecorator } from '../compose/interface.js';
4
4
  import { createValuesTransport, composeValuesDecorator } from '../compose/values.js';
@@ -346,6 +346,51 @@ class CjsSchema {
346
346
  return service ? service.getValues(target, out, options) : CjsSchema.getValuesFromSchema(target, out, options);
347
347
  }
348
348
 
349
+ /**
350
+ * The top-level values rule for from/set: a plain object, or null for "no
351
+ * values".
352
+ *
353
+ * SetValues and from exist for hydration and dehydration, so what arrives
354
+ * at the top is data. A live object there is refused rather than read as
355
+ * a bag: measured before this rule, `X.constructor.from(X)` built a new
356
+ * object that aliased X's children and flattened its Map-held models.
357
+ * Child fields are different - a non-plain value there is a reference, and
358
+ * the field's declared type decides that. The one rule lives here so every
359
+ * entry point asks the same question in the same place.
360
+ *
361
+ * @param {*} values Incoming top-level values.
362
+ * @param {string} label Entry point named in the error.
363
+ * @returns {boolean} False for null (nothing to apply), true for a plain bag.
364
+ * @throws {TypeError} For anything that is not a plain object or null.
365
+ */
366
+ static assertValues(values, label) {
367
+ if (values === null) return false;
368
+ if (!isPlainObject(values)) {
369
+ throw new TypeError(`${label} requires a plain values object; received ${describeValuesInput(values)}.`);
370
+ }
371
+ return true;
372
+ }
373
+
374
+ /**
375
+ * Copies a source's values into a target - the explicit copy helper.
376
+ *
377
+ * The top-level from/set rule refuses a live object as values, so copying
378
+ * one says so here instead: a plain source already IS values, anything
379
+ * else is exported first. Both then go through the target's validated
380
+ * setter, so the target keeps its own identity and in-place buffers. This
381
+ * is a value copy, not Carbon's Copier: no topology is preserved and
382
+ * reference fields carry the source's references across as references.
383
+ *
384
+ * @param {object} target The object receiving the values.
385
+ * @param {object} source A live object or a plain values object.
386
+ * @param {object} [options={}] Population options.
387
+ * @returns {Set<string>|boolean} Changed fields, or a boolean result.
388
+ */
389
+ static copy(target, source, options = {}) {
390
+ const values = isPlainObject(source) ? source : CjsSchema.getValues(source, {}, options);
391
+ return CjsSchema.setValues(target, values, options);
392
+ }
393
+
349
394
  /**
350
395
  * Applies a plain value bag to a target through its validated setter.
351
396
  *
@@ -355,6 +400,7 @@ class CjsSchema {
355
400
  * @returns {Set<string>|boolean} Changed fields, or a boolean result.
356
401
  */
357
402
  static setValues(target, values = {}, options = {}) {
403
+ if (!CjsSchema.assertValues(values, "CjsSchema.setValues")) return false;
358
404
  const service = CjsSchema.#valuesService;
359
405
  return service ? service.setValues(target, values, options) : CjsSchema.setValuesFromSchema(target, values, options);
360
406
  }
@@ -372,18 +418,7 @@ class CjsSchema {
372
418
  static #statelessTransport = createValuesTransport({
373
419
  GetFields: Constructor => getEffectiveFields(Constructor),
374
420
  Export: (value, field, options) => exportCarbonValue(value, field.type),
375
- // A live instance of a registered class is ALIASED, never copied - the
376
- // rule the model path applies through its brand (CjsModel.js, the
377
- // isModelInstance early return). A class off the base carries no brand,
378
- // so without this a reference field would receive a plain-object copy
379
- // and shared identity across the graph would silently split.
380
- Import: (value, field) => {
381
- if (isLiveSchemaInstance(value)) return value;
382
- if (Array.isArray(value) && value.some(isLiveSchemaInstance)) {
383
- return value.map(item => isLiveSchemaInstance(item) ? item : cloneCarbonValue(item));
384
- }
385
- return normalizeCarbonValue(value, field.type);
386
- },
421
+ Import: (value, field) => importDeclaredValue(value, field),
387
422
  CoerceInto: (current, incoming, field) => coerceCarbonMathInto(current, incoming, field.type) ?? coerceCarbonTypedArrayInto(current, incoming, field.type),
388
423
  IsEquivalent: (a, b) => a === b
389
424
  });
@@ -410,6 +445,7 @@ class CjsSchema {
410
445
  * @returns {object} The constructed instance.
411
446
  */
412
447
  static from(className, values = {}, options = {}) {
448
+ if (!CjsSchema.assertValues(values, "CjsSchema.from")) values = {};
413
449
  return CjsSchema.#requireValuesService("from").from(className, values, options);
414
450
  }
415
451
 
@@ -1225,11 +1261,46 @@ function defineHiddenInheritedFields(Constructor, fieldNames) {
1225
1261
  }
1226
1262
  }
1227
1263
 
1228
- // A live instance of a registered class, from this copy or a sibling one -
1229
- // getClassName reads the cross-copy stamp. Plain bags, arrays, typed arrays
1230
- // and the reader's `{ _sourceClassName }` carriers all answer false.
1231
- function isLiveSchemaInstance(value) {
1232
- return !!value && typeof value === "object" && !Array.isArray(value) && !ArrayBuffer.isView(value) && CjsSchema.getClassName(value.constructor) !== null;
1264
+ // The state-free transport's import. A declared REFERENCE field - model or
1265
+ // objectRef, or a list or Map of them - treats a non-plain object as the
1266
+ // reference itself and assigns it, Carbon's IRoot* member (operator ruling,
1267
+ // 2026-09-14). The DECLARED TYPE decides that the field holds references; the
1268
+ // value's class is never inspected. Plain bags, and every other field kind,
1269
+ // import by value exactly as before.
1270
+ function importDeclaredValue(value, field) {
1271
+ const type = field.type;
1272
+ switch (type?.kind) {
1273
+ case "model":
1274
+ case "objectRef":
1275
+ if (isObjectReference(value)) return value;
1276
+ break;
1277
+ case "list":
1278
+ case "array":
1279
+ if (Array.isArray(value) && isReferenceType(type.itemType)) {
1280
+ return value.map(item => isObjectReference(item) ? item : cloneCarbonValue(item));
1281
+ }
1282
+ break;
1283
+ case "map":
1284
+ if (value instanceof Map && isReferenceType(type.valueType)) {
1285
+ return new Map(Array.from(value, ([key, item]) => [key, isObjectReference(item) ? item : cloneCarbonValue(item)]));
1286
+ }
1287
+ break;
1288
+ }
1289
+ return normalizeCarbonValue(value, type);
1290
+ }
1291
+
1292
+ // A declared item type that holds references: a model or objectRef
1293
+ // descriptor, or a bare name registered as a class. "string" and "unknown"
1294
+ // are not registered, so they stay values.
1295
+ function isReferenceType(type) {
1296
+ if (typeof type === "string") return CjsSchema.GetConstructor(type) !== null;
1297
+ return type?.kind === "model" || type?.kind === "objectRef";
1298
+ }
1299
+
1300
+ // Not a values bag: an object that is neither plain, an array nor a typed
1301
+ // array. Asks only what the value is made of, never which class built it.
1302
+ function isObjectReference(value) {
1303
+ return value !== null && typeof value === "object" && !isPlainObject(value) && !Array.isArray(value) && !ArrayBuffer.isView(value);
1233
1304
  }
1234
1305
  function getEffectiveFields(Constructor) {
1235
1306
  const ordered = [];
@@ -1785,5 +1856,14 @@ function isPlainObject(value) {
1785
1856
  return Boolean(value) && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype;
1786
1857
  }
1787
1858
 
1859
+ // Names what arrived where a values bag was required, for assertValues' error.
1860
+ function describeValuesInput(value) {
1861
+ if (value === undefined) return "undefined";
1862
+ if (Array.isArray(value)) return "an array";
1863
+ if (typeof value !== "object") return `a ${typeof value}`;
1864
+ const name = value.constructor?.name;
1865
+ return name ? `an instance of ${name}` : "an object without Object.prototype";
1866
+ }
1867
+
1788
1868
  export { CJS_CLASS_NAME, CJS_ENUM_NAME, CJS_MODEL_BRAND, CjsSchema };
1789
1869
  //# sourceMappingURL=CjsSchema.js.map