@fluidframework/runtime-definitions 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.4.1.0.148229

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.
Files changed (41) hide show
  1. package/.eslintrc.js +5 -7
  2. package/README.md +6 -6
  3. package/api-extractor.json +2 -2
  4. package/dist/attribution.d.ts +74 -0
  5. package/dist/attribution.d.ts.map +1 -0
  6. package/dist/attribution.js +7 -0
  7. package/dist/attribution.js.map +1 -0
  8. package/dist/dataStoreContext.d.ts +39 -14
  9. package/dist/dataStoreContext.d.ts.map +1 -1
  10. package/dist/dataStoreContext.js +17 -9
  11. package/dist/dataStoreContext.js.map +1 -1
  12. package/dist/dataStoreFactory.d.ts.map +1 -1
  13. package/dist/dataStoreFactory.js.map +1 -1
  14. package/dist/dataStoreRegistry.d.ts +1 -1
  15. package/dist/dataStoreRegistry.d.ts.map +1 -1
  16. package/dist/dataStoreRegistry.js.map +1 -1
  17. package/dist/garbageCollection.d.ts +17 -6
  18. package/dist/garbageCollection.d.ts.map +1 -1
  19. package/dist/garbageCollection.js +9 -3
  20. package/dist/garbageCollection.js.map +1 -1
  21. package/dist/index.d.ts +5 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +6 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/protocol.d.ts +2 -2
  26. package/dist/protocol.d.ts.map +1 -1
  27. package/dist/protocol.js.map +1 -1
  28. package/dist/summary.d.ts +105 -15
  29. package/dist/summary.d.ts.map +1 -1
  30. package/dist/summary.js.map +1 -1
  31. package/package.json +30 -35
  32. package/prettier.config.cjs +1 -1
  33. package/src/attribution.ts +81 -0
  34. package/src/dataStoreContext.ts +418 -395
  35. package/src/dataStoreFactory.ts +14 -11
  36. package/src/dataStoreRegistry.ts +8 -6
  37. package/src/garbageCollection.ts +20 -10
  38. package/src/index.ts +26 -3
  39. package/src/protocol.ts +39 -38
  40. package/src/summary.ts +275 -175
  41. package/tsconfig.json +8 -12
package/src/summary.ts CHANGED
@@ -5,26 +5,23 @@
5
5
 
6
6
  import { TelemetryEventPropertyType } from "@fluidframework/common-definitions";
7
7
  import {
8
- SummaryTree,
9
- ISummaryTree,
10
- ISequencedDocumentMessage,
11
- ISnapshotTree,
12
- ITree,
8
+ SummaryTree,
9
+ ISummaryTree,
10
+ ISequencedDocumentMessage,
11
+ ISnapshotTree,
12
+ ITree,
13
13
  } from "@fluidframework/protocol-definitions";
14
- import {
15
- IGarbageCollectionData,
16
- IGarbageCollectionDetailsBase,
17
- } from "./garbageCollection";
14
+ import { IGarbageCollectionData, IGarbageCollectionDetailsBase } from "./garbageCollection";
18
15
 
19
16
  /**
20
17
  * Contains the aggregation data from a Tree/Subtree.
21
18
  */
22
19
  export interface ISummaryStats {
23
- treeNodeCount: number;
24
- blobNodeCount: number;
25
- handleNodeCount: number;
26
- totalBlobSize: number;
27
- unreferencedBlobSize: number;
20
+ treeNodeCount: number;
21
+ blobNodeCount: number;
22
+ handleNodeCount: number;
23
+ totalBlobSize: number;
24
+ unreferencedBlobSize: number;
28
25
  }
29
26
 
30
27
  /**
@@ -35,21 +32,23 @@ export interface ISummaryStats {
35
32
  * will be taking part of the summarization process.
36
33
  */
37
34
  export interface ISummaryTreeWithStats {
38
- /** Represents an aggregation of node counts and blob sizes associated to the current summary information */
39
- stats: ISummaryStats;
40
- /**
41
- * A recursive data structure that will be converted to a snapshot tree and uploaded
42
- * to the backend.
43
- */
44
- summary: ISummaryTree;
35
+ /**
36
+ * Represents an aggregation of node counts and blob sizes associated to the current summary information
37
+ */
38
+ stats: ISummaryStats;
39
+ /**
40
+ * A recursive data structure that will be converted to a snapshot tree and uploaded
41
+ * to the backend.
42
+ */
43
+ summary: ISummaryTree;
45
44
  }
