From cb302e1581e6ddc37a9822d6b0aeecd6d662ba54 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:09:21 -0800 Subject: [PATCH 01/10] Export Json domain as alpha --- .../tree-react-api/src/test/importer.spec.ts | 7 ++ .../dds/tree/api-report/tree.alpha.api.md | 37 ++++++ packages/dds/tree/src/index.ts | 10 ++ packages/dds/tree/src/jsonDomainSchema.ts | 110 ++++++++++++++++++ packages/dds/tree/src/test/cursorTestSuite.ts | 2 +- .../src/test/domains/json/jsonCursor.bench.ts | 3 +- .../chunked-forest/basicChunk.spec.ts | 2 +- .../chunkEncodingEndToEnd.spec.ts | 2 +- .../chunked-forest/chunkTree.spec.ts | 3 +- .../chunked-forest/uniformChunk.spec.ts | 3 +- .../chunked-forest/uniformChunkTestData.ts | 2 +- .../defaultChangeFamily.spec.ts | 2 +- .../flex-tree/lazyField.spec.ts | 3 +- .../flex-tree/lazyNode.spec.ts | 3 +- .../schema-index/codec.spec.ts | 4 +- .../schema-index/schemaSummarizer.spec.ts | 2 +- packages/dds/tree/src/test/forestTestSuite.ts | 3 +- packages/dds/tree/src/test/json/index.ts | 1 - packages/dds/tree/src/test/json/jsonCursor.ts | 2 +- .../tree/src/test/json/jsonDomainSchema.ts | 24 ---- .../tree/src/test/jsonDomainSchema.spec.ts | 38 ++++++ .../dds/tree/src/test/sequenceRootUtils.ts | 3 +- .../tree/src/test/shared-tree/editing.spec.ts | 3 +- .../src/test/shared-tree/sharedTree.spec.ts | 3 +- .../test/simple-tree/api/conciseTree.spec.ts | 3 +- .../test/simple-tree/api/customTree.spec.ts | 3 +- packages/dds/tree/src/test/tsconfig.json | 2 +- packages/dds/tree/src/test/utils.ts | 3 +- .../api-report/fluid-framework.alpha.api.md | 37 ++++++ 29 files changed, 273 insertions(+), 47 deletions(-) create mode 100644 packages/dds/tree/src/jsonDomainSchema.ts delete mode 100644 packages/dds/tree/src/test/json/jsonDomainSchema.ts create mode 100644 packages/dds/tree/src/test/jsonDomainSchema.spec.ts diff --git a/experimental/framework/tree-react-api/src/test/importer.spec.ts b/experimental/framework/tree-react-api/src/test/importer.spec.ts index 036b3adc8ce8..351ef0db5f85 100644 --- a/experimental/framework/tree-react-api/src/test/importer.spec.ts +++ b/experimental/framework/tree-react-api/src/test/importer.spec.ts @@ -5,6 +5,8 @@ import { strict as assert } from "node:assert"; +import { JsonArray } from "@fluidframework/tree/internal"; + import { RecursiveMap } from "../testExports.js"; describe("import tests", () => { @@ -12,4 +14,9 @@ describe("import tests", () => { const r = new RecursiveMap([["", new RecursiveMap([])]]); assert.equal(r.size, 1); }); + + it("JsonArray", () => { + const r = new JsonArray([1]); + assert.equal(r[0], 1); + }); }); diff --git a/packages/dds/tree/api-report/tree.alpha.api.md b/packages/dds/tree/api-report/tree.alpha.api.md index 8a5cefd238e4..9561108946dd 100644 --- a/packages/dds/tree/api-report/tree.alpha.api.md +++ b/packages/dds/tree/api-report/tree.alpha.api.md @@ -21,6 +21,20 @@ export type AllowedTypes = readonly LazyItem[]; // @public type AllowedTypesUnsafe = readonly LazyItem[]; +// @alpha +export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { +[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +create(data: boolean): boolean; +}> | null, any, undefined>; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; + +// @alpha +export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { +[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +create(data: boolean): boolean; +}> | null], any, undefined>; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; + // @public type ApplyKind = { [FieldKind.Required]: T; @@ -337,6 +351,10 @@ export interface ITreeViewConfiguration { readonly items: JsonFieldSchema; @@ -381,6 +399,10 @@ export interface JsonNodeSchemaBase { readonly additionalProperties?: boolean; @@ -388,6 +410,12 @@ export interface JsonObjectNodeSchema extends JsonNodeSchemaBase, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; + +// @alpha (undocumented) +export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; + // @alpha export type JsonRefPath = `#/$defs/${JsonSchemaId}`; @@ -407,6 +435,12 @@ export type JsonTreeSchema = JsonFieldSchema & { readonly $defs: Record; }; +// @alpha +export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; + +// @alpha (undocumented) +export type JsonUnion = TreeNodeFromImplicitAllowedTypes; + // @alpha export interface JsonValidator { compile(schema: Schema): SchemaValidationFunction; @@ -518,6 +552,9 @@ export type ReadSchema; + // @public @deprecated export type RestrictiveReadonlyRecord = { readonly [P in symbol | string]: P extends K ? T : never; diff --git a/packages/dds/tree/src/index.ts b/packages/dds/tree/src/index.ts index 5f123fb5a167..1a2b20a8d48f 100644 --- a/packages/dds/tree/src/index.ts +++ b/packages/dds/tree/src/index.ts @@ -233,3 +233,13 @@ export { export type { MapNodeInsertableData } from "./simple-tree/index.js"; export type { JsonCompatible, JsonCompatibleObject } from "./util/index.js"; + +export { + JsonUnion, + JsonArray, + JsonObject, + JsonPrimitive, + _RecursiveArrayWorkaroundJsonArray, + _APIExtractorWorkaroundJsonObjectBase, + _APIExtractorWorkaroundJsonArrayBase, +} from "./jsonDomainSchema.js"; diff --git a/packages/dds/tree/src/jsonDomainSchema.ts b/packages/dds/tree/src/jsonDomainSchema.ts new file mode 100644 index 000000000000..106aa7dfdfed --- /dev/null +++ b/packages/dds/tree/src/jsonDomainSchema.ts @@ -0,0 +1,110 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { + SchemaFactory, + type AllowedTypes, + type FixRecursiveArraySchema, + type TreeNodeFromImplicitAllowedTypes, + type ValidateRecursiveSchema, +} from "./simple-tree/index.js"; + +const sf = new SchemaFactory("com.fluidframework.json"); + +/** + * {@link AllowedTypes} for primitives types allowed in JSON. + * @alpha + */ +export const JsonPrimitive = [ + sf.null, + sf.boolean, + sf.number, + sf.string, +] as const satisfies AllowedTypes; + +/** + * @alpha + */ +export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; + +/** + * {@link AllowedTypes} for any content allowed in the JSON domain. + * @example + * ```typescript + * const tree = TreeAlpha.importConcise(JsonUnion, { example: { nested: true }, value: 5 }); + * ``` + * @alpha + */ +export const JsonUnion = [() => JsonObject, () => JsonArray, ...JsonPrimitive] as const; + +/** + * @alpha + */ +export type JsonUnion = TreeNodeFromImplicitAllowedTypes; + +/** + * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}. + * @system @alpha + */ +export const _APIExtractorWorkaroundJsonObjectBase = sf.mapRecursive("object", JsonUnion); + +/** + * Arbitrary JSON object as a {@link TreeNode}. + * @remarks + * API of the tree node is more aligned with an es6 map than a JS object using its properties like a map. + * @example + * ```typescript + * // Due to TypeScript restrictions on recursive types, the constructor and be somewhat limiting. + * const fromArray = new JsonObject([["a", 0]]); + * // Using `importConcise` can work better for JSON data: + * const imported = TreeAlpha.importConcise(JsonObject, { a: 0 }); + * // Node API is like a Map: + * const value = imported.get("a"); + * ``` + * @alpha + */ +export class JsonObject extends _APIExtractorWorkaroundJsonObjectBase {} +{ + type _check = ValidateRecursiveSchema; +} + +/** + * D.ts bug workaround, see {@link FixRecursiveArraySchema}. + * @privateRemarks + * Normally this would reference JsonArray, but when combining this workaround with the other workaround, this has to reference the base type. + * Testing for this has to be in a separate package, and is thus part of experimental/framework/tree-react-api/src/test/importer.spec.ts. + * @system @alpha + */ +export declare const _RecursiveArrayWorkaroundJsonArray: FixRecursiveArraySchema< + typeof _APIExtractorWorkaroundJsonArrayBase +>; + +/** + * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}. + * @system @alpha + */ +export const _APIExtractorWorkaroundJsonArrayBase = sf.arrayRecursive("array", JsonUnion); + +/** + * Arbitrary JSON object as a {@link TreeNode}. + * @remarks + * This can be worked around by using {@link TreeAlpha.importConcise}. + * @example + * ```typescript + * // Due to TypeScript restrictions on recursive types, the constructor and be somewhat limiting. + * const usingConstructor = new JsonArray(["a", 0, new JsonArray([1])]); + * // Using `importConcise` can work better for JSON data: + * const imported = TreeAlpha.importConcise(JsonArray, ["a", 0, [1]]); + * // Node API is like an Array: + * const outer: JsonUnion = imported[0]; + * assert(Tree.is(outer, JsonArray)); + * const inner = outer[0]; + * ``` + * @alpha + */ +export class JsonArray extends _APIExtractorWorkaroundJsonArrayBase {} +{ + type _check = ValidateRecursiveSchema; +} diff --git a/packages/dds/tree/src/test/cursorTestSuite.ts b/packages/dds/tree/src/test/cursorTestSuite.ts index d08c961a64b3..4a8a8c62c5fe 100644 --- a/packages/dds/tree/src/test/cursorTestSuite.ts +++ b/packages/dds/tree/src/test/cursorTestSuite.ts @@ -33,7 +33,7 @@ import { SchemaFactory, stringSchema, } from "../simple-tree/index.js"; -import { JsonArray, JsonObject } from "./json/index.js"; +import { JsonArray, JsonObject } from "../jsonDomainSchema.js"; const sf = new SchemaFactory("Cursor Test Suite"); diff --git a/packages/dds/tree/src/test/domains/json/jsonCursor.bench.ts b/packages/dds/tree/src/test/domains/json/jsonCursor.bench.ts index 39ea8da72c94..b2fcb3208fec 100644 --- a/packages/dds/tree/src/test/domains/json/jsonCursor.bench.ts +++ b/packages/dds/tree/src/test/domains/json/jsonCursor.bench.ts @@ -41,7 +41,8 @@ import { clone } from "./jsObjectUtil.js"; import { generateTwitterJsonByByteSize } from "./twitter.js"; // eslint-disable-next-line import/no-internal-modules import { toStoredSchema } from "../../../simple-tree/toStoredSchema.js"; -import { JsonUnion, cursorToJsonObject, singleJsonCursor } from "../../json/index.js"; +import { cursorToJsonObject, singleJsonCursor } from "../../json/index.js"; +import { JsonUnion } from "../../../jsonDomainSchema.js"; // Shared tree keys that map to the type used by the Twitter type/dataset export const TwitterKey = { diff --git a/packages/dds/tree/src/test/feature-libraries/chunked-forest/basicChunk.spec.ts b/packages/dds/tree/src/test/feature-libraries/chunked-forest/basicChunk.spec.ts index 36e9cd89f204..baeaf68e2ca8 100644 --- a/packages/dds/tree/src/test/feature-libraries/chunked-forest/basicChunk.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/chunked-forest/basicChunk.spec.ts @@ -42,7 +42,7 @@ import { } from "../../cursorTestSuite.js"; import { numberSequenceField, validateChunkCursor } from "./fieldCursorTestUtilities.js"; import { emptyShape, testData } from "./uniformChunkTestData.js"; -import { JsonObject } from "../../json/index.js"; +import { JsonObject } from "../../../jsonDomainSchema.js"; import { numberSchema } from "../../../simple-tree/index.js"; const basicOnlyChunkCompressor: ChunkCompressor = { diff --git a/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkEncodingEndToEnd.spec.ts b/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkEncodingEndToEnd.spec.ts index ea7fbbd6892c..a3459387b0f8 100644 --- a/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkEncodingEndToEnd.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkEncodingEndToEnd.spec.ts @@ -78,7 +78,7 @@ import type { Format } from "../../../feature-libraries/forest-summary/format.js import type { EncodedFieldBatch } from "../../../feature-libraries/chunked-forest/index.js"; import { jsonSequenceRootSchema } from "../../sequenceRootUtils.js"; // eslint-disable-next-line import/no-internal-modules -import { JsonObject } from "../../json/jsonDomainSchema.js"; +import { JsonObject } from "../../../jsonDomainSchema.js"; import { brand } from "../../../util/index.js"; // eslint-disable-next-line import/no-internal-modules import { ChunkedForest } from "../../../feature-libraries/chunked-forest/chunkedForest.js"; diff --git a/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkTree.spec.ts b/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkTree.spec.ts index f806b51c9793..6b86486241e0 100644 --- a/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkTree.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/chunked-forest/chunkTree.spec.ts @@ -57,8 +57,9 @@ import { stringSchema, toStoredSchema, } from "../../../simple-tree/index.js"; -import { fieldJsonCursor, JsonObject, singleJsonCursor } from "../../json/index.js"; +import { fieldJsonCursor, singleJsonCursor } from "../../json/index.js"; import { testIdCompressor } from "../../utils.js"; +import { JsonObject } from "../../../jsonDomainSchema.js"; const builder = new SchemaFactory("chunkTree"); const empty = builder.object("empty", {}); diff --git a/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunk.spec.ts b/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunk.spec.ts index 247df31c5b79..ecf7edb0440f 100644 --- a/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunk.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunk.spec.ts @@ -8,7 +8,7 @@ import { strict as assert } from "assert"; import { BenchmarkType, benchmark } from "@fluid-tools/benchmark"; import { EmptyKey, type ITreeCursorSynchronous } from "../../../core/index.js"; -import { cursorToJsonObject, singleJsonCursor, JsonObject } from "../../json/index.js"; +import { cursorToJsonObject, singleJsonCursor } from "../../json/index.js"; import { type ChunkShape, TreeShape, @@ -31,6 +31,7 @@ import { brand } from "../../../util/index.js"; // eslint-disable-next-line import/no-internal-modules import { numberSchema, stringSchema } from "../../../simple-tree/leafNodeSchema.js"; import { validateUsageError } from "../../utils.js"; +import { JsonObject } from "../../../jsonDomainSchema.js"; // Validate a few aspects of shapes that are easier to verify here than via checking the cursor. function validateShape(shape: ChunkShape): void { diff --git a/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunkTestData.ts b/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunkTestData.ts index 71604c438790..7640ee44042f 100644 --- a/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunkTestData.ts +++ b/packages/dds/tree/src/test/feature-libraries/chunked-forest/uniformChunkTestData.ts @@ -14,7 +14,7 @@ import { import { numberSchema } from "../../../simple-tree/index.js"; import { brand, makeArray } from "../../../util/index.js"; import { type TestField, EmptyObject } from "../../cursorTestSuite.js"; -import { JsonArray, JsonObject } from "../../json/index.js"; +import { JsonArray, JsonObject } from "../../../jsonDomainSchema.js"; export const emptyShape = new TreeShape(brand(EmptyObject.identifier), false, []); diff --git a/packages/dds/tree/src/test/feature-libraries/default-field-kinds/defaultChangeFamily.spec.ts b/packages/dds/tree/src/test/feature-libraries/default-field-kinds/defaultChangeFamily.spec.ts index 5c854dbb14ba..3e60b8f745e6 100644 --- a/packages/dds/tree/src/test/feature-libraries/default-field-kinds/defaultChangeFamily.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/default-field-kinds/defaultChangeFamily.spec.ts @@ -36,7 +36,7 @@ import { testIdCompressor, testRevisionTagCodec, } from "../../utils.js"; -import { JsonObject } from "../../json/index.js"; +import { JsonObject } from "../../../jsonDomainSchema.js"; import { numberSchema, stringSchema } from "../../../simple-tree/index.js"; const defaultChangeFamily = new DefaultChangeFamily(failCodecFamily); diff --git a/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyField.spec.ts b/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyField.spec.ts index f9afe6d1922f..30a86cf852a2 100644 --- a/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyField.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyField.spec.ts @@ -52,7 +52,8 @@ import { stringSchema, } from "../../../simple-tree/index.js"; import { getStoredSchema, toStoredSchema } from "../../../simple-tree/toStoredSchema.js"; -import { JsonObject, JsonUnion, singleJsonCursor } from "../../json/index.js"; +import { singleJsonCursor } from "../../json/index.js"; +import { JsonObject, JsonUnion } from "../../../jsonDomainSchema.js"; const detachedField: FieldKey = brand("detached"); const detachedFieldAnchor: FieldAnchor = { parent: undefined, fieldKey: detachedField }; diff --git a/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyNode.spec.ts b/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyNode.spec.ts index 998da8e19ae3..aa745d6f936a 100644 --- a/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyNode.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/flex-tree/lazyNode.spec.ts @@ -22,9 +22,10 @@ import type { FlexTreeField, FlexTreeNode } from "../../../feature-libraries/ind import { readonlyTreeWithContent } from "./utils.js"; import { cursorFromInsertable, SchemaFactory } from "../../../simple-tree/index.js"; -import { JsonObject, singleJsonCursor } from "../../json/index.js"; +import { singleJsonCursor } from "../../json/index.js"; import { stringSchema } from "../../../simple-tree/leafNodeSchema.js"; import { brand } from "../../../util/index.js"; +import { JsonObject } from "../../../jsonDomainSchema.js"; /** * Test {@link LazyTreeNode} implementation. diff --git a/packages/dds/tree/src/test/feature-libraries/schema-index/codec.spec.ts b/packages/dds/tree/src/test/feature-libraries/schema-index/codec.spec.ts index a80869bce7e5..4dff4d496c68 100644 --- a/packages/dds/tree/src/test/feature-libraries/schema-index/codec.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/schema-index/codec.spec.ts @@ -20,11 +20,11 @@ import { type EncodingTestData, makeEncodingTestSuite } from "../../utils.js"; // eslint-disable-next-line import/no-internal-modules import { toStoredSchema } from "../../../simple-tree/toStoredSchema.js"; import { SchemaFactory } from "../../../simple-tree/index.js"; -import { jsonPrimitiveSchema, JsonUnion } from "../../json/index.js"; +import { JsonPrimitive, JsonUnion } from "../../../jsonDomainSchema.js"; const codec = makeSchemaCodec({ jsonValidator: typeboxValidator }); -const schema2 = toStoredSchema(new SchemaFactory("testSchemas").optional(jsonPrimitiveSchema)); +const schema2 = toStoredSchema(new SchemaFactory("testSchemas").optional(JsonPrimitive)); const testCases: EncodingTestData = { successes: [ diff --git a/packages/dds/tree/src/test/feature-libraries/schema-index/schemaSummarizer.spec.ts b/packages/dds/tree/src/test/feature-libraries/schema-index/schemaSummarizer.spec.ts index 3075d5386416..2717a0c7ff14 100644 --- a/packages/dds/tree/src/test/feature-libraries/schema-index/schemaSummarizer.spec.ts +++ b/packages/dds/tree/src/test/feature-libraries/schema-index/schemaSummarizer.spec.ts @@ -10,7 +10,7 @@ import { } from "../../../feature-libraries/schema-index/schemaSummarizer.js"; import { toStoredSchema } from "../../../simple-tree/index.js"; import { takeJsonSnapshot, useSnapshotDirectory } from "../../snapshots/index.js"; -import { JsonUnion } from "../../json/index.js"; +import { JsonUnion } from "../../../jsonDomainSchema.js"; describe("schemaSummarizer", () => { describe("encodeTreeSchema", () => { diff --git a/packages/dds/tree/src/test/forestTestSuite.ts b/packages/dds/tree/src/test/forestTestSuite.ts index 9981961886a1..809320ecf532 100644 --- a/packages/dds/tree/src/test/forestTestSuite.ts +++ b/packages/dds/tree/src/test/forestTestSuite.ts @@ -58,7 +58,8 @@ import { toStoredSchema, } from "../simple-tree/index.js"; import { jsonSequenceRootSchema } from "./sequenceRootUtils.js"; -import { cursorToJsonObject, JsonArray, singleJsonCursor } from "./json/index.js"; +import { cursorToJsonObject, singleJsonCursor } from "./json/index.js"; +import { JsonArray } from "../jsonDomainSchema.js"; /** * Configuration for the forest test suite. diff --git a/packages/dds/tree/src/test/json/index.ts b/packages/dds/tree/src/test/json/index.ts index a1cf793ca8a6..846f505af689 100644 --- a/packages/dds/tree/src/test/json/index.ts +++ b/packages/dds/tree/src/test/json/index.ts @@ -8,4 +8,3 @@ export { cursorToJsonObject, fieldJsonCursor, } from "./jsonCursor.js"; -export { JsonUnion, JsonArray, JsonObject, jsonPrimitiveSchema } from "./jsonDomainSchema.js"; diff --git a/packages/dds/tree/src/test/json/jsonCursor.ts b/packages/dds/tree/src/test/json/jsonCursor.ts index 410110513bf0..5832073e669e 100644 --- a/packages/dds/tree/src/test/json/jsonCursor.ts +++ b/packages/dds/tree/src/test/json/jsonCursor.ts @@ -22,7 +22,7 @@ import { } from "../../feature-libraries/index.js"; import { brand, isReadonlyArray, type JsonCompatible } from "../../util/index.js"; -import { JsonArray, JsonObject } from "./jsonDomainSchema.js"; +import { JsonArray, JsonObject } from "../../jsonDomainSchema.js"; import { isFluidHandle } from "@fluidframework/runtime-utils/internal"; import { booleanSchema, diff --git a/packages/dds/tree/src/test/json/jsonDomainSchema.ts b/packages/dds/tree/src/test/json/jsonDomainSchema.ts deleted file mode 100644 index 630e77210b0a..000000000000 --- a/packages/dds/tree/src/test/json/jsonDomainSchema.ts +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation and contributors. All rights reserved. - * Licensed under the MIT License. - */ - -import { - SchemaFactory, - type FixRecursiveArraySchema, - type ValidateRecursiveSchema, -} from "../../simple-tree/index.js"; - -const sf = new SchemaFactory("com.fluidframework.json"); - -export const jsonPrimitiveSchema = [sf.null, sf.boolean, sf.number, sf.string] as const; -export const JsonUnion = [() => JsonObject, () => JsonArray, ...jsonPrimitiveSchema] as const; -export class JsonObject extends sf.mapRecursive("object", JsonUnion) {} -{ - type _check = ValidateRecursiveSchema; -} -export declare const _RecursiveArrayWorkaround: FixRecursiveArraySchema; -export class JsonArray extends sf.arrayRecursive("array", JsonUnion) {} -{ - type _check = ValidateRecursiveSchema; -} diff --git a/packages/dds/tree/src/test/jsonDomainSchema.spec.ts b/packages/dds/tree/src/test/jsonDomainSchema.spec.ts new file mode 100644 index 000000000000..95ec13f3d151 --- /dev/null +++ b/packages/dds/tree/src/test/jsonDomainSchema.spec.ts @@ -0,0 +1,38 @@ +/*! + * Copyright (c) Microsoft Corporation and contributors. All rights reserved. + * Licensed under the MIT License. + */ + +import { strict as assert } from "assert"; +import { Tree, TreeAlpha } from "../shared-tree/index.js"; +import { JsonArray, JsonObject, JsonUnion } from "../jsonDomainSchema.js"; + +describe("JsonDomainSchema", () => { + it("examples", () => { + const tree1 = TreeAlpha.importConcise(JsonUnion, { example: { nested: true }, value: 5 }); + + const tree3 = TreeAlpha.importConcise(JsonArray, [1, "x", { a: 0 }]); + + { + // Due to TypeScript restrictions on recursive types, the constructor and be somewhat limiting. + const fromArray = new JsonObject([["a", 0]]); + // Using `importConcise` can work better for JSON data: + const imported = TreeAlpha.importConcise(JsonObject, { a: 0 }); + // Node API is like a Map: + const value = imported.get("a"); + assert.equal(value, 0); + } + + { + // Due to TypeScript restrictions on recursive types, the constructor and be somewhat limiting. + const usingConstructor = new JsonArray(["a", 0, new JsonArray([1])]); + // Using `importConcise` can work better for JSON data: + const imported = TreeAlpha.importConcise(JsonArray, ["a", 0, [1]]); + // Node API is like an Array: + const outer: JsonUnion = imported[0]; + assert(Tree.is(outer, JsonArray)); + const inner = outer[0]; + assert.equal(inner, 1); + } + }); +}); diff --git a/packages/dds/tree/src/test/sequenceRootUtils.ts b/packages/dds/tree/src/test/sequenceRootUtils.ts index b61aacfceb8b..fb25771a25e6 100644 --- a/packages/dds/tree/src/test/sequenceRootUtils.ts +++ b/packages/dds/tree/src/test/sequenceRootUtils.ts @@ -16,7 +16,8 @@ import { brand, type JsonCompatible } from "../util/index.js"; import { checkoutWithContent } from "./utils.js"; // eslint-disable-next-line import/no-internal-modules import { normalizeAllowedTypes } from "../simple-tree/schemaTypes.js"; -import { JsonUnion, singleJsonCursor } from "./json/index.js"; +import { singleJsonCursor } from "./json/index.js"; +import { JsonUnion } from "../jsonDomainSchema.js"; // This file provides utilities for testing sequence fields using documents where the root is the sequence being tested. // This pattern is not expressible using the public simple-tree API, and is only for testing internal details. diff --git a/packages/dds/tree/src/test/shared-tree/editing.spec.ts b/packages/dds/tree/src/test/shared-tree/editing.spec.ts index df96020d3b4d..c2a2f1b7358c 100644 --- a/packages/dds/tree/src/test/shared-tree/editing.spec.ts +++ b/packages/dds/tree/src/test/shared-tree/editing.spec.ts @@ -36,7 +36,8 @@ import { } from "../utils.js"; import { insert, makeTreeFromJsonSequence, remove } from "../sequenceRootUtils.js"; import { SchemaFactory, stringSchema, toStoredSchema } from "../../simple-tree/index.js"; -import { JsonUnion, singleJsonCursor } from "../json/index.js"; +import { singleJsonCursor } from "../json/index.js"; +import { JsonUnion } from "../../jsonDomainSchema.js"; const rootField: FieldUpPath = { parent: undefined, diff --git a/packages/dds/tree/src/test/shared-tree/sharedTree.spec.ts b/packages/dds/tree/src/test/shared-tree/sharedTree.spec.ts index 661e7d544838..467c57482fa4 100644 --- a/packages/dds/tree/src/test/shared-tree/sharedTree.spec.ts +++ b/packages/dds/tree/src/test/shared-tree/sharedTree.spec.ts @@ -91,8 +91,9 @@ import type { ISharedObjectKind } from "@fluidframework/shared-object-base/inter import { TestAnchor } from "../testAnchor.js"; // eslint-disable-next-line import/no-internal-modules import { handleSchema, numberSchema, stringSchema } from "../../simple-tree/leafNodeSchema.js"; -import { JsonArray, singleJsonCursor } from "../json/index.js"; +import { singleJsonCursor } from "../json/index.js"; import { AttachState } from "@fluidframework/container-definitions"; +import { JsonArray } from "../../jsonDomainSchema.js"; const enableSchemaValidation = true; diff --git a/packages/dds/tree/src/test/simple-tree/api/conciseTree.spec.ts b/packages/dds/tree/src/test/simple-tree/api/conciseTree.spec.ts index eb8cf62350c5..8270583e6547 100644 --- a/packages/dds/tree/src/test/simple-tree/api/conciseTree.spec.ts +++ b/packages/dds/tree/src/test/simple-tree/api/conciseTree.spec.ts @@ -5,9 +5,10 @@ import { strict as assert, fail } from "node:assert"; -import { JsonUnion, singleJsonCursor } from "../../json/index.js"; +import { singleJsonCursor } from "../../json/index.js"; // eslint-disable-next-line import/no-internal-modules import { conciseFromCursor } from "../../../simple-tree/api/conciseTree.js"; +import { JsonUnion } from "../../../jsonDomainSchema.js"; describe("simple-tree conciseTree", () => { it("conciseFromCursor", () => { diff --git a/packages/dds/tree/src/test/simple-tree/api/customTree.spec.ts b/packages/dds/tree/src/test/simple-tree/api/customTree.spec.ts index 618b15c21170..52f3731827e0 100644 --- a/packages/dds/tree/src/test/simple-tree/api/customTree.spec.ts +++ b/packages/dds/tree/src/test/simple-tree/api/customTree.spec.ts @@ -11,8 +11,9 @@ import { cursorFromInsertable, SchemaFactory } from "../../../simple-tree/index. import { customFromCursorInner } from "../../../simple-tree/api/customTree.js"; // eslint-disable-next-line import/no-internal-modules import { getUnhydratedContext } from "../../../simple-tree/createContext.js"; -import { JsonUnion, singleJsonCursor } from "../../json/index.js"; +import { singleJsonCursor } from "../../json/index.js"; import { MockHandle } from "@fluidframework/test-runtime-utils/internal"; +import { JsonUnion } from "../../../jsonDomainSchema.js"; const schemaFactory = new SchemaFactory("Test"); diff --git a/packages/dds/tree/src/test/tsconfig.json b/packages/dds/tree/src/test/tsconfig.json index d94ea113bca0..dce21b9b5948 100644 --- a/packages/dds/tree/src/test/tsconfig.json +++ b/packages/dds/tree/src/test/tsconfig.json @@ -13,7 +13,7 @@ "noUncheckedIndexedAccess": false, "exactOptionalPropertyTypes": false, }, - "include": ["./**/*"], + "include": ["./**/*", "../jsonDomainSchema.ts"], "references": [ { "path": "../../tsconfig.json", diff --git a/packages/dds/tree/src/test/utils.ts b/packages/dds/tree/src/test/utils.ts index ca12ac8d2c7e..563120a55f87 100644 --- a/packages/dds/tree/src/test/utils.ts +++ b/packages/dds/tree/src/test/utils.ts @@ -145,9 +145,10 @@ import { } from "../util/index.js"; import { isFluidHandle, toFluidHandleInternal } from "@fluidframework/runtime-utils/internal"; import type { Client } from "@fluid-private/test-dds-utils"; -import { JsonUnion, cursorToJsonObject, singleJsonCursor } from "./json/index.js"; +import { cursorToJsonObject, singleJsonCursor } from "./json/index.js"; // eslint-disable-next-line import/no-internal-modules import type { TreeSimpleContent } from "./feature-libraries/flex-tree/utils.js"; +import { JsonUnion } from "../jsonDomainSchema.js"; // Testing utilities diff --git a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md index c300a3cccf9e..65c1ce6c368e 100644 --- a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md +++ b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md @@ -21,6 +21,20 @@ export type AllowedTypes = readonly LazyItem[]; // @public type AllowedTypesUnsafe = readonly LazyItem[]; +// @alpha +export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { +[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +create(data: boolean): boolean; +}> | null, any, undefined>; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; + +// @alpha +export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { +[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +create(data: boolean): boolean; +}> | null], any, undefined>; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; + // @public type ApplyKind = { [FieldKind.Required]: T; @@ -677,6 +691,10 @@ export interface ITreeViewConfiguration { readonly items: JsonFieldSchema; @@ -721,6 +739,10 @@ export interface JsonNodeSchemaBase { readonly additionalProperties?: boolean; @@ -728,6 +750,12 @@ export interface JsonObjectNodeSchema extends JsonNodeSchemaBase, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; + +// @alpha (undocumented) +export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; + // @alpha export type JsonRefPath = `#/$defs/${JsonSchemaId}`; @@ -747,6 +775,12 @@ export type JsonTreeSchema = JsonFieldSchema & { readonly $defs: Record; }; +// @alpha +export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; + +// @alpha (undocumented) +export type JsonUnion = TreeNodeFromImplicitAllowedTypes; + // @alpha export interface JsonValidator { compile(schema: Schema): SchemaValidationFunction; @@ -866,6 +900,9 @@ export type ReadSchema; + // @public export type ReplaceIEventThisPlaceHolder = L extends any[] ? { [K in keyof L]: L[K] extends IEventThisPlaceHolder ? TThis : L[K]; From 82787cc628fd6ede91a6c932d508c7ee93a720bb Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Mon, 11 Nov 2024 10:20:18 -0800 Subject: [PATCH 02/10] Remove unintended changes from move --- packages/dds/tree/src/test/tsconfig.json | 2 +- packages/dds/tree/src/test/utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dds/tree/src/test/tsconfig.json b/packages/dds/tree/src/test/tsconfig.json index dce21b9b5948..d94ea113bca0 100644 --- a/packages/dds/tree/src/test/tsconfig.json +++ b/packages/dds/tree/src/test/tsconfig.json @@ -13,7 +13,7 @@ "noUncheckedIndexedAccess": false, "exactOptionalPropertyTypes": false, }, - "include": ["./**/*", "../jsonDomainSchema.ts"], + "include": ["./**/*"], "references": [ { "path": "../../tsconfig.json", diff --git a/packages/dds/tree/src/test/utils.ts b/packages/dds/tree/src/test/utils.ts index a73ab9bcd3b5..563120a55f87 100644 --- a/packages/dds/tree/src/test/utils.ts +++ b/packages/dds/tree/src/test/utils.ts @@ -4,13 +4,13 @@ */ import { strict as assert } from "node:assert"; - import { createMockLoggerExt, type IMockLoggerExt, type ITelemetryLoggerExt, UsageError, } from "@fluidframework/telemetry-utils/internal"; + import { makeRandom } from "@fluid-private/stochastic-test-utils"; import { LocalServerTestDriver } from "@fluid-private/test-drivers"; import type { IContainer } from "@fluidframework/container-definitions/internal"; From 2e68c7399618f7c6567bfb433635d06b9cd1f7a2 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:48:02 -0800 Subject: [PATCH 03/10] Mostly Fix merge --- .../dds/tree/api-report/tree.alpha.api.md | 20 +++++++++++-------- .../tree/src/test/jsonDomainSchema.spec.ts | 2 +- .../test/shared-tree/schematizeTree.spec.ts | 3 ++- .../api-report/fluid-framework.alpha.api.md | 20 +++++++++++-------- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/packages/dds/tree/api-report/tree.alpha.api.md b/packages/dds/tree/api-report/tree.alpha.api.md index cec9b9194c29..15dcaf008100 100644 --- a/packages/dds/tree/api-report/tree.alpha.api.md +++ b/packages/dds/tree/api-report/tree.alpha.api.md @@ -22,18 +22,22 @@ export type AllowedTypes = readonly LazyItem[]; type AllowedTypesUnsafe = readonly LazyItem[]; // @alpha -export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { -[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { +[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { create(data: boolean): boolean; }> | null, any, undefined>; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; // @alpha -export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { -[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { +[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { create(data: boolean): boolean; }> | null], any, undefined>; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; +} | { +readonly [x: string]: string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { +create(data: boolean): boolean; +}> | null; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; // @public type ApplyKind = { @@ -436,7 +440,7 @@ export interface JsonObjectNodeSchema extends JsonNodeSchemaBase, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; +export const JsonPrimitive: readonly [TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; // @alpha (undocumented) export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; @@ -461,7 +465,7 @@ export type JsonTreeSchema = JsonFieldSchema & { }; // @alpha -export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; +export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; // @alpha (undocumented) export type JsonUnion = TreeNodeFromImplicitAllowedTypes; diff --git a/packages/dds/tree/src/test/jsonDomainSchema.spec.ts b/packages/dds/tree/src/test/jsonDomainSchema.spec.ts index 95ec13f3d151..556845b5e503 100644 --- a/packages/dds/tree/src/test/jsonDomainSchema.spec.ts +++ b/packages/dds/tree/src/test/jsonDomainSchema.spec.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. */ -import { strict as assert } from "assert"; +import { strict as assert } from "node:assert"; import { Tree, TreeAlpha } from "../shared-tree/index.js"; import { JsonArray, JsonObject, JsonUnion } from "../jsonDomainSchema.js"; diff --git a/packages/dds/tree/src/test/shared-tree/schematizeTree.spec.ts b/packages/dds/tree/src/test/shared-tree/schematizeTree.spec.ts index a469a46c32a1..2297424d8b4e 100644 --- a/packages/dds/tree/src/test/shared-tree/schematizeTree.spec.ts +++ b/packages/dds/tree/src/test/shared-tree/schematizeTree.spec.ts @@ -15,7 +15,7 @@ import { TreeStoredSchemaRepository, type AnchorSetRootEvents, } from "../../core/index.js"; -import { JsonUnion, singleJsonCursor } from "../json/index.js"; +import { singleJsonCursor } from "../json/index.js"; import { FieldKinds, allowsRepoSuperset, @@ -49,6 +49,7 @@ import { import { toStoredSchema } from "../../simple-tree/toStoredSchema.js"; import type { Transactor } from "../../shared-tree-core/index.js"; import { Breakable } from "../../util/index.js"; +import { JsonUnion } from "../../jsonDomainSchema.js"; const builder = new SchemaFactory("test"); const root = builder.number; diff --git a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md index a236bee14a73..7e907f14e97d 100644 --- a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md +++ b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md @@ -22,18 +22,22 @@ export type AllowedTypes = readonly LazyItem[]; type AllowedTypesUnsafe = readonly LazyItem[]; // @alpha -export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { -[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { +[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { create(data: boolean): boolean; }> | null, any, undefined>; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; // @alpha -export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { -[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean> & { +export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { +[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { create(data: boolean): boolean; }> | null], any, undefined>; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>], undefined>; +} | { +readonly [x: string]: string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { +create(data: boolean): boolean; +}> | null; +}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; // @public type ApplyKind = { @@ -776,7 +780,7 @@ export interface JsonObjectNodeSchema extends JsonNodeSchemaBase, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; +export const JsonPrimitive: readonly [TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; // @alpha (undocumented) export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; @@ -801,7 +805,7 @@ export type JsonTreeSchema = JsonFieldSchema & { }; // @alpha -export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never>]; +export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; // @alpha (undocumented) export type JsonUnion = TreeNodeFromImplicitAllowedTypes; From eed648e538cb4ef12af183bfa06df0b1b528b117 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Thu, 20 Feb 2025 09:49:01 -0800 Subject: [PATCH 04/10] Fix recursive array workaround --- packages/dds/tree/src/jsonDomainSchema.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/dds/tree/src/jsonDomainSchema.ts b/packages/dds/tree/src/jsonDomainSchema.ts index 106aa7dfdfed..eac2ac54e5a4 100644 --- a/packages/dds/tree/src/jsonDomainSchema.ts +++ b/packages/dds/tree/src/jsonDomainSchema.ts @@ -73,12 +73,12 @@ export class JsonObject extends _APIExtractorWorkaroundJsonObjectBase {} /** * D.ts bug workaround, see {@link FixRecursiveArraySchema}. * @privateRemarks - * Normally this would reference JsonArray, but when combining this workaround with the other workaround, this has to reference the base type. - * Testing for this has to be in a separate package, and is thus part of experimental/framework/tree-react-api/src/test/importer.spec.ts. + * In the past this this had to reference the base type (_APIExtractorWorkaroundJsonArrayBase). + * Testing for this in examples/utils/import-testing now shows it has to reference JsonArray instead.. * @system @alpha */ export declare const _RecursiveArrayWorkaroundJsonArray: FixRecursiveArraySchema< - typeof _APIExtractorWorkaroundJsonArrayBase + typeof JsonArray >; /** From 87d4020921a25169e4bc456e0a98672e0b252533 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Thu, 20 Feb 2025 10:02:29 -0800 Subject: [PATCH 05/10] Seal schema classes --- packages/dds/tree/api-report/tree.alpha.api.md | 6 +++--- packages/dds/tree/src/jsonDomainSchema.ts | 4 ++-- .../fluid-framework/api-report/fluid-framework.alpha.api.md | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/dds/tree/api-report/tree.alpha.api.md b/packages/dds/tree/api-report/tree.alpha.api.md index 15dcaf008100..76479c8bea12 100644 --- a/packages/dds/tree/api-report/tree.alpha.api.md +++ b/packages/dds/tree/api-report/tree.alpha.api.md @@ -379,7 +379,7 @@ export interface ITreeViewConfiguration; +export const _RecursiveArrayWorkaroundJsonArray: FixRecursiveArraySchema; // @public @deprecated export type RestrictiveReadonlyRecord = { diff --git a/packages/dds/tree/src/jsonDomainSchema.ts b/packages/dds/tree/src/jsonDomainSchema.ts index eac2ac54e5a4..7c4cda472250 100644 --- a/packages/dds/tree/src/jsonDomainSchema.ts +++ b/packages/dds/tree/src/jsonDomainSchema.ts @@ -63,7 +63,7 @@ export const _APIExtractorWorkaroundJsonObjectBase = sf.mapRecursive("object", J * // Node API is like a Map: * const value = imported.get("a"); * ``` - * @alpha + * @alpha @sealed */ export class JsonObject extends _APIExtractorWorkaroundJsonObjectBase {} { @@ -102,7 +102,7 @@ export const _APIExtractorWorkaroundJsonArrayBase = sf.arrayRecursive("array", J * assert(Tree.is(outer, JsonArray)); * const inner = outer[0]; * ``` - * @alpha + * @alpha @sealed */ export class JsonArray extends _APIExtractorWorkaroundJsonArrayBase {} { diff --git a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md index 7e907f14e97d..b1d4d67add55 100644 --- a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md +++ b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md @@ -719,7 +719,7 @@ export interface ITreeViewConfiguration; +export const _RecursiveArrayWorkaroundJsonArray: FixRecursiveArraySchema; // @public export type ReplaceIEventThisPlaceHolder = L extends any[] ? { From 6df8dc21c53ab1fb11c25a814a1275c457990b92 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Thu, 20 Feb 2025 11:17:24 -0800 Subject: [PATCH 06/10] fix lint --- examples/utils/import-testing/src/test/importer.spec.ts | 2 +- examples/utils/import-testing/src/testExports.ts | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/utils/import-testing/src/test/importer.spec.ts b/examples/utils/import-testing/src/test/importer.spec.ts index 351ef0db5f85..fafcebb81101 100644 --- a/examples/utils/import-testing/src/test/importer.spec.ts +++ b/examples/utils/import-testing/src/test/importer.spec.ts @@ -5,7 +5,7 @@ import { strict as assert } from "node:assert"; -import { JsonArray } from "@fluidframework/tree/internal"; +import { JsonArray } from "@fluidframework/tree/alpha"; import { RecursiveMap } from "../testExports.js"; diff --git a/examples/utils/import-testing/src/testExports.ts b/examples/utils/import-testing/src/testExports.ts index 17fea264fbd6..88367c8b5abf 100644 --- a/examples/utils/import-testing/src/testExports.ts +++ b/examples/utils/import-testing/src/testExports.ts @@ -81,7 +81,6 @@ export const config = new TreeViewConfiguration({ schema: Canvas }); // Recursive cases // This lint rule doesn't work well with our schema when using the lazy format -/* eslint-disable @typescript-eslint/explicit-function-return-type */ export class RecursiveObject extends schema.objectRecursive("RO", { x: [() => RecursiveObject, schema.number], }) {} @@ -105,5 +104,3 @@ export class RecursiveArray extends schema.arrayRecursive("RA", [() => Recursive { type _check = ValidateRecursiveSchema; } - -/* eslint-enable @typescript-eslint/explicit-function-return-type */ From abc688c88af7ab3196f98ce99a8dca3461ea2127 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Thu, 20 Feb 2025 13:20:13 -0800 Subject: [PATCH 07/10] use type instead of const for FixRecursiveArraySchema --- examples/utils/import-testing/src/testExports.ts | 2 +- packages/dds/tree/api-report/tree.alpha.api.md | 2 +- packages/dds/tree/src/index.ts | 6 +++--- packages/dds/tree/src/jsonDomainSchema.ts | 4 ++-- .../dds/tree/src/simple-tree/api/schemaFactoryRecursive.ts | 2 +- .../fluid-framework/api-report/fluid-framework.alpha.api.md | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/utils/import-testing/src/testExports.ts b/examples/utils/import-testing/src/testExports.ts index 88367c8b5abf..c602daf67a59 100644 --- a/examples/utils/import-testing/src/testExports.ts +++ b/examples/utils/import-testing/src/testExports.ts @@ -99,7 +99,7 @@ export class RecursiveMap extends schema.mapRecursive("RM", [() => RecursiveMap] * Workaround to avoid * `error TS2310: Type 'RecursiveArray' recursively references itself as a base type.` in the d.ts file. */ -export declare const _RecursiveArrayWorkaround: FixRecursiveArraySchema; +export declare type _RecursiveArrayWorkaround = FixRecursiveArraySchema; export class RecursiveArray extends schema.arrayRecursive("RA", [() => RecursiveArray]) {} { type _check = ValidateRecursiveSchema; diff --git a/packages/dds/tree/api-report/tree.alpha.api.md b/packages/dds/tree/api-report/tree.alpha.api.md index 76479c8bea12..6dead70714ea 100644 --- a/packages/dds/tree/api-report/tree.alpha.api.md +++ b/packages/dds/tree/api-report/tree.alpha.api.md @@ -589,7 +589,7 @@ TSchema ] extends [ImplicitFieldSchema] ? TSchema : ImplicitFieldSchema; // @alpha -export const _RecursiveArrayWorkaroundJsonArray: FixRecursiveArraySchema; +export type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema; // @public @deprecated export type RestrictiveReadonlyRecord = { diff --git a/packages/dds/tree/src/index.ts b/packages/dds/tree/src/index.ts index 5a80fa3e14be..d8a99cae9ff5 100644 --- a/packages/dds/tree/src/index.ts +++ b/packages/dds/tree/src/index.ts @@ -265,7 +265,7 @@ export { JsonArray, JsonObject, JsonPrimitive, - _RecursiveArrayWorkaroundJsonArray, - _APIExtractorWorkaroundJsonObjectBase, - _APIExtractorWorkaroundJsonArrayBase, + type _RecursiveArrayWorkaroundJsonArray, + type _APIExtractorWorkaroundJsonObjectBase, + type _APIExtractorWorkaroundJsonArrayBase, } from "./jsonDomainSchema.js"; diff --git a/packages/dds/tree/src/jsonDomainSchema.ts b/packages/dds/tree/src/jsonDomainSchema.ts index 7c4cda472250..d669cacf76ce 100644 --- a/packages/dds/tree/src/jsonDomainSchema.ts +++ b/packages/dds/tree/src/jsonDomainSchema.ts @@ -74,10 +74,10 @@ export class JsonObject extends _APIExtractorWorkaroundJsonObjectBase {} * D.ts bug workaround, see {@link FixRecursiveArraySchema}. * @privateRemarks * In the past this this had to reference the base type (_APIExtractorWorkaroundJsonArrayBase). - * Testing for this in examples/utils/import-testing now shows it has to reference JsonArray instead.. + * Testing for this in examples/utils/import-testing now shows it has to reference JsonArray instead. * @system @alpha */ -export declare const _RecursiveArrayWorkaroundJsonArray: FixRecursiveArraySchema< +export declare type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema< typeof JsonArray >; diff --git a/packages/dds/tree/src/simple-tree/api/schemaFactoryRecursive.ts b/packages/dds/tree/src/simple-tree/api/schemaFactoryRecursive.ts index cd0b095e0ed3..b40cffa1f04c 100644 --- a/packages/dds/tree/src/simple-tree/api/schemaFactoryRecursive.ts +++ b/packages/dds/tree/src/simple-tree/api/schemaFactoryRecursive.ts @@ -174,7 +174,7 @@ export type ValidateRecursiveSchema< * ```typescript * // Workaround to avoid * // `error TS2310: Type 'RecursiveArray' recursively references itself as a base type.` in the d.ts file. - * export declare const _RecursiveArrayWorkaround: FixRecursiveArraySchema; + * export declare type _RecursiveArrayWorkaround = FixRecursiveArraySchema; * export class RecursiveArray extends schema.arrayRecursive("RA", [() => RecursiveArray]) {} * { * type _check = ValidateRecursiveSchema; diff --git a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md index b1d4d67add55..fe3337ef049d 100644 --- a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md +++ b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md @@ -942,7 +942,7 @@ TSchema ] extends [ImplicitFieldSchema] ? TSchema : ImplicitFieldSchema; // @alpha -export const _RecursiveArrayWorkaroundJsonArray: FixRecursiveArraySchema; +export type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema; // @public export type ReplaceIEventThisPlaceHolder = L extends any[] ? { From 3c78e63d36a57e8f5d6bc5d9036972d9dc5d6b65 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Thu, 20 Feb 2025 14:33:25 -0800 Subject: [PATCH 08/10] fix test --- packages/dds/tree/src/test/jsonDomainSchema.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/dds/tree/src/test/jsonDomainSchema.spec.ts b/packages/dds/tree/src/test/jsonDomainSchema.spec.ts index 556845b5e503..33dc51f0b701 100644 --- a/packages/dds/tree/src/test/jsonDomainSchema.spec.ts +++ b/packages/dds/tree/src/test/jsonDomainSchema.spec.ts @@ -28,11 +28,11 @@ describe("JsonDomainSchema", () => { const usingConstructor = new JsonArray(["a", 0, new JsonArray([1])]); // Using `importConcise` can work better for JSON data: const imported = TreeAlpha.importConcise(JsonArray, ["a", 0, [1]]); + assert(Tree.is(imported, JsonArray)); // Node API is like an Array: - const outer: JsonUnion = imported[0]; - assert(Tree.is(outer, JsonArray)); - const inner = outer[0]; - assert.equal(inner, 1); + const inner: JsonUnion = imported[2]; + assert(Tree.is(inner, JsonArray)); + assert.deepEqual([...inner], [1]); } }); }); From 6ae8b594edecfafb8cb608ecd951666d2bcf5d56 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Mon, 24 Feb 2025 09:54:26 -0800 Subject: [PATCH 09/10] Update packages/dds/tree/src/jsonDomainSchema.ts Co-authored-by: Noah Encke <78610362+noencke@users.noreply.github.com> --- packages/dds/tree/src/jsonDomainSchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dds/tree/src/jsonDomainSchema.ts b/packages/dds/tree/src/jsonDomainSchema.ts index d669cacf76ce..aac98f7fa31b 100644 --- a/packages/dds/tree/src/jsonDomainSchema.ts +++ b/packages/dds/tree/src/jsonDomainSchema.ts @@ -93,7 +93,7 @@ export const _APIExtractorWorkaroundJsonArrayBase = sf.arrayRecursive("array", J * This can be worked around by using {@link TreeAlpha.importConcise}. * @example * ```typescript - * // Due to TypeScript restrictions on recursive types, the constructor and be somewhat limiting. + * // Due to TypeScript restrictions on recursive types, the constructor can be somewhat limiting. * const usingConstructor = new JsonArray(["a", 0, new JsonArray([1])]); * // Using `importConcise` can work better for JSON data: * const imported = TreeAlpha.importConcise(JsonArray, ["a", 0, [1]]); From 0fafe763a719d139c610daa1b1e80f3fd3b977d0 Mon Sep 17 00:00:00 2001 From: "Craig Macomber (Microsoft)" <42876482+CraigMacomber@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:13:22 -0800 Subject: [PATCH 10/10] Move to internal --- .../import-testing/src/test/importer.spec.ts | 3 +- .../dds/tree/api-report/tree.alpha.api.md | 41 ------------------- packages/dds/tree/src/jsonDomainSchema.ts | 18 ++++---- .../api-report/fluid-framework.alpha.api.md | 41 ------------------- 4 files changed, 11 insertions(+), 92 deletions(-) diff --git a/examples/utils/import-testing/src/test/importer.spec.ts b/examples/utils/import-testing/src/test/importer.spec.ts index fafcebb81101..d36503433fd7 100644 --- a/examples/utils/import-testing/src/test/importer.spec.ts +++ b/examples/utils/import-testing/src/test/importer.spec.ts @@ -5,7 +5,8 @@ import { strict as assert } from "node:assert"; -import { JsonArray } from "@fluidframework/tree/alpha"; +// eslint-disable-next-line import/no-internal-modules +import { JsonArray } from "@fluidframework/tree/internal"; import { RecursiveMap } from "../testExports.js"; diff --git a/packages/dds/tree/api-report/tree.alpha.api.md b/packages/dds/tree/api-report/tree.alpha.api.md index 6dead70714ea..7057757dda9d 100644 --- a/packages/dds/tree/api-report/tree.alpha.api.md +++ b/packages/dds/tree/api-report/tree.alpha.api.md @@ -21,24 +21,6 @@ export type AllowedTypes = readonly LazyItem[]; // @public type AllowedTypesUnsafe = readonly LazyItem[]; -// @alpha -export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { -[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { -create(data: boolean): boolean; -}> | null, any, undefined>; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; - -// @alpha -export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { -[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { -create(data: boolean): boolean; -}> | null], any, undefined>; -} | { -readonly [x: string]: string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { -create(data: boolean): boolean; -}> | null; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; - // @public type ApplyKind = { [FieldKind.Required]: T; @@ -379,10 +361,6 @@ export interface ITreeViewConfiguration { readonly items: JsonFieldSchema; @@ -428,10 +406,6 @@ export interface JsonNodeSchemaBase { readonly additionalProperties?: boolean; @@ -439,12 +413,6 @@ export interface JsonObjectNodeSchema extends JsonNodeSchemaBase, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; - -// @alpha (undocumented) -export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; - // @alpha export type JsonRefPath = `#/$defs/${JsonSchemaId}`; @@ -464,12 +432,6 @@ export type JsonTreeSchema = JsonFieldSchema & { readonly $defs: Record; }; -// @alpha -export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; - -// @alpha (undocumented) -export type JsonUnion = TreeNodeFromImplicitAllowedTypes; - // @alpha export interface JsonValidator { compile(schema: Schema): SchemaValidationFunction; @@ -588,9 +550,6 @@ export type ReadSchema; - // @public @deprecated export type RestrictiveReadonlyRecord = { readonly [P in symbol | string]: P extends K ? T : never; diff --git a/packages/dds/tree/src/jsonDomainSchema.ts b/packages/dds/tree/src/jsonDomainSchema.ts index aac98f7fa31b..23959a05bebc 100644 --- a/packages/dds/tree/src/jsonDomainSchema.ts +++ b/packages/dds/tree/src/jsonDomainSchema.ts @@ -15,7 +15,7 @@ const sf = new SchemaFactory("com.fluidframework.json"); /** * {@link AllowedTypes} for primitives types allowed in JSON. - * @alpha + * @internal */ export const JsonPrimitive = [ sf.null, @@ -25,7 +25,7 @@ export const JsonPrimitive = [ ] as const satisfies AllowedTypes; /** - * @alpha + * @internal */ export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; @@ -35,18 +35,18 @@ export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes JsonObject, () => JsonArray, ...JsonPrimitive] as const; /** - * @alpha + * @internal */ export type JsonUnion = TreeNodeFromImplicitAllowedTypes; /** * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}. - * @system @alpha + * @system @internal */ export const _APIExtractorWorkaroundJsonObjectBase = sf.mapRecursive("object", JsonUnion); @@ -63,7 +63,7 @@ export const _APIExtractorWorkaroundJsonObjectBase = sf.mapRecursive("object", J * // Node API is like a Map: * const value = imported.get("a"); * ``` - * @alpha @sealed + * @sealed @internal */ export class JsonObject extends _APIExtractorWorkaroundJsonObjectBase {} { @@ -75,7 +75,7 @@ export class JsonObject extends _APIExtractorWorkaroundJsonObjectBase {} * @privateRemarks * In the past this this had to reference the base type (_APIExtractorWorkaroundJsonArrayBase). * Testing for this in examples/utils/import-testing now shows it has to reference JsonArray instead. - * @system @alpha + * @system @internal */ export declare type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema< typeof JsonArray @@ -83,7 +83,7 @@ export declare type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema /** * Do not use. Exists only as a workaround for {@link https://github.com/microsoft/TypeScript/issues/59550} and {@link https://github.com/microsoft/rushstack/issues/4429}. - * @system @alpha + * @system @internal */ export const _APIExtractorWorkaroundJsonArrayBase = sf.arrayRecursive("array", JsonUnion); @@ -102,7 +102,7 @@ export const _APIExtractorWorkaroundJsonArrayBase = sf.arrayRecursive("array", J * assert(Tree.is(outer, JsonArray)); * const inner = outer[0]; * ``` - * @alpha @sealed + * @sealed @internal */ export class JsonArray extends _APIExtractorWorkaroundJsonArrayBase {} { diff --git a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md index fe3337ef049d..20d7a9223a22 100644 --- a/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md +++ b/packages/framework/fluid-framework/api-report/fluid-framework.alpha.api.md @@ -21,24 +21,6 @@ export type AllowedTypes = readonly LazyItem[]; // @public type AllowedTypesUnsafe = readonly LazyItem[]; -// @alpha -export const _APIExtractorWorkaroundJsonArrayBase: TreeNodeSchemaClass_2<"com.fluidframework.json.array", NodeKind_2.Array, TreeArrayNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.array", NodeKind_2.Array, unknown>, { -[Symbol.iterator](): Iterator, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { -create(data: boolean): boolean; -}> | null, any, undefined>; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; - -// @alpha -export const _APIExtractorWorkaroundJsonObjectBase: TreeNodeSchemaClass_2<"com.fluidframework.json.object", NodeKind_2.Map, TreeMapNodeUnsafe_2 typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]> & WithType_2<"com.fluidframework.json.object", NodeKind_2.Map, unknown>, { -[Symbol.iterator](): Iterator<[string, string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { -create(data: boolean): boolean; -}> | null], any, undefined>; -} | { -readonly [x: string]: string | number | JsonObject | JsonArray | InsertableTypedNodeUnsafe_2, TreeNodeSchemaCore_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, true, unknown, boolean, unknown> & { -create(data: boolean): boolean; -}> | null; -}, false, readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>], undefined>; - // @public type ApplyKind = { [FieldKind.Required]: T; @@ -719,10 +701,6 @@ export interface ITreeViewConfiguration { readonly items: JsonFieldSchema; @@ -768,10 +746,6 @@ export interface JsonNodeSchemaBase { readonly additionalProperties?: boolean; @@ -779,12 +753,6 @@ export interface JsonObjectNodeSchema extends JsonNodeSchemaBase, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; - -// @alpha (undocumented) -export type JsonPrimitive = TreeNodeFromImplicitAllowedTypes; - // @alpha export type JsonRefPath = `#/$defs/${JsonSchemaId}`; @@ -804,12 +772,6 @@ export type JsonTreeSchema = JsonFieldSchema & { readonly $defs: Record; }; -// @alpha -export const JsonUnion: readonly [() => typeof JsonObject, () => typeof JsonArray, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.null", NodeKind_2.Leaf, null, null, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.boolean", NodeKind_2.Leaf, boolean, boolean, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.number", NodeKind_2.Leaf, number, number, true, unknown, never, unknown>, TreeNodeSchemaNonClass_2<"com.fluidframework.leaf.string", NodeKind_2.Leaf, string, string, true, unknown, never, unknown>]; - -// @alpha (undocumented) -export type JsonUnion = TreeNodeFromImplicitAllowedTypes; - // @alpha export interface JsonValidator { compile(schema: Schema): SchemaValidationFunction; @@ -941,9 +903,6 @@ export type ReadSchema; - // @public export type ReplaceIEventThisPlaceHolder = L extends any[] ? { [K in keyof L]: L[K] extends IEventThisPlaceHolder ? TThis : L[K];