@instruments/taxonomy 0.2.0 → 0.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/README.md +16 -60
- package/dist/chunk-4ECRPD2I.js +7508 -0
- package/dist/{chunk-XLUE3IC2.js → chunk-FCMCKNQF.js} +11 -2
- package/dist/chunk-WIRA24HM.js +42 -0
- package/dist/crosswalks/designshop.d.ts +3 -11
- package/dist/crosswalks/designshop.js +125 -43
- package/dist/crosswalks/materialgraph.d.ts +41 -0
- package/dist/crosswalks/materialgraph.js +178 -0
- package/dist/crosswalks/miu.d.ts +2 -1
- package/dist/crosswalks/miu.js +9 -3
- package/dist/estate/index.d.ts +1 -1
- package/dist/estate/index.js +644 -551
- package/dist/index.d.ts +83 -6
- package/dist/index.js +103 -6104
- package/dist/mapping-pvHk5VjC.d.ts +31 -0
- package/dist/{match-BDI6Evro.d.ts → match-CWzTEuL-.d.ts} +37 -1
- package/dist/taste.d.ts +12 -1
- package/dist/taste.js +1 -1
- package/package.json +5 -1
- package/dist/chunk-C2ZPDTOU.js +0 -151
|
@@ -63,7 +63,12 @@ var PORTABLE_ASSERTION_TEST_VECTORS = [
|
|
|
63
63
|
canonical: {
|
|
64
64
|
id: "bundle:constitutive%3Arequirement.slip-resistance",
|
|
65
65
|
kind: "all-of",
|
|
66
|
-
members: [
|
|
66
|
+
members: [
|
|
67
|
+
{
|
|
68
|
+
assertion: "requirement.slip-resistance",
|
|
69
|
+
role: "constitutive"
|
|
70
|
+
}
|
|
71
|
+
],
|
|
67
72
|
serialization: "constitutive:requirement.slip-resistance"
|
|
68
73
|
},
|
|
69
74
|
crosswalkVersion: "designshop-2026-08-25.1",
|
|
@@ -74,7 +79,11 @@ var PORTABLE_ASSERTION_TEST_VECTORS = [
|
|
|
74
79
|
},
|
|
75
80
|
polarity: "positive",
|
|
76
81
|
role: "requirement",
|
|
77
|
-
scope: {
|
|
82
|
+
scope: {
|
|
83
|
+
kind: "surface",
|
|
84
|
+
roomId: "room:lobby",
|
|
85
|
+
surfaceId: "surface:floor"
|
|
86
|
+
}
|
|
78
87
|
},
|
|
79
88
|
expected: {
|
|
80
89
|
actorId: FIXTURE_ACTOR_ID,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/crosswalks/mapping.ts
|
|
2
|
+
var resolved = (...assertions) => ({
|
|
3
|
+
assertions: assertions.map((assertion) => ({
|
|
4
|
+
assertion,
|
|
5
|
+
role: "constitutive"
|
|
6
|
+
})),
|
|
7
|
+
match: "exact",
|
|
8
|
+
status: "resolved"
|
|
9
|
+
});
|
|
10
|
+
var constitutive = (assertion) => ({
|
|
11
|
+
assertions: [{ assertion, role: "constitutive" }],
|
|
12
|
+
match: "exact",
|
|
13
|
+
status: "resolved"
|
|
14
|
+
});
|
|
15
|
+
var approximates = (match, note, ...assertions) => ({
|
|
16
|
+
assertions: assertions.map((assertion) => ({
|
|
17
|
+
assertion,
|
|
18
|
+
role: "constitutive"
|
|
19
|
+
})),
|
|
20
|
+
match,
|
|
21
|
+
note,
|
|
22
|
+
status: "resolved"
|
|
23
|
+
});
|
|
24
|
+
var ambiguous = (match, ...assertions) => ({
|
|
25
|
+
alternatives: assertions.map((assertion) => [
|
|
26
|
+
{ assertion, role: "constitutive" }
|
|
27
|
+
]),
|
|
28
|
+
match,
|
|
29
|
+
status: "ambiguous"
|
|
30
|
+
});
|
|
31
|
+
var declined = (reason) => ({
|
|
32
|
+
reason,
|
|
33
|
+
status: "declined"
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export {
|
|
37
|
+
resolved,
|
|
38
|
+
constitutive,
|
|
39
|
+
approximates,
|
|
40
|
+
ambiguous,
|
|
41
|
+
declined
|
|
42
|
+
};
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
import { CanonicalisationInput, CanonicalisationVerdict } from '../taste.js';
|
|
2
|
-
import {
|
|
2
|
+
import { C as CrosswalkMapping } from '../mapping-pvHk5VjC.js';
|
|
3
|
+
import '../match-CWzTEuL-.js';
|
|
3
4
|
|
|
4
5
|
declare const DESIGNSHOP_CROSSWALK_VERSION: "designshop-2026-08-25.1";
|
|
5
6
|
declare const DESIGNSHOP_SOURCE_SYSTEM: "designshop";
|
|
6
7
|
declare const DESIGNSHOP_SOURCE_FIELDS: readonly ["product_category", "material", "pattern", "finish", "format", "construction", "scheme_style", "product_style", "mood", "space", "requirement"];
|
|
7
8
|
type DesignShopSourceField = (typeof DESIGNSHOP_SOURCE_FIELDS)[number];
|
|
8
|
-
type Mapping =
|
|
9
|
-
status: "resolved";
|
|
10
|
-
assertions: readonly BundleMemberInput[];
|
|
11
|
-
} | {
|
|
12
|
-
status: "ambiguous";
|
|
13
|
-
alternatives: readonly (readonly BundleMemberInput[])[];
|
|
14
|
-
} | {
|
|
15
|
-
status: "declined";
|
|
16
|
-
reason: string;
|
|
17
|
-
};
|
|
9
|
+
type Mapping = CrosswalkMapping;
|
|
18
10
|
/**
|
|
19
11
|
* Source-specific rows. Source fields are deliberately retained: DesignShop's `material:Mosaic`
|
|
20
12
|
* resolves to a format, and pretending the source field was already canonical would preserve its
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ambiguous,
|
|
3
|
+
approximates,
|
|
4
|
+
constitutive,
|
|
5
|
+
declined,
|
|
6
|
+
resolved
|
|
7
|
+
} from "../chunk-WIRA24HM.js";
|
|
1
8
|
import {
|
|
2
9
|
TAXONOMY_SNAPSHOT_VERSION
|
|
3
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-FCMCKNQF.js";
|
|
4
11
|
import {
|
|
5
12
|
defineAlternatives,
|
|
6
13
|
defineBundle
|
|
7
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-4ECRPD2I.js";
|
|
8
15
|
|
|
9
16
|
// src/crosswalks/designshop.ts
|
|
10
17
|
var DESIGNSHOP_CROSSWALK_VERSION = "designshop-2026-08-25.1";
|
|
@@ -22,18 +29,6 @@ var DESIGNSHOP_SOURCE_FIELDS = [
|
|
|
22
29
|
"space",
|
|
23
30
|
"requirement"
|
|
24
31
|
];
|
|
25
|
-
var resolved = (...assertions) => ({
|
|
26
|
-
assertions: assertions.map((assertion) => ({ assertion, role: "constitutive" })),
|
|
27
|
-
status: "resolved"
|
|
28
|
-
});
|
|
29
|
-
var constitutive = (assertion) => ({
|
|
30
|
-
assertions: [{ assertion, role: "constitutive" }],
|
|
31
|
-
status: "resolved"
|
|
32
|
-
});
|
|
33
|
-
var ambiguous = (...assertions) => ({
|
|
34
|
-
alternatives: assertions.map((assertion) => [{ assertion, role: "constitutive" }]),
|
|
35
|
-
status: "ambiguous"
|
|
36
|
-
});
|
|
37
32
|
var DESIGNSHOP_CROSSWALK = {
|
|
38
33
|
/* oxlint-disable sonarjs/no-duplicate-string -- canonical ids repeat across deliberately
|
|
39
34
|
independent source rows; hiding them behind aliases would make the crosswalk harder to audit. */
|
|
@@ -43,7 +38,9 @@ var DESIGNSHOP_CROSSWALK = {
|
|
|
43
38
|
Handcrafted: constitutive("construction.handcrafted"),
|
|
44
39
|
Handmade: constitutive("construction.handmade"),
|
|
45
40
|
Handwoven: constitutive("construction.handwoven"),
|
|
46
|
-
"High Pressure Laminate": constitutive(
|
|
41
|
+
"High Pressure Laminate": constitutive(
|
|
42
|
+
"construction.high-pressure-laminate"
|
|
43
|
+
),
|
|
47
44
|
Laminated: constitutive("construction.laminated"),
|
|
48
45
|
"Loop Pile": constitutive("construction.loop-pile"),
|
|
49
46
|
"Luxury Vinyl": constitutive("construction.luxury-vinyl"),
|
|
@@ -51,14 +48,19 @@ var DESIGNSHOP_CROSSWALK = {
|
|
|
51
48
|
"Pre-Cast / Molded": constitutive("construction.precast-moulded"),
|
|
52
49
|
Printed: constitutive("construction.printed"),
|
|
53
50
|
"Red Clay Body": constitutive("construction.red-clay-body"),
|
|
54
|
-
"Rigid Core Luxury Vinyl": constitutive(
|
|
51
|
+
"Rigid Core Luxury Vinyl": constitutive(
|
|
52
|
+
"construction.rigid-core-luxury-vinyl"
|
|
53
|
+
),
|
|
55
54
|
Sintered: constitutive("construction.sintered"),
|
|
56
55
|
"Through Body": constitutive("construction.through-body"),
|
|
57
56
|
Woven: constitutive("construction.woven")
|
|
58
57
|
},
|
|
59
58
|
finish: {
|
|
60
59
|
Glazed: constitutive("finish.glazed"),
|
|
61
|
-
|
|
60
|
+
// `finish.gloss` became the top rung of the sheen ladder when FINISH split into
|
|
61
|
+
// treatment/sheen/texture. In trade use "Gloss" IS the top rung — matte, eggshell,
|
|
62
|
+
// satin, semi-gloss, gloss — so this resolves rather than approximates.
|
|
63
|
+
Gloss: constitutive("finish.high-gloss"),
|
|
62
64
|
Honed: constitutive("finish.honed"),
|
|
63
65
|
Matte: constitutive("finish.matte"),
|
|
64
66
|
Natural: constitutive("finish.natural"),
|
|
@@ -78,16 +80,30 @@ var DESIGNSHOP_CROSSWALK = {
|
|
|
78
80
|
"Wide Plank": constitutive("format.wide-plank")
|
|
79
81
|
},
|
|
80
82
|
material: {
|
|
81
|
-
"Carpet Tiles": resolved(
|
|
83
|
+
"Carpet Tiles": resolved(
|
|
84
|
+
"product-category.carpet-and-rug",
|
|
85
|
+
"format.modular"
|
|
86
|
+
),
|
|
82
87
|
Ceramic: constitutive("material.ceramic"),
|
|
83
|
-
"Engineered & Composite":
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
"Engineered & Composite": approximates(
|
|
89
|
+
"close",
|
|
90
|
+
"A two-word source value onto one canonical term. `material.composite` defines itself as an engineered material of two or more bound constituents, so it covers both halves - but the source names them separately and the canon does not, which is a substitution that holds in most contexts and not all.",
|
|
91
|
+
"material.composite"
|
|
92
|
+
),
|
|
93
|
+
Interior: declined(
|
|
94
|
+
"A catalogue location masquerading as a material value."
|
|
95
|
+
),
|
|
88
96
|
Laminate: constitutive("material.laminate"),
|
|
89
|
-
Mosaic:
|
|
90
|
-
|
|
97
|
+
Mosaic: approximates(
|
|
98
|
+
"broad",
|
|
99
|
+
"Every mosaic is supplied as repeatable units; most modular things are not mosaics. The canon is broader than the source, and the tesserae themselves have no canonical term.",
|
|
100
|
+
"format.modular"
|
|
101
|
+
),
|
|
102
|
+
Natural: approximates(
|
|
103
|
+
"narrow",
|
|
104
|
+
"The source says natural and the canon answers natural FIBRE. Stone and clay are natural materials this row cannot reach, so the canonical term is narrower than the source value.",
|
|
105
|
+
"material.natural-fibre"
|
|
106
|
+
),
|
|
91
107
|
Paper: constitutive("material.paper"),
|
|
92
108
|
Porcelain: constitutive("material.porcelain"),
|
|
93
109
|
"Solid Surface": constitutive("material.solid-surface"),
|
|
@@ -104,7 +120,11 @@ var DESIGNSHOP_CROSSWALK = {
|
|
|
104
120
|
"Abstract / Organic": constitutive("pattern.abstract-organic"),
|
|
105
121
|
"Animal Print": constitutive("pattern.animal-print"),
|
|
106
122
|
Botanical: constitutive("pattern.botanical"),
|
|
107
|
-
"Brocade / Damask / Moire":
|
|
123
|
+
"Brocade / Damask / Moire": approximates(
|
|
124
|
+
"narrow",
|
|
125
|
+
"Three named motifs onto one. Moire is a watered interference figure and not a damask at all; the canon carries one member of the source's set.",
|
|
126
|
+
"pattern.damask"
|
|
127
|
+
),
|
|
108
128
|
"Concrete Effect": constitutive("pattern.concrete-effect"),
|
|
109
129
|
"Cultural Heritage": constitutive("pattern.cultural-heritage"),
|
|
110
130
|
Geometric: constitutive("pattern.geometric"),
|
|
@@ -112,13 +132,25 @@ var DESIGNSHOP_CROSSWALK = {
|
|
|
112
132
|
"Leather Effect": constitutive("pattern.leather-effect"),
|
|
113
133
|
Marbleized: constitutive("pattern.marbleised"),
|
|
114
134
|
"Metal Effect": constitutive("pattern.metal-effect"),
|
|
115
|
-
Natural:
|
|
135
|
+
Natural: approximates(
|
|
136
|
+
"close",
|
|
137
|
+
"`natural_motif` is the canon reading of a bare `Natural` in a pattern vocabulary, and the two substitute in most retrieval - but the source word is broad enough to have meant an undecorated natural material, which is `pattern.plain` plus a material claim.",
|
|
138
|
+
"pattern.natural-motif"
|
|
139
|
+
),
|
|
116
140
|
Novelty: constitutive("pattern.novelty"),
|
|
117
|
-
"Plaid / Check / Houndstooth":
|
|
141
|
+
"Plaid / Check / Houndstooth": approximates(
|
|
142
|
+
"narrow",
|
|
143
|
+
"Houndstooth is a broken twill figure, not the orthogonal crossing bands `plaid_check` defines. Two of the source's three members land; the third does not.",
|
|
144
|
+
"pattern.plaid-check"
|
|
145
|
+
),
|
|
118
146
|
Scenic: constitutive("pattern.scenic"),
|
|
119
147
|
Solid: constitutive("pattern.plain"),
|
|
120
148
|
"Stone Effect": constitutive("pattern.stone-effect"),
|
|
121
|
-
"Strie / Ombre / Gradient":
|
|
149
|
+
"Strie / Ombre / Gradient": approximates(
|
|
150
|
+
"narrow",
|
|
151
|
+
"Strie is fine irregular striation - a stripe reading, not a transition - so the canon carries the ombre and gradient members of this set and not the first.",
|
|
152
|
+
"pattern.gradient"
|
|
153
|
+
),
|
|
122
154
|
Stripe: constitutive("pattern.stripe"),
|
|
123
155
|
Texture: constitutive("pattern.texture"),
|
|
124
156
|
Toile: constitutive("pattern.toile"),
|
|
@@ -135,18 +167,36 @@ var DESIGNSHOP_CROSSWALK = {
|
|
|
135
167
|
},
|
|
136
168
|
product_style: {
|
|
137
169
|
"Art Deco": constitutive("style.art-deco"),
|
|
138
|
-
"Classic/ Traditional":
|
|
170
|
+
"Classic/ Traditional": approximates(
|
|
171
|
+
"close",
|
|
172
|
+
"Classic and Traditional are one prototype category in trade use and two words in the source. `style.traditional` substitutes for both without carrying the pair.",
|
|
173
|
+
"style.traditional"
|
|
174
|
+
),
|
|
139
175
|
Coastal: constitutive("evokes(place.landscape.coastal)"),
|
|
140
176
|
Contemporary: constitutive("style.contemporary"),
|
|
141
|
-
"Country/ Cottage":
|
|
177
|
+
"Country/ Cottage": approximates(
|
|
178
|
+
"close",
|
|
179
|
+
"A compound reading: the cottage reference plus the traditional idiom. It carries most of what the source meant and not the rural setting, which is a place claim the source implies and never states.",
|
|
180
|
+
"evokes(typology.cottage)",
|
|
181
|
+
"style.traditional"
|
|
182
|
+
),
|
|
142
183
|
Eclectic: constitutive("style.eclectic"),
|
|
143
|
-
Farmhouse:
|
|
184
|
+
Farmhouse: approximates(
|
|
185
|
+
"close",
|
|
186
|
+
"The farmhouse reference plus the rustic idiom. Together they read as the source does in most retrieval; neither half nor the pair carries the agricultural building itself.",
|
|
187
|
+
"evokes(typology.farmhouse)",
|
|
188
|
+
"style.rustic"
|
|
189
|
+
),
|
|
144
190
|
Industrial: constitutive("style.industrial"),
|
|
145
191
|
"Mid-Century Modern": constitutive("style.mid-century-modern"),
|
|
146
192
|
Minimalist: constitutive("style.minimalism"),
|
|
147
|
-
Modern: ambiguous("style.modernism", "style.contemporary"),
|
|
193
|
+
Modern: ambiguous("close", "style.modernism", "style.contemporary"),
|
|
148
194
|
Rustic: constitutive("style.rustic"),
|
|
149
|
-
Scandinavian:
|
|
195
|
+
Scandinavian: approximates(
|
|
196
|
+
"broad",
|
|
197
|
+
"Nordic includes Finland and Iceland; Scandinavian does not. The canon covers more than the source claimed, and the estate carries no narrower region term.",
|
|
198
|
+
"evokes(place.region.nordic)"
|
|
199
|
+
),
|
|
150
200
|
Transitional: constitutive("style.transitional")
|
|
151
201
|
},
|
|
152
202
|
requirement: {
|
|
@@ -164,11 +214,20 @@ var DESIGNSHOP_CROSSWALK = {
|
|
|
164
214
|
scheme_style: {
|
|
165
215
|
Coastal: constitutive("evokes(place.landscape.coastal)"),
|
|
166
216
|
Contemporary: constitutive("style.contemporary"),
|
|
167
|
-
Country: ambiguous(
|
|
217
|
+
Country: ambiguous(
|
|
218
|
+
"close",
|
|
219
|
+
"evokes(place.region.english-country)",
|
|
220
|
+
"evokes(typology.farmhouse)"
|
|
221
|
+
),
|
|
168
222
|
Eclectic: constitutive("style.eclectic"),
|
|
169
|
-
Farmhouse:
|
|
223
|
+
Farmhouse: approximates(
|
|
224
|
+
"close",
|
|
225
|
+
"The farmhouse reference plus the rustic idiom. Together they read as the source does in most retrieval; neither half nor the pair carries the agricultural building itself.",
|
|
226
|
+
"evokes(typology.farmhouse)",
|
|
227
|
+
"style.rustic"
|
|
228
|
+
),
|
|
170
229
|
Minimalist: constitutive("style.minimalism"),
|
|
171
|
-
Modern: ambiguous("style.modernism", "style.contemporary"),
|
|
230
|
+
Modern: ambiguous("close", "style.modernism", "style.contemporary"),
|
|
172
231
|
Traditional: constitutive("style.traditional"),
|
|
173
232
|
Transitional: constitutive("style.transitional")
|
|
174
233
|
},
|
|
@@ -199,15 +258,30 @@ var canonicaliseDesignShop = (input) => {
|
|
|
199
258
|
if (mapping.status === "ambiguous") {
|
|
200
259
|
return {
|
|
201
260
|
...base,
|
|
202
|
-
alternatives: defineAlternatives(
|
|
203
|
-
|
|
261
|
+
alternatives: defineAlternatives(
|
|
262
|
+
mapping.alternatives,
|
|
263
|
+
"source-ambiguous"
|
|
264
|
+
),
|
|
265
|
+
match: mapping.match,
|
|
266
|
+
status: "ambiguous",
|
|
267
|
+
...mapping.note === void 0 ? {} : { note: mapping.note }
|
|
204
268
|
};
|
|
205
269
|
}
|
|
206
|
-
return {
|
|
270
|
+
return {
|
|
271
|
+
...base,
|
|
272
|
+
canonical: defineBundle(mapping.assertions),
|
|
273
|
+
match: mapping.match,
|
|
274
|
+
status: "resolved",
|
|
275
|
+
...mapping.note === void 0 ? {} : { note: mapping.note }
|
|
276
|
+
};
|
|
207
277
|
};
|
|
208
278
|
var DESIGNSHOP_APPEARANCE_TEST_VECTORS = [
|
|
209
279
|
{
|
|
210
|
-
expectedAssertions: [
|
|
280
|
+
expectedAssertions: [
|
|
281
|
+
"material.porcelain",
|
|
282
|
+
"pattern.plain",
|
|
283
|
+
"product-category.tile"
|
|
284
|
+
],
|
|
211
285
|
facets: [
|
|
212
286
|
{ sourceField: "product_category", sourceValue: "Tile" },
|
|
213
287
|
{ sourceField: "material", sourceValue: "Porcelain" },
|
|
@@ -217,7 +291,11 @@ var DESIGNSHOP_APPEARANCE_TEST_VECTORS = [
|
|
|
217
291
|
market: "residential"
|
|
218
292
|
},
|
|
219
293
|
{
|
|
220
|
-
expectedAssertions: [
|
|
294
|
+
expectedAssertions: [
|
|
295
|
+
"material.porcelain",
|
|
296
|
+
"pattern.geometric",
|
|
297
|
+
"product-category.tile"
|
|
298
|
+
],
|
|
221
299
|
facets: [
|
|
222
300
|
{ sourceField: "product_category", sourceValue: "Tile" },
|
|
223
301
|
{ sourceField: "material", sourceValue: "Porcelain" },
|
|
@@ -227,7 +305,11 @@ var DESIGNSHOP_APPEARANCE_TEST_VECTORS = [
|
|
|
227
305
|
market: "residential"
|
|
228
306
|
},
|
|
229
307
|
{
|
|
230
|
-
expectedAssertions: [
|
|
308
|
+
expectedAssertions: [
|
|
309
|
+
"material.porcelain",
|
|
310
|
+
"pattern.stone-effect",
|
|
311
|
+
"product-category.tile"
|
|
312
|
+
],
|
|
231
313
|
facets: [
|
|
232
314
|
{ sourceField: "product_category", sourceValue: "Tile" },
|
|
233
315
|
{ sourceField: "material", sourceValue: "Porcelain" },
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CanonicalisationInput, CanonicalisationVerdict } from '../taste.js';
|
|
2
|
+
import { B as BundleRole } from '../match-CWzTEuL-.js';
|
|
3
|
+
import { C as CrosswalkMapping } from '../mapping-pvHk5VjC.js';
|
|
4
|
+
|
|
5
|
+
declare const MATERIALGRAPH_CROSSWALK_VERSION: "materialgraph-2026-08-27.1";
|
|
6
|
+
declare const MATERIALGRAPH_SOURCE_SYSTEM: "materialgraph";
|
|
7
|
+
declare const MATERIALGRAPH_SNAPSHOT: "2026-08-27";
|
|
8
|
+
/**
|
|
9
|
+
* The two dictionaries this crosswalk covers. Both were `ms_`-prefixed until MaterialGraph renamed
|
|
10
|
+
* them on 2026-08-27; the bare names are the current ones.
|
|
11
|
+
*/
|
|
12
|
+
declare const MATERIALGRAPH_SOURCE_FIELDS: readonly ["role", "character"];
|
|
13
|
+
type MaterialGraphSourceField = (typeof MATERIALGRAPH_SOURCE_FIELDS)[number];
|
|
14
|
+
/**
|
|
15
|
+
* Two `role` values that are not product properties at all, and where they actually go.
|
|
16
|
+
*
|
|
17
|
+
* A role IN A SCHEME is what `match.ts` already calls a `BundleRole`: `accent` means present and
|
|
18
|
+
* deliberate but the scheme survives without it, `constitutive` means remove it and the thing stops
|
|
19
|
+
* being what it is. A feature surface is the second by definition. Publishing these as a mapping to
|
|
20
|
+
* the bundle role rather than as terms is what stops the same slab being permanently labelled a
|
|
21
|
+
* feature surface because one scheme once used it as one.
|
|
22
|
+
*/
|
|
23
|
+
declare const MATERIALGRAPH_COMPOSITIONAL_ROLES: Readonly<Record<string, BundleRole>>;
|
|
24
|
+
declare const MATERIALGRAPH_CROSSWALK: Readonly<Record<MaterialGraphSourceField, Readonly<Record<string, CrosswalkMapping>>>>;
|
|
25
|
+
interface MaterialGraphCanonicalisationInput extends Omit<CanonicalisationInput, "sourceSystem" | "sourceField"> {
|
|
26
|
+
sourceField: MaterialGraphSourceField;
|
|
27
|
+
}
|
|
28
|
+
/** Unknown values are unresolved, never declined. Declines require an explicit curated row. */
|
|
29
|
+
declare const canonicaliseMaterialGraph: (input: MaterialGraphCanonicalisationInput) => CanonicalisationVerdict;
|
|
30
|
+
/**
|
|
31
|
+
* The upstream dictionaries, vendored as id tuples so this file can be checked against them.
|
|
32
|
+
*
|
|
33
|
+
* Verbatim from materialgraph packages/schema/src/registry/value-dictionaries — `role` in
|
|
34
|
+
* `material-semantics-core.ts`, `character` in `material-semantics-aesthetics.ts`, both at the
|
|
35
|
+
* 2026-08-27 snapshot, after the rename that dropped their `ms_` prefixes.
|
|
36
|
+
*/
|
|
37
|
+
declare const MATERIALGRAPH_ROLE_VALUES: readonly ["wall_finish", "flooring", "ceiling", "joinery", "upholstery", "drapery", "accent", "worksurface", "casegoods", "feature_surface", "trim", "other"];
|
|
38
|
+
declare const MATERIALGRAPH_CHARACTER_VALUES: readonly ["quiet", "expressive", "restrained", "bold", "rustic", "crafted", "refined", "formal", "casual", "natural_reading", "synthetic_reading", "soft_reading", "hard_reading"];
|
|
39
|
+
declare const MATERIALGRAPH_SOURCE_VALUES: Readonly<Record<MaterialGraphSourceField, readonly string[]>>;
|
|
40
|
+
|
|
41
|
+
export { MATERIALGRAPH_CHARACTER_VALUES, MATERIALGRAPH_COMPOSITIONAL_ROLES, MATERIALGRAPH_CROSSWALK, MATERIALGRAPH_CROSSWALK_VERSION, MATERIALGRAPH_ROLE_VALUES, MATERIALGRAPH_SNAPSHOT, MATERIALGRAPH_SOURCE_FIELDS, MATERIALGRAPH_SOURCE_SYSTEM, MATERIALGRAPH_SOURCE_VALUES, type MaterialGraphCanonicalisationInput, type MaterialGraphSourceField, canonicaliseMaterialGraph };
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import {
|
|
2
|
+
approximates,
|
|
3
|
+
constitutive,
|
|
4
|
+
declined
|
|
5
|
+
} from "../chunk-WIRA24HM.js";
|
|
6
|
+
import {
|
|
7
|
+
TAXONOMY_SNAPSHOT_VERSION
|
|
8
|
+
} from "../chunk-FCMCKNQF.js";
|
|
9
|
+
import {
|
|
10
|
+
defineAlternatives,
|
|
11
|
+
defineBundle
|
|
12
|
+
} from "../chunk-4ECRPD2I.js";
|
|
13
|
+
|
|
14
|
+
// src/crosswalks/materialgraph.ts
|
|
15
|
+
var MATERIALGRAPH_CROSSWALK_VERSION = "materialgraph-2026-08-27.1";
|
|
16
|
+
var MATERIALGRAPH_SOURCE_SYSTEM = "materialgraph";
|
|
17
|
+
var MATERIALGRAPH_SNAPSHOT = "2026-08-27";
|
|
18
|
+
var MATERIALGRAPH_SOURCE_FIELDS = ["role", "character"];
|
|
19
|
+
var MATERIALGRAPH_COMPOSITIONAL_ROLES = {
|
|
20
|
+
accent: "accent",
|
|
21
|
+
feature_surface: "constitutive"
|
|
22
|
+
};
|
|
23
|
+
var SCALE_SHIFT = "A claim about a MATERIAL answered by a term about a ROOM. The two substitute in retrieval most of the time and not always, which is what `close` says and what `resolved` could not.";
|
|
24
|
+
var LADDER = "One rung of the quiet/restrained/expressive/bold presence ladder. MOOD is unordered and has no term for this rung, so the association is published and the ordering is lost. See the header.";
|
|
25
|
+
var READS_AS = "A `reads-as` claim with nothing to point at. The predicate exists in `term.ts`; the target vocabulary - a natural/synthetic and soft/hard reading register - is not authored on any axis, and minting one would be a new axis. Searched 2026-08-27 across all 23 axes; absent.";
|
|
26
|
+
var MATERIALGRAPH_CROSSWALK = {
|
|
27
|
+
/* oxlint-disable sort-keys -- rows follow the upstream dictionary order, so a reader can check
|
|
28
|
+
this file against `material-semantics-core.ts` and `-aesthetics.ts` without reordering. */
|
|
29
|
+
role: {
|
|
30
|
+
wall_finish: approximates(
|
|
31
|
+
"broad",
|
|
32
|
+
"`application.wall` is every use of a wall face - panelling, tiling, cladding - and the source names one of them. The canon covers more than the source claimed. Note the collision with `material-family.wall-finish`, which is the same two words asking what the thing is MADE OF; this row is about where it goes.",
|
|
33
|
+
"application.wall"
|
|
34
|
+
),
|
|
35
|
+
flooring: constitutive("application.flooring"),
|
|
36
|
+
ceiling: constitutive("application.ceiling"),
|
|
37
|
+
// `element.millwork` already carries `joinery` and `casework` as alt labels: the canon has
|
|
38
|
+
// ruled that the British and American words name one thing, and this row follows that ruling
|
|
39
|
+
// rather than re-opening it.
|
|
40
|
+
joinery: constitutive("application.millwork"),
|
|
41
|
+
upholstery: constitutive("application.upholstery"),
|
|
42
|
+
drapery: constitutive("application.vh_drapery"),
|
|
43
|
+
// `application.countertop` gained `worksurface` as an alt label for this row. One surface, two
|
|
44
|
+
// national names, one term.
|
|
45
|
+
worksurface: constitutive("application.countertop"),
|
|
46
|
+
casegoods: approximates(
|
|
47
|
+
"close",
|
|
48
|
+
"A role answered by a product kind. `product_category.storage` carries `casegoods` as an alt label, so the words agree; the claims do not quite, because the source says what the material is DOING and the canon says what the product IS.",
|
|
49
|
+
"product_category.storage"
|
|
50
|
+
),
|
|
51
|
+
trim: constitutive("application.trim"),
|
|
52
|
+
accent: declined(
|
|
53
|
+
"Compositional, not a product property: the same material is an accent in one scheme and the field in the next. Its destination is the bundle role `accent` in `match.ts` - see MATERIALGRAPH_COMPOSITIONAL_ROLES."
|
|
54
|
+
),
|
|
55
|
+
feature_surface: declined(
|
|
56
|
+
"Compositional, as `accent` is. Its destination is the bundle role `constitutive`: a feature surface is the one you cannot remove without changing what the scheme is."
|
|
57
|
+
),
|
|
58
|
+
other: declined(
|
|
59
|
+
"A routing bucket with no content. `other` on a closed axis is a positive classification; on this one it names nothing at all, and the honest canonical value is null."
|
|
60
|
+
)
|
|
61
|
+
},
|
|
62
|
+
character: {
|
|
63
|
+
quiet: approximates("close", SCALE_SHIFT, "mood.calm"),
|
|
64
|
+
expressive: approximates("related", LADDER, "mood.dramatic"),
|
|
65
|
+
restrained: approximates(
|
|
66
|
+
"related",
|
|
67
|
+
`${LADDER} \`mood.austere\` is the nearest room-scale term and it overstates: austerity is renunciation, restraint is only quietness of means.`,
|
|
68
|
+
"mood.austere"
|
|
69
|
+
),
|
|
70
|
+
bold: approximates("related", LADDER, "mood.dramatic"),
|
|
71
|
+
// The one row in this dictionary that reads the same at both scales: a rustic material and a
|
|
72
|
+
// rustic room are the same idiom, which is what TAX-14 found and this keeps.
|
|
73
|
+
rustic: approximates("close", SCALE_SHIFT, "style.rustic"),
|
|
74
|
+
crafted: approximates(
|
|
75
|
+
"related",
|
|
76
|
+
"A READING answered by a production FACT, and the two come apart in both directions: a printed laminate can read as crafted, and a machine-finished handmade tile can read as neither. Association only.",
|
|
77
|
+
"construction.handcrafted"
|
|
78
|
+
),
|
|
79
|
+
refined: declined(
|
|
80
|
+
"The machine-precise register has no canonical term. `mood.quiet-luxury` is about expense being legible and `finish.treatment.polished` is about a surface operation; refined is about precision of execution and is neither. Searched 2026-08-27; absent."
|
|
81
|
+
),
|
|
82
|
+
// TAX-14 recorded this as `lossy` - "`serious` understates the social convention `formal`
|
|
83
|
+
// carries". That verdict is SKOS's `closeMatch`, reached independently and now spelled in the
|
|
84
|
+
// published vocabulary rather than in a bespoke one.
|
|
85
|
+
formal: approximates(
|
|
86
|
+
"close",
|
|
87
|
+
`${SCALE_SHIFT} \`mood.serious\` also understates the social convention \`formal\` carries.`,
|
|
88
|
+
"mood.serious"
|
|
89
|
+
),
|
|
90
|
+
casual: approximates("close", SCALE_SHIFT, "mood.domestic"),
|
|
91
|
+
natural_reading: declined(READS_AS),
|
|
92
|
+
synthetic_reading: declined(READS_AS),
|
|
93
|
+
soft_reading: declined(READS_AS),
|
|
94
|
+
hard_reading: declined(READS_AS)
|
|
95
|
+
}
|
|
96
|
+
/* oxlint-enable sort-keys */
|
|
97
|
+
};
|
|
98
|
+
var canonicaliseMaterialGraph = (input) => {
|
|
99
|
+
const base = {
|
|
100
|
+
crosswalkVersion: MATERIALGRAPH_CROSSWALK_VERSION,
|
|
101
|
+
provenance: input.provenance,
|
|
102
|
+
sourceField: input.sourceField,
|
|
103
|
+
sourceSystem: MATERIALGRAPH_SOURCE_SYSTEM,
|
|
104
|
+
sourceValue: input.sourceValue,
|
|
105
|
+
taxonomySnapshotVersion: TAXONOMY_SNAPSHOT_VERSION
|
|
106
|
+
};
|
|
107
|
+
const mapping = MATERIALGRAPH_CROSSWALK[input.sourceField][input.sourceValue];
|
|
108
|
+
if (mapping === void 0) {
|
|
109
|
+
return { ...base, status: "unresolved" };
|
|
110
|
+
}
|
|
111
|
+
if (mapping.status === "declined") {
|
|
112
|
+
return { ...base, reason: mapping.reason, status: "declined" };
|
|
113
|
+
}
|
|
114
|
+
if (mapping.status === "ambiguous") {
|
|
115
|
+
return {
|
|
116
|
+
...base,
|
|
117
|
+
alternatives: defineAlternatives(
|
|
118
|
+
mapping.alternatives,
|
|
119
|
+
"source-ambiguous"
|
|
120
|
+
),
|
|
121
|
+
match: mapping.match,
|
|
122
|
+
status: "ambiguous",
|
|
123
|
+
...mapping.note === void 0 ? {} : { note: mapping.note }
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
...base,
|
|
128
|
+
canonical: defineBundle(mapping.assertions),
|
|
129
|
+
match: mapping.match,
|
|
130
|
+
status: "resolved",
|
|
131
|
+
...mapping.note === void 0 ? {} : { note: mapping.note }
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
var MATERIALGRAPH_ROLE_VALUES = [
|
|
135
|
+
"wall_finish",
|
|
136
|
+
"flooring",
|
|
137
|
+
"ceiling",
|
|
138
|
+
"joinery",
|
|
139
|
+
"upholstery",
|
|
140
|
+
"drapery",
|
|
141
|
+
"accent",
|
|
142
|
+
"worksurface",
|
|
143
|
+
"casegoods",
|
|
144
|
+
"feature_surface",
|
|
145
|
+
"trim",
|
|
146
|
+
"other"
|
|
147
|
+
];
|
|
148
|
+
var MATERIALGRAPH_CHARACTER_VALUES = [
|
|
149
|
+
"quiet",
|
|
150
|
+
"expressive",
|
|
151
|
+
"restrained",
|
|
152
|
+
"bold",
|
|
153
|
+
"rustic",
|
|
154
|
+
"crafted",
|
|
155
|
+
"refined",
|
|
156
|
+
"formal",
|
|
157
|
+
"casual",
|
|
158
|
+
"natural_reading",
|
|
159
|
+
"synthetic_reading",
|
|
160
|
+
"soft_reading",
|
|
161
|
+
"hard_reading"
|
|
162
|
+
];
|
|
163
|
+
var MATERIALGRAPH_SOURCE_VALUES = {
|
|
164
|
+
character: MATERIALGRAPH_CHARACTER_VALUES,
|
|
165
|
+
role: MATERIALGRAPH_ROLE_VALUES
|
|
166
|
+
};
|
|
167
|
+
export {
|
|
168
|
+
MATERIALGRAPH_CHARACTER_VALUES,
|
|
169
|
+
MATERIALGRAPH_COMPOSITIONAL_ROLES,
|
|
170
|
+
MATERIALGRAPH_CROSSWALK,
|
|
171
|
+
MATERIALGRAPH_CROSSWALK_VERSION,
|
|
172
|
+
MATERIALGRAPH_ROLE_VALUES,
|
|
173
|
+
MATERIALGRAPH_SNAPSHOT,
|
|
174
|
+
MATERIALGRAPH_SOURCE_FIELDS,
|
|
175
|
+
MATERIALGRAPH_SOURCE_SYSTEM,
|
|
176
|
+
MATERIALGRAPH_SOURCE_VALUES,
|
|
177
|
+
canonicaliseMaterialGraph
|
|
178
|
+
};
|
package/dist/crosswalks/miu.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { MaterialFamily, Sector, Application } from '../index.js';
|
|
2
|
-
import '../match-
|
|
2
|
+
import '../match-CWzTEuL-.js';
|
|
3
|
+
import '../mapping-pvHk5VjC.js';
|
|
3
4
|
import '../taste.js';
|
|
4
5
|
|
|
5
6
|
declare const MIU_MATERIAL_FAMILIES: readonly ["wood", "wood_veneer", "engineered_wood", "bamboo", "cork", "natural_stone", "terrazzo", "ceramic_porcelain", "glass", "metal", "concrete", "plaster", "clay", "brick", "paint_coating", "wallcovering", "laminate", "solid_surface", "mineral_composite", "resin", "linoleum", "vinyl", "rubber", "carpet", "rug", "textile", "leather", "acoustic_felt", "acoustic_composite", "recycled_composite", "paper_cardboard", "biobased_composite", "greenery_planting", "lighting", "hardware", "digital_media", "water_feature", "mixed_material", "color_palette_only", "unknown"];
|
package/dist/crosswalks/miu.js
CHANGED
|
@@ -378,9 +378,15 @@ var MIU_SURFACE_APPLICATION_TO_CANONICAL = {
|
|
|
378
378
|
// Epistemic sentinel.
|
|
379
379
|
unknown: null
|
|
380
380
|
};
|
|
381
|
-
var MIU_MATERIAL_FAMILY_SET = new Set(
|
|
382
|
-
|
|
383
|
-
|
|
381
|
+
var MIU_MATERIAL_FAMILY_SET = new Set(
|
|
382
|
+
MIU_MATERIAL_FAMILIES
|
|
383
|
+
);
|
|
384
|
+
var MIU_PROJECT_SECTOR_SET = new Set(
|
|
385
|
+
MIU_PROJECT_SECTORS
|
|
386
|
+
);
|
|
387
|
+
var MIU_SURFACE_APPLICATION_SET = new Set(
|
|
388
|
+
MIU_SURFACE_APPLICATIONS
|
|
389
|
+
);
|
|
384
390
|
var isMiuMaterialFamily = (value) => MIU_MATERIAL_FAMILY_SET.has(value);
|
|
385
391
|
var isMiuProjectSector = (value) => MIU_PROJECT_SECTOR_SET.has(value);
|
|
386
392
|
var isMiuSurfaceApplication = (value) => MIU_SURFACE_APPLICATION_SET.has(value);
|
package/dist/estate/index.d.ts
CHANGED