@ifc-lite/cli 0.21.1 → 0.22.0

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 (38) hide show
  1. package/dist/commands/diagnose-geometry.d.ts.map +1 -1
  2. package/dist/commands/diagnose-geometry.js +28 -22
  3. package/dist/commands/diagnose-geometry.js.map +1 -1
  4. package/dist/commands/diff-content.d.ts +11 -0
  5. package/dist/commands/diff-content.d.ts.map +1 -0
  6. package/dist/commands/diff-content.js +270 -0
  7. package/dist/commands/diff-content.js.map +1 -0
  8. package/dist/commands/diff-engine.d.ts +23 -0
  9. package/dist/commands/diff-engine.d.ts.map +1 -0
  10. package/dist/commands/diff-engine.js +159 -0
  11. package/dist/commands/diff-engine.js.map +1 -0
  12. package/dist/commands/diff-scope.d.ts +77 -0
  13. package/dist/commands/diff-scope.d.ts.map +1 -0
  14. package/dist/commands/diff-scope.js +160 -0
  15. package/dist/commands/diff-scope.js.map +1 -0
  16. package/dist/commands/diff-test-helpers.d.ts +70 -0
  17. package/dist/commands/diff-test-helpers.d.ts.map +1 -0
  18. package/dist/commands/diff-test-helpers.js +203 -0
  19. package/dist/commands/diff-test-helpers.js.map +1 -0
  20. package/dist/commands/diff.d.ts +1 -0
  21. package/dist/commands/diff.d.ts.map +1 -1
  22. package/dist/commands/diff.js +71 -25
  23. package/dist/commands/diff.js.map +1 -1
  24. package/dist/commands/extract-entities.d.ts.map +1 -1
  25. package/dist/commands/extract-entities.js +8 -2
  26. package/dist/commands/extract-entities.js.map +1 -1
  27. package/dist/commands/gym.d.ts.map +1 -1
  28. package/dist/commands/gym.js +77 -62
  29. package/dist/commands/gym.js.map +1 -1
  30. package/dist/commands/validate.d.ts.map +1 -1
  31. package/dist/commands/validate.js +26 -2
  32. package/dist/commands/validate.js.map +1 -1
  33. package/dist/headless-backend.d.ts.map +1 -1
  34. package/dist/headless-backend.js +14 -1
  35. package/dist/headless-backend.js.map +1 -1
  36. package/dist/index.js +3 -0
  37. package/dist/index.js.map +1 -1
  38. package/package.json +15 -14
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Which entities of a file take part in an `ifc-lite diff`, and under what key
3
+ * (issue #1891).
4
+ *
5
+ * One answer for both comparison modes: `--by-entity`, which reports GlobalIds
6
+ * added / removed / common, and `--by-content`, which fingerprints the same
7
+ * entities for the `@ifc-lite/diff` engine (see `diff-engine.ts`). They were
8
+ * two answers, and the older one was wrong in ways the user could not see.
9
+ *
10
+ * **Scope: every `IfcObjectDefinition` in the file.** IFC's three `IfcRoot`
11
+ * branches are not equally comparable. An `IfcObjectDefinition` (every
12
+ * `IfcObject` — product, task, actor, control, resource, group — plus
13
+ * `IfcTypeObject` and `IfcContext`) is an independently identifiable thing, and
14
+ * is precisely what a diff can make a claim about. The other two branches are
15
+ * dependent and stay out:
16
+ *
17
+ * - `IfcRelationship`: its identity is its endpoints. Re-GUIDing an
18
+ * `IfcRelAggregates` while both ends are untouched is not a change anyone
19
+ * wants reported, and on a re-export it is most of the reported churn.
20
+ * - `IfcPropertyDefinition`: a property set's content already travels with its
21
+ * owner, so comparing it again double-reports every edited property — once on
22
+ * the element, once on the pset.
23
+ *
24
+ * **Membership is decided from the inheritance chain of every bundled schema**
25
+ * (IFC2X3 + IFC4 + IFC4X3), not from what the columnar parser happened to put
26
+ * in its `EntityTable`, not from whichever attribute sits in slot 0 of a STEP
27
+ * record, and not from the IFC4 codegen pin alone. That is the whole fix for
28
+ * two silent defects:
29
+ *
30
+ * 1. The parser fills the table's GlobalId column positionally, and slot 0 of a
31
+ * resource entity is a **Name**. An `IfcMaterial`, `IfcSurfaceStyle`,
32
+ * `IfcClassification` or `IfcProjectedCRS` was therefore compared under its
33
+ * name — and two of them sharing a name arrived as one entity. On the four
34
+ * bundled sample models that was 4-9 colliding keys and 16-25 non-`IfcRoot`
35
+ * entries per file. None of them is an `IfcRoot`, so the chain check leaves
36
+ * them out and the key set is unique again.
37
+ * 2. The `EntityTable` only holds the categories the viewer renders, so
38
+ * `IfcTask`, `IfcActor`, `IfcWorkPlan` and every other non-product
39
+ * `IfcObject` answer '' from `getGlobalId` even though their STEP records
40
+ * carry one. Those are read straight from the source record here.
41
+ *
42
+ * Classification happens once per *type*, so the geometry buckets — which are
43
+ * the bulk of a real file — are dismissed without touching a single row.
44
+ */
45
+ import { extractRootAttributesFromEntity, type IfcDataStore } from '@ifc-lite/parser';
46
+ /** The IfcRoot-family attributes read from a STEP record when the columnar
47
+ * `EntityTable` does not hold the entity. */
48
+ export type RootAttributes = ReturnType<typeof extractRootAttributesFromEntity>;
49
+ /** One entity that takes part in the comparison. */
50
+ export interface ComparableEntity {
51
+ expressId: number;
52
+ /** Non-empty by construction: an entity without one has no cross-file
53
+ * identity and is not yielded at all. */
54
+ globalId: string;
55
+ /** The registry's PascalCase spelling where the `EntityTable` has no row (and
56
+ * so answers `'Unknown'`), the table's own type name otherwise. */
57
+ ifcType: string;
58
+ /** Set only when the entity is absent from the `EntityTable`, whose display
59
+ * accessors then answer '' for every attribute. */
60
+ source: RootAttributes | undefined;
61
+ /** True for an `IfcTypeObject` subtype (issue #2021). Decided from the same
62
+ * cross-schema inheritance chain as {@link ComparableEntity.ifcType}, so a
63
+ * type class no bundled schema declares is `false` rather than guessed —
64
+ * the fingerprint then simply carries no `Tag`, which is the same answer as
65
+ * a type object that has none. */
66
+ isTypeObject: boolean;
67
+ }
68
+ /**
69
+ * Walk a store's entity index and yield every entity the comparison covers.
70
+ *
71
+ * Lazy on purpose: `--by-entity` only needs the keys, and a generator lets it
72
+ * collect them without materialising a second array per file.
73
+ */
74
+ export declare function comparableEntities(store: IfcDataStore): Generator<ComparableEntity>;
75
+ /** The comparison's key set for one file: every covered entity's GlobalId. */
76
+ export declare function comparableGlobalIds(store: IfcDataStore): Set<string>;
77
+ //# sourceMappingURL=diff-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-scope.d.ts","sourceRoot":"","sources":["../../src/commands/diff-scope.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAEL,+BAA+B,EAE/B,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAE1B;8CAC8C;AAC9C,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAEhF,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB;8CAC0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB;wEACoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB;wDACoD;IACpD,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC;;;;uCAImC;IACnC,YAAY,EAAE,OAAO,CAAC;CACvB;AAgED;;;;;GAKG;AACH,wBAAiB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAqCpF;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAIpE"}
@@ -0,0 +1,160 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Which entities of a file take part in an `ifc-lite diff`, and under what key
6
+ * (issue #1891).
7
+ *
8
+ * One answer for both comparison modes: `--by-entity`, which reports GlobalIds
9
+ * added / removed / common, and `--by-content`, which fingerprints the same
10
+ * entities for the `@ifc-lite/diff` engine (see `diff-engine.ts`). They were
11
+ * two answers, and the older one was wrong in ways the user could not see.
12
+ *
13
+ * **Scope: every `IfcObjectDefinition` in the file.** IFC's three `IfcRoot`
14
+ * branches are not equally comparable. An `IfcObjectDefinition` (every
15
+ * `IfcObject` — product, task, actor, control, resource, group — plus
16
+ * `IfcTypeObject` and `IfcContext`) is an independently identifiable thing, and
17
+ * is precisely what a diff can make a claim about. The other two branches are
18
+ * dependent and stay out:
19
+ *
20
+ * - `IfcRelationship`: its identity is its endpoints. Re-GUIDing an
21
+ * `IfcRelAggregates` while both ends are untouched is not a change anyone
22
+ * wants reported, and on a re-export it is most of the reported churn.
23
+ * - `IfcPropertyDefinition`: a property set's content already travels with its
24
+ * owner, so comparing it again double-reports every edited property — once on
25
+ * the element, once on the pset.
26
+ *
27
+ * **Membership is decided from the inheritance chain of every bundled schema**
28
+ * (IFC2X3 + IFC4 + IFC4X3), not from what the columnar parser happened to put
29
+ * in its `EntityTable`, not from whichever attribute sits in slot 0 of a STEP
30
+ * record, and not from the IFC4 codegen pin alone. That is the whole fix for
31
+ * two silent defects:
32
+ *
33
+ * 1. The parser fills the table's GlobalId column positionally, and slot 0 of a
34
+ * resource entity is a **Name**. An `IfcMaterial`, `IfcSurfaceStyle`,
35
+ * `IfcClassification` or `IfcProjectedCRS` was therefore compared under its
36
+ * name — and two of them sharing a name arrived as one entity. On the four
37
+ * bundled sample models that was 4-9 colliding keys and 16-25 non-`IfcRoot`
38
+ * entries per file. None of them is an `IfcRoot`, so the chain check leaves
39
+ * them out and the key set is unique again.
40
+ * 2. The `EntityTable` only holds the categories the viewer renders, so
41
+ * `IfcTask`, `IfcActor`, `IfcWorkPlan` and every other non-product
42
+ * `IfcObject` answer '' from `getGlobalId` even though their STEP records
43
+ * carry one. Those are read straight from the source record here.
44
+ *
45
+ * Classification happens once per *type*, so the geometry buckets — which are
46
+ * the bulk of a real file — are dismissed without touching a single row.
47
+ */
48
+ import { EntityExtractor, extractRootAttributesFromEntity, getInheritanceChainAcrossSchemas, } from '@ifc-lite/parser';
49
+ /**
50
+ * Classify one STEP type against the three `IfcRoot` branches.
51
+ *
52
+ * The chain has to come from **every bundled schema**, not from the parser's
53
+ * IFC4 codegen pin. `getInheritanceChainForEntity` answers an empty chain for
54
+ * any class the pin does not carry, and that is not a rare corner: IFC2X3 alone
55
+ * puts 23 `IfcObjectDefinition` classes there (`IfcMove`, `IfcOrderAction`,
56
+ * `IfcScheduleTimeControl`, `IfcSpaceProgram`, `IfcServiceLife`, …) and IFC4X3
57
+ * another 77. Judging those as `unknown` dropped the ones the `EntityTable`
58
+ * does not hold — real objects with real GlobalIds, which the walk this
59
+ * replaced did compare — and let through the IFC2X3-only *resource* classes it
60
+ * does hold under a `…STYLE` name, keyed on the Name in slot 0. Both are wrong
61
+ * answers about an IFC2X3 file, which is still most of what is in the wild.
62
+ *
63
+ * `unknown` is still not `dependent`: a vendor extension no schema declares has
64
+ * no chain to judge, so it keeps exactly the reach the `EntityTable` gives it —
65
+ * which for a `…TYPE` class is a genuine GlobalId, since the parser's
66
+ * type-object branch is name-based and takes those in. Guessing that an
67
+ * unrecognised class is an `IfcObject` and reading its source record instead
68
+ * would cost one STEP extraction per row of every unrecognised bucket in the
69
+ * file, on every file, to reach entities almost no file has. The price of that
70
+ * choice is that a vendor `IfcRoot` subtype whose name does not end in `TYPE`
71
+ * stays uncompared.
72
+ *
73
+ * The one name the chain is not needed for is `IFCREL…`: that prefix is the
74
+ * parser's own rule for taking an unrecognised relationship into the table, and
75
+ * a relationship is excluded here whether any schema can confirm it or not.
76
+ * Without this, an unrecognised `IfcRelXxx` would be the single class of entity
77
+ * that got in through the relationship branch the comparison deliberately shuts.
78
+ */
79
+ function classifyType(typeKey) {
80
+ const upper = typeKey.toUpperCase();
81
+ const chain = getInheritanceChainAcrossSchemas(upper);
82
+ if (chain.length === 0) {
83
+ return {
84
+ role: upper.startsWith('IFCREL') ? 'dependent' : 'unknown',
85
+ name: typeKey,
86
+ typeObject: false,
87
+ };
88
+ }
89
+ // The chain holds the class itself plus its supertypes; which end the leaf
90
+ // sits at is the schema source's business, so find it by name.
91
+ const name = chain.find((ancestor) => ancestor.toUpperCase() === upper) ?? typeKey;
92
+ const typeObject = chain.includes('IfcTypeObject');
93
+ if (!chain.includes('IfcRoot'))
94
+ return { role: 'dependent', name, typeObject };
95
+ return {
96
+ role: chain.includes('IfcObjectDefinition') ? 'independent' : 'dependent',
97
+ name,
98
+ typeObject,
99
+ };
100
+ }
101
+ /**
102
+ * Walk a store's entity index and yield every entity the comparison covers.
103
+ *
104
+ * Lazy on purpose: `--by-entity` only needs the keys, and a generator lets it
105
+ * collect them without materialising a second array per file.
106
+ */
107
+ export function* comparableEntities(store) {
108
+ const seen = new Set();
109
+ // One extractor for the whole file: it holds a buffer reference, and the
110
+ // source read below only fires for the (small) set of object types the
111
+ // EntityTable declines to hold.
112
+ const extractor = new EntityExtractor(store.source);
113
+ for (const [typeKey, ids] of store.entityIndex.byType) {
114
+ const type = classifyType(typeKey);
115
+ if (type.role === 'dependent')
116
+ continue;
117
+ for (const expressId of ids) {
118
+ if (seen.has(expressId))
119
+ continue;
120
+ seen.add(expressId);
121
+ let globalId = store.entities.getGlobalId(expressId);
122
+ let source;
123
+ if (!globalId && type.role === 'independent') {
124
+ // In the file but not in the table: a schedule task, an actor, a work
125
+ // plan. Its GlobalId is in the STEP record, so read it there.
126
+ source = readRootAttributes(extractor, store, expressId);
127
+ globalId = source?.globalId ?? '';
128
+ }
129
+ // Still nothing: the entity is not an IfcRoot at all (a placement, a
130
+ // profile, a representation item), so it has no cross-file identity.
131
+ if (!globalId)
132
+ continue;
133
+ const tableType = store.entities.getTypeName(expressId);
134
+ // `getTypeName` answers 'Unknown' for a row the table never took in. The
135
+ // registry's own spelling is the honest answer, and on the content path
136
+ // it has to be a real type name: `ifcType` is hashed into the fingerprint
137
+ // and cross-checked on every match, so 'Unknown' would pair a task with
138
+ // an actor.
139
+ const ifcType = source && (!tableType || tableType === 'Unknown') ? type.name : tableType;
140
+ yield { expressId, globalId, ifcType, source, isTypeObject: type.typeObject };
141
+ }
142
+ }
143
+ }
144
+ /** The comparison's key set for one file: every covered entity's GlobalId. */
145
+ export function comparableGlobalIds(store) {
146
+ const keys = new Set();
147
+ for (const entity of comparableEntities(store))
148
+ keys.add(entity.globalId);
149
+ return keys;
150
+ }
151
+ /** IfcRoot attributes straight from the entity's STEP record, for the rows the
152
+ * columnar `EntityTable` never took in. */
153
+ function readRootAttributes(extractor, store, expressId) {
154
+ const ref = store.entityIndex.byId.get(expressId);
155
+ if (!ref)
156
+ return undefined;
157
+ const entity = extractor.extractEntity(ref);
158
+ return entity ? extractRootAttributesFromEntity(entity) : undefined;
159
+ }
160
+ //# sourceMappingURL=diff-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-scope.js","sourceRoot":"","sources":["../../src/commands/diff-scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /** Shared STEP fixtures for the `diff --by-content` test suites (issue #1891). */
2
+ /** A 22-character IFC GlobalId from a short mnemonic. */
3
+ export declare function guid(mnemonic: string): string;
4
+ /** A minimal but real model: project, units, context, storey, two named walls
5
+ * with a spatial containment relation. `wallA`/`wallB` are the GlobalIds, so a
6
+ * "re-export" is the same call with different ones. */
7
+ export declare function model(wallA: string, wallB: string): string;
8
+ /**
9
+ * One entity from each `IfcRoot` branch, plus classes that are not `IfcRoot` at
10
+ * all and classes no schema registry knows.
11
+ *
12
+ * - `IfcTask` / `IfcActor` are `IfcObjectDefinition`s the columnar parser does
13
+ * not put in its `EntityTable` (they are not `IfcProduct` subtypes), so their
14
+ * GlobalId has to come from the STEP record.
15
+ * - `IfcRelDefinesByProperties` is an `IfcRelationship` and `IfcPropertySet` is
16
+ * an `IfcPropertyDefinition`: both carry GlobalIds, both stay out.
17
+ * - `IfcMaterial` has no GlobalId at all — its first attribute is a Name, which
18
+ * the parser's positional extraction stores in the table's GlobalId column.
19
+ * - `IfcVendorTask`, `IfcVendorWallType` and `IfcRelVendorLink` are in no schema
20
+ * registry. The parser's two name-based branches (`…TYPE`, `IFCREL…`) still
21
+ * take the last two into its table.
22
+ */
23
+ export declare function scheduleModel(taskGuid: string): string;
24
+ /**
25
+ * An IFC2X3 file whose objects are classes IFC4 dropped, so the parser's IFC4
26
+ * codegen pin knows none of them.
27
+ *
28
+ * - `IfcMove` (an `IfcTask` subtype) and `IfcSpaceProgram` (an `IfcControl`)
29
+ * are `IfcObjectDefinition`s with real GlobalIds in slot 0, and are not
30
+ * `IfcProduct`s, so the `EntityTable` does not hold them.
31
+ * - `IfcSymbolStyle` is a *resource*: no GlobalId at all, a Name in slot 0. Its
32
+ * class name ends in `STYLE`, which is one of the parser's two name-based
33
+ * branches, so the table does hold it — with `hatch` in the GlobalId column.
34
+ * - `IfcGasTerminalType` is a real `IfcTypeObject`, reached through the other
35
+ * name-based branch (`…TYPE`).
36
+ *
37
+ * Deciding membership from the IFC4 pin alone gets all three wrong at once.
38
+ */
39
+ export declare function legacyScheduleModel(moveGuid: string): string;
40
+ /**
41
+ * The `Tag` scoping fixture (issue #2021), in both directions at once.
42
+ *
43
+ * Two `IfcWallType`s that agree on everything the fingerprint hashed before
44
+ * `Tag` did — same Name, same ElementType, same PredefinedType, no properties —
45
+ * and differ only in `Tag`. That is Duplex's eight `'800 mm'`
46
+ * `IfcFurnitureType`s reduced to two, and a type object has no geometry hash,
47
+ * so before #2021 nothing could separate them.
48
+ *
49
+ * Two `IfcWall`s built the same way, differing only in `Tag`. An occurrence's
50
+ * `Tag` is the authoring tool's element id rather than design content, so it
51
+ * must stay OUT of the hash — these two must keep hashing identically.
52
+ */
53
+ export declare function typeTagModel(): string;
54
+ /**
55
+ * The same `Tag` question on a class the IFC4 codegen pin does not carry.
56
+ *
57
+ * `IfcRailType` is IFC4X3-only. Its inheritance chain resolves across the
58
+ * bundled schemas, so it is correctly in scope and correctly an `IfcTypeObject`
59
+ * — but its *attribute names* do not resolve through the pinned registry
60
+ * (`getAttributeNames('IfcRailType')` is empty, `getAttributeNamesAcrossSchemas`
61
+ * gives all ten with `Tag` at index 7). A `Tag` lookup that goes through the pin
62
+ * therefore finds nothing and silently no-ops on exactly the infrastructure
63
+ * classes IFC4X3 exists for, while passing every test written against IFC2X3 and
64
+ * IFC4. Same pinned-registry family as #2001/#2003.
65
+ */
66
+ export declare function railTypeModel(): string;
67
+ export declare const BASE_MODEL: string;
68
+ /** Same building, re-exported: the two walls carry brand-new GlobalIds. */
69
+ export declare const HEAD_MODEL: string;
70
+ //# sourceMappingURL=diff-test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-test-helpers.d.ts","sourceRoot":"","sources":["../../src/commands/diff-test-helpers.ts"],"names":[],"mappings":"AAIA,kFAAkF;AAElF,yDAAyD;AACzD,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;wDAEwD;AACxD,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA4B1D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+BtD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA0B5D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAwBrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAmBtC;AAED,eAAO,MAAM,UAAU,QAAoC,CAAC;AAC5D,2EAA2E;AAC3E,eAAO,MAAM,UAAU,QAAoC,CAAC"}
@@ -0,0 +1,203 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /** Shared STEP fixtures for the `diff --by-content` test suites (issue #1891). */
5
+ /** A 22-character IFC GlobalId from a short mnemonic. */
6
+ export function guid(mnemonic) {
7
+ return (mnemonic + '0'.repeat(22)).slice(0, 22);
8
+ }
9
+ /** A minimal but real model: project, units, context, storey, two named walls
10
+ * with a spatial containment relation. `wallA`/`wallB` are the GlobalIds, so a
11
+ * "re-export" is the same call with different ones. */
12
+ export function model(wallA, wallB) {
13
+ return `ISO-10303-21;
14
+ HEADER;
15
+ FILE_DESCRIPTION((''),'2;1');
16
+ FILE_NAME('m','2026',(''),(''),'','','');
17
+ FILE_SCHEMA(('IFC4'));
18
+ ENDSEC;
19
+ DATA;
20
+ #1= IFCPROJECT('${guid('PROJ')}',$,'Proj',$,$,$,$,(#20),#30);
21
+ #20= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-5,#21,$);
22
+ #21= IFCAXIS2PLACEMENT3D(#22,$,$);
23
+ #22= IFCCARTESIANPOINT((0.,0.,0.));
24
+ #30= IFCUNITASSIGNMENT((#31));
25
+ #31= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
26
+ #40= IFCLOCALPLACEMENT($,#21);
27
+ #41= IFCBUILDINGSTOREY('${guid('STOR')}',$,'L01',$,$,#40,$,$,.ELEMENT.,0.);
28
+ #50= IFCLOCALPLACEMENT(#40,#21);
29
+ #60= IFCRECTANGLEPROFILEDEF(.AREA.,$,#21,2.,0.2);
30
+ #61= IFCEXTRUDEDAREASOLID(#60,#21,#62,3.);
31
+ #62= IFCDIRECTION((0.,0.,1.));
32
+ #63= IFCSHAPEREPRESENTATION(#20,'Body','SweptSolid',(#61));
33
+ #64= IFCPRODUCTDEFINITIONSHAPE($,$,(#63));
34
+ #70= IFCWALL('${wallA}',$,'Wall A',$,$,#50,#64,'tagA',$);
35
+ #71= IFCWALL('${wallB}',$,'Wall B',$,$,#50,#64,'tagB',$);
36
+ #80= IFCRELCONTAINEDINSPATIALSTRUCTURE('${guid('RELC')}',$,$,$,(#70,#71),#41);
37
+ ENDSEC;
38
+ END-ISO-10303-21;
39
+ `;
40
+ }
41
+ /**
42
+ * One entity from each `IfcRoot` branch, plus classes that are not `IfcRoot` at
43
+ * all and classes no schema registry knows.
44
+ *
45
+ * - `IfcTask` / `IfcActor` are `IfcObjectDefinition`s the columnar parser does
46
+ * not put in its `EntityTable` (they are not `IfcProduct` subtypes), so their
47
+ * GlobalId has to come from the STEP record.
48
+ * - `IfcRelDefinesByProperties` is an `IfcRelationship` and `IfcPropertySet` is
49
+ * an `IfcPropertyDefinition`: both carry GlobalIds, both stay out.
50
+ * - `IfcMaterial` has no GlobalId at all — its first attribute is a Name, which
51
+ * the parser's positional extraction stores in the table's GlobalId column.
52
+ * - `IfcVendorTask`, `IfcVendorWallType` and `IfcRelVendorLink` are in no schema
53
+ * registry. The parser's two name-based branches (`…TYPE`, `IFCREL…`) still
54
+ * take the last two into its table.
55
+ */
56
+ export function scheduleModel(taskGuid) {
57
+ return `ISO-10303-21;
58
+ HEADER;
59
+ FILE_DESCRIPTION((''),'2;1');
60
+ FILE_NAME('m','2026',(''),(''),'','','');
61
+ FILE_SCHEMA(('IFC4'));
62
+ ENDSEC;
63
+ DATA;
64
+ #1= IFCPROJECT('${guid('PROJ')}',$,'Proj',$,$,$,$,(#20),#30);
65
+ #20= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-5,#21,$);
66
+ #21= IFCAXIS2PLACEMENT3D(#22,$,$);
67
+ #22= IFCCARTESIANPOINT((0.,0.,0.));
68
+ #30= IFCUNITASSIGNMENT((#31));
69
+ #31= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
70
+ #40= IFCLOCALPLACEMENT($,#21);
71
+ #41= IFCBUILDINGSTOREY('${guid('STOR')}',$,'L01',$,$,#40,$,$,.ELEMENT.,0.);
72
+ #70= IFCWALL('${guid('WALL')}',$,'Wall A',$,$,#40,$,'tagA',$);
73
+ #80= IFCMATERIAL('brick',$,$);
74
+ #81= IFCPROPERTYSET('${guid('PSET')}',$,'Pset_X',$,(#82));
75
+ #82= IFCPROPERTYSINGLEVALUE('P',$,IFCLABEL('v'),$);
76
+ #83= IFCRELDEFINESBYPROPERTIES('${guid('RELP')}',$,$,$,(#70),#81);
77
+ #90= IFCTASK('${taskGuid}',$,'Pour slab',$,$,$,$,'ID1',$,.F.,$,$,.CONSTRUCTION.);
78
+ #91= IFCACTOR('${guid('ACTR')}',$,'Site manager',$,$,#92,$);
79
+ #92= IFCPERSON($,'Doe','Jane',$,$,$,$,$);
80
+ #96= IFCRELCONTAINEDINSPATIALSTRUCTURE('${guid('RELC')}',$,$,$,(#70),#41);
81
+ #97= IFCVENDORTASK('${guid('VEND')}',$,'Custom',$);
82
+ #98= IFCVENDORWALLTYPE('${guid('VTYP')}',$,'Custom type',$,$,$,$,$,$,$);
83
+ #99= IFCRELVENDORLINK('${guid('VREL')}',$,$,$,(#70),#41);
84
+ ENDSEC;
85
+ END-ISO-10303-21;
86
+ `;
87
+ }
88
+ /**
89
+ * An IFC2X3 file whose objects are classes IFC4 dropped, so the parser's IFC4
90
+ * codegen pin knows none of them.
91
+ *
92
+ * - `IfcMove` (an `IfcTask` subtype) and `IfcSpaceProgram` (an `IfcControl`)
93
+ * are `IfcObjectDefinition`s with real GlobalIds in slot 0, and are not
94
+ * `IfcProduct`s, so the `EntityTable` does not hold them.
95
+ * - `IfcSymbolStyle` is a *resource*: no GlobalId at all, a Name in slot 0. Its
96
+ * class name ends in `STYLE`, which is one of the parser's two name-based
97
+ * branches, so the table does hold it — with `hatch` in the GlobalId column.
98
+ * - `IfcGasTerminalType` is a real `IfcTypeObject`, reached through the other
99
+ * name-based branch (`…TYPE`).
100
+ *
101
+ * Deciding membership from the IFC4 pin alone gets all three wrong at once.
102
+ */
103
+ export function legacyScheduleModel(moveGuid) {
104
+ return `ISO-10303-21;
105
+ HEADER;
106
+ FILE_DESCRIPTION((''),'2;1');
107
+ FILE_NAME('m','2026',(''),(''),'','','');
108
+ FILE_SCHEMA(('IFC2X3'));
109
+ ENDSEC;
110
+ DATA;
111
+ #1= IFCPROJECT('${guid('PROJ')}',$,'Proj',$,$,$,$,(#20),#30);
112
+ #20= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-5,#21,$);
113
+ #21= IFCAXIS2PLACEMENT3D(#22,$,$);
114
+ #22= IFCCARTESIANPOINT((0.,0.,0.));
115
+ #30= IFCUNITASSIGNMENT((#31));
116
+ #31= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
117
+ #40= IFCLOCALPLACEMENT($,#21);
118
+ #41= IFCBUILDINGSTOREY('${guid('STOR')}',$,'L01',$,$,#40,$,$,.ELEMENT.,0.);
119
+ #70= IFCWALLSTANDARDCASE('${guid('WALL')}',$,'Wall A',$,$,#40,$,'tagA');
120
+ #90= IFCMOVE('${moveGuid}',$,'Move A',$,$,'ID1',$,$,.F.,$,#41,#41,$);
121
+ #91= IFCSPACEPROGRAM('${guid('SPGM')}',$,'Program A',$,$,'SP1',$,$,$,$);
122
+ #92= IFCSYMBOLSTYLE('hatch',#93);
123
+ #93= IFCDEFINEDSYMBOL($,$);
124
+ #94= IFCGASTERMINALTYPE('${guid('GTTY')}',$,'GT',$,$,$,$,$,$,.GASAPPLIANCE.);
125
+ #96= IFCRELCONTAINEDINSPATIALSTRUCTURE('${guid('RELC')}',$,$,$,(#70),#41);
126
+ ENDSEC;
127
+ END-ISO-10303-21;
128
+ `;
129
+ }
130
+ /**
131
+ * The `Tag` scoping fixture (issue #2021), in both directions at once.
132
+ *
133
+ * Two `IfcWallType`s that agree on everything the fingerprint hashed before
134
+ * `Tag` did — same Name, same ElementType, same PredefinedType, no properties —
135
+ * and differ only in `Tag`. That is Duplex's eight `'800 mm'`
136
+ * `IfcFurnitureType`s reduced to two, and a type object has no geometry hash,
137
+ * so before #2021 nothing could separate them.
138
+ *
139
+ * Two `IfcWall`s built the same way, differing only in `Tag`. An occurrence's
140
+ * `Tag` is the authoring tool's element id rather than design content, so it
141
+ * must stay OUT of the hash — these two must keep hashing identically.
142
+ */
143
+ export function typeTagModel() {
144
+ return `ISO-10303-21;
145
+ HEADER;
146
+ FILE_DESCRIPTION((''),'2;1');
147
+ FILE_NAME('m','2026',(''),(''),'','','');
148
+ FILE_SCHEMA(('IFC4'));
149
+ ENDSEC;
150
+ DATA;
151
+ #1= IFCPROJECT('${guid('PROJ')}',$,'Proj',$,$,$,$,(#20),#30);
152
+ #20= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-5,#21,$);
153
+ #21= IFCAXIS2PLACEMENT3D(#22,$,$);
154
+ #22= IFCCARTESIANPOINT((0.,0.,0.));
155
+ #30= IFCUNITASSIGNMENT((#31));
156
+ #31= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
157
+ #40= IFCLOCALPLACEMENT($,#21);
158
+ #41= IFCBUILDINGSTOREY('${guid('STOR')}',$,'L01',$,$,#40,$,$,.ELEMENT.,0.);
159
+ #50= IFCWALLTYPE('${guid('TYPA')}',$,'800 mm',$,$,$,$,'157200','800 mm',.STANDARD.);
160
+ #51= IFCWALLTYPE('${guid('TYPB')}',$,'800 mm',$,$,$,$,'157607','800 mm',.STANDARD.);
161
+ #70= IFCWALL('${guid('WALA')}',$,'Wall',$,$,#40,$,'tagA',.STANDARD.);
162
+ #71= IFCWALL('${guid('WALB')}',$,'Wall',$,$,#40,$,'tagB',.STANDARD.);
163
+ #80= IFCRELCONTAINEDINSPATIALSTRUCTURE('${guid('RELC')}',$,$,$,(#70,#71),#41);
164
+ ENDSEC;
165
+ END-ISO-10303-21;
166
+ `;
167
+ }
168
+ /**
169
+ * The same `Tag` question on a class the IFC4 codegen pin does not carry.
170
+ *
171
+ * `IfcRailType` is IFC4X3-only. Its inheritance chain resolves across the
172
+ * bundled schemas, so it is correctly in scope and correctly an `IfcTypeObject`
173
+ * — but its *attribute names* do not resolve through the pinned registry
174
+ * (`getAttributeNames('IfcRailType')` is empty, `getAttributeNamesAcrossSchemas`
175
+ * gives all ten with `Tag` at index 7). A `Tag` lookup that goes through the pin
176
+ * therefore finds nothing and silently no-ops on exactly the infrastructure
177
+ * classes IFC4X3 exists for, while passing every test written against IFC2X3 and
178
+ * IFC4. Same pinned-registry family as #2001/#2003.
179
+ */
180
+ export function railTypeModel() {
181
+ return `ISO-10303-21;
182
+ HEADER;
183
+ FILE_DESCRIPTION((''),'2;1');
184
+ FILE_NAME('m','2026',(''),(''),'','','');
185
+ FILE_SCHEMA(('IFC4X3'));
186
+ ENDSEC;
187
+ DATA;
188
+ #1= IFCPROJECT('${guid('PROJ')}',$,'Proj',$,$,$,$,(#20),#30);
189
+ #20= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-5,#21,$);
190
+ #21= IFCAXIS2PLACEMENT3D(#22,$,$);
191
+ #22= IFCCARTESIANPOINT((0.,0.,0.));
192
+ #30= IFCUNITASSIGNMENT((#31));
193
+ #31= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
194
+ #50= IFCRAILTYPE('${guid('RALA')}',$,'60E1',$,$,$,$,'157200','60E1',.RACKRAIL.);
195
+ #51= IFCRAILTYPE('${guid('RALB')}',$,'60E1',$,$,$,$,'157607','60E1',.RACKRAIL.);
196
+ ENDSEC;
197
+ END-ISO-10303-21;
198
+ `;
199
+ }
200
+ export const BASE_MODEL = model(guid('OLDA'), guid('OLDB'));
201
+ /** Same building, re-exported: the two walls carry brand-new GlobalIds. */
202
+ export const HEAD_MODEL = model(guid('NEWA'), guid('NEWB'));
203
+ //# sourceMappingURL=diff-test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-test-helpers.js","sourceRoot":"","sources":["../../src/commands/diff-test-helpers.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,kFAAkF;AAElF,yDAAyD;AACzD,MAAM,UAAU,IAAI,CAAC,QAAgB;IACnC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;wDAEwD;AACxD,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,KAAa;IAChD,OAAO;;;;;;;kBAOS,IAAI,CAAC,MAAM,CAAC;;;;;;;0BAOJ,IAAI,CAAC,MAAM,CAAC;;;;;;;gBAOtB,KAAK;gBACL,KAAK;0CACqB,IAAI,CAAC,MAAM,CAAC;;;CAGrD,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO;;;;;;;kBAOS,IAAI,CAAC,MAAM,CAAC;;;;;;;0BAOJ,IAAI,CAAC,MAAM,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC;;uBAEL,IAAI,CAAC,MAAM,CAAC;;kCAED,IAAI,CAAC,MAAM,CAAC;gBAC9B,QAAQ;iBACP,IAAI,CAAC,MAAM,CAAC;;0CAEa,IAAI,CAAC,MAAM,CAAC;sBAChC,IAAI,CAAC,MAAM,CAAC;0BACR,IAAI,CAAC,MAAM,CAAC;yBACb,IAAI,CAAC,MAAM,CAAC;;;CAGpC,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO;;;;;;;kBAOS,IAAI,CAAC,MAAM,CAAC;;;;;;;0BAOJ,IAAI,CAAC,MAAM,CAAC;4BACV,IAAI,CAAC,MAAM,CAAC;gBACxB,QAAQ;wBACA,IAAI,CAAC,MAAM,CAAC;;;2BAGT,IAAI,CAAC,MAAM,CAAC;0CACG,IAAI,CAAC,MAAM,CAAC;;;CAGrD,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;kBAOS,IAAI,CAAC,MAAM,CAAC;;;;;;;0BAOJ,IAAI,CAAC,MAAM,CAAC;oBAClB,IAAI,CAAC,MAAM,CAAC;oBACZ,IAAI,CAAC,MAAM,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC;0CACc,IAAI,CAAC,MAAM,CAAC;;;CAGrD,CAAC;AACF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;kBAOS,IAAI,CAAC,MAAM,CAAC;;;;;;oBAMV,IAAI,CAAC,MAAM,CAAC;oBACZ,IAAI,CAAC,MAAM,CAAC;;;CAG/B,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,2EAA2E;AAC3E,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC"}
@@ -1,2 +1,3 @@
1
+ export declare function diffPositionals(args: string[]): string[];
1
2
  export declare function diffCommand(args: string[]): Promise<void>;
2
3
  //# sourceMappingURL=diff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAgBA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqG/D"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAmCA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAWxD;AAYD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8G/D"}