@fluidframework/test-utils 2.0.0-dev-rc.1.0.0.232845 → 2.0.0-dev-rc.2.0.0.246488

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 (146) hide show
  1. package/.eslintrc.cjs +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +34 -0
  4. package/README.md +1 -1
  5. package/api-extractor-cjs.json +8 -0
  6. package/api-extractor-lint.json +1 -1
  7. package/api-extractor.json +1 -1
  8. package/api-report/test-utils.api.md +18 -6
  9. package/dist/DriverWrappers.d.ts +3 -0
  10. package/dist/DriverWrappers.d.ts.map +1 -1
  11. package/dist/DriverWrappers.js +3 -0
  12. package/dist/DriverWrappers.js.map +1 -1
  13. package/dist/TestSummaryUtils.d.ts +7 -2
  14. package/dist/TestSummaryUtils.d.ts.map +1 -1
  15. package/dist/TestSummaryUtils.js +14 -12
  16. package/dist/TestSummaryUtils.js.map +1 -1
  17. package/dist/containerUtils.d.ts +1 -1
  18. package/dist/containerUtils.d.ts.map +1 -1
  19. package/dist/containerUtils.js +2 -2
  20. package/dist/containerUtils.js.map +1 -1
  21. package/dist/debug.js +2 -2
  22. package/dist/debug.js.map +1 -1
  23. package/dist/index.d.ts +14 -14
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +44 -43
  26. package/dist/index.js.map +1 -1
  27. package/dist/loaderContainerTracker.d.ts +5 -1
  28. package/dist/loaderContainerTracker.d.ts.map +1 -1
  29. package/dist/loaderContainerTracker.js +13 -13
  30. package/dist/loaderContainerTracker.js.map +1 -1
  31. package/dist/localLoader.d.ts +1 -1
  32. package/dist/localLoader.d.ts.map +1 -1
  33. package/dist/localLoader.js +2 -2
  34. package/dist/localLoader.js.map +1 -1
  35. package/dist/package.json +3 -0
  36. package/dist/packageVersion.d.ts +1 -1
  37. package/dist/packageVersion.js +1 -1
  38. package/dist/packageVersion.js.map +1 -1
  39. package/dist/test-utils-alpha.d.ts +3 -1
  40. package/dist/test-utils-beta.d.ts +5 -1
  41. package/dist/test-utils-public.d.ts +5 -1
  42. package/dist/test-utils-untrimmed.d.ts +40 -9
  43. package/dist/testContainerRuntimeFactory.d.ts.map +1 -1
  44. package/dist/testContainerRuntimeFactory.js +9 -2
  45. package/dist/testContainerRuntimeFactory.js.map +1 -1
  46. package/dist/testFluidObject.d.ts +1 -1
  47. package/dist/testFluidObject.d.ts.map +1 -1
  48. package/dist/testFluidObject.js.map +1 -1
  49. package/dist/testObjectProvider.d.ts +34 -11
  50. package/dist/testObjectProvider.d.ts.map +1 -1
  51. package/dist/testObjectProvider.js +71 -38
  52. package/dist/testObjectProvider.js.map +1 -1
  53. package/dist/timeoutUtils.d.ts.map +1 -1
  54. package/dist/timeoutUtils.js.map +1 -1
  55. package/dist/tsdoc-metadata.json +1 -1
  56. package/lib/DriverWrappers.d.ts +35 -0
  57. package/lib/DriverWrappers.d.ts.map +1 -0
  58. package/lib/DriverWrappers.js +54 -0
  59. package/lib/DriverWrappers.js.map +1 -0
  60. package/lib/TestConfigs.d.ts +23 -0
  61. package/lib/TestConfigs.d.ts.map +1 -0
  62. package/lib/TestConfigs.js +24 -0
  63. package/lib/TestConfigs.js.map +1 -0
  64. package/lib/TestSummaryUtils.d.ts +66 -0
  65. package/lib/TestSummaryUtils.d.ts.map +1 -0
  66. package/lib/TestSummaryUtils.js +153 -0
  67. package/lib/TestSummaryUtils.js.map +1 -0
  68. package/lib/containerUtils.d.ts +46 -0
  69. package/lib/containerUtils.d.ts.map +1 -0
  70. package/lib/containerUtils.js +79 -0
  71. package/lib/containerUtils.js.map +1 -0
  72. package/lib/debug.d.ts +7 -0
  73. package/lib/debug.d.ts.map +1 -0
  74. package/lib/debug.js +9 -0
  75. package/lib/debug.js.map +1 -0
  76. package/lib/index.d.ts +19 -0
  77. package/lib/index.d.ts.map +1 -0
  78. package/lib/index.js +18 -0
  79. package/lib/index.js.map +1 -0
  80. package/lib/interfaces.d.ts +25 -0
  81. package/lib/interfaces.d.ts.map +1 -0
  82. package/lib/interfaces.js +6 -0
  83. package/lib/interfaces.js.map +1 -0
  84. package/lib/loaderContainerTracker.d.ts +148 -0
  85. package/lib/loaderContainerTracker.d.ts.map +1 -0
  86. package/lib/loaderContainerTracker.js +631 -0
  87. package/lib/loaderContainerTracker.js.map +1 -0
  88. package/lib/localCodeLoader.d.ts +31 -0
  89. package/lib/localCodeLoader.d.ts.map +1 -0
  90. package/lib/localCodeLoader.js +73 -0
  91. package/lib/localCodeLoader.js.map +1 -0
  92. package/lib/localLoader.d.ts +26 -0
  93. package/lib/localLoader.d.ts.map +1 -0
  94. package/lib/localLoader.js +37 -0
  95. package/lib/localLoader.js.map +1 -0
  96. package/lib/packageVersion.d.ts +9 -0
  97. package/lib/packageVersion.d.ts.map +1 -0
  98. package/lib/packageVersion.js +9 -0
  99. package/lib/packageVersion.js.map +1 -0
  100. package/lib/retry.d.ts +18 -0
  101. package/lib/retry.d.ts.map +1 -0
  102. package/lib/retry.js +37 -0
  103. package/lib/retry.js.map +1 -0
  104. package/lib/test/timeoutUtils.spec.js +165 -0
  105. package/lib/test/timeoutUtils.spec.js.map +1 -0
  106. package/lib/test/types/validateTestUtilsPrevious.generated.js +90 -0
  107. package/lib/test/types/validateTestUtilsPrevious.generated.js.map +1 -0
  108. package/lib/test-utils-alpha.d.ts +309 -0
  109. package/lib/test-utils-beta.d.ts +208 -0
  110. package/lib/test-utils-public.d.ts +208 -0
  111. package/lib/test-utils-untrimmed.d.ts +1046 -0
  112. package/lib/testContainerRuntimeFactory.d.ts +46 -0
  113. package/lib/testContainerRuntimeFactory.d.ts.map +1 -0
  114. package/lib/testContainerRuntimeFactory.js +113 -0
  115. package/lib/testContainerRuntimeFactory.js.map +1 -0
  116. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.d.ts +23 -0
  117. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.d.ts.map +1 -0
  118. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.js +28 -0
  119. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.js.map +1 -0
  120. package/lib/testFluidObject.d.ts +92 -0
  121. package/lib/testFluidObject.d.ts.map +1 -0
  122. package/lib/testFluidObject.js +159 -0
  123. package/lib/testFluidObject.js.map +1 -0
  124. package/lib/testObjectProvider.d.ts +435 -0
  125. package/lib/testObjectProvider.d.ts.map +1 -0
  126. package/lib/testObjectProvider.js +636 -0
  127. package/lib/testObjectProvider.js.map +1 -0
  128. package/lib/timeoutUtils.d.ts +60 -0
  129. package/lib/timeoutUtils.d.ts.map +1 -0
  130. package/lib/timeoutUtils.js +164 -0
  131. package/lib/timeoutUtils.js.map +1 -0
  132. package/package.json +99 -37
  133. package/src/DriverWrappers.ts +3 -0
  134. package/src/TestSummaryUtils.ts +7 -6
  135. package/src/containerUtils.ts +1 -1
  136. package/src/debug.ts +1 -1
  137. package/src/index.ts +19 -14
  138. package/src/loaderContainerTracker.ts +6 -5
  139. package/src/localLoader.ts +1 -1
  140. package/src/packageVersion.ts +1 -1
  141. package/src/testContainerRuntimeFactory.ts +12 -2
  142. package/src/testFluidObject.ts +1 -1
  143. package/src/testObjectProvider.ts +99 -34
  144. package/src/timeoutUtils.ts +1 -0
  145. package/tsconfig.cjs.json +7 -0
  146. package/tsconfig.json +3 -4