46
45
 
47
46
  /**
48
47
  * Represents a summary at a current sequence number.
49
48
  */
50
49
  export interface ISummarizeResult {
51
- stats: ISummaryStats;
52
- summary: SummaryTree;
50
+ stats: ISummaryStats;
51
+ summary: SummaryTree;
53
52
  }
54
53
 
55
54
  /**
@@ -67,128 +66,206 @@ export interface ISummarizeResult {
67
66
  * ```
68
67
  */
69
68
  export interface ISummarizeInternalResult extends ISummarizeResult {
70
- id: string;
71
- /** Additional path parts between this node's ID and its children's IDs. */
72
- pathPartsForChildren?: string[];
69
+ id: string;
70
+ /**
71
+ * Additional path parts between this node's ID and its children's IDs.
72
+ */
73
+ pathPartsForChildren?: string[];
73
74
  }
74
75
 
75
- /** The garbage collection data of each node in the reference graph. */
76
+ /**
77
+ * The garbage collection data of each node in the reference graph.
78
+ *
79
+ * @deprecated Internal implementation detail and will no longer be exported in an upcoming release.
80
+ */
76
81
  export interface IGarbageCollectionNodeData {
77
- /** The set of routes to other nodes in the graph. */
78
- outboundRoutes: string[];
79
- /** If the node is unreferenced, the timestamp of when it was marked unreferenced. */
80
- unreferencedTimestampMs?: number;
82
+ /**
83
+ * The set of routes to other nodes in the graph.
84
+ */
85
+ outboundRoutes: string[];
86
+ /**
87
+ * If the node is unreferenced, the timestamp of when it was marked unreferenced.
88
+ */
89
+ unreferencedTimestampMs?: number;
81
90
  }
82
91
 
83
92
  /**
84
93
  * The garbage collection state of the reference graph. It contains a list of all the nodes in the graph and their
85
94
  * GC data.
95
+ *
96
+ * @deprecated Internal implementation detail and will no longer be exported in an upcoming release.
86
97
  */
87
98
  export interface IGarbageCollectionState {
88
- gcNodes: { [ id: string ]: IGarbageCollectionNodeData; };
99
+ gcNodes: { [id: string]: IGarbageCollectionNodeData };
100
+ }
101
+
102
+ /**
103
+ * @deprecated - IGarbageCollectionState is written in the root of the summary now.
104
+ * Legacy GC details from when the GC details were written at the data store's summary tree.
105
+ */
106
+ export interface IGarbageCollectionSummaryDetailsLegacy {
107
+ /** A list of routes to Fluid objects that are used in this node. */
108
+ usedRoutes?: string[];
109
+ /** The GC data of this node. */
110
+ gcData?: IGarbageCollectionData;
111
+ /** If this node is unreferenced, the time when it was marked as such. */
112
+ unrefTimestamp?: number;
113
+ }
114
+
115
+ /**
116
+ * The GC data that is read from a snapshot. It contains the Garbage CollectionState state and tombstone state.
117
+ *
118
+ * @deprecated Internal implementation detail and will no longer be exported in an upcoming release.
119
+ */
120
+ export interface IGarbageCollectionSnapshotData {
121
+ gcState: IGarbageCollectionState;
122
+ tombstones: string[] | undefined;
123
+ deletedNodes: string[] | undefined;
124
+ }
125
+
126
+ /**
127
+ * @experimental - Can be deleted/changed at any time
128
+ * Contains the necessary information to allow DDSes to do incremental summaries
129
+ */
130
+ export interface IExperimentalIncrementalSummaryContext {
131
+ /**
132
+ * The sequence number of the summary generated that will be sent to the server.
133
+ */
134
+ summarySequenceNumber: number;
135
+ /**
136
+ * The sequence number of the most recent summary that was acknowledged by the server.
137
+ */
138
+ latestSummarySequenceNumber: number;
139
+ /**
140
+ * The path to the runtime/datastore/dds that is used to generate summary handles
141
+ * Note: Summary handles are nodes of the summary tree that point to previous parts of the last successful summary
142
+ * instead of being a blob or tree node
143
+ *
144
+ * This path contains the id of the data store and dds which should not be leaked to layers below them. Ideally,
145
+ * a layer should not know its own id. This is important for channel unification work and there has been a lot of
146
+ * work to remove these kinds of leakages. Some still exist, which have to be fixed but we should not be adding
147
+ * more dependencies.
148
+ */
149
+ // TODO: remove summaryPath
150
+ summaryPath: string;
89
151
  }
