@ifc-lite/ifcx 2.2.2 → 2.3.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/dist/bake.d.ts +34 -0
- package/dist/bake.d.ts.map +1 -0
- package/dist/bake.js +92 -0
- package/dist/bake.js.map +1 -0
- package/dist/canonical.d.ts +22 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +141 -0
- package/dist/canonical.js.map +1 -0
- package/dist/composition.d.ts +2 -0
- package/dist/composition.d.ts.map +1 -1
- package/dist/composition.js +18 -3
- package/dist/composition.js.map +1 -1
- package/dist/federated-composition.d.ts.map +1 -1
- package/dist/federated-composition.js +14 -2
- package/dist/federated-composition.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -16
- package/dist/index.js.map +1 -1
- package/dist/property-extractor.d.ts +12 -0
- package/dist/property-extractor.d.ts.map +1 -1
- package/dist/property-extractor.js +46 -6
- package/dist/property-extractor.js.map +1 -1
- package/dist/provenance.d.ts +122 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +145 -0
- package/dist/provenance.js.map +1 -0
- package/dist/tombstones.d.ts +35 -0
- package/dist/tombstones.d.ts.map +1 -0
- package/dist/tombstones.js +64 -0
- package/dist/tombstones.js.map +1 -0
- package/dist/types.d.ts +62 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -1
- package/package.json +5 -4
package/dist/bake.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bake: materialize a layer stack into a single tombstone-free IFCX
|
|
3
|
+
* document for tools unaware of the `ifclite::` namespace.
|
|
4
|
+
*
|
|
5
|
+
* Tools that don't understand deletion overlays would compose tombstoned
|
|
6
|
+
* entities as present; baking resolves the whole stack (including
|
|
7
|
+
* tombstones and inherits) and emits one self-contained document.
|
|
8
|
+
*
|
|
9
|
+
* Spec: docs/architecture/layer-prs/02-layer-format.md §2.3,
|
|
10
|
+
* 09-cli.md (`ifc layer bake`).
|
|
11
|
+
*/
|
|
12
|
+
import type { IfcxFile } from './types.js';
|
|
13
|
+
export interface BakeOptions {
|
|
14
|
+
/** Header id for the baked document (default: generated). */
|
|
15
|
+
id?: string;
|
|
16
|
+
/** Author recorded in the baked header. */
|
|
17
|
+
author?: string;
|
|
18
|
+
/** Timestamp recorded in the baked header (default: now, ISO 8601). */
|
|
19
|
+
timestamp?: string;
|
|
20
|
+
/** dataVersion recorded in the baked header. */
|
|
21
|
+
dataVersion?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compose an ordered layer stack (weakest first, strongest last — the same
|
|
25
|
+
* order `composeIfcx` resolves "later wins") and materialize the result as
|
|
26
|
+
* a flat, tombstone-free IFCX document.
|
|
27
|
+
*
|
|
28
|
+
* The output carries no `ifclite::` *bookkeeping*: deletion overlays are
|
|
29
|
+
* resolved (deleted subtrees are gone) and derived-cache markers are
|
|
30
|
+
* dropped, while persistent data carriers (classifications, materials,
|
|
31
|
+
* geometry refs) survive. Inherits are resolved into plain attributes.
|
|
32
|
+
*/
|
|
33
|
+
export declare function bakeLayers(layers: IfcxFile[], options?: BakeOptions): IfcxFile;
|
|
34
|
+
//# sourceMappingURL=bake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake.d.ts","sourceRoot":"","sources":["../src/bake.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAgB,QAAQ,EAAoC,MAAM,YAAY,CAAC;AAa3F,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,QAAQ,CAiClF"}
|
package/dist/bake.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
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 { IFCLITE_ATTR } from './types.js';
|
|
5
|
+
import { composeIfcx } from './composition.js';
|
|
6
|
+
/**
|
|
7
|
+
* `ifclite::` keys that are layer bookkeeping (resolved or meaningless
|
|
8
|
+
* once baked) as opposed to data carriers: classifications, materials,
|
|
9
|
+
* and geometry refs (#1031) are persistent content and must survive a
|
|
10
|
+
* bake or the round-trip back through `seedFromIfcx` silently loses
|
|
11
|
+
* those structured branches.
|
|
12
|
+
*/
|
|
13
|
+
const BAKE_STRIPPED_PREFIXES = [IFCLITE_ATTR.DELETED, IFCLITE_ATTR.DERIVED];
|
|
14
|
+
/**
|
|
15
|
+
* Compose an ordered layer stack (weakest first, strongest last — the same
|
|
16
|
+
* order `composeIfcx` resolves "later wins") and materialize the result as
|
|
17
|
+
* a flat, tombstone-free IFCX document.
|
|
18
|
+
*
|
|
19
|
+
* The output carries no `ifclite::` *bookkeeping*: deletion overlays are
|
|
20
|
+
* resolved (deleted subtrees are gone) and derived-cache markers are
|
|
21
|
+
* dropped, while persistent data carriers (classifications, materials,
|
|
22
|
+
* geometry refs) survive. Inherits are resolved into plain attributes.
|
|
23
|
+
*/
|
|
24
|
+
export function bakeLayers(layers, options = {}) {
|
|
25
|
+
if (layers.length === 0) {
|
|
26
|
+
throw new Error('bakeLayers requires at least one layer');
|
|
27
|
+
}
|
|
28
|
+
// Concatenating data arrays weakest-first matches composeIfcx's
|
|
29
|
+
// later-wins layer semantics, and composeIfcx applies tombstones.
|
|
30
|
+
const merged = {
|
|
31
|
+
header: layers[layers.length - 1].header,
|
|
32
|
+
imports: dedupeImports(layers),
|
|
33
|
+
schemas: mergeSchemas(layers),
|
|
34
|
+
data: layers.flatMap((layer) => layer.data),
|
|
35
|
+
};
|
|
36
|
+
const composed = composeIfcx(merged);
|
|
37
|
+
const data = [];
|
|
38
|
+
for (const node of composed.values()) {
|
|
39
|
+
data.push(materializeNode(node));
|
|
40
|
+
}
|
|
41
|
+
data.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
42
|
+
return {
|
|
43
|
+
header: {
|
|
44
|
+
id: options.id ?? `baked-${Date.now().toString(36)}`,
|
|
45
|
+
ifcxVersion: layers[0].header.ifcxVersion,
|
|
46
|
+
dataVersion: options.dataVersion ?? layers[layers.length - 1].header.dataVersion,
|
|
47
|
+
author: options.author ?? 'ifc-lite bake',
|
|
48
|
+
timestamp: options.timestamp ?? new Date().toISOString(),
|
|
49
|
+
},
|
|
50
|
+
imports: dedupeImports(layers),
|
|
51
|
+
schemas: mergeSchemas(layers),
|
|
52
|
+
data,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function materializeNode(node) {
|
|
56
|
+
const out = { path: node.path };
|
|
57
|
+
if (node.children.size > 0) {
|
|
58
|
+
const children = {};
|
|
59
|
+
for (const [name, child] of node.children) {
|
|
60
|
+
children[name] = child.path;
|
|
61
|
+
}
|
|
62
|
+
out.children = children;
|
|
63
|
+
}
|
|
64
|
+
const attributes = {};
|
|
65
|
+
for (const [key, value] of node.attributes) {
|
|
66
|
+
if (BAKE_STRIPPED_PREFIXES.some((prefix) => key.startsWith(prefix)))
|
|
67
|
+
continue;
|
|
68
|
+
attributes[key] = value;
|
|
69
|
+
}
|
|
70
|
+
if (Object.keys(attributes).length > 0) {
|
|
71
|
+
out.attributes = attributes;
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
function dedupeImports(layers) {
|
|
76
|
+
const byUri = new Map();
|
|
77
|
+
for (const layer of layers) {
|
|
78
|
+
for (const imp of layer.imports) {
|
|
79
|
+
if (!byUri.has(imp.uri))
|
|
80
|
+
byUri.set(imp.uri, imp);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return [...byUri.values()];
|
|
84
|
+
}
|
|
85
|
+
function mergeSchemas(layers) {
|
|
86
|
+
const schemas = {};
|
|
87
|
+
for (const layer of layers) {
|
|
88
|
+
Object.assign(schemas, layer.schemas);
|
|
89
|
+
}
|
|
90
|
+
return schemas;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=bake.js.map
|
package/dist/bake.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake.js","sourceRoot":"","sources":["../src/bake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IfcxFile } from './types.js';
|
|
2
|
+
export declare function canonicalStringify(value: unknown, depth?: number): string;
|
|
3
|
+
/**
|
|
4
|
+
* Produce the canonical byte form of a layer document.
|
|
5
|
+
*
|
|
6
|
+
* Derived (cache) content is stripped: nodes flagged `ifclite::derived:
|
|
7
|
+
* true` are dropped entirely, and `ifclite::derived*` attributes are
|
|
8
|
+
* dropped from remaining nodes. The provenance manifest participates in
|
|
9
|
+
* the hash minus its `signatures` field.
|
|
10
|
+
*/
|
|
11
|
+
export declare function canonicalizeLayer(file: IfcxFile): Uint8Array;
|
|
12
|
+
/** Content-address a published layer: `blake3:<hex>` over canonical bytes. */
|
|
13
|
+
export declare function computeLayerId(file: IfcxFile): string;
|
|
14
|
+
/**
|
|
15
|
+
* A stack hash is blake3 over the ordered list of layer ids — the identity
|
|
16
|
+
* of a composed state. Refs (`main`, `design-option-B`) are named mutable
|
|
17
|
+
* pointers to stack hashes.
|
|
18
|
+
*/
|
|
19
|
+
export declare function computeStackHash(layerIds: readonly string[]): string;
|
|
20
|
+
/** blake3 digest helper for related artifacts (instruction texts, reports). */
|
|
21
|
+
export declare function blake3Digest(content: string | Uint8Array): string;
|
|
22
|
+
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,YAAY,CAAC;AAiBrD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CAgCpE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAgC5D;AAoBD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAGpE;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAGjE"}
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
* Canonical serialization and content addressing for published layers.
|
|
6
|
+
*
|
|
7
|
+
* `layerId = blake3(canonical_bytes)` where canonical bytes are produced
|
|
8
|
+
* by:
|
|
9
|
+
* 1. stripping derived (`ifclite::derived`) cache content,
|
|
10
|
+
* 2. sorting all object keys lexicographically and node arrays by path
|
|
11
|
+
* (stable: same-path opinion order is semantic and preserved),
|
|
12
|
+
* 3. normalizing strings to NFC and numbers to their shortest round-trip
|
|
13
|
+
* representation, with no insignificant whitespace,
|
|
14
|
+
* 4. including the provenance manifest *except* its `signatures` field
|
|
15
|
+
* (signatures sign the id, so they cannot be inside it).
|
|
16
|
+
*
|
|
17
|
+
* Spec: docs/architecture/layer-prs/02-layer-format.md §2.4.
|
|
18
|
+
*/
|
|
19
|
+
import { blake3 } from '@noble/hashes/blake3.js';
|
|
20
|
+
import { bytesToHex } from '@noble/hashes/utils.js';
|
|
21
|
+
import { IFCLITE_ATTR, PROVENANCE_KEY } from './types.js';
|
|
22
|
+
const textEncoder = new TextEncoder();
|
|
23
|
+
/**
|
|
24
|
+
* Deterministic JSON serialization: lexicographically sorted object keys,
|
|
25
|
+
* NFC-normalized strings, shortest round-trip numbers (JS `JSON.stringify`
|
|
26
|
+
* already emits shortest round-trip for finite doubles), no whitespace.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Recursion guard: legitimate IFCX layers nest a handful of levels; a
|
|
30
|
+
* deliberately deep JSON body (which survives `JSON.parse`) must produce a
|
|
31
|
+
* clean error, not a stack-overflow `RangeError` mid-hash.
|
|
32
|
+
*/
|
|
33
|
+
const MAX_CANONICAL_DEPTH = 512;
|
|
34
|
+
export function canonicalStringify(value, depth = 0) {
|
|
35
|
+
if (depth > MAX_CANONICAL_DEPTH) {
|
|
36
|
+
throw new Error(`Value nested deeper than ${MAX_CANONICAL_DEPTH} levels is not canonicalizable`);
|
|
37
|
+
}
|
|
38
|
+
if (value === null || value === undefined)
|
|
39
|
+
return 'null';
|
|
40
|
+
switch (typeof value) {
|
|
41
|
+
case 'string':
|
|
42
|
+
return JSON.stringify(value.normalize('NFC'));
|
|
43
|
+
case 'number':
|
|
44
|
+
if (!Number.isFinite(value)) {
|
|
45
|
+
throw new Error(`Non-finite number is not canonicalizable: ${value}`);
|
|
46
|
+
}
|
|
47
|
+
// Normalize negative zero so -0 and 0 hash identically.
|
|
48
|
+
return JSON.stringify(value === 0 ? 0 : value);
|
|
49
|
+
case 'boolean':
|
|
50
|
+
return value ? 'true' : 'false';
|
|
51
|
+
case 'object': {
|
|
52
|
+
if (Array.isArray(value)) {
|
|
53
|
+
return `[${value.map((item) => canonicalStringify(item, depth + 1)).join(',')}]`;
|
|
54
|
+
}
|
|
55
|
+
const record = value;
|
|
56
|
+
const keys = Object.keys(record)
|
|
57
|
+
.filter((key) => record[key] !== undefined)
|
|
58
|
+
.sort();
|
|
59
|
+
const parts = keys.map((key) => `${JSON.stringify(key.normalize('NFC'))}:${canonicalStringify(record[key], depth + 1)}`);
|
|
60
|
+
return `{${parts.join(',')}}`;
|
|
61
|
+
}
|
|
62
|
+
default:
|
|
63
|
+
throw new Error(`Value of type ${typeof value} is not canonicalizable`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Produce the canonical byte form of a layer document.
|
|
68
|
+
*
|
|
69
|
+
* Derived (cache) content is stripped: nodes flagged `ifclite::derived:
|
|
70
|
+
* true` are dropped entirely, and `ifclite::derived*` attributes are
|
|
71
|
+
* dropped from remaining nodes. The provenance manifest participates in
|
|
72
|
+
* the hash minus its `signatures` field.
|
|
73
|
+
*/
|
|
74
|
+
export function canonicalizeLayer(file) {
|
|
75
|
+
const data = file.data
|
|
76
|
+
.filter((node) => node.attributes?.[IFCLITE_ATTR.DERIVED] !== true)
|
|
77
|
+
.map((node) => stripDerivedAttributes(node))
|
|
78
|
+
.map((node) => ({ node, text: canonicalStringify(node) }));
|
|
79
|
+
// Stable sort by path only. The relative order of same-path nodes is
|
|
80
|
+
// semantic (composition applies them in array order, later opinions
|
|
81
|
+
// win), so it must survive into the canonical bytes — two layers whose
|
|
82
|
+
// same-path opinions are ordered differently compose to different
|
|
83
|
+
// states and must hash to different ids.
|
|
84
|
+
data.sort((a, b) => (a.node.path < b.node.path ? -1 : a.node.path > b.node.path ? 1 : 0));
|
|
85
|
+
const header = { ...file.header };
|
|
86
|
+
// header.id is where tools record the content address itself — it is
|
|
87
|
+
// self-referential and excluded, so `computeLayerId(file)` can be
|
|
88
|
+
// verified against `file.header.id` after publishing.
|
|
89
|
+
delete header.id;
|
|
90
|
+
const manifest = header[PROVENANCE_KEY];
|
|
91
|
+
if (manifest && typeof manifest === 'object') {
|
|
92
|
+
const cleaned = { ...manifest };
|
|
93
|
+
delete cleaned.signatures;
|
|
94
|
+
header[PROVENANCE_KEY] = cleaned;
|
|
95
|
+
}
|
|
96
|
+
const canonical = `{"data":[${data.map((entry) => entry.text).join(',')}],` +
|
|
97
|
+
`"header":${canonicalStringify(header)},` +
|
|
98
|
+
`"imports":${canonicalStringify(file.imports)},` +
|
|
99
|
+
`"schemas":${canonicalStringify(file.schemas)}}`;
|
|
100
|
+
return textEncoder.encode(canonical);
|
|
101
|
+
}
|
|
102
|
+
function stripDerivedAttributes(node) {
|
|
103
|
+
if (!node.attributes)
|
|
104
|
+
return node;
|
|
105
|
+
const hasDerived = Object.keys(node.attributes).some((key) => key.startsWith(IFCLITE_ATTR.DERIVED));
|
|
106
|
+
if (!hasDerived)
|
|
107
|
+
return node;
|
|
108
|
+
const attributes = {};
|
|
109
|
+
for (const [key, value] of Object.entries(node.attributes)) {
|
|
110
|
+
if (key.startsWith(IFCLITE_ATTR.DERIVED))
|
|
111
|
+
continue;
|
|
112
|
+
attributes[key] = value;
|
|
113
|
+
}
|
|
114
|
+
const out = { path: node.path };
|
|
115
|
+
if (node.children)
|
|
116
|
+
out.children = node.children;
|
|
117
|
+
if (node.inherits)
|
|
118
|
+
out.inherits = node.inherits;
|
|
119
|
+
if (Object.keys(attributes).length > 0)
|
|
120
|
+
out.attributes = attributes;
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
/** Content-address a published layer: `blake3:<hex>` over canonical bytes. */
|
|
124
|
+
export function computeLayerId(file) {
|
|
125
|
+
return `blake3:${bytesToHex(blake3(canonicalizeLayer(file)))}`;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* A stack hash is blake3 over the ordered list of layer ids — the identity
|
|
129
|
+
* of a composed state. Refs (`main`, `design-option-B`) are named mutable
|
|
130
|
+
* pointers to stack hashes.
|
|
131
|
+
*/
|
|
132
|
+
export function computeStackHash(layerIds) {
|
|
133
|
+
const joined = layerIds.join('\n');
|
|
134
|
+
return `blake3:${bytesToHex(blake3(textEncoder.encode(joined)))}`;
|
|
135
|
+
}
|
|
136
|
+
/** blake3 digest helper for related artifacts (instruction texts, reports). */
|
|
137
|
+
export function blake3Digest(content) {
|
|
138
|
+
const bytes = typeof content === 'string' ? textEncoder.encode(content.normalize('NFC')) : content;
|
|
139
|
+
return `blake3:${bytesToHex(blake3(bytes))}`;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
|
package/dist/composition.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ import type { IfcxFile, ComposedNode } from './types.js';
|
|
|
11
11
|
* 2. Merge attributes (later wins - layer semantics)
|
|
12
12
|
* 3. Resolve inherits references (type-level data)
|
|
13
13
|
* 4. Build parent-child tree from children references
|
|
14
|
+
* 5. Apply tombstones: nodes whose strongest `ifclite::deleted` opinion is
|
|
15
|
+
* true are removed together with their subtrees (see tombstones.ts)
|
|
14
16
|
*/
|
|
15
17
|
export declare function composeIfcx(file: IfcxFile): Map<string, ComposedNode>;
|
|
16
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAY,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAY,YAAY,EAAE,MAAM,YAAY,CAAC;AAUnE;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAyBrE;AA0HD;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,YAAY,EAAE,CAmB7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,EAAE,CAkBjE"}
|
package/dist/composition.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
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
|
+
import { applyTombstones } from './tombstones.js';
|
|
4
5
|
/**
|
|
5
6
|
* Compose IFCX nodes into a flattened tree structure.
|
|
6
7
|
*
|
|
@@ -9,6 +10,8 @@
|
|
|
9
10
|
* 2. Merge attributes (later wins - layer semantics)
|
|
10
11
|
* 3. Resolve inherits references (type-level data)
|
|
11
12
|
* 4. Build parent-child tree from children references
|
|
13
|
+
* 5. Apply tombstones: nodes whose strongest `ifclite::deleted` opinion is
|
|
14
|
+
* true are removed together with their subtrees (see tombstones.ts)
|
|
12
15
|
*/
|
|
13
16
|
export function composeIfcx(file) {
|
|
14
17
|
// Phase 1: Group nodes by path
|
|
@@ -30,7 +33,8 @@ export function composeIfcx(file) {
|
|
|
30
33
|
composeNode(path, preComposed, composed, new Set());
|
|
31
34
|
}
|
|
32
35
|
}
|
|
33
|
-
|
|
36
|
+
// Phase 4: Apply deletion overlays
|
|
37
|
+
return applyTombstones(composed);
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* Flatten multiple nodes with the same path into a single pre-composed node.
|
|
@@ -68,6 +72,10 @@ function flattenNodes(path, nodes) {
|
|
|
68
72
|
}
|
|
69
73
|
}
|
|
70
74
|
if (node.attributes) {
|
|
75
|
+
// Later wins, INCLUDING null: a null is a removal opinion and must
|
|
76
|
+
// survive flattening as a mask — composeNode resolves it after
|
|
77
|
+
// inheritance so removals also shadow inherited values (#1031). A
|
|
78
|
+
// later non-null opinion overwrites the mask (resurrect).
|
|
71
79
|
Object.assign(result.attributes, node.attributes);
|
|
72
80
|
}
|
|
73
81
|
}
|
|
@@ -114,9 +122,16 @@ function composeNode(path, preComposed, composed, visited) {
|
|
|
114
122
|
}
|
|
115
123
|
}
|
|
116
124
|
}
|
|
117
|
-
// Apply own attributes (override inherited)
|
|
125
|
+
// Apply own attributes (override inherited). Null opinions are removal
|
|
126
|
+
// masks: they delete the (possibly inherited) attribute and never
|
|
127
|
+
// appear in composed output.
|
|
118
128
|
for (const [key, value] of Object.entries(pre.attributes)) {
|
|
119
|
-
|
|
129
|
+
if (value === null) {
|
|
130
|
+
node.attributes.delete(key);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
node.attributes.set(key, value);
|
|
134
|
+
}
|
|
120
135
|
}
|
|
121
136
|
// Resolve children
|
|
122
137
|
for (const [name, childPath] of Object.entries(pre.children)) {
|
package/dist/composition.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASlD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,+BAA+B;IAC/B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,4CAA4C;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACxC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,KAAiB;IACnD,MAAM,MAAM,GAAoB;QAC9B,IAAI;QACJ,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,iDAAiD;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,+BAA+B;oBAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,qCAAqC;oBACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,mEAAmE;YACnE,+DAA+D;YAC/D,kEAAkE;YAClE,0DAA0D;YAC1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,IAAY,EACZ,WAAyC,EACzC,QAAmC,EACnC,OAAoB;IAEpB,oBAAoB;IACpB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAC7B,CAAC;IAED,6EAA6E;IAC7E,mFAAmF;IACnF,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QAChF,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAiB;QACzB,IAAI;QACJ,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,QAAQ,EAAE,IAAI,GAAG,EAAE;KACpB,CAAC;IAEF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACpF,gDAAgD;YAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;gBAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,0BAA0B;YAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,kEAAkE;IAClE,6BAA6B;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAmC;IAC3D,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,0BAA0B;IAC1B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,MAAM,WAAW,GAAmB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,SAAS,QAAQ,CAAC,CAAe;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO;QAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEpB,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federated-composition.d.ts","sourceRoot":"","sources":["../src/federated-composition.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAa,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"federated-composition.d.ts","sourceRoot":"","sources":["../src/federated-composition.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAa,MAAM,oBAAoB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAgBD;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,YAAY;IAC3D,mDAAmD;IACnD,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,+CAA+C;IAC/C,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,6BAA6B;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC/C,6BAA6B;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,iBAAiB;IACjB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,cAAmB,GAC3B,0BAA0B,CAuG5B"}
|
|
@@ -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 { PathIndex } from './path-resolver.js';
|
|
5
|
+
import { applyTombstones } from './tombstones.js';
|
|
5
6
|
/**
|
|
6
7
|
* Compose multiple IFCX layers into a unified stage.
|
|
7
8
|
*
|
|
@@ -72,6 +73,11 @@ export function composeFederated(layerStack, options = {}) {
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
onProgress?.('tree', 100);
|
|
76
|
+
// Phase 4: Apply deletion overlays. Attribute merging already resolved
|
|
77
|
+
// the strongest `ifclite::deleted` opinion per path; here tombstoned
|
|
78
|
+
// nodes and their subtrees are removed (stronger layers can resurrect
|
|
79
|
+
// with `ifclite::deleted: false`).
|
|
80
|
+
applyTombstones(composed);
|
|
75
81
|
// Find roots
|
|
76
82
|
const roots = findRoots(composed);
|
|
77
83
|
return {
|
|
@@ -131,7 +137,11 @@ function mergeNodesForPath(path, layers) {
|
|
|
131
137
|
}
|
|
132
138
|
}
|
|
133
139
|
}
|
|
134
|
-
// Merge attributes
|
|
140
|
+
// Merge attributes. Null opinions are removal masks that must stay
|
|
141
|
+
// in pre.attributes: resolveInheritance only copies inherited
|
|
142
|
+
// values for ABSENT keys, so the mask shadows them; composeNode
|
|
143
|
+
// drops masks from the final output (#1031). A later non-null
|
|
144
|
+
// opinion overwrites the mask (resurrect).
|
|
135
145
|
if (node.attributes) {
|
|
136
146
|
for (const [key, value] of Object.entries(node.attributes)) {
|
|
137
147
|
result.attributes[key] = value;
|
|
@@ -235,8 +245,10 @@ function composeNode(path, preComposed, composed, visiting, layers, pathIndex) {
|
|
|
235
245
|
contributingLayers: new Set(pre?.definedInLayers || []),
|
|
236
246
|
};
|
|
237
247
|
if (pre) {
|
|
238
|
-
// Copy attributes
|
|
248
|
+
// Copy attributes (null removal masks resolved here — never emitted)
|
|
239
249
|
for (const [key, value] of Object.entries(pre.attributes)) {
|
|
250
|
+
if (value === null)
|
|
251
|
+
continue;
|
|
240
252
|
node.attributes.set(key, value);
|
|
241
253
|
// Track source
|
|
242
254
|
const sourceLayerId = pre.attributeSources.get(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federated-composition.js","sourceRoot":"","sources":["../src/federated-composition.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAiB/D,OAAO,EAAE,SAAS,EAAa,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"federated-composition.js","sourceRoot":"","sources":["../src/federated-composition.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ import { LayerStack } from './layer-stack.js';
|
|
|
6
6
|
import { PathIndex } from './path-resolver.js';
|
|
7
7
|
export * from './types.js';
|
|
8
8
|
export { composeIfcx, findRoots, getDescendants } from './composition.js';
|
|
9
|
+
export { applyTombstones, isTombstoned } from './tombstones.js';
|
|
10
|
+
export { bakeLayers, type BakeOptions } from './bake.js';
|
|
11
|
+
export { canonicalStringify, canonicalizeLayer, computeLayerId, computeStackHash, blake3Digest, } from './canonical.js';
|
|
12
|
+
export { PROVENANCE_VERSION, createProvenanceManifest, getProvenance, setProvenance, validateProvenance, type AuthorKind, type ProvenanceAuthor, type ProvenanceBase, type ProvenanceCheck, type ProvenanceInit, type ProvenanceManifest, type ProvenanceSignature, type IdentityMapEntry, type MergeRecord, type MergeResolution, type WaivedCheck, } from './provenance.js';
|
|
9
13
|
export { extractEntities } from './entity-extractor.js';
|
|
10
14
|
export { extractProperties, isQuantityProperty } from './property-extractor.js';
|
|
11
15
|
export { extractGeometry, type MeshData } from './geometry-extractor.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|