@@ -23,11 +23,11 @@ import {
23
23
  NamedFluidDataStoreRegistryEntries,
24
24
  } from "@fluidframework/runtime-definitions";
25
25
  import { ISummaryTree } from "@fluidframework/protocol-definitions";
26
- import { ITestContainerConfig, ITestObjectProvider } from "./testObjectProvider";
27
- import { createTestConfigProvider } from "./TestConfigs";
28
- import { waitForContainerConnection } from "./containerUtils";
29
- import { timeoutAwait } from "./timeoutUtils";
30
- import { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore";
26
+ import { ITestContainerConfig, ITestObjectProvider } from "./testObjectProvider.js";
27
+ import { createTestConfigProvider } from "./TestConfigs.js";
28
+ import { waitForContainerConnection } from "./containerUtils.js";
29
+ import { timeoutAwait } from "./timeoutUtils.js";
30
+ import { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore.js";
31
31
 
32
32
  const summarizerClientType = "summarizer";
33
33
 
@@ -53,7 +53,8 @@ async function getSummarizerBackCompat(container: IContainer): Promise<ISummariz
53
53
  return response.value as ISummarizer;
54
54
  }
55
55
 
56
- async function createSummarizerCore(
56
+ /** @internal */
57
+ export async function createSummarizerCore(
57
58
  container: IContainer,
58
59
  loader: IHostLoader,
59
60
  summaryVersion?: string,
@@ -8,7 +8,7 @@ import { ConnectionState } from "@fluidframework/container-loader";
8
8
  import { IResponse } from "@fluidframework/core-interfaces";
9
9
  import { assert } from "@fluidframework/core-utils";
10
10
  import { IDataStore } from "@fluidframework/runtime-definitions";
11
- import { PromiseExecutor, timeoutPromise, TimeoutWithError } from "./timeoutUtils";
11
+ import { PromiseExecutor, timeoutPromise, TimeoutWithError } from "./timeoutUtils.js";
12
12
 
13
13
  /**
14
14
  * Utility function to wait for the specified Container to be in Connected state.
package/src/debug.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import registerDebug from "debug";
7
- import { pkgName, pkgVersion } from "./packageVersion";
7
+ import { pkgName, pkgVersion } from "./packageVersion.js";
8
8
 
9
9
  export const debug = registerDebug("fluid:test-utils");
10
10
  debug(`Package: ${pkgName} - Version: ${pkgVersion}`);
package/src/index.ts CHANGED
@@ -7,18 +7,22 @@ export {
7
7
  wrapDocumentService,
8
8
  wrapDocumentServiceFactory,
9
9
  wrapDocumentStorageService,
10
- } from "./DriverWrappers";
11
- export { IProvideTestFluidObject, ITestFluidObject } from "./interfaces";
12
- export { LoaderContainerTracker } from "./loaderContainerTracker";
13
- export { fluidEntryPoint, LocalCodeLoader, SupportedExportInterfaces } from "./localCodeLoader";
14
- export { createAndAttachContainer, createLoader } from "./localLoader";
15
- export { retryWithEventualValue } from "./retry";
16
- export { createTestConfigProvider, ITestConfigProvider } from "./TestConfigs";
10
+ } from "./DriverWrappers.js";
11
+ export { IProvideTestFluidObject, ITestFluidObject } from "./interfaces.js";
12
+ export { LoaderContainerTracker } from "./loaderContainerTracker.js";
13
+ export { fluidEntryPoint, LocalCodeLoader, SupportedExportInterfaces } from "./localCodeLoader.js";
14
+ export { createAndAttachContainer, createLoader } from "./localLoader.js";
15
+ export { retryWithEventualValue } from "./retry.js";
16
+ export { createTestConfigProvider, ITestConfigProvider } from "./TestConfigs.js";
17
17
  export {
18
18
  createTestContainerRuntimeFactory,
19
19
  TestContainerRuntimeFactory,
20
- } from "./testContainerRuntimeFactory";
21
- export { ChannelFactoryRegistry, TestFluidObject, TestFluidObjectFactory } from "./testFluidObject";
20
+ } from "./testContainerRuntimeFactory.js";
21
+ export {
22
+ ChannelFactoryRegistry,
23
+ TestFluidObject,
24
+ TestFluidObjectFactory,
25
+ } from "./testFluidObject.js";
22
26
  export {
23
27
  createDocumentId,
24
28
  DataObjectFactoryType,
@@ -30,23 +34,24 @@ export {
30
34
  ITestObjectProvider,
31
35
  TestObjectProvider,
32
36
  TestObjectProviderWithVersionedLoad,
33
- } from "./testObjectProvider";
37
+ } from "./testObjectProvider.js";
34
38
  export {
35
39
  createSummarizer,
40
+ createSummarizerCore,
36
41
  createSummarizerFromFactory,
37
42
  summarizeNow,
38
43
  SummaryInfo,
39
- } from "./TestSummaryUtils";
44
+ } from "./TestSummaryUtils.js";
40
45
  export {
41
46
  defaultTimeoutDurationMs,
42
47
  timeoutAwait,
43
48
  timeoutPromise,
44
49
  TimeoutWithError,
45
50
  TimeoutWithValue,
46
- } from "./timeoutUtils";
51
+ } from "./timeoutUtils.js";
47
52
  export {
48
53
  waitForContainerConnection,
49
54
  getContainerEntryPointBackCompat,
50
55
  getDataStoreEntryPointBackCompat,
51
- } from "./containerUtils";
52
- export { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore";
56
+ } from "./containerUtils.js";
57
+ export { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore.js";
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+
5
6
  import { assert } from "@fluidframework/core-utils";
6
7
  import { IContainer, IDeltaQueue, IHostLoader } from "@fluidframework/container-definitions";
7
8
  import { ConnectionState } from "@fluidframework/container-loader";
@@ -15,11 +16,11 @@ import {
15
16
  IContainerCreateProps,
16
17
  IContainerLoadProps,
17
18
  // eslint-disable-next-line import/no-internal-modules
18
- } from "@fluidframework/container-loader/dist/container";
19
- import { waitForContainerConnection } from "./containerUtils";
20
- import { debug } from "./debug";
21
- import { IOpProcessingController } from "./testObjectProvider";
22
- import { timeoutAwait, timeoutPromise } from "./timeoutUtils";
19
+ } from "@fluidframework/container-loader/test/container";
20
+ import { waitForContainerConnection } from "./containerUtils.js";
21
+ import { debug } from "./debug.js";
22
+ import { IOpProcessingController } from "./testObjectProvider.js";
23
+ import { timeoutAwait, timeoutPromise } from "./timeoutUtils.js";
23
24
 
24
25
  const debugOp = debug.extend("ops");
25
26
  const debugWait = debug.extend("wait");
@@ -13,7 +13,7 @@ import {
13
13
  import { Loader } from "@fluidframework/container-loader";
14
14
  import { ITelemetryBaseLogger, IRequest } from "@fluidframework/core-interfaces";
15
15
  import { IDocumentServiceFactory, IUrlResolver } from "@fluidframework/driver-definitions";
16
- import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader";
16
+ import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader.js";
17
17
 
18
18
  /**
19
19
  * Creates a loader with the given package entries and driver.
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/test-utils";
9
- export const pkgVersion = "2.0.0-dev-rc.1.0.0.232845";
9
+ export const pkgVersion = "2.0.0-dev-rc.2.0.0.246488";
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { assert } from "@fluidframework/core-utils";
6
7
  import { IContainerContext, IRuntime } from "@fluidframework/container-definitions";
7
8
  import {
8
9
  ContainerRuntime,
@@ -83,12 +84,21 @@ export const createTestContainerRuntimeFactory = (
83
84
  }
84
85
 
85
86
  public async instantiateFirstTime(runtime: ContainerRuntime): Promise<void> {
86
- const rootContext = runtime.createDetachedRootDataStore([this.type], "default");
87
+ // Back-compat - old code does not return IDataStore for rootContext.attachRuntime() call!
88
+ // Thus need to leverage old API createDetachedRootDataStore() that is gone in latest releases.
89
+ const rootContext =
90
+ "createDetachedRootDataStore" in runtime
91
+ ? (runtime as any).createDetachedRootDataStore([this.type], "default")
92
+ : runtime.createDetachedDataStore([this.type], "default");
93
+
87
94
  const rootRuntime = await this.dataStoreFactory.instantiateDataStore(
88
95
  rootContext,
89
96
  /* existing */ false,
90
97
  );
91
- await rootContext.attachRuntime(this.dataStoreFactory, rootRuntime);
98
+ const dataStore = await rootContext.attachRuntime(this.dataStoreFactory, rootRuntime);
99
+
100
+ const result = await dataStore?.trySetAlias("default");
101
+ assert(result === "Success" || result === undefined, "success");
92
102
  }
93
103
 
94
104
  public async instantiateFromExisting(runtime: ContainerRuntime): Promise<void> {
@@ -18,7 +18,7 @@ import {
18
18
  import { IFluidDataStoreRuntime, IChannelFactory } from "@fluidframework/datastore-definitions";
19
19
  import { assert } from "@fluidframework/core-utils";
20
20
  import { create404Response } from "@fluidframework/runtime-utils";
21
- import { ITestFluidObject } from "./interfaces";
21
+ import { ITestFluidObject } from "./interfaces.js";
22
22
 
23
23
  /**
24
24
  * A test Fluid object that will create a shared object for each key-value pair in the factoryEntries passed to load.
@@ -16,7 +16,6 @@ import {
16
16
  } from "@fluidframework/container-loader";
17
17
  import { IContainerRuntimeOptions } from "@fluidframework/container-runtime";
18
18
  import {
19
- ITelemetryGenericEvent,
20
19
  ITelemetryBaseLogger,
21
20
  ITelemetryBaseEvent,
22
21
  IRequestHeader,
@@ -28,11 +27,15 @@ import {
28
27
  } from "@fluidframework/driver-definitions";
29
28
  import { ITestDriver, TestDriverTypes } from "@fluidframework/test-driver-definitions";
30
29
  import { v4 as uuid } from "uuid";
31
- import { createChildLogger, createMultiSinkLogger } from "@fluidframework/telemetry-utils";
32
- import { LoaderContainerTracker } from "./loaderContainerTracker";
33
- import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader";
34
- import { createAndAttachContainer } from "./localLoader";
35
- import { ChannelFactoryRegistry } from "./testFluidObject";
30
+ import {
31
+ createChildLogger,
32
+ createMultiSinkLogger,
33
+ type ITelemetryGenericEventExt,
34
+ } from "@fluidframework/telemetry-utils";
35
+ import { LoaderContainerTracker } from "./loaderContainerTracker.js";
36
+ import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader.js";
37
+ import { createAndAttachContainer } from "./localLoader.js";
38
+ import { ChannelFactoryRegistry } from "./testFluidObject.js";
36
39
 
37
40
  const defaultCodeDetails: IFluidCodeDetails = {
38
41
  package: "defaultTestPackage",
@@ -126,6 +129,19 @@ export interface ITestObjectProvider {
126
129
  loaderProps?: Partial<ILoaderProps>,
127
130
  ): Promise<IContainer>;
128
131
 
132
+ /**
133
+ * Create a detached container much like createContainer, but without attaching it to the document service.
134
+ */
135
+ createDetachedContainer(
136
+ entryPoint: fluidEntryPoint,
137
+ loaderProps?: Partial<ILoaderProps>,
138
+ ): Promise<IContainer>;
139
+
140
+ /**
141
+ * Attaches a detached container to the document service.
142
+ */
143
+ attachDetachedContainer(container: IContainer): Promise<void>;
144
+
129
145
  /**
130
146
  * Loads a container using the default document id
131
147
  */
@@ -288,12 +304,12 @@ export class EventAndErrorTrackingLogger implements ITelemetryBaseLogger {
288
304
  constructor(private readonly baseLogger: ITelemetryBaseLogger) {}
289
305
 
290
306
  private readonly expectedEvents: (
291
- | { index: number; event: ITelemetryGenericEvent | undefined }
307
+ | { index: number; event: ITelemetryGenericEventExt | undefined }
292
308
  | undefined
293
309
  )[] = [];
294
310
  private readonly unexpectedErrors: ITelemetryBaseEvent[] = [];
295
311
 
296
- public registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEvent[]) {
312
+ public registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEventExt[]) {
297
313
  if (this.expectedEvents.length !== 0) {
298
314
  // we don't have to error here. just no reason not to. given the events must be
299
315
  // ordered it could be tricky to figure out problems around multiple registrations.
@@ -505,6 +521,36 @@ export class TestObjectProvider implements ITestObjectProvider {
505
521
  return container;
506
522
  }
507
523
 
524
+ /**
525
+ * {@inheritdoc ITestObjectProvider.createDetachedContainer}
526
+ */
527
+ public async createDetachedContainer(
528
+ entryPoint: fluidEntryPoint,
529
+ loaderProps?: Partial<ILoaderProps> | undefined,
530
+ ): Promise<IContainer> {
531
+ if (this._documentCreated) {
532
+ throw new Error(
533
+ "Only one container/document can be created. To load the container/document use loadContainer",
534
+ );
535
+ }
536
+ const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
537
+ return loader.createDetachedContainer(defaultCodeDetails);
538
+ }
539
+
540
+ /**
541
+ * {@inheritdoc ITestObjectProvider.attachDetachedContainer}
542
+ */
543
+ public async attachDetachedContainer(container: IContainer): Promise<void> {
544
+ if (this._documentCreated) {
545
+ throw new Error(
546
+ "Only one container/document can be created. To load the container/document use loadContainer",
547
+ );
548
+ }
549
+ await container.attach(this.driver.createCreateNewRequest(this.documentId));
550
+ this._documentCreated = true;
551
+ this._documentIdStrategy.update(container.resolvedUrl);
552
+ }
553
+
508
554
  /**
509
555
  * {@inheritDoc ITestObjectProvider.loadContainer}
510
556
  */
@@ -643,14 +689,12 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
643
689
  private _documentCreated = false;
644
690
 
645
691
  /**
646
- * `_loadCount` is used to alternate which version we load the next container with.
647
- * loadCount is even then we will load with the "create" version, and if odd we load with the "load" version.
648
- * After each test we will reset loadCount to 0 to ensure we always create the first container with the create version.
692
+ * Used to determine which APIs to use when creating a loader.
649
693
  *
650
- * Note: This will only affect tests that load a container more than two times.
694
+ * The first load will always use the create APIs, and then useCreateApi will be set to false to ensure all
695
+ * subsequent loads use the load APIs.
651
696
  */
652
-
653
- private _loadCount: number = 0;
697
+ private useCreateApi: boolean = true;
654
698
 
655
699
  constructor(
656
700
  private readonly LoaderConstructorForCreating: typeof Loader,
@@ -726,7 +770,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
726
770
  * {@inheritDoc ITestObjectProvider.driver}
727
771
  */
728
772
  public get driver(): ITestDriver {
729
- return this.nextLoaderShouldCreate() ? this.driverForCreating : this.driverForLoading;
773
+ return this.useCreateApi ? this.driverForCreating : this.driverForLoading;
730
774
  }
731
775
 
732
776
  /**
@@ -735,7 +779,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
735
779
  public get createFluidEntryPoint(): (
736
780
  testContainerConfig?: ITestContainerConfig,
737
781
  ) => fluidEntryPoint {
738
- return this.nextLoaderShouldCreate()
782
+ return this.useCreateApi
739
783
  ? this.createFluidEntryPointForCreating
740
784
  : this.createFluidEntryPointForLoading;
741
785
  }
@@ -789,9 +833,12 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
789
833
  packageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,
790
834
  loaderProps?: Partial<ILoaderProps>,
791
835
  ) {
792
- return this.nextLoaderShouldCreate(/** increment */ true)
793
- ? this.createLoaderForCreating(packageEntries, loaderProps)
794
- : this.createLoaderForLoading(packageEntries, loaderProps);
836
+ if (this.useCreateApi) {
837
+ // After we create the first loader, we can set this.useCreateApi to false.
838
+ this.useCreateApi = false;
839
+ return this.createLoaderForCreating(packageEntries, loaderProps);
840
+ }
841
+ return this.createLoaderForLoading(packageEntries, loaderProps);
795
842
  }
796
843
 
797
844
  /**
@@ -816,6 +863,36 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
816
863
  return container;
817
864
  }
818
865
 
866
+ /**
867
+ * {@inheritdoc ITestObjectProvider.createDetachedContainer}
868
+ */
869
+ public async createDetachedContainer(
870
+ entryPoint: fluidEntryPoint,
871
+ loaderProps?: Partial<ILoaderProps> | undefined,
872
+ ): Promise<IContainer> {
873
+ if (this._documentCreated) {
874
+ throw new Error(
875
+ "Only one container/document can be created. To load the container/document use loadContainer",
876
+ );
877
+ }
878
+ const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
879
+ return loader.createDetachedContainer(defaultCodeDetails);
880
+ }
881
+
882
+ /**
883
+ * {@inheritdoc ITestObjectProvider.attachDetachedContainer}
884
+ */
885
+ public async attachDetachedContainer(container: IContainer): Promise<void> {
886
+ if (this._documentCreated) {
887
+ throw new Error(
888
+ "Only one container/document can be created. To load the container/document use loadContainer",
889
+ );
890
+ }
891
+ await container.attach(this.driver.createCreateNewRequest(this.documentId));
892
+ this._documentCreated = true;
893
+ this._documentIdStrategy.update(container.resolvedUrl);
894
+ }
895
+
819
896
  /**
820
897
  * {@inheritDoc ITestObjectProvider.loadContainer}
821
898
  */
@@ -824,9 +901,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
824
901
  loaderProps?: Partial<ILoaderProps>,
825
902
  requestHeader?: IRequestHeader,
826
903
  ): Promise<IContainer> {
827
- const driver = this.nextLoaderShouldCreate()
828
- ? this.driverForCreating
829
- : this.driverForLoading;
904
+ const driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;
830
905
  const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
831
906
  return this.resolveContainer(loader, requestHeader, driver);
832
907
  }
@@ -888,9 +963,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
888
963
  requestHeader?: IRequestHeader,
889
964
  ): Promise<IContainer> {
890
965
  // Keep track of which Loader we are about to use so we can pass the correct driver through
891
- const driver = this.nextLoaderShouldCreate()
892
- ? this.driverForCreating
893
- : this.driverForLoading;
966
+ const driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;
894
967
  const loader = this.makeTestLoader(testContainerConfig);
895
968
  const container = await this.resolveContainer(loader, requestHeader, driver);
896
969
  await this.waitContainerToCatchUp(container);
@@ -902,7 +975,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
902
975
  * {@inheritDoc ITestObjectProvider.reset}
903
976
  */
904
977
  public reset() {
905
- this._loadCount = 0;
978
+ this.useCreateApi = true;
906
979
  this._loaderContainerTracker.reset();
907
980
  this._logger = undefined;
908
981
  this._documentServiceFactory = undefined;
@@ -948,14 +1021,6 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
948
1021
  this._loaderContainerTracker.reset();
949
1022
  this._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);
950
1023
  }
951
-
952
- private nextLoaderShouldCreate(increment: boolean = false): boolean {
953
- const shouldCreate = this._loadCount % 2 === 0;
954
- if (increment) {
955
- this._loadCount++;
956
- }
957
- return shouldCreate;
958
- }
959
1024
  }
960
1025
 
961
1026
  /**
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import { assert, Deferred } from "@fluidframework/core-utils";
7
+ import type * as Mocha from "mocha";
7
8
 
8
9
  // @deprecated this value is no longer used
9
10
  /**
@@ -0,0 +1,7 @@
1
+ {
2
+ // This config must be used in a "type": "commonjs" environment. (Use fluid-tsc commonjs.)
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "./dist",
6
+ },
7
+ }
package/tsconfig.json CHANGED
@@ -1,11 +1,10 @@
1
1
  {
2
- "extends": "@fluidframework/build-common/ts-common-config.json",
2
+ "extends": "../../../common/build/build-common/tsconfig.node16.json",
3
3
  "exclude": ["src/test/**/*"],
4
4
  "compilerOptions": {
5
5
  "rootDir": "./src",
6
- "outDir": "./dist",
7
- "composite": true,
8
- "types": ["mocha", "node"],
6
+ "outDir": "./lib",
7
+ "types": ["node"],
9
8
  },
10
9
  "include": ["src/**/*"],
11
10
  }