90
152
 
91
153
  export type SummarizeInternalFn = (
92
- fullTree: boolean,
93
- trackState: boolean,
94
- telemetryContext?: ITelemetryContext,
154
+ fullTree: boolean,
155
+ trackState: boolean,
156
+ telemetryContext?: ITelemetryContext,
157
+ incrementalSummaryContext?: IExperimentalIncrementalSummaryContext,
95
158
  ) => Promise<ISummarizeInternalResult>;
96
159
 
97
160
  export interface ISummarizerNodeConfig {
98
- /**
99
- * True to reuse previous handle when unchanged since last acked summary.
100
- * Defaults to true.
101
- */
102
- readonly canReuseHandle?: boolean;
103
- /**
104
- * True to always stop execution on error during summarize, or false to
105
- * attempt creating a summary that is a pointer ot the last acked summary
106
- * plus outstanding ops in case of internal summarize failure.
107
- * Defaults to false.
108
- *
109
- * BUG BUG: Default to true while we investigate problem
110
- * with differential summaries
111
- */
112
- readonly throwOnFailure?: true;
161
+ /**
162
+ * True to reuse previous handle when unchanged since last acked summary.
163
+ * Defaults to true.
164
+ */
165
+ readonly canReuseHandle?: boolean;
166
+ /**
167
+ * True to always stop execution on error during summarize, or false to
168
+ * attempt creating a summary that is a pointer ot the last acked summary
169
+ * plus outstanding ops in case of internal summarize failure.
170
+ * Defaults to false.
171
+ *
172
+ * BUG BUG: Default to true while we investigate problem
173
+ * with differential summaries
174
+ */
175
+ readonly throwOnFailure?: true;
113
176
  }
114
177
 
115
178
  export interface ISummarizerNodeConfigWithGC extends ISummarizerNodeConfig {
116
- /**
117
- * True if GC is disabled. If so, don't track GC related state for a summary.
118
- * This is propagated to all child nodes.
119
- */
120
- readonly gcDisabled?: boolean;
179
+ /**
180
+ * True if GC is disabled. If so, don't track GC related state for a summary.
181
+ * This is propagated to all child nodes.
182
+ */
183
+ readonly gcDisabled?: boolean;
121
184
  }
122
185
 
123
186
  export enum CreateSummarizerNodeSource {
124
- FromSummary,
125
- FromAttach,
126
- Local,
187
+ FromSummary,
188
+ FromAttach,
189
+ Local,
127
190
  }
128
- export type CreateChildSummarizerNodeParam = {
129
- type: CreateSummarizerNodeSource.FromSummary;
130
- } | {
131
- type: CreateSummarizerNodeSource.FromAttach;
132
- sequenceNumber: number;
133
- snapshot: ITree;
134
- } | {
135
- type: CreateSummarizerNodeSource.Local;
136
- };
191
+ export type CreateChildSummarizerNodeParam =
192
+ | {
193
+ type: CreateSummarizerNodeSource.FromSummary;
194
+ }
195
+ | {
196
+ type: CreateSummarizerNodeSource.FromAttach;
197
+ sequenceNumber: number;
198
+ snapshot: ITree;
199
+ }
200
+ | {
201
+ type: CreateSummarizerNodeSource.Local;
202
+ };
137
203
 
