@ifc-lite/sdk 8.0.0 → 9.2.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.
- package/README.md +42 -0
- package/dist/cost-store-backend.d.ts +2 -0
- package/dist/cost-store-backend.d.ts.map +1 -1
- package/dist/cost-store-backend.js.map +1 -1
- package/dist/group-store-backend.d.ts +5 -0
- package/dist/group-store-backend.d.ts.map +1 -0
- package/dist/group-store-backend.js +43 -0
- package/dist/group-store-backend.js.map +1 -0
- package/dist/headless-mutate.d.ts +0 -10
- package/dist/headless-mutate.d.ts.map +1 -1
- package/dist/headless-mutate.js +8 -2
- package/dist/headless-mutate.js.map +1 -1
- package/dist/host.d.ts +2 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +34 -11
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +6 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/namespaces/ids-authoring.d.ts +74 -0
- package/dist/namespaces/ids-authoring.d.ts.map +1 -0
- package/dist/namespaces/ids-authoring.js +99 -0
- package/dist/namespaces/ids-authoring.js.map +1 -0
- package/dist/namespaces/ids.d.ts +4 -0
- package/dist/namespaces/ids.d.ts.map +1 -1
- package/dist/namespaces/ids.js +11 -0
- package/dist/namespaces/ids.js.map +1 -1
- package/dist/namespaces/mutate.d.ts +3 -3
- package/dist/namespaces/mutate.d.ts.map +1 -1
- package/dist/namespaces/mutate.js +7 -3
- package/dist/namespaces/mutate.js.map +1 -1
- package/dist/namespaces/store-group.d.ts +9 -0
- package/dist/namespaces/store-group.d.ts.map +1 -0
- package/dist/namespaces/store-group.js +31 -0
- package/dist/namespaces/store-group.js.map +1 -0
- package/dist/namespaces/store-modelling.d.ts +70 -0
- package/dist/namespaces/store-modelling.d.ts.map +1 -0
- package/dist/namespaces/store-modelling.js +173 -0
- package/dist/namespaces/store-modelling.js.map +1 -0
- package/dist/namespaces/store.d.ts +15 -34
- package/dist/namespaces/store.d.ts.map +1 -1
- package/dist/namespaces/store.js +10 -52
- package/dist/namespaces/store.js.map +1 -1
- package/dist/review/bcf.d.ts +10 -0
- package/dist/review/bcf.d.ts.map +1 -0
- package/dist/review/bcf.js +33 -0
- package/dist/review/bcf.js.map +1 -0
- package/dist/review/cards.d.ts +60 -0
- package/dist/review/cards.d.ts.map +1 -0
- package/dist/review/cards.js +90 -0
- package/dist/review/cards.js.map +1 -0
- package/dist/review/disciplines.d.ts +3 -0
- package/dist/review/disciplines.d.ts.map +1 -0
- package/dist/review/disciplines.js +10 -0
- package/dist/review/disciplines.js.map +1 -0
- package/dist/review/identity.d.ts +27 -0
- package/dist/review/identity.d.ts.map +1 -0
- package/dist/review/identity.js +42 -0
- package/dist/review/identity.js.map +1 -0
- package/dist/review/snapshot.d.ts +15 -0
- package/dist/review/snapshot.d.ts.map +1 -0
- package/dist/review/snapshot.js +25 -0
- package/dist/review/snapshot.js.map +1 -0
- package/dist/review/types.d.ts +167 -0
- package/dist/review/types.d.ts.map +1 -0
- package/dist/review/types.js +11 -0
- package/dist/review/types.js.map +1 -0
- package/dist/review/validation.d.ts +14 -0
- package/dist/review/validation.d.ts.map +1 -0
- package/dist/review/validation.js +57 -0
- package/dist/review/validation.js.map +1 -0
- package/dist/review.d.ts +11 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +12 -0
- package/dist/review.js.map +1 -0
- package/dist/schedule-types.d.ts +4 -0
- package/dist/schedule-types.d.ts.map +1 -1
- package/dist/store-align-command.d.ts +13 -0
- package/dist/store-align-command.d.ts.map +1 -0
- package/dist/store-align-command.js +31 -0
- package/dist/store-align-command.js.map +1 -0
- package/dist/store-authoring-exports.d.ts +10 -0
- package/dist/store-authoring-exports.d.ts.map +1 -0
- package/dist/store-authoring-exports.js +9 -0
- package/dist/store-authoring-exports.js.map +1 -0
- package/dist/store-authoring-types.d.ts +8 -0
- package/dist/store-authoring-types.d.ts.map +1 -0
- package/dist/store-authoring-types.js +2 -0
- package/dist/store-authoring-types.js.map +1 -0
- package/dist/store-group-types.d.ts +20 -0
- package/dist/store-group-types.d.ts.map +1 -0
- package/dist/store-group-types.js +2 -0
- package/dist/store-group-types.js.map +1 -0
- package/dist/store-modelling-backend.d.ts.map +1 -1
- package/dist/store-modelling-backend.js +73 -12
- package/dist/store-modelling-backend.js.map +1 -1
- package/dist/store-modelling-types.d.ts +33 -2
- package/dist/store-modelling-types.d.ts.map +1 -1
- package/dist/store-ordinary-backend.d.ts +10 -0
- package/dist/store-ordinary-backend.d.ts.map +1 -0
- package/dist/store-ordinary-backend.js +27 -0
- package/dist/store-ordinary-backend.js.map +1 -0
- package/dist/store-physical-backend.d.ts +5 -0
- package/dist/store-physical-backend.d.ts.map +1 -0
- package/dist/store-physical-backend.js +51 -0
- package/dist/store-physical-backend.js.map +1 -0
- package/dist/store-physical-types.d.ts +33 -0
- package/dist/store-physical-types.d.ts.map +1 -0
- package/dist/store-physical-types.js +5 -0
- package/dist/store-physical-types.js.map +1 -0
- package/dist/store-room-auto-all.d.ts +5 -0
- package/dist/store-room-auto-all.d.ts.map +1 -0
- package/dist/store-room-auto-all.js +94 -0
- package/dist/store-room-auto-all.js.map +1 -0
- package/dist/store-room-command.d.ts +91 -0
- package/dist/store-room-command.d.ts.map +1 -0
- package/dist/store-room-command.js +197 -0
- package/dist/store-room-command.js.map +1 -0
- package/dist/types.d.ts +12 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +22 -15
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { CostItemParams, CostQuantityParams, CostScheduleParams, CostValueParams,
|
|
2
|
-
import type {
|
|
1
|
+
import type { CostItemParams, CostQuantityParams, CostScheduleParams, CostValueParams, StructuralAnalysisModelInStoreParams, StructuralCurveMemberInStoreParams, StructuralLinearActionInStoreParams, StructuralLoadGroupInStoreParams, StructuralPointActionInStoreParams, StructuralPointConnectionInStoreParams } from '@ifc-lite/create';
|
|
2
|
+
import type { AddDoorInStoreParams, AddPlateInStoreParams, AddRoofInStoreParams, AddSlabInStoreParams, AddSpaceInStoreParams, AddWallInStoreParams, AddWindowInStoreParams, EntityRef, StoreBackendMethods } from '../types.js';
|
|
3
|
+
import { StoreGroupNamespace } from './store-group.js';
|
|
3
4
|
/**
|
|
4
5
|
* `bim.store` — document-level edits on a parsed model.
|
|
5
6
|
*
|
|
@@ -15,9 +16,7 @@ import type { AddBeamInStoreParams, AddColumnInStoreParams, AddDoorInStoreParams
|
|
|
15
16
|
* Changes accumulate in a per-model overlay and are flushed to the IFC
|
|
16
17
|
* file on the next `bim.export.ifc({ applyMutations: true })`.
|
|
17
18
|
*/
|
|
18
|
-
export declare class StoreNamespace {
|
|
19
|
-
private backend;
|
|
20
|
-
constructor(backend: BimBackend);
|
|
19
|
+
export declare class StoreNamespace extends StoreGroupNamespace {
|
|
21
20
|
/**
|
|
22
21
|
* Inject a new entity into the active model. Returns an `EntityRef`
|
|
23
22
|
* pointing at the freshly-allocated expressId.
|
|
@@ -73,8 +72,9 @@ export declare class StoreNamespace {
|
|
|
73
72
|
* so the column appears next to the existing model on export.
|
|
74
73
|
*
|
|
75
74
|
* `Position` is the base centre in storey-local coordinates (metres),
|
|
76
|
-
* `Width`×`Depth`
|
|
77
|
-
* `
|
|
75
|
+
* `Width`×`Depth` selects a centred rectangle; `Profile` selects the
|
|
76
|
+
* canonical parameterised section. `RefDirection` turns its local X axis
|
|
77
|
+
* in the storey plane, and `Height` is the +Z extrusion length.
|
|
78
78
|
*
|
|
79
79
|
* @example
|
|
80
80
|
* const storeyId = bim.query.byType('IfcBuildingStorey')[0].ref.expressId;
|
|
@@ -84,7 +84,7 @@ export declare class StoreNamespace {
|
|
|
84
84
|
* Name: 'Column 1',
|
|
85
85
|
* });
|
|
86
86
|
*/
|
|
87
|
-
addColumn(modelId: string, storeyExpressId: number, params:
|
|
87
|
+
addColumn(modelId: string, storeyExpressId: number, params: Parameters<StoreBackendMethods['addColumn']>[2]): EntityRef;
|
|
88
88
|
/**
|
|
89
89
|
* Add an IfcWall from `Start` to `End` (storey-local metres). Profile
|
|
90
90
|
* spans the full length along the wall axis, centred on `Thickness`,
|
|
@@ -104,11 +104,11 @@ export declare class StoreNamespace {
|
|
|
104
104
|
*/
|
|
105
105
|
addSlab(modelId: string, storeyExpressId: number, params: AddSlabInStoreParams): EntityRef;
|
|
106
106
|
/**
|
|
107
|
-
* Add an IfcBeam between `Start` and `End` with a centred
|
|
108
|
-
*
|
|
109
|
-
* extrusion runs along the beam.
|
|
107
|
+
* Add an IfcBeam between `Start` and `End` with a centred rectangle
|
|
108
|
+
* (`Width` × `Height`) or parameterised `Profile`. Local Z is the beam
|
|
109
|
+
* axis so the extrusion runs along the beam.
|
|
110
110
|
*/
|
|
111
|
-
addBeam(modelId: string, storeyExpressId: number, params:
|
|
111
|
+
addBeam(modelId: string, storeyExpressId: number, params: Parameters<StoreBackendMethods['addBeam']>[2]): EntityRef;
|
|
112
112
|
/** Add a free-standing IfcDoor (Width × Height + thin frame depth). */
|
|
113
113
|
addDoor(modelId: string, storeyExpressId: number, params: AddDoorInStoreParams): EntityRef;
|
|
114
114
|
/** Add a free-standing IfcWindow (Width × Height + thin frame depth). */
|
|
@@ -134,29 +134,10 @@ export declare class StoreNamespace {
|
|
|
134
134
|
addPlate(modelId: string, storeyExpressId: number, params: AddPlateInStoreParams): EntityRef;
|
|
135
135
|
/**
|
|
136
136
|
* Add an IfcMember (generic structural member — brace, post, strut)
|
|
137
|
-
* between `Start` and `End`. Same
|
|
138
|
-
* choose
|
|
137
|
+
* between `Start` and `End`. Same rectangular or parameterised Profile
|
|
138
|
+
* extrusion as `addBeam`; choose PredefinedType to disambiguate the role.
|
|
139
139
|
*/
|
|
140
|
-
addMember(modelId: string, storeyExpressId: number, params:
|
|
141
|
-
/** Cut an IfcOpeningElement (IfcRelVoidsElement) into a wall (`Offset`, `Sill`, `Width`, `Height`) or
|
|
142
|
-
* slab (`Position` [x, y], `Width`, `Depth`); the cut spans the host body + 50 mm per face unless `CutDepth`. */
|
|
143
|
-
addOpening(modelId: string, hostExpressId: number, params: OpeningInStoreParams): EntityRef;
|
|
144
|
-
/** Add an IfcDoor filling a new opening in a wall (IfcRelFillsElement). `Sill` defaults to 0. */
|
|
145
|
-
addHostedDoor(modelId: string, hostExpressId: number, params: HostedDoorInStoreParams): EntityRef;
|
|
146
|
-
/** Add an IfcWindow filling a new opening in a wall (IfcRelFillsElement), bottom edge at `Sill`. */
|
|
147
|
-
addHostedWindow(modelId: string, hostExpressId: number, params: HostedWindowInStoreParams): EntityRef;
|
|
148
|
-
/** Add an IfcElementType subtype (e.g. `{ Type: 'IfcWallType', Name, PredefinedType }`), laid out for the model's schema. */
|
|
149
|
-
addElementType(modelId: string, params: ElementTypeInStoreParams): EntityRef;
|
|
150
|
-
/** Type objects via IfcRelDefinesByType; an object already typed moves to this type. Returns the relationship. */
|
|
151
|
-
assignType(modelId: string, typeExpressId: number, objectExpressIds: number[]): EntityRef;
|
|
152
|
-
/** Add an IfcMaterial. */
|
|
153
|
-
addMaterial(modelId: string, params: MaterialInStoreParams): EntityRef;
|
|
154
|
-
/** Add an IfcMaterialLayerSet of IfcMaterialLayers (`MaterialLayers[i].LayerThickness` in metres). */
|
|
155
|
-
addMaterialLayerSet(modelId: string, params: MaterialLayerSetInStoreParams): EntityRef;
|
|
156
|
-
/** Add an IfcMaterialLayerSetUsage (default AXIS2/POSITIVE; `OffsetFromReferenceLine` in metres). */
|
|
157
|
-
addMaterialLayerSetUsage(modelId: string, params: MaterialLayerSetUsageInStoreParams): EntityRef;
|
|
158
|
-
/** Associate a material with objects via IfcRelAssociatesMaterial, replacing their previous one. Returns the relationship. */
|
|
159
|
-
assignMaterial(modelId: string, materialExpressId: number, objectExpressIds: number[]): EntityRef;
|
|
140
|
+
addMember(modelId: string, storeyExpressId: number, params: Parameters<StoreBackendMethods['addMember']>[2]): EntityRef;
|
|
160
141
|
/** Add an IfcCostSchedule. Refused for IFC2X3 (different attribute layout). */
|
|
161
142
|
addCostSchedule(modelId: string, params: CostScheduleParams): EntityRef;
|
|
162
143
|
/** Add an IfcCostItem. `CostValues`/`CostQuantities` are optional; an empty array is refused. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/namespaces/store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EACvE,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/namespaces/store.ts"],"names":[],"mappings":"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"}
|
package/dist/namespaces/store.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { isInstantiable, isKnownType, normalizeIfcTypeName } from '@ifc-lite/parser';
|
|
5
|
+
import { StoreGroupNamespace } from './store-group.js';
|
|
5
6
|
/**
|
|
6
7
|
* `bim.store` — document-level edits on a parsed model.
|
|
7
8
|
*
|
|
@@ -17,11 +18,7 @@ import { isInstantiable, isKnownType, normalizeIfcTypeName } from '@ifc-lite/par
|
|
|
17
18
|
* Changes accumulate in a per-model overlay and are flushed to the IFC
|
|
18
19
|
* file on the next `bim.export.ifc({ applyMutations: true })`.
|
|
19
20
|
*/
|
|
20
|
-
export class StoreNamespace {
|
|
21
|
-
backend;
|
|
22
|
-
constructor(backend) {
|
|
23
|
-
this.backend = backend;
|
|
24
|
-
}
|
|
21
|
+
export class StoreNamespace extends StoreGroupNamespace {
|
|
25
22
|
/**
|
|
26
23
|
* Inject a new entity into the active model. Returns an `EntityRef`
|
|
27
24
|
* pointing at the freshly-allocated expressId.
|
|
@@ -103,8 +100,9 @@ export class StoreNamespace {
|
|
|
103
100
|
* so the column appears next to the existing model on export.
|
|
104
101
|
*
|
|
105
102
|
* `Position` is the base centre in storey-local coordinates (metres),
|
|
106
|
-
* `Width`×`Depth`
|
|
107
|
-
* `
|
|
103
|
+
* `Width`×`Depth` selects a centred rectangle; `Profile` selects the
|
|
104
|
+
* canonical parameterised section. `RefDirection` turns its local X axis
|
|
105
|
+
* in the storey plane, and `Height` is the +Z extrusion length.
|
|
108
106
|
*
|
|
109
107
|
* @example
|
|
110
108
|
* const storeyId = bim.query.byType('IfcBuildingStorey')[0].ref.expressId;
|
|
@@ -140,9 +138,9 @@ export class StoreNamespace {
|
|
|
140
138
|
return this.backend.store.addSlab(modelId, storeyExpressId, params);
|
|
141
139
|
}
|
|
142
140
|
/**
|
|
143
|
-
* Add an IfcBeam between `Start` and `End` with a centred
|
|
144
|
-
*
|
|
145
|
-
* extrusion runs along the beam.
|
|
141
|
+
* Add an IfcBeam between `Start` and `End` with a centred rectangle
|
|
142
|
+
* (`Width` × `Height`) or parameterised `Profile`. Local Z is the beam
|
|
143
|
+
* axis so the extrusion runs along the beam.
|
|
146
144
|
*/
|
|
147
145
|
addBeam(modelId, storeyExpressId, params) {
|
|
148
146
|
return this.backend.store.addBeam(modelId, storeyExpressId, params);
|
|
@@ -182,52 +180,12 @@ export class StoreNamespace {
|
|
|
182
180
|
}
|
|
183
181
|
/**
|
|
184
182
|
* Add an IfcMember (generic structural member — brace, post, strut)
|
|
185
|
-
* between `Start` and `End`. Same
|
|
186
|
-
* choose
|
|
183
|
+
* between `Start` and `End`. Same rectangular or parameterised Profile
|
|
184
|
+
* extrusion as `addBeam`; choose PredefinedType to disambiguate the role.
|
|
187
185
|
*/
|
|
188
186
|
addMember(modelId, storeyExpressId, params) {
|
|
189
187
|
return this.backend.store.addMember(modelId, storeyExpressId, params);
|
|
190
188
|
}
|
|
191
|
-
// -- Openings, hosted fillings, types and materials (#6232 M3) -------------
|
|
192
|
-
// Hosts are existing IfcWall/IfcSlab; params are metres in the host's frame.
|
|
193
|
-
/** Cut an IfcOpeningElement (IfcRelVoidsElement) into a wall (`Offset`, `Sill`, `Width`, `Height`) or
|
|
194
|
-
* slab (`Position` [x, y], `Width`, `Depth`); the cut spans the host body + 50 mm per face unless `CutDepth`. */
|
|
195
|
-
addOpening(modelId, hostExpressId, params) {
|
|
196
|
-
return this.backend.store.addOpening(modelId, hostExpressId, params);
|
|
197
|
-
}
|
|
198
|
-
/** Add an IfcDoor filling a new opening in a wall (IfcRelFillsElement). `Sill` defaults to 0. */
|
|
199
|
-
addHostedDoor(modelId, hostExpressId, params) {
|
|
200
|
-
return this.backend.store.addHostedDoor(modelId, hostExpressId, params);
|
|
201
|
-
}
|
|
202
|
-
/** Add an IfcWindow filling a new opening in a wall (IfcRelFillsElement), bottom edge at `Sill`. */
|
|
203
|
-
addHostedWindow(modelId, hostExpressId, params) {
|
|
204
|
-
return this.backend.store.addHostedWindow(modelId, hostExpressId, params);
|
|
205
|
-
}
|
|
206
|
-
// IFC4 practice: IfcMaterialLayerSet on the type, a usage of it on each occurrence.
|
|
207
|
-
/** Add an IfcElementType subtype (e.g. `{ Type: 'IfcWallType', Name, PredefinedType }`), laid out for the model's schema. */
|
|
208
|
-
addElementType(modelId, params) {
|
|
209
|
-
return this.backend.store.addElementType(modelId, params);
|
|
210
|
-
}
|
|
211
|
-
/** Type objects via IfcRelDefinesByType; an object already typed moves to this type. Returns the relationship. */
|
|
212
|
-
assignType(modelId, typeExpressId, objectExpressIds) {
|
|
213
|
-
return this.backend.store.assignType(modelId, typeExpressId, objectExpressIds);
|
|
214
|
-
}
|
|
215
|
-
/** Add an IfcMaterial. */
|
|
216
|
-
addMaterial(modelId, params) {
|
|
217
|
-
return this.backend.store.addMaterial(modelId, params);
|
|
218
|
-
}
|
|
219
|
-
/** Add an IfcMaterialLayerSet of IfcMaterialLayers (`MaterialLayers[i].LayerThickness` in metres). */
|
|
220
|
-
addMaterialLayerSet(modelId, params) {
|
|
221
|
-
return this.backend.store.addMaterialLayerSet(modelId, params);
|
|
222
|
-
}
|
|
223
|
-
/** Add an IfcMaterialLayerSetUsage (default AXIS2/POSITIVE; `OffsetFromReferenceLine` in metres). */
|
|
224
|
-
addMaterialLayerSetUsage(modelId, params) {
|
|
225
|
-
return this.backend.store.addMaterialLayerSetUsage(modelId, params);
|
|
226
|
-
}
|
|
227
|
-
/** Associate a material with objects via IfcRelAssociatesMaterial, replacing their previous one. Returns the relationship. */
|
|
228
|
-
assignMaterial(modelId, materialExpressId, objectExpressIds) {
|
|
229
|
-
return this.backend.store.assignMaterial(modelId, materialExpressId, objectExpressIds);
|
|
230
|
-
}
|
|
231
189
|
// -- Cost / 5D authoring on a loaded model (#4857 PR A) --------------------
|
|
232
190
|
// Panel is read-only by design; these methods are for scripts (SDK / CLI /
|
|
233
191
|
// MCP / sandbox). See docs/guide/cost-panel.md "Authoring from scripts".
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/namespaces/store.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/namespaces/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BCF topics as coordination records. A topic's elements are the IfcGuids its
|
|
3
|
+
* viewpoints select or colour; BCF names no model, so a GlobalId present in two
|
|
4
|
+
* loaded models stays ambiguous. The topic status is the topic's own and is
|
|
5
|
+
* never changed by the review workspace.
|
|
6
|
+
*/
|
|
7
|
+
import type { BCFProject } from '@ifc-lite/bcf';
|
|
8
|
+
import type { ReviewMessage, FindingSourceResult } from './types.js';
|
|
9
|
+
export declare function bcfFindings<Message extends ReviewMessage = ReviewMessage>(project: BCFProject | null): FindingSourceResult<Message>;
|
|
10
|
+
//# sourceMappingURL=bcf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bcf.d.ts","sourceRoot":"","sources":["../../src/review/bcf.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAc,mBAAmB,EAAiB,MAAM,YAAY,CAAC;AAYhG,wBAAgB,WAAW,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAanI"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
function topicGuids(topic) {
|
|
5
|
+
const guids = new Set();
|
|
6
|
+
for (const viewpoint of topic.viewpoints) {
|
|
7
|
+
const components = viewpoint.components;
|
|
8
|
+
for (const component of components?.selection ?? [])
|
|
9
|
+
if (component.ifcGuid)
|
|
10
|
+
guids.add(component.ifcGuid);
|
|
11
|
+
for (const coloring of components?.coloring ?? [])
|
|
12
|
+
for (const component of coloring.components)
|
|
13
|
+
if (component.ifcGuid)
|
|
14
|
+
guids.add(component.ifcGuid);
|
|
15
|
+
}
|
|
16
|
+
return [...guids];
|
|
17
|
+
}
|
|
18
|
+
export function bcfFindings(project) {
|
|
19
|
+
if (!project || project.topics.size === 0)
|
|
20
|
+
return { runs: [], findings: [] };
|
|
21
|
+
const run = { id: 'bcf:project', source: 'bcf', temporal: 'current', label: project.name || 'BCF',
|
|
22
|
+
capturedAt: null, complete: true, incomplete: [], models: [] };
|
|
23
|
+
const findings = [...project.topics.values()].map(topic => ({
|
|
24
|
+
id: `${run.id}#${topic.guid}`, lineage: `bcf|${topic.guid}`, source: 'bcf', run,
|
|
25
|
+
elements: topicGuids(topic).map(globalId => ({ globalId, modelId: null, modelName: null })),
|
|
26
|
+
nativeStatus: topic.topicStatus ?? '', title: topic.title,
|
|
27
|
+
detail: [topic.topicType, topic.priority ? `priority ${topic.priority}` : '', topic.assignedTo ? `assigned ${topic.assignedTo}` : '',
|
|
28
|
+
topic.labels?.length ? `labels ${topic.labels.join(', ')}` : ''].filter((line) => !!line),
|
|
29
|
+
lifecycle: 'record', disciplines: [], storeys: [], evidence: { kind: 'bcf', topicGuid: topic.guid },
|
|
30
|
+
}));
|
|
31
|
+
return { runs: [run], findings };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bcf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bcf.js","sourceRoot":"","sources":["../../src/review/bcf.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAY/D,SAAS,UAAU,CAAC,KAAe;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,SAAS,IAAI,EAAE;YAAE,IAAI,SAAS,CAAC,OAAO;gBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACzG,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,QAAQ,IAAI,EAAE;YAAE,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU;gBAAE,IAAI,SAAS,CAAC,OAAO;oBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtJ,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW,CAAgD,OAA0B;IACnG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7E,MAAM,GAAG,GAAwB,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;QACpH,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACjE,MAAM,QAAQ,GAA6B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpF,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;QAC/E,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;QACzD,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;YAClI,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3G,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE;KACpG,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordination cards (P18, #6922): findings that refer to exactly the same
|
|
3
|
+
* set of validated elements form one card. Cards are not transitive clusters:
|
|
4
|
+
* a clash between A and B is its own card, and links to the card of findings
|
|
5
|
+
* on A alone as *related* instead of absorbing it, so no finding is ever in
|
|
6
|
+
* two cards and one busy element cannot swallow the whole model.
|
|
7
|
+
*
|
|
8
|
+
* A finding with any element that does not resolve to exactly one loaded
|
|
9
|
+
* model (ambiguous, missing, or unresolved by its native source) is never
|
|
10
|
+
* merged: it gets a card of its own marked unvalidated.
|
|
11
|
+
*/
|
|
12
|
+
import { type ElementResolution } from './identity.js';
|
|
13
|
+
import type { FindingElement, FindingSourceKind, ReviewFinding, ReviewModel, ReviewMessage } from './types.js';
|
|
14
|
+
export interface CardElement extends FindingElement {
|
|
15
|
+
/** Durable key when validated; null otherwise. */
|
|
16
|
+
key: string | null;
|
|
17
|
+
resolution: ElementResolution['state'];
|
|
18
|
+
/** Live express id in `resolvedModelId` when validated. */
|
|
19
|
+
expressId: number | null;
|
|
20
|
+
resolvedModelId: string | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `current`: an analysis observes it now. `not-evaluated`: only historical
|
|
24
|
+
* evidence, and no complete compatible run looked again. `resolution-candidate`:
|
|
25
|
+
* only historical evidence, every item re-examined by a complete current run
|
|
26
|
+
* and no longer observed; a human decides. `record`: only coordination records (BCF topics or saved grouping receipts).
|
|
27
|
+
*/
|
|
28
|
+
export type CardState = 'current' | 'not-evaluated' | 'resolution-candidate' | 'record';
|
|
29
|
+
export interface CoordinationCard<Message extends ReviewMessage = ReviewMessage> {
|
|
30
|
+
/** Durable identity: the sorted validated element keys, or the single finding for an unvalidated card. */
|
|
31
|
+
key: string;
|
|
32
|
+
identity: 'validated' | 'unvalidated';
|
|
33
|
+
elements: CardElement[];
|
|
34
|
+
findings: ReviewFinding<Message>[];
|
|
35
|
+
sources: FindingSourceKind[];
|
|
36
|
+
state: CardState;
|
|
37
|
+
/** BCF topic GUIDs among the findings. */
|
|
38
|
+
topics: string[];
|
|
39
|
+
/** Cards sharing at least one validated element with this one. */
|
|
40
|
+
related: string[];
|
|
41
|
+
disciplines: string[];
|
|
42
|
+
storeys: string[];
|
|
43
|
+
models: string[];
|
|
44
|
+
}
|
|
45
|
+
/** Each total counts a different thing; none is derived from another. */
|
|
46
|
+
export interface ReviewTotals {
|
|
47
|
+
uniqueElements: number;
|
|
48
|
+
unverifiedElements: number;
|
|
49
|
+
currentFindings: number;
|
|
50
|
+
historicalFindings: number;
|
|
51
|
+
cards: number;
|
|
52
|
+
topics: number;
|
|
53
|
+
}
|
|
54
|
+
export declare function buildCards<Message extends ReviewMessage>(findings: readonly ReviewFinding<Message>[], models: readonly ReviewModel[]): {
|
|
55
|
+
cards: CoordinationCard<Message>[];
|
|
56
|
+
totals: ReviewTotals;
|
|
57
|
+
};
|
|
58
|
+
/** Totals for the exact cards included in an action, independently of workspace filters. */
|
|
59
|
+
export declare function totalsForCards<Message extends ReviewMessage>(cards: readonly CoordinationCard<Message>[]): ReviewTotals;
|
|
60
|
+
//# sourceMappingURL=cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../src/review/cards.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/G,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,kDAAkD;IAClD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACvC,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,sBAAsB,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa;IAC7E,0GAA0G;IAC1G,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,WAAW,GAAG,aAAa,CAAC;IACtC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAgB,UAAU,CAAC,OAAO,SAAS,aAAa,EAAE,QAAQ,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG;IAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CA0CnM;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,OAAO,SAAS,aAAa,EAAE,KAAK,EAAE,SAAS,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,YAAY,CAYvH"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
* Coordination cards (P18, #6922): findings that refer to exactly the same
|
|
6
|
+
* set of validated elements form one card. Cards are not transitive clusters:
|
|
7
|
+
* a clash between A and B is its own card, and links to the card of findings
|
|
8
|
+
* on A alone as *related* instead of absorbing it, so no finding is ever in
|
|
9
|
+
* two cards and one busy element cannot swallow the whole model.
|
|
10
|
+
*
|
|
11
|
+
* A finding with any element that does not resolve to exactly one loaded
|
|
12
|
+
* model (ambiguous, missing, or unresolved by its native source) is never
|
|
13
|
+
* merged: it gets a card of its own marked unvalidated.
|
|
14
|
+
*/
|
|
15
|
+
import { elementKey, resolveElement } from './identity.js';
|
|
16
|
+
const ANALYSIS_CURRENT = new Set(['observed', 'new', 'persistent', 'changed']);
|
|
17
|
+
function cardState(findings) {
|
|
18
|
+
if (findings.some(finding => finding.source !== 'bcf' && ANALYSIS_CURRENT.has(finding.lifecycle)))
|
|
19
|
+
return 'current';
|
|
20
|
+
const historical = findings.filter(finding => finding.lifecycle !== 'record');
|
|
21
|
+
if (historical.length === 0)
|
|
22
|
+
return 'record';
|
|
23
|
+
// A partial or missing re-run leaves at least one item not evaluated, which blocks a resolution candidate.
|
|
24
|
+
return historical.every(finding => finding.lifecycle === 'no-longer-observed') ? 'resolution-candidate' : 'not-evaluated';
|
|
25
|
+
}
|
|
26
|
+
const STATE_ORDER = { current: 0, 'not-evaluated': 1, 'resolution-candidate': 2, record: 3 };
|
|
27
|
+
export function buildCards(findings, models) {
|
|
28
|
+
const groups = new Map();
|
|
29
|
+
for (const finding of findings) {
|
|
30
|
+
const elements = finding.elements.map((element) => {
|
|
31
|
+
const resolution = resolveElement(element, models);
|
|
32
|
+
if (resolution.state !== 'resolved') {
|
|
33
|
+
return { ...element, key: null, resolution: resolution.state, expressId: null, resolvedModelId: null };
|
|
34
|
+
}
|
|
35
|
+
return { ...element, modelName: resolution.modelName, key: elementKey(resolution.modelName, element.globalId),
|
|
36
|
+
resolution: 'resolved', expressId: resolution.expressId, resolvedModelId: resolution.modelId };
|
|
37
|
+
});
|
|
38
|
+
const validated = elements.length > 0 && elements.every(element => element.key !== null);
|
|
39
|
+
const key = validated ? [...new Set(elements.map(element => element.key))].sort().join('\n') : `finding:${finding.id}`;
|
|
40
|
+
const group = groups.get(key) ?? { identity: validated ? 'validated' : 'unvalidated', elements: new Map(), findings: [] };
|
|
41
|
+
for (const element of elements) {
|
|
42
|
+
const id = element.key ?? `${element.modelName ?? ''}\u001f${element.globalId}`;
|
|
43
|
+
if (!group.elements.has(id))
|
|
44
|
+
group.elements.set(id, element);
|
|
45
|
+
}
|
|
46
|
+
group.findings.push(finding);
|
|
47
|
+
groups.set(key, group);
|
|
48
|
+
}
|
|
49
|
+
const byElement = new Map();
|
|
50
|
+
for (const [key, group] of groups) {
|
|
51
|
+
if (group.identity !== 'validated')
|
|
52
|
+
continue;
|
|
53
|
+
for (const elementId of group.elements.keys())
|
|
54
|
+
byElement.set(elementId, [...(byElement.get(elementId) ?? []), key]);
|
|
55
|
+
}
|
|
56
|
+
const cards = [...groups].map(([key, group]) => {
|
|
57
|
+
const related = new Set();
|
|
58
|
+
if (group.identity === 'validated')
|
|
59
|
+
for (const elementId of group.elements.keys()) {
|
|
60
|
+
for (const other of byElement.get(elementId) ?? [])
|
|
61
|
+
if (other !== key)
|
|
62
|
+
related.add(other);
|
|
63
|
+
}
|
|
64
|
+
const elements = [...group.elements.values()];
|
|
65
|
+
return { key, identity: group.identity, elements, findings: group.findings,
|
|
66
|
+
sources: [...new Set(group.findings.map(finding => finding.source))], state: cardState(group.findings),
|
|
67
|
+
topics: [...new Set(group.findings.flatMap(finding => finding.evidence.kind === 'bcf' ? [finding.evidence.topicGuid] : []))],
|
|
68
|
+
related: [...related].sort(),
|
|
69
|
+
disciplines: [...new Set(group.findings.flatMap(finding => finding.disciplines))].sort(),
|
|
70
|
+
storeys: [...new Set(group.findings.flatMap(finding => finding.storeys))].sort(),
|
|
71
|
+
models: [...new Set(elements.flatMap(element => element.modelName ? [element.modelName] : []))].sort() };
|
|
72
|
+
}).sort((a, b) => STATE_ORDER[a.state] - STATE_ORDER[b.state] || b.sources.length - a.sources.length
|
|
73
|
+
|| b.findings.length - a.findings.length || (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
|
|
74
|
+
return { cards, totals: totalsForCards(cards) };
|
|
75
|
+
}
|
|
76
|
+
/** Totals for the exact cards included in an action, independently of workspace filters. */
|
|
77
|
+
export function totalsForCards(cards) {
|
|
78
|
+
const validatedElements = new Set(cards.flatMap(card => card.elements.flatMap(element => element.key ? [element.key] : [])));
|
|
79
|
+
const unverifiedElements = new Set(cards.flatMap(card => card.elements.filter(element => !element.key).map(element => `${element.modelName ?? ''}\u001f${element.globalId}`)));
|
|
80
|
+
const analysis = cards.flatMap(card => card.findings).filter(finding => finding.lifecycle !== 'record');
|
|
81
|
+
return {
|
|
82
|
+
uniqueElements: validatedElements.size,
|
|
83
|
+
unverifiedElements: unverifiedElements.size,
|
|
84
|
+
currentFindings: analysis.filter(finding => finding.run.temporal === 'current').length,
|
|
85
|
+
historicalFindings: analysis.filter(finding => finding.run.temporal === 'historical').length,
|
|
86
|
+
cards: cards.length,
|
|
87
|
+
topics: new Set(cards.flatMap(card => card.topics)).size,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.js","sourceRoot":"","sources":["../../src/review/cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disciplines.d.ts","sourceRoot":"","sources":["../../src/review/disciplines.ts"],"names":[],"mappings":"AAMA,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAGrE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
+
import { DISCIPLINES, matchesSelector } from '@ifc-lite/clash';
|
|
5
|
+
/** Native taxonomy hints, retaining overlapping and unknown discipline candidates. */
|
|
6
|
+
export function typeDisciplines(ifcType) {
|
|
7
|
+
return ifcType ? Object.values(DISCIPLINES).filter(discipline => matchesSelector(ifcType, discipline.selector))
|
|
8
|
+
.map(discipline => discipline.code) : [];
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=disciplines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disciplines.js","sourceRoot":"","sources":["../../src/review/disciplines.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE/D,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC5G,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Element identity validation against the loaded models (P18, #6922).
|
|
3
|
+
*
|
|
4
|
+
* A finding only joins a coordination card when every element it names
|
|
5
|
+
* resolves to exactly one loaded model that contains the GlobalId, under a
|
|
6
|
+
* model name no other loaded model shares. Revisions and federations reuse
|
|
7
|
+
* GlobalIds across models, so an element named without a model (a BCF
|
|
8
|
+
* component, a linked record) that occurs in two loaded models is ambiguous
|
|
9
|
+
* and is never merged on a guess.
|
|
10
|
+
*/
|
|
11
|
+
import type { FindingElement, ReviewModel } from './types.js';
|
|
12
|
+
export type ElementResolution = {
|
|
13
|
+
state: 'resolved';
|
|
14
|
+
modelId: string;
|
|
15
|
+
modelName: string;
|
|
16
|
+
expressId: number;
|
|
17
|
+
} | {
|
|
18
|
+
state: 'ambiguous';
|
|
19
|
+
modelNames: string[];
|
|
20
|
+
} | {
|
|
21
|
+
state: 'missing';
|
|
22
|
+
};
|
|
23
|
+
export declare function resolveElement(element: FindingElement, models: readonly ReviewModel[]): ElementResolution;
|
|
24
|
+
/** Legacy name-based display/navigation key, stable only while name and GlobalId stay unchanged.
|
|
25
|
+
* It does not prove source identity or revision equality across sessions. */
|
|
26
|
+
export declare function elementKey(modelName: string, globalId: string): string;
|
|
27
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/review/identity.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,iBAAiB,GACzB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzB,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,iBAAiB,CAyBzG;AAED;6EAC6E;AAC7E,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
export function resolveElement(element, models) {
|
|
5
|
+
// A native identity failure is authoritative; a GlobalId match must not overrule it.
|
|
6
|
+
if (element.nativeUnresolved === 'ambiguous')
|
|
7
|
+
return { state: 'ambiguous', modelNames: [] };
|
|
8
|
+
if (element.nativeUnresolved === 'unmatched')
|
|
9
|
+
return { state: 'missing' };
|
|
10
|
+
let candidates;
|
|
11
|
+
if (element.modelId !== null) {
|
|
12
|
+
const named = models.find(model => model.id === element.modelId);
|
|
13
|
+
candidates = named ? [named] : element.modelName !== null ? models.filter(model => model.name === element.modelName) : [];
|
|
14
|
+
}
|
|
15
|
+
else if (element.modelName !== null) {
|
|
16
|
+
candidates = models.filter(model => model.name === element.modelName);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
candidates = models;
|
|
20
|
+
}
|
|
21
|
+
const hits = candidates.flatMap(model => {
|
|
22
|
+
const expressId = model.expressIdOf(element.globalId);
|
|
23
|
+
return expressId > 0 ? [{ model, expressId }] : [];
|
|
24
|
+
});
|
|
25
|
+
if (hits.length === 0)
|
|
26
|
+
return { state: 'missing' };
|
|
27
|
+
if (hits.length > 1)
|
|
28
|
+
return { state: 'ambiguous', modelNames: hits.map(hit => hit.model.name) };
|
|
29
|
+
const [{ model, expressId }] = hits;
|
|
30
|
+
// Legacy name-based card keys cannot distinguish two loaded models with the same name.
|
|
31
|
+
// A name and GlobalId match does not prove the same source bytes or revision.
|
|
32
|
+
const sameName = models.filter(other => other.name === model.name);
|
|
33
|
+
if (sameName.length > 1)
|
|
34
|
+
return { state: 'ambiguous', modelNames: sameName.map(other => other.name) };
|
|
35
|
+
return { state: 'resolved', modelId: model.id, modelName: model.name, expressId };
|
|
36
|
+
}
|
|
37
|
+
/** Legacy name-based display/navigation key, stable only while name and GlobalId stay unchanged.
|
|
38
|
+
* It does not prove source identity or revision equality across sessions. */
|
|
39
|
+
export function elementKey(modelName, globalId) {
|
|
40
|
+
return `${modelName}\u001f${globalId}`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/review/identity.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAoB/D,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE,MAA8B;IACpF,qFAAqF;IACrF,IAAI,OAAO,CAAC,gBAAgB,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC5F,IAAI,OAAO,CAAC,gBAAgB,KAAK,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC1E,IAAI,UAAkC,CAAC;IACvC,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACjE,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5H,CAAC;SAAM,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACtC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACtC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IAChG,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC;IACpC,uFAAuF;IACvF,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IACtG,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;AACpF,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,QAAgB;IAC5D,OAAO,GAAG,SAAS,SAAS,QAAQ,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type CoordinationCard, type ReviewTotals } from './cards.js';
|
|
2
|
+
import type { FindingRun, FindingSource, FindingSourceKind, ReviewFinding, ReviewModel, ReviewMessage } from './types.js';
|
|
3
|
+
export interface ReviewSnapshot<Message extends ReviewMessage = ReviewMessage> {
|
|
4
|
+
runs: FindingRun<Message>[];
|
|
5
|
+
findings: ReviewFinding<Message>[];
|
|
6
|
+
cards: CoordinationCard<Message>[];
|
|
7
|
+
totals: ReviewTotals;
|
|
8
|
+
/** Failed source contributions remain explicit rather than a clean empty result. */
|
|
9
|
+
failed: Array<{
|
|
10
|
+
source: FindingSourceKind;
|
|
11
|
+
message: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare function snapshotFrom<Message extends ReviewMessage>(sources: readonly FindingSource<Message>[], models: readonly ReviewModel[], onFailure?: (source: FindingSourceKind, error: unknown) => void): ReviewSnapshot<Message>;
|
|
15
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/review/snapshot.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1H,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa;IAC3E,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5B,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,oFAAoF;IACpF,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED,wBAAgB,YAAY,CAAC,OAAO,SAAS,aAAa,EAAE,OAAO,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAgBhO"}
|