diff --git a/.gitignore b/.gitignore
index c12b729bf1..57247780d4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -88,5 +88,7 @@ lib/common/test-reports.xml
!lib/common/scripts/**
config/test-deps-versions-generated.json
!scripts/*.js
+!dev/*.js
+
# build output
/dist
diff --git a/dev/tsc-to-mocha-watch.js b/dev/tsc-to-mocha-watch.js
deleted file mode 100644
index 6fa25998fd..0000000000
--- a/dev/tsc-to-mocha-watch.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// Run "tsc" with watch, upon successful compilation run mocha tests.
-
-var child_process = require("child_process");
-var spawn = child_process.spawn;
-var readline = require("readline");
-var chalk = require("chalk");
-
-var mocha = null;
-var mochal = null;
-var errors = 0;
-
-function compilationStarted() {
- if (mocha) {
- mocha.kill('SIGINT');
- }
- mocha = null;
- mochal = null;
- errors = 0;
-}
-function foundErrors() {
- errors ++;
-}
-function compilationComplete() {
- if (errors) {
- console.log(" " + chalk.red("TS errors. Will not start mocha."));
- return;
- } else {
- console.log(" " + chalk.gray("Run mocha."));
- }
- mocha = spawn("./node_modules/.bin/mocha", ["--colors"]);
- mocha.on('close', code => {
- if (code) {
- console.log(chalk.gray("mocha: ") + "Exited with " + code);
- } else {
- console.log(chalk.gray("mocha: ") + chalk.red("Exited with " + code));
- }
- mocha = null;
- mochal = null;
- });
- mochal = readline.createInterface({ input: mocha.stdout });
- mochal.on('line', line => {
- console.log(chalk.gray('mocha: ') + line);
- });
-}
-
-var tsc = spawn("./node_modules/.bin/tsc", ["--watch"]);
-var tscl = readline.createInterface({ input: tsc.stdout });
-tscl.on('line', line => {
- console.log(chalk.gray(" tsc: ") + line);
- if (line.indexOf("Compilation complete.") >= 0) {
- compilationComplete();
- } else if (line.indexOf("File change detected.") >= 0) {
- compilationStarted();
- } else if (line.indexOf(": error TS") >= 0) {
- foundErrors();
- }
-});
diff --git a/dev/tsc-to-vitest-watch.js b/dev/tsc-to-vitest-watch.js
new file mode 100644
index 0000000000..b2371d4f5a
--- /dev/null
+++ b/dev/tsc-to-vitest-watch.js
@@ -0,0 +1,37 @@
+// Run "tsc" in watch mode alongside vitest. Vitest runs the compiled output,
+// so on its own it never notices a .ts edit - tsc has to re-emit first, and
+// vitest picks the change up from there.
+
+const { spawn } = require("child_process");
+
+// shell: true so the node_modules/.bin shims resolve on Windows as well
+const spawnOptions = { stdio: "inherit", shell: true };
+
+const children = [
+ // --preserveWatchOutput keeps tsc from clearing the screen and wiping the
+ // test results out from under you on every recompile
+ spawn("tsc", ["--watch", "--preserveWatchOutput"], spawnOptions),
+ // --watch explicitly: vitest only infers watch mode when stdout is a TTY,
+ // and would otherwise run once and exit, taking tsc down with it
+ spawn("vitest", ["--watch"], spawnOptions),
+];
+
+let shuttingDown = false;
+
+function shutdown() {
+ if (shuttingDown) {
+ return;
+ }
+ shuttingDown = true;
+ for (const child of children) {
+ child.kill("SIGINT");
+ }
+}
+
+process.on("SIGINT", shutdown);
+process.on("SIGTERM", shutdown);
+
+for (const child of children) {
+ // if either side dies, don't leave the other running in the background
+ child.on("exit", shutdown);
+}
diff --git a/lib/common/test/definitions/mocha.d.ts b/lib/common/test/definitions/mocha.d.ts
deleted file mode 100644
index 5c3a07ac15..0000000000
--- a/lib/common/test/definitions/mocha.d.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-// Type definitions for mocha 1.9.0
-// Project: http://visionmedia.github.io/mocha/
-// Definitions by: Kazi Manzur Rashid
-// DefinitelyTyped: https://github.com/borisyankov/DefinitelyTyped
-
-interface Mocha {
- // Setup mocha with the given setting options.
- setup(options: MochaSetupOptions): Mocha;
-
- //Run tests and invoke `fn()` when complete.
- run(callback?: () => void): void;
-
- // Set reporter as function
- reporter(reporter: () => void): Mocha;
-
- // Set reporter, defaults to "dot"
- reporter(reporter: string): Mocha;
-
- // Enable growl support.
- growl(): Mocha;
-}
-
-interface MochaSetupOptions {
- //milliseconds to wait before considering a test slow
- slow?: number;
-
- // timeout in milliseconds
- timeout?: number;
-
- // ui name "bdd", "tdd", "exports" etc
- ui?: string;
-
- //array of accepted globals
- globals?: any[];
-
- // reporter instance (function or string), defaults to `mocha.reporters.Dot`
- reporter?: any;
-
- // bail on the first test failure
- bail?: Boolean;
-
- // ignore global leaks
- ignoreLeaks?: Boolean;
-
- // grep string or regexp to filter tests with
- grep?: any;
-}
-
-declare module mocha {
- interface Done {
- (error?: Error): void;
- }
-}
-
-declare var describe: {
- (description: string, spec: () => void): void;
- only(description: string, spec: () => void): void;
- skip(description: string, spec: () => void): void;
- timeout(ms: number): void;
-};
-
-declare var it: {
- (expectation: string, assertion?: () => void): void;
- (expectation: string, assertion?: (done: mocha.Done) => void): void;
- only(expectation: string, assertion?: () => void): void;
- only(expectation: string, assertion?: (done: mocha.Done) => void): void;
- skip(expectation: string, assertion?: () => void): void;
- skip(expectation: string, assertion?: (done: mocha.Done) => void): void;
- timeout(ms: number): void;
-};
-
-declare function before(action: () => void): void;
-
-declare function before(action: (done: mocha.Done) => void): void;
-
-declare function after(action: () => void): void;
-
-declare function after(action: (done: mocha.Done) => void): void;
-
-declare function beforeEach(action: () => void): void;
-
-declare function beforeEach(action: (done: mocha.Done) => void): void;
-
-declare function afterEach(action: () => void): void;
-
-declare function afterEach(action: (done: mocha.Done) => void): void;
diff --git a/lib/common/test/unit-tests/analytics-service.ts b/lib/common/test/unit-tests/analytics-service.ts
index 000160cf3d..3dd3d5dfb9 100644
--- a/lib/common/test/unit-tests/analytics-service.ts
+++ b/lib/common/test/unit-tests/analytics-service.ts
@@ -128,7 +128,7 @@ describe("analytics-service", () => {
service = null;
});
- after(() => {
+ afterAll(() => {
setIsInteractive(null);
});
@@ -147,8 +147,8 @@ describe("analytics-service", () => {
});
it("returns false when analytics status is disabled", async () => {
- baseTestScenario.exceptionsTracking = baseTestScenario.featureTracking =
- false;
+ baseTestScenario.exceptionsTracking =
+ baseTestScenario.featureTracking = false;
const testInjector = createTestInjector(baseTestScenario);
service = testInjector.resolve("analyticsService");
const staticConfig: Config.IStaticConfig =
@@ -377,8 +377,8 @@ describe("analytics-service", () => {
});
it("does nothing when exception and feature tracking are already set", async () => {
- baseTestScenario.featureTracking = baseTestScenario.exceptionsTracking =
- true;
+ baseTestScenario.featureTracking =
+ baseTestScenario.exceptionsTracking = true;
const testInjector = createTestInjector(baseTestScenario);
service = testInjector.resolve("analyticsService");
await service.checkConsent();
diff --git a/lib/common/test/unit-tests/appbuilder/device-emitter.ts b/lib/common/test/unit-tests/appbuilder/device-emitter.ts
index ec4ec9bacc..33f43bc013 100644
--- a/lib/common/test/unit-tests/appbuilder/device-emitter.ts
+++ b/lib/common/test/unit-tests/appbuilder/device-emitter.ts
@@ -1,3 +1,4 @@
+import { withDone, DoneCallback } from "../../with-done";
import { Yok } from "../../../yok";
import { assert } from "chai";
import * as _ from "lodash";
@@ -63,7 +64,7 @@ describe("deviceEmitter", () => {
describe(deviceEvent, () => {
const attachDeviceEventVerificationHandler = (
expectedDeviceInfo: any,
- done: mocha.Done
+ done: DoneCallback,
) => {
deviceEmitter.on(deviceEvent, (deviceInfo: Mobile.IDeviceInfo) => {
assert.deepStrictEqual(deviceInfo, expectedDeviceInfo);
@@ -72,21 +73,24 @@ describe("deviceEmitter", () => {
});
};
- it("is raised when working with device", (done: mocha.Done) => {
- attachDeviceEventVerificationHandler(
- deviceInstance.deviceInfo,
- done
- );
- devicesService.emit(deviceEvent, deviceInstance);
- });
+ it(
+ "is raised when working with device",
+ withDone((done) => {
+ attachDeviceEventVerificationHandler(
+ deviceInstance.deviceInfo,
+ done,
+ );
+ devicesService.emit(deviceEvent, deviceInstance);
+ }),
+ );
});
- }
+ },
);
describe("openDeviceLogStream", () => {
const attachDeviceEventVerificationHandler = (
expectedDeviceInfo: any,
- done: mocha.Done
+ done: DoneCallback,
) => {
deviceEmitter.on(
DeviceDiscoveryEventNames.DEVICE_FOUND,
@@ -97,21 +101,24 @@ describe("deviceEmitter", () => {
setTimeout(() => {
assert.isTrue(
isOpenDeviceLogStreamCalled,
- "When device is found, openDeviceLogStream must be called immediately."
+ "When device is found, openDeviceLogStream must be called immediately.",
);
done();
}, 0);
- }
+ },
);
};
- it("is called when working with device", (done: mocha.Done) => {
- attachDeviceEventVerificationHandler(deviceInstance.deviceInfo, done);
- devicesService.emit(
- DeviceDiscoveryEventNames.DEVICE_FOUND,
- deviceInstance
- );
- });
+ it(
+ "is called when working with device",
+ withDone((done) => {
+ attachDeviceEventVerificationHandler(deviceInstance.deviceInfo, done);
+ devicesService.emit(
+ DeviceDiscoveryEventNames.DEVICE_FOUND,
+ deviceInstance,
+ );
+ }),
+ );
});
describe("deviceLogProvider on data", () => {
@@ -126,7 +133,7 @@ describe("deviceEmitter", () => {
const attachDeviceLogDataVerificationHandler = (
expectedDeviceIdentifier: string,
- done: mocha.Done
+ done: DoneCallback,
) => {
deviceEmitter.on(
DEVICE_LOG_EVENT_NAME,
@@ -135,25 +142,28 @@ describe("deviceEmitter", () => {
assert.deepStrictEqual(data, expectedDeviceLogData);
// Wait for all operations to be completed and call done after that.
setTimeout(() => done(), 0);
- }
+ },
);
};
- it("is called when device reports data", (done: mocha.Done) => {
- attachDeviceLogDataVerificationHandler(
- deviceInstance.deviceInfo.identifier,
- done
- );
- devicesService.emit(
- DeviceDiscoveryEventNames.DEVICE_FOUND,
- deviceInstance
- );
- deviceLogProvider.emit(
- "data",
- deviceInstance.deviceInfo.identifier,
- expectedDeviceLogData
- );
- });
+ it(
+ "is called when device reports data",
+ withDone((done) => {
+ attachDeviceLogDataVerificationHandler(
+ deviceInstance.deviceInfo.identifier,
+ done,
+ );
+ devicesService.emit(
+ DeviceDiscoveryEventNames.DEVICE_FOUND,
+ deviceInstance,
+ );
+ deviceLogProvider.emit(
+ "data",
+ deviceInstance.deviceInfo.identifier,
+ expectedDeviceLogData,
+ );
+ }),
+ );
});
});
@@ -165,42 +175,45 @@ describe("deviceEmitter", () => {
const attachApplicationEventVerificationHandler = (
expectedDeviceIdentifier: string,
- done: mocha.Done
+ done: DoneCallback,
) => {
deviceEmitter.on(
applicationEvent,
(deviceIdentifier: string, appIdentifier: string) => {
assert.deepStrictEqual(
deviceIdentifier,
- expectedDeviceIdentifier
+ expectedDeviceIdentifier,
);
assert.deepStrictEqual(
appIdentifier,
- expectedApplicationIdentifier
+ expectedApplicationIdentifier,
);
// Wait for all operations to be completed and call done after that.
setTimeout(() => done(), 0);
- }
+ },
);
};
- it("is raised when working with device", (done: mocha.Done) => {
- attachApplicationEventVerificationHandler(
- deviceInstance.deviceInfo.identifier,
- done
- );
- devicesService.emit(
- DeviceDiscoveryEventNames.DEVICE_FOUND,
- deviceInstance
- );
- deviceInstance.applicationManager.emit(
- applicationEvent,
- expectedApplicationIdentifier
- );
- });
+ it(
+ "is raised when working with device",
+ withDone((done) => {
+ attachApplicationEventVerificationHandler(
+ deviceInstance.deviceInfo.identifier,
+ done,
+ );
+ devicesService.emit(
+ DeviceDiscoveryEventNames.DEVICE_FOUND,
+ deviceInstance,
+ );
+ deviceInstance.applicationManager.emit(
+ applicationEvent,
+ expectedApplicationIdentifier,
+ );
+ }),
+ );
});
- }
+ },
);
_.each(
@@ -209,41 +222,44 @@ describe("deviceEmitter", () => {
describe(applicationEvent, () => {
const attachDebuggableEventVerificationHandler = (
expectedDebuggableAppInfo: Mobile.IDeviceApplicationInformation,
- done: mocha.Done
+ done: DoneCallback,
) => {
deviceEmitter.on(
applicationEvent,
(debuggableAppInfo: Mobile.IDeviceApplicationInformation) => {
assert.deepStrictEqual(
debuggableAppInfo,
- expectedDebuggableAppInfo
+ expectedDebuggableAppInfo,
);
// Wait for all operations to be completed and call done after that.
setTimeout(() => done(), 0);
- }
+ },
);
};
- it("is raised when working with device", (done: mocha.Done) => {
- const debuggableAppInfo: Mobile.IDeviceApplicationInformation = {
- appIdentifier: "app identifier",
- deviceIdentifier: deviceInstance.deviceInfo.identifier,
- framework: "cordova",
- };
-
- attachDebuggableEventVerificationHandler(debuggableAppInfo, done);
- devicesService.emit(
- DeviceDiscoveryEventNames.DEVICE_FOUND,
- deviceInstance
- );
- deviceInstance.applicationManager.emit(
- applicationEvent,
- debuggableAppInfo
- );
- });
+ it(
+ "is raised when working with device",
+ withDone((done) => {
+ const debuggableAppInfo: Mobile.IDeviceApplicationInformation = {
+ appIdentifier: "app identifier",
+ deviceIdentifier: deviceInstance.deviceInfo.identifier,
+ framework: "cordova",
+ };
+
+ attachDebuggableEventVerificationHandler(debuggableAppInfo, done);
+ devicesService.emit(
+ DeviceDiscoveryEventNames.DEVICE_FOUND,
+ deviceInstance,
+ );
+ deviceInstance.applicationManager.emit(
+ applicationEvent,
+ debuggableAppInfo,
+ );
+ }),
+ );
});
- }
+ },
);
_.each(
@@ -268,56 +284,58 @@ describe("deviceEmitter", () => {
expectedDeviceIdentifier: string,
expectedAppIdentifier: string,
expectedDebuggableViewInfo: Mobile.IDebugWebViewInfo,
- done: mocha.Done
+ done: DoneCallback,
) => {
deviceEmitter.on(
applicationEvent,
(
deviceIdentifier: string,
appIdentifier: string,
- debuggableViewInfo: Mobile.IDebugWebViewInfo
+ debuggableViewInfo: Mobile.IDebugWebViewInfo,
) => {
assert.deepStrictEqual(
deviceIdentifier,
- expectedDeviceIdentifier
+ expectedDeviceIdentifier,
);
assert.deepStrictEqual(appIdentifier, expectedAppIdentifier);
assert.deepStrictEqual(
debuggableViewInfo,
- expectedDebuggableViewInfo
+ expectedDebuggableViewInfo,
);
// Wait for all operations to be completed and call done after that.
setTimeout(done, 0);
- }
+ },
);
};
- it("is raised when working with device", (done: mocha.Done) => {
- const expectedDebuggableViewInfo: Mobile.IDebugWebViewInfo = createDebuggableWebView(
- "test1"
- );
-
- attachDebuggableEventVerificationHandler(
- deviceInstance.deviceInfo.identifier,
- appId,
- expectedDebuggableViewInfo,
- done
- );
- devicesService.emit(
- DeviceDiscoveryEventNames.DEVICE_FOUND,
- deviceInstance
- );
- deviceInstance.applicationManager.emit(
- applicationEvent,
- appId,
- expectedDebuggableViewInfo
- );
- });
+ it(
+ "is raised when working with device",
+ withDone((done) => {
+ const expectedDebuggableViewInfo: Mobile.IDebugWebViewInfo =
+ createDebuggableWebView("test1");
+
+ attachDebuggableEventVerificationHandler(
+ deviceInstance.deviceInfo.identifier,
+ appId,
+ expectedDebuggableViewInfo,
+ done,
+ );
+ devicesService.emit(
+ DeviceDiscoveryEventNames.DEVICE_FOUND,
+ deviceInstance,
+ );
+ deviceInstance.applicationManager.emit(
+ applicationEvent,
+ appId,
+ expectedDebuggableViewInfo,
+ );
+ }),
+ );
});
- }
+ },
);
});
});
diff --git a/lib/common/test/unit-tests/decorators.ts b/lib/common/test/unit-tests/decorators.ts
index 95db6c4171..702211364c 100644
--- a/lib/common/test/unit-tests/decorators.ts
+++ b/lib/common/test/unit-tests/decorators.ts
@@ -29,7 +29,7 @@ describe("decorators", () => {
injector.register("performanceService", stubs.PerformanceService);
});
- after(() => {
+ afterAll(() => {
// Make sure global injector is clean for next tests that will be executed.
setGlobalInjector(new Yok());
});
@@ -38,7 +38,7 @@ describe("decorators", () => {
const generatePublicApiFromExportedDecorator = () => {
assert.deepStrictEqual(
injector.publicApi.__modules__[moduleName],
- undefined
+ undefined,
);
const resultFunction: any = decoratorsLib.exported(moduleName);
// Call this line in order to generate publicApi and get the real result
@@ -56,7 +56,7 @@ describe("decorators", () => {
const actualResult = exportedFunctionResult(
{},
"myTest1",
- expectedResult
+ expectedResult,
);
assert.deepStrictEqual(actualResult, expectedResult);
});
@@ -67,9 +67,8 @@ describe("decorators", () => {
}`, () => {
injector.register(moduleName, { propertyName: () => expectedResult });
generatePublicApiFromExportedDecorator();
- const actualResult: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ]();
+ const actualResult: any =
+ injector.publicApi.__modules__[moduleName][propertyName]();
assert.deepStrictEqual(actualResult, expectedResult);
});
@@ -78,86 +77,71 @@ describe("decorators", () => {
}`, () => {
injector.register(moduleName, { propertyName: (arg: any) => arg });
generatePublicApiFromExportedDecorator();
- const actualResult: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ](expectedResult);
+ const actualResult: any =
+ injector.publicApi.__modules__[moduleName][propertyName](
+ expectedResult,
+ );
assert.deepStrictEqual(actualResult, expectedResult);
});
});
- it("returns Promise, which is resolved to correct value (function without arguments)", (done: mocha.Done) => {
+ it("returns Promise, which is resolved to correct value (function without arguments)", async () => {
const expectedResult = "result";
injector.register(moduleName, {
propertyName: async () => expectedResult,
});
generatePublicApiFromExportedDecorator();
- const promise: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ]();
- promise
- .then((val: string) => {
- assert.deepStrictEqual(val, expectedResult);
- })
- .then(done)
- .catch(done);
+ const promise: any =
+ injector.publicApi.__modules__[moduleName][propertyName]();
+ await promise.then((val: string) => {
+ assert.deepStrictEqual(val, expectedResult);
+ });
});
- it("returns Promise, which is resolved to correct value (function with arguments)", (done: mocha.Done) => {
+ it("returns Promise, which is resolved to correct value (function with arguments)", async () => {
const expectedArgs = ["result", "result1", "result2"];
injector.register(moduleName, {
propertyName: async (functionArgs: string[]) => functionArgs,
});
generatePublicApiFromExportedDecorator();
- const promise: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ](expectedArgs);
- promise
- .then((val: string[]) => {
- assert.deepStrictEqual(val, expectedArgs);
- })
- .then(done)
- .catch(done);
+ const promise: any =
+ injector.publicApi.__modules__[moduleName][propertyName](expectedArgs);
+ await promise.then((val: string[]) => {
+ assert.deepStrictEqual(val, expectedArgs);
+ });
});
- it("returns Promise, which is resolved to correct value (function returning Promise without arguments)", (done: mocha.Done) => {
+ it("returns Promise, which is resolved to correct value (function returning Promise without arguments)", async () => {
const expectedResult = "result";
injector.register(moduleName, {
propertyName: async () => expectedResult,
});
generatePublicApiFromExportedDecorator();
- const promise: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ]();
- promise
- .then((val: string) => {
- assert.deepStrictEqual(val, expectedResult);
- })
- .then(done)
- .catch(done);
+ const promise: any =
+ injector.publicApi.__modules__[moduleName][propertyName]();
+ await promise.then((val: string) => {
+ assert.deepStrictEqual(val, expectedResult);
+ });
});
- it("returns Promise, which is resolved to correct value (function returning Promise with arguments)", (done: mocha.Done) => {
+ it("returns Promise, which is resolved to correct value (function returning Promise with arguments)", async () => {
const expectedArgs = ["result", "result1", "result2"];
injector.register(moduleName, {
propertyName: async (args: string[]) => args,
});
generatePublicApiFromExportedDecorator();
- const promise: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ](expectedArgs);
- promise
- .then((val: string[]) => {
- assert.deepStrictEqual(val, expectedArgs);
- })
- .then(done)
- .catch(done);
+ const promise: any =
+ injector.publicApi.__modules__[moduleName][propertyName](expectedArgs);
+ await promise.then((val: string[]) => {
+ assert.deepStrictEqual(val, expectedArgs);
+ });
});
- it("rejects Promise, which is resolved to correct error (function without arguments throws)", (done: mocha.Done) => {
+ it("rejects Promise, which is resolved to correct error (function without arguments throws)", async () => {
const expectedError = new Error("Test msg");
injector.register(moduleName, {
propertyName: async () => {
@@ -166,25 +150,21 @@ describe("decorators", () => {
});
generatePublicApiFromExportedDecorator();
- const promise: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ]();
- promise
- .then(
- (result: any) => {
- throw new Error(
- "Then method MUST not be called when promise is rejected!"
- );
- },
- (err: Error) => {
- assert.deepStrictEqual(err, expectedError);
- }
- )
- .then(done)
- .catch(done);
- });
-
- it("rejects Promise, which is resolved to correct error (function returning Promise without arguments throws)", (done: mocha.Done) => {
+ const promise: any =
+ injector.publicApi.__modules__[moduleName][propertyName]();
+ await promise.then(
+ (result: any) => {
+ throw new Error(
+ "Then method MUST not be called when promise is rejected!",
+ );
+ },
+ (err: Error) => {
+ assert.deepStrictEqual(err, expectedError);
+ },
+ );
+ });
+
+ it("rejects Promise, which is resolved to correct error (function returning Promise without arguments throws)", async () => {
const expectedError = new Error("Test msg");
injector.register(moduleName, {
propertyName: async () => {
@@ -193,25 +173,21 @@ describe("decorators", () => {
});
generatePublicApiFromExportedDecorator();
- const promise: any = injector.publicApi.__modules__[moduleName][
- propertyName
- ]();
- promise
- .then(
- (result: any) => {
- throw new Error(
- "Then method MUST not be called when promise is rejected!"
- );
- },
- (err: Error) => {
- assert.deepStrictEqual(err.message, expectedError.message);
- }
- )
- .then(done)
- .catch(done);
- });
-
- it("returns Promises, which are resolved to correct value (function returning Promise[] without arguments)", (done: mocha.Done) => {
+ const promise: any =
+ injector.publicApi.__modules__[moduleName][propertyName]();
+ await promise.then(
+ (result: any) => {
+ throw new Error(
+ "Then method MUST not be called when promise is rejected!",
+ );
+ },
+ (err: Error) => {
+ assert.deepStrictEqual(err.message, expectedError.message);
+ },
+ );
+ });
+
+ it("returns Promises, which are resolved to correct value (function returning Promise[] without arguments)", async () => {
const expectedResultsArr = ["result1", "result2", "result3"];
injector.register(moduleName, {
propertyName: () =>
@@ -219,20 +195,16 @@ describe("decorators", () => {
});
generatePublicApiFromExportedDecorator();
- const promises: Promise[] = injector.publicApi.__modules__[
- moduleName
- ][propertyName]();
- Promise.all(promises)
- .then((promiseResults: string[]) => {
- _.each(promiseResults, (val: string, index: number) => {
- assert.deepStrictEqual(val, expectedResultsArr[index]);
- });
- })
- .then(() => done())
- .catch(done);
+ const promises: Promise[] =
+ injector.publicApi.__modules__[moduleName][propertyName]();
+ await Promise.all(promises).then((promiseResults: string[]) => {
+ _.each(promiseResults, (val: string, index: number) => {
+ assert.deepStrictEqual(val, expectedResultsArr[index]);
+ });
+ });
});
- it("rejects Promises, which are resolved to correct error (function returning Promise[] without arguments throws)", (done: mocha.Done) => {
+ it("rejects Promises, which are resolved to correct error (function returning Promise[] without arguments throws)", async () => {
const expectedErrors = [
new Error("result1"),
new Error("result2"),
@@ -246,40 +218,37 @@ describe("decorators", () => {
});
generatePublicApiFromExportedDecorator();
- new Promise((onFulfilled: Function, onRejected: Function) => {
- const promises: Promise[] = injector.publicApi.__modules__[
- moduleName
- ][propertyName]();
+ await new Promise((onFulfilled: Function, onRejected: Function) => {
+ const promises: Promise[] =
+ injector.publicApi.__modules__[moduleName][propertyName]();
_.each(promises, (promise, index) =>
promise.then(
(result: any) => {
onRejected(
new Error(
- `Then method MUST not be called when promise is rejected!. Result of promise is: ${result}`
- )
+ `Then method MUST not be called when promise is rejected!. Result of promise is: ${result}`,
+ ),
);
},
(err: Error) => {
if (err.message !== expectedErrors[index].message) {
onRejected(
new Error(
- `Error message of rejected promise is not the expected one: expected: "${expectedErrors[index].message}", but was: "${err.message}".`
- )
+ `Error message of rejected promise is not the expected one: expected: "${expectedErrors[index].message}", but was: "${err.message}".`,
+ ),
);
}
if (index + 1 === expectedErrors.length) {
onFulfilled();
}
- }
- )
+ },
+ ),
);
- })
- .then(done)
- .catch(done);
+ });
});
- it("rejects only Promises which throw, resolves the others correctly (function returning Promise[] without arguments)", (done: mocha.Done) => {
+ it("rejects only Promises which throw, resolves the others correctly (function returning Promise[] without arguments)", async () => {
const expectedResultsArr: any[] = ["result1", new Error("result2")];
injector.register(moduleName, {
propertyName: () =>
@@ -287,10 +256,9 @@ describe("decorators", () => {
});
generatePublicApiFromExportedDecorator();
- new Promise((onFulfilled: Function, onRejected: Function) => {
- const promises: Promise[] = injector.publicApi.__modules__[
- moduleName
- ][propertyName]();
+ await new Promise((onFulfilled: Function, onRejected: Function) => {
+ const promises: Promise[] =
+ injector.publicApi.__modules__[moduleName][propertyName]();
_.each(promises, (promise, index) =>
promise.then(
(val: string) => {
@@ -302,17 +270,15 @@ describe("decorators", () => {
(err: Error) => {
assert.deepStrictEqual(
err.message,
- expectedResultsArr[index].message
+ expectedResultsArr[index].message,
);
if (index + 1 === expectedResultsArr.length) {
onFulfilled();
}
- }
- )
+ },
+ ),
);
- })
- .then(done)
- .catch(done);
+ });
});
it("when function throws, raises the error only when the public API is called, not when decorator is applied", () => {
@@ -325,7 +291,7 @@ describe("decorators", () => {
generatePublicApiFromExportedDecorator();
assert.throws(
() => injector.publicApi.__modules__[moduleName][propertyName](),
- errorMessage
+ errorMessage,
);
});
});
@@ -344,7 +310,7 @@ describe("decorators", () => {
const declaredMethod = decoratorsLib.cache()(
{},
propertyName,
- descriptor
+ descriptor,
);
const expectedResult = 5;
const actualResult = declaredMethod.value(expectedResult);
@@ -363,7 +329,7 @@ describe("decorators", () => {
const expectedResultForInstance1 = 1;
assert.deepStrictEqual(
instance1.method(expectedResultForInstance1),
- expectedResultForInstance1
+ expectedResultForInstance1,
); // the first call should give us the expected result. all consecutive calls must return the same result.
_.range(10).forEach((iteration) => {
@@ -378,7 +344,7 @@ describe("decorators", () => {
assert.deepStrictEqual(
instance2.method(expectedResultForInstance2),
expectedResultForInstance2,
- "Instance 2 should return new result."
+ "Instance 2 should return new result.",
); // the first call should give us the expected result. all consecutive calls must return the same result.
_.range(10).forEach((iteration) => {
@@ -394,14 +360,14 @@ describe("decorators", () => {
const expectedResultForInstance1 = 1;
assert.deepStrictEqual(
await instance1.promisifiedMethod(expectedResultForInstance1),
- expectedResultForInstance1
+ expectedResultForInstance1,
); // the first call should give us the expected result. all consecutive calls must return the same result.
for (let iteration = 0; iteration < 10; iteration++) {
const promise = instance1.promisifiedMethod(iteration);
assert.isTrue(
isPromise(promise),
- "Returned result from the decorator should be promise."
+ "Returned result from the decorator should be promise.",
);
const currentResult = await promise;
assert.deepStrictEqual(currentResult, expectedResultForInstance1);
@@ -433,7 +399,7 @@ describe("decorators", () => {
const expectedResult = 1;
assert.deepStrictEqual(
await instance[methodName](expectedResult),
- expectedResult
+ expectedResult,
);
assert.isTrue(instance.isInvokeBeforeMethodCalled);
};
@@ -454,7 +420,7 @@ describe("decorators", () => {
const expectedResult = 1;
assert.deepStrictEqual(
await instance[methodName](expectedResult),
- expectedResult
+ expectedResult,
);
assert.isTrue(instance.isInvokeBeforeMethodCalled);
@@ -464,7 +430,7 @@ describe("decorators", () => {
instance.isInvokeBeforeMethodCalled = false;
assert.deepStrictEqual(
await instance[methodName](iteration),
- iteration
+ iteration,
);
assert.isTrue(instance.isInvokeBeforeMethodCalled);
assert.deepStrictEqual(instance.invokedBeforeCount, iteration + 1);
@@ -487,7 +453,7 @@ describe("decorators", () => {
const expectedResult = 1;
await assert.isRejected(
instance[methodName](expectedResult),
- expectedResult
+ expectedResult,
);
assert.isTrue(instance.isInvokeBeforeMethodCalled);
};
@@ -508,7 +474,7 @@ describe("decorators", () => {
const expectedResult = 1;
assert.deepStrictEqual(
await instance[methodName](expectedResult),
- expectedResult
+ expectedResult,
);
assert.isTrue(instance.isInvokeBeforeMethodCalled);
assert.deepStrictEqual(instance.invokedBeforeArgument, "arg1");
@@ -615,14 +581,14 @@ describe("decorators", () => {
it("method has same toString", () => {
assert.equal(
testInstance.testMethod.toString(),
- undecoratedTestInstance.testMethod.toString()
+ undecoratedTestInstance.testMethod.toString(),
);
});
it("method has same name", () => {
assert.equal(
testInstance.testMethod.name,
- undecoratedTestInstance.testMethod.name
+ undecoratedTestInstance.testMethod.name,
);
});
@@ -635,7 +601,7 @@ describe("decorators", () => {
const performanceService = testInjector.resolve("performanceService");
const processExecutionDataStub: sinon.SinonStub = sinon.stub(
performanceService,
- "processExecutionData"
+ "processExecutionData",
);
const checkSubCall = (call: sinon.SinonSpyCall, methodData: string) => {
@@ -657,7 +623,7 @@ describe("decorators", () => {
checkSubCall(processExecutionDataStub.firstCall, "TestClass__testMethod");
checkSubCall(
processExecutionDataStub.secondCall,
- "TestClass__testAsyncMehtod"
+ "TestClass__testAsyncMehtod",
);
});
});
@@ -733,7 +699,7 @@ describe("decorators", () => {
assert.equal(warnings.length, 1);
assert.equal(
warnings[0],
- `depMethodWithoutParam is deprecated. ${testDepMessage}`
+ `depMethodWithoutParam is deprecated. ${testDepMessage}`,
);
});
@@ -744,7 +710,7 @@ describe("decorators", () => {
assert.equal(warnings.length, 1);
assert.equal(
warnings[0],
- `depMethodWithParam is deprecated. ${testDepMessage}`
+ `depMethodWithParam is deprecated. ${testDepMessage}`,
);
});
@@ -755,7 +721,7 @@ describe("decorators", () => {
assert.equal(warnings.length, 1);
assert.equal(
warnings[0],
- `depAsyncMethod is deprecated. ${testDepMessage}`
+ `depAsyncMethod is deprecated. ${testDepMessage}`,
);
});
@@ -792,7 +758,7 @@ describe("decorators", () => {
assert.equal(warnings.length, 1);
assert.equal(
warnings[0],
- `TestClassDeprecated is deprecated. ${testDepMessage}`
+ `TestClassDeprecated is deprecated. ${testDepMessage}`,
);
});
});
diff --git a/lib/common/test/unit-tests/errors.ts b/lib/common/test/unit-tests/errors.ts
index 0d9a1fb7f2..7988be57e1 100644
--- a/lib/common/test/unit-tests/errors.ts
+++ b/lib/common/test/unit-tests/errors.ts
@@ -15,12 +15,12 @@ describe("errors", () => {
let isInteractive = false;
let processExitCode = 0;
- before(() => {
+ beforeAll(() => {
// @ts-expect-error
helpers.isInteractive = () => isInteractive;
});
- after(() => {
+ afterAll(() => {
// @ts-expect-error
helpers.isInteractive = originalIsInteractive;
});
@@ -139,7 +139,7 @@ describe("errors", () => {
"The error output must contain the error message",
);
assert.isTrue(
- logger.errorOutput.indexOf("at next") !== -1,
+ /\n\s+at\s/.test(logger.errorOutput),
"The error output must contain callstack",
);
assert.isTrue(
diff --git a/lib/common/test/unit-tests/helpers.ts b/lib/common/test/unit-tests/helpers.ts
index 5aeea6f107..ac924e7cbc 100644
--- a/lib/common/test/unit-tests/helpers.ts
+++ b/lib/common/test/unit-tests/helpers.ts
@@ -25,7 +25,7 @@ describe("helpers", () => {
assert.deepStrictEqual(
actualResult,
testData.expectedResult,
- `For input ${testData.input}, the expected result is: ${testData.expectedResult}, but actual result is: ${actualResult}.`
+ `For input ${testData.input}, the expected result is: ${testData.expectedResult}, but actual result is: ${actualResult}.`,
);
};
@@ -82,9 +82,9 @@ describe("helpers", () => {
assert.deepStrictEqual(
helpers.appendZeroesToVersion(
testCase.input,
- testCase.requiredVersionLength
+ testCase.requiredVersionLength,
),
- testCase.expectedResult
+ testCase.expectedResult,
);
});
});
@@ -97,13 +97,13 @@ describe("helpers", () => {
initialDataValues: any[],
handledElements: any[],
element: any,
- passedChunkSize: number
+ passedChunkSize: number,
) => {
return new Promise((resolve) =>
setImmediate(() => {
const remainingElements = _.difference(
initialDataValues,
- handledElements
+ handledElements,
);
const isFromLastChunk =
element + passedChunkSize > initialDataValues.length;
@@ -117,17 +117,17 @@ describe("helpers", () => {
Math.floor(indexOfElement / passedChunkSize) + 1;
const expectedRemainingElements = _.drop(
initialDataValues,
- chunkNumber * passedChunkSize
+ chunkNumber * passedChunkSize,
);
assert.deepStrictEqual(
remainingElements,
- expectedRemainingElements
+ expectedRemainingElements,
);
}
resolve();
- })
+ }),
);
};
@@ -146,9 +146,9 @@ describe("helpers", () => {
initialData,
handledElements,
element,
- chunkSize
+ chunkSize,
);
- }
+ },
);
});
@@ -174,9 +174,9 @@ describe("helpers", () => {
initialDataValues,
handledElements,
element,
- chunkSize
+ chunkSize,
);
- }
+ },
);
});
});
@@ -312,13 +312,13 @@ describe("helpers", () => {
// The tests will use strings in order to skip transpilation of lambdas to functions.
it("returns correct property name for ES5 functions", () => {
_.each(ES5Functions, (testData) =>
- assertTestData(testData, helpers.getPropertyName)
+ assertTestData(testData, helpers.getPropertyName),
);
});
it("returns correct property name for ES6 functions", () => {
_.each(ES6Functions, (testData) =>
- assertTestData(testData, helpers.getPropertyName)
+ assertTestData(testData, helpers.getPropertyName),
);
});
});
@@ -389,7 +389,7 @@ describe("helpers", () => {
it("returns expected result", () => {
_.each(toBooleanTestData, (testData) =>
- assertTestData(testData, helpers.toBoolean)
+ assertTestData(testData, helpers.toBoolean),
);
});
@@ -461,7 +461,7 @@ describe("helpers", () => {
it("returns expected result", () => {
_.each(isNullOrWhitespaceTestData, (t) =>
- assertTestData(t, helpers.isNullOrWhitespace)
+ assertTestData(t, helpers.isNullOrWhitespace),
);
});
@@ -539,21 +539,19 @@ describe("helpers", () => {
];
_.each(settlePromisesTestData, (testData, inputNumber) => {
- it(`returns correct data, test case ${inputNumber}`, (done: any) => {
- helpers
+ it(`returns correct data, test case ${inputNumber}`, async () => {
+ await helpers
.settlePromises(testData.input)
.then((res) => {
assert.deepStrictEqual(res, testData.expectedResult);
})
.catch((err) => {
assert.deepStrictEqual(err.message, testData.expectedError);
- })
- .then(done)
- .catch(done);
+ });
});
});
- it("executes all promises even when some of them are rejected", (done: mocha.Done) => {
+ it("executes all promises even when some of them are rejected", async () => {
let isPromiseSettled = false;
const testData: ITestData = {
@@ -565,24 +563,19 @@ describe("helpers", () => {
expectedError: getErrorMessage([1]),
};
- helpers
- .settlePromises(testData.input)
- .then(
- (res) => {
- assert.deepStrictEqual(res, testData.expectedResult);
- },
- (err) => {
- assert.deepStrictEqual(err.message, testData.expectedError);
- }
- )
- .then(() => {
- assert.isTrue(
- isPromiseSettled,
- "When the first promise is rejected, the second one should still be executed."
- );
- done();
- })
- .catch(done);
+ await helpers.settlePromises(testData.input).then(
+ (res) => {
+ assert.deepStrictEqual(res, testData.expectedResult);
+ },
+ (err) => {
+ assert.deepStrictEqual(err.message, testData.expectedError);
+ },
+ );
+
+ assert.isTrue(
+ isPromiseSettled,
+ "When the first promise is rejected, the second one should still be executed.",
+ );
});
});
@@ -598,12 +591,12 @@ describe("helpers", () => {
const assertPidTestData = (testData: IiOSSimulatorPidTestData) => {
const actualResult = helpers.getPidFromiOSSimulatorLogs(
testData.appId || appId,
- testData.input
+ testData.input,
);
assert.deepStrictEqual(
actualResult,
testData.expectedResult,
- `For input ${testData.input}, the expected result is: ${testData.expectedResult}, but actual result is: ${actualResult}.`
+ `For input ${testData.input}, the expected result is: ${testData.expectedResult}, but actual result is: ${actualResult}.`,
);
};
@@ -670,7 +663,7 @@ describe("helpers", () => {
it("returns expected result", () => {
_.each(getPidFromiOSSimulatorLogsTestData, (testData) =>
- assertPidTestData(testData)
+ assertPidTestData(testData),
);
});
});
@@ -750,28 +743,28 @@ describe("helpers", () => {
];
const assertValueFromNestedObjectTestData = (
- testData: IValueFromNestedObjectTestData
+ testData: IValueFromNestedObjectTestData,
) => {
const actualResult = helpers.getValueFromNestedObject(
testData.input,
- testData.key
+ testData.key,
);
assert.deepStrictEqual(
actualResult,
testData.expectedResult,
`For input ${JSON.stringify(
- testData.input
+ testData.input,
)}, the expected result is: ${JSON.stringify(
- testData.expectedResult || "undefined"
+ testData.expectedResult || "undefined",
)}, but actual result is: ${JSON.stringify(
- actualResult || "undefined"
- )}.`
+ actualResult || "undefined",
+ )}.`,
);
};
it("returns expected result", () => {
_.each(getValueFromNestedObjectTestData, (testData) =>
- assertValueFromNestedObjectTestData(testData)
+ assertValueFromNestedObjectTestData(testData),
);
});
});
@@ -816,7 +809,7 @@ describe("helpers", () => {
_.each(testData, (testCase) => {
assert.deepStrictEqual(
helpers.isNumberWithoutExponent(testCase.input),
- testCase.expectedResult
+ testCase.expectedResult,
);
});
});
@@ -845,14 +838,12 @@ describe("helpers", () => {
expectedOutput: false,
},
{
- name:
- "returns false when neither -g/--global are passed on terminal, but similar flag is passed",
+ name: "returns false when neither -g/--global are passed on terminal, but similar flag is passed",
input: ["install", "nativescript", "--globalEnv"],
expectedOutput: false,
},
{
- name:
- "returns false when neither -g/--global are passed on terminal, but trying to install global package",
+ name: "returns false when neither -g/--global are passed on terminal, but trying to install global package",
input: ["install", "global"],
expectedOutput: false,
},
diff --git a/lib/common/test/unit-tests/mobile/android/logcat-helper.ts b/lib/common/test/unit-tests/mobile/android/logcat-helper.ts
index 7bbaf6540a..e9107f97ef 100644
--- a/lib/common/test/unit-tests/mobile/android/logcat-helper.ts
+++ b/lib/common/test/unit-tests/mobile/android/logcat-helper.ts
@@ -1,3 +1,4 @@
+import { withDone } from "../../../with-done";
import { LogcatHelper } from "../../../../mobile/android/logcat-helper";
import { Yok } from "../../../../yok";
import { assert } from "chai";
@@ -39,7 +40,7 @@ class ChildProcessStub {
public spawn(
command: string,
args?: string[],
- options?: any
+ options?: any,
): childProcess.ChildProcess {
this.adbProcessArgs = args;
this.processSpawnCallCount++;
@@ -99,7 +100,7 @@ function createTestInjector(): IInjector {
function startLogcatHelper(
injector: IInjector,
- startOptions: { deviceIdentifier: string; pid?: string }
+ startOptions: { deviceIdentifier: string; pid?: string },
) {
const logcatHelper = injector.resolve("logcatHelper");
/* tslint:disable:no-floating-promises */
@@ -120,85 +121,94 @@ describe("logcat-helper", () => {
});
describe("start", () => {
- it("should read the whole logcat correctly", (done: mocha.Done) => {
- injector.register("deviceLogProvider", {
- logData(
- line: string,
- platform: string,
- deviceIdentifier: string
- ): void {
- loggedData.push(line);
- if (line === "end") {
- assert.isAbove(loggedData.length, 0);
- done();
- }
- },
- });
-
- startLogcatHelper(injector, { deviceIdentifier: validIdentifier });
- });
-
- it("should pass the pid filter to the adb process", (done: mocha.Done) => {
- const expectedPid = "MyCoolPid";
- injector.register("deviceLogProvider", {
- logData(
- line: string,
- platform: string,
- deviceIdentifier: string
- ): void {
- loggedData.push(line);
- if (line === "end") {
- assert.equal(
- childProcessStub.processSpawnCallCount,
- PROCESS_COUNT_PER_DEVICE
- );
- const adbProcessArgs = childProcessStub.spawnedProcesses[0].args;
- assert.include(adbProcessArgs, `--pid=${expectedPid}`);
- done();
- }
- },
- });
+ it(
+ "should read the whole logcat correctly",
+ withDone((done) => {
+ injector.register("deviceLogProvider", {
+ logData(
+ line: string,
+ platform: string,
+ deviceIdentifier: string,
+ ): void {
+ loggedData.push(line);
+ if (line === "end") {
+ assert.isAbove(loggedData.length, 0);
+ done();
+ }
+ },
+ });
- startLogcatHelper(injector, {
- deviceIdentifier: validIdentifier,
- pid: expectedPid,
- });
- });
+ startLogcatHelper(injector, { deviceIdentifier: validIdentifier });
+ }),
+ );
+
+ it(
+ "should pass the pid filter to the adb process",
+ withDone((done) => {
+ const expectedPid = "MyCoolPid";
+ injector.register("deviceLogProvider", {
+ logData(
+ line: string,
+ platform: string,
+ deviceIdentifier: string,
+ ): void {
+ loggedData.push(line);
+ if (line === "end") {
+ assert.equal(
+ childProcessStub.processSpawnCallCount,
+ PROCESS_COUNT_PER_DEVICE,
+ );
+ const adbProcessArgs = childProcessStub.spawnedProcesses[0].args;
+ assert.include(adbProcessArgs, `--pid=${expectedPid}`);
+ done();
+ }
+ },
+ });
- it("should not pass the pid filter to the adb process when Android version is less than 7", (done: mocha.Done) => {
- const expectedPid = "MyCoolPid";
- injector.register("devicesService", {
- getDevice: (): Mobile.IDevice => {
- return {
- deviceInfo: {
- version: "6.0.0",
- },
- };
- },
- });
+ startLogcatHelper(injector, {
+ deviceIdentifier: validIdentifier,
+ pid: expectedPid,
+ });
+ }),
+ );
+
+ it(
+ "should not pass the pid filter to the adb process when Android version is less than 7",
+ withDone((done) => {
+ const expectedPid = "MyCoolPid";
+ injector.register("devicesService", {
+ getDevice: (): Mobile.IDevice => {
+ return {
+ deviceInfo: {
+ version: "6.0.0",
+ },
+ };
+ },
+ });
- injector.register("deviceLogProvider", {
- logData(
- line: string,
- platform: string,
- deviceIdentifier: string
- ): void {
- loggedData.push(line);
- if (line === "end") {
- assert.notInclude(
- childProcessStub.adbProcessArgs,
- `--pid=${expectedPid}`
- );
- done();
- }
- },
- });
+ injector.register("deviceLogProvider", {
+ logData(
+ line: string,
+ platform: string,
+ deviceIdentifier: string,
+ ): void {
+ loggedData.push(line);
+ if (line === "end") {
+ assert.notInclude(
+ childProcessStub.adbProcessArgs,
+ `--pid=${expectedPid}`,
+ );
+ done();
+ }
+ },
+ });
- startLogcatHelper(injector, {
- deviceIdentifier: validIdentifier,
- pid: expectedPid,
- });
- });
+ startLogcatHelper(injector, {
+ deviceIdentifier: validIdentifier,
+ pid: expectedPid,
+ });
+ }),
+ );
it("should start a single adb process when called multiple times with the same identifier", async () => {
const logcatHelper = injector.resolve("logcatHelper");
@@ -215,7 +225,7 @@ describe("logcat-helper", () => {
assert.equal(
childProcessStub.processSpawnCallCount,
- PROCESS_COUNT_PER_DEVICE
+ PROCESS_COUNT_PER_DEVICE,
);
});
@@ -234,7 +244,7 @@ describe("logcat-helper", () => {
assert.equal(
childProcessStub.processSpawnCallCount,
- 3 * PROCESS_COUNT_PER_DEVICE
+ 3 * PROCESS_COUNT_PER_DEVICE,
);
});
});
@@ -247,7 +257,7 @@ describe("logcat-helper", () => {
});
assert.equal(
childProcessStub.processSpawnCallCount,
- PROCESS_COUNT_PER_DEVICE
+ PROCESS_COUNT_PER_DEVICE,
);
await logcatHelper.stop(validIdentifier);
await logcatHelper.start({
@@ -256,7 +266,7 @@ describe("logcat-helper", () => {
assert.equal(
childProcessStub.processSpawnCallCount,
- 2 * PROCESS_COUNT_PER_DEVICE
+ 2 * PROCESS_COUNT_PER_DEVICE,
);
});
@@ -304,7 +314,7 @@ describe("logcat-helper", () => {
assert.equal(
childProcessStub.processSpawnCallCount,
- PROCESS_COUNT_PER_DEVICE
+ PROCESS_COUNT_PER_DEVICE,
);
childProcessStub.spawnedProcesses.forEach((spawnedProcess) => {
@@ -317,7 +327,7 @@ describe("logcat-helper", () => {
assert.equal(
childProcessStub.processSpawnCallCount,
- 2 * PROCESS_COUNT_PER_DEVICE
+ 2 * PROCESS_COUNT_PER_DEVICE,
);
});
}
diff --git a/lib/common/test/unit-tests/mobile/application-manager-base.ts b/lib/common/test/unit-tests/mobile/application-manager-base.ts
index 262c421455..c81200dd97 100644
--- a/lib/common/test/unit-tests/mobile/application-manager-base.ts
+++ b/lib/common/test/unit-tests/mobile/application-manager-base.ts
@@ -1,3 +1,4 @@
+import { withDone } from "../../with-done";
import { Yok } from "../../../yok";
import { assert } from "chai";
import * as _ from "lodash";
@@ -314,292 +315,318 @@ describe("ApplicationManagerBase", () => {
await Promise.all([foundAppsPromise, lostAppsPromise]);
});
- it("emits debuggableViewFound when new views are available for debug", (done: mocha.Done) => {
- currentlyAvailableAppsForDebugging = createAppsAvailableForDebugging(2);
- const numberOfViewsPerApp = 2;
- currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
- currentlyAvailableAppsForDebugging,
- numberOfViewsPerApp,
- );
- const currentDebuggableViews: IDictionary =
- {};
- applicationManager.on(
- "debuggableViewFound",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- currentDebuggableViews[appIdentifier] =
- currentDebuggableViews[appIdentifier] || [];
- currentDebuggableViews[appIdentifier].push(d);
- const numberOfFoundViewsPerApp = _.uniq(
- _.values(currentDebuggableViews).map((arr) => arr.length),
- );
- if (
- _.keys(currentDebuggableViews).length ===
- currentlyAvailableAppsForDebugging.length &&
- numberOfFoundViewsPerApp.length === 1 && // for all apps we've found exactly two apps.
- numberOfFoundViewsPerApp[0] === numberOfViewsPerApp
- ) {
- _.each(currentDebuggableViews, (webViews, appId) => {
- _.each(webViews, (webView) => {
- const expectedWebView = _.find(
- currentlyAvailableAppWebViewsForDebugging[appId],
- (c) => c.id === webView.id,
- );
- assert.isTrue(_.isEqual(webView, expectedWebView));
+ it(
+ "emits debuggableViewFound when new views are available for debug",
+ withDone((done) => {
+ currentlyAvailableAppsForDebugging =
+ createAppsAvailableForDebugging(2);
+ const numberOfViewsPerApp = 2;
+ currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
+ currentlyAvailableAppsForDebugging,
+ numberOfViewsPerApp,
+ );
+ const currentDebuggableViews: IDictionary<
+ Mobile.IDebugWebViewInfo[]
+ > = {};
+ applicationManager.on(
+ "debuggableViewFound",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ currentDebuggableViews[appIdentifier] =
+ currentDebuggableViews[appIdentifier] || [];
+ currentDebuggableViews[appIdentifier].push(d);
+ const numberOfFoundViewsPerApp = _.uniq(
+ _.values(currentDebuggableViews).map((arr) => arr.length),
+ );
+ if (
+ _.keys(currentDebuggableViews).length ===
+ currentlyAvailableAppsForDebugging.length &&
+ numberOfFoundViewsPerApp.length === 1 && // for all apps we've found exactly two apps.
+ numberOfFoundViewsPerApp[0] === numberOfViewsPerApp
+ ) {
+ _.each(currentDebuggableViews, (webViews, appId) => {
+ _.each(webViews, (webView) => {
+ const expectedWebView = _.find(
+ currentlyAvailableAppWebViewsForDebugging[appId],
+ (c) => c.id === webView.id,
+ );
+ assert.isTrue(_.isEqual(webView, expectedWebView));
+ });
});
- });
- setTimeout(done, 0);
- }
- },
- );
+ setTimeout(done, 0);
+ }
+ },
+ );
- /* tslint:disable:no-floating-promises */
- applicationManager.checkForApplicationUpdates();
- /* tslint:enable:no-floating-promises */
- });
+ /* tslint:disable:no-floating-promises */
+ applicationManager.checkForApplicationUpdates();
+ /* tslint:enable:no-floating-promises */
+ }),
+ );
- it("emits debuggableViewLost when views for debug are removed", (done: mocha.Done) => {
- currentlyAvailableAppsForDebugging = createAppsAvailableForDebugging(2);
- const numberOfViewsPerApp = 2;
- currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
- currentlyAvailableAppsForDebugging,
- numberOfViewsPerApp,
- );
- const expectedResults = _.cloneDeep(
- currentlyAvailableAppWebViewsForDebugging,
- );
- const currentDebuggableViews: IDictionary =
- {};
-
- applicationManager
- .checkForApplicationUpdates()
- .then(() => {
- applicationManager.on(
- "debuggableViewLost",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- currentDebuggableViews[appIdentifier] =
- currentDebuggableViews[appIdentifier] || [];
- currentDebuggableViews[appIdentifier].push(d);
- const numberOfFoundViewsPerApp = _.uniq(
- _.values(currentDebuggableViews).map((arr) => arr.length),
- );
- if (
- _.keys(currentDebuggableViews).length ===
- currentlyAvailableAppsForDebugging.length &&
- numberOfFoundViewsPerApp.length === 1 && // for all apps we've found exactly two apps.
- numberOfFoundViewsPerApp[0] === numberOfViewsPerApp
- ) {
- _.each(currentDebuggableViews, (webViews, appId) => {
- _.each(webViews, (webView) => {
- const expectedWebView = _.find(
- expectedResults[appId],
- (c) => c.id === webView.id,
- );
- assert.isTrue(_.isEqual(webView, expectedWebView));
+ it(
+ "emits debuggableViewLost when views for debug are removed",
+ withDone((done) => {
+ currentlyAvailableAppsForDebugging =
+ createAppsAvailableForDebugging(2);
+ const numberOfViewsPerApp = 2;
+ currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
+ currentlyAvailableAppsForDebugging,
+ numberOfViewsPerApp,
+ );
+ const expectedResults = _.cloneDeep(
+ currentlyAvailableAppWebViewsForDebugging,
+ );
+ const currentDebuggableViews: IDictionary<
+ Mobile.IDebugWebViewInfo[]
+ > = {};
+
+ applicationManager
+ .checkForApplicationUpdates()
+ .then(() => {
+ applicationManager.on(
+ "debuggableViewLost",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ currentDebuggableViews[appIdentifier] =
+ currentDebuggableViews[appIdentifier] || [];
+ currentDebuggableViews[appIdentifier].push(d);
+ const numberOfFoundViewsPerApp = _.uniq(
+ _.values(currentDebuggableViews).map((arr) => arr.length),
+ );
+ if (
+ _.keys(currentDebuggableViews).length ===
+ currentlyAvailableAppsForDebugging.length &&
+ numberOfFoundViewsPerApp.length === 1 && // for all apps we've found exactly two apps.
+ numberOfFoundViewsPerApp[0] === numberOfViewsPerApp
+ ) {
+ _.each(currentDebuggableViews, (webViews, appId) => {
+ _.each(webViews, (webView) => {
+ const expectedWebView = _.find(
+ expectedResults[appId],
+ (c) => c.id === webView.id,
+ );
+ assert.isTrue(_.isEqual(webView, expectedWebView));
+ });
});
- });
- setTimeout(done, 0);
- }
- },
- );
-
- currentlyAvailableAppWebViewsForDebugging = _.mapValues(
- currentlyAvailableAppWebViewsForDebugging,
- (a) => [] as any,
- );
- return applicationManager.checkForApplicationUpdates();
- })
- .catch();
- });
+ setTimeout(done, 0);
+ }
+ },
+ );
- it("emits debuggableViewFound when new views are available for debug", (done: mocha.Done) => {
- currentlyAvailableAppsForDebugging = createAppsAvailableForDebugging(2);
- const numberOfViewsPerApp = 2;
- currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
- currentlyAvailableAppsForDebugging,
- numberOfViewsPerApp,
- );
- let expectedViewToBeFound = createDebuggableWebView("uniqueId");
- let expectedAppIdentifier =
- currentlyAvailableAppsForDebugging[0].appIdentifier;
- let isLastCheck = false;
-
- applicationManager
- .checkForApplicationUpdates()
- .then(() => {
- applicationManager.on(
- "debuggableViewFound",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- assert.deepStrictEqual(appIdentifier, expectedAppIdentifier);
- assert.isTrue(_.isEqual(d, expectedViewToBeFound));
-
- if (isLastCheck) {
- setTimeout(done, 0);
- }
- },
- );
+ currentlyAvailableAppWebViewsForDebugging = _.mapValues(
+ currentlyAvailableAppWebViewsForDebugging,
+ (a) => [] as any,
+ );
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch();
+ }),
+ );
- currentlyAvailableAppWebViewsForDebugging[
- expectedAppIdentifier
- ].push(_.cloneDeep(expectedViewToBeFound));
- return applicationManager.checkForApplicationUpdates();
- })
- .catch()
- .then(() => {
- expectedViewToBeFound = createDebuggableWebView("uniqueId1");
- currentlyAvailableAppWebViewsForDebugging[
- expectedAppIdentifier
- ].push(_.cloneDeep(expectedViewToBeFound));
- return applicationManager.checkForApplicationUpdates();
- })
- .catch()
- .then(() => {
- expectedViewToBeFound = createDebuggableWebView("uniqueId2");
- expectedAppIdentifier =
- currentlyAvailableAppsForDebugging[1].appIdentifier;
- isLastCheck = true;
+ it(
+ "emits debuggableViewFound when new views are available for debug",
+ withDone((done) => {
+ currentlyAvailableAppsForDebugging =
+ createAppsAvailableForDebugging(2);
+ const numberOfViewsPerApp = 2;
+ currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
+ currentlyAvailableAppsForDebugging,
+ numberOfViewsPerApp,
+ );
+ let expectedViewToBeFound = createDebuggableWebView("uniqueId");
+ let expectedAppIdentifier =
+ currentlyAvailableAppsForDebugging[0].appIdentifier;
+ let isLastCheck = false;
+
+ applicationManager
+ .checkForApplicationUpdates()
+ .then(() => {
+ applicationManager.on(
+ "debuggableViewFound",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ assert.deepStrictEqual(appIdentifier, expectedAppIdentifier);
+ assert.isTrue(_.isEqual(d, expectedViewToBeFound));
+
+ if (isLastCheck) {
+ setTimeout(done, 0);
+ }
+ },
+ );
- currentlyAvailableAppWebViewsForDebugging[
- expectedAppIdentifier
- ].push(_.cloneDeep(expectedViewToBeFound));
- return applicationManager.checkForApplicationUpdates();
- })
- .catch();
- });
+ currentlyAvailableAppWebViewsForDebugging[
+ expectedAppIdentifier
+ ].push(_.cloneDeep(expectedViewToBeFound));
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch()
+ .then(() => {
+ expectedViewToBeFound = createDebuggableWebView("uniqueId1");
+ currentlyAvailableAppWebViewsForDebugging[
+ expectedAppIdentifier
+ ].push(_.cloneDeep(expectedViewToBeFound));
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch()
+ .then(() => {
+ expectedViewToBeFound = createDebuggableWebView("uniqueId2");
+ expectedAppIdentifier =
+ currentlyAvailableAppsForDebugging[1].appIdentifier;
+ isLastCheck = true;
+
+ currentlyAvailableAppWebViewsForDebugging[
+ expectedAppIdentifier
+ ].push(_.cloneDeep(expectedViewToBeFound));
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch();
+ }),
+ );
- it("emits debuggableViewLost when views for debug are not available anymore", (done: mocha.Done) => {
- currentlyAvailableAppsForDebugging = createAppsAvailableForDebugging(2);
- const numberOfViewsPerApp = 2;
- currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
- currentlyAvailableAppsForDebugging,
- numberOfViewsPerApp,
- );
- let expectedAppIdentifier =
- currentlyAvailableAppsForDebugging[0].appIdentifier;
- let expectedViewToBeLost = currentlyAvailableAppWebViewsForDebugging[
- expectedAppIdentifier
- ].splice(0, 1)[0];
- let isLastCheck = false;
-
- applicationManager
- .checkForApplicationUpdates()
- .then(() => {
- applicationManager.on(
- "debuggableViewLost",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- assert.deepStrictEqual(appIdentifier, expectedAppIdentifier);
- assert.isTrue(_.isEqual(d, expectedViewToBeLost));
-
- if (isLastCheck) {
- setTimeout(done, 0);
- }
- },
- );
+ it(
+ "emits debuggableViewLost when views for debug are not available anymore",
+ withDone((done) => {
+ currentlyAvailableAppsForDebugging =
+ createAppsAvailableForDebugging(2);
+ const numberOfViewsPerApp = 2;
+ currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
+ currentlyAvailableAppsForDebugging,
+ numberOfViewsPerApp,
+ );
+ let expectedAppIdentifier =
+ currentlyAvailableAppsForDebugging[0].appIdentifier;
+ let expectedViewToBeLost = currentlyAvailableAppWebViewsForDebugging[
+ expectedAppIdentifier
+ ].splice(0, 1)[0];
+ let isLastCheck = false;
+
+ applicationManager
+ .checkForApplicationUpdates()
+ .then(() => {
+ applicationManager.on(
+ "debuggableViewLost",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ assert.deepStrictEqual(appIdentifier, expectedAppIdentifier);
+ assert.isTrue(_.isEqual(d, expectedViewToBeLost));
+
+ if (isLastCheck) {
+ setTimeout(done, 0);
+ }
+ },
+ );
- return applicationManager.checkForApplicationUpdates();
- })
- .catch()
- .then(() => {
- expectedViewToBeLost = currentlyAvailableAppWebViewsForDebugging[
- expectedAppIdentifier
- ].splice(0, 1)[0];
- return applicationManager.checkForApplicationUpdates();
- })
- .catch()
- .then(() => {
- expectedAppIdentifier =
- currentlyAvailableAppsForDebugging[1].appIdentifier;
- expectedViewToBeLost = currentlyAvailableAppWebViewsForDebugging[
- expectedAppIdentifier
- ].splice(0, 1)[0];
-
- isLastCheck = true;
- return applicationManager.checkForApplicationUpdates();
- })
- .catch();
- });
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch()
+ .then(() => {
+ expectedViewToBeLost = currentlyAvailableAppWebViewsForDebugging[
+ expectedAppIdentifier
+ ].splice(0, 1)[0];
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch()
+ .then(() => {
+ expectedAppIdentifier =
+ currentlyAvailableAppsForDebugging[1].appIdentifier;
+ expectedViewToBeLost = currentlyAvailableAppWebViewsForDebugging[
+ expectedAppIdentifier
+ ].splice(0, 1)[0];
+
+ isLastCheck = true;
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch();
+ }),
+ );
- it("emits debuggableViewChanged when view's property is modified (each one except id)", (done: mocha.Done) => {
- currentlyAvailableAppsForDebugging = createAppsAvailableForDebugging(1);
- currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
- currentlyAvailableAppsForDebugging,
- 2,
- );
- const viewToChange =
- currentlyAvailableAppWebViewsForDebugging[
- currentlyAvailableAppsForDebugging[0].appIdentifier
- ][0];
- const expectedView = _.cloneDeep(viewToChange);
- expectedView.title = "new title";
+ it(
+ "emits debuggableViewChanged when view's property is modified (each one except id)",
+ withDone((done) => {
+ currentlyAvailableAppsForDebugging =
+ createAppsAvailableForDebugging(1);
+ currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
+ currentlyAvailableAppsForDebugging,
+ 2,
+ );
+ const viewToChange =
+ currentlyAvailableAppWebViewsForDebugging[
+ currentlyAvailableAppsForDebugging[0].appIdentifier
+ ][0];
+ const expectedView = _.cloneDeep(viewToChange);
+ expectedView.title = "new title";
- applicationManager.on(
- "debuggableViewChanged",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- assert.isTrue(_.isEqual(d, expectedView));
- setTimeout(done, 0);
- },
- );
+ applicationManager.on(
+ "debuggableViewChanged",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ assert.isTrue(_.isEqual(d, expectedView));
+ setTimeout(done, 0);
+ },
+ );
- applicationManager
- .checkForApplicationUpdates()
- .then(() => {
- viewToChange.title = "new title";
- return applicationManager.checkForApplicationUpdates();
- })
- .catch();
- });
+ applicationManager
+ .checkForApplicationUpdates()
+ .then(() => {
+ viewToChange.title = "new title";
+ return applicationManager.checkForApplicationUpdates();
+ })
+ .catch();
+ }),
+ );
- it("does not emit debuggableViewChanged when id is modified", (done: mocha.Done) => {
- currentlyAvailableAppsForDebugging = createAppsAvailableForDebugging(1);
- currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
- currentlyAvailableAppsForDebugging,
- 2,
- );
- const viewToChange =
- currentlyAvailableAppWebViewsForDebugging[
- currentlyAvailableAppsForDebugging[0].appIdentifier
- ][0];
- const expectedView = _.cloneDeep(viewToChange);
-
- applicationManager
- .checkForApplicationUpdates()
- .then(() => {
- applicationManager.on(
- "debuggableViewChanged",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- setTimeout(
- () =>
- done(
- new Error(
- "When id is changed, debuggableViewChanged must not be emitted.",
+ it(
+ "does not emit debuggableViewChanged when id is modified",
+ withDone((done) => {
+ currentlyAvailableAppsForDebugging =
+ createAppsAvailableForDebugging(1);
+ currentlyAvailableAppWebViewsForDebugging = createDebuggableWebViews(
+ currentlyAvailableAppsForDebugging,
+ 2,
+ );
+ const viewToChange =
+ currentlyAvailableAppWebViewsForDebugging[
+ currentlyAvailableAppsForDebugging[0].appIdentifier
+ ][0];
+ const expectedView = _.cloneDeep(viewToChange);
+
+ applicationManager
+ .checkForApplicationUpdates()
+ .then(() => {
+ applicationManager.on(
+ "debuggableViewChanged",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ setTimeout(
+ () =>
+ done(
+ new Error(
+ "When id is changed, debuggableViewChanged must not be emitted.",
+ ),
),
- ),
- 0,
- );
- },
- );
+ 0,
+ );
+ },
+ );
- applicationManager.on(
- "debuggableViewLost",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- assert.isTrue(_.isEqual(d, expectedView));
- },
- );
+ applicationManager.on(
+ "debuggableViewLost",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ assert.isTrue(_.isEqual(d, expectedView));
+ },
+ );
- applicationManager.on(
- "debuggableViewFound",
- (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
- expectedView.id = "new id";
- assert.isTrue(_.isEqual(d, expectedView));
- setTimeout(done, 0);
- },
- );
+ applicationManager.on(
+ "debuggableViewFound",
+ (appIdentifier: string, d: Mobile.IDebugWebViewInfo) => {
+ expectedView.id = "new id";
+ assert.isTrue(_.isEqual(d, expectedView));
+ setTimeout(done, 0);
+ },
+ );
- viewToChange.id = "new id";
- })
- .catch()
- .then(() => applicationManager.checkForApplicationUpdates())
- .catch();
- });
+ viewToChange.id = "new id";
+ })
+ .catch()
+ .then(() => applicationManager.checkForApplicationUpdates())
+ .catch();
+ }),
+ );
});
describe("installed and uninstalled apps", () => {
diff --git a/lib/common/test/unit-tests/mobile/device-log-provider.ts b/lib/common/test/unit-tests/mobile/device-log-provider.ts
index 022524d329..46f6929a90 100644
--- a/lib/common/test/unit-tests/mobile/device-log-provider.ts
+++ b/lib/common/test/unit-tests/mobile/device-log-provider.ts
@@ -71,7 +71,7 @@ const createTestInjector = (): IInjector => {
"..",
"resources",
"device-log-provider-integration-tests",
- pl.toLowerCase()
+ pl.toLowerCase(),
),
frameworkPackageName: `tns-${platform.toLowerCase()}`,
};
@@ -112,7 +112,7 @@ describe("deviceLogProvider", () => {
assert.equal(actualFixed, expectedFixed);
};
- before(async () => {
+ beforeAll(async () => {
testInjector = createTestInjector();
const fs = testInjector.resolve("fs");
const logSourceMapService = testInjector.resolve("logSourceMapService");
@@ -121,7 +121,7 @@ describe("deviceLogProvider", () => {
"..",
"..",
"resources",
- "device-log-provider-integration-tests"
+ "device-log-provider-integration-tests",
);
const files = fs.enumerateFilesInDirectorySync(originalFilesLocation);
for (const file of files) {
@@ -133,7 +133,7 @@ describe("deviceLogProvider", () => {
testInjector.resolve("deviceLogProvider");
deviceLogProvider.setProjectDirForDevice(
"deviceIdentifier",
- "dir_with_runtime_6.1.0"
+ "dir_with_runtime_6.1.0",
);
});
@@ -151,28 +151,28 @@ describe("deviceLogProvider", () => {
}
};
- before(() => {
+ beforeAll(() => {
platform = "android";
deviceLogProvider.setApplicationPidForDevice(deviceIdentifier, "25038");
});
describe("runtime version is below 6.1.0", () => {
- before(() => {
+ beforeAll(() => {
runtimeVersion = "6.0.0";
deviceLogProvider.setProjectDirForDevice(
"deviceIdentifier",
- "dir_with_runtime_6.0.0"
+ "dir_with_runtime_6.0.0",
);
});
describe("SDK 28", () => {
it("console.log", () => {
logDataForAndroid(
- "08-22 15:31:53.189 25038 25038 I JS : HMR: Hot Module Replacement Enabled. Waiting for signal."
+ "08-22 15:31:53.189 25038 25038 I JS : HMR: Hot Module Replacement Enabled. Waiting for signal.",
);
assertData(
logger.output,
- "HMR: Hot Module Replacement Enabled. Waiting for signal.\n"
+ "HMR: Hot Module Replacement Enabled. Waiting for signal.\n",
);
});
@@ -204,7 +204,7 @@ level0_0: {
level0_1: {
"level1_0": "value3"
}
-==== object dump end ====\n`
+==== object dump end ====\n`,
);
});
@@ -218,7 +218,7 @@ level0_1: {
`multiline
message
from
- console.log\n`
+ console.log\n`,
);
});
@@ -234,13 +234,13 @@ level0_1: {
at viewModel.onTap file: app/main-view-model.js:39:0
at push.../node_modules/tns-core-modules/data/observable/observable.js.Observable.notify file: node_modules/tns-core-modules/data/observable/observable.js:107:0
at push.../node_modules/tns-core-modules/data/observable/observable.js.Observable._emit file: node_modules/tns-core-modules/data/observable/observable.js:127:0
-at ClickListenerImpl.onClick file: node_modules/tns-core-modules/ui/button/button.js:29:0\n`
+at ClickListenerImpl.onClick file: node_modules/tns-core-modules/ui/button/button.js:29:0\n`,
);
});
it("console.time(timeEnd) statement", () => {
logDataForAndroid(
- "08-22 15:32:03.145 25038 25038 I JS : console.time: 9603.00ms"
+ "08-22 15:32:03.145 25038 25038 I JS : console.time: 9603.00ms",
);
assertData(logger.output, "console.time: 9603.00ms\n");
});
@@ -298,7 +298,7 @@ at ClickListenerImpl.onClick file: node_modules/tns-core-modules/ui/button/butto
08-22 15:32:03.211 25038 25038 W System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
08-22 15:32:03.211 25038 25038 W System.err: at java.lang.reflect.Method.invoke(Native Method)
08-22 15:32:03.211 25038 25038 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
-08-22 15:32:03.211 25038 25038 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)`
+08-22 15:32:03.211 25038 25038 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)`,
);
assertData(
@@ -330,29 +330,29 @@ System.err: at android.os.Looper.loop(Looper.java:193)
System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
System.err: at java.lang.reflect.Method.invoke(Native Method)
System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
-System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\n`
+System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\n`,
);
});
});
});
describe("runtime version is 6.1.0 or later", () => {
- before(() => {
+ beforeAll(() => {
runtimeVersion = "6.1.0";
deviceLogProvider.setProjectDirForDevice(
"deviceIdentifier",
- "dir_with_runtime_6.1.0"
+ "dir_with_runtime_6.1.0",
);
});
describe("SDK 28", () => {
it("console.log", () => {
logDataForAndroid(
- "08-23 16:15:55.254 25038 25038 I JS : HMR: Hot Module Replacement Enabled. Waiting for signal."
+ "08-23 16:15:55.254 25038 25038 I JS : HMR: Hot Module Replacement Enabled. Waiting for signal.",
);
assertData(
logger.output,
- "HMR: Hot Module Replacement Enabled. Waiting for signal.\n"
+ "HMR: Hot Module Replacement Enabled. Waiting for signal.\n",
);
});
@@ -384,7 +384,7 @@ level0_0: {
level0_1: {
"level1_0": "value3"
}
-==== object dump end ====\n`
+==== object dump end ====\n`,
);
});
@@ -398,7 +398,7 @@ level0_1: {
`multiline
message
from
- console.log\n`
+ console.log\n`,
);
});
@@ -414,13 +414,13 @@ level0_1: {
at viewModel.onTap (file: app/main-view-model.js:39:0)
at push.../node_modules/tns-core-modules/data/observable/observable.js.Observable.notify (file: node_modules/tns-core-modules/data/observable/observable.js:107:0)
at push.../node_modules/tns-core-modules/data/observable/observable.js.Observable._emit (file: node_modules/tns-core-modules/data/observable/observable.js:127:0)
-at ClickListenerImpl.onClick (file: node_modules/tns-core-modules/ui/button/button.js:29:0)\n`
+at ClickListenerImpl.onClick (file: node_modules/tns-core-modules/ui/button/button.js:29:0)\n`,
);
});
it("console.time(timeEnd) statement", () => {
logDataForAndroid(
- "08-23 16:16:06.571 25038 25038 I JS : console.time: 9510.00ms"
+ "08-23 16:16:06.571 25038 25038 I JS : console.time: 9510.00ms",
);
assertData(logger.output, "console.time: 9510.00ms\n");
});
@@ -478,7 +478,7 @@ at ClickListenerImpl.onClick (file: node_modules/tns-core-modules/ui/button/butt
08-23 16:16:06.799 25038 25038 W System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
08-23 16:16:06.799 25038 25038 W System.err: at java.lang.reflect.Method.invoke(Native Method)
08-23 16:16:06.799 25038 25038 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
-08-23 16:16:06.799 25038 25038 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)`
+08-23 16:16:06.799 25038 25038 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)`,
);
assertData(
@@ -510,7 +510,7 @@ System.err: at android.os.Looper.loop(Looper.java:193)
System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
System.err: at java.lang.reflect.Method.invoke(Native Method)
System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
-System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\n`
+System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\n`,
);
});
});
@@ -518,11 +518,11 @@ System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\n`
});
describe("iOS", () => {
- before(() => {
+ beforeAll(() => {
platform = "ios";
deviceLogProvider.setProjectNameForDevice(
deviceIdentifier,
- "appTestLogs"
+ "appTestLogs",
);
});
@@ -531,11 +531,11 @@ System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\n`
};
describe("runtime version is below 6.1.0", () => {
- before(() => {
+ beforeAll(() => {
runtimeVersion = "6.0.0";
deviceLogProvider.setProjectDirForDevice(
"deviceIdentifier",
- "dir_with_runtime_6.0.0"
+ "dir_with_runtime_6.0.0",
);
});
@@ -543,12 +543,12 @@ System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\n`
describe("simulator output", () => {
it("console.log", () => {
logDataForiOS(
- "Aug 23 14:38:54 mcsofvladimirov appTestLogs[8455]: CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal."
+ "Aug 23 14:38:54 mcsofvladimirov appTestLogs[8455]: CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal.",
);
assertData(
logger.output,
- "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0 HMR: Hot Module Replacement Enabled. Waiting for signal.\n"
+ "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0 HMR: Hot Module Replacement Enabled. Waiting for signal.\n",
);
});
@@ -567,11 +567,11 @@ level0_1: {
}
==== object dump end ====`;
logDataForiOS(
- `Aug 23 14:38:58 mcsofvladimirov appTestLogs[8455]: CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`
+ `Aug 23 14:38:58 mcsofvladimirov appTestLogs[8455]: CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`,
);
assertData(
logger.output,
- `CONSOLE LOG file: app/main-view-model.js:20:0\n${dump}\n`
+ `CONSOLE LOG file: app/main-view-model.js:20:0\n${dump}\n`,
);
});
@@ -582,7 +582,7 @@ level0_1: {
`\tmessage`,
`\sfrom`,
`\t\sconsole.log`,
- ].join("\n")
+ ].join("\n"),
);
assertData(
logger.output,
@@ -591,7 +591,7 @@ level0_1: {
`\tmessage`,
`\sfrom`,
`\t\sconsole.log\n`,
- ].join("\n")
+ ].join("\n"),
);
});
@@ -631,17 +631,17 @@ level0_1: {
13 anonymous@file:///app/bundle.js:2:61
14 evaluate@[native code]
15 moduleEvaluation@:1:11
-16 promiseReactionJob@:1:11\n`
+16 promiseReactionJob@:1:11\n`,
);
});
it("console.time(timeEnd) statement", () => {
logDataForiOS(
- `file:///app/main-view-model.js:41:0 CONSOLE INFO console.time: 3152.344ms`
+ `file:///app/main-view-model.js:41:0 CONSOLE INFO console.time: 3152.344ms`,
);
assertData(
logger.output,
- "file:///app/main-view-model.js:41:0 CONSOLE INFO console.time: 3152.344ms\n"
+ "file:///app/main-view-model.js:41:0 CONSOLE INFO console.time: 3152.344ms\n",
);
});
@@ -810,7 +810,7 @@ JS Stack:
9 anonymous@file:///app/bundle.js:2:61
10 evaluate@[native code]
11 moduleEvaluation@:1:11
- 12 promiseReactionJob@:1:11\n`
+ 12 promiseReactionJob@:1:11\n`,
);
});
});
@@ -820,12 +820,12 @@ JS Stack:
describe("simulator output", () => {
it("console.log", () => {
logDataForiOS(
- "2019-08-22 18:21:24.066975+0300 localhost appTestLogs[55619]: (NativeScript) CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal."
+ "2019-08-22 18:21:24.066975+0300 localhost appTestLogs[55619]: (NativeScript) CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal.",
);
assertData(
logger.output,
- "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0 HMR: Hot Module Replacement Enabled. Waiting for signal.\n"
+ "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0 HMR: Hot Module Replacement Enabled. Waiting for signal.\n",
);
});
@@ -844,11 +844,11 @@ level0_1: {
}
==== object dump end ====`;
logDataForiOS(
- `2019-08-22 18:21:26.133151+0300 localhost appTestLogs[55619]: (NativeScript) CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`
+ `2019-08-22 18:21:26.133151+0300 localhost appTestLogs[55619]: (NativeScript) CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`,
);
assertData(
logger.output,
- `CONSOLE LOG file: app/main-view-model.js:20:0\n${dump}\n`
+ `CONSOLE LOG file: app/main-view-model.js:20:0\n${dump}\n`,
);
});
@@ -859,7 +859,7 @@ level0_1: {
`message`,
` from`,
`console.log`,
- ].join("\n")
+ ].join("\n"),
);
assertData(
logger.output,
@@ -868,7 +868,7 @@ level0_1: {
`message`,
` from`,
`console.log\n`,
- ].join("\n")
+ ].join("\n"),
);
});
@@ -908,17 +908,17 @@ level0_1: {
13 anonymous@file:///app/bundle.js:2:61
14 evaluate@[native code]
15 moduleEvaluation@:1:11
-16 promiseReactionJob@:1:11\n`
+16 promiseReactionJob@:1:11\n`,
);
});
it("console.time(timeEnd) statement", () => {
logDataForiOS(
- `2019-08-22 18:21:26.133972+0300 localhost appTestLogs[55619]: (NativeScript) file:///app/bundle.js:291:24: CONSOLE INFO console.time: 1988.737ms`
+ `2019-08-22 18:21:26.133972+0300 localhost appTestLogs[55619]: (NativeScript) file:///app/bundle.js:291:24: CONSOLE INFO console.time: 1988.737ms`,
);
assertData(
logger.output,
- "file: app/main-view-model.js:41:0 CONSOLE INFO console.time: 1988.737ms\n"
+ "file: app/main-view-model.js:41:0 CONSOLE INFO console.time: 1988.737ms\n",
);
});
@@ -1093,7 +1093,7 @@ JS Stack:
9 anonymous@file:///app/bundle.js:2:61
10 evaluate@[native code]
11 moduleEvaluation@:1:11
-12 promiseReactionJob@:1:11\n`
+12 promiseReactionJob@:1:11\n`,
);
});
});
@@ -1101,12 +1101,12 @@ JS Stack:
});
describe("runtime version is 6.1.0 or later", () => {
- before(() => {
+ beforeAll(() => {
runtimeVersion = "6.1.0";
// set this, so the caching in logSourceMapService will detect correct runtime
deviceLogProvider.setProjectDirForDevice(
"deviceIdentifier",
- "dir_with_runtime_6.1.0"
+ "dir_with_runtime_6.1.0",
);
});
@@ -1114,12 +1114,12 @@ JS Stack:
describe("simulator output", () => {
it("console.log", () => {
logDataForiOS(
- "Aug 23 18:12:39 mcsofvladimirov appTestLogs[29554]: (NativeScript) CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal."
+ "Aug 23 18:12:39 mcsofvladimirov appTestLogs[29554]: (NativeScript) CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal.",
);
assertData(
logger.output,
- "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0: HMR: Hot Module Replacement Enabled. Waiting for signal.\n"
+ "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0: HMR: Hot Module Replacement Enabled. Waiting for signal.\n",
);
});
@@ -1138,11 +1138,11 @@ level0_1: {
}
==== object dump end ====`;
logDataForiOS(
- `Aug 23 18:12:39 mcsofvladimirov appTestLogs[29554]: CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`
+ `Aug 23 18:12:39 mcsofvladimirov appTestLogs[29554]: CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`,
);
assertData(
logger.output,
- `CONSOLE LOG file: app/main-view-model.js:20:0:\n${dump}\n`
+ `CONSOLE LOG file: app/main-view-model.js:20:0:\n${dump}\n`,
);
});
@@ -1153,7 +1153,7 @@ level0_1: {
`message`,
` from`,
`console.log`,
- ].join("\n")
+ ].join("\n"),
);
assertData(
logger.output,
@@ -1162,7 +1162,7 @@ level0_1: {
`message`,
` from`,
`console.log\n`,
- ].join("\n")
+ ].join("\n"),
);
});
@@ -1202,17 +1202,17 @@ at webpackJsonpCallback(file: app/webpack/bootstrap:30:0)
at anonymous(file:///app/bundle.js:2:61)
at evaluate([native code])
at moduleEvaluation
-at promiseReactionJob\n`
+at promiseReactionJob\n`,
);
});
it("console.time(timeEnd) statement", () => {
logDataForiOS(
- `Aug 23 18:12:39 mcsofvladimirov appTestLogs[29554]: file:///app/bundle.js:291:24: CONSOLE INFO console.time: 27523.877ms`
+ `Aug 23 18:12:39 mcsofvladimirov appTestLogs[29554]: file:///app/bundle.js:291:24: CONSOLE INFO console.time: 27523.877ms`,
);
assertData(
logger.output,
- "file: app/main-view-model.js:41:0: CONSOLE INFO console.time: 27523.877ms\n"
+ "file: app/main-view-model.js:41:0: CONSOLE INFO console.time: 27523.877ms\n",
);
});
@@ -1381,7 +1381,7 @@ UIApplicationMain([native code])
at anonymous(file:///app/bundle.js:2:61)
at evaluate([native code])
at moduleEvaluation
- at promiseReactionJob\n`
+ at promiseReactionJob\n`,
);
});
});
@@ -1391,12 +1391,12 @@ UIApplicationMain([native code])
describe("simulator output", () => {
it("console.log", () => {
logDataForiOS(
- "2019-08-23 17:08:38.860441+0300 localhost appTestLogs[21053]: (NativeScript) CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal."
+ "2019-08-23 17:08:38.860441+0300 localhost appTestLogs[21053]: (NativeScript) CONSOLE INFO file:///app/vendor.js:168:36: HMR: Hot Module Replacement Enabled. Waiting for signal.",
);
assertData(
logger.output,
- "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0: HMR: Hot Module Replacement Enabled. Waiting for signal.\n"
+ "CONSOLE INFO file: node_modules/nativescript-dev-webpack/hot.js:3:0: HMR: Hot Module Replacement Enabled. Waiting for signal.\n",
);
});
@@ -1415,11 +1415,11 @@ level0_1: {
}
==== object dump end ====`;
logDataForiOS(
- `2019-08-23 17:08:45.217971+0300 localhost appTestLogs[21053]: (NativeScript) CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`
+ `2019-08-23 17:08:45.217971+0300 localhost appTestLogs[21053]: (NativeScript) CONSOLE LOG file:///app/bundle.js:270:20:\n${dump}`,
);
assertData(
logger.output,
- `CONSOLE LOG file: app/main-view-model.js:20:0:\n${dump}\n`
+ `CONSOLE LOG file: app/main-view-model.js:20:0:\n${dump}\n`,
);
});
@@ -1430,7 +1430,7 @@ level0_1: {
`message`,
` from`,
`console.log`,
- ].join("\n")
+ ].join("\n"),
);
assertData(
logger.output,
@@ -1439,7 +1439,7 @@ level0_1: {
`message`,
` from`,
`console.log\n`,
- ].join("\n")
+ ].join("\n"),
);
});
@@ -1479,17 +1479,17 @@ at webpackJsonpCallback(file: app/webpack/bootstrap:30:0)
at anonymous(file:///app/bundle.js:2:61)
at evaluate([native code])
at moduleEvaluation
-at promiseReactionJob\n`
+at promiseReactionJob\n`,
);
});
it("console.time(timeEnd) statement", () => {
logDataForiOS(
- `2019-08-23 17:08:45.219341+0300 localhost appTestLogs[21053]: (NativeScript) file:///app/bundle.js:291:24: CONSOLE INFO console.time: 6285.199ms`
+ `2019-08-23 17:08:45.219341+0300 localhost appTestLogs[21053]: (NativeScript) file:///app/bundle.js:291:24: CONSOLE INFO console.time: 6285.199ms`,
);
assertData(
logger.output,
- "file: app/main-view-model.js:41:0: CONSOLE INFO console.time: 6285.199ms\n"
+ "file: app/main-view-model.js:41:0: CONSOLE INFO console.time: 6285.199ms\n",
);
});
@@ -1663,7 +1663,7 @@ at webpackJsonpCallback(file: app/webpack/bootstrap:30:0)
at anonymous(file:///app/bundle.js:2:61)
at evaluate([native code])
at moduleEvaluation
-at promiseReactionJob\n`
+at promiseReactionJob\n`,
);
});
});
diff --git a/lib/common/test/unit-tests/mobile/devices-service.ts b/lib/common/test/unit-tests/mobile/devices-service.ts
index d620079456..ae319ce0b9 100644
--- a/lib/common/test/unit-tests/mobile/devices-service.ts
+++ b/lib/common/test/unit-tests/mobile/devices-service.ts
@@ -1,3 +1,4 @@
+import { withDone } from "../../with-done";
import { DevicesService } from "../../../mobile/mobile-core/devices-service";
import { Yok } from "../../../yok";
import {
@@ -460,73 +461,85 @@ describe("devicesService", () => {
platform: "android",
};
- it(`emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND} event when new Android Emulator image is found`, (done: mocha.Done) => {
- const androidEmulatorDiscovery =
- testInjector.resolve(
- "androidEmulatorDiscovery",
+ it(
+ `emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND} event when new Android Emulator image is found`,
+ withDone((done) => {
+ const androidEmulatorDiscovery =
+ testInjector.resolve(
+ "androidEmulatorDiscovery",
+ );
+ devicesService.on(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
+ (emulatorImage: Mobile.IDeviceInfo) => {
+ assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
+ done();
+ },
);
- devicesService.on(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
- (emulatorImage: Mobile.IDeviceInfo) => {
- assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
- done();
- },
- );
- androidEmulatorDiscovery.emit(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
- emulatorDataToEmit,
- );
- });
+ androidEmulatorDiscovery.emit(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
+ emulatorDataToEmit,
+ );
+ }),
+ );
- it(`emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND} when new iOS Simulator image is found`, (done: mocha.Done) => {
- devicesService.on(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
- (emulatorImage: Mobile.IDeviceInfo) => {
- assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
- done();
- },
- );
+ it(
+ `emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND} when new iOS Simulator image is found`,
+ withDone((done) => {
+ devicesService.on(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
+ (emulatorImage: Mobile.IDeviceInfo) => {
+ assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
+ done();
+ },
+ );
- iOSSimulatorDiscovery.emit(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
- emulatorDataToEmit,
- );
- });
+ iOSSimulatorDiscovery.emit(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND,
+ emulatorDataToEmit,
+ );
+ }),
+ );
- it(`emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST} event when new Android Emulator image is deleted`, (done: mocha.Done) => {
- const androidEmulatorDiscovery =
- testInjector.resolve(
- "androidEmulatorDiscovery",
+ it(
+ `emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST} event when new Android Emulator image is deleted`,
+ withDone((done) => {
+ const androidEmulatorDiscovery =
+ testInjector.resolve(
+ "androidEmulatorDiscovery",
+ );
+ devicesService.on(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
+ (emulatorImage: Mobile.IDeviceInfo) => {
+ assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
+ done();
+ },
);
- devicesService.on(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
- (emulatorImage: Mobile.IDeviceInfo) => {
- assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
- done();
- },
- );
- androidEmulatorDiscovery.emit(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
- emulatorDataToEmit,
- );
- });
+ androidEmulatorDiscovery.emit(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
+ emulatorDataToEmit,
+ );
+ }),
+ );
- it(`emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST} when iOS Simulator image is deleted`, (done: mocha.Done) => {
- devicesService.on(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
- (emulatorImage: Mobile.IDeviceInfo) => {
- assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
- done();
- },
- );
+ it(
+ `emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST} when iOS Simulator image is deleted`,
+ withDone((done) => {
+ devicesService.on(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
+ (emulatorImage: Mobile.IDeviceInfo) => {
+ assert.deepStrictEqual(emulatorImage, emulatorDataToEmit);
+ done();
+ },
+ );
- iOSSimulatorDiscovery.emit(
- EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
- emulatorDataToEmit,
- );
- });
+ iOSSimulatorDiscovery.emit(
+ EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST,
+ emulatorDataToEmit,
+ );
+ }),
+ );
});
describe("startEmulatorIfNecessary behaves as expected:", () => {
@@ -3102,7 +3115,7 @@ describe("devicesService", () => {
helpers.isInteractive = originalIsInteractive;
});
- after(() => {
+ afterAll(() => {
helpers.isInteractive = originalIsInteractive;
});
diff --git a/lib/common/test/unit-tests/services/settings-service.ts b/lib/common/test/unit-tests/services/settings-service.ts
index e072aea99f..a94a2cf2f0 100644
--- a/lib/common/test/unit-tests/services/settings-service.ts
+++ b/lib/common/test/unit-tests/services/settings-service.ts
@@ -27,14 +27,14 @@ describe("settingsService", () => {
const appDataEnv = "appData";
const profileDirName = "profileDir";
- before(() => {
+ beforeAll(() => {
// @ts-expect-error
os.homedir = () => osHomedir;
path.resolve = (p: string) => p;
process.env.AppData = appDataEnv;
});
- after(() => {
+ afterAll(() => {
// @ts-expect-error
os.homedir = originalOsHomedir;
path.resolve = originalPathResolve;
@@ -59,7 +59,7 @@ describe("settingsService", () => {
};
const getExpectedProfileDir = (
- opts: { isWindows: boolean } = { isWindows: true }
+ opts: { isWindows: boolean } = { isWindows: true },
) => {
const defaultProfileDirLocation = opts.isWindows
? appDataEnv
@@ -74,9 +74,8 @@ describe("settingsService", () => {
const hostInfo = testInjector.resolve("hostInfo");
hostInfo.isWindows = isWindows;
- const settingsService = testInjector.resolve(
- SettingsService
- );
+ const settingsService =
+ testInjector.resolve(SettingsService);
const actualProfileDir = settingsService.getProfileDir();
const expectedProfileDir = getExpectedProfileDir({ isWindows });
assert.equal(actualProfileDir, expectedProfileDir);
@@ -122,21 +121,19 @@ describe("settingsService", () => {
_.each(testData, (testCase) => {
it(testCase.testName, () => {
const testInjector = createTestInjector();
- const staticConfig = testInjector.resolve(
- "staticConfig"
- );
+ const staticConfig =
+ testInjector.resolve("staticConfig");
staticConfig.USER_AGENT_NAME = defaultUserAgentName;
- const settingsService = testInjector.resolve(
- SettingsService
- );
+ const settingsService =
+ testInjector.resolve(SettingsService);
settingsService.setSettings(testCase.dataPassedToSetSettings);
const actualProfileDir = settingsService.getProfileDir();
assert.equal(actualProfileDir, testCase.expectedProfileDir);
assert.equal(
staticConfig.USER_AGENT_NAME,
- testCase.expectedUserAgentName
+ testCase.expectedUserAgentName,
);
});
});
diff --git a/lib/common/test/with-done.ts b/lib/common/test/with-done.ts
new file mode 100644
index 0000000000..b8bd29a8a2
--- /dev/null
+++ b/lib/common/test/with-done.ts
@@ -0,0 +1,15 @@
+export type DoneCallback = (err?: any) => void;
+
+/**
+ * Adapts a callback-style test to the promise form the runner expects. Useful
+ * for tests driven by an event emitter, where the assertion happens inside a
+ * listener rather than in the test body.
+ */
+export function withDone(
+ body: (done: DoneCallback) => void,
+): () => Promise {
+ return () =>
+ new Promise((resolve, reject) => {
+ body((err?: any) => (err ? reject(err) : resolve()));
+ });
+}
diff --git a/package-lock.json b/package-lock.json
index c2d6ace408..4fe752c4e1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -110,11 +110,10 @@
"conventional-changelog-cli": "^5.0.0",
"fast-check": "3.23.2",
"husky": "9.1.7",
- "istanbul": "0.4.5",
"lint-staged": "~15.5.2",
- "mocha": "11.7.5",
"sinon": "19.0.5",
"source-map-support": "0.5.21",
+ "vitest": "^4.1.10",
"xml2js": ">=0.5.0"
},
"engines": {
@@ -198,6 +197,40 @@
"node": ">=12"
}
},
+ "node_modules/@emnapi/core": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
+ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.2",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
+ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@foxt/js-srp": {
"version": "0.0.3-patch2",
"resolved": "https://registry.npmjs.org/@foxt/js-srp/-/js-srp-0.0.3-patch2.tgz",
@@ -816,6 +849,25 @@
"integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
"license": "MIT"
},
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
+ "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.3"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
"node_modules/@nativescript/doctor": {
"version": "2.0.17",
"resolved": "https://registry.npmjs.org/@nativescript/doctor/-/doctor-2.0.17.tgz",
@@ -1210,15 +1262,14 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "node_modules/@oxc-project/types": {
+ "version": "0.139.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
+ "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
"dev": true,
"license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=14"
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
}
},
"node_modules/@prettier/plugin-xml": {
@@ -1237,6 +1288,270 @@
"integrity": "sha512-/JqGCvHpj0PxS9cyZPP5LpiEy1pYszgWor/JTyreHQwLPQQdxO1mUYTtRribYcVosxH7FFs0GJBtJ652nlwKyw==",
"license": "MIT"
},
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
+ "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
+ "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
+ "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
+ "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
+ "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
+ "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
+ "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
+ "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
+ "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
+ "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
+ "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
+ "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
+ "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.11.1",
+ "@emnapi/runtime": "1.11.1",
+ "@napi-rs/wasm-runtime": "^1.1.6"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
+ "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
+ "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@sigstore/bundle": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz",
@@ -1419,6 +1734,13 @@
"dev": true,
"license": "(Unlicense OR Apache-2.0)"
},
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@tokenizer/token": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
@@ -1518,6 +1840,17 @@
"node": "^20.17.0 || >=22.9.0"
}
},
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
+ "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@types/byline": {
"version": "4.2.36",
"resolved": "https://registry.npmjs.org/@types/byline/-/byline-4.2.36.tgz",
@@ -1607,6 +1940,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/fs-extra": {
"version": "8.1.5",
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz",
@@ -1953,56 +2293,172 @@
"@types/node": "*"
}
},
- "node_modules/@xml-tools/parser": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz",
- "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==",
- "license": "Apache-2.0",
+ "node_modules/@vitest/expect": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz",
+ "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "chevrotain": "7.1.1"
+ "@standard-schema/spec": "^1.1.0",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "chai": "^6.2.2",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/@xmldom/xmldom": {
- "version": "0.8.11",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
- "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "node_modules/@vitest/expect/node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18"
}
},
- "node_modules/abbrev": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
- "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==",
+ "node_modules/@vitest/mocker": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz",
+ "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==",
"dev": true,
- "license": "ISC"
- },
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"license": "MIT",
"dependencies": {
- "event-target-shim": "^5.0.0"
+ "@vitest/spy": "4.1.10",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21"
},
- "engines": {
- "node": ">=6.5"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
}
},
- "node_modules/acorn": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
- "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "node_modules/@vitest/pretty-format": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz",
+ "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==",
+ "dev": true,
"license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
+ "dependencies": {
+ "tinyrainbow": "^3.1.0"
},
- "engines": {
- "node": ">=0.4.0"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/acorn-walk": {
+ "node_modules/@vitest/runner": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz",
+ "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "4.1.10",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz",
+ "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "magic-string": "^0.30.21",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz",
+ "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
+ "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@xml-tools/parser": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz",
+ "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "chevrotain": "7.1.1"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
"version": "8.3.5",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
"integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
@@ -2030,17 +2486,6 @@
"node": ">= 14"
}
},
- "node_modules/amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
- "dev": true,
- "license": "BSD-3-Clause OR MIT",
- "optional": true,
- "engines": {
- "node": ">=0.4.2"
- }
- },
"node_modules/ansi-escapes": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz",
@@ -2114,16 +2559,6 @@
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"license": "MIT"
},
- "node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
"node_modules/array-ify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
@@ -2353,13 +2788,6 @@
"node": ">=8"
}
},
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -2469,19 +2897,6 @@
"node": ">= 0.4"
}
},
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/chai": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
@@ -3280,19 +3695,6 @@
}
}
},
- "node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/deep-eql": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
@@ -3303,13 +3705,6 @@
"node": ">=6"
}
},
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/defaults": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
@@ -3340,6 +3735,16 @@
"node": ">=0.4.0"
}
},
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/detect-newline": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
@@ -3385,13 +3790,6 @@
"node": ">= 0.4"
}
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/email-validator": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz",
@@ -3469,6 +3867,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/es-module-lexer": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz",
+ "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
@@ -3505,69 +3910,6 @@
"node": ">=6"
}
},
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/escodegen": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esprima": "^2.7.1",
- "estraverse": "^1.9.1",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=0.12.0"
- },
- "optionalDependencies": {
- "source-map": "~0.2.0"
- }
- },
- "node_modules/escodegen/node_modules/esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/escodegen/node_modules/source-map": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "amdefine": ">=0.0.4"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -3581,23 +3923,14 @@
"node": ">=4"
}
},
- "node_modules/estraverse": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
}
},
"node_modules/event-target-shim": {
@@ -3709,6 +4042,16 @@
"resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
"integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
},
+ "node_modules/expect-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
+ "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/exponential-backoff": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
@@ -3754,13 +4097,6 @@
"node": ">=8.6.0"
}
},
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/fastq": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
@@ -3799,23 +4135,6 @@
"node": ">=8"
}
},
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/find-up-simple": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
@@ -3829,16 +4148,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "bin": {
- "flat": "cli.js"
- }
- },
"node_modules/flatted": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
@@ -4198,16 +4507,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
@@ -4247,16 +4546,6 @@
"node": ">= 0.4"
}
},
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "he": "bin/he"
- }
- },
"node_modules/highlight.js": {
"version": "10.7.3",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
@@ -4405,18 +4694,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@@ -4760,26 +5037,6 @@
"node": ">=8"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@@ -4825,163 +5082,20 @@
"node": ">=20"
}
},
- "node_modules/istanbul": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
- "integrity": "sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==",
- "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.",
+ "node_modules/jackspeak": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
+ "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "abbrev": "1.0.x",
- "async": "1.x",
- "escodegen": "1.8.x",
- "esprima": "2.7.x",
- "glob": "^5.0.15",
- "handlebars": "^4.0.1",
- "js-yaml": "3.x",
- "mkdirp": "0.5.x",
- "nopt": "3.x",
- "once": "1.x",
- "resolve": "1.1.x",
- "supports-color": "^3.1.0",
- "which": "^1.1.1",
- "wordwrap": "^1.0.0"
+ "@isaacs/cliui": "^9.0.0"
},
- "bin": {
- "istanbul": "lib/cli.js"
- }
- },
- "node_modules/istanbul/node_modules/async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/istanbul/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/istanbul/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/istanbul/node_modules/esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/istanbul/node_modules/glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/istanbul/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/istanbul/node_modules/minimatch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
- "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/istanbul/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/istanbul/node_modules/nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/istanbul/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/jackspeak": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
- "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/cliui": "^9.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/jimp": {
@@ -5035,20 +5149,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/js-yaml": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
- "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
"node_modules/json-parse-even-better-errors": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz",
@@ -5116,18 +5216,265 @@
"node": ">=6"
}
},
- "node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
"dev": true,
- "license": "MIT",
+ "license": "MPL-2.0",
"dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
+ "detect-libc": "^2.0.3"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
"node_modules/lilconfig": {
@@ -5261,22 +5608,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/lodash": {
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
@@ -5499,6 +5830,16 @@
"node": "20 || >=22"
}
},
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
"node_modules/make-error": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
@@ -5712,448 +6053,140 @@
"minipass": "^7.0.3"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/minipass-fetch": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz",
- "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==",
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.0.3",
- "minipass-sized": "^2.0.0",
- "minizlib": "^3.0.1"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- },
- "optionalDependencies": {
- "iconv-lite": "^0.7.2"
- }
- },
- "node_modules/minipass-fetch/node_modules/iconv-lite": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
- "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minipass-flush/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-flush/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "license": "ISC"
- },
- "node_modules/minipass-pipeline": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
- "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-pipeline/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-pipeline/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "license": "ISC"
- },
- "node_modules/minipass-sized": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz",
- "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==",
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/mkdirp": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
- "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
- "license": "MIT",
- "bin": {
- "mkdirp": "dist/cjs/src/bin.js"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/mocha": {
- "version": "11.7.5",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz",
- "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "browser-stdout": "^1.3.1",
- "chokidar": "^4.0.1",
- "debug": "^4.3.5",
- "diff": "^7.0.0",
- "escape-string-regexp": "^4.0.0",
- "find-up": "^5.0.0",
- "glob": "^10.4.5",
- "he": "^1.2.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "log-symbols": "^4.1.0",
- "minimatch": "^9.0.5",
- "ms": "^2.1.3",
- "picocolors": "^1.1.1",
- "serialize-javascript": "^6.0.2",
- "strip-json-comments": "^3.1.1",
- "supports-color": "^8.1.1",
- "workerpool": "^9.2.0",
- "yargs": "^17.7.2",
- "yargs-parser": "^21.1.1",
- "yargs-unparser": "^2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/mocha/node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mocha/node_modules/ansi-styles": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
- "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/mocha/node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/mocha/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mocha/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/mocha/node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^4.0.1"
- },
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/mocha/node_modules/diff": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
- "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/mocha/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mocha/node_modules/glob": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
- "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/mocha/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/mocha/node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
+ "node_modules/minipass-fetch": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz",
+ "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==",
+ "license": "MIT",
"dependencies": {
- "@isaacs/cliui": "^8.0.2"
+ "minipass": "^7.0.3",
+ "minipass-sized": "^2.0.0",
+ "minizlib": "^3.0.1"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
},
"optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
+ "iconv-lite": "^0.7.2"
}
},
- "node_modules/mocha/node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
- "dev": true,
+ "node_modules/minipass-fetch/node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
"license": "MIT",
+ "optional": true,
"dependencies": {
- "argparse": "^2.0.1"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/mocha/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/mocha/node_modules/minimatch": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
- "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
- "dev": true,
+ "node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
"license": "ISC",
"dependencies": {
- "brace-expansion": "^2.0.2"
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">= 8"
}
},
- "node_modules/mocha/node_modules/path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
- "dev": true,
- "license": "BlueOak-1.0.0",
+ "node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
"dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/mocha/node_modules/readdirp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
- "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14.18.0"
+ "node_modules/minipass-flush/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
},
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/mocha/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "license": "MIT",
+ "node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
"dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/mocha/node_modules/strip-ansi": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
- "dev": true,
- "license": "MIT",
+ "node_modules/minipass-pipeline/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/minipass-sized": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz",
+ "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==",
+ "license": "ISC",
"dependencies": {
- "ansi-regex": "^6.2.2"
+ "minipass": "^7.1.2"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "node": ">=8"
}
},
- "node_modules/mocha/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "minipass": "^7.1.2"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "node": ">= 18"
}
},
- "node_modules/mocha/node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
},
"engines": {
- "node": ">=12"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/ms": {
@@ -6183,6 +6216,25 @@
"thenify-all": "^1.0.0"
}
},
+ "node_modules/nanoid": {
+ "version": "3.3.16",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
+ "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
"node_modules/nativescript-dev-xcode": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/nativescript-dev-xcode/-/nativescript-dev-xcode-0.8.2.tgz",
@@ -6505,6 +6557,20 @@
"node": ">=0.10.0"
}
},
+ "node_modules/obug": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
+ "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
"node_modules/omggif": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
@@ -6553,24 +6619,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/ora": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
@@ -6689,38 +6737,6 @@
"node": ">=4"
}
},
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/p-map": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
@@ -6876,16 +6892,6 @@
"node": ">=8"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -6922,6 +6928,13 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/pathval": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
@@ -7062,6 +7075,35 @@
"node": ">=14.19.0"
}
},
+ "node_modules/postcss": {
+ "version": "8.5.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz",
+ "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.16",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
"node_modules/postcss-selector-parser": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
@@ -7075,15 +7117,6 @@
"node": ">=4"
}
},
- "node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/prettier": {
"version": "3.7.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.3.tgz",
@@ -7293,16 +7326,6 @@
],
"license": "MIT"
},
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
"node_modules/read-cmd-shim": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-6.0.0.tgz",
@@ -7802,6 +7825,40 @@
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"license": "MIT"
},
+ "node_modules/rolldown": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
+ "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.139.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.1.5",
+ "@rolldown/binding-darwin-arm64": "1.1.5",
+ "@rolldown/binding-darwin-x64": "1.1.5",
+ "@rolldown/binding-freebsd-x64": "1.1.5",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
+ "@rolldown/binding-linux-arm64-gnu": "1.1.5",
+ "@rolldown/binding-linux-arm64-musl": "1.1.5",
+ "@rolldown/binding-linux-ppc64-gnu": "1.1.5",
+ "@rolldown/binding-linux-s390x-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-musl": "1.1.5",
+ "@rolldown/binding-openharmony-arm64": "1.1.5",
+ "@rolldown/binding-wasm32-wasi": "1.1.5",
+ "@rolldown/binding-win32-arm64-msvc": "1.1.5",
+ "@rolldown/binding-win32-x64-msvc": "1.1.5"
+ }
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -7873,16 +7930,6 @@
"node": ">=10"
}
},
- "node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -8012,6 +8059,13 @@
"node": ">=6"
}
},
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -8215,6 +8269,16 @@
"node": ">= 12"
}
},
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
@@ -8280,13 +8344,6 @@
"integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
"license": "CC0-1.0"
},
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
"node_modules/ssri": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz",
@@ -8299,6 +8356,20 @@
"node": "^20.17.0 || >=22.9.0"
}
},
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/std-env": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
+ "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/stream-buffers": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
@@ -8387,22 +8458,6 @@
"node": ">=8"
}
},
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -8415,30 +8470,6 @@
"node": ">=8"
}
},
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-ansi/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -8470,19 +8501,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/strtok3": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz",
@@ -8500,19 +8518,6 @@
"url": "https://github.com/sponsors/Borewit"
}
},
- "node_modules/supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^1.0.0"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/supports-hyperlinks": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz",
@@ -8613,20 +8618,37 @@
"node": ">=0.8"
}
},
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/tinycolor2": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
"license": "MIT"
},
+ "node_modules/tinyexec": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
+ "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
- "picomatch": "^4.0.3"
+ "picomatch": "^4.0.4"
},
"engines": {
"node": ">=12.0.0"
@@ -8653,9 +8675,9 @@
}
},
"node_modules/tinyglobby/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -8664,6 +8686,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/tinyrainbow": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
+ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/tmp": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
@@ -8811,19 +8843,6 @@
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
}
},
- "node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
@@ -9024,6 +9043,200 @@
"node": "^20.17.0 || >=22.9.0"
}
},
+ "node_modules/vite": {
+ "version": "8.1.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz",
+ "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.17",
+ "rolldown": "~1.1.5",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.3.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
+ "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "4.1.10",
+ "@vitest/mocker": "4.1.10",
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/runner": "4.1.10",
+ "@vitest/snapshot": "4.1.10",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.10",
+ "@vitest/browser-preview": "4.1.10",
+ "@vitest/browser-webdriverio": "4.1.10",
+ "@vitest/coverage-istanbul": "4.1.10",
+ "@vitest/coverage-v8": "4.1.10",
+ "@vitest/ui": "4.1.10",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/walk-up-path": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz",
@@ -9063,22 +9276,29 @@
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
"license": "ISC"
},
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/winreg": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.5.tgz",
"integrity": "sha512-uf7tHf+tw0B1y+x+mKTLHkykBgK2KMs3g+KlzmyMbLvICSHQyB/xOFjTT8qZ3oeTFyU7Bbj4FzXitGG6jvKhYw==",
"license": "BSD-2-Clause"
},
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -9086,13 +9306,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/workerpool": {
- "version": "9.3.4",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz",
- "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -9110,25 +9323,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -9299,22 +9493,6 @@
"node": ">=12"
}
},
- "node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/yauzl": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz",
@@ -9355,19 +9533,6 @@
"node": ">=6"
}
},
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/zod": {
"version": "3.25.76",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
diff --git a/package.json b/package.json
index 23cf047ba4..5470141978 100644
--- a/package.json
+++ b/package.json
@@ -20,14 +20,13 @@
"build.all": "npm test",
"dev": "tsc --watch",
"setup": "npm i --ignore-scripts && npx husky",
- "test": "npm run build && mocha --config=test/.mocharc.yml",
+ "test": "npm run build && vitest run",
"postinstall": "node postinstall.js",
"preuninstall": "node preuninstall.js",
"prepack": "node scripts/guard-root-pack.js",
"docs-jekyll": "node scripts/build-docs.js",
- "mocha": "mocha",
"tsc": "tsc",
- "test-watch": "node ./dev/tsc-to-mocha-watch.js",
+ "test-watch": "node ./dev/tsc-to-vitest-watch.js",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
"prettier": "prettier --write ./lib/**/*{.ts,.d.ts} ./test/**/*{.ts,.d.ts}",
"build.release": "npm run clean.build && tsc -p tsconfig.release.json && node scripts/generate-test-deps.js && node scripts/copy-assets.js --release && node scripts/set-ga-id.js live --dir dist && node scripts/set-ga-id.js verify --dir dist",
@@ -134,11 +133,10 @@
"conventional-changelog-cli": "^5.0.0",
"fast-check": "3.23.2",
"husky": "9.1.7",
- "istanbul": "0.4.5",
"lint-staged": "~15.5.2",
- "mocha": "11.7.5",
"sinon": "19.0.5",
"source-map-support": "0.5.21",
+ "vitest": "^4.1.10",
"xml2js": ">=0.5.0"
},
"optionalDependencies": {
diff --git a/test/.mocharc.yml b/test/.mocharc.yml
deleted file mode 100644
index e07dbbf891..0000000000
--- a/test/.mocharc.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-# --recursive
-# --reporter spec
-# --require source-map-support/register
-# --require test/test-bootstrap.js
-# --timeout 150000
-# test/
-# lib/common/test/unit-tests
-
-# This is an example Mocha config containing every Mocha option plus others
-allow-uncaught: false
-async-only: false
-bail: false
-check-leaks: false
-color: true
-delay: false
-diff: true
-exit: true # could be expressed as "no-exit: true"
-extension:
- - 'js'
-# fgrep and grep are mutually exclusive
-# fgrep: something
-# file:
-# - '/path/to/some/file'
-# - '/path/to/some/other/file'
-forbid-only: false
-forbid-pending: false
-full-trace: false
-# global:
-# - 'jQuery'
-# - '$'
-# fgrep and grep are mutually exclusive
-# grep: something
-growl: false
-# ignore:
-# - '/path/to/some/ignored/file'
-inline-diffs: false
-# needs to be used with grep or fgrep
-# invert: false
-recursive: true
-reporter: 'spec'
-require:
- - 'dist/test/test-bootstrap.js'
-retries: 1
-slow: 500
-sort: false
-spec:
- - 'dist/test/**/*.js'
- - 'dist/lib/common/test/unit-tests/**/*.js'
-timeout: 150000 # same as "no-timeout: true" or "timeout: 0"
-
-# node flags
-# trace-warnings: true
-
-ui: 'bdd'
-v8-stack-trace-limit: 100 # V8 flags are prepended with "v8-"
-watch: false
-watch-files:
- - 'dist/test/**/*.js'
- - 'dist/lib/common/test/unit-tests/**/*.js'
-# watch-ignore:
-# - 'lib/vendor'
diff --git a/test/ios-project-service.ts b/test/ios-project-service.ts
index 5aa80c57cb..fa6d92fe6d 100644
--- a/test/ios-project-service.ts
+++ b/test/ios-project-service.ts
@@ -268,7 +268,13 @@ function createPackageJson(
.writeJson(join(projectPath, "package.json"), packageJsonData);
}
-describe("Cocoapods support", () => {
+// These suites only define tests on macOS - each body is internally gated on
+// darwin. Marking the suite skipped elsewhere is what keeps the runner from
+// erroring on an empty suite; an empty suite is only tolerated when skipped.
+const describeOnMacOS =
+ require("os").platform() === "darwin" ? describe : describe.skip;
+
+describeOnMacOS("Cocoapods support", () => {
if (require("os").platform() !== "darwin") {
console.log("Skipping Cocoapods tests. They cannot work on windows");
} else {
@@ -657,7 +663,7 @@ describe("Cocoapods support", () => {
}
});
-describe("Source code support", () => {
+describeOnMacOS("Source code support", () => {
if (require("os").platform() !== "darwin") {
console.log(
"Skipping Source code in plugin tests. They cannot work on windows",
@@ -978,7 +984,7 @@ describe("Source code support", () => {
}
});
-describe("Static libraries support", () => {
+describeOnMacOS("Static libraries support", () => {
if (require("os").platform() !== "darwin") {
console.log("Skipping static library tests. They work only on darwin.");
return;
@@ -1107,7 +1113,7 @@ describe("Relative paths", () => {
});
});
-describe("Merge Project XCConfig files", () => {
+describeOnMacOS("Merge Project XCConfig files", () => {
if (require("os").platform() !== "darwin") {
console.log(
"Skipping 'Merge Project XCConfig files' tests. They can work only on macOS",
diff --git a/test/options.ts b/test/options.ts
index 2d7e9a3b38..282828b226 100644
--- a/test/options.ts
+++ b/test/options.ts
@@ -32,9 +32,8 @@ function createOptions(testInjector: IInjector): IOptions {
return options;
}
-describe("options", () => {
- // TODO: Igor and Nathan will make this work again
- return;
+// TODO: Igor and Nathan will make this work again
+describe.skip("options", () => {
let testInjector: IInjector;
beforeEach(() => {
testInjector = createTestInjector();
diff --git a/test/project-commands.ts b/test/project-commands.ts
index 259c8185df..bb61c67771 100644
--- a/test/project-commands.ts
+++ b/test/project-commands.ts
@@ -2,7 +2,7 @@ import { Yok } from "../lib/common/yok";
import * as stubs from "./stubs";
import { CreateProjectCommand } from "../lib/commands/create-project";
import { StringCommandParameter } from "../lib/common/command-params";
-import * as helpers from "../lib/common/helpers";
+import { setIsInteractive } from "../lib/common/helpers";
import * as constants from "../lib/constants";
import { assert } from "chai";
import { PrompterStub } from "./stubs";
@@ -132,7 +132,7 @@ class ProjectServiceMock implements IProjectService {
}
async createProject(
- projectOptions: IProjectSettings
+ projectOptions: IProjectSettings,
): Promise {
createProjectCalledWithForce = projectOptions.force;
selectedTemplateName = projectOptions.template;
@@ -220,8 +220,7 @@ describe("Project commands tests", () => {
beforeEach(() => {
testInjector = createTestInjector();
- // @ts-expect-error
- helpers.isInteractive = () => true;
+ setIsInteractive(() => true);
isProjectCreated = false;
validateProjectCallsCount = 0;
createProjectCalledWithForce = false;
@@ -230,6 +229,10 @@ describe("Project commands tests", () => {
createProjectCommand = testInjector.resolve("$createCommand");
});
+ afterEach(() => {
+ setIsInteractive();
+ });
+
describe("#CreateProjectCommand", () => {
it("should not fail when using only --ng.", async () => {
options.ng = true;
@@ -366,7 +369,7 @@ describe("Project commands tests", () => {
assert.deepStrictEqual(
selectedTemplateName,
- "@nativescript/template-hello-world-ng"
+ "@nativescript/template-hello-world-ng",
);
assert.equal(validateProjectCallsCount, 1);
assert.isTrue(createProjectCalledWithForce);
@@ -382,7 +385,7 @@ describe("Project commands tests", () => {
assert.deepStrictEqual(
selectedTemplateName,
- "@nativescript/template-drawer-navigation-ts"
+ "@nativescript/template-drawer-navigation-ts",
);
assert.equal(validateProjectCallsCount, 1);
assert.isTrue(createProjectCalledWithForce);
@@ -398,7 +401,7 @@ describe("Project commands tests", () => {
assert.deepStrictEqual(
selectedTemplateName,
- "@nativescript/template-tab-navigation"
+ "@nativescript/template-tab-navigation",
);
assert.equal(validateProjectCallsCount, 1);
assert.isTrue(createProjectCalledWithForce);
@@ -414,7 +417,7 @@ describe("Project commands tests", () => {
assert.deepStrictEqual(
selectedTemplateName,
- "@nativescript/template-drawer-navigation-vue"
+ "@nativescript/template-drawer-navigation-vue",
);
assert.equal(validateProjectCallsCount, 1);
assert.isTrue(createProjectCalledWithForce);
@@ -430,7 +433,7 @@ describe("Project commands tests", () => {
assert.deepStrictEqual(
selectedTemplateName,
- "@nativescript/template-blank-react"
+ "@nativescript/template-blank-react",
);
assert.equal(validateProjectCallsCount, 1);
assert.isTrue(createProjectCalledWithForce);
@@ -446,7 +449,7 @@ describe("Project commands tests", () => {
assert.deepStrictEqual(
selectedTemplateName,
- "@nativescript/template-blank-svelte"
+ "@nativescript/template-blank-svelte",
);
assert.equal(validateProjectCallsCount, 1);
assert.isTrue(createProjectCalledWithForce);
diff --git a/test/project-name-service.ts b/test/project-name-service.ts
index cec999950b..0e62fa70c3 100644
--- a/test/project-name-service.ts
+++ b/test/project-name-service.ts
@@ -4,6 +4,7 @@ import { assert } from "chai";
import { ErrorsStub, LoggerStub } from "./stubs";
import { IProjectNameService } from "../lib/declarations";
import { IInjector } from "../lib/common/definitions/yok";
+import { setIsInteractive } from "../lib/common/helpers";
import * as _ from "lodash";
const mockProjectNameValidator = {
@@ -36,14 +37,20 @@ describe("Project Name Service Tests", () => {
const invalidProjectNames = ["1invalid", "app"];
beforeEach(() => {
+ // ensureValidName only prompts when interactive; without this the result
+ // depends on whether the runner happens to own a TTY.
+ setIsInteractive(() => true);
testInjector = createTestInjector();
projectNameService = testInjector.resolve("projectNameService");
});
+ afterEach(() => {
+ setIsInteractive();
+ });
+
it("returns correct name when valid name is entered", async () => {
- const actualProjectName = await projectNameService.ensureValidName(
- validProjectName
- );
+ const actualProjectName =
+ await projectNameService.ensureValidName(validProjectName);
assert.deepStrictEqual(actualProjectName, validProjectName);
});
@@ -67,9 +74,8 @@ describe("Project Name Service Tests", () => {
}
};
- const actualProjectName = await projectNameService.ensureValidName(
- invalidProjectName
- );
+ const actualProjectName =
+ await projectNameService.ensureValidName(invalidProjectName);
assert.deepStrictEqual(actualProjectName, validProjectName);
});
@@ -77,7 +83,7 @@ describe("Project Name Service Tests", () => {
it(`returns the invalid name when "${invalidProjectName}" is entered and --force flag is present`, async () => {
const actualProjectName = await projectNameService.ensureValidName(
validProjectName,
- { force: true }
+ { force: true },
);
assert.deepStrictEqual(actualProjectName, validProjectName);
diff --git a/test/services/extensibility-service.ts b/test/services/extensibility-service.ts
index a23e267988..a6b1970ee5 100644
--- a/test/services/extensibility-service.ts
+++ b/test/services/extensibility-service.ts
@@ -40,11 +40,11 @@ interface ITestExtensionDefinition {
}
describe("extensibilityService", () => {
- before(() => {
+ beforeAll(() => {
path.resolve = (p: string) => p;
});
- after(() => {
+ afterAll(() => {
path.resolve = originalResolve;
});
diff --git a/test/services/project-data-service.ts b/test/services/project-data-service.ts
index 401ebaadda..753672f3b4 100644
--- a/test/services/project-data-service.ts
+++ b/test/services/project-data-service.ts
@@ -63,7 +63,7 @@ const testData: any = [
const createTestInjector = (
packageJsonContent?: string,
- nsConfigContent?: string
+ nsConfigContent?: string,
): IInjector => {
const testInjector = new Yok();
testInjector.register("projectData", ProjectDataStub);
@@ -77,7 +77,7 @@ const createTestInjector = (
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
/** intentionally left blank */
},
@@ -86,7 +86,7 @@ const createTestInjector = (
readText: (
filename: string,
- encoding?: IReadFileOptions | string
+ encoding?: IReadFileOptions | string,
): string => {
if (filename.indexOf("package.json") > -1) {
return packageJsonContent;
@@ -111,7 +111,7 @@ const createTestInjector = (
enumerateDirectories?: boolean;
includeEmptyDirectories?: boolean;
},
- foundFiles?: string[]
+ foundFiles?: string[],
): string[] => [],
});
@@ -143,10 +143,10 @@ const createTestInjector = (
describe("projectDataService", () => {
const generateJsonDataFromTestData = (
currentTestData: any,
- skipNativeScriptKey?: boolean
+ skipNativeScriptKey?: boolean,
) => {
const props = currentTestData.propertyName.split(
- NATIVESCRIPT_PROPS_INTERNAL_DELIMITER
+ NATIVESCRIPT_PROPS_INTERNAL_DELIMITER,
);
const data: any = {};
let currentData: any = skipNativeScriptKey
@@ -168,28 +168,28 @@ describe("projectDataService", () => {
const generateFileContentFromTestData = (
currentTestData: any,
- skipNativeScriptKey?: boolean
+ skipNativeScriptKey?: boolean,
) => {
const data = generateJsonDataFromTestData(
currentTestData,
- skipNativeScriptKey
+ skipNativeScriptKey,
);
return JSON.stringify(data);
};
- describe("getNSValue", () => {
+ // every entry in testData is commented out, so this generates no cases
+ describe.skip("getNSValue", () => {
_.each(testData, (currentTestData) => {
it(currentTestData.description, () => {
const testInjector = createTestInjector(
- generateFileContentFromTestData(currentTestData)
- );
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
+ generateFileContentFromTestData(currentTestData),
);
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
const actualValue = projectDataService.getNSValue(
"projectDir",
- currentTestData.propertyName
+ currentTestData.propertyName,
);
assert.deepStrictEqual(actualValue, currentTestData.propertyValue);
});
@@ -203,7 +203,7 @@ describe("projectDataService", () => {
defaultEmptyData[CLIENT_NAME_KEY_IN_PROJECT_FILE] = {};
const testInjector = createTestInjector(
- JSON.stringify(defaultEmptyData)
+ JSON.stringify(defaultEmptyData),
);
const fs: IFileSystem = testInjector.resolve("fs");
@@ -212,27 +212,26 @@ describe("projectDataService", () => {
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
dataPassedToWriteJson = data;
};
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
projectDataService.setNSValue(
"projectDir",
currentTestData.propertyName,
- currentTestData.propertyValue
+ currentTestData.propertyValue,
);
assert.deepStrictEqual(
dataPassedToWriteJson,
- generateJsonDataFromTestData(currentTestData)
+ generateJsonDataFromTestData(currentTestData),
);
assert.isTrue(
!!dataPassedToWriteJson[CLIENT_NAME_KEY_IN_PROJECT_FILE],
- "Data passed to write JSON must contain nativescript key."
+ "Data passed to write JSON must contain nativescript key.",
);
});
});
@@ -254,34 +253,33 @@ describe("projectDataService", () => {
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
dataPassedToWriteJson = data;
};
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
projectDataService.setNSValue(
"projectDir",
getPropertyName(["root", "id"]),
- "2"
+ "2",
);
const expectedData = _.cloneDeep(initialData);
expectedData[CLIENT_NAME_KEY_IN_PROJECT_FILE].root.id = "2";
assert.isTrue(
!!dataPassedToWriteJson[CLIENT_NAME_KEY_IN_PROJECT_FILE],
- "Data passed to write JSON must contain nativescript key."
+ "Data passed to write JSON must contain nativescript key.",
);
assert.deepStrictEqual(dataPassedToWriteJson, expectedData);
assert.deepStrictEqual(
dataPassedToWriteJson[CLIENT_NAME_KEY_IN_PROJECT_FILE].root.id,
- "2"
+ "2",
);
assert.deepStrictEqual(
dataPassedToWriteJson[CLIENT_NAME_KEY_IN_PROJECT_FILE].root
.constantItem,
- "myValue"
+ "myValue",
);
});
});
@@ -289,7 +287,7 @@ describe("projectDataService", () => {
describe("removeNSProperty", () => {
const generateExpectedDataFromTestData = (currentTestData: any) => {
const props = currentTestData.propertyName.split(
- NATIVESCRIPT_PROPS_INTERNAL_DELIMITER
+ NATIVESCRIPT_PROPS_INTERNAL_DELIMITER,
);
props.splice(props.length - 1, 1);
@@ -308,7 +306,7 @@ describe("projectDataService", () => {
generateFileContentFromTestData(currentTestData);
const testInjector = createTestInjector(
- generateFileContentFromTestData(currentTestData)
+ generateFileContentFromTestData(currentTestData),
);
const fs: IFileSystem = testInjector.resolve("fs");
@@ -317,26 +315,25 @@ describe("projectDataService", () => {
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
dataPassedToWriteJson = data;
};
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
projectDataService.removeNSProperty(
"projectDir",
- currentTestData.propertyName
+ currentTestData.propertyName,
);
assert.deepStrictEqual(
dataPassedToWriteJson,
- generateExpectedDataFromTestData(currentTestData)
+ generateExpectedDataFromTestData(currentTestData),
);
assert.isTrue(
!!dataPassedToWriteJson[CLIENT_NAME_KEY_IN_PROJECT_FILE],
- "Data passed to write JSON must contain nativescript key."
+ "Data passed to write JSON must contain nativescript key.",
);
});
});
@@ -358,17 +355,16 @@ describe("projectDataService", () => {
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
dataPassedToWriteJson = data;
};
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
projectDataService.removeNSProperty(
"projectDir",
- getPropertyName(["root", "id"])
+ getPropertyName(["root", "id"]),
);
assert.deepStrictEqual(dataPassedToWriteJson, {
nativescript: { root: { constantItem: "myValue" } },
@@ -379,7 +375,7 @@ describe("projectDataService", () => {
describe("removeNSConfigProperty", () => {
const generateExpectedDataFromTestData = (currentTestData: any) => {
const props = currentTestData.propertyName.split(
- NATIVESCRIPT_PROPS_INTERNAL_DELIMITER
+ NATIVESCRIPT_PROPS_INTERNAL_DELIMITER,
);
props.splice(props.length - 1, 1);
@@ -397,7 +393,7 @@ describe("projectDataService", () => {
it(currentTestData.description, () => {
const testInjector = createTestInjector(
null,
- generateFileContentFromTestData(currentTestData, true)
+ generateFileContentFromTestData(currentTestData, true),
);
const fs: IFileSystem = testInjector.resolve("fs");
@@ -406,30 +402,29 @@ describe("projectDataService", () => {
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
dataPassedToWriteJson = data;
};
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
const propDelimiterRegExp = new RegExp(
regExpEscape(NATIVESCRIPT_PROPS_INTERNAL_DELIMITER),
- "g"
+ "g",
);
const propertySelector = currentTestData.propertyName.replace(
propDelimiterRegExp,
- "."
+ ".",
);
projectDataService.removeNSConfigProperty(
"projectDir",
- propertySelector
+ propertySelector,
);
assert.deepStrictEqual(
dataPassedToWriteJson,
- generateExpectedDataFromTestData(currentTestData)
+ generateExpectedDataFromTestData(currentTestData),
);
});
});
@@ -451,17 +446,16 @@ describe("projectDataService", () => {
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
dataPassedToWriteJson = data;
};
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
projectDataService.removeNSProperty(
"projectDir",
- getPropertyName(["root", "id"])
+ getPropertyName(["root", "id"]),
);
assert.deepStrictEqual(dataPassedToWriteJson, {
nativescript: { root: { constantItem: "myValue" } },
@@ -477,7 +471,7 @@ describe("projectDataService", () => {
};
const testInjector = createTestInjector(
- generateFileContentFromTestData(currentTestData, true)
+ generateFileContentFromTestData(currentTestData, true),
);
const fs: IFileSystem = testInjector.resolve("fs");
@@ -486,14 +480,13 @@ describe("projectDataService", () => {
filename: string,
data: any,
space?: string,
- encoding?: string
+ encoding?: string,
): void => {
dataPassedToWriteJson = data;
};
- const projectDataService: IProjectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService: IProjectDataService =
+ testInjector.resolve("projectDataService");
projectDataService.removeDependency("projectDir", "myDeps");
assert.deepStrictEqual(dataPassedToWriteJson, { dependencies: {} });
@@ -514,9 +507,8 @@ describe("projectDataService", () => {
throw new Error(`Unable to read file ${filePath}`);
};
- const projectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService =
+ testInjector.resolve("projectDataService");
const assetStructure = await projectDataService.getAssetsStructure({
projectDir: ".",
});
@@ -590,9 +582,8 @@ describe("projectDataService", () => {
}
};
- const projectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService =
+ testInjector.resolve("projectDataService");
const assetStructure = await projectDataService.getAssetsStructure({
projectDir: ".",
});
@@ -705,7 +696,7 @@ describe("projectDataService", () => {
];
const setupTestCase = (
- testCase: any
+ testCase: any,
): { projectDataService: IProjectDataService; testInjector: IInjector } => {
const testInjector = createTestInjector();
const fs = testInjector.resolve("fs");
@@ -741,9 +732,8 @@ describe("projectDataService", () => {
return [];
};
- const projectDataService = testInjector.resolve(
- "projectDataService"
- );
+ const projectDataService =
+ testInjector.resolve("projectDataService");
projectDataService.getProjectData = () =>
{
appDirectoryPath,
@@ -757,9 +747,8 @@ describe("projectDataService", () => {
getAppExecutableFilesTestData.forEach((testCase) => {
it(`returns correct files for application type ${testCase.projectType}`, () => {
const { projectDataService } = setupTestCase(testCase);
- const appExecutableFiles = projectDataService.getAppExecutableFiles(
- "projectDir"
- );
+ const appExecutableFiles =
+ projectDataService.getAppExecutableFiles("projectDir");
assert.deepStrictEqual(appExecutableFiles, testCase.expectedResult);
});
});
@@ -810,9 +799,8 @@ describe("projectDataService", () => {
return baseFsGetFsStats(filePath);
};
- const appExecutableFiles = projectDataService.getAppExecutableFiles(
- "projectDir"
- );
+ const appExecutableFiles =
+ projectDataService.getAppExecutableFiles("projectDir");
assert.deepStrictEqual(appExecutableFiles, testCase.expectedResult);
});
});
diff --git a/test/vitest-globals.d.ts b/test/vitest-globals.d.ts
new file mode 100644
index 0000000000..9896c472fb
--- /dev/null
+++ b/test/vitest-globals.d.ts
@@ -0,0 +1 @@
+///
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 0000000000..f1ff097b39
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,25 @@
+import { defineConfig } from "vitest/config";
+
+// Tests run against tsc's output in dist/ rather than the TypeScript sources:
+// the injector discovers dependencies by regex-parsing constructor source text
+// (see annotate() in lib/common/helpers.ts), which only matches tsc's emit.
+export default defineConfig({
+ test: {
+ globals: true,
+ environment: "node",
+ include: ["dist/test/**/*.js", "dist/lib/common/test/unit-tests/**/*.js"],
+ exclude: [
+ "**/node_modules/**",
+ "dist/test/files/**",
+ "dist/test/stubs.js",
+ "dist/test/test-bootstrap.js",
+ "dist/test/base-service-test.js",
+ "dist/lib/common/test/unit-tests/stubs.js",
+ "dist/lib/common/test/unit-tests/mocks/**",
+ "dist/lib/common/test/with-done.js",
+ ],
+ setupFiles: ["./dist/test/test-bootstrap.js"],
+ testTimeout: 150000,
+ hookTimeout: 150000,
+ },
+});