138
204
  export interface ISummarizerNode {
139
- /** Latest successfully acked summary reference sequence number */
140
- readonly referenceSequenceNumber: number;
141
- /**
142
- * Marks the node as having a change with the given sequence number.
143
- * @param sequenceNumber - sequence number of change
144
- */
145
- invalidate(sequenceNumber: number): void;
146
- /**
147
- * Calls the internal summarize function and handles internal state tracking.
148
- * If unchanged and fullTree is false, it will reuse previous summary subtree.
149
- * If an error is encountered and throwOnFailure is false, it will try to make
150
- * a summary with a pointer to the previous summary + a blob of outstanding ops.
151
- * @param fullTree - true to skip optimizations and always generate the full tree
152
- * @param trackState - indicates whether the summarizer node should track the state of the summary or not
153
- * @param telemetryContext - summary data passed through the layers for telemetry purposes
154
- */
155
- summarize(
156
- fullTree: boolean,
157
- trackState?: boolean,
158
- telemetryContext?: ITelemetryContext,
159
- ): Promise<ISummarizeResult>;
160
- /**
161
- * Checks if there are any additional path parts for children that need to
162
- * be loaded from the base summary. Additional path parts represent parts
163
- * of the path between this SummarizerNode and any child SummarizerNodes
164
- * that it might have. For example: if datastore "a" contains dds "b", but the
165
- * path is "/a/.channels/b", then the additional path part is ".channels".
166
- * @param snapshot - the base summary to parse
167
- */
168
- updateBaseSummaryState(snapshot: ISnapshotTree): void;
169
- /**
170
- * Records an op representing a change to this node/subtree.
171
- * @param op - op of change to record
172
- */
173
- recordChange(op: ISequencedDocumentMessage): void;
205
+ /**
206
+ * Latest successfully acked summary reference sequence number
207
+ */
208
+ readonly referenceSequenceNumber: number;
209
+ /**
210
+ * Marks the node as having a change with the given sequence number.
211
+ * @param sequenceNumber - sequence number of change
212
+ */
213
+ invalidate(sequenceNumber: number): void;
214
+ /**
215
+ * Calls the internal summarize function and handles internal state tracking.
216
+ * If unchanged and fullTree is false, it will reuse previous summary subtree.
217
+ * If an error is encountered and throwOnFailure is false, it will try to make
218
+ * a summary with a pointer to the previous summary + a blob of outstanding ops.
219
+ * @param fullTree - true to skip optimizations and always generate the full tree
220
+ * @param trackState - indicates whether the summarizer node should track the state of the summary or not
221
+ * @param telemetryContext - summary data passed through the layers for telemetry purposes
222
+ */
223
+ summarize(
224
+ fullTree: boolean,
225
+ trackState?: boolean,
226
+ telemetryContext?: ITelemetryContext,
227
+ ): Promise<ISummarizeResult>;
228
+ /**
229
+ * Checks if there are any additional path parts for children that need to
230
+ * be loaded from the base summary. Additional path parts represent parts
231
+ * of the path between this SummarizerNode and any child SummarizerNodes
232
+ * that it might have. For example: if datastore "a" contains dds "b", but the
233
+ * path is "/a/.channels/b", then the additional path part is ".channels".
234
+ * @param snapshot - the base summary to parse
235
+ */
236
+ updateBaseSummaryState(snapshot: ISnapshotTree): void;
237
+ /**
238
+ * Records an op representing a change to this node/subtree.
239
+ * @param op - op of change to record
240
+ */
241
+ recordChange(op: ISequencedDocumentMessage): void;
174
242
 
175
- createChild(
176
- /** Summarize function */
177
- summarizeInternalFn: SummarizeInternalFn,
178
- /** Initial id or path part of this node */
179
- id: string,
180
- /**
181
- * Information needed to create the node.
182
- * If it is from a base summary, it will assert that a summary has been seen.
183
- * Attach information if it is created from an attach op.
184
- * If it is local, it will throw unsupported errors on calls to summarize.
185
- */
186
- createParam: CreateChildSummarizerNodeParam,
187
- /** Optional configuration affecting summarize behavior */
188
- config?: ISummarizerNodeConfig,
189
- ): ISummarizerNode;
243
+ createChild(
244
+ /**
245
+ * Summarize function
246
+ */
247
+ summarizeInternalFn: SummarizeInternalFn,
248
+ /**
249
+ * Initial id or path part of this node
250
+ */
251
+ id: string,
252
+ /**
253
+ * Information needed to create the node.
254
+ * If it is from a base summary, it will assert that a summary has been seen.
255
+ * Attach information if it is created from an attach op.
256
+ * If it is local, it will throw unsupported errors on calls to summarize.
257
+ */
258
+ createParam: CreateChildSummarizerNodeParam,
259
+ /**
260
+ * Optional configuration affecting summarize behavior
261
+ */
262
+ config?: ISummarizerNodeConfig,
263
+ ): ISummarizerNode;
190
264
 
191
- getChild(id: string): ISummarizerNode | undefined;
265
+ getChild(id: string): ISummarizerNode | undefined;
266
+
267
+ /** True if a summary is currently in progress */
268
+ isSummaryInProgress?(): boolean;
192
269
  }
