@milaboratories/pl-model-common 1.48.0 → 1.49.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/author_marker.d.ts +1 -2
- package/dist/author_marker.d.ts.map +1 -1
- package/dist/base64.d.ts +4 -6
- package/dist/base64.d.ts.map +1 -1
- package/dist/block_state.d.ts +13 -9
- package/dist/block_state.d.ts.map +1 -1
- package/dist/bmodel/block_config.d.ts +51 -29
- package/dist/bmodel/block_config.d.ts.map +1 -1
- package/dist/bmodel/block_kind_ref.d.ts +4 -6
- package/dist/bmodel/block_kind_ref.d.ts.map +1 -1
- package/dist/bmodel/code.d.ts +4 -5
- package/dist/bmodel/code.d.ts.map +1 -1
- package/dist/bmodel/container.d.ts +5 -5
- package/dist/bmodel/container.d.ts.map +1 -1
- package/dist/bmodel/normalization.d.ts +1 -3
- package/dist/bmodel/normalization.d.ts.map +1 -1
- package/dist/bmodel/types.d.ts +1 -2
- package/dist/bmodel/types.d.ts.map +1 -1
- package/dist/branding.d.ts +2 -3
- package/dist/branding.d.ts.map +1 -1
- package/dist/columns/accessor_traversal.d.ts +6 -8
- package/dist/columns/accessor_traversal.d.ts.map +1 -1
- package/dist/columns/column_registry.d.ts +2 -3
- package/dist/columns/column_registry.d.ts.map +1 -1
- package/dist/columns/column_selector.d.ts +9 -9
- package/dist/columns/column_selector.d.ts.map +1 -1
- package/dist/columns/dedup.d.ts +1 -3
- package/dist/columns/dedup.d.ts.map +1 -1
- package/dist/columns/providers.d.ts +3 -4
- package/dist/columns/providers.d.ts.map +1 -1
- package/dist/columns/types.d.ts +12 -9
- package/dist/columns/types.d.ts.map +1 -1
- package/dist/common_types.d.ts +4 -6
- package/dist/common_types.d.ts.map +1 -1
- package/dist/dialog/index.d.ts +4 -5
- package/dist/dialog/index.d.ts.map +1 -1
- package/dist/driver_kit.d.ts +2 -2
- package/dist/driver_kit.d.ts.map +1 -1
- package/dist/drivers/ChunkedStreamReader.d.ts +3 -5
- package/dist/drivers/ChunkedStreamReader.d.ts.map +1 -1
- package/dist/drivers/blob.d.ts +36 -25
- package/dist/drivers/blob.d.ts.map +1 -1
- package/dist/drivers/columns/columns_collection_driver.d.ts +6 -7
- package/dist/drivers/columns/columns_collection_driver.d.ts.map +1 -1
- package/dist/drivers/columns/discover_columns_options.d.ts +9 -8
- package/dist/drivers/columns/discover_columns_options.d.ts.map +1 -1
- package/dist/drivers/index.cjs +1 -0
- package/dist/drivers/index.d.ts +4 -2
- package/dist/drivers/index.js +2 -2
- package/dist/drivers/interfaces.d.ts +2 -3
- package/dist/drivers/interfaces.d.ts.map +1 -1
- package/dist/drivers/log.d.ts +26 -28
- package/dist/drivers/log.d.ts.map +1 -1
- package/dist/drivers/ls.d.ts +37 -27
- package/dist/drivers/ls.d.ts.map +1 -1
- package/dist/drivers/pframe/column_filter.d.ts +1 -3
- package/dist/drivers/pframe/column_filter.d.ts.map +1 -1
- package/dist/drivers/pframe/data_info.d.ts +77 -50
- package/dist/drivers/pframe/data_info.d.ts.map +1 -1
- package/dist/drivers/pframe/data_types.d.ts +50 -45
- package/dist/drivers/pframe/data_types.d.ts.map +1 -1
- package/dist/drivers/pframe/driver.d.ts +5 -5
- package/dist/drivers/pframe/driver.d.ts.map +1 -1
- package/dist/drivers/pframe/filter_spec.d.ts +10 -12
- package/dist/drivers/pframe/filter_spec.d.ts.map +1 -1
- package/dist/drivers/pframe/find_columns.d.ts +2 -4
- package/dist/drivers/pframe/find_columns.d.ts.map +1 -1
- package/dist/drivers/pframe/index.cjs +1 -0
- package/dist/drivers/pframe/index.d.ts +4 -2
- package/dist/drivers/pframe/index.js +2 -2
- package/dist/drivers/pframe/linker_columns.d.ts +4 -10
- package/dist/drivers/pframe/linker_columns.d.ts.map +1 -1
- package/dist/drivers/pframe/pframe.d.ts +3 -3
- package/dist/drivers/pframe/pframe.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_common.d.ts +52 -46
- package/dist/drivers/pframe/query/query_common.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_data.d.ts +26 -21
- package/dist/drivers/pframe/query/query_data.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_spec.d.ts +22 -19
- package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
- package/dist/drivers/pframe/query/utils.d.ts +15 -11
- package/dist/drivers/pframe/query/utils.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/anchored.d.ts +3 -5
- package/dist/drivers/pframe/spec/anchored.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/discovered_column.d.ts +10 -11
- package/dist/drivers/pframe/spec/discovered_column.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts +17 -18
- package/dist/drivers/pframe/spec/filtered_column.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/ids.d.ts +16 -16
- package/dist/drivers/pframe/spec/ids.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/index.cjs +1 -0
- package/dist/drivers/pframe/spec/index.d.ts +2 -2
- package/dist/drivers/pframe/spec/index.js +2 -2
- package/dist/drivers/pframe/spec/native_id.d.ts +3 -3
- package/dist/drivers/pframe/spec/native_id.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/overridden.d.ts +14 -16
- package/dist/drivers/pframe/spec/overridden.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/selectors.d.ts +22 -22
- package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/spec.cjs +31 -0
- package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
- package/dist/drivers/pframe/spec/spec.d.ts +94 -70
- package/dist/drivers/pframe/spec/spec.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/spec.js +31 -1
- package/dist/drivers/pframe/spec/spec.js.map +1 -1
- package/dist/drivers/pframe/spec_driver.d.ts +30 -25
- package/dist/drivers/pframe/spec_driver.d.ts.map +1 -1
- package/dist/drivers/pframe/table.d.ts +1 -3
- package/dist/drivers/pframe/table.d.ts.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +55 -46
- package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
- package/dist/drivers/pframe/table_common.d.ts +9 -10
- package/dist/drivers/pframe/table_common.d.ts.map +1 -1
- package/dist/drivers/pframe/unique_values.d.ts +3 -3
- package/dist/drivers/pframe/unique_values.d.ts.map +1 -1
- package/dist/drivers/upload.d.ts +2 -3
- package/dist/drivers/upload.d.ts.map +1 -1
- package/dist/drivers/urls.d.ts +7 -8
- package/dist/drivers/urls.d.ts.map +1 -1
- package/dist/errors.d.ts +35 -36
- package/dist/errors.d.ts.map +1 -1
- package/dist/flags/block_flags.cjs.map +1 -1
- package/dist/flags/block_flags.d.ts +7 -7
- package/dist/flags/block_flags.d.ts.map +1 -1
- package/dist/flags/block_flags.js.map +1 -1
- package/dist/flags/flag_utils.d.ts +6 -8
- package/dist/flags/flag_utils.d.ts.map +1 -1
- package/dist/flags/type_utils.d.ts +6 -7
- package/dist/flags/type_utils.d.ts.map +1 -1
- package/dist/httpAuth.d.ts +4 -5
- package/dist/httpAuth.d.ts.map +1 -1
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.js +2 -2
- package/dist/json.d.ts +11 -12
- package/dist/json.d.ts.map +1 -1
- package/dist/navigation.d.ts +16 -11
- package/dist/navigation.d.ts.map +1 -1
- package/dist/plid.d.ts +7 -9
- package/dist/plid.d.ts.map +1 -1
- package/dist/pool/entry.d.ts +8 -6
- package/dist/pool/entry.d.ts.map +1 -1
- package/dist/pool/query.d.ts +3 -4
- package/dist/pool/query.d.ts.map +1 -1
- package/dist/pool/spec.d.ts +33 -30
- package/dist/pool/spec.d.ts.map +1 -1
- package/dist/pool_entry.d.ts +2 -3
- package/dist/pool_entry.d.ts.map +1 -1
- package/dist/project_id.d.ts +1 -3
- package/dist/project_id.d.ts.map +1 -1
- package/dist/ref.d.ts +22 -23
- package/dist/ref.d.ts.map +1 -1
- package/dist/resource_types.d.ts +2 -3
- package/dist/resource_types.d.ts.map +1 -1
- package/dist/services/node_service_handlers.d.ts +1 -3
- package/dist/services/node_service_handlers.d.ts.map +1 -1
- package/dist/services/service_capabilities.d.ts +7 -9
- package/dist/services/service_capabilities.d.ts.map +1 -1
- package/dist/services/service_declarations.d.ts +2 -2
- package/dist/services/service_declarations.d.ts.map +1 -1
- package/dist/services/service_injectors.d.ts +7 -8
- package/dist/services/service_injectors.d.ts.map +1 -1
- package/dist/services/service_registry.d.ts +2 -4
- package/dist/services/service_registry.d.ts.map +1 -1
- package/dist/services/service_types.d.ts +24 -26
- package/dist/services/service_types.d.ts.map +1 -1
- package/dist/template/kind_selector.d.ts +9 -11
- package/dist/template/kind_selector.d.ts.map +1 -1
- package/dist/template/project_template_v1.d.ts +22 -20
- package/dist/template/project_template_v1.d.ts.map +1 -1
- package/dist/template/template_ref_form.d.ts +6 -5
- package/dist/template/template_ref_form.d.ts.map +1 -1
- package/dist/template/template_relocate.cjs +24 -3
- package/dist/template/template_relocate.cjs.map +1 -1
- package/dist/template/template_relocate.d.ts +8 -4
- package/dist/template/template_relocate.d.ts.map +1 -1
- package/dist/template/template_relocate.js +24 -3
- package/dist/template/template_relocate.js.map +1 -1
- package/dist/utag.d.ts +2 -4
- package/dist/utag.d.ts.map +1 -1
- package/dist/util.d.ts +2 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/value_or_error.d.ts +2 -3
- package/dist/value_or_error.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/drivers/pframe/spec/spec.ts +31 -0
- package/src/flags/block_flags.ts +1 -1
- package/src/template/template_relocate.test.ts +57 -0
- package/src/template/template_relocate.ts +32 -4
package/dist/util.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
//#region src/util.d.ts
|
|
2
|
-
declare function assertNever(x: never): never;
|
|
2
|
+
export declare function assertNever(x: never): never;
|
|
3
3
|
/**
|
|
4
4
|
* Return unique entries of the array by the provided id
|
|
5
5
|
* For each id, the last entry is kept
|
|
6
6
|
*/
|
|
7
|
-
declare function uniqueBy<T>(array: T[], makeId: (entry: T) => string): T[];
|
|
7
|
+
export declare function uniqueBy<T>(array: T[], makeId: (entry: T) => string): T[];
|
|
8
8
|
//#endregion
|
|
9
|
-
export { assertNever, uniqueBy };
|
|
10
9
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","names":[],"sources":["../src/util.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"util.d.ts","names":[],"sources":["../src/util.ts"],"mappings":";wBAAgB,YAAY;;;;;wBAQZ,SAAS,GAAG,OAAO,KAAK,SAAS,OAAO,eAAe"}
|
package/dist/value_or_error.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
//#region src/value_or_error.d.ts
|
|
2
|
-
type ValueOrError<V, E> = {
|
|
2
|
+
export type ValueOrError<V, E> = {
|
|
3
3
|
ok: true;
|
|
4
4
|
value: V;
|
|
5
5
|
} | {
|
|
6
6
|
ok: false;
|
|
7
7
|
error: E;
|
|
8
8
|
};
|
|
9
|
-
declare function mapValueInVOE<V1, V2, E>(voe: ValueOrError<V1, E>, cb: (value: V1) => V2): ValueOrError<V2, E>;
|
|
9
|
+
export declare function mapValueInVOE<V1, V2, E>(voe: ValueOrError<V1, E>, cb: (value: V1) => V2): ValueOrError<V2, E>;
|
|
10
10
|
//#endregion
|
|
11
|
-
export { ValueOrError, mapValueInVOE };
|
|
12
11
|
//# sourceMappingURL=value_or_error.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value_or_error.d.ts","names":[],"sources":["../src/value_or_error.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"value_or_error.d.ts","names":[],"sources":["../src/value_or_error.ts"],"mappings":";YAAY,aAAa,GAAG;EAEtB;EACA,OAAO;;EAGP;EACA,OAAO;;wBAGG,cAAc,IAAI,IAAI,GACpC,KAAK,aAAa,IAAI,IACtB,KAAK,OAAO,OAAO,KAClB,aAAa,IAAI"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milaboratories/pl-model-common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.49.0",
|
|
4
4
|
"description": "Platforma SDK Model",
|
|
5
5
|
"files": [
|
|
6
6
|
"./dist/**/*",
|
|
@@ -20,16 +20,16 @@
|
|
|
20
20
|
"canonicalize": "~2.1.0",
|
|
21
21
|
"es-toolkit": "^1.39.10",
|
|
22
22
|
"zod": "~3.25.76",
|
|
23
|
-
"@milaboratories/
|
|
24
|
-
"@milaboratories/
|
|
23
|
+
"@milaboratories/helpers": "1.14.5",
|
|
24
|
+
"@milaboratories/pl-error-like": "1.12.10"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@vitest/coverage-istanbul": "^4.1.3",
|
|
28
|
-
"typescript": "
|
|
28
|
+
"typescript": "7.0.2",
|
|
29
29
|
"vitest": "^4.1.3",
|
|
30
|
-
"@milaboratories/
|
|
31
|
-
"@milaboratories/
|
|
32
|
-
"@milaboratories/ts-
|
|
30
|
+
"@milaboratories/build-configs": "2.0.1",
|
|
31
|
+
"@milaboratories/ts-builder": "1.7.2",
|
|
32
|
+
"@milaboratories/ts-configs": "1.4.0"
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "ts-builder build --target node",
|
|
@@ -83,6 +83,37 @@ export const Domain = {
|
|
|
83
83
|
},
|
|
84
84
|
} as const;
|
|
85
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Domain keys whose value is the id of a block, rather than a qualifier of the data.
|
|
88
|
+
*
|
|
89
|
+
* Applying a template repoints these at the blocks of the project being built: an axis a block
|
|
90
|
+
* produced names that block in its domain, so an axis left naming the exported-from project
|
|
91
|
+
* resolves to nothing. Listing the keys is what makes that safe — a template's entry ids are
|
|
92
|
+
* arbitrary non-empty strings, so a hand-written template may name an entry `closest`, and a
|
|
93
|
+
* qualifier that happens to read `closest` must not be mistaken for a reference to it.
|
|
94
|
+
*
|
|
95
|
+
* A key absent from here is simply left alone, which is the behaviour from before relocation
|
|
96
|
+
* reached domains at all. Adding one is therefore safe; omitting one costs only that a template
|
|
97
|
+
* carrying it applies still pointing at the project it came from.
|
|
98
|
+
*/
|
|
99
|
+
export const BlockScopedDomain: ReadonlySet<string> = new Set<string>([
|
|
100
|
+
"pl7.app/blockId",
|
|
101
|
+
"pl7.app/block",
|
|
102
|
+
"pl7.app/redefined-by",
|
|
103
|
+
"pl7.app/annotationRunId",
|
|
104
|
+
"pl7.app/clonotypeAnnotationRunId",
|
|
105
|
+
"pl7.app/clustering/blockId",
|
|
106
|
+
"pl7.app/umap/blockId",
|
|
107
|
+
"pl7.app/peptide/extractionRunId",
|
|
108
|
+
"pl7.app/repertoire/extractionRunId",
|
|
109
|
+
"pl7.app/antibodyVariantDesigner/designRunId",
|
|
110
|
+
"pl7.app/vdj/clonotypingRunId",
|
|
111
|
+
"pl7.app/vdj/clustering/blockId",
|
|
112
|
+
"pl7.app/vdj/integration/blockId",
|
|
113
|
+
"pl7.app/vdj/spatiotemporalAnalysis/blockId",
|
|
114
|
+
"pl7.app/vdj/libraryId",
|
|
115
|
+
]);
|
|
116
|
+
|
|
86
117
|
export type Domain = Metadata &
|
|
87
118
|
Partial<{
|
|
88
119
|
[Domain.Alphabet]: "nucleotide" | "aminoacid" | (string & {});
|
package/src/flags/block_flags.ts
CHANGED
|
@@ -13,7 +13,7 @@ export type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number
|
|
|
13
13
|
Record<`requires${string}`, boolean | number | undefined>;
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Known block flags. Flags are set during model compilation, see `
|
|
16
|
+
* Known block flags. Flags are set during model compilation, see `BlockModelV3` feature flags for more details and for initial values.
|
|
17
17
|
*/
|
|
18
18
|
export type BlockCodeKnownFeatureFlags = {
|
|
19
19
|
readonly supportsLazyState?: boolean;
|
|
@@ -109,6 +109,63 @@ describe("relocateBlockIds", () => {
|
|
|
109
109
|
});
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
+
describe("a domain that qualifies an axis", () => {
|
|
113
|
+
// An axis a block produced names that block in its domain — `pl7.app/sampleId` is
|
|
114
|
+
// qualified by the block that defined the samples, a clonotype key by the run that called
|
|
115
|
+
// the clonotypes. A chart bound to such an axis is bound to a reference.
|
|
116
|
+
const axis = (runId: string) => ({
|
|
117
|
+
kind: "axis",
|
|
118
|
+
name: "pl7.app/vdj/clonotypeKey",
|
|
119
|
+
type: "String",
|
|
120
|
+
domain: { "pl7.app/vdj/chain": "IGHeavy", "pl7.app/vdj/clonotypingRunId": runId },
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("an entry naming one of this template's entries is repointed", () => {
|
|
124
|
+
expect(relocateBlockIds({ x: axis("old") }, to("old", "new"))).toEqual({ x: axis("new") });
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("an entry that is not an entry id is left alone", () => {
|
|
128
|
+
// The map is the whole test of what is a reference: nothing reads a value's shape, so an
|
|
129
|
+
// ordinary qualifier cannot be caught by it.
|
|
130
|
+
const moved = relocateBlockIds({ x: axis("old") }, to("old", "new")) as {
|
|
131
|
+
x: { domain: Record<string, string> };
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
expect(moved.x.domain["pl7.app/vdj/chain"]).toBe("IGHeavy");
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("a domain naming a block this template does not carry keeps it", () => {
|
|
138
|
+
// The ordering rule again: an entry created later is not in the map yet, and the applied
|
|
139
|
+
// block reports itself as missing references rather than pointing at the wrong block.
|
|
140
|
+
expect(relocateBlockIds({ x: axis("later") }, to("earlier", "new"))).toEqual({
|
|
141
|
+
x: axis("later"),
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("a qualifier that merely collides with an entry id is NOT a reference", () => {
|
|
146
|
+
// Entry ids are validated only as non-empty strings, so a hand-written template names its
|
|
147
|
+
// entries readably. `algo` is a qualifier of the data, and an entry called `closest` does
|
|
148
|
+
// not make it one: matching the map is not evidence, the key is.
|
|
149
|
+
const params = { method: { domain: { algo: "closest", chain: "IGHeavy" } } };
|
|
150
|
+
|
|
151
|
+
expect(relocateBlockIds(params, to("closest", "new"))).toEqual(params);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test("a domain INSIDE a recognized identifier is still spec data, and stays", () => {
|
|
155
|
+
// The boundary of the rule above. This id is taken apart by the structural remapper,
|
|
156
|
+
// which never descends to the generic object case, so its overrides are untouched.
|
|
157
|
+
const id = createColumnOverriddenId({
|
|
158
|
+
source: leafId("old", "clonotypes"),
|
|
159
|
+
specOverrides: { domain: { producedBy: "old" } },
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
const moved = relocateBlockIds({ a: id }, to("old", "new")) as { a: string };
|
|
163
|
+
const key = JSON.parse(moved.a) as { specOverrides: { domain: unknown } };
|
|
164
|
+
|
|
165
|
+
expect(key.specOverrides.domain).toEqual({ producedBy: "old" });
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
112
169
|
describe("depth", () => {
|
|
113
170
|
test("three nested forms are repointed at the bottom and rebuilt on the way up", () => {
|
|
114
171
|
const deep = (block: string) =>
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isPlainObject } from "es-toolkit";
|
|
2
|
+
|
|
3
|
+
import { BlockScopedDomain, isColumnUniversalKey, remapColumnIdBlockIds } from "../drivers";
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* Point every column identifier in a block's params at the blocks of the project being built.
|
|
@@ -15,8 +17,13 @@ import { isColumnUniversalKey, remapColumnIdBlockIds } from "../drivers";
|
|
|
15
17
|
*
|
|
16
18
|
* Rewriting is structural, never textual: an identifier is taken apart, its `blockId` fields
|
|
17
19
|
* are replaced, and it is rebuilt canonically. That is what keeps a value that merely *looks*
|
|
18
|
-
* like an id —
|
|
19
|
-
* what re-sorts a qualifications map whose
|
|
20
|
+
* like an id — an axis filter, a domain this package can see belongs to an identifier it
|
|
21
|
+
* knows — from being rewritten along with it, and what re-sorts a qualifications map whose
|
|
22
|
+
* keys are identifiers.
|
|
23
|
+
*
|
|
24
|
+
* A domain reached on its own is the exception, and `relocateDomain` below says why: an axis is
|
|
25
|
+
* qualified by the block that produced it. Only the domain keys known to name a block are
|
|
26
|
+
* repointed — matching an entry id is not on its own evidence of a reference.
|
|
20
27
|
*
|
|
21
28
|
* An id the map does not mention is left as it is. That is the ordering rule doing its work:
|
|
22
29
|
* a caller building the map as it creates blocks passes only the entries already created, so
|
|
@@ -49,7 +56,7 @@ export function relocateBlockIds<T>(params: T, blockIds: ReadonlyMap<string, str
|
|
|
49
56
|
return Object.fromEntries(
|
|
50
57
|
Object.entries(node).map(([key, value]) => [
|
|
51
58
|
remapColumnIdBlockIds(key, remapBlockId),
|
|
52
|
-
walk(value),
|
|
59
|
+
key === "domain" && isPlainObject(value) ? relocateDomain(value) : walk(value),
|
|
53
60
|
]),
|
|
54
61
|
);
|
|
55
62
|
}
|
|
@@ -57,5 +64,26 @@ export function relocateBlockIds<T>(params: T, blockIds: ReadonlyMap<string, str
|
|
|
57
64
|
return node;
|
|
58
65
|
};
|
|
59
66
|
|
|
67
|
+
/**
|
|
68
|
+
* The block-naming entries of a domain, repointed at the project being built: an axis a block
|
|
69
|
+
* produced names that block in its domain, so those are references like any other.
|
|
70
|
+
*
|
|
71
|
+
* Only the keys {@link BlockScopedDomain} lists, because a template's entry ids are arbitrary
|
|
72
|
+
* non-empty strings — a hand-written template may name an entry `closest`, and a qualifier
|
|
73
|
+
* reading `closest` is not a reference to it. Matching the map is not on its own enough to
|
|
74
|
+
* tell one from the other; the key is.
|
|
75
|
+
*
|
|
76
|
+
* Reached only from the generic object case — inside an identifier this package recognizes a
|
|
77
|
+
* domain is spec data and stays as it is, which is what keeps an overridden column's
|
|
78
|
+
* `specOverrides.domain` untouched.
|
|
79
|
+
*/
|
|
80
|
+
const relocateDomain = (domain: Record<string, unknown>): Record<string, unknown> =>
|
|
81
|
+
Object.fromEntries(
|
|
82
|
+
Object.entries(domain).map(([key, value]) => [
|
|
83
|
+
key,
|
|
84
|
+
typeof value === "string" && BlockScopedDomain.has(key) ? remapBlockId(value) : walk(value),
|
|
85
|
+
]),
|
|
86
|
+
);
|
|
87
|
+
|
|
60
88
|
return walk(params) as T;
|
|
61
89
|
}
|