@fluidframework/tree 2.117.0 → 2.118.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/CHANGELOG.md +86 -0
- package/api-report/tree.alpha.api.md +44 -1
- package/api-report/tree.beta.api.md +38 -0
- package/api-report/tree.legacy.beta.api.md +38 -0
- package/dist/entrypoints/alpha.d.ts +1 -1
- package/dist/entrypoints/alpha.d.ts.map +1 -1
- package/dist/entrypoints/alpha.js.map +1 -1
- package/dist/entrypoints/beta.d.ts +1 -1
- package/dist/entrypoints/beta.d.ts.map +1 -1
- package/dist/entrypoints/beta.js.map +1 -1
- package/dist/entrypoints/legacy.d.ts +1 -1
- package/dist/entrypoints/legacy.d.ts.map +1 -1
- package/dist/entrypoints/legacy.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +1 -1
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/schemaChecker.d.ts +9 -19
- package/dist/feature-libraries/schemaChecker.d.ts.map +1 -1
- package/dist/feature-libraries/schemaChecker.js +130 -46
- package/dist/feature-libraries/schemaChecker.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +13 -3
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +48 -11
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/simple-tree/api/configuration.d.ts +4 -4
- package/dist/simple-tree/api/configuration.d.ts.map +1 -1
- package/dist/simple-tree/api/configuration.js.map +1 -1
- package/dist/simple-tree/api/discrepancies.d.ts +36 -3
- package/dist/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/dist/simple-tree/api/discrepancies.js +40 -14
- package/dist/simple-tree/api/discrepancies.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +3 -2
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +3 -2
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts +22 -3
- package/dist/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaCompatibilityTester.js +140 -10
- package/dist/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/dist/simple-tree/api/tree.d.ts +172 -7
- package/dist/simple-tree/api/tree.d.ts.map +1 -1
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/core/toStored.d.ts +7 -0
- package/dist/simple-tree/core/toStored.d.ts.map +1 -1
- package/dist/simple-tree/core/toStored.js.map +1 -1
- package/dist/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeValid.js +2 -2
- package/dist/simple-tree/core/treeNodeValid.js.map +1 -1
- package/dist/simple-tree/index.d.ts +1 -1
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +4 -3
- package/dist/simple-tree/index.js.map +1 -1
- package/docs/main/glossary.md +163 -0
- package/lib/entrypoints/alpha.d.ts +1 -1
- package/lib/entrypoints/alpha.d.ts.map +1 -1
- package/lib/entrypoints/alpha.js.map +1 -1
- package/lib/entrypoints/beta.d.ts +1 -1
- package/lib/entrypoints/beta.d.ts.map +1 -1
- package/lib/entrypoints/beta.js.map +1 -1
- package/lib/entrypoints/legacy.d.ts +1 -1
- package/lib/entrypoints/legacy.d.ts.map +1 -1
- package/lib/entrypoints/legacy.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +1 -1
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/schemaChecker.d.ts +9 -19
- package/lib/feature-libraries/schemaChecker.d.ts.map +1 -1
- package/lib/feature-libraries/schemaChecker.js +133 -49
- package/lib/feature-libraries/schemaChecker.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +13 -3
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +49 -12
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/simple-tree/api/configuration.d.ts +4 -4
- package/lib/simple-tree/api/configuration.d.ts.map +1 -1
- package/lib/simple-tree/api/configuration.js.map +1 -1
- package/lib/simple-tree/api/discrepancies.d.ts +36 -3
- package/lib/simple-tree/api/discrepancies.d.ts.map +1 -1
- package/lib/simple-tree/api/discrepancies.js +40 -14
- package/lib/simple-tree/api/discrepancies.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +3 -2
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +1 -1
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts +22 -3
- package/lib/simple-tree/api/schemaCompatibilityTester.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaCompatibilityTester.js +136 -7
- package/lib/simple-tree/api/schemaCompatibilityTester.js.map +1 -1
- package/lib/simple-tree/api/tree.d.ts +172 -7
- package/lib/simple-tree/api/tree.d.ts.map +1 -1
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/core/toStored.d.ts +7 -0
- package/lib/simple-tree/core/toStored.d.ts.map +1 -1
- package/lib/simple-tree/core/toStored.js.map +1 -1
- package/lib/simple-tree/core/treeNodeValid.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeValid.js +3 -3
- package/lib/simple-tree/core/treeNodeValid.js.map +1 -1
- package/lib/simple-tree/index.d.ts +1 -1
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +1 -1
- package/lib/simple-tree/index.js.map +1 -1
- package/package.json +22 -22
- package/src/entrypoints/alpha.ts +3 -0
- package/src/entrypoints/beta.ts +2 -0
- package/src/entrypoints/legacy.ts +2 -0
- package/src/feature-libraries/index.ts +1 -1
- package/src/feature-libraries/schemaChecker.ts +198 -82
- package/src/index.ts +3 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/schematizingTreeView.ts +75 -21
- package/src/simple-tree/api/configuration.ts +4 -4
- package/src/simple-tree/api/discrepancies.ts +100 -5
- package/src/simple-tree/api/index.ts +7 -1
- package/src/simple-tree/api/schemaCompatibilityTester.ts +186 -11
- package/src/simple-tree/api/tree.ts +184 -8
- package/src/simple-tree/core/toStored.ts +8 -0
- package/src/simple-tree/core/treeNodeValid.ts +3 -1
- package/src/simple-tree/index.ts +4 -0
- package/docs/main/runtime-schema-upgrade.md +0 -208
|
@@ -47,24 +47,27 @@ function doesNodeKindMatchStoredNodeKind(viewKind, storedType) {
|
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* Finds and reports discrepancies between a view schema and a stored schema which make "canView" false.
|
|
50
|
+
*
|
|
51
|
+
* Optionally collects upgrade location information for staged schema upgrades during the same walk.
|
|
52
|
+
*
|
|
50
53
|
* @remarks
|
|
51
54
|
* See documentation on {@link Discrepancy} and its subtypes for details of possible discrepancies.
|
|
52
55
|
*/
|
|
53
|
-
function* getDiscrepanciesInAllowedContent(view, stored) {
|
|
56
|
+
function* getDiscrepanciesInAllowedContent(view, stored, upgradeCollector) {
|
|
54
57
|
// check root field discrepancies
|
|
55
|
-
yield* getFieldDiscrepancies(view.root, stored.rootFieldSchema, undefined, undefined);
|
|
58
|
+
yield* getFieldDiscrepancies(view.root, stored.rootFieldSchema, undefined, undefined, upgradeCollector);
|
|
56
59
|
// Check all of the stored nodes, including their fields for discrepancies.
|
|
57
60
|
for (const [identifier, storedSchema] of stored.nodeSchema) {
|
|
58
61
|
const viewSchema = view.definitions.get(identifier);
|
|
59
62
|
// if the view schema has a node that's also in the stored schema, check it.
|
|
60
63
|
if (viewSchema !== undefined) {
|
|
61
|
-
yield* getNodeDiscrepancies(identifier, viewSchema, storedSchema);
|
|
64
|
+
yield* getNodeDiscrepancies(identifier, viewSchema, storedSchema, upgradeCollector);
|
|
62
65
|
}
|
|
63
66
|
// Note that nodes that are missing in the view schema are only a problem if other stored schema nodes actually reference them which will produce its own discrepancy, so we can rely on that to produce any needed discrepancies.
|
|
64
67
|
}
|
|
65
68
|
}
|
|
66
69
|
exports.getDiscrepanciesInAllowedContent = getDiscrepanciesInAllowedContent;
|
|
67
|
-
function* getNodeDiscrepancies(identifier, view, stored) {
|
|
70
|
+
function* getNodeDiscrepancies(identifier, view, stored, upgradeCollector) {
|
|
68
71
|
if (!doesNodeKindMatchStoredNodeKind(view.kind, getStoredNodeSchemaType(stored))) {
|
|
69
72
|
yield {
|
|
70
73
|
identifier,
|
|
@@ -77,7 +80,7 @@ function* getNodeDiscrepancies(identifier, view, stored) {
|
|
|
77
80
|
switch (view.kind) {
|
|
78
81
|
case index_js_4.NodeKind.Object: {
|
|
79
82
|
(0, internal_1.assert)((0, index_js_5.isObjectNodeSchema)(view), 0xbe9 /* schema with node kind of object must implement ObjectNodeSchema */);
|
|
80
|
-
yield* computeObjectNodeDiscrepancies(identifier, view, stored);
|
|
83
|
+
yield* computeObjectNodeDiscrepancies(identifier, view, stored, upgradeCollector);
|
|
81
84
|
break;
|
|
82
85
|
}
|
|
83
86
|
case index_js_4.NodeKind.Array: {
|
|
@@ -92,17 +95,17 @@ function* getNodeDiscrepancies(identifier, view, stored) {
|
|
|
92
95
|
};
|
|
93
96
|
return;
|
|
94
97
|
}
|
|
95
|
-
yield* getAllowedTypeDiscrepancies((0, index_js_4.normalizeAndEvaluateAnnotatedAllowedTypes)(view.info).types, arrayStoredSchema, (0, index_js_3.brand)(view.identifier), index_js_1.EmptyKey);
|
|
98
|
+
yield* getAllowedTypeDiscrepancies((0, index_js_4.normalizeAndEvaluateAnnotatedAllowedTypes)(view.info).types, arrayStoredSchema, (0, index_js_3.brand)(view.identifier), index_js_1.EmptyKey, false, upgradeCollector);
|
|
96
99
|
break;
|
|
97
100
|
}
|
|
98
101
|
case index_js_4.NodeKind.Map: {
|
|
99
102
|
(0, internal_1.assert)((0, index_js_5.isMapNodeSchema)(view), 0xbeb /* schema with node kind of map must implement MapNodeSchema */);
|
|
100
|
-
yield* getFieldDiscrepancies((0, fieldSchema_js_1.createFieldSchema)(fieldSchema_js_1.FieldKind.Optional, view.info), stored.mapFields, identifier, undefined);
|
|
103
|
+
yield* getFieldDiscrepancies((0, fieldSchema_js_1.createFieldSchema)(fieldSchema_js_1.FieldKind.Optional, view.info), stored.mapFields, identifier, undefined, upgradeCollector);
|
|
101
104
|
break;
|
|
102
105
|
}
|
|
103
106
|
case index_js_4.NodeKind.Record: {
|
|
104
107
|
(0, internal_1.assert)((0, index_js_5.isRecordNodeSchema)(view), 0xbec /* schema with node kind of record must implement RecordNodeSchema */);
|
|
105
|
-
yield* getFieldDiscrepancies((0, fieldSchema_js_1.createFieldSchema)(fieldSchema_js_1.FieldKind.Optional, view.info), stored.mapFields, identifier, undefined);
|
|
108
|
+
yield* getFieldDiscrepancies((0, fieldSchema_js_1.createFieldSchema)(fieldSchema_js_1.FieldKind.Optional, view.info), stored.mapFields, identifier, undefined, upgradeCollector);
|
|
106
109
|
break;
|
|
107
110
|
}
|
|
108
111
|
case index_js_4.NodeKind.Leaf: {
|
|
@@ -136,8 +139,14 @@ function findExtraAllowedTypes(viewAllowedTypes, storedAllowedTypes) {
|
|
|
136
139
|
// This would allow for nicer compatibility errors and more detailed compatibility status in the future.
|
|
137
140
|
const view = viewAllowedTypes.filter((value) => !storedAllowedTypes.has((0, index_js_3.brand)(value.type.identifier)) &&
|
|
138
141
|
value.metadata.stagedSchemaUpgrade === undefined);
|
|
142
|
+
const stagedView = viewAllowedTypes.filter((value) => !storedAllowedTypes.has((0, index_js_3.brand)(value.type.identifier)) &&
|
|
143
|
+
value.metadata.stagedSchemaUpgrade !== undefined);
|
|
139
144
|
const stored = [...storedAllowedTypes].filter((value) => !viewNodeSchemaIdentifiers.has(value));
|
|
140
|
-
return {
|
|
145
|
+
return {
|
|
146
|
+
view,
|
|
147
|
+
...(stagedView.length === 0 ? {} : { stagedView }),
|
|
148
|
+
stored,
|
|
149
|
+
};
|
|
141
150
|
}
|
|
142
151
|
exports.findExtraAllowedTypes = findExtraAllowedTypes;
|
|
143
152
|
/**
|
|
@@ -153,9 +162,13 @@ exports.findExtraAllowedTypes = findExtraAllowedTypes;
|
|
|
153
162
|
*
|
|
154
163
|
* @param fieldKey - If the key is missing, it indicates that this is the root field schema.
|
|
155
164
|
*/
|
|
156
|
-
function* getFieldDiscrepancies(view, stored, identifier, fieldKey) {
|
|
165
|
+
function* getFieldDiscrepancies(view, stored, identifier, fieldKey, upgradeCollector) {
|
|
157
166
|
(0, internal_1.assert)(view instanceof fieldSchema_js_1.FieldSchemaAlpha, 0xbee /* all field schema should be FieldSchemaAlpha */);
|
|
158
|
-
|
|
167
|
+
// Collect staged-optional upgrade location if present.
|
|
168
|
+
if (upgradeCollector !== undefined && view.isStagedOptional !== false) {
|
|
169
|
+
upgradeCollector.optionalField(view.isStagedOptional, stored.kind === index_js_2.FieldKinds.optional.identifier);
|
|
170
|
+
}
|
|
171
|
+
yield* getAllowedTypeDiscrepancies(view.allowedTypesFull.evaluate().types, stored.types, identifier, fieldKey, view.isStagedOptional !== false, upgradeCollector);
|
|
159
172
|
const viewKind = toStoredSchema_js_1.convertFieldKind.get(view.kind) ??
|
|
160
173
|
(0, internal_1.fail)(0xbef /* A conversion from a FieldKind to a FlexFieldKind should exist */);
|
|
161
174
|
// This checks if the field kind in the view schema is not compatible with the stored schema.
|
|
@@ -169,6 +182,7 @@ function* getFieldDiscrepancies(view, stored, identifier, fieldKey) {
|
|
|
169
182
|
mismatch: "fieldKind",
|
|
170
183
|
view: viewKind.identifier,
|
|
171
184
|
stored: stored.kind,
|
|
185
|
+
...(view.isStagedOptional === false ? {} : { viewIsStagedOptional: true }),
|
|
172
186
|
};
|
|
173
187
|
}
|
|
174
188
|
}
|
|
@@ -184,7 +198,15 @@ function* getFieldDiscrepancies(view, stored, identifier, fieldKey) {
|
|
|
184
198
|
*
|
|
185
199
|
* @param fieldKey - If the key is missing, it indicates that this is the root field schema.
|
|
186
200
|
*/
|
|
187
|
-
function* getAllowedTypeDiscrepancies(view, stored, identifier, fieldKey) {
|
|
201
|
+
function* getAllowedTypeDiscrepancies(view, stored, identifier, fieldKey, viewIsStagedOptional, upgradeCollector) {
|
|
202
|
+
// Collect staged allowed type upgrade locations if present.
|
|
203
|
+
if (upgradeCollector !== undefined) {
|
|
204
|
+
for (const allowedType of view) {
|
|
205
|
+
if (allowedType.metadata.stagedSchemaUpgrade !== undefined) {
|
|
206
|
+
upgradeCollector.allowedType(allowedType.metadata.stagedSchemaUpgrade, stored.has((0, index_js_3.brand)(allowedType.type.identifier)));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
188
210
|
const discrepancies = findExtraAllowedTypes(view, stored);
|
|
189
211
|
if (discrepancies.view.length > 0 || discrepancies.stored.length > 0) {
|
|
190
212
|
yield {
|
|
@@ -192,6 +214,7 @@ function* getAllowedTypeDiscrepancies(view, stored, identifier, fieldKey) {
|
|
|
192
214
|
identifier,
|
|
193
215
|
fieldKey,
|
|
194
216
|
mismatch: "allowedTypes",
|
|
217
|
+
...(viewIsStagedOptional ? { viewIsStagedOptional: true } : {}),
|
|
195
218
|
};
|
|
196
219
|
}
|
|
197
220
|
}
|
|
@@ -207,7 +230,7 @@ function* getAllowedTypeDiscrepancies(view, stored, identifier, fieldKey) {
|
|
|
207
230
|
*
|
|
208
231
|
* This function includes discrepancies within the common fields and their allowed types, but does NOT recurse to report and discrepancies within the node types referenced by those fields.
|
|
209
232
|
*/
|
|
210
|
-
function* computeObjectNodeDiscrepancies(identifier, view, stored) {
|
|
233
|
+
function* computeObjectNodeDiscrepancies(identifier, view, stored, upgradeCollector) {
|
|
211
234
|
/**
|
|
212
235
|
* Similar to the logic used for tracking discrepancies between two node schemas, we will identify
|
|
213
236
|
* three types of differences:
|
|
@@ -232,10 +255,13 @@ function* computeObjectNodeDiscrepancies(identifier, view, stored) {
|
|
|
232
255
|
mismatch: "fieldKind",
|
|
233
256
|
view: viewKind.identifier,
|
|
234
257
|
stored: index_js_1.storedEmptyFieldSchema.kind,
|
|
258
|
+
...(fieldSchema instanceof fieldSchema_js_1.FieldSchemaAlpha && fieldSchema.isStagedOptional !== false
|
|
259
|
+
? { viewIsStagedOptional: true }
|
|
260
|
+
: {}),
|
|
235
261
|
};
|
|
236
262
|
}
|
|
237
263
|
else {
|
|
238
|
-
yield* getFieldDiscrepancies(fieldSchema, storedSchema, identifier, fieldKey);
|
|
264
|
+
yield* getFieldDiscrepancies(fieldSchema, storedSchema, identifier, fieldKey, upgradeCollector);
|
|
239
265
|
}
|
|
240
266
|
}
|
|
241
267
|
for (const [fieldKey, schema] of stored.objectNodeFields) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discrepancies.js","sourceRoot":"","sources":["../../../src/simple-tree/api/discrepancies.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, fail, unreachableCase } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\tEmptyKey,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\tforbiddenFieldKindIdentifier,\n\tLeafNodeStoredSchema,\n\tMapNodeStoredSchema,\n\tObjectNodeStoredSchema,\n\tstoredEmptyFieldSchema,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeNodeStoredSchema,\n\ttype TreeStoredSchema,\n\ttype TreeTypeSet,\n\ttype ValueSchema,\n} from \"../../core/index.js\";\nimport { FieldKinds } from \"../../feature-libraries/index.js\";\nimport { brand } from \"../../util/index.js\";\nimport {\n\tNodeKind,\n\tnormalizeAndEvaluateAnnotatedAllowedTypes,\n\ttype AnnotatedAllowedType,\n\ttype TreeNodeSchema,\n} from \"../core/index.js\";\nimport {\n\tcreateFieldSchema,\n\tFieldKind,\n\tFieldSchemaAlpha,\n\ttype FieldSchema,\n} from \"../fieldSchema.js\";\nimport { LeafNodeSchema } from \"../leafNodeSchema.js\";\nimport {\n\tisArrayNodeSchema,\n\tisMapNodeSchema,\n\tisObjectNodeSchema,\n\tisRecordNodeSchema,\n\ttype ObjectNodeSchemaPrivate,\n} from \"../node-kinds/index.js\";\nimport { convertFieldKind } from \"../toStoredSchema.js\";\nimport type { TreeSchema } from \"../treeSchema.js\";\n\nimport { tryStoredSchemaAsArray } from \"./customTree.js\";\n\n/**\n * Discriminated union (keyed on `mismatch`) of discrepancies between a view and stored schema which\n * make it possible for content matching the stored schema to be incompatible with the view schema.\n */\nexport type Discrepancy = FieldDiscrepancy | NodeKindDiscrepancy;\n\n/**\n * A discrepancy in the declaration of a field.\n */\nexport type FieldDiscrepancy =\n\t| AllowedTypeDiscrepancy\n\t| FieldKindDiscrepancy\n\t| ValueSchemaDiscrepancy;\n\n/**\n * Information about where a field discrepancy is located within a collection of schema.\n */\nexport interface FieldDiscrepancyLocation {\n\t/**\n\t * The {@link TreeNodeSchemaIdentifier} that contains the discrepancy.\n\t *\n\t * Undefined iff the discrepancy is part of the root field schema.\n\t */\n\treadonly identifier: TreeNodeSchemaIdentifier | undefined;\n\t/**\n\t * The {@link FieldKey} for the field that contains the discrepancy.\n\t * Undefined when:\n\t * - the discrepancy is part of the root field schema\n\t * - the discrepancy is for 'all fields' of a map node\n\t */\n\treadonly fieldKey: FieldKey | undefined;\n}\n\n/**\n * A discrepancy in the allowed types of a field.\n *\n * @remarks\n * This reports the symmetric difference of allowed types.\n */\nexport interface AllowedTypeDiscrepancy extends FieldDiscrepancyLocation {\n\treadonly mismatch: \"allowedTypes\";\n\t/**\n\t * Annotated allowed types in viewed schema\n\t * (excluding {@link SchemaStaticsBeta.staged | staged} schema) which are not allowed in stored schema.\n\t */\n\treadonly view: readonly AnnotatedAllowedType<TreeNodeSchema>[];\n\t/**\n\t * Allowed type identifiers in stored schema which are not allowed in view schema\n\t * (including the view schema's {@link SchemaStaticsBeta.staged | staged} schema).\n\t */\n\treadonly stored: readonly TreeNodeSchemaIdentifier[];\n}\n\n/**\n * Differences in `FieldKindIdentifier` between two schema.\n */\nexport interface FieldKindDiscrepancy extends FieldDiscrepancyLocation {\n\treadonly mismatch: \"fieldKind\";\n\treadonly view: FieldKindIdentifier;\n\treadonly stored: FieldKindIdentifier;\n}\n\n/**\n * Differences in the `ValueSchema` of two `LeafNodeStoredSchema` objects.\n */\nexport interface ValueSchemaDiscrepancy {\n\tidentifier: TreeNodeSchemaIdentifier;\n\tmismatch: \"valueSchema\";\n\tview: ValueSchema | undefined;\n\tstored: ValueSchema | undefined;\n}\n\n/**\n * Differences in the kind of node schema.\n *\n * Includes when stored object schema are expected to be compatible with an array node schema.\n */\nexport interface NodeKindDiscrepancy {\n\tidentifier: TreeNodeSchemaIdentifier;\n\tmismatch: \"nodeKind\";\n\tview: NodeKind;\n\tstored: SchemaFactoryNodeKind;\n}\n\ntype SchemaFactoryNodeKind =\n\t| typeof ObjectNodeStoredSchema\n\t| typeof MapNodeStoredSchema\n\t| typeof LeafNodeStoredSchema;\n\nfunction getStoredNodeSchemaType(nodeSchema: TreeNodeStoredSchema): SchemaFactoryNodeKind {\n\tif (nodeSchema instanceof ObjectNodeStoredSchema) {\n\t\treturn ObjectNodeStoredSchema;\n\t}\n\tif (nodeSchema instanceof MapNodeStoredSchema) {\n\t\treturn MapNodeStoredSchema;\n\t}\n\tif (nodeSchema instanceof LeafNodeStoredSchema) {\n\t\treturn LeafNodeStoredSchema;\n\t}\n\tfail(0xbe8 /* Invalid stored node schema type */);\n}\n\nfunction doesNodeKindMatchStoredNodeKind(\n\tviewKind: NodeKind,\n\tstoredType: SchemaFactoryNodeKind,\n): boolean {\n\tswitch (viewKind) {\n\t\tcase NodeKind.Leaf: {\n\t\t\treturn storedType === LeafNodeStoredSchema;\n\t\t}\n\t\tcase NodeKind.Array:\n\t\tcase NodeKind.Object: {\n\t\t\treturn storedType === ObjectNodeStoredSchema;\n\t\t}\n\t\tcase NodeKind.Map:\n\t\tcase NodeKind.Record: {\n\t\t\treturn storedType === MapNodeStoredSchema;\n\t\t}\n\t\tdefault: {\n\t\t\tunreachableCase(viewKind);\n\t\t}\n\t}\n}\n\n/**\n * Finds and reports discrepancies between a view schema and a stored schema which make \"canView\" false.\n * @remarks\n * See documentation on {@link Discrepancy} and its subtypes for details of possible discrepancies.\n */\nexport function* getDiscrepanciesInAllowedContent(\n\tview: TreeSchema,\n\tstored: TreeStoredSchema,\n): Iterable<Discrepancy> {\n\t// check root field discrepancies\n\tyield* getFieldDiscrepancies(view.root, stored.rootFieldSchema, undefined, undefined);\n\n\t// Check all of the stored nodes, including their fields for discrepancies.\n\tfor (const [identifier, storedSchema] of stored.nodeSchema) {\n\t\tconst viewSchema = view.definitions.get(identifier);\n\n\t\t// if the view schema has a node that's also in the stored schema, check it.\n\t\tif (viewSchema !== undefined) {\n\t\t\tyield* getNodeDiscrepancies(identifier, viewSchema, storedSchema);\n\t\t}\n\t\t// Note that nodes that are missing in the view schema are only a problem if other stored schema nodes actually reference them which will produce its own discrepancy, so we can rely on that to produce any needed discrepancies.\n\t}\n}\n\nfunction* getNodeDiscrepancies(\n\tidentifier: TreeNodeSchemaIdentifier,\n\tview: TreeNodeSchema,\n\tstored: TreeNodeStoredSchema,\n): Iterable<Discrepancy> {\n\tif (!doesNodeKindMatchStoredNodeKind(view.kind, getStoredNodeSchemaType(stored))) {\n\t\tyield {\n\t\t\tidentifier,\n\t\t\tmismatch: \"nodeKind\",\n\t\t\tview: view.kind,\n\t\t\tstored: getStoredNodeSchemaType(stored),\n\t\t};\n\t\treturn;\n\t}\n\n\tswitch (view.kind) {\n\t\tcase NodeKind.Object: {\n\t\t\tassert(\n\t\t\t\tisObjectNodeSchema(view),\n\t\t\t\t0xbe9 /* schema with node kind of object must implement ObjectNodeSchema */,\n\t\t\t);\n\t\t\tyield* computeObjectNodeDiscrepancies(\n\t\t\t\tidentifier,\n\t\t\t\tview,\n\t\t\t\tstored as ObjectNodeStoredSchema,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Array: {\n\t\t\tassert(\n\t\t\t\tisArrayNodeSchema(view),\n\t\t\t\t0xbea /* schema with node kind of array must implement ArrayNodeSchema */,\n\t\t\t);\n\n\t\t\tconst arrayStoredSchema = tryStoredSchemaAsArray(stored);\n\t\t\tif (arrayStoredSchema === undefined) {\n\t\t\t\tyield {\n\t\t\t\t\tidentifier,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: NodeKind.Array,\n\t\t\t\t\tstored: getStoredNodeSchemaType(stored),\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tyield* getAllowedTypeDiscrepancies(\n\t\t\t\tnormalizeAndEvaluateAnnotatedAllowedTypes(view.info).types,\n\t\t\t\tarrayStoredSchema,\n\t\t\t\tbrand(view.identifier),\n\t\t\t\tEmptyKey,\n\t\t\t);\n\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Map: {\n\t\t\tassert(\n\t\t\t\tisMapNodeSchema(view),\n\t\t\t\t0xbeb /* schema with node kind of map must implement MapNodeSchema */,\n\t\t\t);\n\n\t\t\tyield* getFieldDiscrepancies(\n\t\t\t\tcreateFieldSchema(FieldKind.Optional, view.info),\n\t\t\t\t(stored as MapNodeStoredSchema).mapFields,\n\t\t\t\tidentifier,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Record: {\n\t\t\tassert(\n\t\t\t\tisRecordNodeSchema(view),\n\t\t\t\t0xbec /* schema with node kind of record must implement RecordNodeSchema */,\n\t\t\t);\n\n\t\t\tyield* getFieldDiscrepancies(\n\t\t\t\tcreateFieldSchema(FieldKind.Optional, view.info),\n\t\t\t\t(stored as MapNodeStoredSchema).mapFields,\n\t\t\t\tidentifier,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Leaf: {\n\t\t\tassert(\n\t\t\t\tview instanceof LeafNodeSchema,\n\t\t\t\t0xbed /* schema with node kind of leaf must implement LeafNodeSchema */,\n\t\t\t);\n\t\t\t// TODO: leafKind seems like a bad name\n\t\t\tconst viewValue = view.leafKind;\n\t\t\tconst storedValue = (stored as LeafNodeStoredSchema).leafValue;\n\t\t\tif (viewValue !== storedValue) {\n\t\t\t\tyield {\n\t\t\t\t\tidentifier,\n\t\t\t\t\tmismatch: \"valueSchema\",\n\t\t\t\t\tview: viewValue,\n\t\t\t\t\tstored: storedValue,\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Returns the allowed types that are not present in both the given view and stored schemas.\n */\nexport function findExtraAllowedTypes(\n\tviewAllowedTypes: readonly AnnotatedAllowedType<TreeNodeSchema>[],\n\tstoredAllowedTypes: TreeTypeSet,\n): Pick<AllowedTypeDiscrepancy, \"view\" | \"stored\"> {\n\tconst viewNodeSchemaIdentifiers = new Set(\n\t\tviewAllowedTypes.map((value) => value.type.identifier),\n\t);\n\n\t// TODO:\n\t// Add detecting which SchemaUpgrades have been made.\n\t// When doing so, each will fall into one of three states: staged, partially applied, or fully applied.\n\t// This would allow for nicer compatibility errors and more detailed compatibility status in the future.\n\tconst view = viewAllowedTypes.filter(\n\t\t(value) =>\n\t\t\t!storedAllowedTypes.has(brand(value.type.identifier)) &&\n\t\t\tvalue.metadata.stagedSchemaUpgrade === undefined,\n\t);\n\tconst stored = [...storedAllowedTypes].filter(\n\t\t(value) => !viewNodeSchemaIdentifiers.has(value),\n\t);\n\treturn { view, stored };\n}\n\n/**\n * The function to track the discrepancies between a field view schema and a stored schema.\n *\n * @remarks\n * This function yields discrepancies in the following cases:\n * 1. If the view schema has allowed types that are not present in the stored schema.\n * 2. If the stored schema has allowed types that are not present in the view schema.\n * 3. If the field kind in the view schema is not compatible with the stored schema.\n *\n * This function does not recurse into the nodes of the view schema and only makes comparisons at the field level.\n *\n * @param fieldKey - If the key is missing, it indicates that this is the root field schema.\n */\nfunction* getFieldDiscrepancies(\n\tview: FieldSchema,\n\tstored: TreeFieldStoredSchema,\n\tidentifier: TreeNodeSchemaIdentifier | undefined,\n\tfieldKey: FieldKey | undefined,\n): Iterable<FieldDiscrepancy> {\n\tassert(\n\t\tview instanceof FieldSchemaAlpha,\n\t\t0xbee /* all field schema should be FieldSchemaAlpha */,\n\t);\n\tyield* getAllowedTypeDiscrepancies(\n\t\tview.allowedTypesFull.evaluate().types,\n\t\tstored.types,\n\t\tidentifier,\n\t\tfieldKey,\n\t);\n\n\tconst viewKind =\n\t\tconvertFieldKind.get(view.kind) ??\n\t\tfail(0xbef /* A conversion from a FieldKind to a FlexFieldKind should exist */);\n\n\t// This checks if the field kind in the view schema is not compatible with the stored schema.\n\t// A staged optional field (optional in the view) is compatible with a required stored field\n\t// during the rollout period — suppress the kind discrepancy in that case.\n\tif (\n\t\tviewKind.identifier !== stored.kind &&\n\t\t!(view.isStagedOptional !== false && stored.kind === FieldKinds.required.identifier)\n\t) {\n\t\tyield {\n\t\t\tidentifier,\n\t\t\tfieldKey,\n\t\t\tmismatch: \"fieldKind\",\n\t\t\tview: viewKind.identifier,\n\t\t\tstored: stored.kind,\n\t\t} satisfies FieldKindDiscrepancy;\n\t}\n}\n\n/**\n * The function to track the discrepancies between a field view schema and a stored schema.\n *\n * @remarks\n * This function yields discrepancies in the following cases:\n * 1. If the view schema has allowed types that are not present in the stored schema.\n * 2. If the stored schema has allowed types that are not present in the view schema.\n *\n * This function does not recurse into the nodes of the view schema and only makes comparisons at the field level.\n *\n * @param fieldKey - If the key is missing, it indicates that this is the root field schema.\n */\nfunction* getAllowedTypeDiscrepancies(\n\tview: readonly AnnotatedAllowedType<TreeNodeSchema>[],\n\tstored: TreeTypeSet,\n\tidentifier: TreeNodeSchemaIdentifier | undefined,\n\tfieldKey: FieldKey | undefined,\n): Iterable<FieldDiscrepancy> {\n\tconst discrepancies = findExtraAllowedTypes(view, stored);\n\tif (discrepancies.view.length > 0 || discrepancies.stored.length > 0) {\n\t\tyield {\n\t\t\t...discrepancies,\n\t\t\tidentifier,\n\t\t\tfieldKey,\n\t\t\tmismatch: \"allowedTypes\",\n\t\t} satisfies AllowedTypeDiscrepancy;\n\t}\n}\n\n/**\n * Computes discrepancies between a view schema and a stored schema for nodes that are treated as object nodes in the stored schema.\n * This includes both view object nodes and view array nodes.\n *\n * This function yields discrepancies in the following cases:\n *\n * 1. If the view schema has fields that are not present in the stored schema.\n * 2. If the stored schema has fields that are not present in the view schema.\n * 3. If the field kind or allowed types of a field in the view schema is not compatible with the stored schema.\n *\n * This function includes discrepancies within the common fields and their allowed types, but does NOT recurse to report and discrepancies within the node types referenced by those fields.\n */\nfunction* computeObjectNodeDiscrepancies(\n\tidentifier: TreeNodeSchemaIdentifier,\n\tview: ObjectNodeSchemaPrivate,\n\tstored: ObjectNodeStoredSchema,\n): Iterable<FieldDiscrepancy> {\n\t/**\n\t * Similar to the logic used for tracking discrepancies between two node schemas, we will identify\n\t * three types of differences:\n\t * 1. Fields that exist in the view schema but not in the stored schema.\n\t * 2. Fields that exist in both schemas but have different contents.\n\t * 3. Fields that exist in the stored schema but not in the view schema.\n\t *\n\t * First, the view schema is iterated to track the first two types of differences.\n\t * Then, the stored schema is iterated to find the third type.\n\t */\n\n\tconst viewKeys = new Set<FieldKey>();\n\n\tfor (const [_, { storedKey: fieldKey, schema: fieldSchema }] of view.flexKeyMap) {\n\t\tconst storedSchema = stored.objectNodeFields.get(fieldKey);\n\t\tviewKeys.add(fieldKey);\n\n\t\t// If the view schema has a field that's not in the stored schema\n\t\tif (storedSchema === undefined) {\n\t\t\tconst viewKind =\n\t\t\t\tconvertFieldKind.get(fieldSchema.kind) ??\n\t\t\t\tfail(0xbf0 /* A conversion from a FieldKind to a FlexFieldKind should exist */);\n\t\t\tyield {\n\t\t\t\tidentifier,\n\t\t\t\tfieldKey,\n\t\t\t\tmismatch: \"fieldKind\",\n\t\t\t\tview: viewKind.identifier,\n\t\t\t\tstored: storedEmptyFieldSchema.kind,\n\t\t\t} satisfies FieldKindDiscrepancy;\n\t\t} else {\n\t\t\tyield* getFieldDiscrepancies(fieldSchema, storedSchema, identifier, fieldKey);\n\t\t}\n\t}\n\n\tfor (const [fieldKey, schema] of stored.objectNodeFields) {\n\t\tif (schema.kind === forbiddenFieldKindIdentifier) {\n\t\t\t// In the stored schema the field is explicitly forbidden.\n\t\t\t// This has the same semantics of the field not being mentioned in the stored schema,\n\t\t\t// and thus can be skipped.\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the stored schema has a field that's not in the view schema\n\t\t// When the application has opted into it, we allow viewing documents which have additional\n\t\t// optional fields in the stored schema that are not present in the view schema.\n\t\tif (\n\t\t\t!viewKeys.has(fieldKey) &&\n\t\t\t(!view.allowUnknownOptionalFields || schema.kind !== FieldKinds.optional.identifier)\n\t\t) {\n\t\t\tyield {\n\t\t\t\tidentifier,\n\t\t\t\tfieldKey,\n\t\t\t\tmismatch: \"fieldKind\",\n\t\t\t\tview: storedEmptyFieldSchema.kind,\n\t\t\t\tstored: schema.kind,\n\t\t\t} satisfies FieldKindDiscrepancy;\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"discrepancies.js","sourceRoot":"","sources":["../../../src/simple-tree/api/discrepancies.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, fail, unreachableCase } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\tEmptyKey,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\tforbiddenFieldKindIdentifier,\n\tLeafNodeStoredSchema,\n\tMapNodeStoredSchema,\n\tObjectNodeStoredSchema,\n\tstoredEmptyFieldSchema,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeNodeStoredSchema,\n\ttype TreeStoredSchema,\n\ttype TreeTypeSet,\n\ttype ValueSchema,\n} from \"../../core/index.js\";\nimport { FieldKinds } from \"../../feature-libraries/index.js\";\nimport { brand } from \"../../util/index.js\";\nimport {\n\tNodeKind,\n\tnormalizeAndEvaluateAnnotatedAllowedTypes,\n\ttype AnnotatedAllowedType,\n\ttype SchemaUpgrade,\n\ttype TreeNodeSchema,\n} from \"../core/index.js\";\nimport {\n\tcreateFieldSchema,\n\tFieldKind,\n\tFieldSchemaAlpha,\n\ttype FieldSchema,\n} from \"../fieldSchema.js\";\nimport { LeafNodeSchema } from \"../leafNodeSchema.js\";\nimport {\n\tisArrayNodeSchema,\n\tisMapNodeSchema,\n\tisObjectNodeSchema,\n\tisRecordNodeSchema,\n\ttype ObjectNodeSchemaPrivate,\n} from \"../node-kinds/index.js\";\nimport { convertFieldKind } from \"../toStoredSchema.js\";\nimport type { TreeSchema } from \"../treeSchema.js\";\n\nimport { tryStoredSchemaAsArray } from \"./customTree.js\";\n\n/**\n * Collects upgrade location data during a schema walk.\n * @remarks Called for each staged type or staged optional field encountered.\n */\nexport interface UpgradeLocationCollector {\n\t/**\n\t * Record a staged allowed type location.\n\t * @param upgrade - The upgrade token guarding this type.\n\t * @param isEnabled - Whether this type is present in stored schema.\n\t */\n\tallowedType(upgrade: SchemaUpgrade, isEnabled: boolean): void;\n\t/**\n\t * Record a staged optional field location.\n\t * @param upgrade - The upgrade token guarding this field.\n\t * @param isEnabled - Whether the stored field is already optional.\n\t */\n\toptionalField(upgrade: SchemaUpgrade, isEnabled: boolean): void;\n}\n\n/**\n * Discriminated union (keyed on `mismatch`) of discrepancies between a view and stored schema which\n * make it possible for content matching the stored schema to be incompatible with the view schema.\n */\nexport type Discrepancy = FieldDiscrepancy | NodeKindDiscrepancy;\n\n/**\n * A discrepancy in the declaration of a field.\n */\nexport type FieldDiscrepancy =\n\t| AllowedTypeDiscrepancy\n\t| FieldKindDiscrepancy\n\t| ValueSchemaDiscrepancy;\n\n/**\n * Information about where a field discrepancy is located within a collection of schema.\n */\nexport interface FieldDiscrepancyLocation {\n\t/**\n\t * The {@link TreeNodeSchemaIdentifier} that contains the discrepancy.\n\t *\n\t * Undefined iff the discrepancy is part of the root field schema.\n\t */\n\treadonly identifier: TreeNodeSchemaIdentifier | undefined;\n\t/**\n\t * The {@link FieldKey} for the field that contains the discrepancy.\n\t * Undefined when:\n\t * - the discrepancy is part of the root field schema\n\t * - the discrepancy is for 'all fields' of a map node\n\t */\n\treadonly fieldKey: FieldKey | undefined;\n\t/**\n\t * Whether the view field is a staged optional field.\n\t * Omitted when false.\n\t */\n\treadonly viewIsStagedOptional?: true;\n}\n\n/**\n * A discrepancy in the allowed types of a field.\n *\n * @remarks\n * This reports the symmetric difference of allowed types.\n */\nexport interface AllowedTypeDiscrepancy extends FieldDiscrepancyLocation {\n\treadonly mismatch: \"allowedTypes\";\n\t/**\n\t * Annotated allowed types in viewed schema\n\t * (excluding {@link SchemaStaticsBeta.staged | staged} schema) which are not allowed in stored schema.\n\t */\n\treadonly view: readonly AnnotatedAllowedType<TreeNodeSchema>[];\n\t/**\n\t * Staged allowed types in the view schema which are not allowed in stored schema.\n\t *\n\t * @remarks\n\t * These types do not cause the discrepancy and are omitted when there are none.\n\t */\n\treadonly stagedView?: readonly AnnotatedAllowedType<TreeNodeSchema>[];\n\t/**\n\t * Allowed type identifiers in stored schema which are not allowed in view schema\n\t * (including the view schema's {@link SchemaStaticsBeta.staged | staged} schema).\n\t */\n\treadonly stored: readonly TreeNodeSchemaIdentifier[];\n}\n\n/**\n * Differences in `FieldKindIdentifier` between two schema.\n */\nexport interface FieldKindDiscrepancy extends FieldDiscrepancyLocation {\n\treadonly mismatch: \"fieldKind\";\n\treadonly view: FieldKindIdentifier;\n\treadonly stored: FieldKindIdentifier;\n}\n\n/**\n * Differences in the `ValueSchema` of two `LeafNodeStoredSchema` objects.\n */\nexport interface ValueSchemaDiscrepancy {\n\tidentifier: TreeNodeSchemaIdentifier;\n\tmismatch: \"valueSchema\";\n\tview: ValueSchema | undefined;\n\tstored: ValueSchema | undefined;\n}\n\n/**\n * Differences in the kind of node schema.\n *\n * Includes when stored object schema are expected to be compatible with an array node schema.\n */\nexport interface NodeKindDiscrepancy {\n\tidentifier: TreeNodeSchemaIdentifier;\n\tmismatch: \"nodeKind\";\n\tview: NodeKind;\n\tstored: SchemaFactoryNodeKind;\n}\n\ntype SchemaFactoryNodeKind =\n\t| typeof ObjectNodeStoredSchema\n\t| typeof MapNodeStoredSchema\n\t| typeof LeafNodeStoredSchema;\n\nfunction getStoredNodeSchemaType(nodeSchema: TreeNodeStoredSchema): SchemaFactoryNodeKind {\n\tif (nodeSchema instanceof ObjectNodeStoredSchema) {\n\t\treturn ObjectNodeStoredSchema;\n\t}\n\tif (nodeSchema instanceof MapNodeStoredSchema) {\n\t\treturn MapNodeStoredSchema;\n\t}\n\tif (nodeSchema instanceof LeafNodeStoredSchema) {\n\t\treturn LeafNodeStoredSchema;\n\t}\n\tfail(0xbe8 /* Invalid stored node schema type */);\n}\n\nfunction doesNodeKindMatchStoredNodeKind(\n\tviewKind: NodeKind,\n\tstoredType: SchemaFactoryNodeKind,\n): boolean {\n\tswitch (viewKind) {\n\t\tcase NodeKind.Leaf: {\n\t\t\treturn storedType === LeafNodeStoredSchema;\n\t\t}\n\t\tcase NodeKind.Array:\n\t\tcase NodeKind.Object: {\n\t\t\treturn storedType === ObjectNodeStoredSchema;\n\t\t}\n\t\tcase NodeKind.Map:\n\t\tcase NodeKind.Record: {\n\t\t\treturn storedType === MapNodeStoredSchema;\n\t\t}\n\t\tdefault: {\n\t\t\tunreachableCase(viewKind);\n\t\t}\n\t}\n}\n\n/**\n * Finds and reports discrepancies between a view schema and a stored schema which make \"canView\" false.\n *\n * Optionally collects upgrade location information for staged schema upgrades during the same walk.\n *\n * @remarks\n * See documentation on {@link Discrepancy} and its subtypes for details of possible discrepancies.\n */\nexport function* getDiscrepanciesInAllowedContent(\n\tview: TreeSchema,\n\tstored: TreeStoredSchema,\n\tupgradeCollector?: UpgradeLocationCollector,\n): Iterable<Discrepancy> {\n\t// check root field discrepancies\n\tyield* getFieldDiscrepancies(\n\t\tview.root,\n\t\tstored.rootFieldSchema,\n\t\tundefined,\n\t\tundefined,\n\t\tupgradeCollector,\n\t);\n\n\t// Check all of the stored nodes, including their fields for discrepancies.\n\tfor (const [identifier, storedSchema] of stored.nodeSchema) {\n\t\tconst viewSchema = view.definitions.get(identifier);\n\n\t\t// if the view schema has a node that's also in the stored schema, check it.\n\t\tif (viewSchema !== undefined) {\n\t\t\tyield* getNodeDiscrepancies(identifier, viewSchema, storedSchema, upgradeCollector);\n\t\t}\n\t\t// Note that nodes that are missing in the view schema are only a problem if other stored schema nodes actually reference them which will produce its own discrepancy, so we can rely on that to produce any needed discrepancies.\n\t}\n}\n\nfunction* getNodeDiscrepancies(\n\tidentifier: TreeNodeSchemaIdentifier,\n\tview: TreeNodeSchema,\n\tstored: TreeNodeStoredSchema,\n\tupgradeCollector?: UpgradeLocationCollector,\n): Iterable<Discrepancy> {\n\tif (!doesNodeKindMatchStoredNodeKind(view.kind, getStoredNodeSchemaType(stored))) {\n\t\tyield {\n\t\t\tidentifier,\n\t\t\tmismatch: \"nodeKind\",\n\t\t\tview: view.kind,\n\t\t\tstored: getStoredNodeSchemaType(stored),\n\t\t};\n\t\treturn;\n\t}\n\n\tswitch (view.kind) {\n\t\tcase NodeKind.Object: {\n\t\t\tassert(\n\t\t\t\tisObjectNodeSchema(view),\n\t\t\t\t0xbe9 /* schema with node kind of object must implement ObjectNodeSchema */,\n\t\t\t);\n\t\t\tyield* computeObjectNodeDiscrepancies(\n\t\t\t\tidentifier,\n\t\t\t\tview,\n\t\t\t\tstored as ObjectNodeStoredSchema,\n\t\t\t\tupgradeCollector,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Array: {\n\t\t\tassert(\n\t\t\t\tisArrayNodeSchema(view),\n\t\t\t\t0xbea /* schema with node kind of array must implement ArrayNodeSchema */,\n\t\t\t);\n\n\t\t\tconst arrayStoredSchema = tryStoredSchemaAsArray(stored);\n\t\t\tif (arrayStoredSchema === undefined) {\n\t\t\t\tyield {\n\t\t\t\t\tidentifier,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: NodeKind.Array,\n\t\t\t\t\tstored: getStoredNodeSchemaType(stored),\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tyield* getAllowedTypeDiscrepancies(\n\t\t\t\tnormalizeAndEvaluateAnnotatedAllowedTypes(view.info).types,\n\t\t\t\tarrayStoredSchema,\n\t\t\t\tbrand(view.identifier),\n\t\t\t\tEmptyKey,\n\t\t\t\tfalse,\n\t\t\t\tupgradeCollector,\n\t\t\t);\n\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Map: {\n\t\t\tassert(\n\t\t\t\tisMapNodeSchema(view),\n\t\t\t\t0xbeb /* schema with node kind of map must implement MapNodeSchema */,\n\t\t\t);\n\n\t\t\tyield* getFieldDiscrepancies(\n\t\t\t\tcreateFieldSchema(FieldKind.Optional, view.info),\n\t\t\t\t(stored as MapNodeStoredSchema).mapFields,\n\t\t\t\tidentifier,\n\t\t\t\tundefined,\n\t\t\t\tupgradeCollector,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Record: {\n\t\t\tassert(\n\t\t\t\tisRecordNodeSchema(view),\n\t\t\t\t0xbec /* schema with node kind of record must implement RecordNodeSchema */,\n\t\t\t);\n\n\t\t\tyield* getFieldDiscrepancies(\n\t\t\t\tcreateFieldSchema(FieldKind.Optional, view.info),\n\t\t\t\t(stored as MapNodeStoredSchema).mapFields,\n\t\t\t\tidentifier,\n\t\t\t\tundefined,\n\t\t\t\tupgradeCollector,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase NodeKind.Leaf: {\n\t\t\tassert(\n\t\t\t\tview instanceof LeafNodeSchema,\n\t\t\t\t0xbed /* schema with node kind of leaf must implement LeafNodeSchema */,\n\t\t\t);\n\t\t\t// TODO: leafKind seems like a bad name\n\t\t\tconst viewValue = view.leafKind;\n\t\t\tconst storedValue = (stored as LeafNodeStoredSchema).leafValue;\n\t\t\tif (viewValue !== storedValue) {\n\t\t\t\tyield {\n\t\t\t\t\tidentifier,\n\t\t\t\t\tmismatch: \"valueSchema\",\n\t\t\t\t\tview: viewValue,\n\t\t\t\t\tstored: storedValue,\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Returns the allowed types that are not present in both the given view and stored schemas.\n */\nexport function findExtraAllowedTypes(\n\tviewAllowedTypes: readonly AnnotatedAllowedType<TreeNodeSchema>[],\n\tstoredAllowedTypes: TreeTypeSet,\n): Pick<AllowedTypeDiscrepancy, \"view\" | \"stagedView\" | \"stored\"> {\n\tconst viewNodeSchemaIdentifiers = new Set(\n\t\tviewAllowedTypes.map((value) => value.type.identifier),\n\t);\n\n\t// TODO:\n\t// Add detecting which SchemaUpgrades have been made.\n\t// When doing so, each will fall into one of three states: staged, partially applied, or fully applied.\n\t// This would allow for nicer compatibility errors and more detailed compatibility status in the future.\n\tconst view = viewAllowedTypes.filter(\n\t\t(value) =>\n\t\t\t!storedAllowedTypes.has(brand(value.type.identifier)) &&\n\t\t\tvalue.metadata.stagedSchemaUpgrade === undefined,\n\t);\n\tconst stagedView = viewAllowedTypes.filter(\n\t\t(value) =>\n\t\t\t!storedAllowedTypes.has(brand(value.type.identifier)) &&\n\t\t\tvalue.metadata.stagedSchemaUpgrade !== undefined,\n\t);\n\tconst stored = [...storedAllowedTypes].filter(\n\t\t(value) => !viewNodeSchemaIdentifiers.has(value),\n\t);\n\treturn {\n\t\tview,\n\t\t...(stagedView.length === 0 ? {} : { stagedView }),\n\t\tstored,\n\t};\n}\n\n/**\n * The function to track the discrepancies between a field view schema and a stored schema.\n *\n * @remarks\n * This function yields discrepancies in the following cases:\n * 1. If the view schema has allowed types that are not present in the stored schema.\n * 2. If the stored schema has allowed types that are not present in the view schema.\n * 3. If the field kind in the view schema is not compatible with the stored schema.\n *\n * This function does not recurse into the nodes of the view schema and only makes comparisons at the field level.\n *\n * @param fieldKey - If the key is missing, it indicates that this is the root field schema.\n */\nfunction* getFieldDiscrepancies(\n\tview: FieldSchema,\n\tstored: TreeFieldStoredSchema,\n\tidentifier: TreeNodeSchemaIdentifier | undefined,\n\tfieldKey: FieldKey | undefined,\n\tupgradeCollector?: UpgradeLocationCollector,\n): Iterable<FieldDiscrepancy> {\n\tassert(\n\t\tview instanceof FieldSchemaAlpha,\n\t\t0xbee /* all field schema should be FieldSchemaAlpha */,\n\t);\n\n\t// Collect staged-optional upgrade location if present.\n\tif (upgradeCollector !== undefined && view.isStagedOptional !== false) {\n\t\tupgradeCollector.optionalField(\n\t\t\tview.isStagedOptional,\n\t\t\tstored.kind === FieldKinds.optional.identifier,\n\t\t);\n\t}\n\n\tyield* getAllowedTypeDiscrepancies(\n\t\tview.allowedTypesFull.evaluate().types,\n\t\tstored.types,\n\t\tidentifier,\n\t\tfieldKey,\n\t\tview.isStagedOptional !== false,\n\t\tupgradeCollector,\n\t);\n\n\tconst viewKind =\n\t\tconvertFieldKind.get(view.kind) ??\n\t\tfail(0xbef /* A conversion from a FieldKind to a FlexFieldKind should exist */);\n\n\t// This checks if the field kind in the view schema is not compatible with the stored schema.\n\t// A staged optional field (optional in the view) is compatible with a required stored field\n\t// during the rollout period — suppress the kind discrepancy in that case.\n\tif (\n\t\tviewKind.identifier !== stored.kind &&\n\t\t!(view.isStagedOptional !== false && stored.kind === FieldKinds.required.identifier)\n\t) {\n\t\tyield {\n\t\t\tidentifier,\n\t\t\tfieldKey,\n\t\t\tmismatch: \"fieldKind\",\n\t\t\tview: viewKind.identifier,\n\t\t\tstored: stored.kind,\n\t\t\t...(view.isStagedOptional === false ? {} : { viewIsStagedOptional: true }),\n\t\t} satisfies FieldKindDiscrepancy;\n\t}\n}\n\n/**\n * The function to track the discrepancies between a field view schema and a stored schema.\n *\n * @remarks\n * This function yields discrepancies in the following cases:\n * 1. If the view schema has allowed types that are not present in the stored schema.\n * 2. If the stored schema has allowed types that are not present in the view schema.\n *\n * This function does not recurse into the nodes of the view schema and only makes comparisons at the field level.\n *\n * @param fieldKey - If the key is missing, it indicates that this is the root field schema.\n */\nfunction* getAllowedTypeDiscrepancies(\n\tview: readonly AnnotatedAllowedType<TreeNodeSchema>[],\n\tstored: TreeTypeSet,\n\tidentifier: TreeNodeSchemaIdentifier | undefined,\n\tfieldKey: FieldKey | undefined,\n\tviewIsStagedOptional: boolean,\n\tupgradeCollector?: UpgradeLocationCollector,\n): Iterable<FieldDiscrepancy> {\n\t// Collect staged allowed type upgrade locations if present.\n\tif (upgradeCollector !== undefined) {\n\t\tfor (const allowedType of view) {\n\t\t\tif (allowedType.metadata.stagedSchemaUpgrade !== undefined) {\n\t\t\t\tupgradeCollector.allowedType(\n\t\t\t\t\tallowedType.metadata.stagedSchemaUpgrade,\n\t\t\t\t\tstored.has(brand(allowedType.type.identifier)),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst discrepancies = findExtraAllowedTypes(view, stored);\n\tif (discrepancies.view.length > 0 || discrepancies.stored.length > 0) {\n\t\tyield {\n\t\t\t...discrepancies,\n\t\t\tidentifier,\n\t\t\tfieldKey,\n\t\t\tmismatch: \"allowedTypes\",\n\t\t\t...(viewIsStagedOptional ? { viewIsStagedOptional: true } : {}),\n\t\t} satisfies AllowedTypeDiscrepancy;\n\t}\n}\n\n/**\n * Computes discrepancies between a view schema and a stored schema for nodes that are treated as object nodes in the stored schema.\n * This includes both view object nodes and view array nodes.\n *\n * This function yields discrepancies in the following cases:\n *\n * 1. If the view schema has fields that are not present in the stored schema.\n * 2. If the stored schema has fields that are not present in the view schema.\n * 3. If the field kind or allowed types of a field in the view schema is not compatible with the stored schema.\n *\n * This function includes discrepancies within the common fields and their allowed types, but does NOT recurse to report and discrepancies within the node types referenced by those fields.\n */\nfunction* computeObjectNodeDiscrepancies(\n\tidentifier: TreeNodeSchemaIdentifier,\n\tview: ObjectNodeSchemaPrivate,\n\tstored: ObjectNodeStoredSchema,\n\tupgradeCollector?: UpgradeLocationCollector,\n): Iterable<FieldDiscrepancy> {\n\t/**\n\t * Similar to the logic used for tracking discrepancies between two node schemas, we will identify\n\t * three types of differences:\n\t * 1. Fields that exist in the view schema but not in the stored schema.\n\t * 2. Fields that exist in both schemas but have different contents.\n\t * 3. Fields that exist in the stored schema but not in the view schema.\n\t *\n\t * First, the view schema is iterated to track the first two types of differences.\n\t * Then, the stored schema is iterated to find the third type.\n\t */\n\n\tconst viewKeys = new Set<FieldKey>();\n\n\tfor (const [_, { storedKey: fieldKey, schema: fieldSchema }] of view.flexKeyMap) {\n\t\tconst storedSchema = stored.objectNodeFields.get(fieldKey);\n\t\tviewKeys.add(fieldKey);\n\n\t\t// If the view schema has a field that's not in the stored schema\n\t\tif (storedSchema === undefined) {\n\t\t\tconst viewKind =\n\t\t\t\tconvertFieldKind.get(fieldSchema.kind) ??\n\t\t\t\tfail(0xbf0 /* A conversion from a FieldKind to a FlexFieldKind should exist */);\n\t\t\tyield {\n\t\t\t\tidentifier,\n\t\t\t\tfieldKey,\n\t\t\t\tmismatch: \"fieldKind\",\n\t\t\t\tview: viewKind.identifier,\n\t\t\t\tstored: storedEmptyFieldSchema.kind,\n\t\t\t\t...(fieldSchema instanceof FieldSchemaAlpha && fieldSchema.isStagedOptional !== false\n\t\t\t\t\t? { viewIsStagedOptional: true }\n\t\t\t\t\t: {}),\n\t\t\t} satisfies FieldKindDiscrepancy;\n\t\t} else {\n\t\t\tyield* getFieldDiscrepancies(\n\t\t\t\tfieldSchema,\n\t\t\t\tstoredSchema,\n\t\t\t\tidentifier,\n\t\t\t\tfieldKey,\n\t\t\t\tupgradeCollector,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const [fieldKey, schema] of stored.objectNodeFields) {\n\t\tif (schema.kind === forbiddenFieldKindIdentifier) {\n\t\t\t// In the stored schema the field is explicitly forbidden.\n\t\t\t// This has the same semantics of the field not being mentioned in the stored schema,\n\t\t\t// and thus can be skipped.\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If the stored schema has a field that's not in the view schema\n\t\t// When the application has opted into it, we allow viewing documents which have additional\n\t\t// optional fields in the stored schema that are not present in the view schema.\n\t\tif (\n\t\t\t!viewKeys.has(fieldKey) &&\n\t\t\t(!view.allowUnknownOptionalFields || schema.kind !== FieldKinds.optional.identifier)\n\t\t) {\n\t\t\tyield {\n\t\t\t\tidentifier,\n\t\t\t\tfieldKey,\n\t\t\t\tmismatch: \"fieldKind\",\n\t\t\t\tview: storedEmptyFieldSchema.kind,\n\t\t\t\tstored: schema.kind,\n\t\t\t} satisfies FieldKindDiscrepancy;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export type { ITreeViewConfiguration, ITreeConfigurationOptions, ITreeViewConfigurationAlpha, } from "./configuration.js";
|
|
6
6
|
export { TreeViewConfiguration, TreeViewConfigurationAlpha, } from "./configuration.js";
|
|
7
|
-
export type { CommitRevision, ITree, TreeView, ViewableTree, TreeViewEvents, SchemaCompatibilityStatus, TreeViewAlpha, TreeViewBeta, UntypedTreeView, TreeBranch, TreeBranchAlpha, UntypedTreeViewAlpha, TreeBranchEvents, TreeBranchCommitMetadata, TreeBranchHistory, TreeContextAlpha, ITreeAlpha, } from "./tree.js";
|
|
7
|
+
export type { CommitRevision, ITree, TreeView, ViewableTree, TreeViewEvents, SchemaCompatibilityStatus, SchemaCompatibilityStatusBeta, SchemaDiscrepancy, TreeViewAlpha, TreeViewBeta, UntypedTreeView, TreeBranch, TreeBranchAlpha, UntypedTreeViewAlpha, TreeBranchEvents, TreeBranchCommitMetadata, TreeBranchHistory, TreeContextAlpha, ITreeAlpha, } from "./tree.js";
|
|
8
8
|
export { asTreeViewAlpha } from "./tree.js";
|
|
9
9
|
export { type SchemaStatics, schemaStatics } from "./schemaStatics.js";
|
|
10
10
|
export { SchemaFactory, scoped, type ScopedSchemaName, type ObjectSchemaOptionsAlpha, type ObjectSchemaOptions, type NodeSchemaOptions, type NodeSchemaOptionsAlpha, type SchemaFactory_base, } from "./schemaFactory.js";
|
|
@@ -22,7 +22,8 @@ export { type JsonSchemaId, type JsonSchemaType, type JsonObjectNodeSchema, type
|
|
|
22
22
|
export type { TreeSchemaEncodingOptions } from "./getJsonSchema.js";
|
|
23
23
|
export { getJsonSchema } from "./getJsonSchema.js";
|
|
24
24
|
export { getSimpleSchema } from "./getSimpleSchema.js";
|
|
25
|
-
export { checkSchemaCompatibility } from "./schemaCompatibilityTester.js";
|
|
25
|
+
export { checkSchemaCompatibility, getSchemaIncompatibilityDetails, } from "./schemaCompatibilityTester.js";
|
|
26
|
+
export { type StagedUpgradeStatus } from "./schemaCompatibilityTester.js";
|
|
26
27
|
export type { Unenforced, FieldSchemaAlphaUnsafe, ArrayNodeCustomizableSchemaUnsafe, MapNodeCustomizableSchemaUnsafe, System_Unsafe, TreeRecordNodeUnsafe, UnannotateAllowedTypeUnsafe, AnnotatedAllowedTypeUnsafe, AnnotatedAllowedTypesUnsafe, AllowedTypesFullUnsafe, AllowedTypesFullFromMixedUnsafe, UnannotateAllowedTypesListUnsafe, AnnotateAllowedTypesListUnsafe, FieldHasDefaultAlphaUnsafe, InsertableObjectFromSchemaRecordAlphaUnsafe, } from "./typesUnsafe.js";
|
|
27
28
|
export { type VerboseTreeNode, type VerboseTree, applySchemaToParserOptions, cursorFromVerbose, verboseFromCursor, replaceVerboseTreeHandles, } from "./verboseTree.js";
|
|
28
29
|
export { type TreeEncodingOptions, customFromCursorStored, type CustomTreeNode, type CustomTreeValue, tryStoredSchemaAsArray, replaceHandles, type HandleConverter, KeyEncodingOptions, type TreeParsingOptions, } from "./customTree.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/simple-tree/api/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACX,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,qBAAqB,EACrB,0BAA0B,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,cAAc,EACd,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,yBAAyB,EACzB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EACN,aAAa,EACb,MAAM,EACN,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EACN,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,YAAY,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,kBAAkB,EAClB,8BAA8B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,YAAY,EACZ,UAAU,EACV,wBAAwB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,uBAAuB,EACvB,uBAAuB,EACvB,+BAA+B,EAC/B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EACN,SAAS,EACT,eAAe,EACf,eAAe,EACf,2CAA2C,GAC3C,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,qBAAqB,EACrB,2BAA2B,EAC3B,YAAY,EACZ,WAAW,EACX,KAAK,WAAW,EAChB,YAAY,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACN,KAAK,eAAe,EACpB,eAAe,EACf,KAAK,YAAY,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,GACnC,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/simple-tree/api/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACX,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,qBAAqB,EACrB,0BAA0B,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,cAAc,EACd,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EACN,aAAa,EACb,MAAM,EACN,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EACN,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,YAAY,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,kBAAkB,EAClB,8BAA8B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,YAAY,EACZ,UAAU,EACV,wBAAwB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,uBAAuB,EACvB,uBAAuB,EACvB,+BAA+B,EAC/B,0BAA0B,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EACN,SAAS,EACT,eAAe,EACf,eAAe,EACf,2CAA2C,GAC3C,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,qBAAqB,EACrB,2BAA2B,EAC3B,YAAY,EACZ,WAAW,EACX,KAAK,WAAW,EAChB,YAAY,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACN,KAAK,eAAe,EACpB,eAAe,EACf,KAAK,YAAY,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,GACnC,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACN,wBAAwB,EACxB,+BAA+B,GAC/B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,YAAY,EACX,UAAU,EACV,sBAAsB,EACtB,iCAAiC,EACjC,+BAA+B,EAC/B,aAAa,EACb,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACtB,+BAA+B,EAC/B,gCAAgC,EAChC,8BAA8B,EAC9B,0BAA0B,EAC1B,2CAA2C,GAC3C,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,KAAK,mBAAmB,EACxB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,sBAAsB,EACtB,cAAc,EACd,KAAK,eAAe,EACpB,kBAAkB,EAClB,KAAK,kBAAkB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,KAAK,WAAW,EAChB,iBAAiB,EACjB,yBAAyB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,+BAA+B,EAC/B,aAAa,EACb,aAAa,EACb,KAAK,eAAe,EACpB,QAAQ,EACR,KAAK,oBAAoB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EACN,qBAAqB,EACrB,KAAK,eAAe,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACN,sBAAsB,EACtB,sBAAsB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,QAAQ,EACR,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EACtC,KAAK,SAAS,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACN,wCAAwC,EACxC,sBAAsB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,iCAAiC,EACjC,iCAAiC,GACjC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,iCAAiC,EACjC,iCAAiC,EACjC,kBAAkB,EAClB,2BAA2B,EAC3B,KAAK,kBAAkB,EACvB,KAAK,kCAAkC,GACvC,MAAM,mCAAmC,CAAC"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.snapshotSchemaCompatibility = exports.checkCompatibility = exports.importCompatibilitySchemaSnapshot = void 0;
|
|
7
|
+
exports.decodeSchemaCompatibilitySnapshot = exports.encodeSchemaCompatibilitySnapshot = exports.incrementalSummaryHint = exports.incrementalEncodingPolicyForAllowedTypes = exports.generateSchemaFromSimpleSchema = exports.rollback = exports.comparePersistedSchema = exports.extractPersistedSchema = exports.createIdentifierIndex = exports.createTreeIndex = exports.TreeBeta = exports.importConcise = exports.exportConcise = exports.borrowCursorFromTreeNodeOrValue = exports.replaceConciseTreeHandles = exports.conciseFromCursor = exports.KeyEncodingOptions = exports.replaceHandles = exports.tryStoredSchemaAsArray = exports.customFromCursorStored = exports.replaceVerboseTreeHandles = exports.verboseFromCursor = exports.cursorFromVerbose = exports.applySchemaToParserOptions = exports.getSchemaIncompatibilityDetails = exports.checkSchemaCompatibility = exports.getSimpleSchema = exports.getJsonSchema = exports.trackDirtyNodes = exports.createFromCursor = exports.tryGetSchema = exports.treeNodeApi = exports.getStoredKey = exports.getPropertyKeyFromStoredKey = exports.getIdentifierFromNode = exports.createCustomizedFluidFrameworkScopedFactory = exports.singletonSchema = exports.enumFromStrings = exports.adaptEnum = exports.allowUnused = exports.eraseSchemaDetailsSubclassable = exports.eraseSchemaDetails = exports.SchemaFactoryAlpha = exports.SchemaFactoryBeta = exports.scoped = exports.SchemaFactory = exports.schemaStatics = exports.asTreeViewAlpha = exports.TreeViewConfigurationAlpha = exports.TreeViewConfiguration = void 0;
|
|
8
|
+
exports.snapshotSchemaCompatibility = exports.checkCompatibility = exports.importCompatibilitySchemaSnapshot = exports.exportCompatibilitySchemaSnapshot = void 0;
|
|
9
9
|
var configuration_js_1 = require("./configuration.js");
|
|
10
10
|
Object.defineProperty(exports, "TreeViewConfiguration", { enumerable: true, get: function () { return configuration_js_1.TreeViewConfiguration; } });
|
|
11
11
|
Object.defineProperty(exports, "TreeViewConfigurationAlpha", { enumerable: true, get: function () { return configuration_js_1.TreeViewConfigurationAlpha; } });
|
|
@@ -46,6 +46,7 @@ var getSimpleSchema_js_1 = require("./getSimpleSchema.js");
|
|
|
46
46
|
Object.defineProperty(exports, "getSimpleSchema", { enumerable: true, get: function () { return getSimpleSchema_js_1.getSimpleSchema; } });
|
|
47
47
|
var schemaCompatibilityTester_js_1 = require("./schemaCompatibilityTester.js");
|
|
48
48
|
Object.defineProperty(exports, "checkSchemaCompatibility", { enumerable: true, get: function () { return schemaCompatibilityTester_js_1.checkSchemaCompatibility; } });
|
|
49
|
+
Object.defineProperty(exports, "getSchemaIncompatibilityDetails", { enumerable: true, get: function () { return schemaCompatibilityTester_js_1.getSchemaIncompatibilityDetails; } });
|
|
49
50
|
var verboseTree_js_1 = require("./verboseTree.js");
|
|
50
51
|
Object.defineProperty(exports, "applySchemaToParserOptions", { enumerable: true, get: function () { return verboseTree_js_1.applySchemaToParserOptions; } });
|
|
51
52
|
Object.defineProperty(exports, "cursorFromVerbose", { enumerable: true, get: function () { return verboseTree_js_1.cursorFromVerbose; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/simple-tree/api/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;AAOH,uDAG4B;AAF3B,yHAAA,qBAAqB,OAAA;AACrB,8HAAA,0BAA0B,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/simple-tree/api/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;AAOH,uDAG4B;AAF3B,yHAAA,qBAAqB,OAAA;AACrB,8HAAA,0BAA0B,OAAA;AAuB3B,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AACxB,uDAAuE;AAA1C,iHAAA,aAAa,OAAA;AAC1C,uDAS4B;AAR3B,iHAAA,aAAa,OAAA;AACb,0GAAA,MAAM,OAAA;AAQP,+DAAmF;AAA1E,yHAAA,iBAAiB,OAAA;AAC1B,iEAIiC;AAHhC,2HAAA,kBAAkB,OAAA;AAInB,iEAGiC;AAFhC,2HAAA,kBAAkB,OAAA;AAClB,uIAAA,8BAA8B,OAAA;AAa/B,yEAA0D;AAAjD,wHAAA,WAAW,OAAA;AACpB,2EAKsC;AAJrC,uHAAA,SAAS,OAAA;AACT,6HAAA,eAAe,OAAA;AACf,6HAAA,eAAe,OAAA;AACf,yJAAA,2CAA2C,OAAA;AAE5C,mDAO0B;AANzB,uHAAA,qBAAqB,OAAA;AACrB,6HAAA,2BAA2B,OAAA;AAC3B,8GAAA,YAAY,OAAA;AACZ,6GAAA,WAAW,OAAA;AAEX,8GAAA,YAAY,OAAA;AAEb,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AACzB,iDAIyB;AAFxB,gHAAA,eAAe,OAAA;AAqBhB,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AACtB,2DAAuD;AAA9C,qHAAA,eAAe,OAAA;AACxB,+EAGwC;AAFvC,wIAAA,wBAAwB,OAAA;AACxB,+IAAA,+BAA+B,OAAA;AAqBhC,mDAO0B;AAJzB,4HAAA,0BAA0B,OAAA;AAC1B,mHAAA,iBAAiB,OAAA;AACjB,mHAAA,iBAAiB,OAAA;AACjB,2HAAA,yBAAyB,OAAA;AAG1B,iDAUyB;AARxB,uHAAA,sBAAsB,OAAA;AAGtB,uHAAA,sBAAsB,OAAA;AACtB,+GAAA,cAAc,OAAA;AAEd,mHAAA,kBAAkB,OAAA;AAInB,mDAI0B;AAFzB,mHAAA,iBAAiB,OAAA;AACjB,2HAAA,yBAAyB,OAAA;AAG1B,6CAOuB;AANtB,8HAAA,+BAA+B,OAAA;AAC/B,4GAAA,aAAa,OAAA;AACb,4GAAA,aAAa,OAAA;AAEb,uGAAA,QAAQ,OAAA;AAgBT,2DAA0E;AAAjE,qHAAA,eAAe,OAAA;AACxB,2DAG8B;AAF7B,2HAAA,qBAAqB,OAAA;AAItB,qDAG2B;AAF1B,yHAAA,sBAAsB,OAAA;AACtB,yHAAA,sBAAsB,OAAA;AAGvB,6DAkB+B;AAf9B,+GAAA,QAAQ,OAAA;AAiBT,6DAAuE;AAA9D,qIAAA,8BAA8B,OAAA;AAEvC,2EAGsC;AAFrC,sJAAA,wCAAwC,OAAA;AACxC,oIAAA,sBAAsB,OAAA;AAEvB,+DAGgC;AAF/B,yIAAA,iCAAiC,OAAA;AACjC,yIAAA,iCAAiC,OAAA;AAElC,qFAO2C;AAN1C,oJAAA,iCAAiC,OAAA;AACjC,oJAAA,iCAAiC,OAAA;AACjC,qIAAA,kBAAkB,OAAA;AAClB,8IAAA,2BAA2B,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport type {\n\tITreeViewConfiguration,\n\tITreeConfigurationOptions,\n\tITreeViewConfigurationAlpha,\n} from \"./configuration.js\";\nexport {\n\tTreeViewConfiguration,\n\tTreeViewConfigurationAlpha,\n} from \"./configuration.js\";\nexport type {\n\tCommitRevision,\n\tITree,\n\tTreeView,\n\tViewableTree,\n\tTreeViewEvents,\n\tSchemaCompatibilityStatus,\n\tSchemaCompatibilityStatusBeta,\n\tSchemaDiscrepancy,\n\tTreeViewAlpha,\n\tTreeViewBeta,\n\tUntypedTreeView,\n\tTreeBranch,\n\tTreeBranchAlpha,\n\tUntypedTreeViewAlpha,\n\tTreeBranchEvents,\n\tTreeBranchCommitMetadata,\n\tTreeBranchHistory,\n\tTreeContextAlpha,\n\tITreeAlpha,\n} from \"./tree.js\";\nexport { asTreeViewAlpha } from \"./tree.js\";\nexport { type SchemaStatics, schemaStatics } from \"./schemaStatics.js\";\nexport {\n\tSchemaFactory,\n\tscoped,\n\ttype ScopedSchemaName,\n\ttype ObjectSchemaOptionsAlpha,\n\ttype ObjectSchemaOptions,\n\ttype NodeSchemaOptions,\n\ttype NodeSchemaOptionsAlpha,\n\ttype SchemaFactory_base,\n} from \"./schemaFactory.js\";\nexport { SchemaFactoryBeta, type SchemaStaticsBeta } from \"./schemaFactoryBeta.js\";\nexport {\n\tSchemaFactoryAlpha,\n\ttype SchemaStaticsAlpha,\n\ttype NodeProvider,\n} from \"./schemaFactoryAlpha.js\";\nexport {\n\teraseSchemaDetails,\n\teraseSchemaDetailsSubclassable,\n} from \"./eraseSchemaDetails.js\";\nexport type {\n\tErasedSchema,\n\tErasedNode,\n\tErasedSchemaSubclassable,\n} from \"./eraseSchemaDetails.js\";\nexport type {\n\tValidateRecursiveSchema,\n\tFixRecursiveArraySchema,\n\tValidateRecursiveSchemaTemplate,\n\tFixRecursiveRecursionLimit,\n} from \"./schemaFactoryRecursive.js\";\nexport { allowUnused } from \"./schemaFactoryRecursive.js\";\nexport {\n\tadaptEnum,\n\tenumFromStrings,\n\tsingletonSchema,\n\tcreateCustomizedFluidFrameworkScopedFactory,\n} from \"./schemaCreationUtilities.js\";\nexport {\n\tgetIdentifierFromNode,\n\tgetPropertyKeyFromStoredKey,\n\tgetStoredKey,\n\ttreeNodeApi,\n\ttype TreeNodeApi,\n\ttryGetSchema,\n} from \"./treeNodeApi.js\";\nexport { createFromCursor } from \"./create.js\";\nexport {\n\ttype DirtyTreeStatus,\n\ttrackDirtyNodes,\n\ttype DirtyTreeMap,\n} from \"./dirtyIndex.js\";\nexport {\n\ttype JsonSchemaId,\n\ttype JsonSchemaType,\n\ttype JsonObjectNodeSchema,\n\ttype JsonArrayNodeSchema,\n\ttype JsonMapNodeSchema,\n\ttype JsonLeafNodeSchema,\n\ttype JsonSchemaRef,\n\ttype JsonRefPath,\n\ttype JsonNodeSchema,\n\ttype JsonNodeSchemaBase,\n\ttype JsonTreeSchema,\n\ttype JsonFieldSchema,\n\ttype JsonLeafSchemaType,\n\ttype JsonRecordNodeSchema,\n\ttype JsonStringKeyPatternProperties,\n} from \"./jsonSchema.js\";\nexport type { TreeSchemaEncodingOptions } from \"./getJsonSchema.js\";\nexport { getJsonSchema } from \"./getJsonSchema.js\";\nexport { getSimpleSchema } from \"./getSimpleSchema.js\";\nexport {\n\tcheckSchemaCompatibility,\n\tgetSchemaIncompatibilityDetails,\n} from \"./schemaCompatibilityTester.js\";\nexport { type StagedUpgradeStatus } from \"./schemaCompatibilityTester.js\";\nexport type {\n\tUnenforced,\n\tFieldSchemaAlphaUnsafe,\n\tArrayNodeCustomizableSchemaUnsafe,\n\tMapNodeCustomizableSchemaUnsafe,\n\tSystem_Unsafe,\n\tTreeRecordNodeUnsafe,\n\tUnannotateAllowedTypeUnsafe,\n\tAnnotatedAllowedTypeUnsafe,\n\tAnnotatedAllowedTypesUnsafe,\n\tAllowedTypesFullUnsafe,\n\tAllowedTypesFullFromMixedUnsafe,\n\tUnannotateAllowedTypesListUnsafe,\n\tAnnotateAllowedTypesListUnsafe,\n\tFieldHasDefaultAlphaUnsafe,\n\tInsertableObjectFromSchemaRecordAlphaUnsafe,\n} from \"./typesUnsafe.js\";\n\nexport {\n\ttype VerboseTreeNode,\n\ttype VerboseTree,\n\tapplySchemaToParserOptions,\n\tcursorFromVerbose,\n\tverboseFromCursor,\n\treplaceVerboseTreeHandles,\n} from \"./verboseTree.js\";\n\nexport {\n\ttype TreeEncodingOptions,\n\tcustomFromCursorStored,\n\ttype CustomTreeNode,\n\ttype CustomTreeValue,\n\ttryStoredSchemaAsArray,\n\treplaceHandles,\n\ttype HandleConverter,\n\tKeyEncodingOptions,\n\ttype TreeParsingOptions,\n} from \"./customTree.js\";\n\nexport {\n\ttype ConciseTree,\n\tconciseFromCursor,\n\treplaceConciseTreeHandles,\n} from \"./conciseTree.js\";\n\nexport {\n\tborrowCursorFromTreeNodeOrValue,\n\texportConcise,\n\timportConcise,\n\ttype NodeChangedData,\n\tTreeBeta,\n\ttype TreeChangeEventsBeta,\n} from \"./treeBeta.js\";\nexport {\n\ttype ArrayNodeDeltaOp,\n\ttype ArrayNodeInsertOp,\n\ttype ArrayNodeRemoveOp,\n\ttype ArrayNodeRetainOp,\n\ttype ArrayNodeTreeChangedDeltaOp,\n\ttype ArrayNodeTreeChangedRetainOp,\n\ttype NodeChangedDataAlpha,\n\ttype NodeChangedDataDelta,\n\ttype NodeChangedDataProperties,\n\ttype NodeChangedDataTreeDelta,\n\ttype TreeChangeEventsAlpha,\n} from \"./treeAlpha.js\";\nexport { createTreeIndex, type TreeIndexKey } from \"./simpleTreeIndex.js\";\nexport {\n\tcreateIdentifierIndex,\n\ttype IdentifierIndex,\n} from \"./identifierIndex.js\";\n\nexport {\n\textractPersistedSchema,\n\tcomparePersistedSchema,\n} from \"./storedSchema.js\";\n\nexport {\n\ttype NoChangeConstraint,\n\ttype NodeInDocumentConstraint,\n\trollback,\n\ttype RunTransactionParamsAlpha,\n\ttype RunTransactionParamsBeta,\n\ttype TransactionCallbackStatusAlpha,\n\ttype TransactionCallbackStatusBeta,\n\ttype TransactionConstraint,\n\ttype TransactionConstraintAlpha,\n\ttype TransactionPostProcessor,\n\ttype TransactionResultFailed,\n\ttype TransactionResultSuccess,\n\ttype TransactionValueResult,\n\ttype TransactionVoidResult,\n\ttype VoidTransactionCallbackStatusAlpha,\n\ttype VoidTransactionCallbackStatusBeta,\n\ttype WithValue,\n} from \"./transactionTypes.js\";\n\nexport { generateSchemaFromSimpleSchema } from \"./schemaFromSimple.js\";\nexport type { TreeChangeEvents } from \"./treeChangeEvents.js\";\nexport {\n\tincrementalEncodingPolicyForAllowedTypes,\n\tincrementalSummaryHint,\n} from \"./incrementalAllowedTypes.js\";\nexport {\n\tencodeSchemaCompatibilitySnapshot,\n\tdecodeSchemaCompatibilitySnapshot,\n} from \"./simpleSchemaCodec.js\";\nexport {\n\texportCompatibilitySchemaSnapshot,\n\timportCompatibilitySchemaSnapshot,\n\tcheckCompatibility,\n\tsnapshotSchemaCompatibility,\n\ttype SnapshotFileSystem,\n\ttype SnapshotSchemaCompatibilityOptions,\n} from \"./snapshotCompatibilityChecker.js\";\n"]}
|
|
@@ -2,10 +2,26 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import type
|
|
5
|
+
import { type TreeStoredSchema } from "../../core/index.js";
|
|
6
6
|
import type { SchemaUpgrade, StagedSchemaUpgradePolicy } from "../core/index.js";
|
|
7
7
|
import type { TreeSchema } from "../treeSchema.js";
|
|
8
|
-
import type {
|
|
8
|
+
import type { SchemaCompatibilityStatusBeta, SchemaDiscrepancy } from "./tree.js";
|
|
9
|
+
/**
|
|
10
|
+
* Describes the discrepancies that prevent a view schema from viewing a stored schema as a
|
|
11
|
+
* readonly array.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getSchemaIncompatibilityDetails(viewSchema: TreeSchema, stored: TreeStoredSchema): readonly SchemaDiscrepancy[] | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* The enablement status of a staged schema upgrade in a document's stored schema.
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* - `"disabled"` — no locations guarded by the upgrade are enabled in stored schema.
|
|
19
|
+
* - `"partial"` — at least one location is enabled but not all of them.
|
|
20
|
+
* - `"enabled"` — all locations guarded by the upgrade are enabled in stored schema.
|
|
21
|
+
*
|
|
22
|
+
* @alpha
|
|
23
|
+
*/
|
|
24
|
+
export type StagedUpgradeStatus = "disabled" | "partial" | "enabled";
|
|
9
25
|
/**
|
|
10
26
|
* Determines the compatibility of a stored document (based on its stored schema) with a viewer (based on its view schema).
|
|
11
27
|
*
|
|
@@ -18,6 +34,9 @@ import type { SchemaCompatibilityStatus } from "./tree.js";
|
|
|
18
34
|
* @param viewSchema - Schema for the view
|
|
19
35
|
* @param stored - The stored schema to check compatibility against
|
|
20
36
|
* @param stagedSchemaUpgrades - Staged schema upgrades enabled for this view, or explicit stored-schema generation options
|
|
37
|
+
*
|
|
21
38
|
*/
|
|
22
|
-
export declare function checkSchemaCompatibility(viewSchema: TreeSchema, stored: TreeStoredSchema, stagedSchemaUpgrades?: Iterable<SchemaUpgrade> | StagedSchemaUpgradePolicy): Omit<
|
|
39
|
+
export declare function checkSchemaCompatibility(viewSchema: TreeSchema, stored: TreeStoredSchema, stagedSchemaUpgrades?: Iterable<SchemaUpgrade> | StagedSchemaUpgradePolicy): Omit<SchemaCompatibilityStatusBeta, "canInitialize"> & {
|
|
40
|
+
enabledUpgrades: ReadonlyMap<SchemaUpgrade, StagedUpgradeStatus>;
|
|
41
|
+
};
|
|
23
42
|
//# sourceMappingURL=schemaCompatibilityTester.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaCompatibilityTester.d.ts","sourceRoot":"","sources":["../../../src/simple-tree/api/schemaCompatibilityTester.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"schemaCompatibilityTester.d.ts","sourceRoot":"","sources":["../../../src/simple-tree/api/schemaCompatibilityTester.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAGN,KAAK,gBAAgB,EAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAIjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOnD,OAAO,KAAK,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAElF;;;GAGG;AACH,wBAAgB,+BAA+B,CAC9C,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,gBAAgB,GACtB,SAAS,iBAAiB,EAAE,GAAG,SAAS,CAO1C;AAmED;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACvC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,gBAAgB,EACxB,oBAAoB,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,yBAAyB,GACxE,IAAI,CAAC,6BAA6B,EAAE,eAAe,CAAC,GAAG;IACzD,eAAe,EAAE,WAAW,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;CACjE,CA6DA"}
|
|
@@ -4,10 +4,86 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.checkSchemaCompatibility = void 0;
|
|
8
|
-
const
|
|
7
|
+
exports.checkSchemaCompatibility = exports.getSchemaIncompatibilityDetails = void 0;
|
|
8
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
|
+
const index_js_1 = require("../../core/index.js");
|
|
10
|
+
const index_js_2 = require("../core/index.js");
|
|
11
|
+
const index_js_3 = require("../../feature-libraries/index.js");
|
|
9
12
|
const toStoredSchema_js_1 = require("../toStoredSchema.js");
|
|
10
13
|
const discrepancies_js_1 = require("./discrepancies.js");
|
|
14
|
+
/**
|
|
15
|
+
* Describes the discrepancies that prevent a view schema from viewing a stored schema as a
|
|
16
|
+
* readonly array.
|
|
17
|
+
*/
|
|
18
|
+
function getSchemaIncompatibilityDetails(viewSchema, stored) {
|
|
19
|
+
const discrepancies = [...(0, discrepancies_js_1.getDiscrepanciesInAllowedContent)(viewSchema, stored)];
|
|
20
|
+
if (discrepancies.length === 0) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return discrepancies.map(formatSchemaDiscrepancy);
|
|
24
|
+
}
|
|
25
|
+
exports.getSchemaIncompatibilityDetails = getSchemaIncompatibilityDetails;
|
|
26
|
+
function formatSchemaDiscrepancy(value) {
|
|
27
|
+
switch (value.mismatch) {
|
|
28
|
+
case "allowedTypes": {
|
|
29
|
+
return {
|
|
30
|
+
mismatch: value.mismatch,
|
|
31
|
+
location: value.identifier === undefined
|
|
32
|
+
? "root"
|
|
33
|
+
: {
|
|
34
|
+
nodeType: value.identifier,
|
|
35
|
+
fieldKey: value.fieldKey,
|
|
36
|
+
},
|
|
37
|
+
view: value.view.map(({ type }) => type.identifier).sort(),
|
|
38
|
+
...(value.stagedView === undefined
|
|
39
|
+
? {}
|
|
40
|
+
: {
|
|
41
|
+
stagedView: value.stagedView.map(({ type }) => type.identifier).sort(),
|
|
42
|
+
}),
|
|
43
|
+
stored: [...value.stored].sort(),
|
|
44
|
+
...(value.viewIsStagedOptional === true ? { viewIsStagedOptional: true } : {}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
case "fieldKind": {
|
|
48
|
+
return {
|
|
49
|
+
mismatch: value.mismatch,
|
|
50
|
+
location: value.identifier === undefined
|
|
51
|
+
? "root"
|
|
52
|
+
: {
|
|
53
|
+
nodeType: value.identifier,
|
|
54
|
+
fieldKey: value.fieldKey,
|
|
55
|
+
},
|
|
56
|
+
view: value.view,
|
|
57
|
+
stored: value.stored,
|
|
58
|
+
...(value.viewIsStagedOptional === true ? { viewIsStagedOptional: true } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
case "valueSchema": {
|
|
62
|
+
return {
|
|
63
|
+
mismatch: value.mismatch,
|
|
64
|
+
nodeType: value.identifier,
|
|
65
|
+
view: value.view === undefined ? undefined : index_js_1.ValueSchema[value.view],
|
|
66
|
+
stored: value.stored === undefined ? undefined : index_js_1.ValueSchema[value.stored],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
case "nodeKind": {
|
|
70
|
+
const storedNodeKind = value.stored === index_js_1.ObjectNodeStoredSchema
|
|
71
|
+
? "Object"
|
|
72
|
+
: value.stored === index_js_1.MapNodeStoredSchema
|
|
73
|
+
? "Map"
|
|
74
|
+
: "Leaf";
|
|
75
|
+
return {
|
|
76
|
+
mismatch: value.mismatch,
|
|
77
|
+
nodeType: value.identifier,
|
|
78
|
+
view: index_js_2.NodeKind[value.view],
|
|
79
|
+
stored: storedNodeKind,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
default: {
|
|
83
|
+
return (0, internal_1.unreachableCase)(value);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
11
87
|
/**
|
|
12
88
|
* Determines the compatibility of a stored document (based on its stored schema) with a viewer (based on its view schema).
|
|
13
89
|
*
|
|
@@ -20,29 +96,83 @@ const discrepancies_js_1 = require("./discrepancies.js");
|
|
|
20
96
|
* @param viewSchema - Schema for the view
|
|
21
97
|
* @param stored - The stored schema to check compatibility against
|
|
22
98
|
* @param stagedSchemaUpgrades - Staged schema upgrades enabled for this view, or explicit stored-schema generation options
|
|
99
|
+
*
|
|
23
100
|
*/
|
|
24
101
|
function checkSchemaCompatibility(viewSchema, stored, stagedSchemaUpgrades) {
|
|
25
102
|
// The public API surface assumes defaultSchemaPolicy
|
|
26
|
-
const policy =
|
|
103
|
+
const policy = index_js_3.defaultSchemaPolicy;
|
|
104
|
+
const configuredPolicy = (0, toStoredSchema_js_1.resolveStoredSchemaGenerationOptions)(stagedSchemaUpgrades);
|
|
105
|
+
const includeAlreadyEnabledUpgrades = configuredPolicy.includeAlreadyEnabledUpgrades ?? false;
|
|
106
|
+
// Collect upgrade locations during the discrepancy walk (single pass).
|
|
107
|
+
const totalLocations = new Map();
|
|
108
|
+
const enabledLocations = new Map();
|
|
109
|
+
const upgradeCollector = {
|
|
110
|
+
allowedType(upgrade, isEnabled) {
|
|
111
|
+
totalLocations.set(upgrade, (totalLocations.get(upgrade) ?? 0) + 1);
|
|
112
|
+
if (isEnabled) {
|
|
113
|
+
enabledLocations.set(upgrade, (enabledLocations.get(upgrade) ?? 0) + 1);
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
optionalField(upgrade, isEnabled) {
|
|
117
|
+
totalLocations.set(upgrade, (totalLocations.get(upgrade) ?? 0) + 1);
|
|
118
|
+
if (isEnabled) {
|
|
119
|
+
enabledLocations.set(upgrade, (enabledLocations.get(upgrade) ?? 0) + 1);
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
};
|
|
27
123
|
// View schema allows a subset of documents that stored schema does, and the discrepancies are allowed by policy
|
|
28
124
|
// determined by the view schema (i.e. objects with extra optional fields in the stored schema have opted into allowing this.
|
|
29
125
|
// In the future, this would also include things like:
|
|
30
126
|
// - fields with more allowed types in the stored schema than in the view schema have out-of-schema "unknown content" adapters
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
127
|
+
// Complete the full walk even after finding an incompatibility so discrepancy details and
|
|
128
|
+
// staged-upgrade status contain all available information for debugging.
|
|
129
|
+
const discrepancies = [];
|
|
130
|
+
for (const discrepancy of (0, discrepancies_js_1.getDiscrepanciesInAllowedContent)(viewSchema, stored, upgradeCollector)) {
|
|
131
|
+
discrepancies.push(formatSchemaDiscrepancy(discrepancy));
|
|
35
132
|
}
|
|
36
|
-
const
|
|
37
|
-
const
|
|
133
|
+
const canView = discrepancies.length === 0;
|
|
134
|
+
const enabledUpgrades = computeUpgradeStatuses(totalLocations, enabledLocations);
|
|
135
|
+
const upgradePolicy = includeAlreadyEnabledUpgrades
|
|
136
|
+
? includeEnabledUpgrades(configuredPolicy, enabledUpgrades)
|
|
137
|
+
: configuredPolicy;
|
|
138
|
+
const wouldUpgradeTo = (0, toStoredSchema_js_1.toUpgradeSchema)(viewSchema.root, upgradePolicy);
|
|
139
|
+
const canUpgrade = (0, index_js_3.allowsRepoSuperset)(policy, stored, wouldUpgradeTo);
|
|
38
140
|
// If true, then upgrading has no effect on what can be stored in the document.
|
|
39
141
|
// TODO: This should likely be changed to indicate up a schema upgrade would be a no-op, including stored schema metadata.
|
|
40
|
-
const isEquivalent = canView && canUpgrade && (0,
|
|
142
|
+
const isEquivalent = canView && canUpgrade && (0, index_js_3.allowsRepoSuperset)(policy, wouldUpgradeTo, stored);
|
|
41
143
|
return {
|
|
42
144
|
canView,
|
|
43
145
|
canUpgrade,
|
|
44
146
|
isEquivalent,
|
|
147
|
+
discrepancies: canView ? undefined : discrepancies,
|
|
148
|
+
enabledUpgrades,
|
|
45
149
|
};
|
|
46
150
|
}
|
|
47
151
|
exports.checkSchemaCompatibility = checkSchemaCompatibility;
|
|
152
|
+
function includeEnabledUpgrades(configuredPolicy, enabledUpgrades) {
|
|
153
|
+
if (enabledUpgrades.size === 0) {
|
|
154
|
+
return configuredPolicy;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
includeStaged: (upgrade) => configuredPolicy.includeStaged(upgrade) || enabledUpgrades.has(upgrade),
|
|
158
|
+
includeStagedOptional: (upgrade) => configuredPolicy.includeStagedOptional(upgrade) || enabledUpgrades.has(upgrade),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Computes the {@link StagedUpgradeStatus} for each upgrade token from total and enabled location counts.
|
|
163
|
+
* Only tokens with at least one enabled location are included in the returned map.
|
|
164
|
+
*/
|
|
165
|
+
function computeUpgradeStatuses(totalLocations, enabledLocations) {
|
|
166
|
+
const result = new Map();
|
|
167
|
+
for (const [upgrade, total] of totalLocations) {
|
|
168
|
+
const enabled = enabledLocations.get(upgrade) ?? 0;
|
|
169
|
+
if (enabled > 0 && enabled < total) {
|
|
170
|
+
result.set(upgrade, "partial");
|
|
171
|
+
}
|
|
172
|
+
else if (enabled >= total && enabled > 0) {
|
|
173
|
+
result.set(upgrade, "enabled");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
48
178
|
//# sourceMappingURL=schemaCompatibilityTester.js.map
|