193
270
 
194
271
  /**
@@ -214,49 +291,60 @@ export interface ISummarizerNode {
214
291
  * `updateUsedRoutes`: Used to notify this node of routes that are currently in use in it.
215
292
  */
216
293
  export interface ISummarizerNodeWithGC extends ISummarizerNode {
217
- createChild(
218
- /** Summarize function */
219
- summarizeInternalFn: SummarizeInternalFn,
220
- /** Initial id or path part of this node */
221
- id: string,
222
- /**
223
- * Information needed to create the node.
224
- * If it is from a base summary, it will assert that a summary has been seen.
225
- * Attach information if it is created from an attach op.
226
- * If it is local, it will throw unsupported errors on calls to summarize.
227
- */
228
- createParam: CreateChildSummarizerNodeParam,
229
- /** Optional configuration affecting summarize behavior */
230
- config?: ISummarizerNodeConfigWithGC,
231
- getGCDataFn?: (fullGC?: boolean) => Promise<IGarbageCollectionData>,
232
- getBaseGCDetailsFn?: () => Promise<IGarbageCollectionDetailsBase>,
233
- ): ISummarizerNodeWithGC;
294
+ createChild(
295
+ /**
296
+ * Summarize function
297
+ */
298
+ summarizeInternalFn: SummarizeInternalFn,
299
+ /**
300
+ * Initial id or path part of this node
301
+ */
302
+ id: string,
303
+ /**
304
+ * Information needed to create the node.
305
+ * If it is from a base summary, it will assert that a summary has been seen.
306
+ * Attach information if it is created from an attach op.
307
+ * If it is local, it will throw unsupported errors on calls to summarize.
308
+ */
309
+ createParam: CreateChildSummarizerNodeParam,
310
+ /**
311
+ * Optional configuration affecting summarize behavior
312
+ */
313
+ config?: ISummarizerNodeConfigWithGC,
314
+ getGCDataFn?: (fullGC?: boolean) => Promise<IGarbageCollectionData>,
315
+ /**
316
+ * @deprecated - The functionality to update child's base GC details is incorporated in the summarizer node.
317
+ */
318
+ getBaseGCDetailsFn?: () => Promise<IGarbageCollectionDetailsBase>,
319
+ ): ISummarizerNodeWithGC;
234
320
 
235
- /**
236
- * Delete the child with the given id..
237
- */
238
- deleteChild(id: string): void;
321
+ /**
322
+ * Delete the child with the given id..
323
+ */
324
+ deleteChild(id: string): void;
239
325
 
240
- getChild(id: string): ISummarizerNodeWithGC | undefined;
326
+ getChild(id: string): ISummarizerNodeWithGC | undefined;
241
327
 
242
- /**
243
- * Returns this node's data that is used for garbage collection. This includes a list of GC nodes that represent
244
- * this node. Each node has a set of outbound routes to other GC nodes in the document.
245
- * @param fullGC - true to bypass optimizations and force full generation of GC data.
246
- */
247
- getGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;
328
+ /**
329
+ * Returns this node's data that is used for garbage collection. This includes a list of GC nodes that represent
330
+ * this node. Each node has a set of outbound routes to other GC nodes in the document.
331
+ * @param fullGC - true to bypass optimizations and force full generation of GC data.
332
+ */
333
+ getGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;
248
334
 
249
- /** Tells whether this node is being referenced in this document or not. Unreferenced node will get GC'd */
250
- isReferenced(): boolean;
335
+ /**
336
+ * Tells whether this node is being referenced in this document or not. Unreferenced node will get GC'd
337
+ */
338
+ isReferenced(): boolean;
251
339
 
252
- /**
253
- * After GC has run, called to notify this node of routes that are used in it. These are used for the following:
254
- * 1. To identify if this node is being referenced in the document or not.
255
- * 2. To identify if this node or any of its children's used routes changed since last summary.
256
- *
257
- * @param usedRoutes - The routes that are used in this node.
258
- */
259
- updateUsedRoutes(usedRoutes: string[]): void;
340
+ /**
341
+ * After GC has run, called to notify this node of routes that are used in it. These are used for the following:
342
+ * 1. To identify if this node is being referenced in the document or not.
343
+ * 2. To identify if this node or any of its children's used routes changed since last summary.
344
+ *
345
+ * @param usedRoutes - The routes that are used in this node.
346
+ */
347
+ updateUsedRoutes(usedRoutes: string[]): void;
260
348
  }
