@neocompose/cli 0.9.4 → 0.10.1

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.
package/CHANGELOG.md CHANGED
@@ -1,12 +1,35 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased]
3
+ ## [0.10.1] - 2026-07-25
4
4
 
5
5
  ### Changed
6
6
 
7
+ - Derive a collection's hidden entry member id from the member that declares
8
+ it, instead of carrying it forward from the manifest cache. A workspace that
9
+ pushes without `neo/obj/` no longer re-mints every list and dictionary entry
10
+ member, and any workspace declaring the same collection reproduces the same
11
+ id. Every override in a collection family resolves to its declaring member's
12
+ one entry, which is what the hardcoded world entry-id table used to
13
+ approximate; an override that tries to change a collection's element type is
14
+ now an error rather than a silent collapse onto whichever member lowered
15
+ first.
7
16
  - Document the final relation-only world layer-link contract and keep the
8
17
  format-4 Hello World corpus free of the retired value-side binding field.
9
18
 
19
+ ## [0.10.0] - 2026-07-25
20
+
21
+ ### Added
22
+
23
+ - Declare List indexes and column settings in source with `@index(member: ...)`
24
+ and `@column(member: ...)`. Both were already in the schema contract and
25
+ offered by the language server, but lowering carried them from the manifest
26
+ cache and the emitter never wrote them back, so a workspace that pushed
27
+ without `neo/obj/` silently lost them.
28
+ - Declare a class hidden from the member selector and classes tree with
29
+ `@hidden`, the class-level counterpart to `@locked`. It maps to
30
+ `NeoSchemaClassAttribute.Hidden`, which the contract already carried; absent
31
+ means visible.
32
+
10
33
  ## [0.9.4] - 2026-07-25
11
34
 
12
35
  ### Fixed
package/README.md CHANGED
@@ -141,8 +141,23 @@ abstract class InventoryItem<
141
141
  The source identifier is the persisted name. `@settings` and `@storage` are
142
142
  typed by their declaration context; invalid fields and enum cases are
143
143
  diagnostics. Swift-like `.EnumCase` syntax works whenever the expected enum
144
- type is known. Focused annotations such as `@id`, `@locked`, `@system`, and
145
- `@relations` carry cross-cutting behavior.
144
+ type is known. Focused annotations such as `@id`, `@locked`, `@hidden`,
145
+ `@system`, and `@relations` carry cross-cutting behavior. `@hidden` marks a
146
+ class the member selector and classes tree leave out; absent means visible.
147
+
148
+ Lists take repeatable `@index` and `@column` annotations naming a field on the
149
+ entry class. An index requires a non-localizable `string` or a single-select
150
+ enum; a column may also target the reserved `__other__` key, which carries the
151
+ default layout for every field a subclass adds.
152
+
153
+ ```neo
154
+ @id("outpost-list-id")
155
+ @settings(kind: .Unordered)
156
+ @index(member: Slug, unique: true)
157
+ @column(member: Slug, width: 158, frozen: true)
158
+ @column(member: Notes, hidden: true)
159
+ public List<Outpost> Outposts = [];
160
+ ```
146
161
 
147
162
  Stable IDs preserve identity across rename, reorder, and file moves. Omit an
148
163
  `@id` only to create something. A successful real push assigns the ID and
package/dist/neo.mjs CHANGED
@@ -14285,6 +14285,9 @@ function validateMember(uri, member, documentKind, ownerScope, environment, diag
14285
14285
  diagnostics
14286
14286
  );
14287
14287
  validateTypeAnnotations(uri, member.type, environment, diagnostics);
14288
+ if (documentKind !== "flow") {
14289
+ validateListAnnotations(uri, member, environment, diagnostics);
14290
+ }
14288
14291
  const scope = new Map(ownerScope);
