fluid-framework 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,18 +4,52 @@
4
4
 
5
5
  ```ts
6
6
 
7
+ import { Client } from '@fluidframework/merge-tree/internal';
8
+ import { Deferred } from '@fluidframework/core-utils/internal';
9
+ import { FieldSchemaUnsafe as FieldSchemaUnsafe_2 } from './typesUnsafe.js';
7
10
  import { FluidObject } from '@fluidframework/core-interfaces';
8
11
  import { IChannel } from '@fluidframework/datastore-definitions';
12
+ import { IChannelAttributes } from '@fluidframework/datastore-definitions';
9
13
  import { IChannelFactory } from '@fluidframework/datastore-definitions';
14
+ import { IChannelServices } from '@fluidframework/datastore-definitions';
15
+ import { IChannelStorageService } from '@fluidframework/datastore-definitions';
16
+ import { IDisposable as IDisposable_2 } from '@fluidframework/core-interfaces';
10
17
  import type { IErrorBase } from '@fluidframework/core-interfaces';
11
18
  import { IEvent } from '@fluidframework/core-interfaces';
12
19
  import { IEventProvider } from '@fluidframework/core-interfaces';
13
20
  import { IEventThisPlaceHolder } from '@fluidframework/core-interfaces';
14
- import type { IFluidDataStoreRuntime } from '@fluidframework/datastore-definitions';
21
+ import { IFluidDataStoreRuntime } from '@fluidframework/datastore-definitions';
15
22
  import { IFluidHandle } from '@fluidframework/core-interfaces';
16
23
  import { IFluidLoadable } from '@fluidframework/core-interfaces';
24
+ import { IFluidSerializer } from '@fluidframework/shared-object-base';
25
+ import { IJSONSegment } from '@fluidframework/merge-tree/internal';
26
+ import { IMergeTreeDeltaCallbackArgs } from '@fluidframework/merge-tree/internal';
27
+ import { IMergeTreeDeltaOpArgs } from '@fluidframework/merge-tree/internal';
28
+ import { IMergeTreeGroupMsg } from '@fluidframework/merge-tree/internal';
29
+ import { IMergeTreeMaintenanceCallbackArgs } from '@fluidframework/merge-tree/internal';
30
+ import { IRelativePosition } from '@fluidframework/merge-tree/internal';
31
+ import { ISegment } from '@fluidframework/merge-tree/internal';
32
+ import { ISegmentAction } from '@fluidframework/merge-tree/internal';
33
+ import { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';
17
34
  import { ISharedObject } from '@fluidframework/shared-object-base';
18
35
  import { ISharedObjectEvents } from '@fluidframework/shared-object-base';
36
+ import { ISharedObjectKind } from '@fluidframework/shared-object-base';
37
+ import { ISummaryTreeWithStats } from '@fluidframework/runtime-definitions';
38
+ import { ITelemetryContext } from '@fluidframework/runtime-definitions';
39
+ import { LocalReferencePosition } from '@fluidframework/merge-tree/internal';
40
+ import { Marker } from '@fluidframework/merge-tree/internal';
41
+ import { MergeTreeDeltaOperationType } from '@fluidframework/merge-tree/internal';
42
+ import { MergeTreeDeltaOperationTypes } from '@fluidframework/merge-tree/internal';
43
+ import { MergeTreeMaintenanceType } from '@fluidframework/merge-tree/internal';
44
+ import { MergeTreeRevertibleDriver } from '@fluidframework/merge-tree/internal';
45
+ import { PropertiesManager } from '@fluidframework/merge-tree/internal';
46
+ import { PropertySet } from '@fluidframework/merge-tree/internal';
47
+ import { ReferencePosition } from '@fluidframework/merge-tree/internal';
48
+ import { ReferenceType } from '@fluidframework/merge-tree/internal';
49
+ import { SharedObject } from '@fluidframework/shared-object-base/internal';
50
+ import { SlidingPreference } from '@fluidframework/merge-tree/internal';
51
+ import { TextSegment } from '@fluidframework/merge-tree/internal';
52
+ import { TypedEventEmitter } from '@fluid-internal/client-utils';
19
53
 
20
54
  // @public
21
55
  export type AllowedTypes = readonly LazyItem<TreeNodeSchema>[];
@@ -23,9 +57,6 @@ export type AllowedTypes = readonly LazyItem<TreeNodeSchema>[];
23
57
  // @public
24
58
  export type ApplyKind<T, Kind extends FieldKind> = Kind extends FieldKind.Required ? T : undefined | T;
25
59
 
26
- // @public
27
- export type ArrayToUnion<T extends readonly unknown[]> = T[number];
28
-
29
60
  // @public
30
61
  export enum AttachState {
31
62
  Attached = "Attached",
@@ -33,6 +64,19 @@ export enum AttachState {
33
64
  Detached = "Detached"
34
65
  }
35
66
 
67
+ // @public
68
+ export enum CommitKind {
69
+ Default = 0,
70
+ Redo = 2,
71
+ Undo = 1
72
+ }
73
+
74
+ // @public
75
+ export interface CommitMetadata {
76
+ readonly isLocal: boolean;
77
+ readonly kind: CommitKind;
78
+ }
79
+
36
80
  // @public
37
81
  export enum ConnectionState {
38
82
  CatchingUp = 1,
@@ -75,11 +119,24 @@ export interface ContainerSchema {
75
119
  }
76
120
 
77
121
  // @public
78
- export type DataObjectClass<T extends IFluidLoadable> = {
122
+ export type DataObjectClass<T extends IFluidLoadable = IFluidLoadable> = {
79
123
  readonly factory: {
80
- IFluidDataStoreFactory: DataObjectClass<T>["factory"];
124
+ readonly IFluidDataStoreFactory: DataObjectClass<T>["factory"];
81
125
  };
82
- } & LoadableObjectCtor<T>;
126
+ } & (new (...args: any[]) => T);
127
+
128
+ // @alpha (undocumented)
129
+ export type DeserializeCallback = (properties: PropertySet) => void;
130
+
131
+ // @alpha @sealed
132
+ export class DirectoryFactory implements IChannelFactory<ISharedDirectory> {
133
+ static readonly Attributes: IChannelAttributes;
134
+ get attributes(): IChannelAttributes;
135
+ create(runtime: IFluidDataStoreRuntime, id: string): ISharedDirectory;
136
+ load(runtime: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<ISharedDirectory>;
137
+ static readonly Type = "https://graph.microsoft.com/types/directory";
138
+ get type(): string;
139
+ }
83
140
 
84
141
  // @public
85
142
  export const disposeSymbol: unique symbol;
@@ -119,35 +176,79 @@ export type ExtractItemType<Item extends LazyItem> = Item extends () => infer Re
119
176
 
120
177
  // @public
121
178
  export enum FieldKind {
179
+ Identifier = 2,
122
180
  Optional = 0,
123
181
  Required = 1
124
182
  }
125
183
 
184
+ // @public
185
+ export interface FieldProps {
186
+ readonly key?: string;
187
+ }
188
+
126
189
  // @public @sealed
127
190
  export class FieldSchema<out Kind extends FieldKind = FieldKind, out Types extends ImplicitAllowedTypes = ImplicitAllowedTypes> {
128
- constructor(kind: Kind, allowedTypes: Types);
129
- // (undocumented)
191
+ constructor(
192
+ kind: Kind,
193
+ allowedTypes: Types,
194
+ props?: FieldProps | undefined);
130
195
  readonly allowedTypes: Types;
131
- // (undocumented)
196
+ get allowedTypeSet(): ReadonlySet<TreeNodeSchema>;
132
197
  readonly kind: Kind;
198
+ readonly props?: FieldProps | undefined;
133
199
  protected _typeCheck?: MakeNominal;
134
200
  }
135
201
 
202
+ // @public
203
+ export interface FieldSchemaUnsafe<out Kind extends FieldKind, out Types extends Unenforced<ImplicitAllowedTypes>> extends FieldSchema<Kind, any> {
204
+ readonly allowedTypes: Types;
205
+ readonly allowedTypeSet: ReadonlySet<TreeNodeSchema>;
206
+ readonly kind: Kind;
207
+ }
208
+
136
209
  // @public
137
210
  export type FlexList<Item = unknown> = readonly LazyItem<Item>[];
138
211
 
139
212
  // @public
140
- export type FlexListToUnion<TList extends FlexList> = ExtractItemType<ArrayToUnion<TList>>;
213
+ export type FlexListToUnion<TList extends FlexList> = ExtractItemType<TList[number]>;
141
214
 
142
215
  // @public
143
216
  export interface IConnection {
144
- id: string;
145
- mode: "write" | "read";
217
+ readonly id: string;
218
+ readonly mode: "write" | "read";
146
219
  }
147
220
 
148
221
  // @public
149
222
  export type ICriticalContainerError = IErrorBase;
150
223
 
224
+ // @alpha
225
+ export interface IDirectory extends Map<string, any>, IEventProvider<IDirectoryEvents>, Partial<IDisposable_2> {
226
+ readonly absolutePath: string;
227
+ countSubDirectory?(): number;
228
+ createSubDirectory(subdirName: string): IDirectory;
229
+ deleteSubDirectory(subdirName: string): boolean;
230
+ get<T = any>(key: string): T | undefined;
231
+ getSubDirectory(subdirName: string): IDirectory | undefined;
232
+ getWorkingDirectory(relativePath: string): IDirectory | undefined;
233
+ hasSubDirectory(subdirName: string): boolean;
234
+ set<T = unknown>(key: string, value: T): this;
235
+ subdirectories(): IterableIterator<[string, IDirectory]>;
236
+ }
237
+
238
+ // @alpha
239
+ export interface IDirectoryEvents extends IEvent {
240
+ (event: "containedValueChanged", listener: (changed: IValueChanged, local: boolean, target: IEventThisPlaceHolder) => void): any;
241
+ (event: "subDirectoryCreated", listener: (path: string, local: boolean, target: IEventThisPlaceHolder) => void): any;
242
+ (event: "subDirectoryDeleted", listener: (path: string, local: boolean, target: IEventThisPlaceHolder) => void): any;
243
+ (event: "disposed", listener: (target: IEventThisPlaceHolder) => void): any;
244
+ (event: "undisposed", listener: (target: IEventThisPlaceHolder) => void): any;
245
+ }
246
+
247
+ // @alpha
248
+ export interface IDirectoryValueChanged extends IValueChanged {
249
+ path: string;
250
+ }
251
+
151
252
  // @public
152
253
  export interface IDisposable {
153
254
  [disposeSymbol](): void;
@@ -176,10 +277,72 @@ export interface IFluidContainerEvents extends IEvent {
176
277
  (event: "disposed", listener: (error?: ICriticalContainerError) => void): any;
177
278
  }
178
279
 
280
+ // @alpha
281
+ export interface IInterval {
282
+ // (undocumented)
283
+ clone(): IInterval;
284
+ compare(b: IInterval): number;
285
+ compareEnd(b: IInterval): number;
286
+ compareStart(b: IInterval): number;
287
+ modify(label: string, start: SequencePlace | undefined, end: SequencePlace | undefined, op?: ISequencedDocumentMessage, localSeq?: number, useNewSlidingBehavior?: boolean): IInterval | undefined;
288
+ // (undocumented)
289
+ overlaps(b: IInterval): boolean;
290
+ union(b: IInterval): IInterval;
291
+ }
292
+
293
+ // @alpha
294
+ export interface IIntervalCollection<TInterval extends ISerializableInterval> extends TypedEventEmitter<IIntervalCollectionEvent<TInterval>> {
295
+ // (undocumented)
296
+ [Symbol.iterator](): Iterator<TInterval>;
297
+ add({ start, end, props, }: {
298
+ start: SequencePlace;
299
+ end: SequencePlace;
300
+ props?: PropertySet;
301
+ }): TInterval;
302
+ // (undocumented)
303
+ attachDeserializer(onDeserialize: DeserializeCallback): void;
304
+ // (undocumented)
305
+ readonly attached: boolean;
306
+ attachIndex(index: IntervalIndex<TInterval>): void;
307
+ change(id: string, { start, end, props }: {
308
+ start?: SequencePlace;
309
+ end?: SequencePlace;
310
+ props?: PropertySet;
311
+ }): TInterval | undefined;
312
+ // (undocumented)
313
+ CreateBackwardIteratorWithEndPosition(endPosition: number): Iterator<TInterval>;
314
+ // (undocumented)
315
+ CreateBackwardIteratorWithStartPosition(startPosition: number): Iterator<TInterval>;
316
+ // (undocumented)
317
+ CreateForwardIteratorWithEndPosition(endPosition: number): Iterator<TInterval>;
318
+ // (undocumented)
319
+ CreateForwardIteratorWithStartPosition(startPosition: number): Iterator<TInterval>;
320
+ detachIndex(index: IntervalIndex<TInterval>): boolean;
321
+ // @deprecated (undocumented)
322
+ findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[];
323
+ gatherIterationResults(results: TInterval[], iteratesForward: boolean, start?: number, end?: number): void;
324
+ // (undocumented)
325
+ getIntervalById(id: string): TInterval | undefined;
326
+ map(fn: (interval: TInterval) => void): void;
327
+ // @deprecated (undocumented)
328
+ nextInterval(pos: number): TInterval | undefined;
329
+ // @deprecated (undocumented)
330
+ previousInterval(pos: number): TInterval | undefined;
331
+ removeIntervalById(id: string): TInterval | undefined;
332
+ }
333
+
334
+ // @alpha
335
+ export interface IIntervalCollectionEvent<TInterval extends ISerializableInterval> extends IEvent {
336
+ (event: "changeInterval", listener: (interval: TInterval, previousInterval: TInterval, local: boolean, op: ISequencedDocumentMessage | undefined, slide: boolean) => void): void;
337
+ (event: "addInterval" | "deleteInterval", listener: (interval: TInterval, local: boolean, op: ISequencedDocumentMessage | undefined) => void): void;
338
+ (event: "propertyChanged", listener: (interval: TInterval, propertyDeltas: PropertySet, local: boolean, op: ISequencedDocumentMessage | undefined) => void): void;
339
+ (event: "changed", listener: (interval: TInterval, propertyDeltas: PropertySet, previousInterval: TInterval | undefined, local: boolean, slide: boolean) => void): void;
340
+ }
341
+
179
342
  // @public
180
343
  export interface IMember {
181
- connections: IConnection[];
182
- userId: string;
344
+ readonly connections: IConnection[];
345
+ readonly userId: string;
183
346
  }
184
347
 
185
348
  // @public
@@ -198,20 +361,104 @@ export type InsertableObjectFromSchemaRecord<T extends RestrictiveReadonlyRecord
198
361
  readonly [Property in keyof T]: InsertableTreeFieldFromImplicitField<T[Property]>;
199
362
  };
200
363
 
364
+ // @public
365
+ export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>> = {
366
+ readonly [Property in keyof T]: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
367
+ };
368
+
201
369
  // @public
202
370
  export type InsertableTreeFieldFromImplicitField<TSchema extends ImplicitFieldSchema = FieldSchema> = TSchema extends FieldSchema<infer Kind, infer Types> ? ApplyKind<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind> : TSchema extends ImplicitAllowedTypes ? InsertableTreeNodeFromImplicitAllowedTypes<TSchema> : unknown;
203
371
 
372
+ // @public
373
+ export type InsertableTreeFieldFromImplicitFieldUnsafe<TSchema extends Unenforced<ImplicitFieldSchema>> = TSchema extends FieldSchemaUnsafe<infer Kind, infer Types> ? ApplyKind<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind> : InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>;
374
+
204
375
  // @public
205
376
  export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? InsertableTypedNode<TSchema> : TSchema extends AllowedTypes ? InsertableTypedNode<FlexListToUnion<TSchema>> : never;
206
377
 
378
+ // @public
379
+ export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends AllowedTypes ? InsertableTypedNodeUnsafe<FlexListToUnion<TSchema>> : InsertableTypedNodeUnsafe<TSchema>;
380
+
207
381
  // @public
208
382
  export type InsertableTypedNode<T extends TreeNodeSchema> = (T extends {
209
383
  implicitlyConstructable: true;
210
384
  } ? NodeBuilderData<T> : never) | Unhydrated<NodeFromSchema<T>>;
211
385
 
386
+ // @public
387
+ export type InsertableTypedNodeUnsafe<T extends Unenforced<TreeNodeSchema>> = Unhydrated<NodeFromSchemaUnsafe<T>> | (T extends {
388
+ implicitlyConstructable: true;
389
+ } ? NodeBuilderDataUnsafe<T> : never);
390
+
391
+ // @alpha
392
+ export interface InteriorSequencePlace {
393
+ // (undocumented)
394
+ pos: number;
395
+ // (undocumented)
396
+ side: Side;
397
+ }
398
+
399
+ // @alpha
400
+ export interface IntervalIndex<TInterval extends ISerializableInterval> {
401
+ add(interval: TInterval): void;
402
+ remove(interval: TInterval): void;
403
+ }
404
+
405
+ // @alpha
406
+ export const IntervalStickiness: {
407
+ readonly NONE: 0;
408
+ readonly START: 1;
409
+ readonly END: 2;
410
+ readonly FULL: 3;
411
+ };
412
+
413
+ // @alpha
414
+ export type IntervalStickiness = (typeof IntervalStickiness)[keyof typeof IntervalStickiness];
415
+
416
+ // @alpha (undocumented)
417
+ export enum IntervalType {
418
+ // (undocumented)
419
+ Simple = 0,
420
+ SlideOnRemove = 2,
421
+ // @internal
422
+ Transient = 4
423
+ }
424
+
425
+ // @alpha
426
+ export interface ISequenceDeltaRange<TOperation extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationTypes> {
427
+ operation: TOperation;
428
+ position: number;
429
+ propertyDeltas: PropertySet;
430
+ segment: ISegment;
431
+ }
432
+
433
+ // @alpha (undocumented)
434
+ export interface ISerializableInterval extends IInterval {
435
+ // (undocumented)
436
+ addProperties(props: PropertySet, collaborating?: boolean, seq?: number): PropertySet | undefined;
437
+ getIntervalId(): string | undefined;
438
+ properties: PropertySet;
439
+ // (undocumented)
440
+ propertyManager: PropertiesManager;
441
+ // (undocumented)
442
+ serialize(): ISerializedInterval;
443
+ }
444
+
445
+ // @alpha
446
+ export interface ISerializedInterval {
447
+ end: number | "start" | "end";
448
+ // (undocumented)
449
+ endSide?: Side;
450
+ intervalType: IntervalType;
451
+ properties?: PropertySet;
452
+ sequenceNumber: number;
453
+ start: number | "start" | "end";
454
+ // (undocumented)
455
+ startSide?: Side;
456
+ stickiness?: IntervalStickiness;
457
+ }
458
+
212
459
  // @public
213
460
  export interface IServiceAudience<M extends IMember> extends IEventProvider<IServiceAudienceEvents<M>> {
214
- getMembers(): Map<string, M>;
461
+ getMembers(): ReadonlyMap<string, M>;
215
462
  getMyself(): Myself<M> | undefined;
216
463
  }
217
464
 
@@ -228,18 +475,57 @@ export interface IServiceAudienceEvents<M extends IMember> extends IEvent {
228
475
  // @public
229
476
  export type IsEvent<Event> = Event extends (...args: any[]) => any ? true : false;
230
477
 
231
- // @public @sealed
478
+ // @alpha
479
+ export interface ISharedDirectory extends ISharedObject<ISharedDirectoryEvents & IDirectoryEvents>, Omit<IDirectory, "on" | "once" | "off"> {
480
+ // (undocumented)
481
+ [Symbol.iterator](): IterableIterator<[string, any]>;
482
+ // (undocumented)
483
+ readonly [Symbol.toStringTag]: string;
484
+ }
485
+
486
+ // @alpha
487
+ export interface ISharedDirectoryEvents extends ISharedObjectEvents {
488
+ (event: "valueChanged", listener: (changed: IDirectoryValueChanged, local: boolean, target: IEventThisPlaceHolder) => void): any;
489
+ (event: "clear", listener: (local: boolean, target: IEventThisPlaceHolder) => void): any;
490
+ (event: "subDirectoryCreated", listener: (path: string, local: boolean, target: IEventThisPlaceHolder) => void): any;
491
+ (event: "subDirectoryDeleted", listener: (path: string, local: boolean, target: IEventThisPlaceHolder) => void): any;
492
+ }
493
+
494
+ // @alpha (undocumented)
495
+ export interface ISharedIntervalCollection<TInterval extends ISerializableInterval> {
496
+ // (undocumented)
497
+ getIntervalCollection(label: string): IIntervalCollection<TInterval>;
498
+ }
499
+
500
+ // @alpha @sealed
232
501
  export interface ISharedMap extends ISharedObject<ISharedMapEvents>, Map<string, any> {
233
502
  get<T = any>(key: string): T | undefined;
234
503
  set<T = unknown>(key: string, value: T): this;
235
504
  }
236
505
 
237
- // @public @sealed
506
+ // @alpha @sealed
238
507
  export interface ISharedMapEvents extends ISharedObjectEvents {
239
508
  (event: "valueChanged", listener: (changed: IValueChanged, local: boolean, target: IEventThisPlaceHolder) => void): any;
240
509
  (event: "clear", listener: (local: boolean, target: IEventThisPlaceHolder) => void): any;
241
510
  }
242
511
 
512
+ // @alpha
513
+ export interface ISharedSegmentSequenceEvents extends ISharedObjectEvents {
514
+ // (undocumented)
515
+ (event: "createIntervalCollection", listener: (label: string, local: boolean, target: IEventThisPlaceHolder) => void): void;
516
+ // (undocumented)
517
+ (event: "sequenceDelta", listener: (event: SequenceDeltaEvent, target: IEventThisPlaceHolder) => void): void;
518
+ // (undocumented)
519
+ (event: "maintenance", listener: (event: SequenceMaintenanceEvent, target: IEventThisPlaceHolder) => void): void;
520
+ }
521
+
522
+ // @alpha
523
+ export interface ISharedString extends SharedSegmentSequence<SharedStringSegment> {
524
+ insertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void;
525
+ insertText(pos: number, text: string, props?: PropertySet): void;
526
+ posFromRelativePos(relativePos: IRelativePosition): number;
527
+ }
528
+
243
529
  // @public
244
530
  export interface ISubscribable<E extends Events<E>> {
245
531
  on<K extends keyof Events<E>>(eventName: K, listener: E[K]): () => void;
@@ -252,45 +538,66 @@ export class IterableTreeArrayContent<T> implements Iterable<T> {
252
538
 
253
539
  // @public
254
540
  export interface ITree extends IChannel {
255
- schematize<TRoot extends ImplicitFieldSchema>(config: TreeConfiguration<TRoot>): TreeView<TreeFieldFromImplicitField<TRoot>>;
541
+ schematize<TRoot extends ImplicitFieldSchema>(config: TreeConfiguration<TRoot>): TreeView<TRoot>;
256
542
  }
257
543
 
258
- // @public @sealed
544
+ // @alpha @sealed
259
545
  export interface IValueChanged {
260
- key: string;
261
- previousValue: any;
546
+ readonly key: string;
547
+ readonly previousValue: any;
262
548
  }
263
549
 
264
550
  // @public
265
551
  export type LazyItem<Item = unknown> = Item | (() => Item);
266
552
 
267
553
  // @public
268
- export type LoadableObjectClass<T extends IFluidLoadable = IFluidLoadable> = SharedObjectClass<T> | DataObjectClass<T>;
554
+ export type LoadableObjectClass<T extends IFluidLoadable = IFluidLoadable> = ISharedObjectKind<T> | DataObjectClass<T>;
269
555
 
270
556
  // @public
271
557
  export type LoadableObjectClassRecord = Record<string, LoadableObjectClass>;
272
558
 
273
- // @public
274
- export type LoadableObjectCtor<T extends IFluidLoadable> = new (...args: any[]) => T;
275
-
276
559
  // @public
277
560
  export interface MakeNominal {
278
561
  }
279
562
 
563
+ // @alpha @sealed
564
+ export class MapFactory implements IChannelFactory<ISharedMap> {
565
+ static readonly Attributes: IChannelAttributes;
566
+ get attributes(): IChannelAttributes;
567
+ create(runtime: IFluidDataStoreRuntime, id: string): ISharedMap;
568
+ load(runtime: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<ISharedMap>;
569
+ static readonly Type = "https://graph.microsoft.com/types/map";
570
+ get type(): string;
571
+ }
572
+
280
573
  // @public
281
574
  export type MemberChangedListener<M extends IMember> = (clientId: string, member: M) => void;
282
575
 
283
576
  // @public
284
577
  export type Myself<M extends IMember = IMember> = M & {
285
- currentConnection: string;
578
+ readonly currentConnection: string;
286
579
  };
287
580
 
288
581
  // @public
289
582
  export type NodeBuilderData<T extends TreeNodeSchema> = T extends TreeNodeSchema<string, NodeKind, unknown, infer TBuild> ? TBuild : never;
290
583
 
584
+ // @public
585
+ export type NodeBuilderDataUnsafe<T extends Unenforced<TreeNodeSchema>> = T extends TreeNodeSchema<string, NodeKind, unknown, infer TBuild> ? TBuild : never;
586
+
291
587
  // @public
292
588
  export type NodeFromSchema<T extends TreeNodeSchema> = T extends TreeNodeSchema<string, NodeKind, infer TNode> ? TNode : never;
293
589
 
590
+ // @public
591
+ export type NodeFromSchemaUnsafe<T extends Unenforced<TreeNodeSchema>> = T extends TreeNodeSchema<string, NodeKind, infer TNode> ? TNode : never;
592
+
593
+ // @public
594
+ export interface NodeInDocumentConstraint {
595
+ // (undocumented)
596
+ node: TreeNode;
597
+ // (undocumented)
598
+ type: "nodeInDocument";
599
+ }
600
+
294
601
  // @public
295
602
  export enum NodeKind {
296
603
  Array = 1,
@@ -304,28 +611,59 @@ export type ObjectFromSchemaRecord<T extends RestrictiveReadonlyRecord<string, I
304
611
  -readonly [Property in keyof T]: TreeFieldFromImplicitField<T[Property]>;
305
612
  };
306
613
 
614
+ // @public
615
+ export type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>> = {
616
+ -readonly [Property in keyof T]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
617
+ };
618
+
307
619
  // @public
308
620
  export type RestrictiveReadonlyRecord<K extends symbol | string, T> = {
309
621
  readonly [P in symbol | string]: P extends K ? T : never;
310
622
  };
311
623
 
624
+ // @public
625
+ export interface Revertible {
626
+ [disposeSymbol](): void;
627
+ revert(): void;
628
+ revert(dispose: boolean): void;
629
+ readonly status: RevertibleStatus;
630
+ }
631
+
632
+ // @public
633
+ export type RevertibleFactory = (onRevertibleDisposed?: (revertible: Revertible) => void) => Revertible;
634
+
635
+ // @public
636
+ export enum RevertibleStatus {
637
+ Disposed = 1,
638
+ Valid = 0
639
+ }
640
+
312
641
  // @public @sealed
313
642
  export class SchemaFactory<out TScope extends string | undefined = string | undefined, TName extends number | string = string> {
314
643
  constructor(scope: TScope);
315
644
  array<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchema<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, `Array<${string}>`>>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
316
645
  array<const Name extends TName, const T extends ImplicitAllowedTypes>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, Name>>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
646
+ arrayRecursive<const Name extends TName, const T extends Unenforced<ImplicitAllowedTypes>>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Array, TreeArrayNodeUnsafe<T> & WithType<ScopedSchemaName<TScope, Name>>, {
647
+ [Symbol.iterator](): Iterator<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>>;
648
+ }, false, T>;
317
649
  readonly boolean: TreeNodeSchema<"com.fluidframework.leaf.boolean", NodeKind.Leaf, boolean, boolean>;
318
- // @deprecated
319
- fixRecursiveReference<T extends AllowedTypes>(...types: T): void;
320
650
  readonly handle: TreeNodeSchema<"com.fluidframework.leaf.handle", NodeKind.Leaf, IFluidHandle<FluidObject & IFluidLoadable>, IFluidHandle<FluidObject & IFluidLoadable>>;
651
+ get identifier(): FieldSchema<FieldKind.Identifier>;
321
652
  map<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchema<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, `Map<${string}>`>>, Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T>]>, true, T>;
322
653
  map<Name extends TName, const T extends ImplicitAllowedTypes>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, Name>>, Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T>]>, true, T>;
323
- namedArray_internal<Name extends TName | string, const T extends ImplicitAllowedTypes, const ImplicitlyConstructable extends boolean>(name: Name, allowedTypes: T, customizable: boolean, implicitlyConstructable: ImplicitlyConstructable): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, string>>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, ImplicitlyConstructable, T>;
324
- namedMap_internal<Name extends TName | string, const T extends ImplicitAllowedTypes, const ImplicitlyConstructable extends boolean>(name: Name, allowedTypes: T, customizable: boolean, implicitlyConstructable: ImplicitlyConstructable): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, Name>>, Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T>]>, ImplicitlyConstructable, T>;
654
+ mapRecursive<Name extends TName, const T extends Unenforced<ImplicitAllowedTypes>>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Map, TreeMapNodeUnsafe<T> & WithType<ScopedSchemaName<TScope, Name>>, {
655
+ [Symbol.iterator](): Iterator<[
656
+ string,
657
+ InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>
658
+ ]>;
659
+ }, false, T>;
325
660
  readonly null: TreeNodeSchema<"com.fluidframework.leaf.null", NodeKind.Leaf, null, null>;
326
661
  readonly number: TreeNodeSchema<"com.fluidframework.leaf.number", NodeKind.Leaf, number, number>;
327
- object<const Name extends TName, const T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>(name: Name, t: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeNode & ObjectFromSchemaRecord<T> & WithType<ScopedSchemaName<TScope, Name>>, object & InsertableObjectFromSchemaRecord<T>, true, T>;
328
- optional<const T extends ImplicitAllowedTypes>(t: T): FieldSchema<FieldKind.Optional, T>;
662
+ object<const Name extends TName, const T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>(name: Name, fields: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNode<T, ScopedSchemaName<TScope, Name>>, object & InsertableObjectFromSchemaRecord<T>, true, T>;
663
+ objectRecursive<const Name extends TName, const T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>>(name: Name, t: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNodeUnsafe<T, ScopedSchemaName<TScope, Name>>, object & InsertableObjectFromSchemaRecordUnsafe<T>, false, T>;
664
+ optional<const T extends ImplicitAllowedTypes>(t: T, props?: FieldProps): FieldSchema<FieldKind.Optional, T>;
665
+ optionalRecursive<const T extends Unenforced<readonly (() => TreeNodeSchema)[]>>(t: T): FieldSchemaUnsafe_2<FieldKind.Optional, T>;
666
+ required<const T extends ImplicitAllowedTypes>(t: T, props?: FieldProps): FieldSchema<FieldKind.Required, T>;
329
667
  // (undocumented)
330
668
  readonly scope: TScope;
331
669
  readonly string: TreeNodeSchema<"com.fluidframework.leaf.string", NodeKind.Leaf, string, string>;
@@ -339,36 +677,217 @@ export interface SchemaIncompatible {
339
677
  // @public
340
678
  export type ScopedSchemaName<TScope extends string | undefined, TName extends number | string> = TScope extends undefined ? `${TName}` : `${TScope}.${TName}`;
341
679
 
342
- // @public @deprecated
343
- export const SharedMap: {
344
- getFactory(): IChannelFactory<ISharedMap>;
345
- create(runtime: IFluidDataStoreRuntime, id?: string): ISharedMap;
346
- };
680
+ // @alpha
681
+ export class SequenceDeltaEvent extends SequenceEvent<MergeTreeDeltaOperationType> {
682
+ constructor(opArgs: IMergeTreeDeltaOpArgs, deltaArgs: IMergeTreeDeltaCallbackArgs, mergeTreeClient: Client);
683
+ readonly isLocal: boolean;
684
+ // (undocumented)
685
+ readonly opArgs: IMergeTreeDeltaOpArgs;
686
+ }
347
687
 
348
- // @public @deprecated
688
+ // @alpha
689
+ export abstract class SequenceEvent<TOperation extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationTypes> {
690
+ constructor(deltaArgs: IMergeTreeDeltaCallbackArgs<TOperation>, mergeTreeClient: Client);
691
+ get clientId(): string | undefined;
692
+ // (undocumented)
693
+ readonly deltaArgs: IMergeTreeDeltaCallbackArgs<TOperation>;
694
+ // (undocumented)
695
+ readonly deltaOperation: TOperation;
696
+ get first(): Readonly<ISequenceDeltaRange<TOperation>>;
697
+ get last(): Readonly<ISequenceDeltaRange<TOperation>>;
698
+ get ranges(): readonly Readonly<ISequenceDeltaRange<TOperation>>[];
699
+ }
700
+
701
+ // @alpha
702
+ export class SequenceInterval implements ISerializableInterval {
703
+ constructor(client: Client,
704
+ start: LocalReferencePosition,
705
+ end: LocalReferencePosition, intervalType: IntervalType, props?: PropertySet, startSide?: Side, endSide?: Side);
706
+ addPositionChangeListeners(beforePositionChange: () => void, afterPositionChange: () => void): void;
707
+ // (undocumented)
708
+ addProperties(newProps: PropertySet, collab?: boolean, seq?: number): PropertySet | undefined;
709
+ // (undocumented)
710
+ clone(): SequenceInterval;
711
+ compare(b: SequenceInterval): number;
712
+ compareEnd(b: SequenceInterval): number;
713
+ compareStart(b: SequenceInterval): number;
714
+ end: LocalReferencePosition;
715
+ // (undocumented)
716
+ readonly endSide: Side;
717
+ getIntervalId(): string;
718
+ // (undocumented)
719
+ intervalType: IntervalType;
720
+ modify(label: string, start: SequencePlace | undefined, end: SequencePlace | undefined, op?: ISequencedDocumentMessage, localSeq?: number, useNewSlidingBehavior?: boolean): SequenceInterval;
721
+ // (undocumented)
722
+ overlaps(b: SequenceInterval): boolean;
723
+ // (undocumented)
724
+ overlapsPos(bstart: number, bend: number): boolean;
725
+ properties: PropertySet;
726
+ // (undocumented)
727
+ propertyManager: PropertiesManager;
728
+ removePositionChangeListeners(): void;
729
+ // (undocumented)
730
+ serialize(): ISerializedInterval;
731
+ start: LocalReferencePosition;
732
+ // (undocumented)
733
+ readonly startSide: Side;
734
+ // (undocumented)
735
+ get stickiness(): IntervalStickiness;
736
+ union(b: SequenceInterval): SequenceInterval;
737
+ }
738
+
739
+ // @alpha
740
+ export class SequenceMaintenanceEvent extends SequenceEvent<MergeTreeMaintenanceType> {
741
+ constructor(opArgs: IMergeTreeDeltaOpArgs | undefined, deltaArgs: IMergeTreeMaintenanceCallbackArgs, mergeTreeClient: Client);
742
+ // (undocumented)
743
+ readonly opArgs: IMergeTreeDeltaOpArgs | undefined;
744
+ }
745
+
746
+ // @alpha
747
+ export type SequencePlace = number | "start" | "end" | InteriorSequencePlace;
748
+
749
+ // @alpha @sealed
750
+ export const SharedDirectory: ISharedObjectKind<ISharedDirectory>;
751
+
752
+ // @alpha @deprecated
753
+ export type SharedDirectory = ISharedDirectory;
754
+
755
+ // @alpha
756
+ export const SharedMap: ISharedObjectKind<ISharedMap>;
757
+
758
+ // @alpha
349
759
  export type SharedMap = ISharedMap;
350
760
 
761
+ // @alpha (undocumented)
762
+ export abstract class SharedSegmentSequence<T extends ISegment> extends SharedObject<ISharedSegmentSequenceEvents> implements ISharedIntervalCollection<SequenceInterval>, MergeTreeRevertibleDriver {
763
+ constructor(dataStoreRuntime: IFluidDataStoreRuntime, id: string, attributes: IChannelAttributes, segmentFromSpec: (spec: IJSONSegment) => ISegment);
764
+ annotateRange(start: number, end: number, props: PropertySet): void;
765
+ protected applyStashedOp(content: any): void;
766
+ // (undocumented)
767
+ protected client: Client;
768
+ createLocalReferencePosition(segment: T, offset: number, refType: ReferenceType, properties: PropertySet | undefined, slidingPreference?: SlidingPreference, canSlideToEndpoint?: boolean): LocalReferencePosition;
769
+ protected didAttach(): void;
770
+ getContainingSegment(pos: number): {
771
+ segment: T | undefined;
772
+ offset: number | undefined;
773
+ };
774
+ // (undocumented)
775
+ getCurrentSeq(): number;
776
+ getIntervalCollection(label: string): IIntervalCollection<SequenceInterval>;
777
+ // (undocumented)
778
+ getIntervalCollectionLabels(): IterableIterator<string>;
779
+ getLength(): number;
780
+ getPosition(segment: ISegment): number;
781
+ // (undocumented)
782
+ getPropertiesAtPosition(pos: number): PropertySet | undefined;
783
+ // (undocumented)
784
+ getRangeExtentsOfPosition(pos: number): {
785
+ posStart: number | undefined;
786
+ posAfterEnd: number | undefined;
787
+ };
788
+ // @deprecated (undocumented)
789
+ groupOperation(groupOp: IMergeTreeGroupMsg): void;
790
+ protected guardReentrancy: <TRet>(callback: () => TRet) => TRet;
791
+ // (undocumented)
792
+ id: string;
793
+ protected initializeLocalCore(): void;
794
+ insertAtReferencePosition(pos: ReferencePosition, segment: T): void;
795
+ insertFromSpec(pos: number, spec: IJSONSegment): void;
796
+ protected loadCore(storage: IChannelStorageService): Promise<void>;
797
+ // (undocumented)
798
+ get loaded(): Promise<void>;
799
+ protected loadedDeferred: Deferred<void>;
800
+ localReferencePositionToPosition(lref: ReferencePosition): number;
801
+ obliterateRange(start: number, end: number): void;
802
+ protected onConnect(): void;
803
+ protected onDisconnect(): void;
804
+ posFromRelativePos(relativePos: IRelativePosition): number;
805
+ protected processCore(message: ISequencedDocumentMessage, local: boolean, localOpMetadata: unknown): void;
806
+ protected processGCDataCore(serializer: IFluidSerializer): void;
807
+ removeLocalReferencePosition(lref: LocalReferencePosition): LocalReferencePosition | undefined;
808
+ // (undocumented)
809
+ removeRange(start: number, end: number): void;
810
+ protected replaceRange(start: number, end: number, segment: ISegment): void;
811
+ resolveRemoteClientPosition(remoteClientPosition: number, remoteClientRefSeq: number, remoteClientId: string): number | undefined;
812
+ protected reSubmitCore(content: any, localOpMetadata: unknown): void;
813
+ // (undocumented)
814
+ readonly segmentFromSpec: (spec: IJSONSegment) => ISegment;
815
+ protected summarizeCore(serializer: IFluidSerializer, telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
816
+ walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start?: number, end?: number, accum?: TClientData, splitRange?: boolean): void;
817
+ }
818
+
819
+ // @alpha
820
+ export class SharedString extends SharedSegmentSequence<SharedStringSegment> implements ISharedString {
821
+ constructor(document: IFluidDataStoreRuntime, id: string, attributes: IChannelAttributes);
822
+ annotateMarker(marker: Marker, props: PropertySet): void;
823
+ static create(runtime: IFluidDataStoreRuntime, id?: string): SharedString;
824
+ static getFactory(): SharedStringFactory;
825
+ getMarkerFromId(id: string): ISegment | undefined;
826
+ getText(start?: number, end?: number): string;
827
+ // (undocumented)
828
+ getTextRangeWithMarkers(start: number, end: number): string;
829
+ getTextWithPlaceholders(start?: number, end?: number): string;
830
+ // (undocumented)
831
+ id: string;
832
+ insertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void;
833
+ insertMarkerRelative(relativePos1: IRelativePosition, refType: ReferenceType, props?: PropertySet): void;
834
+ insertText(pos: number, text: string, props?: PropertySet): void;
835
+ insertTextRelative(relativePos1: IRelativePosition, text: string, props?: PropertySet): void;
836
+ // (undocumented)
837
+ get ISharedString(): ISharedString;
838
+ removeText(start: number, end: number): void;
839
+ replaceText(start: number, end: number, text: string, props?: PropertySet): void;
840
+ protected rollback(content: any, localOpMetadata: unknown): void;
841
+ searchForMarker(startPos: number, markerLabel: string, forwards?: boolean): Marker | undefined;
842
+ }
843
+
844
+ // @alpha (undocumented)
845
+ export class SharedStringFactory implements IChannelFactory {
846
+ // (undocumented)
847
+ static readonly Attributes: IChannelAttributes;
848
+ // (undocumented)
849
+ get attributes(): IChannelAttributes;
850
+ create(document: IFluidDataStoreRuntime, id: string): SharedString;
851
+ load(runtime: IFluidDataStoreRuntime, id: string, services: IChannelServices, attributes: IChannelAttributes): Promise<SharedString>;
852
+ // (undocumented)
853
+ static segmentFromSpec(spec: any): SharedStringSegment;
854
+ // (undocumented)
855
+ static Type: string;
856
+ // (undocumented)
857
+ get type(): string;
858
+ }
859
+
860
+ // @alpha (undocumented)
861
+ export type SharedStringSegment = TextSegment | Marker;
862
+
351
863
  // @public
352
- export interface SharedObjectClass<T extends IFluidLoadable> {
353
- readonly getFactory: () => IChannelFactory<T>;
864
+ export const SharedTree: ISharedObjectKind<ITree>;
865
+
866
+ // @alpha
867
+ export enum Side {
868
+ // (undocumented)
869
+ After = 1,
870
+ // (undocumented)
871
+ Before = 0
354
872
  }
355
873
 
356
874
  // @public
357
- export const SharedTree: {
358
- getFactory(): IChannelFactory<ITree>;
359
- };
875
+ export type TransactionConstraint = NodeInDocumentConstraint;
360
876
 
361
877
  // @public
362
878
  export const Tree: TreeApi;
363
879
 
364
880
  // @public
365
881
  export interface TreeApi extends TreeNodeApi {
882
+ contains(node: TreeNode, other: TreeNode): boolean;
366
883
  runTransaction<TNode extends TreeNode>(node: TNode, transaction: (node: TNode) => void | "rollback"): void;
367
- runTransaction<TRoot>(tree: TreeView<TRoot>, transaction: (root: TRoot) => void | "rollback"): void;
884
+ runTransaction<TNode extends TreeNode>(node: TNode, transaction: (node: TNode) => void | "rollback", preconditions?: TransactionConstraint[]): void;
885
+ runTransaction<TView extends TreeView<ImplicitFieldSchema>>(tree: TView, transaction: (root: TView["root"]) => void | "rollback"): void;
886
+ runTransaction<TView extends TreeView<ImplicitFieldSchema>>(tree: TView, transaction: (root: TView["root"]) => void | "rollback", preconditions?: TransactionConstraint[]): void;
368
887
  }
369
888
 
370
889
  // @public
371
- export interface TreeArrayNode<TAllowedTypes extends ImplicitAllowedTypes = ImplicitAllowedTypes> extends TreeNode, TreeArrayNodeBase<TreeNodeFromImplicitAllowedTypes<TAllowedTypes>, InsertableTreeNodeFromImplicitAllowedTypes<TAllowedTypes>, TreeArrayNode> {
890
+ export interface TreeArrayNode<TAllowedTypes extends ImplicitAllowedTypes = ImplicitAllowedTypes> extends TreeArrayNodeBase<TreeNodeFromImplicitAllowedTypes<TAllowedTypes>, InsertableTreeNodeFromImplicitAllowedTypes<TAllowedTypes>, TreeArrayNode> {
372
891
  }
373
892
 
374
893
  // @public
@@ -397,6 +916,16 @@ export interface TreeArrayNodeBase<out T, in TNew, in TMoveFrom> extends Readonl
397
916
  removeRange(start?: number, end?: number): void;
398
917
  }
399
918
 
919
+ // @public
920
+ export interface TreeArrayNodeUnsafe<TAllowedTypes extends Unenforced<ImplicitAllowedTypes>> extends TreeArrayNodeBase<TreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>, InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>, TreeArrayNode> {
921
+ }
922
+
923
+ // @public
924
+ export interface TreeChangeEvents {
925
+ nodeChanged(): void;
926
+ treeChanged(): void;
927
+ }
928
+
400
929
  // @public
401
930
  export class TreeConfiguration<TSchema extends ImplicitFieldSchema = ImplicitFieldSchema> {
402
931
  constructor(schema: TSchema, initialTree: () => InsertableTreeFieldFromImplicitField<TSchema>);
@@ -409,6 +938,9 @@ export class TreeConfiguration<TSchema extends ImplicitFieldSchema = ImplicitFie
409
938
  // @public
410
939
  export type TreeFieldFromImplicitField<TSchema extends ImplicitFieldSchema = FieldSchema> = TSchema extends FieldSchema<infer Kind, infer Types> ? ApplyKind<TreeNodeFromImplicitAllowedTypes<Types>, Kind> : TSchema extends ImplicitAllowedTypes ? TreeNodeFromImplicitAllowedTypes<TSchema> : unknown;
411
940
 
941
+ // @public
942
+ export type TreeFieldFromImplicitFieldUnsafe<TSchema extends Unenforced<ImplicitFieldSchema>> = TSchema extends FieldSchemaUnsafe<infer Kind, infer Types> ? ApplyKind<TreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind> : TSchema extends ImplicitAllowedTypes ? TreeNodeFromImplicitAllowedTypesUnsafe<TSchema> : unknown;
943
+
412
944
  // @public
413
945
  export type TreeLeafValue = number | string | boolean | IFluidHandle | null;
414
946
 
@@ -418,6 +950,12 @@ export interface TreeMapNode<T extends ImplicitAllowedTypes = ImplicitAllowedTyp
418
950
  set(key: string, value: InsertableTreeNodeFromImplicitAllowedTypes<T> | undefined): void;
419
951
  }
420
952
 
953
+ // @public
954
+ export interface TreeMapNodeUnsafe<T extends Unenforced<ImplicitAllowedTypes>> extends ReadonlyMap<string, TreeNodeFromImplicitAllowedTypesUnsafe<T>>, TreeNode {
955
+ delete(key: string): void;
956
+ set(key: string, value: InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T> | undefined): void;
957
+ }
958
+
421
959
  // @public
422
960
  export abstract class TreeNode implements WithType {
423
961
  abstract get [type](): string;
@@ -427,19 +965,18 @@ export abstract class TreeNode implements WithType {
427
965
  export interface TreeNodeApi {
428
966
  is<TSchema extends TreeNodeSchema>(value: unknown, schema: TSchema): value is NodeFromSchema<TSchema>;
429
967
  key(node: TreeNode): string | number;
430
- on<K extends keyof TreeNodeEvents>(node: TreeNode, eventName: K, listener: TreeNodeEvents[K]): () => void;
968
+ on<K extends keyof TreeChangeEvents>(node: TreeNode, eventName: K, listener: TreeChangeEvents[K]): () => void;
431
969
  parent(node: TreeNode): TreeNode | undefined;
432
970
  schema<T extends TreeNode | TreeLeafValue>(node: T): TreeNodeSchema<string, NodeKind, unknown, T>;
971
+ shortId(node: TreeNode): number | undefined;
433
972
  readonly status: (node: TreeNode) => TreeStatus;
434
973
  }
435
974
 
436
975
  // @public
437
- export interface TreeNodeEvents {
438
- afterChange(): void;
439
- }
976
+ export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
440
977
 
441
978
  // @public
442
- export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
979
+ export type TreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends ImplicitAllowedTypes ? TreeNodeFromImplicitAllowedTypes<TSchema> : TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
443
980
 
444
981
  // @public
445
982
  export type TreeNodeSchema<Name extends string = string, Kind extends NodeKind = NodeKind, TNode = unknown, TBuild = never, ImplicitlyConstructable extends boolean = boolean, Info = unknown> = TreeNodeSchemaClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info> | TreeNodeSchemaNonClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info>;
@@ -466,6 +1003,12 @@ export interface TreeNodeSchemaNonClass<out Name extends string = string, out Ki
466
1003
  create(data: TInsertable): TNode;
467
1004
  }
468
1005
 
1006
+ // @public
1007
+ export type TreeObjectNode<T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecord<T> & WithType<TypeName>;
1008
+
1009
+ // @public
1010
+ export type TreeObjectNodeUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecordUnsafe<T> & WithType<TypeName>;
1011
+
469
1012
  // @public
470
1013
  export enum TreeStatus {
471
1014
  Deleted = 2,
@@ -474,25 +1017,41 @@ export enum TreeStatus {
474
1017
  }
475
1018
 
476
1019
  // @public
477
- export interface TreeView<in out TRoot> extends IDisposable {
1020
+ export interface TreeView<TSchema extends ImplicitFieldSchema> extends IDisposable {
478
1021
  readonly error?: SchemaIncompatible;
479
1022
  readonly events: ISubscribable<TreeViewEvents>;
480
- readonly root: TRoot;
1023
+ get root(): TreeFieldFromImplicitField<TSchema>;
1024
+ set root(newRoot: InsertableTreeFieldFromImplicitField<TSchema>);
481
1025
  upgradeSchema(): void;
482
1026
  }
483
1027
 
484
1028
  // @public
485
1029
  export interface TreeViewEvents {
486
1030
  afterBatch(): void;
1031
+ commitApplied(data: CommitMetadata, getRevertible?: RevertibleFactory): void;
487
1032
  rootChanged(): void;
488
1033
  }
489
1034
 
490
1035
  // @public
491
1036
  export const type: unique symbol;
492
1037
 
1038
+ // @public
1039
+ export type Unenforced<_DesiredExtendsConstraint> = unknown;
1040
+
493
1041
  // @public
494
1042
  export type Unhydrated<T> = T;
495
1043
 
1044
+ // @public
1045
+ export type ValidateRecursiveSchema<T extends TreeNodeSchemaClass<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"]>, {
1046
+ [NodeKind.Object]: T["info"] extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1047
+ [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
1048
+ [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
1049
+ }[T["kind"]], false, {
1050
+ [NodeKind.Object]: RestrictiveReadonlyRecord<string, ImplicitFieldSchema>;
1051
+ [NodeKind.Array]: ImplicitAllowedTypes;
1052
+ [NodeKind.Map]: ImplicitAllowedTypes;
1053
+ }[T["kind"]]>> = true;
1054
+
496
1055
  // @public
497
1056
  export interface WithType<TName extends string = string> {
498
1057
  get [type](): TName;