@simplysm/sd-cli 14.0.38 → 14.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular/angular-build-pipeline.d.ts +1 -1
- package/dist/angular/angular-build-pipeline.js +1 -1
- package/dist/angular/client-transform-stylesheet.d.ts +1 -1
- package/dist/angular/client-transform-stylesheet.js +3 -3
- package/dist/esbuild/esbuild-client-config.d.ts +0 -2
- package/dist/esbuild/esbuild-client-config.d.ts.map +1 -1
- package/dist/esbuild/esbuild-client-config.js +19 -9
- package/dist/esbuild/esbuild-client-config.js.map +1 -1
- package/dist/esbuild/esbuild-postcss-plugin.d.ts +8 -0
- package/dist/esbuild/esbuild-postcss-plugin.d.ts.map +1 -0
- package/dist/esbuild/esbuild-postcss-plugin.js +105 -0
- package/dist/esbuild/esbuild-postcss-plugin.js.map +1 -0
- package/dist/esbuild/esbuild-tsc-plugin.d.ts +23 -0
- package/dist/esbuild/esbuild-tsc-plugin.d.ts.map +1 -0
- package/dist/esbuild/esbuild-tsc-plugin.js +60 -0
- package/dist/esbuild/esbuild-tsc-plugin.js.map +1 -0
- package/dist/workers/client.worker.d.ts.map +1 -1
- package/dist/workers/client.worker.js +32 -2
- package/dist/workers/client.worker.js.map +1 -1
- package/dist/workers/server-build.worker.d.ts.map +1 -1
- package/dist/workers/server-build.worker.js +129 -90
- package/dist/workers/server-build.worker.js.map +1 -1
- package/dist/workers/server-esbuild-context.d.ts +27 -0
- package/dist/workers/server-esbuild-context.d.ts.map +1 -1
- package/dist/workers/server-esbuild-context.js +43 -3
- package/dist/workers/server-esbuild-context.js.map +1 -1
- package/package.json +6 -4
- package/src/angular/angular-build-pipeline.ts +2 -2
- package/src/angular/client-transform-stylesheet.ts +4 -4
- package/src/esbuild/esbuild-client-config.ts +21 -12
- package/src/esbuild/esbuild-postcss-plugin.ts +117 -0
- package/src/esbuild/esbuild-tsc-plugin.ts +83 -0
- package/src/workers/client.worker.ts +32 -2
- package/src/workers/server-build.worker.ts +136 -97
- package/src/workers/server-esbuild-context.ts +59 -3
- package/tests/angular/client-transform-stylesheet.spec.ts +1 -1
- package/tests/esbuild/esbuild-tsc-plugin.acc.spec.ts +349 -0
- package/tests/esbuild/esbuild-tsc-plugin.spec.ts +230 -0
- package/tests/utils/esbuild-client-config-postcss.verify.md +6 -0
- package/tests/utils/esbuild-client-config.acc.spec.ts +26 -14
- package/tests/utils/esbuild-client-config.spec.ts +73 -11
- package/tests/utils/esbuild-postcss-plugin.acc.spec.ts +299 -0
- package/tests/utils/esbuild-postcss-plugin.spec.ts +290 -0
- package/tests/utils/esbuild-scss-plugin.acc.spec.ts +1 -0
- package/tests/workers/server-build-lint.spec.ts +43 -0
- package/tests/workers/server-build-worker-refactoring.verify.md +14 -0
- package/tests/workers/server-build-worker.spec.ts +122 -9
- package/tests/workers/server-esbuild-context-tsc.verify.md +7 -0
- package/tests/workers/server-esbuild-context.acc.spec.ts +156 -2
- package/tests/workers/server-esbuild-context.spec.ts +320 -2
|
@@ -5,6 +5,15 @@ import { describe, it, expect, vi, afterEach } from "vitest";
|
|
|
5
5
|
const mockRebuild = vi.fn();
|
|
6
6
|
const mockDispose = vi.fn();
|
|
7
7
|
|
|
8
|
+
const mockTscPlugin = {
|
|
9
|
+
plugin: { name: "sd-tsc", setup: vi.fn() },
|
|
10
|
+
getProgram: vi.fn(),
|
|
11
|
+
getAffectedFiles: vi.fn(),
|
|
12
|
+
getDiagnostics: vi.fn((): unknown[] => []),
|
|
13
|
+
getErrors: vi.fn(),
|
|
14
|
+
resetBuilderProgram: vi.fn(),
|
|
15
|
+
};
|
|
16
|
+
|
|
8
17
|
vi.mock("esbuild", () => ({
|
|
9
18
|
default: {
|
|
10
19
|
context: vi.fn(() =>
|
|
@@ -21,12 +30,19 @@ vi.mock("../../src/esbuild/esbuild-config", async (importOriginal) => {
|
|
|
21
30
|
};
|
|
22
31
|
});
|
|
23
32
|
|
|
33
|
+
vi.mock("../../src/esbuild/esbuild-tsc-plugin", () => ({
|
|
34
|
+
createTscPlugin: vi.fn(() => mockTscPlugin),
|
|
35
|
+
}));
|
|
36
|
+
|
|
24
37
|
//#endregion
|
|
25
38
|
|
|
26
39
|
const esbuild = (await import("esbuild")).default;
|
|
27
40
|
const { writeChangedOutputFiles } = await import("../../src/esbuild/esbuild-config");
|
|
28
|
-
const {
|
|
29
|
-
|
|
41
|
+
const {
|
|
42
|
+
createContext, rebuild, recreateContext, dispose, getMetafile, hasContext,
|
|
43
|
+
getTscProgram, getTscAffectedFiles, getTscDiagnostics,
|
|
44
|
+
} = await import("../../src/workers/server-esbuild-context");
|
|
45
|
+
const { createTscPlugin } = await import("../../src/esbuild/esbuild-tsc-plugin");
|
|
30
46
|
|
|
31
47
|
const baseOptions = {
|
|
32
48
|
pkgDir: "/workspace/packages/my-server",
|
|
@@ -38,8 +54,14 @@ describe("createContext", () => {
|
|
|
38
54
|
afterEach(async () => {
|
|
39
55
|
mockRebuild.mockReset();
|
|
40
56
|
mockDispose.mockReset();
|
|
57
|
+
mockTscPlugin.getProgram.mockReset();
|
|
58
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
59
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
60
|
+
mockTscPlugin.getErrors.mockReset();
|
|
61
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
41
62
|
vi.mocked(esbuild.context).mockClear();
|
|
42
63
|
vi.mocked(writeChangedOutputFiles).mockClear();
|
|
64
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
43
65
|
await dispose();
|
|
44
66
|
});
|
|
45
67
|
|
|
@@ -72,8 +94,14 @@ describe("rebuild", () => {
|
|
|
72
94
|
afterEach(async () => {
|
|
73
95
|
mockRebuild.mockReset();
|
|
74
96
|
mockDispose.mockReset();
|
|
97
|
+
mockTscPlugin.getProgram.mockReset();
|
|
98
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
99
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
100
|
+
mockTscPlugin.getErrors.mockReset();
|
|
101
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
75
102
|
vi.mocked(esbuild.context).mockClear();
|
|
76
103
|
vi.mocked(writeChangedOutputFiles).mockClear();
|
|
104
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
77
105
|
await dispose();
|
|
78
106
|
});
|
|
79
107
|
|
|
@@ -128,8 +156,14 @@ describe("recreateContext", () => {
|
|
|
128
156
|
afterEach(async () => {
|
|
129
157
|
mockRebuild.mockReset();
|
|
130
158
|
mockDispose.mockReset();
|
|
159
|
+
mockTscPlugin.getProgram.mockReset();
|
|
160
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
161
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
162
|
+
mockTscPlugin.getErrors.mockReset();
|
|
163
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
131
164
|
vi.mocked(esbuild.context).mockClear();
|
|
132
165
|
vi.mocked(writeChangedOutputFiles).mockClear();
|
|
166
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
133
167
|
await dispose();
|
|
134
168
|
});
|
|
135
169
|
|
|
@@ -169,8 +203,14 @@ describe("dispose", () => {
|
|
|
169
203
|
afterEach(() => {
|
|
170
204
|
mockRebuild.mockReset();
|
|
171
205
|
mockDispose.mockReset();
|
|
206
|
+
mockTscPlugin.getProgram.mockReset();
|
|
207
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
208
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
209
|
+
mockTscPlugin.getErrors.mockReset();
|
|
210
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
172
211
|
vi.mocked(esbuild.context).mockClear();
|
|
173
212
|
vi.mocked(writeChangedOutputFiles).mockClear();
|
|
213
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
174
214
|
});
|
|
175
215
|
|
|
176
216
|
it("is safe to call when no context exists", async () => {
|
|
@@ -195,4 +235,282 @@ describe("dispose", () => {
|
|
|
195
235
|
expect(hasContext()).toBe(false);
|
|
196
236
|
expect(getMetafile()).toBeUndefined();
|
|
197
237
|
});
|
|
238
|
+
|
|
239
|
+
it("clears tscPlugin reference on dispose", async () => {
|
|
240
|
+
mockTscPlugin.getProgram.mockReturnValue({ id: "prog" });
|
|
241
|
+
|
|
242
|
+
await createContext({
|
|
243
|
+
...baseOptions,
|
|
244
|
+
tsc: { cwd: "/workspace", output: { dts: true } },
|
|
245
|
+
});
|
|
246
|
+
expect(getTscProgram()).toEqual({ id: "prog" });
|
|
247
|
+
|
|
248
|
+
await dispose();
|
|
249
|
+
|
|
250
|
+
expect(getTscProgram()).toBeUndefined();
|
|
251
|
+
expect(getTscAffectedFiles()).toBeUndefined();
|
|
252
|
+
expect(getTscDiagnostics()).toEqual([]);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe("createContext — tsc plugin", () => {
|
|
257
|
+
afterEach(async () => {
|
|
258
|
+
mockRebuild.mockReset();
|
|
259
|
+
mockDispose.mockReset();
|
|
260
|
+
mockTscPlugin.getProgram.mockReset();
|
|
261
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
262
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
263
|
+
mockTscPlugin.getErrors.mockReset();
|
|
264
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
265
|
+
vi.mocked(esbuild.context).mockClear();
|
|
266
|
+
vi.mocked(writeChangedOutputFiles).mockClear();
|
|
267
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
268
|
+
await dispose();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
it("includes tsc plugin in esbuild context when tsc options provided", async () => {
|
|
272
|
+
await createContext({
|
|
273
|
+
...baseOptions,
|
|
274
|
+
tsc: { cwd: "/workspace", output: { dts: true } },
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
expect(esbuild.context).toHaveBeenCalledWith(
|
|
278
|
+
expect.objectContaining({
|
|
279
|
+
plugins: [mockTscPlugin.plugin],
|
|
280
|
+
}),
|
|
281
|
+
);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it("creates esbuild context without plugins when no tsc options and no existing plugin", async () => {
|
|
285
|
+
await createContext(baseOptions);
|
|
286
|
+
|
|
287
|
+
expect(esbuild.context).toHaveBeenCalledWith(
|
|
288
|
+
expect.objectContaining({
|
|
289
|
+
plugins: [],
|
|
290
|
+
}),
|
|
291
|
+
);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it("reuses existing tsc plugin when tsc options absent in subsequent createContext", async () => {
|
|
295
|
+
// First: create with tsc
|
|
296
|
+
await createContext({
|
|
297
|
+
...baseOptions,
|
|
298
|
+
tsc: { cwd: "/workspace", output: { dts: true } },
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// Dispose context only (not module-level dispose — use recreateContext pattern)
|
|
302
|
+
vi.mocked(esbuild.context).mockClear();
|
|
303
|
+
|
|
304
|
+
// Second: create without tsc — should reuse existing plugin
|
|
305
|
+
await recreateContext(baseOptions);
|
|
306
|
+
|
|
307
|
+
expect(esbuild.context).toHaveBeenCalledWith(
|
|
308
|
+
expect.objectContaining({
|
|
309
|
+
plugins: [mockTscPlugin.plugin],
|
|
310
|
+
}),
|
|
311
|
+
);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it("passes tsc env and includeTests options to createTscPlugin", async () => {
|
|
315
|
+
await createContext({
|
|
316
|
+
...baseOptions,
|
|
317
|
+
tsc: {
|
|
318
|
+
cwd: "/workspace",
|
|
319
|
+
output: { dts: false },
|
|
320
|
+
env: "node",
|
|
321
|
+
includeTests: true,
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
expect(createTscPlugin).toHaveBeenCalledWith({
|
|
326
|
+
pkgDir: baseOptions.pkgDir,
|
|
327
|
+
cwd: "/workspace",
|
|
328
|
+
output: { dts: false },
|
|
329
|
+
env: "node",
|
|
330
|
+
includeTests: true,
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
describe("delegation methods", () => {
|
|
336
|
+
afterEach(async () => {
|
|
337
|
+
mockTscPlugin.getProgram.mockReset();
|
|
338
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
339
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
340
|
+
mockTscPlugin.getErrors.mockReset();
|
|
341
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
342
|
+
vi.mocked(esbuild.context).mockClear();
|
|
343
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
344
|
+
await dispose();
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
it("getTscProgram returns plugin value when plugin exists", async () => {
|
|
348
|
+
const fakeProgram = { getSourceFiles: () => [] };
|
|
349
|
+
mockTscPlugin.getProgram.mockReturnValue(fakeProgram);
|
|
350
|
+
|
|
351
|
+
await createContext({
|
|
352
|
+
...baseOptions,
|
|
353
|
+
tsc: { cwd: "/workspace", output: { dts: true } },
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
expect(getTscProgram()).toBe(fakeProgram);
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it("getTscAffectedFiles returns plugin value when plugin exists", async () => {
|
|
360
|
+
const fakeFiles = new Set(["/src/main.ts"]);
|
|
361
|
+
mockTscPlugin.getAffectedFiles.mockReturnValue(fakeFiles);
|
|
362
|
+
|
|
363
|
+
await createContext({
|
|
364
|
+
...baseOptions,
|
|
365
|
+
tsc: { cwd: "/workspace", output: { dts: true } },
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
expect(getTscAffectedFiles()).toBe(fakeFiles);
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
it("getTscDiagnostics returns plugin value when plugin exists", async () => {
|
|
372
|
+
const fakeDiag = [{ category: 1, code: 2322, messageText: "err" }];
|
|
373
|
+
mockTscPlugin.getDiagnostics.mockReturnValue(fakeDiag);
|
|
374
|
+
|
|
375
|
+
await createContext({
|
|
376
|
+
...baseOptions,
|
|
377
|
+
tsc: { cwd: "/workspace", output: { dts: true } },
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
expect(getTscDiagnostics()).toEqual(fakeDiag);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
describe("rebuild — tsc error merge", () => {
|
|
386
|
+
afterEach(async () => {
|
|
387
|
+
mockRebuild.mockReset();
|
|
388
|
+
mockDispose.mockReset();
|
|
389
|
+
mockTscPlugin.getProgram.mockReset();
|
|
390
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
391
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
392
|
+
mockTscPlugin.getErrors.mockReset();
|
|
393
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
394
|
+
vi.mocked(esbuild.context).mockClear();
|
|
395
|
+
vi.mocked(writeChangedOutputFiles).mockClear();
|
|
396
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
397
|
+
await dispose();
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
it("returns success when both esbuild and tsc have no errors", async () => {
|
|
401
|
+
mockRebuild.mockResolvedValue({
|
|
402
|
+
errors: [],
|
|
403
|
+
warnings: [],
|
|
404
|
+
outputFiles: [],
|
|
405
|
+
metafile: { inputs: {}, outputs: {} },
|
|
406
|
+
});
|
|
407
|
+
mockTscPlugin.getErrors.mockReturnValue(undefined);
|
|
408
|
+
|
|
409
|
+
await createContext({ ...baseOptions, tsc: { cwd: "/workspace", output: { dts: true } } });
|
|
410
|
+
const result = await rebuild();
|
|
411
|
+
|
|
412
|
+
expect(result).toEqual({
|
|
413
|
+
success: true,
|
|
414
|
+
errors: undefined,
|
|
415
|
+
warnings: undefined,
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
it("returns tsc errors only when esbuild succeeds but tsc fails", async () => {
|
|
420
|
+
mockRebuild.mockResolvedValue({
|
|
421
|
+
errors: [],
|
|
422
|
+
warnings: [],
|
|
423
|
+
outputFiles: [],
|
|
424
|
+
metafile: { inputs: {}, outputs: {} },
|
|
425
|
+
});
|
|
426
|
+
mockTscPlugin.getErrors.mockReturnValue(["TS2322: type mismatch"]);
|
|
427
|
+
|
|
428
|
+
await createContext({ ...baseOptions, tsc: { cwd: "/workspace", output: { dts: true } } });
|
|
429
|
+
const result = await rebuild();
|
|
430
|
+
|
|
431
|
+
expect(result).toEqual({
|
|
432
|
+
success: false,
|
|
433
|
+
errors: ["TS2322: type mismatch"],
|
|
434
|
+
warnings: undefined,
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
it("returns esbuild errors only when esbuild fails but tsc succeeds", async () => {
|
|
439
|
+
mockRebuild.mockResolvedValue({
|
|
440
|
+
errors: [{ text: "syntax error" }],
|
|
441
|
+
warnings: [],
|
|
442
|
+
outputFiles: [],
|
|
443
|
+
metafile: undefined,
|
|
444
|
+
});
|
|
445
|
+
mockTscPlugin.getErrors.mockReturnValue(undefined);
|
|
446
|
+
|
|
447
|
+
await createContext({ ...baseOptions, tsc: { cwd: "/workspace", output: { dts: true } } });
|
|
448
|
+
const result = await rebuild();
|
|
449
|
+
|
|
450
|
+
expect(result).toEqual({
|
|
451
|
+
success: false,
|
|
452
|
+
errors: ["syntax error"],
|
|
453
|
+
warnings: undefined,
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
it("merges esbuild and tsc errors when both fail", async () => {
|
|
458
|
+
mockRebuild.mockResolvedValue({
|
|
459
|
+
errors: [{ text: "esbuild error" }],
|
|
460
|
+
warnings: [{ text: "warning" }],
|
|
461
|
+
outputFiles: [],
|
|
462
|
+
metafile: undefined,
|
|
463
|
+
});
|
|
464
|
+
mockTscPlugin.getErrors.mockReturnValue(["tsc error 1", "tsc error 2"]);
|
|
465
|
+
|
|
466
|
+
await createContext({ ...baseOptions, tsc: { cwd: "/workspace", output: { dts: true } } });
|
|
467
|
+
const result = await rebuild();
|
|
468
|
+
|
|
469
|
+
expect(result).toEqual({
|
|
470
|
+
success: false,
|
|
471
|
+
errors: ["esbuild error", "tsc error 1", "tsc error 2"],
|
|
472
|
+
warnings: ["warning"],
|
|
473
|
+
});
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it("returns esbuild-only result when no tsc plugin exists", async () => {
|
|
477
|
+
mockRebuild.mockResolvedValue({
|
|
478
|
+
errors: [{ text: "error" }],
|
|
479
|
+
warnings: [],
|
|
480
|
+
outputFiles: [],
|
|
481
|
+
metafile: undefined,
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
await createContext(baseOptions);
|
|
485
|
+
const result = await rebuild();
|
|
486
|
+
|
|
487
|
+
expect(result).toEqual({
|
|
488
|
+
success: false,
|
|
489
|
+
errors: ["error"],
|
|
490
|
+
warnings: undefined,
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
describe("recreateContext — tsc reset", () => {
|
|
496
|
+
afterEach(async () => {
|
|
497
|
+
mockRebuild.mockReset();
|
|
498
|
+
mockDispose.mockReset();
|
|
499
|
+
mockTscPlugin.getProgram.mockReset();
|
|
500
|
+
mockTscPlugin.getAffectedFiles.mockReset();
|
|
501
|
+
mockTscPlugin.getDiagnostics.mockReset().mockReturnValue([]);
|
|
502
|
+
mockTscPlugin.getErrors.mockReset();
|
|
503
|
+
mockTscPlugin.resetBuilderProgram.mockReset();
|
|
504
|
+
vi.mocked(esbuild.context).mockClear();
|
|
505
|
+
vi.mocked(writeChangedOutputFiles).mockClear();
|
|
506
|
+
vi.mocked(createTscPlugin).mockClear();
|
|
507
|
+
await dispose();
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
it("does not fail when recreateContext is called without tsc plugin", async () => {
|
|
511
|
+
await createContext(baseOptions);
|
|
512
|
+
|
|
513
|
+
await expect(recreateContext(baseOptions)).resolves.not.toThrow();
|
|
514
|
+
expect(hasContext()).toBe(true);
|
|
515
|
+
});
|
|
198
516
|
});
|