261
349
 
262
350
  export const channelsTreeName = ".channels";
@@ -266,27 +354,39 @@ export const channelsTreeName = ".channels";
266
354
  * This object is expected to be modified directly by various summarize methods.
267
355
  */
268
356
  export interface ITelemetryContext {
269
- /**
270
- * Sets value for telemetry data being tracked.
271
- * @param prefix - unique prefix to tag this data with (ex: "fluid:map:")
272
- * @param property - property name of the telemetry data being tracked (ex: "DirectoryCount")
273
- * @param value - value to attribute to this summary telemetry data
274
- */
275
- set(prefix: string, property: string, value: TelemetryEventPropertyType): void;
357
+ /**
358
+ * Sets value for telemetry data being tracked.
359
+ * @param prefix - unique prefix to tag this data with (ex: "fluid:map:")
360
+ * @param property - property name of the telemetry data being tracked (ex: "DirectoryCount")
361
+ * @param value - value to attribute to this summary telemetry data
362
+ */
363
+ set(prefix: string, property: string, value: TelemetryEventPropertyType): void;
364
+
365
+ /**
366
+ * Sets multiple values for telemetry data being tracked.
367
+ * @param prefix - unique prefix to tag this data with (ex: "fluid:summarize:")
368
+ * @param property - property name of the telemetry data being tracked (ex: "Options")
369
+ * @param values - A set of values to attribute to this summary telemetry data.
370
+ */
371
+ setMultiple(
372
+ prefix: string,
373
+ property: string,
374
+ values: Record<string, TelemetryEventPropertyType>,
375
+ ): void;
276
376
 
277
- /**
278
- * Get the telemetry data being tracked
279
- * @param prefix - unique prefix for this data (ex: "fluid:map:")
280
- * @param property - property name of the telemetry data being tracked (ex: "DirectoryCount")
281
- * @returns undefined if item not found
282
- */
283
- get(prefix: string, property: string): TelemetryEventPropertyType;
377
+ /**
378
+ * Get the telemetry data being tracked
379
+ * @param prefix - unique prefix for this data (ex: "fluid:map:")
380
+ * @param property - property name of the telemetry data being tracked (ex: "DirectoryCount")
381
+ * @returns undefined if item not found
382
+ */
383
+ get(prefix: string, property: string): TelemetryEventPropertyType;
284
384
 
285
- /**
286
- * Returns a serialized version of all the telemetry data.
287
- * Should be used when logging in telemetry events.
288
- */
289
- serialize(): string;
385
+ /**
386
+ * Returns a serialized version of all the telemetry data.
387
+ * Should be used when logging in telemetry events.
388
+ */
389
+ serialize(): string;
290
390
  }
291
391
 
292
392
  export const blobCountPropertyName = "BlobCount";
package/tsconfig.json CHANGED
@@ -1,14 +1,10 @@
1
1
  {
2
- "extends": "@fluidframework/build-common/ts-common-config.json",
3
- "exclude": [
4
- "src/test/**/*"
5
- ],
6
- "compilerOptions": {
7
- "rootDir": "./src",
8
- "outDir": "./dist",
9
- "composite": true,
10
- },
11
- "include": [
12
- "src/**/*"
13
- ]
2
+ "extends": "@fluidframework/build-common/ts-common-config.json",
3
+ "exclude": ["src/test/**/*"],
4
+ "compilerOptions": {
5
+ "rootDir": "./src",
6
+ "outDir": "./dist",
7
+ "composite": true,
8
+ },
9
+ "include": ["src/**/*"],
14
10
  }