@ifc-lite/cli 0.33.1 → 0.36.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/README.md +9 -2
- package/dist/commands/anonymize.d.ts.map +1 -1
- package/dist/commands/anonymize.js +1 -0
- package/dist/commands/anonymize.js.map +1 -1
- package/dist/commands/check.d.ts +2 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +119 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/convert.d.ts.map +1 -1
- package/dist/commands/convert.js +28 -8
- package/dist/commands/convert.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +6 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delivery-checks-rules.d.ts +37 -0
- package/dist/commands/delivery-checks-rules.d.ts.map +1 -0
- package/dist/commands/delivery-checks-rules.js +76 -0
- package/dist/commands/delivery-checks-rules.js.map +1 -0
- package/dist/commands/delivery-checks.d.ts +12 -0
- package/dist/commands/delivery-checks.d.ts.map +1 -1
- package/dist/commands/delivery-checks.js +16 -5
- package/dist/commands/delivery-checks.js.map +1 -1
- package/dist/commands/delivery-recipe.d.ts +13 -2
- package/dist/commands/delivery-recipe.d.ts.map +1 -1
- package/dist/commands/delivery-recipe.js +29 -17
- package/dist/commands/delivery-recipe.js.map +1 -1
- package/dist/commands/delivery-report.d.ts +2 -2
- package/dist/commands/delivery-report.d.ts.map +1 -1
- package/dist/commands/delivery-report.js +14 -4
- package/dist/commands/delivery-report.js.map +1 -1
- package/dist/commands/delivery.d.ts.map +1 -1
- package/dist/commands/delivery.js +17 -5
- package/dist/commands/delivery.js.map +1 -1
- package/dist/commands/diff-content-io.d.ts +50 -0
- package/dist/commands/diff-content-io.d.ts.map +1 -0
- package/dist/commands/diff-content-io.js +104 -0
- package/dist/commands/diff-content-io.js.map +1 -0
- package/dist/commands/diff-content-report.d.ts +23 -0
- package/dist/commands/diff-content-report.d.ts.map +1 -0
- package/dist/commands/diff-content-report.js +67 -0
- package/dist/commands/diff-content-report.js.map +1 -0
- package/dist/commands/diff-content.d.ts +19 -0
- package/dist/commands/diff-content.d.ts.map +1 -1
- package/dist/commands/diff-content.js +120 -129
- package/dist/commands/diff-content.js.map +1 -1
- package/dist/commands/diff-engine.d.ts +32 -1
- package/dist/commands/diff-engine.d.ts.map +1 -1
- package/dist/commands/diff-engine.js +76 -15
- package/dist/commands/diff-engine.js.map +1 -1
- package/dist/commands/diff-geometry.d.ts +107 -0
- package/dist/commands/diff-geometry.d.ts.map +1 -0
- package/dist/commands/diff-geometry.js +262 -0
- package/dist/commands/diff-geometry.js.map +1 -0
- package/dist/commands/diff-lineage-io.d.ts +23 -0
- package/dist/commands/diff-lineage-io.d.ts.map +1 -0
- package/dist/commands/diff-lineage-io.js +119 -0
- package/dist/commands/diff-lineage-io.js.map +1 -0
- package/dist/commands/diff-scope.d.ts.map +1 -1
- package/dist/commands/diff-scope.js +2 -0
- package/dist/commands/diff-scope.js.map +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +36 -3
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +13 -0
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/ext.js +26 -10
- package/dist/commands/ext.js.map +1 -1
- package/dist/commands/extract-entities.d.ts.map +1 -1
- package/dist/commands/extract-entities.js +26 -8
- package/dist/commands/extract-entities.js.map +1 -1
- package/dist/commands/flow-tracking.d.ts +20 -0
- package/dist/commands/flow-tracking.d.ts.map +1 -0
- package/dist/commands/flow-tracking.js +86 -0
- package/dist/commands/flow-tracking.js.map +1 -0
- package/dist/commands/flow.d.ts +2 -0
- package/dist/commands/flow.d.ts.map +1 -0
- package/dist/commands/flow.js +229 -0
- package/dist/commands/flow.js.map +1 -0
- package/dist/commands/gym/channels.d.ts.map +1 -1
- package/dist/commands/gym/channels.js +10 -2
- package/dist/commands/gym/channels.js.map +1 -1
- package/dist/commands/gym.d.ts.map +1 -1
- package/dist/commands/gym.js +5 -1
- package/dist/commands/gym.js.map +1 -1
- package/dist/commands/ids.d.ts.map +1 -1
- package/dist/commands/ids.js +36 -3
- package/dist/commands/ids.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +20 -5
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/layer-publish.d.ts.map +1 -1
- package/dist/commands/layer-publish.js +6 -0
- package/dist/commands/layer-publish.js.map +1 -1
- package/dist/commands/lod.d.ts.map +1 -1
- package/dist/commands/lod.js +4 -1
- package/dist/commands/lod.js.map +1 -1
- package/dist/commands/mutate-step-record.d.ts +25 -1
- package/dist/commands/mutate-step-record.d.ts.map +1 -1
- package/dist/commands/mutate-step-record.js +17 -22
- package/dist/commands/mutate-step-record.js.map +1 -1
- package/dist/commands/mutate.d.ts +2 -1
- package/dist/commands/mutate.d.ts.map +1 -1
- package/dist/commands/mutate.js +27 -2
- package/dist/commands/mutate.js.map +1 -1
- package/dist/commands/rekey.d.ts +27 -0
- package/dist/commands/rekey.d.ts.map +1 -0
- package/dist/commands/rekey.js +213 -0
- package/dist/commands/rekey.js.map +1 -0
- package/dist/commands/simplify.d.ts.map +1 -1
- package/dist/commands/simplify.js +4 -1
- package/dist/commands/simplify.js.map +1 -1
- package/dist/commands/validate.d.ts +5 -14
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +13 -15
- package/dist/commands/validate.js.map +1 -1
- package/dist/headless-backend-store-authoring.d.ts +28 -0
- package/dist/headless-backend-store-authoring.d.ts.map +1 -0
- package/dist/headless-backend-store-authoring.js +34 -0
- package/dist/headless-backend-store-authoring.js.map +1 -0
- package/dist/headless-backend.d.ts +7 -0
- package/dist/headless-backend.d.ts.map +1 -1
- package/dist/headless-backend.js +78 -66
- package/dist/headless-backend.js.map +1 -1
- package/dist/help.d.ts +22 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +260 -0
- package/dist/help.js.map +1 -0
- package/dist/index.js +45 -183
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +2 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +30 -1
- package/dist/loader.js.map +1 -1
- package/dist/out-flag-commands.d.ts +12 -0
- package/dist/out-flag-commands.d.ts.map +1 -0
- package/dist/out-flag-commands.js +19 -0
- package/dist/out-flag-commands.js.map +1 -0
- package/dist/query-overlay-relations.d.ts +8 -28
- package/dist/query-overlay-relations.d.ts.map +1 -1
- package/dist/query-overlay-relations.js +68 -78
- package/dist/query-overlay-relations.js.map +1 -1
- package/dist/query-overlay.d.ts +5 -3
- package/dist/query-overlay.d.ts.map +1 -1
- package/dist/query-overlay.js +57 -16
- package/dist/query-overlay.js.map +1 -1
- package/package.json +26 -22
- package/dist/version.d.ts +0 -14
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -38
- package/dist/version.js.map +0 -1
|
@@ -8,10 +8,13 @@
|
|
|
8
8
|
* - `pass` — the check ran and found nothing to report.
|
|
9
9
|
* - `fail` — the check ran and found a violation.
|
|
10
10
|
* - `error` — the check could NOT be run (unreadable model, unreadable or
|
|
11
|
-
* unparsable IDS file, an IDS document declaring zero
|
|
12
|
-
* specifications
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* unparsable IDS/rules file, an IDS document declaring zero
|
|
12
|
+
* specifications, or — for `rules` — a `.rules.json` rule
|
|
13
|
+
* the `@ifc-lite/rules` engine itself could not evaluate,
|
|
14
|
+
* `SpecificationResult.error` set). An unevaluable check must
|
|
15
|
+
* never be folded into `pass`: a delivery report that
|
|
16
|
+
* silently skips a rule and still reads as clean is worse
|
|
17
|
+
* than no report.
|
|
15
18
|
*
|
|
16
19
|
* `loadModelForDelivery` deliberately does NOT reuse `loader.ts`'s
|
|
17
20
|
* `loadIfcFile`/`loadIfcBytes`: those call `process.exit(1)` directly on an
|
|
@@ -25,9 +28,11 @@
|
|
|
25
28
|
*/
|
|
26
29
|
import { readFile } from 'node:fs/promises';
|
|
27
30
|
import { createHash } from 'node:crypto';
|
|
31
|
+
import { basename } from 'node:path';
|
|
28
32
|
import { IfcParser, unwrapIfcZipView } from '@ifc-lite/parser';
|
|
29
33
|
import { createDataAccessor } from '@ifc-lite/ids/bridge';
|
|
30
34
|
import { IDSNamespace } from '@ifc-lite/sdk';
|
|
35
|
+
import { sourceModelIdentity } from '@ifc-lite/cache';
|
|
31
36
|
import { computeValidationIssues } from './validate.js';
|
|
32
37
|
/** Load one model file for delivery checking, never throwing and never exiting the process. */
|
|
33
38
|
export async function loadModelForDelivery(path) {
|
|
@@ -52,6 +57,7 @@ export async function loadModelForDelivery(path) {
|
|
|
52
57
|
return { path, error: 'is not a valid IFC/STEP file' };
|
|
53
58
|
}
|
|
54
59
|
const sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
60
|
+
const sourceFingerprint = sourceModelIdentity(basename(path), bytes);
|
|
55
61
|
const parser = new IfcParser();
|
|
56
62
|
const origLog = console.log;
|
|
57
63
|
const origWarn = console.warn;
|
|
@@ -61,7 +67,7 @@ export async function loadModelForDelivery(path) {
|
|
|
61
67
|
const arrayBuffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
62
68
|
const store = await parser.parseColumnar(arrayBuffer, {});
|
|
63
69
|
store.fileSize = bytes.byteLength;
|
|
64
|
-
return { path, sha256, store };
|
|
70
|
+
return { path, sha256, sourceFingerprint, store };
|
|
65
71
|
}
|
|
66
72
|
catch (err) {
|
|
67
73
|
return { path, error: `could not be parsed: ${err.message}` };
|
|
@@ -219,4 +225,9 @@ export async function runIdsCheck(modelPath, store, idsPath) {
|
|
|
219
225
|
...(status === 'error' ? { error: 'every specification was not-applicable — nothing was evaluated' } : {}),
|
|
220
226
|
};
|
|
221
227
|
}
|
|
228
|
+
// `RulesCheckResult` / `runRulesCheck` (the `.rules.json` check, #5138 PR
|
|
229
|
+
// 7b) live in `delivery-checks-rules.ts` — split out to stay under the
|
|
230
|
+
// module-size cap; re-exported here so existing `from './delivery-checks.js'`
|
|
231
|
+
// imports keep working.
|
|
232
|
+
export { runRulesCheck } from './delivery-checks-rules.js';
|
|
222
233
|
//# sourceMappingURL=delivery-checks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-checks.js","sourceRoot":"","sources":["../../src/commands/delivery-checks.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D
|
|
1
|
+
{"version":3,"file":"delivery-checks.js","sourceRoot":"","sources":["../../src/commands/delivery-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,26 @@ export interface DeliveryRecipe {
|
|
|
3
3
|
models: string[];
|
|
4
4
|
structural: boolean;
|
|
5
5
|
ids: string[];
|
|
6
|
+
/**
|
|
7
|
+
* Optional, and not only because a recipe file may omit it: making it
|
|
8
|
+
* required would break every existing consumer constructing a
|
|
9
|
+
* `DeliveryRecipe` literal (review on #5171). The loader defaults it to
|
|
10
|
+
* `[]`, so `ResolvedDeliveryRecipe` below still carries a total value.
|
|
11
|
+
*/
|
|
12
|
+
rules?: string[];
|
|
6
13
|
}
|
|
7
|
-
/** A recipe with every `models`/`ids` path resolved to an absolute path. */
|
|
8
|
-
export interface ResolvedDeliveryRecipe extends DeliveryRecipe {
|
|
14
|
+
/** A recipe with every `models`/`ids`/`rules` path resolved to an absolute path. */
|
|
15
|
+
export interface ResolvedDeliveryRecipe extends Omit<DeliveryRecipe, 'rules'> {
|
|
16
|
+
/** Declared `rules`, defaulted to `[]` when the recipe omitted the field. */
|
|
17
|
+
rules: string[];
|
|
9
18
|
/** Absolute path to the recipe file itself. */
|
|
10
19
|
recipePath: string;
|
|
11
20
|
/** `models`, resolved to absolute paths, in declared order. */
|
|
12
21
|
resolvedModels: string[];
|
|
13
22
|
/** `ids`, resolved to absolute paths, in declared order. */
|
|
14
23
|
resolvedIds: string[];
|
|
24
|
+
/** `rules`, resolved to absolute paths, in declared order. */
|
|
25
|
+
resolvedRules: string[];
|
|
15
26
|
}
|
|
16
27
|
/**
|
|
17
28
|
* Load and validate a delivery recipe, resolving every declared path
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-recipe.d.ts","sourceRoot":"","sources":["../../src/commands/delivery-recipe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delivery-recipe.d.ts","sourceRoot":"","sources":["../../src/commands/delivery-recipe.ts"],"names":[],"mappings":"AA0CA,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,oFAAoF;AACpF,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC;IAC3E,6EAA6E;IAC7E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAQD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA2EtF"}
|
|
@@ -6,35 +6,38 @@
|
|
|
6
6
|
*
|
|
7
7
|
* A recipe is a plain JSON file naming one or more model files and the
|
|
8
8
|
* checks to run against every one of them — `structural` (the same rules
|
|
9
|
-
* `ifc-lite validate` runs)
|
|
10
|
-
* validator `ifc-lite ids` runs)
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* `ifc-lite validate` runs), zero or more `ids` rule files (the same
|
|
10
|
+
* validator `ifc-lite ids` runs), and zero or more `rules` (`.rules.json`)
|
|
11
|
+
* information-validation rule sets (the same engine `ifc-lite check` runs,
|
|
12
|
+
* #5138 PR 7b). It exists so a delivery check is a single, versioned,
|
|
13
|
+
* reviewable artifact a team commits and re-runs, rather than a remembered
|
|
14
|
+
* shell invocation.
|
|
13
15
|
*
|
|
14
16
|
* ```json
|
|
15
17
|
* {
|
|
16
18
|
* "models": ["model.ifc"],
|
|
17
19
|
* "structural": true,
|
|
18
|
-
* "ids": ["door-rules.ids"]
|
|
20
|
+
* "ids": ["door-rules.ids"],
|
|
21
|
+
* "rules": ["fire-rating.rules.json"]
|
|
19
22
|
* }
|
|
20
23
|
* ```
|
|
21
24
|
*
|
|
22
|
-
* Every `models`/`ids` path is resolved relative to the DIRECTORY
|
|
23
|
-
* THE RECIPE FILE, not the process's current working directory —
|
|
24
|
-
* committed alongside its fixtures stays runnable from anywhere.
|
|
25
|
+
* Every `models`/`ids`/`rules` path is resolved relative to the DIRECTORY
|
|
26
|
+
* CONTAINING THE RECIPE FILE, not the process's current working directory —
|
|
27
|
+
* a recipe committed alongside its fixtures stays runnable from anywhere.
|
|
25
28
|
*
|
|
26
29
|
* A malformed recipe is a `fatal(...)`, matching every other saved-definition
|
|
27
30
|
* loader in this CLI (`schedule-spec.ts`): not valid JSON, not a JSON object,
|
|
28
31
|
* an unrecognised field, a field of the wrong type, an empty/missing
|
|
29
|
-
* `models` list, or declaring
|
|
30
|
-
* `
|
|
31
|
-
* meaningful delivery verdict, so it is rejected up
|
|
32
|
-
* silently reporting an empty "pass").
|
|
32
|
+
* `models` list, or declaring NONE of `structural: true`, a non-empty `ids`
|
|
33
|
+
* list, or a non-empty `rules` list (a recipe with zero applicable checks
|
|
34
|
+
* can never produce a meaningful delivery verdict, so it is rejected up
|
|
35
|
+
* front rather than silently reporting an empty "pass").
|
|
33
36
|
*/
|
|
34
37
|
import { readFile } from 'node:fs/promises';
|
|
35
38
|
import { dirname, resolve } from 'node:path';
|
|
36
39
|
import { fatal } from '../output.js';
|
|
37
|
-
const RECIPE_FIELDS = ['models', 'structural', 'ids'];
|
|
40
|
+
const RECIPE_FIELDS = ['models', 'structural', 'ids', 'rules'];
|
|
38
41
|
function isStringArray(value) {
|
|
39
42
|
return Array.isArray(value) && value.every(v => typeof v === 'string');
|
|
40
43
|
}
|
|
@@ -79,10 +82,14 @@ export async function loadDeliveryRecipe(path) {
|
|
|
79
82
|
fatal(`Recipe "${path}": "ids" must be an array of file paths.`);
|
|
80
83
|
}
|
|
81
84
|
const ids = obj.ids ?? [];
|
|
82
|
-
if (
|
|
83
|
-
fatal(`Recipe "${path}"
|
|
85
|
+
if ('rules' in obj && !isStringArray(obj.rules)) {
|
|
86
|
+
fatal(`Recipe "${path}": "rules" must be an array of file paths.`);
|
|
84
87
|
}
|
|
85
|
-
|
|
88
|
+
const rules = obj.rules ?? [];
|
|
89
|
+
if (!structural && ids.length === 0 && rules.length === 0) {
|
|
90
|
+
fatal(`Recipe "${path}" declares no applicable checks: set "structural": true and/or a non-empty "ids"/"rules" list. A zero-check recipe can never produce a delivery verdict.`);
|
|
91
|
+
}
|
|
92
|
+
// Duplicate model/ids/rules entries are rejected rather than silently
|
|
86
93
|
// deduplicated or run twice under one collapsed key: a repeated path is
|
|
87
94
|
// almost certainly a copy-paste mistake in the recipe, and either
|
|
88
95
|
// response (silent dedup, or a doubled report entry) would misrepresent
|
|
@@ -95,10 +102,15 @@ export async function loadDeliveryRecipe(path) {
|
|
|
95
102
|
if (dupIds.length > 0) {
|
|
96
103
|
fatal(`Recipe "${path}": "ids" lists the same path more than once: ${[...new Set(dupIds)].join(', ')}.`);
|
|
97
104
|
}
|
|
105
|
+
const dupRules = rules.filter((m, i) => rules.indexOf(m) !== i);
|
|
106
|
+
if (dupRules.length > 0) {
|
|
107
|
+
fatal(`Recipe "${path}": "rules" lists the same path more than once: ${[...new Set(dupRules)].join(', ')}.`);
|
|
108
|
+
}
|
|
98
109
|
const recipePath = resolve(path);
|
|
99
110
|
const baseDir = dirname(recipePath);
|
|
100
111
|
const resolvedModels = models.map(m => resolve(baseDir, m));
|
|
101
112
|
const resolvedIds = ids.map(i => resolve(baseDir, i));
|
|
102
|
-
|
|
113
|
+
const resolvedRules = rules.map(r => resolve(baseDir, r));
|
|
114
|
+
return { recipePath, models, structural, ids, rules, resolvedModels, resolvedIds, resolvedRules };
|
|
103
115
|
}
|
|
104
116
|
//# sourceMappingURL=delivery-recipe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-recipe.js","sourceRoot":"","sources":["../../src/commands/delivery-recipe.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D
|
|
1
|
+
{"version":3,"file":"delivery-recipe.js","sourceRoot":"","sources":["../../src/commands/delivery-recipe.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* differ between two runs, and neither depends on wall-clock time or
|
|
17
17
|
* iteration order).
|
|
18
18
|
*/
|
|
19
|
-
import type { StructuralCheckResult, IdsCheckResult } from './delivery-checks.js';
|
|
19
|
+
import type { StructuralCheckResult, IdsCheckResult, RulesCheckResult } from './delivery-checks.js';
|
|
20
20
|
import type { ResolvedDeliveryRecipe } from './delivery-recipe.js';
|
|
21
|
-
export type DeliveryCheckResult = StructuralCheckResult | IdsCheckResult;
|
|
21
|
+
export type DeliveryCheckResult = StructuralCheckResult | IdsCheckResult | RulesCheckResult;
|
|
22
22
|
export interface DeliveryModelEntry {
|
|
23
23
|
/** Path exactly as declared in the recipe (relative, for a readable report). */
|
|
24
24
|
path: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-report.d.ts","sourceRoot":"","sources":["../../src/commands/delivery-report.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery-report.d.ts","sourceRoot":"","sources":["../../src/commands/delivery-report.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AACjH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAE5F,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,iHAAiH;AACjH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAAE,EAC5B,MAAM,EAAE,mBAAmB,EAAE,GAC5B,cAAc,CAchB;AAwCD,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAoEjE"}
|
|
@@ -33,11 +33,21 @@ function describeCheck(check) {
|
|
|
33
33
|
return `${check.errorCount} error(s), ${check.warningCount} warning(s), ${check.infoCount} info`;
|
|
34
34
|
}
|
|
35
35
|
const parts = [];
|
|
36
|
-
if (check.
|
|
37
|
-
|
|
36
|
+
if (check.type === 'ids') {
|
|
37
|
+
if (check.totalSpecifications !== undefined) {
|
|
38
|
+
parts.push(`${check.passedSpecifications ?? 0}/${check.totalSpecifications} specification(s) passed`);
|
|
39
|
+
}
|
|
40
|
+
if (check.failedEntities !== undefined && check.totalEntities !== undefined) {
|
|
41
|
+
parts.push(`${check.failedEntities}/${check.totalEntities} entities failed`);
|
|
42
|
+
}
|
|
38
43
|
}
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
else {
|
|
45
|
+
if (check.totalRules !== undefined) {
|
|
46
|
+
parts.push(`${check.passedRules ?? 0}/${check.totalRules} rule(s) passed`);
|
|
47
|
+
}
|
|
48
|
+
if (check.erroredRules) {
|
|
49
|
+
parts.push(`${check.erroredRules} rule(s) unevaluable`);
|
|
50
|
+
}
|
|
41
51
|
}
|
|
42
52
|
if (check.error)
|
|
43
53
|
parts.push(check.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-report.js","sourceRoot":"","sources":["../../src/commands/delivery-report.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkD/D,iHAAiH;AACjH,MAAM,UAAU,mBAAmB,CACjC,MAA8B,EAC9B,OAAe,EACf,MAA4B,EAC5B,MAA6B;IAE7B,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAE3C,MAAM,OAAO,GAAoB,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAEhH,OAAO;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,UAAU;QACzB,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO,EAAE,MAAM;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,WAAW,CAAC,MAAmB;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,4BAA4B,MAAM,KAAK,KAAK,SAAS,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa,CAAC,KAA0B;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,YAAY,gBAAgB,KAAK,CAAC,SAAS,OAAO,CAAC;IACnG,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery-report.js","sourceRoot":"","sources":["../../src/commands/delivery-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/commands/delivery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/commands/delivery.ts"],"names":[],"mappings":"AA2CA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFnE"}
|
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Run a repeatable, reviewable model-delivery check from a saved recipe
|
|
8
8
|
* (see `delivery-recipe.ts`): structural validation (the same rules
|
|
9
|
-
* `ifc-lite validate` runs)
|
|
10
|
-
*
|
|
9
|
+
* `ifc-lite validate` runs), IDS validation (the same validator `ifc-lite
|
|
10
|
+
* ids` runs), and/or `.rules.json` information-validation rule sets (the
|
|
11
|
+
* same engine `ifc-lite check` runs, #5138 PR 7b) — any combination,
|
|
12
|
+
* against one or more model files, in one invocation.
|
|
11
13
|
*
|
|
12
14
|
* Every check reports one of `pass` / `fail` / `error` — never folded
|
|
13
15
|
* together (see `delivery-checks.ts`). The overall verdict is `pass` only
|
|
@@ -27,14 +29,14 @@
|
|
|
27
29
|
* contract documented in `delivery-report.ts`).
|
|
28
30
|
*/
|
|
29
31
|
import { getFlag, hasFlag, fatal, printJson, writeOutput } from '../output.js';
|
|
30
|
-
import {
|
|
32
|
+
import { readPackageVersion } from '@ifc-lite/data';
|
|
31
33
|
import { fileURLToPath } from 'node:url';
|
|
32
34
|
import { dirname, join, relative } from 'node:path';
|
|
33
35
|
import { loadDeliveryRecipe } from './delivery-recipe.js';
|
|
34
|
-
import { loadModelForDelivery, runStructuralCheck, runIdsCheck } from './delivery-checks.js';
|
|
36
|
+
import { loadModelForDelivery, runStructuralCheck, runIdsCheck, runRulesCheck } from './delivery-checks.js';
|
|
35
37
|
import { buildDeliveryReport, renderDeliveryHtml } from './delivery-report.js';
|
|
36
38
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
37
|
-
const CLI_VERSION =
|
|
39
|
+
const CLI_VERSION = readPackageVersion(join(__dirname, '..', '..', 'package.json'));
|
|
38
40
|
export async function deliveryCommand(args) {
|
|
39
41
|
const recipePath = args.find(a => !a.startsWith('-'));
|
|
40
42
|
if (!recipePath) {
|
|
@@ -73,6 +75,12 @@ export async function deliveryCommand(args) {
|
|
|
73
75
|
error: `model ${loaded.error}`,
|
|
74
76
|
});
|
|
75
77
|
}
|
|
78
|
+
for (const rulesDeclared of recipe.rules) {
|
|
79
|
+
checks.push({
|
|
80
|
+
type: 'rules', model: declaredPath, source: rulesDeclared, status: 'error',
|
|
81
|
+
error: `model ${loaded.error}`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
76
84
|
continue;
|
|
77
85
|
}
|
|
78
86
|
models.push({ path: declaredPath, sha256: loaded.sha256 });
|
|
@@ -83,6 +91,10 @@ export async function deliveryCommand(args) {
|
|
|
83
91
|
const result = await runIdsCheck(declaredPath, loaded.store, recipe.resolvedIds[j]);
|
|
84
92
|
checks.push({ ...result, source: recipe.ids[j] });
|
|
85
93
|
}
|
|
94
|
+
for (let j = 0; j < recipe.resolvedRules.length; j++) {
|
|
95
|
+
const result = await runRulesCheck(declaredPath, loaded.store, recipe.resolvedRules[j], loaded.sourceFingerprint);
|
|
96
|
+
checks.push({ ...result, source: recipe.rules[j] });
|
|
97
|
+
}
|
|
86
98
|
}
|
|
87
99
|
const report = buildDeliveryReport(recipe, CLI_VERSION, models, checks);
|
|
88
100
|
if (htmlPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/commands/delivery.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/commands/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refuse to run at all if `--identity-out` names one of the two input models.
|
|
3
|
+
*
|
|
4
|
+
* The sidecar is a JSON document. Writing it over an IFC file destroys the
|
|
5
|
+
* user's model, and a mistyped or shell-completed path is all it takes — the
|
|
6
|
+
* two arguments right before it are IFC paths. So this is checked first, and
|
|
7
|
+
* the command exits without reading, comparing, or writing anything.
|
|
8
|
+
*
|
|
9
|
+
* Two independent tests, because a path string is not a file:
|
|
10
|
+
*
|
|
11
|
+
* 1. Resolved paths are equal. Catches `./v1.ifc` vs `v1.ifc` vs `sub/../v1.ifc`
|
|
12
|
+
* with no filesystem access, and is the whole answer on a platform where
|
|
13
|
+
* `stat` reports no usable inode.
|
|
14
|
+
* 2. The output already exists AND is the same file as an input, by device +
|
|
15
|
+
* inode. This is the exhaustive test: it catches a symlink, a hard link, a
|
|
16
|
+
* bind mount, and `V1.IFC` on a case-insensitive filesystem — every way two
|
|
17
|
+
* different strings can name one file. It is also sufficient on its own for
|
|
18
|
+
* the destructive case, because a path that does not resolve to an existing
|
|
19
|
+
* file cannot be overwriting an input: the inputs must exist to be read.
|
|
20
|
+
*
|
|
21
|
+
* `--identity-in` and `--identity-out` naming the SAME sidecar is not checked
|
|
22
|
+
* here, because that is the carry-forward workflow this feature is built around
|
|
23
|
+
* (read the accepted claims, write back the ones that still held).
|
|
24
|
+
*/
|
|
25
|
+
export declare function refuseOverwritingAnInput(options: {
|
|
26
|
+
basePath: string;
|
|
27
|
+
headPath: string;
|
|
28
|
+
identityOut?: string;
|
|
29
|
+
lineageOut?: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Read one of the two input models, reporting a missing or unreadable path the
|
|
33
|
+
* way the rest of the command reports problems rather than throwing a raw
|
|
34
|
+
* `ENOENT` stack at the user — the same treatment `readVerifiedSidecar` gives
|
|
35
|
+
* the sidecar.
|
|
36
|
+
*/
|
|
37
|
+
export declare function readModel(path: string): Promise<Uint8Array>;
|
|
38
|
+
/**
|
|
39
|
+
* Unwrap a possible `.ifcZIP` container into its STEP bytes, reporting a
|
|
40
|
+
* corrupt zip the way the rest of the command reports problems (see
|
|
41
|
+
* {@link readModel}) rather than throwing a raw error. Ordinary `.ifc` bytes
|
|
42
|
+
* pass through unchanged (cheap magic-byte check — `unwrapIfcZipView`).
|
|
43
|
+
*
|
|
44
|
+
* Called once per file and the result reused by both the parser and (when
|
|
45
|
+
* `--geometry` runs) the wasm mesh pass — passing the ORIGINAL, possibly
|
|
46
|
+
* zipped bytes to the mesh pass would feed it a zip container instead of STEP
|
|
47
|
+
* text (issue #4956 review).
|
|
48
|
+
*/
|
|
49
|
+
export declare function unwrapModel(bytes: Uint8Array, label: string): Promise<Uint8Array>;
|
|
50
|
+
//# sourceMappingURL=diff-content-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-content-io.d.ts","sourceRoot":"","sources":["../../src/commands/diff-content-io.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,wBAAwB,CAAC,OAAO,EAAE;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhB;AAgBD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAMjE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAMvF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
* File-level I/O for `ifc-lite diff --by-content`: reading the two input
|
|
6
|
+
* models (and unwrapping a possible `.ifcZIP` container), and refusing to run
|
|
7
|
+
* at all when an output path would overwrite one of them. Split out of
|
|
8
|
+
* `diff-content.ts` for size.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
11
|
+
import { resolve } from 'node:path';
|
|
12
|
+
import { unwrapIfcZipView } from '@ifc-lite/parser';
|
|
13
|
+
import { fatal } from '../output.js';
|
|
14
|
+
/**
|
|
15
|
+
* Refuse to run at all if `--identity-out` names one of the two input models.
|
|
16
|
+
*
|
|
17
|
+
* The sidecar is a JSON document. Writing it over an IFC file destroys the
|
|
18
|
+
* user's model, and a mistyped or shell-completed path is all it takes — the
|
|
19
|
+
* two arguments right before it are IFC paths. So this is checked first, and
|
|
20
|
+
* the command exits without reading, comparing, or writing anything.
|
|
21
|
+
*
|
|
22
|
+
* Two independent tests, because a path string is not a file:
|
|
23
|
+
*
|
|
24
|
+
* 1. Resolved paths are equal. Catches `./v1.ifc` vs `v1.ifc` vs `sub/../v1.ifc`
|
|
25
|
+
* with no filesystem access, and is the whole answer on a platform where
|
|
26
|
+
* `stat` reports no usable inode.
|
|
27
|
+
* 2. The output already exists AND is the same file as an input, by device +
|
|
28
|
+
* inode. This is the exhaustive test: it catches a symlink, a hard link, a
|
|
29
|
+
* bind mount, and `V1.IFC` on a case-insensitive filesystem — every way two
|
|
30
|
+
* different strings can name one file. It is also sufficient on its own for
|
|
31
|
+
* the destructive case, because a path that does not resolve to an existing
|
|
32
|
+
* file cannot be overwriting an input: the inputs must exist to be read.
|
|
33
|
+
*
|
|
34
|
+
* `--identity-in` and `--identity-out` naming the SAME sidecar is not checked
|
|
35
|
+
* here, because that is the carry-forward workflow this feature is built around
|
|
36
|
+
* (read the accepted claims, write back the ones that still held).
|
|
37
|
+
*/
|
|
38
|
+
export async function refuseOverwritingAnInput(options) {
|
|
39
|
+
for (const [flag, target] of [
|
|
40
|
+
['--identity-out', options.identityOut],
|
|
41
|
+
['--lineage-out', options.lineageOut],
|
|
42
|
+
]) {
|
|
43
|
+
if (target === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
const out = resolve(target);
|
|
46
|
+
const outStat = await statOrUndefined(target);
|
|
47
|
+
for (const [label, input] of [
|
|
48
|
+
['base model', options.basePath],
|
|
49
|
+
['head model', options.headPath],
|
|
50
|
+
]) {
|
|
51
|
+
if (resolve(input) !== out && !isSameFile(outStat, await statOrUndefined(input)))
|
|
52
|
+
continue;
|
|
53
|
+
fatal(`${flag} ${target} is the ${label} (${input}). ` +
|
|
54
|
+
'Writing there would overwrite the input file.');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function statOrUndefined(path) {
|
|
59
|
+
// A missing or unreadable path cannot be an input file being overwritten;
|
|
60
|
+
// reading the models is what reports it, with its own message.
|
|
61
|
+
try {
|
|
62
|
+
return await stat(path);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function isSameFile(a, b) {
|
|
69
|
+
return a !== undefined && b !== undefined && a.dev === b.dev && a.ino === b.ino;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read one of the two input models, reporting a missing or unreadable path the
|
|
73
|
+
* way the rest of the command reports problems rather than throwing a raw
|
|
74
|
+
* `ENOENT` stack at the user — the same treatment `readVerifiedSidecar` gives
|
|
75
|
+
* the sidecar.
|
|
76
|
+
*/
|
|
77
|
+
export async function readModel(path) {
|
|
78
|
+
try {
|
|
79
|
+
return await readFile(path);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return fatal(`Cannot read ${path}: ${error.message}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Unwrap a possible `.ifcZIP` container into its STEP bytes, reporting a
|
|
87
|
+
* corrupt zip the way the rest of the command reports problems (see
|
|
88
|
+
* {@link readModel}) rather than throwing a raw error. Ordinary `.ifc` bytes
|
|
89
|
+
* pass through unchanged (cheap magic-byte check — `unwrapIfcZipView`).
|
|
90
|
+
*
|
|
91
|
+
* Called once per file and the result reused by both the parser and (when
|
|
92
|
+
* `--geometry` runs) the wasm mesh pass — passing the ORIGINAL, possibly
|
|
93
|
+
* zipped bytes to the mesh pass would feed it a zip container instead of STEP
|
|
94
|
+
* text (issue #4956 review).
|
|
95
|
+
*/
|
|
96
|
+
export async function unwrapModel(bytes, label) {
|
|
97
|
+
try {
|
|
98
|
+
return new Uint8Array(await unwrapIfcZipView(bytes));
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return fatal(`Cannot read ${label}: ${error.message}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=diff-content-io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-content-io.js","sourceRoot":"","sources":["../../src/commands/diff-content-io.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAK9C;IACC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI;QAC3B,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC;QACvC,CAAC,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC;KAC7B,EAAE,CAAC;QACX,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;YAC3B,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC;YAChC,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC;SACxB,EAAE,CAAC;YACX,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;gBAAE,SAAS;YAC3F,KAAK,CACH,GAAG,IAAI,IAAI,MAAM,WAAW,KAAK,KAAK,KAAK,KAAK;gBAC9C,+CAA+C,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,0EAA0E;IAC1E,+DAA+D;IAC/D,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAoB,EAAE,CAAoB;IAC5D,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC,eAAe,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAiB,EAAE,KAAa;IAChE,IAAI,CAAC;QACH,OAAO,IAAI,UAAU,CAAC,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC,eAAe,KAAK,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** The human-readable report of `ifc-lite diff --by-content`; the JSON form
|
|
2
|
+
* lives with the command in `diff-content.ts`. Split out for size. */
|
|
3
|
+
import type { IdentityMapEntry, LineageEntry, ModelDiff } from '@ifc-lite/diff';
|
|
4
|
+
import type { DiffRef } from './diff-engine.js';
|
|
5
|
+
export declare function printReport(report: {
|
|
6
|
+
basePath: string;
|
|
7
|
+
headPath: string;
|
|
8
|
+
diff: ModelDiff<DiffRef>;
|
|
9
|
+
appliedCount: number;
|
|
10
|
+
ignoredCount: number;
|
|
11
|
+
identityIn?: string;
|
|
12
|
+
written?: {
|
|
13
|
+
path: string;
|
|
14
|
+
entries: IdentityMapEntry[];
|
|
15
|
+
};
|
|
16
|
+
lineageIn?: string;
|
|
17
|
+
lineageWritten?: {
|
|
18
|
+
path: string;
|
|
19
|
+
entries: LineageEntry[];
|
|
20
|
+
};
|
|
21
|
+
keyProperty?: string;
|
|
22
|
+
}): void;
|
|
23
|
+
//# sourceMappingURL=diff-content-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-content-report.d.ts","sourceRoot":"","sources":["../../src/commands/diff-content-report.ts"],"names":[],"mappings":"AAIA;uEACuE;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,IAAI,CAsEP"}
|