diff --git a/.gitignore b/.gitignore
index 41360fd..2ccbe46 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1 @@
/node_modules/
-/npm-debug.log
-lib/testFiles.js
diff --git a/README.md b/README.md
index c84148b..d07e8a3 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,14 @@
-
-
-
+
-# Promises/A+ Compliance Test Suite
+# Promises/A+ Compliance Test Suite (refreshed)
-This suite tests compliance of a promise implementation with the [Promises/A+ specification][].
+This suite tests compliance of a promise implementation with the [Promises/A+ specification](https://github.com/promises-aplus/promises-spec).
-[Promises/A+ specification]: https://github.com/promises-aplus/promises-spec
+Passing the tests in this repo means that you have a Promises/A+ compliant implementation of the `then()` method, and you can display the [Promises/A+ logo](https://promisesaplus.com/assets/logo-small.png) in your README.
-Passing the tests in this repo means that you have a Promises/A+ compliant implementation of the `then()` method, and you can display the Promises/A+ logo in your README. You can also [send a pull request](https://github.com/promises-aplus/promises-spec) to have your implementation listed on the [implementations page](https://promisesaplus.com/implementations).
+The [original suite](https://github.com/promises-aplus/promises-tests) seems to have been abandoned; this fork passes [`npm audit`](https://docs.npmjs.com/auditing-package-dependencies-for-security-vulnerabilities) and adds [TypeScript](https://typescriptlang.org/) types, without changing any of the tests.
+
+Before it was abandoned, you could also [send a pull request](https://github.com/promises-aplus/promises-spec) to have your implementation listed on the [implementations page](https://promisesaplus.com/implementations).
## How To Run
@@ -44,16 +43,16 @@ your implementation in `try`/`catch` when writing the adapter.
### From the CLI
This package comes with a command-line interface that can be used either by installing it globally with
-`npm install promises-aplus-tests -g` or by including it in your `package.json`'s `devDependencies` and using npm's
+`npm install promises-aplus-tests-refreshed -g` or by including it in your `package.json`'s `devDependencies` and using npm's
`scripts` feature. In the latter case, your setup might look something like
```json
{
"devDependencies": {
- "promises-aplus-tests": "*"
+ "promises-aplus-tests-refreshed": "*"
},
"scripts": {
- "test": "run-my-own-tests && promises-aplus-tests test/my-adapter"
+ "test": "run-my-own-tests && promises-aplus-tests-refreshed test/my-adapter"
}
}
```
@@ -66,7 +65,7 @@ tries to pass through any subsequent options to Mocha, so you can use e.g. `--re
The main export of this package is a function that allows you to run the tests against an adapter:
```js
-var promisesAplusTests = require("promises-aplus-tests");
+let promisesAplusTests = require("promises-aplus-tests-refreshed");
promisesAplusTests(adapter, function (err) {
// All done; output is in the console. Or check `err` for number of failures.
@@ -87,7 +86,7 @@ If you already have a Mocha test suite and want to include these tests in it, yo
```js
describe("Promises/A+ Tests", function () {
- require("promises-aplus-tests").mocha(adapter);
+ require("promises-aplus-tests-refreshed").mocha(adapter);
});
```
diff --git a/lib/cli.d.ts b/lib/cli.d.ts
new file mode 100644
index 0000000..b798801
--- /dev/null
+++ b/lib/cli.d.ts
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+export {};
diff --git a/lib/cli.js b/lib/cli.js
index bb3cee7..1da59ec 100644
--- a/lib/cli.js
+++ b/lib/cli.js
@@ -1,16 +1,16 @@
#!/usr/bin/env node
"use strict";
-var path = require("path");
-var getMochaOpts = require("./getMochaOpts");
-var programmaticRunner = require("./programmaticRunner");
+let path = require("path");
+let getMochaOpts = require("./getMochaOpts");
+let ProgrammaticRunner = require("./programmaticRunner");
-var filePath = getAdapterFilePath();
-var adapter = adapterObjectFromFilePath(filePath);
-var mochaOpts = getMochaOpts(process.argv.slice(3));
-programmaticRunner(adapter, mochaOpts, function (err) {
+let filePath = getAdapterFilePath();
+let adapter = adapterObjectFromFilePath(filePath);
+let mochaOpts = getMochaOpts(process.argv.slice(3));
+ProgrammaticRunner(adapter, mochaOpts, function (err) {
if (err) {
- process.exit(err.failures || -1);
+ process.exit(err.failure_count || -1);
}
});
@@ -26,7 +26,7 @@ function adapterObjectFromFilePath(filePath) {
try {
return require(filePath);
} catch (e) {
- var error = new Error("Error `require`ing adapter file " + filePath + "\n\n" + e);
+ let error = new Error("Error `require`ing adapter file " + filePath + "\n\n" + e);
error.cause = e;
throw error;
diff --git a/lib/getMochaOpts.d.ts b/lib/getMochaOpts.d.ts
new file mode 100644
index 0000000..c0eee6e
--- /dev/null
+++ b/lib/getMochaOpts.d.ts
@@ -0,0 +1,2 @@
+declare function _exports(args: any): {};
+export = _exports;
diff --git a/lib/getMochaOpts.js b/lib/getMochaOpts.js
index d059ac8..e42b213 100644
--- a/lib/getMochaOpts.js
+++ b/lib/getMochaOpts.js
@@ -1,14 +1,14 @@
"use strict";
module.exports = function getMochaOpts(args) {
- var rawOpts = args;
- var opts = {};
+ let rawOpts = args;
+ let opts = {};
rawOpts.join(" ").split("--").forEach(function (opt) {
- var optSplit = opt.split(" ");
+ let optSplit = opt.split(" ");
- var key = optSplit[0];
- var value = optSplit[1] || true;
+ let key = optSplit[0];
+ let value = optSplit[1] || true;
if (key) {
opts[key] = value;
diff --git a/lib/programmaticRunner.d.ts b/lib/programmaticRunner.d.ts
new file mode 100644
index 0000000..f704f6a
--- /dev/null
+++ b/lib/programmaticRunner.d.ts
@@ -0,0 +1,29 @@
+export = PromisesAPlusTests;
+/** @type { PromisesAPlusTests.Export } */
+declare function PromisesAPlusTests(adapter: PromisesAPlusTests.Adapter, mocha_options_or_callback: any | PromisesAPlusTests.Callback, callback_or_omitted: PromisesAPlusTests.Callback | void): void;
+declare namespace PromisesAPlusTests {
+ function mocha(implementation: Adapter): void;
+ type Adapter = {
+ resolved?: (value: T) => Promise;
+ rejected?: (reason: any) => Promise;
+ deferred: () => PromisesAPlusTests.Deferred;
+ };
+ type Callback = (error?: PromisesAPlusTests.TestError) => void;
+ type Deferred = {
+ promise: Promise;
+ resolve: (value: T) => void;
+ reject: (reason: any) => void;
+ };
+ type Export = (PromisesAPlusTests.TesterWithOptions | PromisesAPlusTests.TesterWithoutOptions) & PromisesAPlusTests.MochaTester;
+ type MaybeFailureCount = {
+ failure_count?: number;
+ };
+ type MochaTester = {
+ mocha: PromisesAPlusTests.MochaTestMethod;
+ };
+ type MochaTestMethod = (implementation: PromisesAPlusTests.Adapter) => void;
+ type Tester = PromisesAPlusTests.TesterWithOptions & PromisesAPlusTests.TesterWithoutOptions;
+ type TestError = Error & PromisesAPlusTests.MaybeFailureCount;
+ type TesterWithOptions = (implementation: PromisesAPlusTests.Adapter, mochaOptions: any, callback?: PromisesAPlusTests.Callback) => void;
+ type TesterWithoutOptions = (implementation: PromisesAPlusTests.Adapter, callback?: PromisesAPlusTests.Callback) => void;
+}
diff --git a/lib/programmaticRunner.js b/lib/programmaticRunner.js
index f563f8d..383f627 100644
--- a/lib/programmaticRunner.js
+++ b/lib/programmaticRunner.js
@@ -1,76 +1,103 @@
"use strict";
-var Mocha = require("mocha");
-var path = require("path");
-var fs = require("fs");
-var _ = require("underscore");
+/** @typedef { { resolved?: ( value: T ) => Promise, rejected?: ( reason: any ) => Promise, deferred: () => PromisesAPlusTests.Deferred } } PromisesAPlusTests.Adapter @template T */
+/** @typedef { ( error?: PromisesAPlusTests.TestError ) => void } PromisesAPlusTests.Callback */
+/** @typedef { { promise: Promise, resolve: ( value: T ) => void, reject: ( reason: any ) => void, } } PromisesAPlusTests.Deferred @template T */
+/** @typedef { ( PromisesAPlusTests.TesterWithOptions | PromisesAPlusTests.TesterWithoutOptions ) & PromisesAPlusTests.MochaTester } PromisesAPlusTests.Export */
+/** @typedef { { failure_count?: number } } PromisesAPlusTests.MaybeFailureCount */
+/** @typedef { { mocha: PromisesAPlusTests.MochaTestMethod } } PromisesAPlusTests.MochaTester */
+/** @typedef { ( implementation: PromisesAPlusTests.Adapter ) => void } PromisesAPlusTests.MochaTestMethod */
+/** @typedef { PromisesAPlusTests.TesterWithOptions & PromisesAPlusTests.TesterWithoutOptions } PromisesAPlusTests.Tester */
+/** @typedef { Error & PromisesAPlusTests.MaybeFailureCount } PromisesAPlusTests.TestError */
+/** @typedef { ( implementation: PromisesAPlusTests.Adapter, mochaOptions: any, callback?: PromisesAPlusTests.Callback ) => void } PromisesAPlusTests.TesterWithOptions */
+/** @typedef { ( implementation: PromisesAPlusTests.Adapter, callback?: PromisesAPlusTests.Callback ) => void } PromisesAPlusTests.TesterWithoutOptions */
-var testsDir = path.resolve(__dirname, "tests");
+let Mocha = require("mocha");
+let path = require("path");
+let fs = require("fs");
+let _ = require("underscore");
-function normalizeAdapter(adapter) {
- if (!adapter.resolved) {
- adapter.resolved = function (value) {
- var d = adapter.deferred();
- d.resolve(value);
- return d.promise;
- };
- }
+let testsDir = path.resolve(__dirname, "tests");
- if (!adapter.rejected) {
- adapter.rejected = function (reason) {
- var d = adapter.deferred();
- d.reject(reason);
- return d.promise;
- };
- }
+/** @type { (adapter: PromisesAPlusTests.Adapter) => void } */
+function normalizeAdapter(adapter) {
+ if (!adapter.resolved) {
+ adapter.resolved = function (value) {
+ let d = adapter.deferred();
+ d.resolve(value);
+ return d.promise;
+ };
+ }
+ if (!adapter.rejected) {
+ adapter.rejected = function (reason) {
+ /** @type { PromisesAPlusTests.Deferred } */
+ let d = adapter.deferred();
+ d.reject(reason);
+ return d.promise;
+ };
+ }
}
-module.exports = function (adapter, mochaOpts, cb) {
- if (typeof mochaOpts === "function") {
- cb = mochaOpts;
- mochaOpts = {};
- }
- if (typeof cb !== "function") {
- cb = function () { };
- }
+/** @type { PromisesAPlusTests.Export } */
+function PromisesAPlusTests (
+ /** @type { PromisesAPlusTests.Adapter } */
+ adapter,
+ /** @type { any | PromisesAPlusTests.Callback } */
+ mocha_options_or_callback,
+ /** @type { PromisesAPlusTests.Callback | void } */
+ callback_or_omitted,
+) {
+ let mochaOpts = {}
+ /** @type { PromisesAPlusTests.Callback } */
+ let cb = function () { };
+ if( mocha_options_or_callback && typeof mocha_options_or_callback !== "function" ) {
+ mochaOpts = mocha_options_or_callback;
+ if( typeof callback_or_omitted === "function" ) {
+ cb = callback_or_omitted;
+ }
+ } else if ( typeof mocha_options_or_callback === "function" ) {
+ cb = mocha_options_or_callback
+ }
- normalizeAdapter(adapter);
- mochaOpts = _.defaults(mochaOpts, { timeout: 200, slow: Infinity });
+ normalizeAdapter(adapter);
+ mochaOpts = _.defaults(mochaOpts, { timeout: 200, slow: Infinity });
- fs.readdir(testsDir, function (err, testFileNames) {
- if (err) {
- cb(err);
- return;
- }
+ fs.readdir( testsDir, (err, testFileNames) => {
+ if (err) {
+ cb(err);
+ return;
+ }
- var mocha = new Mocha(mochaOpts);
- testFileNames.forEach(function (testFileName) {
- if (path.extname(testFileName) === ".js") {
- var testFilePath = path.resolve(testsDir, testFileName);
- mocha.addFile(testFilePath);
- }
- });
+ let mocha = new Mocha(mochaOpts);
+ testFileNames.forEach( (testFileName) => {
+ if( path.extname(testFileName) === ".js" ) {
+ let testFilePath = path.resolve( testsDir, testFileName );
+ mocha.addFile(testFilePath);
+ }
+ });
- global.adapter = adapter;
- mocha.run(function (failures) {
- delete global.adapter;
- if (failures > 0) {
- var err = new Error("Test suite failed with " + failures + " failures.");
- err.failures = failures;
- cb(err);
- } else {
- cb(null);
- }
- });
- });
+ global.adapter = adapter;
+ mocha.run( (failures) => {
+ delete global.adapter;
+ if (failures > 0) {
+ /** @type { PromisesAPlusTests.TestError } */
+ let err = new Error("Test suite failed with " + failures + " failures.");
+ err.failure_count = failures;
+ cb(err);
+ } else {
+ cb();
+ }
+ } );
+ } );
};
-module.exports.mocha = function (adapter) {
- normalizeAdapter(adapter);
-
- global.adapter = adapter;
-
- require("./testFiles");
-
- delete global.adapter;
+/** @type { PromisesAPlusTests.MochaTestMethod } */
+PromisesAPlusTests.mocha = function mocha(adapter) {
+ normalizeAdapter(adapter);
+ global.adapter = adapter;
+ require("./testFiles");
+ delete global.adapter;
};
+
+/** @type { PromisesAPlusTests.Export } */
+module.exports = PromisesAPlusTests
diff --git a/lib/testFiles.d.ts b/lib/testFiles.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/testFiles.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/testFiles.js b/lib/testFiles.js
new file mode 100644
index 0000000..3282e0d
--- /dev/null
+++ b/lib/testFiles.js
@@ -0,0 +1,14 @@
+"use strict";
+require("./tests/2.1.2");
+require("./tests/2.1.3");
+require("./tests/2.2.1");
+require("./tests/2.2.2");
+require("./tests/2.2.3");
+require("./tests/2.2.4");
+require("./tests/2.2.5");
+require("./tests/2.2.6");
+require("./tests/2.2.7");
+require("./tests/2.3.1");
+require("./tests/2.3.2");
+require("./tests/2.3.3");
+require("./tests/2.3.4");
diff --git a/lib/tests/2.1.2.d.ts b/lib/tests/2.1.2.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.1.2.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.1.3.d.ts b/lib/tests/2.1.3.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.1.3.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.2.1.d.ts b/lib/tests/2.2.1.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.2.1.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.2.1.js b/lib/tests/2.2.1.js
index 9e4d93c..858a3bc 100644
--- a/lib/tests/2.2.1.js
+++ b/lib/tests/2.2.1.js
@@ -1,5 +1,7 @@
"use strict";
+require("./2.2.1"); // Using an "import form" tells TypeScript that this is a module that can be required by other scripts
+
var adapter = global.adapter;
var resolved = adapter.resolved;
var rejected = adapter.rejected;
diff --git a/lib/tests/2.2.2.d.ts b/lib/tests/2.2.2.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.2.2.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.2.3.d.ts b/lib/tests/2.2.3.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.2.3.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.2.4.d.ts b/lib/tests/2.2.4.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.2.4.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.2.5.d.ts b/lib/tests/2.2.5.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.2.5.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.2.5.js b/lib/tests/2.2.5.js
index d966004..2c87860 100644
--- a/lib/tests/2.2.5.js
+++ b/lib/tests/2.2.5.js
@@ -11,37 +11,49 @@ var dummy = { dummy: "dummy" }; // we fulfill or reject with this when we don't
describe("2.2.5 `onFulfilled` and `onRejected` must be called as functions (i.e. with no `this` value).", function () {
describe("strict mode", function () {
specify("fulfilled", function (done) {
- resolved(dummy).then(function onFulfilled() {
- "use strict";
-
- assert.strictEqual(this, undefined);
- done();
- });
+ resolved(dummy).then(
+ /** @type { ( this: typeof globalThis) => void } */
+ function onFulfilled() {
+ "use strict";
+ assert.strictEqual(this, undefined);
+ done();
+ }
+ );
});
specify("rejected", function (done) {
- rejected(dummy).then(null, function onRejected() {
- "use strict";
-
- assert.strictEqual(this, undefined);
- done();
- });
+ rejected(dummy).then(
+ null,
+ /** @type { ( this: typeof globalThis) => void } */
+ function onRejected() {
+ "use strict";
+ assert.strictEqual(this, undefined);
+ done();
+ }
+ );
});
});
describe("sloppy mode", function () {
specify("fulfilled", function (done) {
- resolved(dummy).then(function onFulfilled() {
- assert.strictEqual(this, global);
- done();
- });
+ resolved(dummy).then(
+ /** @type { ( this: typeof globalThis) => void } */
+ function onFulfilled() {
+ assert.strictEqual(this, global);
+ done();
+ }
+ );
});
specify("rejected", function (done) {
- rejected(dummy).then(null, function onRejected() {
- assert.strictEqual(this, global);
- done();
- });
+ rejected(dummy).then(
+ null,
+ /** @type { ( this: typeof globalThis) => void } */
+ function onRejected() {
+ assert.strictEqual(this, global);
+ done();
+ }
+ );
});
});
});
diff --git a/lib/tests/2.2.6.d.ts b/lib/tests/2.2.6.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.2.6.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.2.7.d.ts b/lib/tests/2.2.7.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.2.7.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.3.1.d.ts b/lib/tests/2.3.1.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.3.1.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.3.2.d.ts b/lib/tests/2.3.2.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.3.2.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.3.3.d.ts b/lib/tests/2.3.3.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/lib/tests/2.3.3.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/lib/tests/2.3.3.js b/lib/tests/2.3.3.js
index f15de34..07ce43e 100644
--- a/lib/tests/2.3.3.js
+++ b/lib/tests/2.3.3.js
@@ -67,7 +67,7 @@ function testCallingRejectPromise(r, stringRepresentation, test) {
describe("`then` calls `rejectPromise` synchronously", function () {
function xFactory() {
return {
- then: function (resolvePromise, rejectPromise) {
+ then: function (_resolvePromise, rejectPromise) {
rejectPromise(r);
}
};
@@ -79,7 +79,7 @@ function testCallingRejectPromise(r, stringRepresentation, test) {
describe("`then` calls `rejectPromise` asynchronously", function () {
function xFactory() {
return {
- then: function (resolvePromise, rejectPromise) {
+ then: function (_resolvePromise, rejectPromise) {
setTimeout(function () {
rejectPromise(r);
}, 0);
@@ -642,7 +642,7 @@ describe("2.3.3: Otherwise, if `x` is an object or function,", function () {
describe("calling `rejectPromise` twice synchronously", function () {
function xFactory() {
return {
- then: function (resolvePromise, rejectPromise) {
+ then: function (_resolvePromise, rejectPromise) {
rejectPromise(sentinel);
rejectPromise(other);
}
@@ -660,7 +660,7 @@ describe("2.3.3: Otherwise, if `x` is an object or function,", function () {
describe("calling `rejectPromise` twice, first synchronously then asynchronously", function () {
function xFactory() {
return {
- then: function (resolvePromise, rejectPromise) {
+ then: function (_resolvePromise, rejectPromise) {
rejectPromise(sentinel);
setTimeout(function () {
@@ -681,7 +681,7 @@ describe("2.3.3: Otherwise, if `x` is an object or function,", function () {
describe("calling `rejectPromise` twice, both times asynchronously", function () {
function xFactory() {
return {
- then: function (resolvePromise, rejectPromise) {
+ then: function (_resolvePromise, rejectPromise) {
setTimeout(function () {
rejectPromise(sentinel);
}, 0);
@@ -823,7 +823,7 @@ describe("2.3.3: Otherwise, if `x` is an object or function,", function () {
describe("`rejectPromise` was called", function () {
function xFactory() {
return {
- then: function (resolvePromise, rejectPromise) {
+ then: function (_resolvePromise, rejectPromise) {
rejectPromise(sentinel);
throw other;
}
@@ -918,7 +918,7 @@ describe("2.3.3: Otherwise, if `x` is an object or function,", function () {
describe("`rejectPromise` is called asynchronously before the `throw`", function () {
function xFactory() {
return {
- then: function (resolvePromise, rejectPromise) {
+ then: function (_resolvePromise, rejectPromise) {
setTimeout(function () {
rejectPromise(other);
}, 0);
diff --git a/lib/tests/2.3.4.d.ts b/lib/tests/2.3.4.d.ts
new file mode 100644
index 0000000..626882d
--- /dev/null
+++ b/lib/tests/2.3.4.d.ts
@@ -0,0 +1,5 @@
+export type MaybeThenableConstructor = {
+ prototype: any & {
+ then?: Function;
+ };
+};
diff --git a/lib/tests/2.3.4.js b/lib/tests/2.3.4.js
index e421eea..d99ff39 100644
--- a/lib/tests/2.3.4.js
+++ b/lib/tests/2.3.4.js
@@ -1,5 +1,7 @@
"use strict";
+/** @typedef { { prototype: Object & { then?: Function } } } MaybeThenableConstructor */
+
var assert = require("assert");
var testFulfilled = require("./helpers/testThreeCases").testFulfilled;
var testRejected = require("./helpers/testThreeCases").testRejected;
@@ -49,10 +51,14 @@ describe("2.3.4: If `x` is not an object or function, fulfill `promise` with `x`
true,
"`true` with `Boolean.prototype` modified to have a `then` method",
function () {
- Boolean.prototype.then = function () {};
+ /** @type { BooleanConstructor & MaybeThenableConstructor } */
+ var konstructor = Boolean
+ konstructor.prototype.then = function () {};
},
function () {
- delete Boolean.prototype.then;
+ /** @type { BooleanConstructor & MaybeThenableConstructor } */
+ var konstructor = Boolean
+ delete konstructor.prototype.then;
}
);
@@ -60,10 +66,14 @@ describe("2.3.4: If `x` is not an object or function, fulfill `promise` with `x`
1,
"`1` with `Number.prototype` modified to have a `then` method",
function () {
- Number.prototype.then = function () {};
+ /** @type { NumberConstructor & MaybeThenableConstructor } */
+ var konstructor = Number
+ konstructor.prototype.then = function () {};
},
function () {
- delete Number.prototype.then;
+ /** @type { NumberConstructor & MaybeThenableConstructor } */
+ var konstructor = Number
+ delete konstructor.prototype.then;
}
);
});
diff --git a/lib/tests/helpers/reasons.d.ts b/lib/tests/helpers/reasons.d.ts
new file mode 100644
index 0000000..f688d8c
--- /dev/null
+++ b/lib/tests/helpers/reasons.d.ts
@@ -0,0 +1,13 @@
+export function __undefined_(): undefined;
+export function __null_(): null;
+export function __false_(): boolean;
+export function __0_(): number;
+export function _an_error(): Error;
+export function _an_error_without_a_stack(): Error;
+export function _a_date(): Date;
+export function _an_object(): {};
+export function _an_always_pending_thenable(): {
+ then: () => void;
+};
+export function _a_fulfilled_promise(): any;
+export function _a_rejected_promise(): any;
diff --git a/lib/tests/helpers/testThreeCases.d.ts b/lib/tests/helpers/testThreeCases.d.ts
new file mode 100644
index 0000000..cdf3a3b
--- /dev/null
+++ b/lib/tests/helpers/testThreeCases.d.ts
@@ -0,0 +1,2 @@
+export function testFulfilled(value: any, test: any): void;
+export function testRejected(reason: any, test: any): void;
diff --git a/lib/tests/helpers/thenables.d.ts b/lib/tests/helpers/thenables.d.ts
new file mode 100644
index 0000000..3d66335
--- /dev/null
+++ b/lib/tests/helpers/thenables.d.ts
@@ -0,0 +1,32 @@
+export const fulfilled: {
+ "a synchronously-fulfilled custom thenable": (value: any) => {
+ then: (onFulfilled: any) => void;
+ };
+ "an asynchronously-fulfilled custom thenable": (value: any) => {
+ then: (onFulfilled: any) => void;
+ };
+ "a synchronously-fulfilled one-time thenable": (value: any) => any;
+ "a thenable that tries to fulfill twice": (value: any) => {
+ then: (onFulfilled: any) => void;
+ };
+ "a thenable that fulfills but then throws": (value: any) => {
+ then: (onFulfilled: any) => never;
+ };
+ "an already-fulfilled promise": (value: any) => any;
+ "an eventually-fulfilled promise": (value: any) => any;
+};
+export const rejected: {
+ "a synchronously-rejected custom thenable": (reason: any) => {
+ then: (_onFulfilled: any, onRejected: any) => void;
+ };
+ "an asynchronously-rejected custom thenable": (reason: any) => {
+ then: (_onFulfilled: any, onRejected: any) => void;
+ };
+ "a synchronously-rejected one-time thenable": (reason: any) => any;
+ "a thenable that immediately throws in `then`": (reason: any) => {
+ then: () => never;
+ };
+ "an object with a throwing `then` accessor": (reason: any) => any;
+ "an already-rejected promise": (reason: any) => any;
+ "an eventually-rejected promise": (reason: any) => any;
+};
diff --git a/lib/tests/helpers/thenables.js b/lib/tests/helpers/thenables.js
index 8f74d2e..b8501a0 100644
--- a/lib/tests/helpers/thenables.js
+++ b/lib/tests/helpers/thenables.js
@@ -77,7 +77,7 @@ exports.fulfilled = {
exports.rejected = {
"a synchronously-rejected custom thenable": function (reason) {
return {
- then: function (onFulfilled, onRejected) {
+ then: function (_onFulfilled, onRejected) {
onRejected(reason);
}
};
@@ -85,7 +85,7 @@ exports.rejected = {
"an asynchronously-rejected custom thenable": function (reason) {
return {
- then: function (onFulfilled, onRejected) {
+ then: function (_onFulfilled, onRejected) {
setTimeout(function () {
onRejected(reason);
}, 0);
@@ -100,7 +100,7 @@ exports.rejected = {
get: function () {
if (numberOfTimesThenRetrieved === 0) {
++numberOfTimesThenRetrieved;
- return function (onFulfilled, onRejected) {
+ return function (_onFulfilled, onRejected) {
onRejected(reason);
};
}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..85c9478
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,994 @@
+{
+ "name": "promises-aplus-tests-refreshed",
+ "version": "2.3.3",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "promises-aplus-tests-refreshed",
+ "version": "2.3.3",
+ "license": "WTFPL",
+ "dependencies": {
+ "mocha": "latest",
+ "sinon": "latest",
+ "underscore": "latest"
+ },
+ "bin": {
+ "promises-aplus-tests-refreshed": "lib/cli.js"
+ },
+ "devDependencies": {
+ "@tsconfig/node-lts-strictest-esm": "latest",
+ "@types/mocha": "latest",
+ "@types/node": "latest",
+ "@types/underscore": "latest",
+ "typescript": "latest"
+ }
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
+ "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
+ "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0"
+ }
+ },
+ "node_modules/@sinonjs/samsam": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz",
+ "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==",
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "lodash.get": "^4.4.2",
+ "type-detect": "^4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/text-encoding": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
+ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ=="
+ },
+ "node_modules/@tsconfig/node-lts-strictest-esm": {
+ "version": "18.12.1",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node-lts-strictest-esm/-/node-lts-strictest-esm-18.12.1.tgz",
+ "integrity": "sha512-LvBLmaC6Q/txTddLc11OeMHF9XjJFzlilkETJuvBlUvHy9pPiMsoH3nxWZM1FMSO53zp4mJP6gzOzxKEq0me7Q==",
+ "dev": true
+ },
+ "node_modules/@types/mocha": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz",
+ "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "18.11.18",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==",
+ "dev": true
+ },
+ "node_modules/@types/underscore": {
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz",
+ "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==",
+ "dev": true
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "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=="
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "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==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "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==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "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==",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "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==",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "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==",
+ "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",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/just-extend": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
+ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg=="
+ },
+ "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==",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
+ "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/nise": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz",
+ "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==",
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@sinonjs/text-encoding": "^0.7.1",
+ "just-extend": "^4.0.2",
+ "path-to-regexp": "^1.7.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "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==",
+ "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==",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "engines": {
+ "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==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dependencies": {
+ "isarray": "0.0.1"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/sinon": {
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz",
+ "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==",
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "@sinonjs/fake-timers": "10.0.2",
+ "@sinonjs/samsam": "^7.0.1",
+ "diff": "^5.0.0",
+ "nise": "^5.1.2",
+ "supports-color": "^7.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/sinon"
+ }
+ },
+ "node_modules/sinon/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/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==",
+ "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",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
+ "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+ },
+ "node_modules/workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw=="
+ },
+ "node_modules/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==",
+ "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",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index f48659c..0bc92f7 100644
--- a/package.json
+++ b/package.json
@@ -1,29 +1,38 @@
{
- "name": "promises-aplus-tests",
+ "name": "promises-aplus-tests-refreshed",
"description": "Compliance test suite for Promises/A+",
"keywords": ["promises", "promises-aplus"],
- "version": "2.1.2",
+ "version": "2.3.3",
"implements": ["Promises/A+ 1.1.0"],
"author": "Domenic Denicola (https://domenic.me)",
+ "contributors": [
+ "Domenic Denicola (https://domenic.me)",
+ "Shad Sterling "
+ ],
"license": "WTFPL",
- "repository": "promises-aplus/promises-tests",
+ "repository": "ShadSterling/promises-aplus-tests-refreshed",
+ "homepage": "https://promisesaplus.com/",
"main": "lib/programmaticRunner.js",
"bin": "lib/cli.js",
"files": [
"lib/"
],
"scripts": {
- "lint": "jshint lib",
- "test": "mocha",
- "prepublish": "node ./scripts/generateTestFiles.js"
+ "test": "mocha --reporter dot",
+ "regenerate": "rm lib/testFiles.js lib/*.d.ts lib/*/*.d.ts lib/*/*/*.d.ts scripts/*.d.ts test/*.d.ts; node ./scripts/generateTestFiles.js && tsc",
+ "update": "rm -rf package-lock.json node_modules; npm i && npm audit && npm run regenerate && npm run test"
},
"dependencies": {
- "mocha": "^2.5.3",
- "sinon": "^1.10.3",
- "underscore": "~1.8.3"
+ "mocha": "latest",
+ "sinon": "latest",
+ "underscore": "latest"
},
"devDependencies": {
- "jshint": "^2.9.2"
+ "@tsconfig/node-lts-strictest-esm": "latest",
+ "@types/mocha": "latest",
+ "@types/node": "latest",
+ "@types/underscore": "latest",
+ "typescript": "latest"
},
"browser": {
"mocha": false
diff --git a/scripts/generateTestFiles.d.ts b/scripts/generateTestFiles.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/scripts/generateTestFiles.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/scripts/generateTestFiles.js b/scripts/generateTestFiles.js
index 7d41f9a..9e015f2 100644
--- a/scripts/generateTestFiles.js
+++ b/scripts/generateTestFiles.js
@@ -1,11 +1,11 @@
"use strict";
-var fs = require("fs");
-var path = require("path");
+let fs = require("fs");
+let path = require("path");
-var testsDir = path.resolve(__dirname, "../lib/tests");
-var testDirFiles = fs.readdirSync(testsDir);
+let testsDir = path.resolve(__dirname, "../lib/tests");
+let testDirFiles = fs.readdirSync(testsDir);
-var outFile = fs.createWriteStream(path.resolve(__dirname, "../lib/testFiles.js"), { encoding: "utf-8" });
+let outFile = fs.createWriteStream(path.resolve(__dirname, "../lib/testFiles.js"), { encoding: "utf-8" });
outFile.write("\"use strict\";\n");
diff --git a/test/getMochaOptsTest.d.ts b/test/getMochaOptsTest.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/test/getMochaOptsTest.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/test/getMochaOptsTest.js b/test/getMochaOptsTest.js
index 8b7f175..c29f754 100644
--- a/test/getMochaOptsTest.js
+++ b/test/getMochaOptsTest.js
@@ -1,11 +1,11 @@
"use strict";
-var assert = require("assert");
-var getMochaOpts = require("../lib/getMochaOpts");
+let assert = require("assert");
+let getMochaOpts = require("../lib/getMochaOpts");
describe("getMochaOpts", function() {
function test(argsString, expectedOpts) {
- var opts = getMochaOpts(argsString.split(" "));
+ let opts = getMochaOpts(argsString.split(" "));
assert.deepEqual(opts, expectedOpts);
}
diff --git a/test/programmaticRunnerTest.d.ts b/test/programmaticRunnerTest.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/test/programmaticRunnerTest.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/test/programmaticRunnerTest.js b/test/programmaticRunnerTest.js
new file mode 100644
index 0000000..a95a7cf
--- /dev/null
+++ b/test/programmaticRunnerTest.js
@@ -0,0 +1,50 @@
+"use strict";
+
+let PromisesAPlusTests = require("../lib/programmaticRunner");
+
+
+/** Test-compatible Wrapper for a pending standard-library Promise */
+// /** @type { PromisesAPlusTests.Deferred } */
+class DeferredPromise {
+
+ /** Instead of passing functions to an executor callback, return them */
+ constructor() {
+ let __resolver;
+ let __rejecter;
+ this.promise = new Promise( (resolve,reject) => {
+ __resolver = resolve;
+ __rejecter = reject;
+ } );
+ this._resolver = __resolver;
+ this._rejecter = __rejecter;
+ }
+
+ /** Settles [[promise]] to fulfilled */
+ resolve( value ) { this._resolver( value ); }
+
+ /** Settles [[promise]] to rejected */
+ reject( reason ) { this._rejecter( reason ); }
+
+}
+
+/** Test-compatible Adapter for standard-library Promise */
+// /** @type { PromisesAPlusTests.Adapter } */
+class PromiseAdapter {
+
+ constructor() { throw "Do not instantiate, use the class"; }
+
+ /** Returns a [[Promise]] which has already resolved */
+ static resolved(value ) { return new Promise( ( resolve,_reject) => { resolve(value ); } ); };
+
+ /** Returns a [[Promise]] which has already rejected */
+ /** @type { ( reason: any ) => Promise } */
+ static rejected(reason) { return new Promise( (_resolve, reject) => { reject( reason); } ); };
+
+ /** Returns a [[DeferredPromise]] */
+ static deferred( ) { return new DeferredPromise; };
+
+ }
+
+describe( "Test tests on standard-library Promise", () => {
+ PromisesAPlusTests.mocha( PromiseAdapter );
+} );
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..4d2d3ef
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "@tsconfig/node-lts-strictest-esm/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "declaration": true,
+ "emitDeclarationOnly": true,
+ "noImplicitAny": false, // TODO: add types everywhere
+ },
+}