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+ logo - +Promises/A+ logo -# 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 + }, +}