@neocompose/cli 0.10.0 → 0.10.2

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 (3) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/dist/neo.mjs +126 -81
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,9 +1,35 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased]
3
+ ## [0.10.2] - 2026-07-25
4
+
5
+ ### Fixed
6
+
7
+ - Read `required` and an override's `extendsMemberId` from source instead of
8
+ carrying the pulled value forward. A member whose stored `required`
9
+ contradicted its own return type, and an override pointing past the member
10
+ it directly overrides, are corrected on the next push.
11
+ - Persist a class's `schemaKeyOrder` only where the declaration order differs
12
+ from the one its schema map already implies. An equivalent order is stored
13
+ as absent rather than spelled out, and the answer no longer depends on
14
+ having pulled the class.
15
+ - Restore the server-owned envelope on reconstructed records before
16
+ prospective animation validation, so a workspace with animation schema no
17
+ longer reports every class as malformed. Validation failures now name the
18
+ offending record.
19
+
20
+ ## [0.10.1] - 2026-07-25
4
21
 
5
22
  ### Changed
6
23
 
24
+ - Derive a collection's hidden entry member id from the member that declares
25
+ it, instead of carrying it forward from the manifest cache. A workspace that
26
+ pushes without `neo/obj/` no longer re-mints every list and dictionary entry
27
+ member, and any workspace declaring the same collection reproduces the same
28
+ id. Every override in a collection family resolves to its declaring member's
29
+ one entry, which is what the hardcoded world entry-id table used to
30
+ approximate; an override that tries to change a collection's element type is
31
+ now an error rather than a silent collapse onto whichever member lowered
32
+ first.
7
33
  - Document the final relation-only world layer-link contract and keep the
8
34
  format-4 Hello World corpus free of the retired value-side binding field.
9
35
 
package/dist/neo.mjs CHANGED
@@ -28844,6 +28844,19 @@ var init_ui_action_source = __esm({
28844
28844
  }
28845
28845
  });
28846
28846
 
28847
+ // ../src/models/members/entry-member-id.ts
28848
+ function derivedEntryMemberId(declaringMemberId) {
28849
+ return v5_default(declaringMemberId, NEO_ENTRY_MEMBER_NAMESPACE);
28850
+ }
28851
+ var NEO_ENTRY_MEMBER_NAMESPACE;
28852
+ var init_entry_member_id = __esm({
28853
+ "../src/models/members/entry-member-id.ts"() {
28854
+ "use strict";
28855
+ init_dist_node();
28856
+ NEO_ENTRY_MEMBER_NAMESPACE = "4d1c4a2f-1a0f-5f3e-9a5c-2b7d6e8f0c31";
28857
+ }
28858
+ });
28859
+
28847
28860
  // src/project-source/lower-members.ts
28848
28861
  function lowerClass(context, declaration) {
28849
28862
  const id2 = materializedId(declaration, "class", declaration.name);
@@ -28902,11 +28915,7 @@ function lowerClass(context, declaration) {
28902
28915
  selectionSpan: span(parameter3.identity)
28903
28916
  };
28904
28917
  });