14289
14292
  if (member.kind === "function") {
14290
14293
  for (const parameter3 of member.parameters) {
@@ -14435,6 +14438,9 @@ function validateAnnotations(uri, annotations, context, environment, diagnostics
14435
14438
  continue;
14436
14439
  }
14437
14440
  seen.add(field.name);
14441
+ if (field.name === "member" && (annotation2.name === "index" || annotation2.name === "column")) {
14442
+ continue;
14443
+ }
14438
14444
  validateExpressionText(
14439
14445
  uri,
14440
14446
  argument2.text,
@@ -14458,6 +14464,7 @@ function fieldsForAnnotation(name, context, environment) {
14458
14464
  if (name === "locked") {
14459
14465
  return context.kind === "member" || context.kind === "flowBinding" ? [] : null;
14460
14466
  }
14467
+ if (name === "hidden") return context.kind === "class" ? [] : null;
14461
14468
  if (name === "settings") return settingsFields(context);
14462
14469
  if (name === "storage") return storageFields(context);
14463
14470
  if (name === "relations") return relationFields(context, environment);
@@ -15489,6 +15496,121 @@ function contextualAnnotationEnum(annotations, name, field) {
15489
15496
  const value = annotations.find((annotation2) => annotation2.name === name)?.arguments.find((argument2) => argument2.name === field)?.text.trim();
15490
15497
  return value?.startsWith(".") ? value.slice(1) : null;
15491
15498
  }
15499
+ function validateListAnnotations(uri, member, environment, diagnostics) {
15500
+ const declared = member.annotations.filter(
15501
+ (annotation2) => annotation2.name === "index" || annotation2.name === "column"
15502
+ );
15503
+ if (declared.length === 0) return;
15504
+ const entryClass = listEntryClass(member.type, environment);
15505
+ const seen = /* @__PURE__ */ new Set();
15506
+ for (const annotation2 of declared) {
15507
+ const target = memberKeyArgument(annotation2);
15508
+ if (target === null) {
15509
+ pushDiagnostic(
15510
+ diagnostics,
15511
+ uri,
15512
+ annotation2.range,
15513
+ "missing-list-annotation-member",
15514
+ `@${annotation2.name} on '${member.name}' requires a member naming a field on the list entry, such as @${annotation2.name}(member: Name).`
15515
+ );
15516
+ continue;
15517
+ }
15518
+ if (target.key === null) {
15519
+ pushDiagnostic(
15520
+ diagnostics,
15521
+ uri,
15522
+ target.range,
15523
+ "invalid-list-annotation-member",
15524
+ `@${annotation2.name} on '${member.name}' must name a list entry field directly, such as @${annotation2.name}(member: Name).`
15525
+ );
15526
+ continue;
15527
+ }
15528
+ if (seen.has(`${annotation2.name} ${target.key}`)) {
15529
+ pushDiagnostic(
15530
+ diagnostics,
15531
+ uri,
15532
+ target.range,
15533
+ "duplicate-list-annotation",
15534
+ `@${annotation2.name}(member: ${target.key}) is declared more than once on '${member.name}'.`
15535
+ );
15536
+ continue;
15537
+ }
15538
+ seen.add(`${annotation2.name} ${target.key}`);
15539
+ if (annotation2.name === "column" && target.key === LIST_COLUMN_INHERITANCE_KEY) {
15540
+ continue;
15541
+ }
15542
+ if (entryClass === null) continue;
15543
+ const field = resolveEntryField(entryClass, target.key, environment);
15544
+ if (field === null) {
15545
+ pushDiagnostic(
15546
+ diagnostics,
15547
+ uri,
15548
+ target.range,
15549
+ "unresolved-list-annotation-member",
15550
+ `@${annotation2.name}(member: ${target.key}) on '${member.name}' does not resolve on list entry class '${entryClass.name}'.`
15551
+ );
15552
+ continue;
15553
+ }
15554
+ if (annotation2.name !== "index") continue;
15555
+ const domainError = indexKeyDomainError(field, environment);
15556
+ if (domainError !== null) {
15557
+ pushDiagnostic(
15558
+ diagnostics,
15559
+ uri,
15560
+ target.range,
15561
+ "invalid-list-index-member",
15562
+ `@index(member: ${target.key}) on '${member.name}' is invalid: ${domainError}.`
15563
+ );
15564
+ }
15565
+ }
15566
+ }
15567
+ function memberKeyArgument(annotation2) {
15568
+ const positional = annotation2.arguments[0];
15569
+ const argument2 = annotation2.arguments.find((entry) => entry.name === "member") ?? (positional !== void 0 && positional.name === void 0 ? positional : void 0);
15570
+ if (argument2 === void 0) return null;
15571
+ const text = argument2.text.trim();
15572
+ return {
15573
+ key: IDENTIFIER_PATTERN2.test(text) ? text : null,
15574
+ range: argument2.range
15575
+ };
15576
+ }
15577
+ function listEntryClass(type, environment) {
15578
+ if (type.name !== "List" && type.name !== "Set") return null;
15579
+ const entry = type.typeArguments[0];
15580
+ if (entry === void 0) return null;
15581
+ return environment.types.get(entry.name) ?? null;
15582
+ }
15583
+ function resolveEntryField(entryClass, key, environment) {
15584
+ const visited = /* @__PURE__ */ new Set();
15585
+ let current = entryClass;
15586
+ while (current !== void 0 && !visited.has(current.name)) {
15587
+ visited.add(current.name);
15588
+ const match = current.members.find((entry) => entry.name === key);
15589
+ if (match !== void 0) return match;
15590
+ current = current.baseTypes.map((base) => environment.types.get(base.name)).find((base) => base !== void 0);
15591
+ }
15592
+ return null;
15593
+ }
15594
+ function indexKeyDomainError(field, environment) {
15595
+ if (field.kind !== "field") {
15596
+ return `'${field.name}' is a ${field.kind}, and index keys require a stored field`;
15597
+ }
15598
+ if (field.type.name === "string") {
15599
+ return annotationBoolean(field.annotations, "settings", "localizable") === false ? null : `'${field.name}' is localizable, and String index keys must be non-localizable`;
15600
+ }
15601
+ if (environment.enums.has(field.type.name)) return null;
15602
+ const entry = field.type.typeArguments[0];
15603
+ if (field.type.name === "List" && entry !== void 0 && environment.enums.has(entry.name) && annotationBoolean(field.annotations, "settings", "multiselect") === true) {
15604
+ return `'${field.name}' is a multiselect Enum, and index keys require a single-select Enum`;
15605
+ }
15606
+ return `'${field.name}' is a ${field.type.name} field, and index keys require a non-localizable String or a single-select Enum`;
15607
+ }
15608
+ function annotationBoolean(annotations, name, field) {
15609
+ const value = annotations.find((annotation2) => annotation2.name === name)?.arguments.find((argument2) => argument2.name === field)?.text.trim();
15610
+ if (value === "true") return true;
15611
+ if (value === "false") return false;
15612
+ return null;
15613
+ }
15492
15614
  function isListContext(context) {
15493
15615
  return (context.kind === "member" || context.kind === "type") && (context.type.name === "List" || context.type.name === "Set");
15494
15616
  }
@@ -15533,7 +15655,7 @@ function pushDiagnostic(diagnostics, uri, range2, code, message) {
15533
15655
  message
15534
15656
  });
15535
15657
  }
15536
- var primitiveType;
15658
+ var primitiveType, IDENTIFIER_PATTERN2, LIST_COLUMN_INHERITANCE_KEY;
15537
15659
  var init_project_source_semantics = __esm({
15538
15660
  "../packages/neoscript-language/src/project-source-semantics.ts"() {
15539
15661
  "use strict";
@@ -15542,6 +15664,8 @@ var init_project_source_semantics = __esm({
15542
15664
  init_strict_parser();
15543
15665
  init_project_root();
15544
15666
  primitiveType = (name) => ({ name });
15667
+ IDENTIFIER_PATTERN2 = /^[A-Za-z_][A-Za-z0-9_]*$/;
15668
+ LIST_COLUMN_INHERITANCE_KEY = "__other__";
15545
15669
  }
15546
15670
  });
15547
15671
 
@@ -21308,6 +21432,16 @@ function annotationSignatureParameters(name) {
21308
21432
  return ["relation descriptors"];
21309
21433
  case "incomplete":
21310
21434
  return ["string reason"];
21435
+ case "index":
21436
+ return ["entry member", "bool unique"];
21437
+ case "column":
21438
+ return [
21439
+ "entry member",
21440
+ "int width",
21441
+ "bool hidden",
21442
+ "bool frozen",
21443
+ "bool wrapContent"
21444
+ ];
21311
21445
  default:
21312
21446
  return null;
21313
21447
  }
@@ -28710,6 +28844,19 @@ var init_ui_action_source = __esm({
28710
28844
  }
28711
28845
  });
28712
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
+
28713
28860
  // src/project-source/lower-members.ts
28714
28861
  function lowerClass(context, declaration) {
28715
28862
  const id2 = materializedId(declaration, "class", declaration.name);
@@ -28783,7 +28930,7 @@ function lowerClass(context, declaration) {
28783
28930
  schemaKeyOrder: persistedSchemaOrder,
28784
28931
  extendsClassId,
28785
28932
  implementsInterfaceIds,
28786
- hiddenInMemberSelector: base?.hiddenInMemberSelector ?? false,
28933
+ hiddenInMemberSelector: hasAnnotation(declaration.annotations, "hidden"),
28787
28934
  system: systemMetadata(declaration.annotations),
28788
28935
  allowedStorage: storage ? storageValue(storage, "allowed") : null,
28789
28936
  // Class storage keys never exist in source. Retain only the historical
@@ -28800,6 +28947,11 @@ function lowerClass(context, declaration) {
28800
28947
  };
28801
28948
  }
28802
28949
  function lowerMember(context, ownerClass, declaration, id2, owner) {
28950
+ const member = lowerMemberKind(context, ownerClass, declaration, id2, owner);
28951
+ assertListAnnotationPlacement(ownerClass, declaration, member.kind);
28952
+ return member;
28953
+ }
28954
+ function lowerMemberKind(context, ownerClass, declaration, id2, owner) {
28803
28955
  const base = context.baseMembers.get(id2);
28804
28956
  const common = memberCommon(
28805
28957
  context,
@@ -29132,15 +29284,17 @@ function lowerFieldMember(context, ownerClass, declaration, id2, commonInput, ba
29132
29284
  multiselect: true
29133
29285
  };
29134
29286
  }
29135
- const entryId = base?.kind === "list" ? base.entryMemberId : pendingDerivedId("member-entry", id2);
29287
+ const entryId = derivedEntryMemberId(
29288
+ declaringCollectionMemberId(context, id2, common.overrideOf)
29289
+ );
29136
29290
  lowerCollectionEntry(context, ownerClass, entryType, entryId, id2);
29137
29291
  return {
29138
29292
  ...common,
29139
29293
  kind: "list",
29140
29294
  entryMemberId: entryId,
29141
29295
  listKind: contextualEnumArgument(settings, "kind") === "Unordered" ? "unordered" : "ordered",
29142
- indexes: base?.kind === "list" ? base.indexes : [],
29143
- columns: base?.kind === "list" ? base.columns : []
29296
+ indexes: lowerListIndexes(ownerClass, declaration),
29297
+ columns: lowerListColumns(ownerClass, declaration)
29144
29298
  };
29145
29299
  }
29146
29300
  if (name === "Dictionary") {
@@ -29149,7 +29303,9 @@ function lowerFieldMember(context, ownerClass, declaration, id2, commonInput, ba
29149
29303
  }
29150
29304
  const keyType = requiredTypeArgument(fieldType, 0);
29151
29305
  const entryType = requiredTypeArgument(fieldType, 1);
29152
- const entryId = base?.kind === "dictionary" ? base.entryMemberId : pendingDerivedId("member-entry", id2);
29306
+ const entryId = derivedEntryMemberId(
29307
+ declaringCollectionMemberId(context, id2, common.overrideOf)
29308
+ );
29153
29309
  lowerCollectionEntry(context, ownerClass, entryType, entryId, id2);
29154
29310
  return {
29155
29311
  ...common,
@@ -29210,7 +29366,103 @@ function lowerFieldMember(context, ownerClass, declaration, id2, commonInput, ba
29210
29366
  `Unsupported field type ${JSON.stringify(name)} on ${ownerClass.name}.${declaration.name}.`
29211
29367
  );
29212
29368
  }
29369
+ function lowerListIndexes(ownerClass, declaration) {
29370
+ const declared = /* @__PURE__ */ new Set();
29371
+ return declaration.annotations.filter((entry) => entry.name === "index").map((entry) => {
29372
+ const schemaKey = memberKeyArgument2(entry, ownerClass, declaration);
29373
+ if (declared.has(schemaKey)) {
29374
+ throw new Error(
29375
+ `@index(member: ${schemaKey}) is declared more than once on ${ownerClass.name}.${declaration.name}.`
29376
+ );
29377
+ }
29378
+ declared.add(schemaKey);
29379
+ return { schemaKey, unique: booleanArgument(entry, "unique") ?? false };
29380
+ });
29381
+ }
29382
+ function lowerListColumns(ownerClass, declaration) {
29383
+ const declared = /* @__PURE__ */ new Set();
29384
+ return declaration.annotations.filter((entry) => entry.name === "column").map((entry) => {
29385
+ const memberKey = memberKeyArgument2(entry, ownerClass, declaration);
29386
+ if (declared.has(memberKey)) {
29387
+ throw new Error(
29388
+ `@column(member: ${memberKey}) is declared more than once on ${ownerClass.name}.${declaration.name}.`
29389
+ );
29390
+ }
29391
+ declared.add(memberKey);
29392
+ const width = numberArgument(entry, "width");
29393
+ return {
29394
+ memberKey,
29395
+ // `-1` is the generated C# marker's "unset" sentinel for an int
29396
+ // property that has no nullable form; the record spells that as null.
29397
+ width: width === null || width === UNSET_LIST_COLUMN_WIDTH ? null : width,
29398
+ hidden: booleanArgument(entry, "hidden") ?? false,
29399
+ frozen: booleanArgument(entry, "frozen") ?? false,
29400
+ wrapContent: booleanArgument(entry, "wrapContent") ?? false
29401
+ };
29402
+ });
29403
+ }
29404
+ function memberKeyArgument2(value, ownerClass, declaration) {
29405
+ const positional = value.arguments[0];
29406
+ const raw = argument(value, "member") ?? (positional !== void 0 && positional.name === void 0 ? positional.expression : null);
29407
+ if (raw === null) {
29408
+ throw new Error(
29409
+ `@${value.name} on ${ownerClass.name}.${declaration.name} requires a member naming a field on the list entry, such as @${value.name}(member: Name).`
29410
+ );
29411
+ }
29412
+ const expression = parseAnnotationExpression(raw);
29413
+ if (expression.kind !== "ident") {
29414
+ throw new Error(
29415
+ `@${value.name}(member: ${raw.trim()}) on ${ownerClass.name}.${declaration.name} must name a list entry field directly, such as @${value.name}(member: Name).`
29416
+ );
29417
+ }
29418
+ return expression.name;
29419
+ }
29420
+ function assertListAnnotationPlacement(ownerClass, declaration, loweredKind) {
29421
+ if (loweredKind === "list") return;
29422
+ if (hasAnnotation(declaration.annotations, "index")) {
29423
+ throw new Error(
29424
+ `@index on ${ownerClass.name}.${declaration.name} is only valid on a List member; this declaration lowers to a ${loweredKind} member.`
29425
+ );
29426
+ }
29427
+ if (hasAnnotation(declaration.annotations, "column")) {
29428
+ throw new Error(
29429
+ `@column on ${ownerClass.name}.${declaration.name} is only valid on a List member; this declaration lowers to a ${loweredKind} member.`
29430
+ );
29431
+ }
29432
+ }
29433
+ function declaringCollectionMemberId(context, memberId, overrideOf) {
29434
+ const visited = /* @__PURE__ */ new Set([memberId]);
29435
+ let declaring = memberId;
29436
+ let parent = overrideOf;
29437
+ while (parent !== null && !visited.has(parent)) {
29438
+ visited.add(parent);
29439
+ declaring = parent;
29440
+ parent = overrideParentMemberId(context, parent);
29441
+ }
29442
+ return declaring;
29443
+ }
29444
+ function overrideParentMemberId(context, memberId) {
29445
+ const lowered = context.loweredMembers.get(memberId);
29446
+ if (lowered !== void 0) return lowered.overrideOf;
29447
+ const persisted = context.baseMembers.get(memberId);
29448
+ if (persisted !== void 0) return persisted.overrideOf;
29449
+ const placement = context.sourceMembersById.get(memberId);
29450
+ if (placement === void 0) return null;
29451
+ const { ownerClass, member } = placement;
29452
+ const overrides = member.modifiers.includes("override") || member.modifiers.includes("sealed");
29453
+ return overrides ? inheritedMemberId(context, ownerClass, member.name) : null;
29454
+ }
29213
29455
  function lowerCollectionEntry(context, ownerClass, entryType, entryId, parentMemberId) {
29456
+ const already = context.entryTypesByEntryId.get(entryId);
29457
+ if (already !== void 0) {
29458
+ if (JSON.stringify(already) !== JSON.stringify(entryType)) {
29459
+ throw new Error(
29460
+ `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.`
29461
+ );
29462
+ }
29463
+ return;
29464
+ }
29465
+ context.entryTypesByEntryId.set(entryId, entryType);
29214
29466
  if (context.loweredMembers.has(entryId)) return;
29215
29467
  const base = context.baseMembers.get(entryId);
29216
29468
  if (base) {
@@ -29222,7 +29474,7 @@ function lowerCollectionEntry(context, ownerClass, entryType, entryId, parentMem
29222
29474
  }
29223
29475
  const declaration = {
29224
29476
  id: entryId,
29225
- state: entryId.startsWith("__pending__:") ? "pending" : "stable",
29477
+ state: "stable",
29226
29478
  source: {
29227
29479
  uri: ownerClass.source.uri,
29228
29480
  range: ownerClass.source.range
@@ -30041,13 +30293,15 @@ function* zip(left, right) {
30041
30293
  yield [left[index], right[index]];
30042
30294
  }
30043
30295
  }
30044
- var primitiveMemberKinds;
30296
+ var UNSET_LIST_COLUMN_WIDTH, primitiveMemberKinds;
30045
30297
  var init_lower_members = __esm({
30046
30298
  "src/project-source/lower-members.ts"() {
30047
30299
  "use strict";
30048
30300
  init_src();
30049
30301
  init_lower_support();
30050
30302
  init_ui_action_source();
30303
+ init_entry_member_id();
30304
+ UNSET_LIST_COLUMN_WIDTH = -1;
30051
30305
  primitiveMemberKinds = /* @__PURE__ */ new Set([
30052
30306
  "null",
30053
30307
  "bool",
@@ -30441,6 +30695,7 @@ function lowerProjectSchemaV4(base, analysis, options = {}) {
30441
30695
  genericParametersByClass,
30442
30696
  enumOptionsByName,
30443
30697
  loweredMembers: /* @__PURE__ */ new Map(),
30698
+ entryTypesByEntryId: /* @__PURE__ */ new Map(),
30444
30699
  placements: /* @__PURE__ */ new Map(),
30445
30700
  staticValueIdsBySymbol: options.staticValueIdsBySymbol ?? /* @__PURE__ */ new Map(),
30446
30701
  templateIdsByName: new Map(
@@ -30752,6 +31007,7 @@ ${namedArguments(
30752
31007
  function emitClass(context, schemaClass2, memberIds) {
30753
31008
  const annotations = [
30754
31009
  id(schemaClass2.id).trimEnd(),
31010
+ ...schemaClass2.hiddenInMemberSelector ? ["@hidden"] : [],
30755
31011
  ...schemaClass2.allowedStorage ? [`@storage(allowed: .${enumCase(schemaClass2.allowedStorage)})`] : [],
30756
31012
  ...schemaClass2.system ? [systemAnnotation(schemaClass2.system)] : [],
30757
31013
  ...relationsAnnotations(context, schemaClass2)
@@ -30883,6 +31139,7 @@ function emitMember(context, member) {
30883
31139
  ].join(", ")})`
30884
31140
  ] : [],
30885
31141
  ...memberSettings(context, member),
31142
+ ...listAnnotations(member),
30886
31143
  ...member.system ? [systemAnnotation(member.system)] : []
30887
31144
  ];
30888
31145
  const prefix = memberModifier3(member);
@@ -31024,6 +31281,28 @@ function memberSettings(context, member) {
31024
31281
  }
31025
31282
  return settings.length ? [`@settings(${settings.join(", ")})`] : [];
31026
31283
  }
31284
+ function listAnnotations(member) {
31285
+ if (member.kind !== "list") return [];
31286
+ return [
31287
+ ...member.indexes.map((entry) => {
31288
+ assertIdentifier(entry.schemaKey, "list index member");
31289
+ return `@index(${[
31290
+ `member: ${entry.schemaKey}`,
31291
+ ...entry.unique ? ["unique: true"] : []
31292
+ ].join(", ")})`;
31293
+ }),
31294
+ ...member.columns.map((entry) => {
31295
+ assertIdentifier(entry.memberKey, "list column member");
31296
+ return `@column(${[
31297
+ `member: ${entry.memberKey}`,
31298
+ ...entry.width === null ? [] : [`width: ${entry.width}`],
31299
+ ...entry.hidden ? ["hidden: true"] : [],
31300
+ ...entry.frozen ? ["frozen: true"] : [],
31301
+ ...entry.wrapContent ? ["wrapContent: true"] : []
31302
+ ].join(", ")})`;
31303
+ })
31304
+ ];
31305
+ }
31027
31306
  function renderMemberType(context, member) {
31028
31307
  const nullable = !member.required;
31029
31308
  let value;
@@ -35486,47 +35765,7 @@ function worldAnimationChildOverrideBindingMemberId(classId) {
35486
35765
  WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE
35487
35766
  );
35488
35767
  }
35489
- function canonicalWorldSystemListEntryMemberId(args) {
35490
- const baseMemberId = args.extendsMemberId ?? args.id;
35491
- if (baseMemberId === WORLD_GRID_CHILDREN_MEMBER_ID) {
35492
- return WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID;
35493
- }
35494
- if (baseMemberId === WORLD_OBJECT_CHILDREN_MEMBER_ID) {
35495
- return WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID;
35496
- }
35497
- if (baseMemberId === WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID) {
35498
- return WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID;
35499
- }
35500
- if (baseMemberId === WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID) {
35501
- return WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID;
35502
- }
35503
- if (baseMemberId === WORLD_SMART_TILE_RULES_MEMBER_ID) {
35504
- return WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID;
35505
- }
35506
- if (baseMemberId === WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID) {
35507
- return WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID;
35508
- }
35509
- if (baseMemberId === WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID) {
35510
- return WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID;
35511
- }
35512
- if (baseMemberId === WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID) {
35513
- return WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID;
35514
- }
35515
- if (baseMemberId === WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID) {
35516
- return WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID;
35517
- }
35518
- if (baseMemberId === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID) {
35519
- return WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID;
35520
- }
35521
- if (baseMemberId === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID) {
35522
- return WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID;
35523
- }
35524
- if (baseMemberId === WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID) {
35525
- return WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID;
35526
- }
35527
- return args.entryMemberId;
35528
- }
35529
- 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;
35768
+ 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;
35530
35769
  var init_world_system_classes = __esm({
35531
35770
  "../src/models/classes/world-system-classes.ts"() {
35532
35771
  "use strict";
@@ -35534,7 +35773,11 @@ var init_world_system_classes = __esm({
35534
35773
  init_member_storage();
35535
35774
  init_core();
35536
35775
  init_dist_node();
35776
+ init_entry_member_id();
35537
35777
  WORLD_SORTING_LAYERS_MEMBER_ID = "7ec79ef8-a216-407f-8886-9f770bc9895b";
35778
+ WORLD_SORTING_LAYER_ENTRY_MEMBER_ID = derivedEntryMemberId(
35779
+ WORLD_SORTING_LAYERS_MEMBER_ID
35780
+ );
35538
35781
  WORLD_SORTING_LAYER_NAME_MEMBER_ID = "e963862e-6228-4594-8220-8ef06098c253";
35539
35782
  WORLD_LAYER_NAME_MEMBER_ID = "788a3dbc-6167-4320-83aa-1e884924f776";
35540
35783
  WORLD_LAYER_SORTING_LAYER_MEMBER_ID = "89dbb12e-1d7c-42ad-b872-63fc7fe8bd5b";
@@ -35542,7 +35785,9 @@ var init_world_system_classes = __esm({
35542
35785
  WORLD_SORTING_ORDER_MIN = -32768;
35543
35786
  WORLD_SORTING_ORDER_MAX = 32767;
35544
35787
  WORLD_GRID_CHILDREN_MEMBER_ID = "98578ba3-a70e-4397-9283-996a898d44c8";
35545
- WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID = "f1d89b43-7de6-4d50-9614-342bcdf85531";
35788
+ WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID = derivedEntryMemberId(
35789
+ WORLD_GRID_CHILDREN_MEMBER_ID
35790
+ );
35546
35791
  WORLD_ASSET_NAME_MEMBER_ID = "3b02422f-1ef2-4a50-8386-155d5001082b";
35547
35792
  WORLD_TILE_SPRITE_MEMBER_ID = "cbd6db9a-f473-44b5-b913-7cdc06452f35";
35548
35793
  WORLD_OBJECT_BASE_NAME_MEMBER_ID = "b21bfd01-1234-4f49-ab6b-889f829cb148";
@@ -35551,31 +35796,37 @@ var init_world_system_classes = __esm({
35551
35796
  WORLD_SPRITE_OBJECT_NAME_MEMBER_ID = "441cb790-a45f-4488-a5a9-6f375af6c369";
35552
35797
  WORLD_SPRITE_OBJECT_SPRITE_MEMBER_ID = "e9288ba9-f5a2-4485-8443-6afb155b31e0";
35553
35798
  WORLD_OBJECT_CHILDREN_MEMBER_ID = "bb5d2cf1-a0dd-4eba-a62e-0e1bf0177071";
35554
- WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID = "b3280478-f039-47a2-aa18-918175818bcb";
35799
+ WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID = derivedEntryMemberId(
35800
+ WORLD_OBJECT_CHILDREN_MEMBER_ID
35801
+ );
35555
35802
  WORLD_OBJECT_COLLIDER_MEMBER_ID = "a0083c92-72f7-405f-8863-ff86f995d36d";
35556
35803
  WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID = "5a9ca1f5-a21b-4d4e-8c55-00341af594b4";
35557
- WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID = "c2bf0c92-1d24-4950-bea3-37d5f195728d";
35804
+ WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID);
35558
35805
  WORLD_OBJECT_PLACEMENT_TILE_CELL_MEMBER_ID = "b0b3c45c-a87d-4218-b056-7418ef46aac5";
35559
35806
  WORLD_TILE_INSTANCE_CELL_MEMBER_ID = "f4be2707-74f5-4833-9784-e81bb2474330";
35560
35807
  WORLD_TILE_LAYER_LINK_LAYER_MEMBER_ID = "325dba0e-5967-4e18-937e-5c6800b68abc";
35561
35808
  WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID = "98655d2b-ad0b-45e2-a901-62600b4d3a22";
35562
- WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID = "04383910-20a1-4c7f-ad90-f87e165083ba";
35809
+ WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID = derivedEntryMemberId(
35810
+ WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID
35811
+ );
35563
35812
  WORLD_OBJECT_LAYER_LINK_LAYER_MEMBER_ID = "9cc0ab67-e138-4d11-8011-fab7d7a75b13";
35564
35813
  WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID = "f8e217b1-da89-4819-9c8d-e9c9da2bdfb2";
35565
- WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID = "934a2525-f95d-4c09-9504-b71da30b9186";
35814
+ WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID);
35566
35815
  WORLD_TILE_SMART_TILE_SCHEMA_KEY = "SmartTile";
35567
35816
  WORLD_TILE_SMART_TILE_MEMBER_ID = "96cda8f5-3100-45b5-adcb-0552d21504dd";
35568
35817
  WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY = "DefaultCollider";
35569
35818
  WORLD_SMART_TILE_DEFAULT_COLLIDER_MEMBER_ID = "0a51bdef-4b3e-49d6-913b-11cbea98bced";
35570
35819
  WORLD_SMART_TILE_RULES_SCHEMA_KEY = "Rules";
35571
35820
  WORLD_SMART_TILE_RULES_MEMBER_ID = "97cb9d95-2d54-4809-ae88-0b0ba7859248";
35572
- WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID = "fa146cb3-b0d5-4a87-a781-918b78307b20";
35821
+ WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID = derivedEntryMemberId(
35822
+ WORLD_SMART_TILE_RULES_MEMBER_ID
35823
+ );
35573
35824
  WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY = "Neighbors";
35574
35825
  WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID = "8bfadaa8-14e9-4488-a103-ee688c1cc9c4";
35575
- WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID = "11873fad-7426-46cf-97d6-47b45bd1c091";
35826
+ WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID);
35576
35827
  WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY = "Sprites";
35577
35828
  WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID = "fd3a7f0f-cff8-4069-9b19-004015a6aca1";
35578
- WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID = "2cd93779-d755-4368-b064-2361463526ea";
35829
+ WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID);
35579
35830
  WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY = "Output";
35580
35831
  WORLD_SMART_TILE_RULE_OUTPUT_MEMBER_ID = "9b22d8df-ea41-4c76-9d2e-a6c64c95a64a";
35581
35832
  WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY = "Collider";
@@ -35606,15 +35857,19 @@ var init_world_system_classes = __esm({
35606
35857
  WORLD_ANIMATION_CLIP_FPS_MEMBER_ID = "af2d8db8-817b-46f0-adbe-cf9113b77155";
35607
35858
  WORLD_ANIMATION_CLIP_DURATION_MEMBER_ID = "e1a1ba86-2599-43dc-a19a-46d08a2e4256";
35608
35859
  WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID = "485b0f05-ec7b-4e61-ba80-9a5d7d262b39";
35609
- WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID = "9a08b7e8-9d75-4945-8648-b2ce916cea1a";
35860
+ WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID = derivedEntryMemberId(
35861
+ WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID
35862
+ );
35610
35863
  WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID = "eb602654-04a9-4766-860f-300b443be86e";
35611
- WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID = "cb7b2bbc-3c66-458f-9ed5-362715c09ece";
35864
+ WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID = derivedEntryMemberId(
35865
+ WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID
35866
+ );
35612
35867
  WORLD_ANIMATION_FRAME_INDEX_MEMBER_ID = "0dbdd0f9-9dd2-4b4b-9403-50180c1500dd";
35613
35868
  WORLD_ANIMATION_FRAME_OVERRIDES_MEMBER_ID = "8ab7bb00-a475-43f0-8579-1b08f133d658";
35614
35869
  WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID = "a5905750-c472-46a8-89e9-f04f0bf66696";
35615
- WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID = "bf62d243-5184-4b09-98e0-8682827cb66d";
35870
+ WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID);
35616
35871
  WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID = "23e05410-6428-4bd1-b085-c0390ed7fcb7";
35617
- WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID = "4c195860-4fb3-4e09-b33c-fb5a37601c25";
35872
+ WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID = derivedEntryMemberId(WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID);
35618
35873
  WORLD_ANIMATION_CHILD_OVERRIDE_CHILD_MEMBER_ID = "6e15db41-a6f2-43fd-9793-c52fe4f3d0f8";
35619
35874
  WORLD_ANIMATION_CHILD_OVERRIDE_OVERRIDES_MEMBER_ID = "819b3743-0c3d-4896-b679-9aeeb73255f4";
35620
35875
  WORLD_ANIMATION_CHILD_TRACK_CHILD_MEMBER_ID = "29abc85e-2d38-4cef-a200-88915d176d06";
@@ -36916,12 +37171,7 @@ function isAnimationChildOverrideEntrySlot(slotMember, members) {
36916
37171
  const id2 = getOptionalString(current, "id");
36917
37172
  if (id2 === void 0 || visited.has(id2)) return false;
36918
37173
  visited.add(id2);
36919
- const canonicalId = canonicalWorldSystemListEntryMemberId({
36920
- entryMemberId: id2,
36921
- extendsMemberId: current.extendsMemberId,
36922
- id: id2
36923
- });
36924
- if (canonicalId === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID) {
37174
+ if (id2 === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID || id2 === WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID) {
36925
37175
  return true;
36926
37176
  }
36927
37177
  current = typeof current.extendsMemberId === "string" ? membersById.get(current.extendsMemberId) : void 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.9.4",
3
+ "version": "0.10.1",
4
4
  "description": "Neo Compose native project-source CLI with bidirectional sync.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -196,8 +196,14 @@ abstract class InventoryItem<
196
196
  - `@settings(...)` and `@storage(...)` are context-aware typed contracts.
197
197
  Numeric limits are numeric literals. A class supports only
198
198
  `@storage(allowed: ...)`; storage keys are member-only.
199
- - Keep focused annotations such as `@locked`, `@system`, and `@relations`
200
- separate from contextual settings.
199
+ - Keep focused annotations such as `@locked`, `@hidden`, `@system`, and
200
+ `@relations` separate from contextual settings. `@hidden` is class-only and
201
+ hides the class from the member selector and classes tree; absent is visible.
202
+ - `@index(member: Field, unique: ...)` and
203
+ `@column(member: Field, width: ..., hidden: ..., frozen: ..., wrapContent: ...)`
204
+ are repeatable List annotations. `member:` is a bare field name on the entry
205
+ class — an index needs a non-localizable `string` or a single-select enum,
206
+ and a column may also target the reserved `__other__` key.
201
207
  - `.EnumCase` works only when one expected enum type is known. Use explicit
202
208
  `EnumType.Case` when context is ambiguous.
203
209
  - Defaults and settings must be statically analyzable. Project source is parsed