28905
- const baseEffectiveOrder = base?.schemaKeyOrder ?? (base ? Object.keys(base.schema) : []);
28906
- const baseOwnOrder = baseEffectiveOrder.filter(
28907
- (name) => Object.hasOwn(base?.schema ?? {}, name)
28908
- );
28909
- const persistedSchemaOrder = base && JSON.stringify(baseOwnOrder) === JSON.stringify(schemaKeyOrder) ? base.schemaKeyOrder : schemaKeyOrder;
28918
+ const persistedSchemaOrder = isImpliedSchemaKeyOrder(schemaKeyOrder) ? null : schemaKeyOrder;
28910
28919
  return {
28911
28920
  id: id2,
28912
28921
  source: sourceIdentity2(declaration, "class", declaration.name),
@@ -29107,7 +29116,7 @@ function projectSchemaJsonValue(value) {
29107
29116
  }
29108
29117
  function memberCommon(context, ownerClass, declaration, id2, owner, base) {
29109
29118
  const storage = annotation(declaration.annotations, "storage");
29110
- const inheritedId = declaration.modifiers.includes("override") || declaration.modifiers.includes("sealed") ? base?.overrideOf ?? inheritedMemberId(context, ownerClass, declaration.name) : null;
29119
+ const inheritedId = declaration.modifiers.includes("override") || declaration.modifiers.includes("sealed") ? inheritedMemberId(context, ownerClass, declaration.name) : null;
29111
29120
  return {
29112
29121
  id: id2,
29113
29122
  source: sourceIdentity2(declaration, "member", declaration.name),
@@ -29122,7 +29131,10 @@ function memberCommon(context, ownerClass, declaration, id2, owner, base) {
29122
29131
  accessModifier: owner.kind === "classMember" ? effectiveSourceAccessModifier(declaration.modifiers, "class") : "public",
29123
29132
  modifier: memberModifier2(declaration.modifiers, base?.modifier),
29124
29133
  locked: hasAnnotation(declaration.annotations, "locked"),
29125
- required: declaration.kind === "field" ? !declaration.type.nullable : base?.required ?? false,
29134
+ // Every declaration kind carries a type, and its nullability is the whole
29135
+ // of what `required` means. Properties and getters used to fall back to
29136
+ // the pulled value, which left a fresh workspace calling them optional.
29137
+ required: !declaration.type.nullable,
29126
29138
  defaultValue: null,
29127
29139
  overrideOf: inheritedId,
29128
29140
  system: systemMetadata(declaration.annotations),
@@ -29271,7 +29283,9 @@ function lowerFieldMember(context, ownerClass, declaration, id2, commonInput, ba
29271
29283
  multiselect: true
29272
29284
  };
29273
29285
  }
29274
- const entryId = base?.kind === "list" ? base.entryMemberId : pendingDerivedId("member-entry", id2);
29286
+ const entryId = derivedEntryMemberId(
29287
+ declaringCollectionMemberId(context, id2, common.overrideOf)
29288
+ );
29275
29289
  lowerCollectionEntry(context, ownerClass, entryType, entryId, id2);
29276
29290
  return {
29277
29291
  ...common,
@@ -29288,7 +29302,9 @@ function lowerFieldMember(context, ownerClass, declaration, id2, commonInput, ba
29288
29302
  }
29289
29303
  const keyType = requiredTypeArgument(fieldType, 0);
29290
29304
  const entryType = requiredTypeArgument(fieldType, 1);
29291
- const entryId = base?.kind === "dictionary" ? base.entryMemberId : pendingDerivedId("member-entry", id2);
29305
+ const entryId = derivedEntryMemberId(
29306
+ declaringCollectionMemberId(context, id2, common.overrideOf)
29307
+ );
29292
29308
  lowerCollectionEntry(context, ownerClass, entryType, entryId, id2);
29293
29309
  return {
29294
29310
  ...common,
@@ -29413,7 +29429,39 @@ function assertListAnnotationPlacement(ownerClass, declaration, loweredKind) {
29413
29429
  );
29414
29430
  }
29415
29431
  }
29432
+ function declaringCollectionMemberId(context, memberId, overrideOf) {
29433
+ const visited = /* @__PURE__ */ new Set([memberId]);
29434
+ let declaring = memberId;
29435
+ let parent = overrideOf;
29436
+ while (parent !== null && !visited.has(parent)) {
29437
+ visited.add(parent);
29438
+ declaring = parent;
29439
+ parent = overrideParentMemberId(context, parent);
29440
+ }
29441
+ return declaring;
29442
+ }
29443
+ function overrideParentMemberId(context, memberId) {
29444
+ const lowered = context.loweredMembers.get(memberId);
29445
+ if (lowered !== void 0) return lowered.overrideOf;
29446
+ const persisted = context.baseMembers.get(memberId);
29447
+ if (persisted !== void 0) return persisted.overrideOf;
29448
+ const placement = context.sourceMembersById.get(memberId);
29449
+ if (placement === void 0) return null;
29450
+ const { ownerClass, member } = placement;
29451
+ const overrides = member.modifiers.includes("override") || member.modifiers.includes("sealed");
29452
+ return overrides ? inheritedMemberId(context, ownerClass, member.name) : null;
29453
+ }
29416
29454
  function lowerCollectionEntry(context, ownerClass, entryType, entryId, parentMemberId) {
29455
+ const already = context.entryTypesByEntryId.get(entryId);
29456
+ if (already !== void 0) {
29457
+ if (JSON.stringify(already) !== JSON.stringify(entryType)) {
29458
+ throw new Error(
29459
+ `Collection member ${ownerClass.name}.${parentMemberId} declares entry type ${entryType.name}, but the member it overrides declares ${already.name}. An override cannot change a collection's element type.`
29460
+ );
29461
+ }
29462
+ return;
29463
+ }
29464
+ context.entryTypesByEntryId.set(entryId, entryType);
29417
29465
  if (context.loweredMembers.has(entryId)) return;
29418
29466
  const base = context.baseMembers.get(entryId);
29419
29467
  if (base) {
@@ -29425,7 +29473,7 @@ function lowerCollectionEntry(context, ownerClass, entryType, entryId, parentMem
29425
29473
  }
29426
29474
  const declaration = {
29427
29475
  id: entryId,
29428
- state: entryId.startsWith("__pending__:") ? "pending" : "stable",
29476
+ state: "stable",
29429
29477
  source: {
29430
29478
  uri: ownerClass.source.uri,
29431
29479
  range: ownerClass.source.range
@@ -30112,6 +30160,9 @@ function referenceId(raw) {
30112
30160
  return null;
30113
30161
  }
30114
30162
  }
30163
+ function isImpliedSchemaKeyOrder(order) {
30164
+ return order.every((key, index) => index === 0 || order[index - 1] <= key);
30165
+ }
30115
30166
  function memberModifier2(modifiers, baseModifier) {
30116
30167
  if (modifiers.includes("override")) {
30117
30168
  if (modifiers.includes("abstract")) return "abstractOverride";
@@ -30251,6 +30302,7 @@ var init_lower_members = __esm({
30251
30302
  init_src();
30252
30303
  init_lower_support();
30253
30304
  init_ui_action_source();
30305
+ init_entry_member_id();
30254
30306
  UNSET_LIST_COLUMN_WIDTH = -1;
30255
30307
  primitiveMemberKinds = /* @__PURE__ */ new Set([
30256
30308
  "null",
@@ -30645,6 +30697,7 @@ function lowerProjectSchemaV4(base, analysis, options = {}) {
30645
30697
  genericParametersByClass,
30646
30698
  enumOptionsByName,
30647
30699
  loweredMembers: /* @__PURE__ */ new Map(),
30700
+ entryTypesByEntryId: /* @__PURE__ */ new Map(),
30648
30701
  placements: /* @__PURE__ */ new Map(),
30649
30702
  staticValueIdsBySymbol: options.staticValueIdsBySymbol ?? /* @__PURE__ */ new Map(),
30650
30703
  templateIdsByName: new Map(
@@ -35714,47 +35767,7 @@ function worldAnimationChildOverrideBindingMemberId(classId) {
35714
35767
  WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE
35715
35768
  );
35716
35769
  }
35717
- function canonicalWorldSystemListEntryMemberId(args) {
35718
- const baseMemberId = args.extendsMemberId ?? args.id;
35719
- if (baseMemberId === WORLD_GRID_CHILDREN_MEMBER_ID) {
35720
- return WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID;
35721
- }
35722
- if (baseMemberId === WORLD_OBJECT_CHILDREN_MEMBER_ID) {
35723
- return WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID;
35724
- }
35725
- if (baseMemberId === WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID) {
35726
- return WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID;
35727
- }
35728
- if (baseMemberId === WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID) {
35729
- return WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID;
35730
- }
35731
- if (baseMemberId === WORLD_SMART_TILE_RULES_MEMBER_ID) {
35732
- return WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID;
35733
- }
35734
- if (baseMemberId === WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID) {
35735
- return WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID;
35736
- }
35737
- if (baseMemberId === WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID) {
35738
- return WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID;
35739
- }
35740
- if (baseMemberId === WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID) {
35741
- return WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID;
35742
- }
35743
- if (baseMemberId === WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID) {
35744
- return WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID;
35745
- }
35746
- if (baseMemberId === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID) {
35747
- return WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID;
35748
- }
35749
- if (baseMemberId === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID) {
35750
- return WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID;
35751
- }
35752
- if (baseMemberId === WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID) {
35753
- return WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID;
35754
- }
35755
- return args.entryMemberId;
35756
- }
35757
- var WORLD_SORTING_LAYERS_MEMBER_ID, WORLD_SORTING_LAYER_NAME_MEMBER_ID, WORLD_LAYER_NAME_MEMBER_ID, WORLD_LAYER_SORTING_LAYER_MEMBER_ID, WORLD_LAYER_SORTING_ORDER_MEMBER_ID, WORLD_SORTING_ORDER_MIN, WORLD_SORTING_ORDER_MAX, WORLD_GRID_CHILDREN_MEMBER_ID, WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID, WORLD_ASSET_NAME_MEMBER_ID, WORLD_TILE_SPRITE_MEMBER_ID, WORLD_OBJECT_BASE_NAME_MEMBER_ID, WORLD_OBJECT_BASE_POSITION_MEMBER_ID, WORLD_OBJECT_BASE_SIZE_MEMBER_ID, WORLD_SPRITE_OBJECT_NAME_MEMBER_ID, WORLD_SPRITE_OBJECT_SPRITE_MEMBER_ID, WORLD_OBJECT_CHILDREN_MEMBER_ID, WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID, WORLD_OBJECT_COLLIDER_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILE_CELL_MEMBER_ID, WORLD_TILE_INSTANCE_CELL_MEMBER_ID, WORLD_TILE_LAYER_LINK_LAYER_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_LAYER_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID, WORLD_TILE_SMART_TILE_SCHEMA_KEY, WORLD_TILE_SMART_TILE_MEMBER_ID, WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_DEFAULT_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULES_SCHEMA_KEY, WORLD_SMART_TILE_RULES_MEMBER_ID, WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY, WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY, WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY, WORLD_SMART_TILE_RULE_OUTPUT_MEMBER_ID, WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_RULE_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY, WORLD_SMART_TILE_RULE_TRANSFORM_MEMBER_ID, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CELL_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CELL_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CONDITION_MEMBER_ID, WORLD_SMART_TILE_CONDITION_ENUM_ID, WORLD_SMART_TILE_OUTPUT_ENUM_ID, WORLD_SMART_TILE_COLLIDER_ENUM_ID, WORLD_SMART_TILE_TRANSFORM_ENUM_ID, WORLD_SMART_TILE_CONDITION_THIS_OPTION_ID, WORLD_SMART_TILE_OUTPUT_SINGLE_OPTION_ID, WORLD_SMART_TILE_COLLIDER_SPRITE_OPTION_ID, WORLD_SMART_TILE_TRANSFORM_FIXED_OPTION_ID, WORLD_ANIMATION_CLIP_TARGET_PARAM_ID, WORLD_ANIMATION_FRAME_TARGET_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_ENTRY_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAME, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE, WORLD_ANIMATION_CLIP_FPS_MEMBER_ID, WORLD_ANIMATION_CLIP_DURATION_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_INDEX_MEMBER_ID, WORLD_ANIMATION_FRAME_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CLIP_KEY_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_START_FRAME_MEMBER_ID, WORLD_ANIMATION_OBJECT_BASE_BINDING_MEMBER_ID, WORLD_SYSTEM_CLASS_DEFINITIONS, ANIMATION_WORLD_KINDS;
35770
+ var WORLD_SORTING_LAYERS_MEMBER_ID, WORLD_SORTING_LAYER_ENTRY_MEMBER_ID, WORLD_SORTING_LAYER_NAME_MEMBER_ID, WORLD_LAYER_NAME_MEMBER_ID, WORLD_LAYER_SORTING_LAYER_MEMBER_ID, WORLD_LAYER_SORTING_ORDER_MEMBER_ID, WORLD_SORTING_ORDER_MIN, WORLD_SORTING_ORDER_MAX, WORLD_GRID_CHILDREN_MEMBER_ID, WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID, WORLD_ASSET_NAME_MEMBER_ID, WORLD_TILE_SPRITE_MEMBER_ID, WORLD_OBJECT_BASE_NAME_MEMBER_ID, WORLD_OBJECT_BASE_POSITION_MEMBER_ID, WORLD_OBJECT_BASE_SIZE_MEMBER_ID, WORLD_SPRITE_OBJECT_NAME_MEMBER_ID, WORLD_SPRITE_OBJECT_SPRITE_MEMBER_ID, WORLD_OBJECT_CHILDREN_MEMBER_ID, WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID, WORLD_OBJECT_COLLIDER_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILE_CELL_MEMBER_ID, WORLD_TILE_INSTANCE_CELL_MEMBER_ID, WORLD_TILE_LAYER_LINK_LAYER_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_LAYER_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID, WORLD_TILE_SMART_TILE_SCHEMA_KEY, WORLD_TILE_SMART_TILE_MEMBER_ID, WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_DEFAULT_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULES_SCHEMA_KEY, WORLD_SMART_TILE_RULES_MEMBER_ID, WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY, WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY, WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY, WORLD_SMART_TILE_RULE_OUTPUT_MEMBER_ID, WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_RULE_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY, WORLD_SMART_TILE_RULE_TRANSFORM_MEMBER_ID, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CELL_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CELL_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CONDITION_MEMBER_ID, WORLD_SMART_TILE_CONDITION_ENUM_ID, WORLD_SMART_TILE_OUTPUT_ENUM_ID, WORLD_SMART_TILE_COLLIDER_ENUM_ID, WORLD_SMART_TILE_TRANSFORM_ENUM_ID, WORLD_SMART_TILE_CONDITION_THIS_OPTION_ID, WORLD_SMART_TILE_OUTPUT_SINGLE_OPTION_ID, WORLD_SMART_TILE_COLLIDER_SPRITE_OPTION_ID, WORLD_SMART_TILE_TRANSFORM_FIXED_OPTION_ID, WORLD_ANIMATION_CLIP_TARGET_PARAM_ID, WORLD_ANIMATION_FRAME_TARGET_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_ENTRY_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAME, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE, WORLD_ANIMATION_CLIP_FPS_MEMBER_ID, WORLD_ANIMATION_CLIP_DURATION_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_INDEX_MEMBER_ID, WORLD_ANIMATION_FRAME_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CLIP_KEY_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_START_FRAME_MEMBER_ID, WORLD_ANIMATION_OBJECT_BASE_BINDING_MEMBER_ID, WORLD_SYSTEM_CLASS_DEFINITIONS, ANIMATION_WORLD_KINDS;
35758
35771
  var init_world_system_classes = __esm({
35759
35772
  "../src/models/classes/world-system-classes.ts"() {
35760
35773
  "use strict";
@@ -35762,7 +35775,11 @@ var init_world_system_classes = __esm({
35762
35775
  init_member_storage();
35763
35776
  init_core();
35764
35777
  init_dist_node();
35778
+ init_entry_member_id();
35765
35779
  WORLD_SORTING_LAYERS_MEMBER_ID = "7ec79ef8-a216-407f-8886-9f770bc9895b";
35780
+ WORLD_SORTING_LAYER_ENTRY_MEMBER_ID = derivedEntryMemberId(
35781
+ WORLD_SORTING_LAYERS_MEMBER_ID
35782
+ );
35766
35783
  WORLD_SORTING_LAYER_NAME_MEMBER_ID = "e963862e-6228-4594-8220-8ef06098c253";
35767
35784
  WORLD_LAYER_NAME_MEMBER_ID = "788a3dbc-6167-4320-83aa-1e884924f776";
35768
35785
  WORLD_LAYER_SORTING_LAYER_MEMBER_ID = "89dbb12e-1d7c-42ad-b872-63fc7fe8bd5b";
@@ -35770,7 +35787,9 @@ var init_world_system_classes = __esm({
35770
35787
  WORLD_SORTING_ORDER_MIN = -32768;
35771
35788
  WORLD_SORTING_ORDER_MAX = 32767;
35772
35789
  WORLD_GRID_CHILDREN_MEMBER_ID = "98578ba3-a70e-4397-9283-996a898d44c8";
35773
- WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID = "f1d89b43-7de6-4d50-9614-342bcdf85531";
35790
+ WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID = derivedEntryMemberId(
35791
+ WORLD_GRID_CHILDREN_MEMBER_ID
35792
+ );
35774
35793
  WORLD_ASSET_NAME_MEMBER_ID = "3b02422f-1ef2-4a50-8386-155d5001082b";
35775
35794
  WORLD_TILE_SPRITE_MEMBER_ID = "cbd6db9a-f473-44b5-b913-7cdc06452f35";
35776
35795
  WORLD_OBJECT_BASE_NAME_MEMBER_ID = "b21bfd01-1234-4f49-ab6b-889f829cb148";
@@ -35779,31 +35798,37 @@ var init_world_system_classes = __esm({
35779
35798
  WORLD_SPRITE_OBJECT_NAME_MEMBER_ID = "441cb790-a45f-4488-a5a9-6f375af6c369";
35780
35799
  WORLD_SPRITE_OBJECT_SPRITE_MEMBER_ID = "e9288ba9-f5a2-4485-8443-6afb155b31e0";
35781
35800
  WORLD_OBJECT_CHILDREN_MEMBER_ID = "bb5d2cf1-a0dd-4eba-a62e-0e1bf0177071";
35782
- WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID = "b3280478-f039-47a2-aa18-918175818bcb";
35801
+ WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID = derivedEntryMemberId(
35802
+ WORLD_OBJECT_CHILDREN_MEMBER_ID
35803
+ );
35783
35804
  WORLD_OBJECT_COLLIDER_MEMBER_ID = "a0083c92-72f7-405f-8863-ff86f995d36d";
35784
35805
  WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID = "5a9ca1f5-a21b-4d4e-8c55-00341af594b4";
35785
- WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID = "c2bf0c92-1d24-4950-bea3-37d5f195728d";
35806
+ WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID);
35786
35807
  WORLD_OBJECT_PLACEMENT_TILE_CELL_MEMBER_ID = "b0b3c45c-a87d-4218-b056-7418ef46aac5";
35787
35808
  WORLD_TILE_INSTANCE_CELL_MEMBER_ID = "f4be2707-74f5-4833-9784-e81bb2474330";
35788
35809
  WORLD_TILE_LAYER_LINK_LAYER_MEMBER_ID = "325dba0e-5967-4e18-937e-5c6800b68abc";
35789
35810
  WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID = "98655d2b-ad0b-45e2-a901-62600b4d3a22";
35790
- WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID = "04383910-20a1-4c7f-ad90-f87e165083ba";
35811
+ WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID = derivedEntryMemberId(
35812
+ WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID
35813
+ );
35791
35814
  WORLD_OBJECT_LAYER_LINK_LAYER_MEMBER_ID = "9cc0ab67-e138-4d11-8011-fab7d7a75b13";
35792
35815
  WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID = "f8e217b1-da89-4819-9c8d-e9c9da2bdfb2";
35793
- WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID = "934a2525-f95d-4c09-9504-b71da30b9186";
35816
+ WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID);
35794
35817
  WORLD_TILE_SMART_TILE_SCHEMA_KEY = "SmartTile";
35795
35818
  WORLD_TILE_SMART_TILE_MEMBER_ID = "96cda8f5-3100-45b5-adcb-0552d21504dd";
35796
35819
  WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY = "DefaultCollider";
35797
35820
  WORLD_SMART_TILE_DEFAULT_COLLIDER_MEMBER_ID = "0a51bdef-4b3e-49d6-913b-11cbea98bced";
35798
35821
  WORLD_SMART_TILE_RULES_SCHEMA_KEY = "Rules";
35799
35822
  WORLD_SMART_TILE_RULES_MEMBER_ID = "97cb9d95-2d54-4809-ae88-0b0ba7859248";
35800
- WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID = "fa146cb3-b0d5-4a87-a781-918b78307b20";
35823
+ WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID = derivedEntryMemberId(
35824
+ WORLD_SMART_TILE_RULES_MEMBER_ID
35825
+ );
35801
35826
  WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY = "Neighbors";
35802
35827
  WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID = "8bfadaa8-14e9-4488-a103-ee688c1cc9c4";
35803
- WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID = "11873fad-7426-46cf-97d6-47b45bd1c091";
35828
+ WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID);
35804
35829
  WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY = "Sprites";
35805
35830
  WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID = "fd3a7f0f-cff8-4069-9b19-004015a6aca1";
35806
- WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID = "2cd93779-d755-4368-b064-2361463526ea";
35831
+ WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID);
35807
35832
  WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY = "Output";
35808
35833
  WORLD_SMART_TILE_RULE_OUTPUT_MEMBER_ID = "9b22d8df-ea41-4c76-9d2e-a6c64c95a64a";
35809
35834
  WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY = "Collider";
@@ -35834,15 +35859,19 @@ var init_world_system_classes = __esm({
35834
35859
  WORLD_ANIMATION_CLIP_FPS_MEMBER_ID = "af2d8db8-817b-46f0-adbe-cf9113b77155";
35835
35860
  WORLD_ANIMATION_CLIP_DURATION_MEMBER_ID = "e1a1ba86-2599-43dc-a19a-46d08a2e4256";
35836
35861
  WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID = "485b0f05-ec7b-4e61-ba80-9a5d7d262b39";
35837
- WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID = "9a08b7e8-9d75-4945-8648-b2ce916cea1a";
35862
+ WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID = derivedEntryMemberId(
35863
+ WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID
35864
+ );
35838
35865
  WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID = "eb602654-04a9-4766-860f-300b443be86e";
35839
- WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID = "cb7b2bbc-3c66-458f-9ed5-362715c09ece";
35866
+ WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID = derivedEntryMemberId(
35867
+ WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID
35868
+ );
35840
35869
  WORLD_ANIMATION_FRAME_INDEX_MEMBER_ID = "0dbdd0f9-9dd2-4b4b-9403-50180c1500dd";
35841
35870
  WORLD_ANIMATION_FRAME_OVERRIDES_MEMBER_ID = "8ab7bb00-a475-43f0-8579-1b08f133d658";
35842
35871
  WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID = "a5905750-c472-46a8-89e9-f04f0bf66696";
35843
- WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID = "bf62d243-5184-4b09-98e0-8682827cb66d";
35872
+ WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID);
35844
35873
  WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID = "23e05410-6428-4bd1-b085-c0390ed7fcb7";
35845
- WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID = "4c195860-4fb3-4e09-b33c-fb5a37601c25";
35874
+ WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID);
35846
35875
  WORLD_ANIMATION_CHILD_OVERRIDE_CHILD_MEMBER_ID = "6e15db41-a6f2-43fd-9793-c52fe4f3d0f8";
35847
35876
  WORLD_ANIMATION_CHILD_OVERRIDE_OVERRIDES_MEMBER_ID = "819b3743-0c3d-4896-b679-9aeeb73255f4";
35848
35877
  WORLD_ANIMATION_CHILD_TRACK_CHILD_MEMBER_ID = "29abc85e-2d38-4cef-a200-88915d176d06";
@@ -37144,12 +37173,7 @@ function isAnimationChildOverrideEntrySlot(slotMember, members) {
37144
37173
  const id2 = getOptionalString(current, "id");
37145
37174
  if (id2 === void 0 || visited.has(id2)) return false;
37146
37175
  visited.add(id2);
37147
- const canonicalId = canonicalWorldSystemListEntryMemberId({
37148
- entryMemberId: id2,
37149
- extendsMemberId: current.extendsMemberId,
37150
- id: id2
37151
- });
37152
- if (canonicalId === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID) {
37176
+ if (id2 === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID || id2 === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID) {
37153
37177
  return true;
37154
37178
  }
37155
37179
  current = typeof current.extendsMemberId === "string" ? membersById.get(current.extendsMemberId) : void 0;
@@ -48893,28 +48917,28 @@ function validateProspectiveAnimationRecordsV4(records2) {
48893
48917
  if (record3.recordKind === "project") {
48894
48918
  if (!isProject(record3.data)) {
48895
48919
  throw new Error(
48896
- "Prospective animation validation received an invalid project record."
48920
+ `Prospective animation validation received an invalid project record ${recordLabel(record3.data)}.`
48897
48921
  );
48898
48922
  }
48899
48923
  project = record3.data;
48900
48924
  } else if (record3.recordKind === "class") {
48901
48925
  if (!isNeoSchemaClass(record3.data)) {
48902
48926
  throw new Error(
48903
- "Prospective animation validation received an invalid class record."
48927
+ `Prospective animation validation received an invalid class record ${recordLabel(record3.data)}.`
48904
48928
  );
48905
48929
  }
48906
48930
  classes.push(record3.data);
48907
48931
  } else if (record3.recordKind === "member") {
48908
48932
  if (!isMember(record3.data)) {
48909
48933
  throw new Error(
48910
- "Prospective animation validation received an invalid member record."
48934
+ `Prospective animation validation received an invalid member record ${recordLabel(record3.data)}.`
48911
48935
  );
48912
48936
  }
48913
48937
  members.push(record3.data);
48914
48938
  } else if (record3.recordKind === "value") {
48915
48939
  if (!isMemberValue(record3.data)) {
48916
48940
  throw new Error(
48917
- "Prospective animation validation received an invalid value record."
48941
+ `Prospective animation validation received an invalid value record ${recordLabel(record3.data)}.`
48918
48942
  );
48919
48943
  }
48920
48944
  values.push(record3.data);
@@ -48923,6 +48947,18 @@ function validateProspectiveAnimationRecordsV4(records2) {
48923
48947
  if (project === void 0) return;
48924
48948
  assertAnimationClipDocumentValid({ project, classes, members, values });
48925
48949
  }
48950
+ function serverEnvelope(stored) {
48951
+ if (!isObjectRecord2(stored)) return {};
48952
+ const envelope = {};
48953
+ for (const field of ["projectId", "createdAt", "updatedAt"]) {
48954
+ if (stored[field] !== void 0) envelope[field] = stored[field];
48955
+ }
48956
+ return envelope;
48957
+ }
48958
+ function recordLabel(data) {
48959
+ const id2 = typeof data.id === "string" ? data.id : "<no id>";
48960
+ return typeof data.name === "string" ? `${id2} ("${data.name}")` : id2;
48961
+ }
48926
48962
  function prospectiveAnimationRecords(base, reconstructed3, changes, seeds) {
48927
48963
  const prospective = /* @__PURE__ */ new Map();
48928
48964
  for (const [key, state] of Object.entries(base)) {
@@ -48935,16 +48971,25 @@ function prospectiveAnimationRecords(base, reconstructed3, changes, seeds) {
48935
48971
  const key = recordStateKey(change.recordKind, change.recordId);
48936
48972
  if (change.kind === "delete") prospective.delete(key);
48937
48973
  }
48938
- for (const [key, record3] of reconstructed3) {
48939
- prospective.set(key, {
48940
- recordKind: record3.recordKind,
48941
- data: record3.fullData
48942
- });
48943
- }
48944
- const projectId = [...prospective.values()].find(
48974
+ const projectRecord = [...prospective.values()].find(
48945
48975
  (record3) => record3.recordKind === "project"
48946
- )?.data.id;
48976
+ ) ?? [...reconstructed3.values()].filter((record3) => record3.recordKind === "project").map((record3) => ({
48977
+ recordKind: record3.recordKind,
48978
+ data: record3.fullData
48979
+ }))[0];
48980
+ const projectId = projectRecord?.data.id;
48947
48981
  const seedEnvelope = typeof projectId === "string" ? { projectId, createdAt: 0, updatedAt: 0 } : {};
48982
+ for (const [key, record3] of reconstructed3) {
48983
+ const envelope = {
48984
+ ...seedEnvelope,
48985
+ ...serverEnvelope(prospective.get(key)?.data)
48986
+ };
48987
+ const data = { ...record3.fullData };
48988
+ for (const [field, value] of Object.entries(envelope)) {
48989
+ if (data[field] === void 0) data[field] = value;
48990
+ }
48991
+ prospective.set(key, { recordKind: record3.recordKind, data });
48992
+ }
48948
48993
  for (const [memberId, seed] of seeds) {
48949
48994
  for (const bindingMember of seed.bindingMembers ?? []) {
48950
48995
  prospective.set(recordStateKey("member", bindingMember.id), {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "Neo Compose native project-source CLI with bidirectional sync.",
5
5
  "license": "MIT",
6
6
  "type": "module",