From 429cf6a55b6ccd270d70e57a9d87233e83bc6335 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 15:57:01 -0700 Subject: [PATCH 001/113] List all files for `getScriptFileNames` (#985) --- src/index.spec.ts | 73 ++++++++++++++++++++--------------- src/index.ts | 10 +++-- tests/issue-884/index.ts | 5 +++ tests/issue-884/tsconfig.json | 18 +++++++++ 4 files changed, 72 insertions(+), 34 deletions(-) create mode 100644 tests/issue-884/index.ts create mode 100644 tests/issue-884/tsconfig.json diff --git a/src/index.spec.ts b/src/index.spec.ts index 7786eb41f..cfb7f4ffe 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -8,12 +8,14 @@ import { register, create, VERSION } from './index' const TEST_DIR = join(__dirname, '../tests') const PROJECT = join(TEST_DIR, 'tsconfig.json') -const BIN_EXEC = `node "${join(__dirname, '../dist/bin')}" --project "${PROJECT}"` -const SCRIPT_EXEC = `node "${join(__dirname, '../dist/bin-script')}"` +const BIN_PATH = join(__dirname, '../dist/bin') +const BIN_SCRIPT_PATH = join(__dirname, '../dist/bin-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ describe('ts-node', function () { + const cmd = `node "${BIN_PATH}" --project "${PROJECT}"` + this.timeout(10000) it('should export the correct version', function () { @@ -24,7 +26,7 @@ describe('ts-node', function () { this.slow(1000) it('should execute cli', function (done) { - exec(`${BIN_EXEC} tests/hello-world`, function (err, stdout) { + exec(`${cmd} tests/hello-world`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') @@ -44,7 +46,7 @@ describe('ts-node', function () { }) it('should execute cli with absolute path', function (done) { - exec(`${BIN_EXEC} "${join(TEST_DIR, 'hello-world')}"`, function (err, stdout) { + exec(`${cmd} "${join(TEST_DIR, 'hello-world')}"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') @@ -53,7 +55,7 @@ describe('ts-node', function () { }) it('should print scripts', function (done) { - exec(`${BIN_EXEC} -pe "import { example } from './tests/complex/index';example()"`, function (err, stdout) { + exec(`${cmd} -pe "import { example } from './tests/complex/index';example()"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('example\n') @@ -62,7 +64,7 @@ describe('ts-node', function () { }) it('should provide registered information globally', function (done) { - exec(`${BIN_EXEC} tests/env`, function (err, stdout) { + exec(`${cmd} tests/env`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('object\n') @@ -85,7 +87,7 @@ describe('ts-node', function () { it('should allow js', function (done) { exec( [ - BIN_EXEC, + cmd, '-O "{\\\"allowJs\\\":true}"', '-pe "import { main } from \'./tests/allow-js/run\';main()"' ].join(' '), @@ -101,7 +103,7 @@ describe('ts-node', function () { it('should include jsx when `allow-js` true', function (done) { exec( [ - BIN_EXEC, + cmd, '-O "{\\\"allowJs\\\":true}"', '-pe "import { Foo2 } from \'./tests/allow-js/with-jsx\'; Foo2.sayHi()"' ].join(' '), @@ -117,7 +119,7 @@ describe('ts-node', function () { it('should eval code', function (done) { exec( - `${BIN_EXEC} -e "import * as m from './tests/module';console.log(m.example('test'))"`, + `${cmd} -e "import * as m from './tests/module';console.log(m.example('test'))"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('TEST\n') @@ -128,7 +130,7 @@ describe('ts-node', function () { }) it('should import empty files', function (done) { - exec(`${BIN_EXEC} -e "import './tests/empty'"`, function (err, stdout) { + exec(`${cmd} -e "import './tests/empty'"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') @@ -137,7 +139,7 @@ describe('ts-node', function () { }) it('should throw errors', function (done) { - exec(`${BIN_EXEC} -e "import * as m from './tests/module';console.log(m.example(123))"`, function (err) { + exec(`${cmd} -e "import * as m from './tests/module';console.log(m.example(123))"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } @@ -153,7 +155,7 @@ describe('ts-node', function () { it('should be able to ignore diagnostic', function (done) { exec( - `${BIN_EXEC} --ignore-diagnostics 2345 -e "import * as m from './tests/module';console.log(m.example(123))"`, + `${cmd} --ignore-diagnostics 2345 -e "import * as m from './tests/module';console.log(m.example(123))"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') @@ -169,7 +171,7 @@ describe('ts-node', function () { }) it('should work with source maps', function (done) { - exec(`${BIN_EXEC} tests/throw`, function (err) { + exec(`${cmd} tests/throw`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } @@ -186,7 +188,7 @@ describe('ts-node', function () { }) it('eval should work with source maps', function (done) { - exec(`${BIN_EXEC} -pe "import './tests/throw'"`, function (err) { + exec(`${cmd} -pe "import './tests/throw'"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } @@ -202,7 +204,7 @@ describe('ts-node', function () { }) it('should support transpile only mode', function (done) { - exec(`${BIN_EXEC} --transpile-only -pe "x"`, function (err) { + exec(`${cmd} --transpile-only -pe "x"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } @@ -214,7 +216,7 @@ describe('ts-node', function () { }) it('should throw error even in transpileOnly mode', function (done) { - exec(`${BIN_EXEC} --transpile-only -pe "console."`, function (err) { + exec(`${cmd} --transpile-only -pe "console."`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } @@ -226,7 +228,7 @@ describe('ts-node', function () { }) it('should pipe into `ts-node` and evaluate', function (done) { - const cp = exec(BIN_EXEC, function (err, stdout) { + const cp = exec(cmd, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('hello\n') @@ -237,7 +239,7 @@ describe('ts-node', function () { }) it('should pipe into `ts-node`', function (done) { - const cp = exec(`${BIN_EXEC} -p`, function (err, stdout) { + const cp = exec(`${cmd} -p`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('true\n') @@ -248,7 +250,7 @@ describe('ts-node', function () { }) it('should pipe into an eval script', function (done) { - const cp = exec(`${BIN_EXEC} --transpile-only -pe 'process.stdin.isTTY'`, function (err, stdout) { + const cp = exec(`${cmd} --transpile-only -pe 'process.stdin.isTTY'`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('undefined\n') @@ -259,7 +261,7 @@ describe('ts-node', function () { }) it('should support require flags', function (done) { - exec(`${BIN_EXEC} -r ./tests/hello-world -pe "console.log('success')"`, function (err, stdout) { + exec(`${cmd} -r ./tests/hello-world -pe "console.log('success')"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n') @@ -268,7 +270,7 @@ describe('ts-node', function () { }) it('should support require from node modules', function (done) { - exec(`${BIN_EXEC} -r typescript -e "console.log('success')"`, function (err, stdout) { + exec(`${cmd} -r typescript -e "console.log('success')"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('success\n') @@ -277,7 +279,7 @@ describe('ts-node', function () { }) it.skip('should use source maps with react tsx', function (done) { - exec(`${BIN_EXEC} -r ./tests/emit-compiled.ts tests/jsx-react.tsx`, function (err, stdout) { + exec(`${cmd} -r ./tests/emit-compiled.ts tests/jsx-react.tsx`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('todo') @@ -286,7 +288,7 @@ describe('ts-node', function () { }) it('should allow custom typings', function (done) { - exec(`${BIN_EXEC} tests/custom-types`, function (err, stdout) { + exec(`${cmd} tests/custom-types`, function (err, stdout) { expect(err).to.match(/Error: Cannot find module 'does-not-exist'/) return done() @@ -294,7 +296,7 @@ describe('ts-node', function () { }) it('should preserve `ts-node` context with child process', function (done) { - exec(`${BIN_EXEC} tests/child-process`, function (err, stdout) { + exec(`${cmd} tests/child-process`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') @@ -303,7 +305,7 @@ describe('ts-node', function () { }) it('should import js before ts by default', function (done) { - exec(`${BIN_EXEC} tests/import-order/compiled`, function (err, stdout) { + exec(`${cmd} tests/import-order/compiled`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, JavaScript!\n') @@ -312,7 +314,7 @@ describe('ts-node', function () { }) it('should import ts before js when --prefer-ts-exts flag is present', function (done) { - exec(`${BIN_EXEC} --prefer-ts-exts tests/import-order/compiled`, function (err, stdout) { + exec(`${cmd} --prefer-ts-exts tests/import-order/compiled`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') @@ -321,7 +323,7 @@ describe('ts-node', function () { }) it('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', function (done) { - exec(`${BIN_EXEC} tests/import-order/compiled`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { + exec(`${cmd} tests/import-order/compiled`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') @@ -330,7 +332,7 @@ describe('ts-node', function () { }) it('should ignore .d.ts files', function (done) { - exec(`${BIN_EXEC} tests/import-order/importer`, function (err, stdout) { + exec(`${cmd} tests/import-order/importer`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, World!\n') @@ -338,9 +340,18 @@ describe('ts-node', function () { }) }) + it('issue #884', function (done) { + exec(`node "${BIN_PATH}" --project tests/issue-884/tsconfig.json tests/issue-884`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('') + + return done() + }) + }) + if (semver.gte(ts.version, '2.7.0')) { it('should support script mode', function (done) { - exec(`${SCRIPT_EXEC} tests/scope/a/log`, function (err, stdout) { + exec(`node ${BIN_SCRIPT_PATH} tests/scope/a/log`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('.ts\n') @@ -414,7 +425,7 @@ describe('ts-node', function () { describe('compiler host', function () { it('should execute cli', function (done) { - exec(`${BIN_EXEC} --compiler-host tests/hello-world`, function (err, stdout) { + exec(`${cmd} --compiler-host tests/hello-world`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') @@ -423,7 +434,7 @@ describe('ts-node', function () { }) it('should give ts error for invalid node_modules', function (done) { - exec(`${BIN_EXEC} --compiler-host --skip-ignore tests/from-node-modules`, function (err, stdout) { + exec(`${cmd} --compiler-host --skip-ignore tests/from-node-modules`, function (err, stdout) { if (err === null) return done('Expected an error') expect(err.message).to.contain('Unable to compile file from external library') diff --git a/src/index.ts b/src/index.ts index 90e6cd6ec..e4ac66c91 100644 --- a/src/index.ts +++ b/src/index.ts @@ -471,7 +471,7 @@ export function create (rawOptions: CreateOptions = {}): Register { // Create the compiler host for type checking. const serviceHost: _ts.LanguageServiceHost = { getProjectVersion: () => String(projectVersion), - getScriptFileNames: () => rootFileNames, + getScriptFileNames: () => Array.from(fileContents.keys()), getScriptVersion: (fileName: string) => { const version = fileVersions.get(fileName) return version === undefined ? '' : version.toString() @@ -539,7 +539,7 @@ export function create (rawOptions: CreateOptions = {}): Register { const programBefore = service.getProgram() if (programBefore !== previousProgram) { - debug(`compiler rebuilt Program instance when getting output for ${ fileName }`) + debug(`compiler rebuilt Program instance when getting output for ${fileName}`) } const output = service.getEmitOutput(fileName) @@ -549,7 +549,11 @@ export function create (rawOptions: CreateOptions = {}): Register { .concat(service.getSyntacticDiagnostics(fileName)) const programAfter = service.getProgram() - debug('invariant: Is service.getProject() identical before and after getting emit output and diagnostics? (should always be true) ', programBefore === programAfter) + + debug( + 'invariant: Is service.getProject() identical before and after getting emit output and diagnostics? (should always be true) ', + programBefore === programAfter + ) previousProgram = programAfter diff --git a/tests/issue-884/index.ts b/tests/issue-884/index.ts new file mode 100644 index 000000000..84dc7d9a6 --- /dev/null +++ b/tests/issue-884/index.ts @@ -0,0 +1,5 @@ +const timeout = setTimeout(() => {}, 0); + +if (timeout.unref) { + timeout.unref(); +} diff --git a/tests/issue-884/tsconfig.json b/tests/issue-884/tsconfig.json new file mode 100644 index 000000000..a85c3213d --- /dev/null +++ b/tests/issue-884/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "module": "umd", + "target": "esnext", + "sourceMap": true, + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "noImplicitAny": true, + "skipLibCheck": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": false, + "declaration": true, + "strict": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "lib": ["es2015", "es2017.object", "dom"] + } +} From 2e9a2f170f554700470c7086089abb38b8d41adf Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 16:06:56 -0700 Subject: [PATCH 002/113] Simplify `projectVersion` incrementing --- src/index.ts | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/index.ts b/src/index.ts index e4ac66c91..59bd8ec97 100644 --- a/src/index.ts +++ b/src/index.ts @@ -507,29 +507,21 @@ export function create (rawOptions: CreateOptions = {}): Register { const service = ts.createLanguageService(serviceHost, registry) const updateMemoryCache = (contents: string, fileName: string) => { - let shouldIncrementProjectVersion = false const fileVersion = fileVersions.get(fileName) || 0 - const isFileInCache = fileVersion !== 0 // Add to `rootFiles` when discovered for the first time. - if (!isFileInCache) { + if (fileVersion === 0) { rootFileNames.push(fileName) - // Modifying rootFileNames means a project change - shouldIncrementProjectVersion = true } const previousContents = fileContents.get(fileName) // Avoid incrementing cache when nothing has changed. - if (previousContents !== contents) { + if (contents !== previousContents) { fileVersions.set(fileName, fileVersion + 1) fileContents.set(fileName, contents) - // Only bump project version when file is modified in cache, not when discovered for the first time - if (isFileInCache) { - shouldIncrementProjectVersion = true - } + // Increment project version for every file change. + projectVersion++ } - - if (shouldIncrementProjectVersion) projectVersion++ } let previousProgram: _ts.Program | undefined = undefined From cb70a4ad70b0a552742f0bd9e2035703df49f7c8 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 16:14:49 -0700 Subject: [PATCH 003/113] Upgrade dev dependencies --- package-lock.json | 1070 ++++++++++++++++++--------------------------- package.json | 14 +- 2 files changed, 428 insertions(+), 656 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2bd4d971..45c978a7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,40 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, "@types/chai": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.10.tgz", @@ -17,21 +51,21 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", - "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, "@types/mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.0.0.tgz", - "integrity": "sha512-ZS0vBV7Jn5Z/Q4T3VXauEKMDCV8nWOtJJg90OsDylkYJiQwcWtKuLzohWzrthBkerUF7DLMmJcwOPEP0i/AOXw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", "dev": true }, "@types/node": { - "version": "12.7.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz", - "integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==", + "version": "13.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.2.tgz", + "integrity": "sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg==", "dev": true }, "@types/proxyquire": { @@ -47,10 +81,13 @@ "dev": true }, "@types/semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-OO0srjOGH99a4LUN2its3+r6CBYcplhJ466yLqs+zvAWgphCpS8hYZEZ797tRDP/QKcqTdb/YCN6ifASoAWkrQ==", - "dev": true + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.1.0.tgz", + "integrity": "sha512-pOKLaubrAEMUItGNpgwl0HMFPrSAFic8oSVIvfu1UwcgGNmNyK9gyhBHKmBnUTwwVvpZfkzUC0GaMgnL6P86uA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/source-map-support": { "version": "0.5.0", @@ -81,16 +118,29 @@ "dev": true }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } }, "arg": { "version": "4.1.0", @@ -134,38 +184,18 @@ "is-buffer": "^2.0.2" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -176,6 +206,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -214,9 +253,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -224,21 +263,6 @@ "supports-color": "^5.3.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -256,6 +280,22 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -273,15 +313,6 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -301,26 +332,9 @@ "requires": { "ansi-regex": "^4.1.0" } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -340,8 +354,7 @@ "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", @@ -355,27 +368,6 @@ "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", "dev": true }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -453,33 +445,29 @@ "iconv-lite": "~0.4.13" } }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -536,21 +524,6 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -582,6 +555,15 @@ "merge-descriptors": "~1.0.0" } }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -598,14 +580,6 @@ "dev": true, "requires": { "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } } }, "follow-redirects": { @@ -640,6 +614,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -658,15 +639,6 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -680,6 +652,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -707,15 +688,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -723,9 +695,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "he": { @@ -756,11 +728,14 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true + "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==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } }, "is-buffer": { "version": "2.0.4", @@ -769,15 +744,21 @@ "dev": true }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { @@ -786,6 +767,21 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", @@ -793,12 +789,12 @@ "dev": true }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "has": "^1.0.1" + "has": "^1.0.3" } }, "is-stream": { @@ -808,12 +804,12 @@ "dev": true }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "isarray": { @@ -916,15 +912,6 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -952,12 +939,12 @@ "dev": true }, "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { - "chalk": "^2.0.1" + "chalk": "^2.4.2" } }, "loose-envify": { @@ -974,38 +961,12 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=" }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1022,30 +983,31 @@ "dev": true }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" }, "dependencies": { "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz", + "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", + "chokidar": "3.3.0", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", @@ -1054,62 +1016,27 @@ "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", - "log-symbols": "2.2.0", + "log-symbols": "3.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", + "mkdirp": "0.5.3", "ms": "2.1.1", - "node-environment-flags": "1.0.5", + "node-environment-flags": "1.0.6", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } - } - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -1124,60 +1051,19 @@ "path-is-absolute": "^1.0.0" } }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "minimist": "^1.2.5" } }, "which": { @@ -1188,25 +1074,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } } } }, @@ -1228,16 +1095,10 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", @@ -1245,9 +1106,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -1271,14 +1132,11 @@ "abbrev": "1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, "ntypescript": { "version": "1.201706190042.1", @@ -1286,18 +1144,18 @@ "integrity": "sha1-hmrpzDZoixQWBhVu0LzDXN9TYnE=", "dev": true }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -1317,13 +1175,13 @@ } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "once": { @@ -1367,39 +1225,10 @@ "wordwrap": "~1.0.0" } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -1432,12 +1261,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -1450,6 +1273,12 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -1487,16 +1316,6 @@ "resolve": "~1.1.7" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "react": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", @@ -1509,6 +1328,15 @@ "prop-types": "^15.6.0" } }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1553,9 +1381,9 @@ } }, "semver": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", - "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, "set-blocking": { @@ -1570,27 +1398,6 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1619,39 +1426,36 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } }, "strip-json-comments": { "version": "2.0.1", @@ -1660,53 +1464,54 @@ "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", + "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", - "diff": "^3.2.0", + "diff": "^4.0.1", "glob": "^7.1.1", - "js-yaml": "^3.7.0", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "tslib": "^1.10.0", + "tsutils": "^2.29.0" }, "dependencies": { - "commander": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", - "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1718,18 +1523,18 @@ } }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -1802,9 +1607,9 @@ "dev": true }, "typescript-json-schema": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.40.0.tgz", - "integrity": "sha512-C8D3Ca6+1x3caWOR+u45Shn3KqkRZi5M3+E8ePpEmYMqOh3xhhLdq+39pqT0Bf8+fCgAmpTFSJMT6Xwqbm0Tkw==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.42.0.tgz", + "integrity": "sha512-9WO+lVmlph7Ecb7lPd9tU84XFUQh44kpAf3cWe/Ym4G5EKw/SS6XGpi1DZDthvxqkIdNSDlWi7FhKfxuIV/3yw==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", @@ -1814,6 +1619,12 @@ "yargs": "^14.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -1827,6 +1638,55 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -1884,33 +1744,40 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -1928,13 +1795,12 @@ "dev": true }, "yargs": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz", - "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", - "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", @@ -1943,7 +1809,7 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^15.0.0" + "yargs-parser": "^13.1.2" }, "dependencies": { "ansi-regex": { @@ -1971,122 +1837,28 @@ "requires": { "ansi-regex": "^4.1.0" } - }, - "yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } } }, "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "lodash": "^4.17.15", + "yargs": "^13.3.0" } }, "yn": { diff --git a/package.json b/package.json index 31c5fc067..1d1bd1ecc 100644 --- a/package.json +++ b/package.json @@ -57,25 +57,25 @@ "devDependencies": { "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", - "@types/mocha": "^5.0.0", - "@types/node": "^12.7.12", + "@types/mocha": "^7.0.2", + "@types/node": "^13.9.2", "@types/proxyquire": "^1.3.28", "@types/react": "^16.0.2", - "@types/semver": "^6.0.0", + "@types/semver": "^7.1.0", "@types/source-map-support": "^0.5.0", "axios": "^0.19.0", "chai": "^4.0.1", "istanbul": "^0.4.0", - "mocha": "^6.1.4", + "mocha": "^7.1.1", "ntypescript": "^1.201507091536.1", "proxyquire": "^2.0.0", "react": "^16.0.0", "rimraf": "^3.0.0", - "semver": "^6.1.0", - "tslint": "^5.11.0", + "semver": "^7.1.3", + "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", "typescript": "^3.7.2", - "typescript-json-schema": "0.40.0" + "typescript-json-schema": "^0.42.0" }, "peerDependencies": { "typescript": ">=2.7" From aeb4817697a9704337a2160e7cb2cd8fdae7d3c8 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 16:17:30 -0700 Subject: [PATCH 004/113] Rollback `mocha` upgrade due to node.js version --- package-lock.json | 191 ++++++++-------------------------------------- package.json | 4 +- 2 files changed, 34 insertions(+), 161 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45c978a7a..2050722dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,9 +57,9 @@ "dev": true }, "@types/mocha": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", - "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", "dev": true }, "@types/node": { @@ -132,16 +132,6 @@ "color-convert": "^1.9.0" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, "arg": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", @@ -190,12 +180,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -206,15 +190,6 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -280,22 +255,6 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -555,15 +514,6 @@ "merge-descriptors": "~1.0.0" } }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -614,13 +564,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -652,15 +595,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -728,15 +662,6 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "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==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", @@ -755,33 +680,12 @@ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", @@ -939,12 +843,12 @@ "dev": true }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "^2.4.2" + "chalk": "^2.0.1" } }, "loose-envify": { @@ -1000,14 +904,13 @@ } }, "mocha": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz", - "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", + "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", - "chokidar": "3.3.0", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", @@ -1016,18 +919,18 @@ "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", - "log-symbols": "3.0.0", + "log-symbols": "2.2.0", "minimatch": "3.0.4", - "mkdirp": "0.5.3", + "mkdirp": "0.5.1", "ms": "2.1.1", - "node-environment-flags": "1.0.6", + "node-environment-flags": "1.0.5", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", + "yargs": "13.3.0", + "yargs-parser": "13.1.1", "yargs-unparser": "1.6.0" }, "dependencies": { @@ -1052,18 +955,18 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "0.0.8" } }, "which": { @@ -1096,9 +999,9 @@ "dev": true }, "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", @@ -1132,12 +1035,6 @@ "abbrev": "1" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, "ntypescript": { "version": "1.201706190042.1", "resolved": "https://registry.npmjs.org/ntypescript/-/ntypescript-1.201706190042.1.tgz", @@ -1273,12 +1170,6 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -1328,15 +1219,6 @@ "prop-types": "^15.6.0" } }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1472,15 +1354,6 @@ "has-flag": "^3.0.0" } }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -1795,9 +1668,9 @@ "dev": true }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -1809,7 +1682,7 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "yargs-parser": "^13.1.1" }, "dependencies": { "ansi-regex": { @@ -1841,9 +1714,9 @@ } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index 1d1bd1ecc..2b8d280dc 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "devDependencies": { "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", - "@types/mocha": "^7.0.2", + "@types/mocha": "^5.2.7", "@types/node": "^13.9.2", "@types/proxyquire": "^1.3.28", "@types/react": "^16.0.2", @@ -66,7 +66,7 @@ "axios": "^0.19.0", "chai": "^4.0.1", "istanbul": "^0.4.0", - "mocha": "^7.1.1", + "mocha": "^6.2.2", "ntypescript": "^1.201507091536.1", "proxyquire": "^2.0.0", "react": "^16.0.0", From fb172110bdda5bc29510b28834e6d6bb95e29749 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 16:23:12 -0700 Subject: [PATCH 005/113] Add `sanitize=true` to README for SVGs to work --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f0e155dc..1f79e9721 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![TypeScript Node](logo.svg) +# ![TypeScript Node](logo.svg?sanitize=true) [![NPM version][npm-image]][npm-url] [![NPM downloads][downloads-image]][downloads-url] From 3766cc9075134170f614f61c0bda8681ccff0538 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 16:26:26 -0700 Subject: [PATCH 006/113] 8.8.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2050722dc..3f8b78eab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.7.0", + "version": "8.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2b8d280dc..e4f8ef4da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.7.0", + "version": "8.8.0", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "types": "dist/index.d.ts", From be2c899ca796bd6dc54e074fdb2c5a32df51213d Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 19:03:36 -0700 Subject: [PATCH 007/113] Fix `--files` support --- src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 59bd8ec97..99bb82ded 100644 --- a/src/index.ts +++ b/src/index.ts @@ -457,7 +457,7 @@ export function create (rawOptions: CreateOptions = {}): Register { // Use language services by default (TODO: invert next major version). if (!options.compilerHost) { let projectVersion = 1 - const fileVersions = new Map() + const fileVersions = new Map(rootFileNames.map(fileName => [fileName, 0])) const getCustomTransformers = () => { if (typeof transformers === 'function') { @@ -471,10 +471,10 @@ export function create (rawOptions: CreateOptions = {}): Register { // Create the compiler host for type checking. const serviceHost: _ts.LanguageServiceHost = { getProjectVersion: () => String(projectVersion), - getScriptFileNames: () => Array.from(fileContents.keys()), + getScriptFileNames: () => Array.from(fileVersions.keys()), getScriptVersion: (fileName: string) => { const version = fileVersions.get(fileName) - return version === undefined ? '' : version.toString() + return version ? version.toString() : '' }, getScriptSnapshot (fileName: string) { let contents = fileContents.get(fileName) From 0c0bc3db2d00cd71905586701abf3050e60ccf02 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 21 Mar 2020 19:04:47 -0700 Subject: [PATCH 008/113] 8.8.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f8b78eab..30f62b11c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.8.0", + "version": "8.8.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e4f8ef4da..fc5c93aa6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.8.0", + "version": "8.8.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "types": "dist/index.d.ts", From 366ac0b2aa466216b261b5bb6e7fc1913258b914 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sun, 22 Mar 2020 14:17:18 -0700 Subject: [PATCH 009/113] Add test covering `--files` flag (#987) --- src/index.spec.ts | 34 +++++++++++++++++++++++++++++----- tests/issue-986/index.ts | 1 + tests/issue-986/tsconfig.json | 5 +++++ tests/issue-986/types.ts | 1 + 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 tests/issue-986/index.ts create mode 100644 tests/issue-986/tsconfig.json create mode 100644 tests/issue-986/types.ts diff --git a/src/index.spec.ts b/src/index.spec.ts index cfb7f4ffe..725bb8b1d 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -340,12 +340,36 @@ describe('ts-node', function () { }) }) - it('issue #884', function (done) { - exec(`node "${BIN_PATH}" --project tests/issue-884/tsconfig.json tests/issue-884`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('') + describe('issue #884', function () { + it('should compile', function (done) { + exec(`node "${BIN_PATH}" --project tests/issue-884/tsconfig.json tests/issue-884`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('') - return done() + return done() + }) + }) + }) + + describe('issue #986', function () { + it('should not compile', function (done) { + exec(`node "${BIN_PATH}" --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { + expect(err).not.to.equal(null) + expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. + expect(stdout).to.equal('') + + return done() + }) + }) + + it('should compile with `--files`', function (done) { + exec(`node "${BIN_PATH}" --files --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { + expect(err).not.to.equal(null) + expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. + expect(stdout).to.equal('') + + return done() + }) }) }) diff --git a/tests/issue-986/index.ts b/tests/issue-986/index.ts new file mode 100644 index 000000000..fb8e23051 --- /dev/null +++ b/tests/issue-986/index.ts @@ -0,0 +1 @@ +console.log(TEST) diff --git a/tests/issue-986/tsconfig.json b/tests/issue-986/tsconfig.json new file mode 100644 index 000000000..28900bb1b --- /dev/null +++ b/tests/issue-986/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "module": "CommonJS" + } +} diff --git a/tests/issue-986/types.ts b/tests/issue-986/types.ts new file mode 100644 index 000000000..88473dfa4 --- /dev/null +++ b/tests/issue-986/types.ts @@ -0,0 +1 @@ +declare const TEST: string From 92cf9613828c2ba2fe37b7a0aa7895e122c16185 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sun, 22 Mar 2020 14:28:11 -0700 Subject: [PATCH 010/113] Avoid pushing to `rootFileNames` with version --- src/index.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index 99bb82ded..5e6402e00 100644 --- a/src/index.ts +++ b/src/index.ts @@ -507,17 +507,16 @@ export function create (rawOptions: CreateOptions = {}): Register { const service = ts.createLanguageService(serviceHost, registry) const updateMemoryCache = (contents: string, fileName: string) => { - const fileVersion = fileVersions.get(fileName) || 0 - // Add to `rootFiles` when discovered for the first time. - if (fileVersion === 0) { + if (!fileVersions.has(fileName)) { rootFileNames.push(fileName) } + const previousVersion = fileVersions.get(fileName) || 0 const previousContents = fileContents.get(fileName) // Avoid incrementing cache when nothing has changed. if (contents !== previousContents) { - fileVersions.set(fileName, fileVersion + 1) + fileVersions.set(fileName, previousVersion + 1) fileContents.set(fileName, contents) // Increment project version for every file change. projectVersion++ From 3f50313a4546e68099636baee210626bd7883115 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Sat, 4 Apr 2020 17:50:40 -0700 Subject: [PATCH 011/113] 8.8.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30f62b11c..2c4a4a262 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.8.1", + "version": "8.8.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fc5c93aa6..17c40d3c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.8.1", + "version": "8.8.2", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "types": "dist/index.d.ts", From 6e56c87744a425ca282e9946f91344e00064a03c Mon Sep 17 00:00:00 2001 From: Sylvain Cau Date: Tue, 7 Apr 2020 10:08:08 +0800 Subject: [PATCH 012/113] Add timestamp to debug logging (#994) * add timestamp * cra * fix linting * re-add square brackets --- src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 5e6402e00..e3d293a53 100644 --- a/src/index.ts +++ b/src/index.ts @@ -38,7 +38,9 @@ function yn (value: string | undefined) { * Debugging `ts-node`. */ const shouldDebug = yn(process.env.TS_NODE_DEBUG) -const debug = shouldDebug ? console.log.bind(console, 'ts-node') : () => undefined +const debug = shouldDebug ? + (...args: any) => console.log(`[ts-node ${new Date().toISOString()}]`, ...args) + : () => undefined const debugFn = shouldDebug ? (key: string, fn: (arg: T) => U) => { let i = 0 From 56f2079d1436d1f63a4976859cda57ab0a856b26 Mon Sep 17 00:00:00 2001 From: "Jacob D. Castro" Date: Mon, 6 Apr 2020 19:08:41 -0700 Subject: [PATCH 013/113] change order of npm installation (#993) After attempting to copy/paste local installs, I hit an error. ts-node requires a peer dependency of typescript. Therefore, I had to install typescript before ts-node for it to work. It makes sense to order these appropriately in the README. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1f79e9721..9a36d75c6 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,12 @@ ```sh # Locally in your project. -npm install -D ts-node npm install -D typescript +npm install -D ts-node # Or globally with TypeScript. -npm install -g ts-node npm install -g typescript +npm install -g ts-node ``` **Tip:** Installing modules locally allows you to control and share the versions through `package.json`. TS Node will always resolve the compiler from `cwd` before checking relative to its own installation. From 2a0f1f3b8f979dbc61726017f5de45a8b03f3c95 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 7 Apr 2020 21:31:51 -0400 Subject: [PATCH 014/113] Mention ts-node -vv flag in issue template (#1001) Makes it easier to collect version numbers --- .github/ISSUE_TEMPLATE/bug-report.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 7bf113080..e391613f0 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -31,12 +31,13 @@ https://github.com/TypeStrong/ts-node-repros ### Specifications + * ts-node version: +* node version: * TypeScript version: * tsconfig.json, if you're using one: ``` {} ``` -* node version: * Operating system and version: * If Windows, are you using WSL or WSL2?: From 1c0fde199dea48e82a4d8e966bbbd99fc73931dc Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 20 Apr 2020 14:51:32 -0400 Subject: [PATCH 015/113] Fix failing tests caused by recent changes to @types/node (#1016) https://github.com/DefinitelyTyped/DefinitelyTyped/commit/f7e28122e559359aeb1dd37b93ed74a155100f36 --- src/index.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 725bb8b1d..29b90495a 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -596,7 +596,7 @@ describe('ts-node', function () { return _compile.call(this, code, fileName) } - return old(m, fileName) + return old!(m, fileName) } }) From 3665824728c2cebecefa313419bbd2452350493e Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 20 Apr 2020 14:55:59 -0400 Subject: [PATCH 016/113] Bump source-map-support dep to fix #945 (#1015) --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c4a4a262..e85c7e1a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -197,9 +197,9 @@ "dev": true }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "builtin-modules": { "version": "1.1.1", @@ -1286,9 +1286,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.17.tgz", + "integrity": "sha512-bwdKOBZ5L0gFRh4KOxNap/J/MpvX9Yxsq9lFDx65s3o7F/NiHy7JRaGIS8MwW6tZPAq9UXE207Il0cfcb5yu/Q==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" diff --git a/package.json b/package.json index 17c40d3c4..a16a26247 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", + "source-map-support": "^0.5.17", "yn": "3.1.1" } } From a549b5a85e9c3c984afbc8c366dd9e87fa2b8bd1 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 20 Apr 2020 15:18:28 -0400 Subject: [PATCH 017/113] Fix #1004: resolve config relative to realpath of entrypoint (#1009) * add failing test for #1004 * Fix #1004 * Tweak scriptMode entrypoint resolver to include all extensions --- src/bin.ts | 31 +++++++++++++++++++++-- src/index.spec.ts | 8 ++++++ tests/main-realpath/symlink/symlink.tsx | 1 + tests/main-realpath/symlink/tsconfig.json | 1 + tests/main-realpath/target/target.tsx | 4 +++ tests/main-realpath/target/tsconfig.json | 5 ++++ 6 files changed, 48 insertions(+), 2 deletions(-) create mode 120000 tests/main-realpath/symlink/symlink.tsx create mode 100644 tests/main-realpath/symlink/tsconfig.json create mode 100644 tests/main-realpath/target/target.tsx create mode 100644 tests/main-realpath/target/tsconfig.json diff --git a/src/bin.ts b/src/bin.ts index c303129a3..9d923967d 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -7,7 +7,7 @@ import Module = require('module') import arg = require('arg') import { diffLines } from 'diff' import { Script } from 'vm' -import { readFileSync, statSync } from 'fs' +import { readFileSync, statSync, realpathSync } from 'fs' import { homedir } from 'os' import { VERSION, TSError, parse, Register, register } from './index' @@ -154,6 +154,7 @@ export function main (argv: string[]) { } const cwd = dir || process.cwd() + /** Unresolved. May point to a symlink, not realpath. May be missing file extension */ const scriptPath = args._.length ? resolve(cwd, args._[0]) : undefined const state = new EvalState(scriptPath || join(cwd, EVAL_FILENAME)) @@ -251,7 +252,28 @@ function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { throw new TypeError('Script mode cannot be combined with `--dir`') } - return dirname(scriptPath) + // Use node's own resolution behavior to ensure we follow symlinks. + // scriptPath may omit file extension or point to a directory with or without package.json. + // This happens before we are registered, so we tell node's resolver to consider ts, tsx, and jsx files. + // In extremely rare cases, is is technically possible to resolve the wrong directory, + // because we do not yet know preferTsExts, jsx, nor allowJs. + // See also, justification why this will not happen in real-world situations: + // https://github.com/TypeStrong/ts-node/pull/1009#issuecomment-613017081 + const exts = ['.js', '.jsx', '.ts', '.tsx'] + const extsTemporarilyInstalled: string[] = [] + for (const ext of exts) { + if (!hasOwnProperty(require.extensions, ext)) { // tslint:disable-line + extsTemporarilyInstalled.push(ext) + require.extensions[ext] = function() {} // tslint:disable-line + } + } + try { + return dirname(require.resolve(scriptPath)) + } finally { + for (const ext of extsTemporarilyInstalled) { + delete require.extensions[ext] // tslint:disable-line + } + } } return dir @@ -481,6 +503,11 @@ function isRecoverable (error: TSError) { return error.diagnosticCodes.every(code => RECOVERY_CODES.has(code)) } +/** Safe `hasOwnProperty` */ +function hasOwnProperty (object: any, property: string): boolean { + return Object.prototype.hasOwnProperty.call(object, property) +} + if (require.main === module) { main(process.argv.slice(2)) } diff --git a/src/index.spec.ts b/src/index.spec.ts index 29b90495a..ce3ba1639 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -379,6 +379,14 @@ describe('ts-node', function () { expect(err).to.equal(null) expect(stdout).to.equal('.ts\n') + return done() + }) + }) + it('should read tsconfig relative to realpath, not symlink, in scriptMode', function (done) { + exec(`node ${BIN_SCRIPT_PATH} tests/main-realpath/symlink/symlink.tsx`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('') + return done() }) }) diff --git a/tests/main-realpath/symlink/symlink.tsx b/tests/main-realpath/symlink/symlink.tsx new file mode 120000 index 000000000..c2c3efb1f --- /dev/null +++ b/tests/main-realpath/symlink/symlink.tsx @@ -0,0 +1 @@ +../target/target.tsx \ No newline at end of file diff --git a/tests/main-realpath/symlink/tsconfig.json b/tests/main-realpath/symlink/tsconfig.json new file mode 100644 index 000000000..9f78b68d0 --- /dev/null +++ b/tests/main-realpath/symlink/tsconfig.json @@ -0,0 +1 @@ +this tsconfig is intentionally invalid, to confirm that ts-node does *not* attempt to parse it diff --git a/tests/main-realpath/target/target.tsx b/tests/main-realpath/target/target.tsx new file mode 100644 index 000000000..1a206f56d --- /dev/null +++ b/tests/main-realpath/target/target.tsx @@ -0,0 +1,4 @@ +// Will throw a compiler error unless ./tsconfig.json is parsed, which enables JSX +function foo() { +
+} diff --git a/tests/main-realpath/target/tsconfig.json b/tests/main-realpath/target/tsconfig.json new file mode 100644 index 000000000..986627de2 --- /dev/null +++ b/tests/main-realpath/target/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "jsx": "react" + } +} From a1f1584c54d0c6d8095c76a9916dedc3613deaad Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 20 Apr 2020 15:30:26 -0400 Subject: [PATCH 018/113] Run gh actions on pull requests, not just contributor pushes (#1017) --- .github/workflows/continuous-integration.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 4ecee291a..b988e82b4 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -1,8 +1,8 @@ name: Continuous Integration -on: [push] +on: [push, pull_request] jobs: test: - name: Test ${{ matrix.flavor }} ${{ matrix.node }} ${{ matrix.typescript }} + name: "Test #${{ matrix.flavor }}: node v${{ matrix.node }}, ${{ matrix.typescript }}" runs-on: ubuntu-latest strategy: fail-fast: false From 5e192d308d89003ef4f56fd56154bda9acac51ed Mon Sep 17 00:00:00 2001 From: Sylvain Cau Date: Tue, 21 Apr 2020 03:36:16 +0800 Subject: [PATCH 019/113] Normalized filename in cache (#997) * normalized filename * Switch to normalizing once in our compile() function, so that the rest of ts-node's codebase only deals with / paths Co-authored-by: Andrew Bradley --- src/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index e3d293a53..50059bff8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -756,8 +756,9 @@ export function create (rawOptions: CreateOptions = {}): Register { // Create a simple TypeScript compiler proxy. function compile (code: string, fileName: string, lineOffset = 0) { - const [value, sourceMap] = getOutput(code, fileName, lineOffset) - const output = updateOutput(value, fileName, sourceMap, getExtension) + const normalizedFileName = normalizeSlashes(fileName) + const [value, sourceMap] = getOutput(code, normalizedFileName, lineOffset) + const output = updateOutput(value, normalizedFileName, sourceMap, getExtension) outputCache.set(fileName, output) return output } From 7160cfd7f6cb4b9943b300bdb8e5852f996ff029 Mon Sep 17 00:00:00 2001 From: Kaspar Etter Date: Mon, 20 Apr 2020 21:46:54 +0200 Subject: [PATCH 020/113] Improve the coverage of the README (#995) (#1000) * Improve the coverage of the README (#995) * Revert formatting changes * revert formatting changes * revert formatting changes * Add explanation for -vv flag * tweaking docs * more tweaks Co-authored-by: Andrew Bradley --- README.md | 75 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9a36d75c6..6e296fed4 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ npm install -g ts-node ## Usage +### Shell + ```sh # Execute a script as `node` + `tsc`. ts-node script.ts @@ -38,10 +40,33 @@ ts-node -p -e '"Hello, world!"' # Pipe scripts to execute with TypeScript. echo 'console.log("Hello, world!")' | ts-node + +# Equivalent to ts-node --script-mode +ts-node-script scripts.ts + +# Equivalent to ts-node --transpile-only +ts-node-transpile-only scripts.ts ``` ![TypeScript REPL](https://github.com/TypeStrong/ts-node/raw/master/screenshot.png) +### Shebang + +```typescript +#!/usr/bin/env ts-node-script + +console.log("Hello, world!") +``` + +`ts-node-script` is recommended because it enables `--script-mode`, discovering `tsconfig.json` relative to the script's location instead of `process.cwd()`. This makes scripts more portable. + +Passing CLI arguments via shebang is allowed on Mac but not Linux. For example, the following will fail on Linux: + +``` +#!/usr/bin/env ts-node --script-mode --transpile-only --files +// This shebang is not portable. It only works on Mac +``` + ### Programmatic You can require `ts-node` and register the loader for future requires by using `require('ts-node').register({ /* options */ })`. You can also use file shortcuts - `node -r ts-node/register` or `node -r ts-node/register/transpile-only` - depending on your preferences. @@ -122,36 +147,42 @@ Create a new Node.js configuration and add `-r ts-node/register` to "Node parame **Typescript Node** loads `tsconfig.json` automatically. Use `--skip-project` to skip loading the `tsconfig.json`. +It is resolved relative to `--dir` using [the same search behavior as `tsc`](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html). In `--script-mode`, this is the directory containing the script. Otherwise it is resolved relative to `process.cwd()`, which matches the behavior of `tsc`. + +Use `--project` to specify the path to your `tsconfig.json`, ignoring `--dir`. + **Tip**: You can use `ts-node` together with [tsconfig-paths](https://www.npmjs.com/package/tsconfig-paths) to load modules according to the `paths` section in `tsconfig.json`. ## Configuration Options -You can set options by passing them before the script path, via programmatic usage or via environment variables. +You can set options by passing them before the script path, via programmatic usage, via `tsconfig.json`, or via environment variables. ```sh ts-node --compiler ntypescript --project src/tsconfig.json hello-world.ts ``` -**Note:** [`ntypescript`](https://github.com/TypeStrong/ntypescript#readme) is an example of a TypeScript compatible `compiler`. +**Note:** [`ntypescript`](https://github.com/TypeStrong/ntypescript#readme) is an example of a TypeScript-compatible `compiler`. ### CLI Options -Supports `--print`, `--eval`, `--require` and `--interactive` similar to the [node.js CLI options](https://nodejs.org/api/cli.html). +`ts-node` supports `--print` (`-p`), `--eval` (`-e`), `--require` (`-r`) and `--interactive` (`-i`) similar to the [node.js CLI options](https://nodejs.org/api/cli.html). -* `--help` Prints help text -* `--version` Prints version information +* `-h, --help` Prints the help text +* `-v, --version` Prints the version. `-vv` prints node and typescript compiler versions, too +* `-s, --script-mode` Resolve config relative to the directory of the passed script instead of the current directory. Changes default of `--dir` ### CLI and Programmatic Options -_Environment variable denoted in parentheses._ +_The name of the environment variable and the option's default value are denoted in parentheses._ * `-T, --transpile-only` Use TypeScript's faster `transpileModule` (`TS_NODE_TRANSPILE_ONLY`, default: `false`) +* `-H, --compiler-host` Use TypeScript's compiler host API (`TS_NODE_COMPILER_HOST`, default: `false`) * `-I, --ignore [pattern]` Override the path patterns to skip compilation (`TS_NODE_IGNORE`, default: `/node_modules/`) * `-P, --project [path]` Path to TypeScript JSON project file (`TS_NODE_PROJECT`) * `-C, --compiler [name]` Specify a custom TypeScript compiler (`TS_NODE_COMPILER`, default: `typescript`) * `-D, --ignore-diagnostics [code]` Ignore TypeScript warnings by diagnostic code (`TS_NODE_IGNORE_DIAGNOSTICS`) * `-O, --compiler-options [opts]` JSON object to merge with compiler options (`TS_NODE_COMPILER_OPTIONS`) -* `--dir` Specify working directory for config resolution (`TS_NODE_CWD`, default: `process.cwd()`) +* `--dir` Specify working directory for config resolution (`TS_NODE_CWD`, default: `process.cwd()`, or `dirname(scriptPath)` if `--script-mode`) * `--scope` Scope compiler to files within `cwd` (`TS_NODE_SCOPE`, default: `false`) * `--files` Load `files`, `include` and `exclude` from `tsconfig.json` on startup (`TS_NODE_FILES`, default: `false`) * `--pretty` Use pretty diagnostic formatter (`TS_NODE_PRETTY`, default: `false`) @@ -161,11 +192,27 @@ _Environment variable denoted in parentheses._ * `--prefer-ts-exts` Re-order file extensions so that TypeScript imports are preferred (`TS_NODE_PREFER_TS_EXTS`, default: `false`) * `--log-error` Logs TypeScript errors to stderr instead of throwing exceptions (`TS_NODE_LOG_ERROR`, default: `false`) -### Programmatic Only Options +### Programmatic-only Options + +* `transformers` `_ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers)`: An object with transformers or a function that accepts a program and returns an transformers object to pass to TypeScript. Function isn't available with `transpileOnly` flag +* `readFile`: Custom TypeScript-compatible file reading function +* `fileExists`: Custom TypeScript-compatible file existence function + +### Options via tsconfig.json + +Most options can be specified by a `"ts-node"` object in `tsconfig.json` using their programmatic, camelCase names. For example, to enable `--transpile-only`: + +```json +// tsconfig.json +{ + "ts-node": { + "transpileOnly": true + }, + "compilerOptions": {} +} +``` -* `transformers` `_ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers)` An object with transformers or a function that accepts a program and returns an transformers object to pass to TypeScript. Function isn't available with `transpileOnly` flag -* `readFile` Custom TypeScript-compatible file reading function -* `fileExists` Custom TypeScript-compatible file existence function +Our bundled [JSON schema](https://unpkg.com/browse/ts-node@8.8.2/tsconfig.schema.json) lists all compatible options. ## SyntaxError @@ -183,7 +230,7 @@ For global definitions, you can use the `typeRoots` compiler option. This requi Example `tsconfig.json`: -``` +```json { "compilerOptions": { "typeRoots" : ["./node_modules/@types", "./typings"] @@ -193,7 +240,7 @@ Example `tsconfig.json`: Example project structure: -``` +```text / -- tsconfig.json -- typings/ @@ -203,7 +250,7 @@ Example project structure: Example module declaration file: -``` +```typescript declare module '' { // module definitions go here } From 07799aab2286e01547f8131f557616691281bac3 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 20 Apr 2020 16:18:40 -0400 Subject: [PATCH 021/113] Bump @types/node dependency. Tests on node 6 were doing this anyway because ancient npm does not respect package-lock.json --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e85c7e1a3..1331477a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,9 +63,9 @@ "dev": true }, "@types/node": { - "version": "13.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.2.tgz", - "integrity": "sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg==", + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.1.tgz", + "integrity": "sha512-uysqysLJ+As9jqI5yqjwP3QJrhOcUwBjHUlUxPxjbplwKoILvXVsmYWEhfmAQlrPfbRZmhJB007o4L9sKqtHqQ==", "dev": true }, "@types/proxyquire": { diff --git a/package.json b/package.json index a16a26247..2f18775c0 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", "@types/mocha": "^5.2.7", - "@types/node": "^13.9.2", + "@types/node": "^13.13.1", "@types/proxyquire": "^1.3.28", "@types/react": "^16.0.2", "@types/semver": "^7.1.0", From 47a560b0df00a071a5a7e9fc789de397e1f974ec Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 20 Apr 2020 16:22:13 -0400 Subject: [PATCH 022/113] 8.9.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1331477a4..1754da4b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.8.2", + "version": "8.9.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2f18775c0..4b6897771 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.8.2", + "version": "8.9.0", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "types": "dist/index.d.ts", From 9fee2326d3cfbdc0dbcca3ec8b6f950d3b630c0d Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 26 Apr 2020 01:34:09 -0400 Subject: [PATCH 023/113] Fix interactive flag so that it forces REPL even when stdin is not a tty (#1019) * Fix interactive flag so that it forces REPL even when stdin is not a tty * Add test --- src/bin.ts | 3 ++- src/index.spec.ts | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bin.ts b/src/bin.ts index 9d923967d..001e1f483 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -227,7 +227,8 @@ export function main (argv: string[]) { Module.runMain() } else { // Piping of execution _only_ occurs when no other script is specified. - if (process.stdin.isTTY) { + // --interactive flag forces REPL + if (interactive || process.stdin.isTTY) { startRepl(service, state, code) } else { let buffer = code || '' diff --git a/src/index.spec.ts b/src/index.spec.ts index ce3ba1639..8e7007175 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -260,6 +260,21 @@ describe('ts-node', function () { cp.stdin!.end('true') }) + it('should run REPL when --interactive passed and stdin is not a TTY', function (done) { + const cp = exec(`${cmd} --interactive`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal( + '> 123\n' + + 'undefined\n' + + '> ' + ) + return done() + }) + + cp.stdin!.end('console.log("123")\n') + + }) + it('should support require flags', function (done) { exec(`${cmd} -r ./tests/hello-world -pe "console.log('success')"`, function (err, stdout) { expect(err).to.equal(null) From 8372d4dd7b402edd8a5444d8b0e1c15050cbbd15 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 26 Apr 2020 01:38:31 -0400 Subject: [PATCH 024/113] 8.9.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1754da4b4..9274408a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.9.0", + "version": "8.9.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4b6897771..dffaa1327 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.9.0", + "version": "8.9.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "types": "dist/index.d.ts", From f6cd5d4d696e152428ce7d7825dcd6f055edb953 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 3 May 2020 01:01:53 -0400 Subject: [PATCH 025/113] Experimental ESM support for node >=13 (#1010) * Initial commit * fix exports declaration in package.json; update example readme * add missing file to package files array * Add missing .js extension to ESM resolver * WIP to support EmitFlavor, which I'm going to undo since actually we don't need to support 2x emit flavors * Add foo.js -> foo.ts resolution, remove compileEsm codepath, add support for experimental-specifier-resolution=node * Add testing on node 14 to CI * Add ESM header to README * Add ESM test * ESM loader factory accepts RegisterOptions * Add copy of node's ESM loader to make diffing easier. * Fix tests * Fix tests * type annotation in esm.mjs * fix tests on ts 2.7 * Conditionally run esm tests on node >= 13 --- .github/workflows/continuous-integration.yml | 11 +- README.md | 4 + dist-raw/node-esm-resolve-implementation.js | 772 +++++++++++++++++++ esm-usage-example/README.md | 14 + esm-usage-example/bar.ts | 1 + esm-usage-example/foo.ts | 3 + esm-usage-example/index.js | 5 + esm-usage-example/package.json | 7 + esm-usage-example/tsconfig.json | 5 + esm.mjs | 7 + package.json | 6 + raw/node-esm-resolve-implementation.js | 663 ++++++++++++++++ src/esm.ts | 108 +++ src/index.spec.ts | 26 + src/index.ts | 79 +- tests/esm-node-resolver/bar/index.ts | 3 + tests/esm-node-resolver/baz.js | 3 + tests/esm-node-resolver/biff.jsx | 8 + tests/esm-node-resolver/foo.ts | 3 + tests/esm-node-resolver/index.ts | 8 + tests/esm-node-resolver/package.json | 3 + tests/esm-node-resolver/tsconfig.json | 8 + tests/esm/bar.ts | 3 + tests/esm/baz.js | 3 + tests/esm/biff.jsx | 8 + tests/esm/foo.ts | 3 + tests/esm/index.ts | 8 + tests/esm/package.json | 3 + tests/esm/tsconfig.json | 7 + 29 files changed, 1751 insertions(+), 31 deletions(-) create mode 100644 dist-raw/node-esm-resolve-implementation.js create mode 100644 esm-usage-example/README.md create mode 100644 esm-usage-example/bar.ts create mode 100644 esm-usage-example/foo.ts create mode 100644 esm-usage-example/index.js create mode 100644 esm-usage-example/package.json create mode 100644 esm-usage-example/tsconfig.json create mode 100644 esm.mjs create mode 100644 raw/node-esm-resolve-implementation.js create mode 100644 src/esm.ts create mode 100644 tests/esm-node-resolver/bar/index.ts create mode 100644 tests/esm-node-resolver/baz.js create mode 100644 tests/esm-node-resolver/biff.jsx create mode 100644 tests/esm-node-resolver/foo.ts create mode 100644 tests/esm-node-resolver/index.ts create mode 100644 tests/esm-node-resolver/package.json create mode 100644 tests/esm-node-resolver/tsconfig.json create mode 100644 tests/esm/bar.ts create mode 100644 tests/esm/baz.js create mode 100644 tests/esm/biff.jsx create mode 100644 tests/esm/foo.ts create mode 100644 tests/esm/index.ts create mode 100644 tests/esm/package.json create mode 100644 tests/esm/tsconfig.json diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index b988e82b4..3895aeee2 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -7,7 +7,7 @@ jobs: strategy: fail-fast: false matrix: - flavor: [1, 2, 3, 4] + flavor: [1, 2, 3, 4, 5, 6, 7] include: - flavor: 1 node: 6 @@ -21,6 +21,15 @@ jobs: - flavor: 4 node: 13 typescript: typescript@next + - flavor: 5 + node: 14 + typescript: typescript@latest + - flavor: 6 + node: 14 + typescript: typescript@2.7 + - flavor: 7 + node: 14 + typescript: typescript@next steps: # checkout code - uses: actions/checkout@v2 diff --git a/README.md b/README.md index 6e296fed4..2bf4d7174 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ > TypeScript execution and REPL for node.js, with source map support. **Works with `typescript@>=2.7`**. +### *Experimental ESM support* + +Native ESM support is currently experimental. For usage, limitations, and to provide feedback, see [#1007](https://github.com/TypeStrong/ts-node/issues/1007). + ## Installation ```sh diff --git a/dist-raw/node-esm-resolve-implementation.js b/dist-raw/node-esm-resolve-implementation.js new file mode 100644 index 000000000..1a5846673 --- /dev/null +++ b/dist-raw/node-esm-resolve-implementation.js @@ -0,0 +1,772 @@ +// Copied from https://raw.githubusercontent.com/nodejs/node/v13.12.0/lib/internal/modules/esm/resolve.js +// Then modified to suite our needs. +// Formatting is intentionally bad to keep the diff as small as possible, to make it easier to merge +// upstream changes and understand our modifications. +'use strict'; + +const { + ArrayIsArray, + JSONParse, + JSONStringify, + ObjectGetOwnPropertyNames, + ObjectPrototypeHasOwnProperty, + SafeMap, + StringPrototypeEndsWith, + StringPrototypeIncludes, + StringPrototypeIndexOf, + StringPrototypeSlice, + StringPrototypeStartsWith, + StringPrototypeSubstr, +} = { + ArrayIsArray: Array.isArray, + JSONParse: JSON.parse, + JSONStringify: JSON.stringify, + ObjectGetOwnPropertyNames: Object.getOwnPropertyNames, + ObjectPrototypeHasOwnProperty: (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop), + SafeMap: Map, + StringPrototypeEndsWith: (str, ...rest) => String.prototype.endsWith.apply(str, rest), + StringPrototypeIncludes: (str, ...rest) => String.prototype.includes.apply(str, rest), + StringPrototypeIndexOf: (str, ...rest) => String.prototype.indexOf.apply(str, rest), + StringPrototypeSlice: (str, ...rest) => String.prototype.slice.apply(str, rest), + StringPrototypeStartsWith: (str, ...rest) => String.prototype.startsWith.apply(str, rest), + StringPrototypeSubstr: (str, ...rest) => String.prototype.substr.apply(str, rest), +} // node pulls from `primordials` object + +// const internalFS = require('internal/fs/utils'); +// const { NativeModule } = require('internal/bootstrap/loaders'); +const Module = require('module') +const NativeModule = { + canBeRequiredByUsers(specifier) { + return Module.builtinModules.includes(specifier) + } +} +const { + closeSync, + fstatSync, + openSync, + readFileSync, + realpathSync, + statSync, + Stats, +} = require('fs'); +// const { getOptionValue } = require('internal/options'); +const { getOptionValue } = (() => { + let options; + function parseOptions() { + if (!options) { + options = { + '--preserve-symlinks': false, + '--preserve-symlinks-main': false, + '--input-type': undefined, + '--experimental-specifier-resolution': 'explicit', + ...parseExecArgv() + } + } + }; + function parseExecArgv () { + return require('arg')({ + '--preserve-symlinks': Boolean, + '--preserve-symlinks-main': Boolean, + '--input-type': String, + '--experimental-specifier-resolution': String + }, { + argv: process.execArgv, + permissive: true + }); + } + return { + getOptionValue: (opt) => { + parseOptions(); + return options[opt]; + } + }; +})(); +const { sep } = require('path'); + +const preserveSymlinks = getOptionValue('--preserve-symlinks'); +const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); +const typeFlag = getOptionValue('--input-type'); +// const { URL, pathToFileURL, fileURLToPath } = require('internal/url'); +const { URL, pathToFileURL, fileURLToPath } = require('url'); +const { + ERR_INPUT_TYPE_NOT_ALLOWED, + ERR_INVALID_MODULE_SPECIFIER, + ERR_INVALID_PACKAGE_CONFIG, + ERR_INVALID_PACKAGE_TARGET, + ERR_MODULE_NOT_FOUND, + ERR_PACKAGE_PATH_NOT_EXPORTED, + ERR_UNSUPPORTED_ESM_URL_SCHEME, +// } = require('internal/errors').codes; +} = { + ERR_INPUT_TYPE_NOT_ALLOWED: createErrorCtor('ERR_INPUT_TYPE_NOT_ALLOWED'), + ERR_INVALID_MODULE_SPECIFIER: createErrorCtor('ERR_INVALID_MODULE_SPECIFIER'), + ERR_INVALID_PACKAGE_CONFIG: createErrorCtor('ERR_INVALID_PACKAGE_CONFIG'), + ERR_INVALID_PACKAGE_TARGET: createErrorCtor('ERR_INVALID_PACKAGE_TARGET'), + ERR_MODULE_NOT_FOUND: createErrorCtor('ERR_MODULE_NOT_FOUND'), + ERR_PACKAGE_PATH_NOT_EXPORTED: createErrorCtor('ERR_PACKAGE_PATH_NOT_EXPORTED'), + ERR_UNSUPPORTED_ESM_URL_SCHEME: createErrorCtor('ERR_UNSUPPORTED_ESM_URL_SCHEME'), +} +function createErrorCtor(name) { + return class CustomError extends Error { + constructor(...args) { + super([name, ...args].join(' ')) + } + } +} + +function createResolve(opts) { +// TODO receive cached fs implementations here +const {tsExtensions, jsExtensions, preferTsExts} = opts; + +const realpathCache = new SafeMap(); +const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ + +function tryStatSync(path) { + try { + return statSync(path); + } catch { + return new Stats(); + } +} + +function readIfFile(path) { + let fd; + try { + fd = openSync(path, 'r'); + } catch { + return undefined; + } + try { + if (!fstatSync(fd).isFile()) return undefined; + return readFileSync(fd, 'utf8'); + } finally { + closeSync(fd); + } +} + +function getPackageConfig(path, base) { + const existing = packageJSONCache.get(path); + if (existing !== undefined) { + if (!existing.isValid) { + throw new ERR_INVALID_PACKAGE_CONFIG(path, fileURLToPath(base), false); + } + return existing; + } + + const source = readIfFile(path); + if (source === undefined) { + const packageConfig = { + exists: false, + main: undefined, + name: undefined, + isValid: true, + type: 'none', + exports: undefined + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; + } + + let packageJSON; + try { + packageJSON = JSONParse(source); + } catch { + const packageConfig = { + exists: true, + main: undefined, + name: undefined, + isValid: false, + type: 'none', + exports: undefined + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; + } + + let { main, name, type } = packageJSON; + const { exports } = packageJSON; + if (typeof main !== 'string') main = undefined; + if (typeof name !== 'string') name = undefined; + // Ignore unknown types for forwards compatibility + if (type !== 'module' && type !== 'commonjs') type = 'none'; + + const packageConfig = { + exists: true, + main, + name, + isValid: true, + type, + exports + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; +} + +function getPackageScopeConfig(resolved, base) { + let packageJSONUrl = new URL('./package.json', resolved); + while (true) { + const packageJSONPath = packageJSONUrl.pathname; + if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) + break; + const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), base); + if (packageConfig.exists) return packageConfig; + + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new URL('../package.json', packageJSONUrl); + + // Terminates at root where ../package.json equals ../../package.json + // (can't just check "/package.json" for Windows support). + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; + } + const packageConfig = { + exists: false, + main: undefined, + name: undefined, + isValid: true, + type: 'none', + exports: undefined + }; + packageJSONCache.set(fileURLToPath(packageJSONUrl), packageConfig); + return packageConfig; +} + +/* + * Legacy CommonJS main resolution: + * 1. let M = pkg_url + (json main field) + * 2. TRY(M, M.js, M.json, M.node) + * 3. TRY(M/index.js, M/index.json, M/index.node) + * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node) + * 5. NOT_FOUND + */ +function fileExists(url) { + return tryStatSync(fileURLToPath(url)).isFile(); +} + +function legacyMainResolve(packageJSONUrl, packageConfig) { + let guess; + if (packageConfig.main !== undefined) { + // Note: fs check redundances will be handled by Descriptor cache here. + if (fileExists(guess = new URL(`./${packageConfig.main}`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.js`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.json`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.node`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.js`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.json`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.node`, + packageJSONUrl))) { + return guess; + } + // Fallthrough. + } + if (fileExists(guess = new URL('./index.js', packageJSONUrl))) { + return guess; + } + // So fs. + if (fileExists(guess = new URL('./index.json', packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL('./index.node', packageJSONUrl))) { + return guess; + } + // Not found. + return undefined; +} + +function resolveExtensionsWithTryExactName(search) { + if (fileExists(search)) return search; + const resolvedReplacementExtension = resolveReplacementExtensions(search); + if(resolvedReplacementExtension) return resolvedReplacementExtension; + return resolveExtensions(search); +} + +const extensions = Array.from(new Set([ + ...(preferTsExts ? tsExtensions : []), + '.js', + ...jsExtensions, + '.json', '.node', '.mjs', + ...tsExtensions +])); + +function resolveExtensions(search) { + for (let i = 0; i < extensions.length; i++) { + const extension = extensions[i]; + const guess = new URL(`${search.pathname}${extension}`, search); + if (fileExists(guess)) return guess; + } + return undefined; +} + +/** + * TS's resolver can resolve foo.js to foo.ts, by replacing .js extension with several source extensions. + * IMPORTANT: preserve ordering according to preferTsExts; this affects resolution behavior! + */ +const replacementExtensions = extensions.filter(ext => ['.js', '.jsx', '.ts', '.tsx'].includes(ext)); + +function resolveReplacementExtensions(search) { + if (search.pathname.match(/\.js$/)) { + const pathnameWithoutExtension = search.pathname.slice(0, search.pathname.length - 3); + for (let i = 0; i < replacementExtensions.length; i++) { + const extension = replacementExtensions[i]; + const guess = new URL(`${pathnameWithoutExtension}${extension}`, search); + if (fileExists(guess)) return guess; + } + } + return undefined; +} + +function resolveIndex(search) { + return resolveExtensions(new URL('index', search)); +} + +function finalizeResolution(resolved, base) { + if (getOptionValue('--experimental-specifier-resolution') === 'node') { + let file = resolveExtensionsWithTryExactName(resolved); + if (file !== undefined) return file; + if (!StringPrototypeEndsWith(resolved.pathname, '/')) { + file = resolveIndex(new URL(`${resolved.pathname}/`, base)); + } else { + file = resolveIndex(resolved); + } + if (file !== undefined) return file; + throw new ERR_MODULE_NOT_FOUND( + resolved.pathname, fileURLToPath(base), 'module'); + } + + if (StringPrototypeEndsWith(resolved.pathname, '/')) return resolved; + + const file = resolveReplacementExtensions(resolved) || resolved; + + const path = fileURLToPath(file); + + if (!tryStatSync(path).isFile()) { + throw new ERR_MODULE_NOT_FOUND( + path || resolved.pathname, fileURLToPath(base), 'module'); + } + + return file; +} + +function throwExportsNotFound(subpath, packageJSONUrl, base) { + throw new ERR_PACKAGE_PATH_NOT_EXPORTED( + fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); +} + +function throwSubpathInvalid(subpath, packageJSONUrl, base) { + throw new ERR_INVALID_MODULE_SPECIFIER( + fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); +} + +function throwExportsInvalid( + subpath, target, packageJSONUrl, base) { + if (typeof target === 'object' && target !== null) { + target = JSONStringify(target, null, ''); + } else if (ArrayIsArray(target)) { + target = `[${target}]`; + } else { + target = `${target}`; + } + throw new ERR_INVALID_PACKAGE_TARGET( + fileURLToPath(packageJSONUrl), null, subpath, target, fileURLToPath(base)); +} + +function resolveExportsTargetString( + target, subpath, match, packageJSONUrl, base) { + if (target[0] !== '.' || target[1] !== '/' || + (subpath !== '' && target[target.length - 1] !== '/')) { + throwExportsInvalid(match, target, packageJSONUrl, base); + } + + const resolved = new URL(target, packageJSONUrl); + const resolvedPath = resolved.pathname; + const packagePath = new URL('.', packageJSONUrl).pathname; + + if (!StringPrototypeStartsWith(resolvedPath, packagePath) || + StringPrototypeIncludes( + resolvedPath, '/node_modules/', packagePath.length - 1)) { + throwExportsInvalid(match, target, packageJSONUrl, base); + } + + if (subpath === '') return resolved; + const subpathResolved = new URL(subpath, resolved); + const subpathResolvedPath = subpathResolved.pathname; + if (!StringPrototypeStartsWith(subpathResolvedPath, resolvedPath) || + StringPrototypeIncludes(subpathResolvedPath, + '/node_modules/', packagePath.length - 1)) { + throwSubpathInvalid(match + subpath, packageJSONUrl, base); + } + return subpathResolved; +} + +function isArrayIndex(key /* string */) { /* -> boolean */ + const keyNum = +key; + if (`${keyNum}` !== key) return false; + return keyNum >= 0 && keyNum < 0xFFFF_FFFF; +} + +function resolveExportsTarget( + packageJSONUrl, target, subpath, packageSubpath, base) { + if (typeof target === 'string') { + const resolved = resolveExportsTargetString( + target, subpath, packageSubpath, packageJSONUrl, base); + return finalizeResolution(resolved, base); + } else if (ArrayIsArray(target)) { + if (target.length === 0) + throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); + + let lastException; + for (let i = 0; i < target.length; i++) { + const targetItem = target[i]; + let resolved; + try { + resolved = resolveExportsTarget( + packageJSONUrl, targetItem, subpath, packageSubpath, base); + } catch (e) { + lastException = e; + if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED' || + e.code === 'ERR_INVALID_PACKAGE_TARGET') { + continue; + } + throw e; + } + + return finalizeResolution(resolved, base); + } + throw lastException; + } else if (typeof target === 'object' && target !== null) { + const keys = ObjectGetOwnPropertyNames(target); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (isArrayIndex(key)) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), + '"exports" cannot contain numeric property keys'); + } + } + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === 'node' || key === 'import' || key === 'default') { + const conditionalTarget = target[key]; + try { + return resolveExportsTarget( + packageJSONUrl, conditionalTarget, subpath, packageSubpath, base); + } catch (e) { + if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') continue; + throw e; + } + } + } + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); +} + +function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { + if (typeof exports === 'string' || ArrayIsArray(exports)) return true; + if (typeof exports !== 'object' || exports === null) return false; + + const keys = ObjectGetOwnPropertyNames(exports); + let isConditionalSugar = false; + let i = 0; + for (let j = 0; j < keys.length; j++) { + const key = keys[j]; + const curIsConditionalSugar = key === '' || key[0] !== '.'; + if (i++ === 0) { + isConditionalSugar = curIsConditionalSugar; + } else if (isConditionalSugar !== curIsConditionalSugar) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), + '"exports" cannot contain some keys starting with \'.\' and some not.' + + ' The exports object must either be an object of package subpath keys' + + ' or an object of main entry condition name keys only.'); + } + } + return isConditionalSugar; +} + + +function packageMainResolve(packageJSONUrl, packageConfig, base) { + if (packageConfig.exists) { + const exports = packageConfig.exports; + if (exports !== undefined) { + if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { + return resolveExportsTarget(packageJSONUrl, exports, '', '', base); + } else if (typeof exports === 'object' && exports !== null) { + const target = exports['.']; + if (target !== undefined) + return resolveExportsTarget(packageJSONUrl, target, '', '', base); + } + + throw new ERR_PACKAGE_PATH_NOT_EXPORTED(packageJSONUrl, '.'); + } + if (packageConfig.main !== undefined) { + const resolved = new URL(packageConfig.main, packageJSONUrl); + const path = fileURLToPath(resolved); + if (tryStatSync(path).isFile()) return resolved; + } + if (getOptionValue('--experimental-specifier-resolution') === 'node') { + if (packageConfig.main !== undefined) { + return finalizeResolution( + new URL(packageConfig.main, packageJSONUrl), base); + } else { + return finalizeResolution( + new URL('index', packageJSONUrl), base); + } + } + if (packageConfig.type !== 'module') { + return legacyMainResolve(packageJSONUrl, packageConfig); + } + } + + throw new ERR_MODULE_NOT_FOUND( + fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); +} + + +function packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base) /* -> URL */ { + const exports = packageConfig.exports; + if (exports === undefined || + isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + + + if (ObjectPrototypeHasOwnProperty(exports, packageSubpath)) { + const target = exports[packageSubpath]; + const resolved = resolveExportsTarget( + packageJSONUrl, target, '', packageSubpath, base); + return finalizeResolution(resolved, base); + } + + let bestMatch = ''; + const keys = ObjectGetOwnPropertyNames(exports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key[key.length - 1] !== '/') continue; + if (StringPrototypeStartsWith(packageSubpath, key) && + key.length > bestMatch.length) { + bestMatch = key; + } + } + + if (bestMatch) { + const target = exports[bestMatch]; + const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length); + const resolved = resolveExportsTarget( + packageJSONUrl, target, subpath, packageSubpath, base); + return finalizeResolution(resolved, base); + } + + throwExportsNotFound(packageSubpath, packageJSONUrl, base); +} + +function getPackageType(url) { + const packageConfig = getPackageScopeConfig(url, url); + return packageConfig.type; +} + +function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ + let separatorIndex = StringPrototypeIndexOf(specifier, '/'); + let validPackageName = true; + let isScoped = false; + if (specifier[0] === '@') { + isScoped = true; + if (separatorIndex === -1 || specifier.length === 0) { + validPackageName = false; + } else { + separatorIndex = StringPrototypeIndexOf( + specifier, '/', separatorIndex + 1); + } + } + + const packageName = separatorIndex === -1 ? + specifier : StringPrototypeSlice(specifier, 0, separatorIndex); + + // Package name cannot have leading . and cannot have percent-encoding or + // separators. + for (let i = 0; i < packageName.length; i++) { + if (packageName[i] === '%' || packageName[i] === '\\') { + validPackageName = false; + break; + } + } + + if (!validPackageName) { + throw new ERR_INVALID_MODULE_SPECIFIER( + specifier, undefined, fileURLToPath(base)); + } + + const packageSubpath = separatorIndex === -1 ? + '' : '.' + StringPrototypeSlice(specifier, separatorIndex); + + // ResolveSelf + const packageConfig = getPackageScopeConfig(base, base); + if (packageConfig.exists) { + // TODO(jkrems): Find a way to forward the pair/iterator already generated + // while executing GetPackageScopeConfig + let packageJSONUrl; + for (const [ filename, packageConfigCandidate ] of packageJSONCache) { + if (packageConfig === packageConfigCandidate) { + packageJSONUrl = pathToFileURL(filename); + break; + } + } + if (packageJSONUrl !== undefined && + packageConfig.name === packageName && + packageConfig.exports !== undefined) { + if (packageSubpath === './') { + return new URL('./', packageJSONUrl); + } else if (packageSubpath === '') { + return packageMainResolve(packageJSONUrl, packageConfig, base); + } else { + return packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base); + } + } + } + + let packageJSONUrl = + new URL('./node_modules/' + packageName + '/package.json', base); + let packageJSONPath = fileURLToPath(packageJSONUrl); + let lastPath; + do { + const stat = tryStatSync( + StringPrototypeSlice(packageJSONPath, 0, packageJSONPath.length - 13)); + if (!stat.isDirectory()) { + lastPath = packageJSONPath; + packageJSONUrl = new URL((isScoped ? + '../../../../node_modules/' : '../../../node_modules/') + + packageName + '/package.json', packageJSONUrl); + packageJSONPath = fileURLToPath(packageJSONUrl); + continue; + } + + // Package match. + const packageConfig = getPackageConfig(packageJSONPath, base); + if (packageSubpath === './') { + return new URL('./', packageJSONUrl); + } else if (packageSubpath === '') { + return packageMainResolve(packageJSONUrl, packageConfig, base); + } else if (packageConfig.exports !== undefined) { + return packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base); + } else { + return finalizeResolution( + new URL(packageSubpath, packageJSONUrl), base); + } + // Cross-platform root check. + } while (packageJSONPath.length !== lastPath.length); + + // eslint can't handle the above code. + // eslint-disable-next-line no-unreachable + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base)); +} + +function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { + if (specifier === '') return false; + if (specifier[0] === '/') return true; + if (specifier[0] === '.') { + if (specifier.length === 1 || specifier[1] === '/') return true; + if (specifier[1] === '.') { + if (specifier.length === 2 || specifier[2] === '/') return true; + } + } + return false; +} + +function moduleResolve(specifier /* string */, base /* URL */) { /* -> URL */ + // Order swapped from spec for minor perf gain. + // Ok since relative URLs cannot parse as URLs. + let resolved; + if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { + resolved = new URL(specifier, base); + } else { + try { + resolved = new URL(specifier); + } catch { + return packageResolve(specifier, base); + } + } + return finalizeResolution(resolved, base); +} + +function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { + let parsed; + try { + parsed = new URL(specifier); + if (parsed.protocol === 'data:') { + return { + url: specifier + }; + } + } catch {} + if (parsed && parsed.protocol === 'nodejs:') + return { url: specifier }; + if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') + throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(); + if (NativeModule.canBeRequiredByUsers(specifier)) { + return { + url: 'nodejs:' + specifier + }; + } + if (parentURL && StringPrototypeStartsWith(parentURL, 'data:')) { + // This is gonna blow up, we want the error + new URL(specifier, parentURL); + } + + const isMain = parentURL === undefined; + if (isMain) { + parentURL = pathToFileURL(`${process.cwd()}/`).href; + + // This is the initial entry point to the program, and --input-type has + // been passed as an option; but --input-type can only be used with + // --eval, --print or STDIN string input. It is not allowed with file + // input, to avoid user confusion over how expansive the effect of the + // flag should be (i.e. entry point only, package scope surrounding the + // entry point, etc.). + if (typeFlag) + throw new ERR_INPUT_TYPE_NOT_ALLOWED(); + } + + let url = moduleResolve(specifier, new URL(parentURL)); + + if (isMain ? !preserveSymlinksMain : !preserveSymlinks) { + const urlPath = fileURLToPath(url); + const real = realpathSync(urlPath, { + // [internalFS.realpathCacheKey]: realpathCache + }); + const old = url; + url = pathToFileURL(real + (urlPath.endsWith(sep) ? '/' : '')); + url.search = old.search; + url.hash = old.hash; + } + + return { url: `${url}` }; +} + +return { + defaultResolve, + getPackageType +}; +} +module.exports = { + createResolve +} diff --git a/esm-usage-example/README.md b/esm-usage-example/README.md new file mode 100644 index 000000000..f75113aaf --- /dev/null +++ b/esm-usage-example/README.md @@ -0,0 +1,14 @@ +To run the experiment: + +``` +cd ./esm-usage-example # Must be in this directory +node -v # Must be using node v13 + +# Install the github branch via npm +npm install +node --loader ts-node/esm ./index.js + +# Or if you're hacking locally +node --loader ../esm.mjs ./index + +``` diff --git a/esm-usage-example/bar.ts b/esm-usage-example/bar.ts new file mode 100644 index 000000000..45dd9d249 --- /dev/null +++ b/esm-usage-example/bar.ts @@ -0,0 +1 @@ +export const bar = 123; diff --git a/esm-usage-example/foo.ts b/esm-usage-example/foo.ts new file mode 100644 index 000000000..185a3dbf3 --- /dev/null +++ b/esm-usage-example/foo.ts @@ -0,0 +1,3 @@ +export const foo = 123; +export {bar} from './bar'; + diff --git a/esm-usage-example/index.js b/esm-usage-example/index.js new file mode 100644 index 000000000..1902166b8 --- /dev/null +++ b/esm-usage-example/index.js @@ -0,0 +1,5 @@ +async function main() { + const fooModule = await import('./foo.ts'); + console.dir({foo: fooModule}) +} +main() diff --git a/esm-usage-example/package.json b/esm-usage-example/package.json new file mode 100644 index 000000000..e9974a780 --- /dev/null +++ b/esm-usage-example/package.json @@ -0,0 +1,7 @@ +{ + "type": "module", + "dependencies": { + "ts-node": "github:TypeStrong/ts-node#ab/esm-support", + "typescript": "^3.8.3" + } +} diff --git a/esm-usage-example/tsconfig.json b/esm-usage-example/tsconfig.json new file mode 100644 index 000000000..1ac61592b --- /dev/null +++ b/esm-usage-example/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "module": "ESNext" + } +} diff --git a/esm.mjs b/esm.mjs new file mode 100644 index 000000000..873ff9768 --- /dev/null +++ b/esm.mjs @@ -0,0 +1,7 @@ +import {fileURLToPath} from 'url' +import {createRequire} from 'module' +const require = createRequire(fileURLToPath(import.meta.url)) + +/** @type {import('./dist/esm')} */ +const esm = require('./dist/esm') +export const {resolve, getFormat, transformSource} = esm.registerAndCreateEsmHooks() diff --git a/package.json b/package.json index dffaa1327..af860b502 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "version": "8.9.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", + "exports": { + ".": "./dist/index.js", + "./esm": "./esm.mjs" + }, "types": "dist/index.d.ts", "bin": { "ts-node": "dist/bin.js", @@ -12,7 +16,9 @@ }, "files": [ "dist/", + "dist-raw/", "register/", + "esm.mjs", "LICENSE", "tsconfig.schema.json", "tsconfig.schemastore-schema.json" diff --git a/raw/node-esm-resolve-implementation.js b/raw/node-esm-resolve-implementation.js new file mode 100644 index 000000000..730c815b8 --- /dev/null +++ b/raw/node-esm-resolve-implementation.js @@ -0,0 +1,663 @@ +'use strict'; + +const { + ArrayIsArray, + JSONParse, + JSONStringify, + ObjectGetOwnPropertyNames, + ObjectPrototypeHasOwnProperty, + SafeMap, + StringPrototypeEndsWith, + StringPrototypeIncludes, + StringPrototypeIndexOf, + StringPrototypeSlice, + StringPrototypeStartsWith, + StringPrototypeSubstr, +} = primordials; + +const internalFS = require('internal/fs/utils'); +const { NativeModule } = require('internal/bootstrap/loaders'); +const { + closeSync, + fstatSync, + openSync, + readFileSync, + realpathSync, + statSync, + Stats, +} = require('fs'); +const { getOptionValue } = require('internal/options'); +const { sep } = require('path'); + +const preserveSymlinks = getOptionValue('--preserve-symlinks'); +const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); +const typeFlag = getOptionValue('--input-type'); +const { URL, pathToFileURL, fileURLToPath } = require('internal/url'); +const { + ERR_INPUT_TYPE_NOT_ALLOWED, + ERR_INVALID_MODULE_SPECIFIER, + ERR_INVALID_PACKAGE_CONFIG, + ERR_INVALID_PACKAGE_TARGET, + ERR_MODULE_NOT_FOUND, + ERR_PACKAGE_PATH_NOT_EXPORTED, + ERR_UNSUPPORTED_ESM_URL_SCHEME, +} = require('internal/errors').codes; + +const realpathCache = new SafeMap(); +const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ + +function tryStatSync(path) { + try { + return statSync(path); + } catch { + return new Stats(); + } +} + +function readIfFile(path) { + let fd; + try { + fd = openSync(path, 'r'); + } catch { + return undefined; + } + try { + if (!fstatSync(fd).isFile()) return undefined; + return readFileSync(fd, 'utf8'); + } finally { + closeSync(fd); + } +} + +function getPackageConfig(path, base) { + const existing = packageJSONCache.get(path); + if (existing !== undefined) { + if (!existing.isValid) { + throw new ERR_INVALID_PACKAGE_CONFIG(path, fileURLToPath(base), false); + } + return existing; + } + + const source = readIfFile(path); + if (source === undefined) { + const packageConfig = { + exists: false, + main: undefined, + name: undefined, + isValid: true, + type: 'none', + exports: undefined + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; + } + + let packageJSON; + try { + packageJSON = JSONParse(source); + } catch { + const packageConfig = { + exists: true, + main: undefined, + name: undefined, + isValid: false, + type: 'none', + exports: undefined + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; + } + + let { main, name, type } = packageJSON; + const { exports } = packageJSON; + if (typeof main !== 'string') main = undefined; + if (typeof name !== 'string') name = undefined; + // Ignore unknown types for forwards compatibility + if (type !== 'module' && type !== 'commonjs') type = 'none'; + + const packageConfig = { + exists: true, + main, + name, + isValid: true, + type, + exports + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; +} + +function getPackageScopeConfig(resolved, base) { + let packageJSONUrl = new URL('./package.json', resolved); + while (true) { + const packageJSONPath = packageJSONUrl.pathname; + if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) + break; + const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), base); + if (packageConfig.exists) return packageConfig; + + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new URL('../package.json', packageJSONUrl); + + // Terminates at root where ../package.json equals ../../package.json + // (can't just check "/package.json" for Windows support). + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; + } + const packageConfig = { + exists: false, + main: undefined, + name: undefined, + isValid: true, + type: 'none', + exports: undefined + }; + packageJSONCache.set(fileURLToPath(packageJSONUrl), packageConfig); + return packageConfig; +} + +/* + * Legacy CommonJS main resolution: + * 1. let M = pkg_url + (json main field) + * 2. TRY(M, M.js, M.json, M.node) + * 3. TRY(M/index.js, M/index.json, M/index.node) + * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node) + * 5. NOT_FOUND + */ +function fileExists(url) { + return tryStatSync(fileURLToPath(url)).isFile(); +} + +function legacyMainResolve(packageJSONUrl, packageConfig) { + let guess; + if (packageConfig.main !== undefined) { + // Note: fs check redundances will be handled by Descriptor cache here. + if (fileExists(guess = new URL(`./${packageConfig.main}`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.js`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.json`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.node`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.js`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.json`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.node`, + packageJSONUrl))) { + return guess; + } + // Fallthrough. + } + if (fileExists(guess = new URL('./index.js', packageJSONUrl))) { + return guess; + } + // So fs. + if (fileExists(guess = new URL('./index.json', packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL('./index.node', packageJSONUrl))) { + return guess; + } + // Not found. + return undefined; +} + +function resolveExtensionsWithTryExactName(search) { + if (fileExists(search)) return search; + return resolveExtensions(search); +} + +const extensions = ['.js', '.json', '.node', '.mjs']; +function resolveExtensions(search) { + for (let i = 0; i < extensions.length; i++) { + const extension = extensions[i]; + const guess = new URL(`${search.pathname}${extension}`, search); + if (fileExists(guess)) return guess; + } + return undefined; +} + +function resolveIndex(search) { + return resolveExtensions(new URL('index', search)); +} + +function finalizeResolution(resolved, base) { + if (getOptionValue('--experimental-specifier-resolution') === 'node') { + let file = resolveExtensionsWithTryExactName(resolved); + if (file !== undefined) return file; + if (!StringPrototypeEndsWith(resolved.pathname, '/')) { + file = resolveIndex(new URL(`${resolved.pathname}/`, base)); + } else { + file = resolveIndex(resolved); + } + if (file !== undefined) return file; + throw new ERR_MODULE_NOT_FOUND( + resolved.pathname, fileURLToPath(base), 'module'); + } + + if (StringPrototypeEndsWith(resolved.pathname, '/')) return resolved; + const path = fileURLToPath(resolved); + + if (!tryStatSync(path).isFile()) { + throw new ERR_MODULE_NOT_FOUND( + path || resolved.pathname, fileURLToPath(base), 'module'); + } + + return resolved; +} + +function throwExportsNotFound(subpath, packageJSONUrl, base) { + throw new ERR_PACKAGE_PATH_NOT_EXPORTED( + fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); +} + +function throwSubpathInvalid(subpath, packageJSONUrl, base) { + throw new ERR_INVALID_MODULE_SPECIFIER( + fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); +} + +function throwExportsInvalid( + subpath, target, packageJSONUrl, base) { + if (typeof target === 'object' && target !== null) { + target = JSONStringify(target, null, ''); + } else if (ArrayIsArray(target)) { + target = `[${target}]`; + } else { + target = `${target}`; + } + throw new ERR_INVALID_PACKAGE_TARGET( + fileURLToPath(packageJSONUrl), null, subpath, target, fileURLToPath(base)); +} + +function resolveExportsTargetString( + target, subpath, match, packageJSONUrl, base) { + if (target[0] !== '.' || target[1] !== '/' || + (subpath !== '' && target[target.length - 1] !== '/')) { + throwExportsInvalid(match, target, packageJSONUrl, base); + } + + const resolved = new URL(target, packageJSONUrl); + const resolvedPath = resolved.pathname; + const packagePath = new URL('.', packageJSONUrl).pathname; + + if (!StringPrototypeStartsWith(resolvedPath, packagePath) || + StringPrototypeIncludes( + resolvedPath, '/node_modules/', packagePath.length - 1)) { + throwExportsInvalid(match, target, packageJSONUrl, base); + } + + if (subpath === '') return resolved; + const subpathResolved = new URL(subpath, resolved); + const subpathResolvedPath = subpathResolved.pathname; + if (!StringPrototypeStartsWith(subpathResolvedPath, resolvedPath) || + StringPrototypeIncludes(subpathResolvedPath, + '/node_modules/', packagePath.length - 1)) { + throwSubpathInvalid(match + subpath, packageJSONUrl, base); + } + return subpathResolved; +} + +function isArrayIndex(key /* string */) { /* -> boolean */ + const keyNum = +key; + if (`${keyNum}` !== key) return false; + return keyNum >= 0 && keyNum < 0xFFFF_FFFF; +} + +function resolveExportsTarget( + packageJSONUrl, target, subpath, packageSubpath, base) { + if (typeof target === 'string') { + const resolved = resolveExportsTargetString( + target, subpath, packageSubpath, packageJSONUrl, base); + return finalizeResolution(resolved, base); + } else if (ArrayIsArray(target)) { + if (target.length === 0) + throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); + + let lastException; + for (let i = 0; i < target.length; i++) { + const targetItem = target[i]; + let resolved; + try { + resolved = resolveExportsTarget( + packageJSONUrl, targetItem, subpath, packageSubpath, base); + } catch (e) { + lastException = e; + if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED' || + e.code === 'ERR_INVALID_PACKAGE_TARGET') { + continue; + } + throw e; + } + + return finalizeResolution(resolved, base); + } + throw lastException; + } else if (typeof target === 'object' && target !== null) { + const keys = ObjectGetOwnPropertyNames(target); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (isArrayIndex(key)) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), + '"exports" cannot contain numeric property keys'); + } + } + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === 'node' || key === 'import' || key === 'default') { + const conditionalTarget = target[key]; + try { + return resolveExportsTarget( + packageJSONUrl, conditionalTarget, subpath, packageSubpath, base); + } catch (e) { + if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') continue; + throw e; + } + } + } + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); +} + +function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { + if (typeof exports === 'string' || ArrayIsArray(exports)) return true; + if (typeof exports !== 'object' || exports === null) return false; + + const keys = ObjectGetOwnPropertyNames(exports); + let isConditionalSugar = false; + let i = 0; + for (let j = 0; j < keys.length; j++) { + const key = keys[j]; + const curIsConditionalSugar = key === '' || key[0] !== '.'; + if (i++ === 0) { + isConditionalSugar = curIsConditionalSugar; + } else if (isConditionalSugar !== curIsConditionalSugar) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), + '"exports" cannot contain some keys starting with \'.\' and some not.' + + ' The exports object must either be an object of package subpath keys' + + ' or an object of main entry condition name keys only.'); + } + } + return isConditionalSugar; +} + + +function packageMainResolve(packageJSONUrl, packageConfig, base) { + if (packageConfig.exists) { + const exports = packageConfig.exports; + if (exports !== undefined) { + if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { + return resolveExportsTarget(packageJSONUrl, exports, '', '', base); + } else if (typeof exports === 'object' && exports !== null) { + const target = exports['.']; + if (target !== undefined) + return resolveExportsTarget(packageJSONUrl, target, '', '', base); + } + + throw new ERR_PACKAGE_PATH_NOT_EXPORTED(packageJSONUrl, '.'); + } + if (packageConfig.main !== undefined) { + const resolved = new URL(packageConfig.main, packageJSONUrl); + const path = fileURLToPath(resolved); + if (tryStatSync(path).isFile()) return resolved; + } + if (getOptionValue('--experimental-specifier-resolution') === 'node') { + if (packageConfig.main !== undefined) { + return finalizeResolution( + new URL(packageConfig.main, packageJSONUrl), base); + } else { + return finalizeResolution( + new URL('index', packageJSONUrl), base); + } + } + if (packageConfig.type !== 'module') { + return legacyMainResolve(packageJSONUrl, packageConfig); + } + } + + throw new ERR_MODULE_NOT_FOUND( + fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); +} + + +function packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base) /* -> URL */ { + const exports = packageConfig.exports; + if (exports === undefined || + isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + + + if (ObjectPrototypeHasOwnProperty(exports, packageSubpath)) { + const target = exports[packageSubpath]; + const resolved = resolveExportsTarget( + packageJSONUrl, target, '', packageSubpath, base); + return finalizeResolution(resolved, base); + } + + let bestMatch = ''; + const keys = ObjectGetOwnPropertyNames(exports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key[key.length - 1] !== '/') continue; + if (StringPrototypeStartsWith(packageSubpath, key) && + key.length > bestMatch.length) { + bestMatch = key; + } + } + + if (bestMatch) { + const target = exports[bestMatch]; + const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length); + const resolved = resolveExportsTarget( + packageJSONUrl, target, subpath, packageSubpath, base); + return finalizeResolution(resolved, base); + } + + throwExportsNotFound(packageSubpath, packageJSONUrl, base); +} + +function getPackageType(url) { + const packageConfig = getPackageScopeConfig(url, url); + return packageConfig.type; +} + +function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ + let separatorIndex = StringPrototypeIndexOf(specifier, '/'); + let validPackageName = true; + let isScoped = false; + if (specifier[0] === '@') { + isScoped = true; + if (separatorIndex === -1 || specifier.length === 0) { + validPackageName = false; + } else { + separatorIndex = StringPrototypeIndexOf( + specifier, '/', separatorIndex + 1); + } + } + + const packageName = separatorIndex === -1 ? + specifier : StringPrototypeSlice(specifier, 0, separatorIndex); + + // Package name cannot have leading . and cannot have percent-encoding or + // separators. + for (let i = 0; i < packageName.length; i++) { + if (packageName[i] === '%' || packageName[i] === '\\') { + validPackageName = false; + break; + } + } + + if (!validPackageName) { + throw new ERR_INVALID_MODULE_SPECIFIER( + specifier, undefined, fileURLToPath(base)); + } + + const packageSubpath = separatorIndex === -1 ? + '' : '.' + StringPrototypeSlice(specifier, separatorIndex); + + // ResolveSelf + const packageConfig = getPackageScopeConfig(base, base); + if (packageConfig.exists) { + // TODO(jkrems): Find a way to forward the pair/iterator already generated + // while executing GetPackageScopeConfig + let packageJSONUrl; + for (const [ filename, packageConfigCandidate ] of packageJSONCache) { + if (packageConfig === packageConfigCandidate) { + packageJSONUrl = pathToFileURL(filename); + break; + } + } + if (packageJSONUrl !== undefined && + packageConfig.name === packageName && + packageConfig.exports !== undefined) { + if (packageSubpath === './') { + return new URL('./', packageJSONUrl); + } else if (packageSubpath === '') { + return packageMainResolve(packageJSONUrl, packageConfig, base); + } else { + return packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base); + } + } + } + + let packageJSONUrl = + new URL('./node_modules/' + packageName + '/package.json', base); + let packageJSONPath = fileURLToPath(packageJSONUrl); + let lastPath; + do { + const stat = tryStatSync( + StringPrototypeSlice(packageJSONPath, 0, packageJSONPath.length - 13)); + if (!stat.isDirectory()) { + lastPath = packageJSONPath; + packageJSONUrl = new URL((isScoped ? + '../../../../node_modules/' : '../../../node_modules/') + + packageName + '/package.json', packageJSONUrl); + packageJSONPath = fileURLToPath(packageJSONUrl); + continue; + } + + // Package match. + const packageConfig = getPackageConfig(packageJSONPath, base); + if (packageSubpath === './') { + return new URL('./', packageJSONUrl); + } else if (packageSubpath === '') { + return packageMainResolve(packageJSONUrl, packageConfig, base); + } else if (packageConfig.exports !== undefined) { + return packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base); + } else { + return finalizeResolution( + new URL(packageSubpath, packageJSONUrl), base); + } + // Cross-platform root check. + } while (packageJSONPath.length !== lastPath.length); + + // eslint can't handle the above code. + // eslint-disable-next-line no-unreachable + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base)); +} + +function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { + if (specifier === '') return false; + if (specifier[0] === '/') return true; + if (specifier[0] === '.') { + if (specifier.length === 1 || specifier[1] === '/') return true; + if (specifier[1] === '.') { + if (specifier.length === 2 || specifier[2] === '/') return true; + } + } + return false; +} + +function moduleResolve(specifier /* string */, base /* URL */) { /* -> URL */ + // Order swapped from spec for minor perf gain. + // Ok since relative URLs cannot parse as URLs. + let resolved; + if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { + resolved = new URL(specifier, base); + } else { + try { + resolved = new URL(specifier); + } catch { + return packageResolve(specifier, base); + } + } + return finalizeResolution(resolved, base); +} + +function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { + let parsed; + try { + parsed = new URL(specifier); + if (parsed.protocol === 'data:') { + return { + url: specifier + }; + } + } catch {} + if (parsed && parsed.protocol === 'nodejs:') + return { url: specifier }; + if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') + throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(); + if (NativeModule.canBeRequiredByUsers(specifier)) { + return { + url: 'nodejs:' + specifier + }; + } + if (parentURL && StringPrototypeStartsWith(parentURL, 'data:')) { + // This is gonna blow up, we want the error + new URL(specifier, parentURL); + } + + const isMain = parentURL === undefined; + if (isMain) { + parentURL = pathToFileURL(`${process.cwd()}/`).href; + + // This is the initial entry point to the program, and --input-type has + // been passed as an option; but --input-type can only be used with + // --eval, --print or STDIN string input. It is not allowed with file + // input, to avoid user confusion over how expansive the effect of the + // flag should be (i.e. entry point only, package scope surrounding the + // entry point, etc.). + if (typeFlag) + throw new ERR_INPUT_TYPE_NOT_ALLOWED(); + } + + let url = moduleResolve(specifier, new URL(parentURL)); + + if (isMain ? !preserveSymlinksMain : !preserveSymlinks) { + const urlPath = fileURLToPath(url); + const real = realpathSync(urlPath, { + [internalFS.realpathCacheKey]: realpathCache + }); + const old = url; + url = pathToFileURL(real + (urlPath.endsWith(sep) ? '/' : '')); + url.search = old.search; + url.hash = old.hash; + } + + return { url: `${url}` }; +} + +module.exports = { + defaultResolve, + getPackageType +}; diff --git a/src/esm.ts b/src/esm.ts new file mode 100644 index 000000000..ed1e6003c --- /dev/null +++ b/src/esm.ts @@ -0,0 +1,108 @@ +import { register, getExtensions, RegisterOptions } from './index' +import { parse as parseUrl, format as formatUrl, UrlWithStringQuery } from 'url' +import { posix as posixPath } from 'path' +import * as assert from 'assert' +const { createResolve } = require('../dist-raw/node-esm-resolve-implementation') + +// Note: On Windows, URLs look like this: file:///D:/dev/@TypeStrong/ts-node-examples/foo.ts + +export function registerAndCreateEsmHooks (opts?: RegisterOptions) { + // Automatically performs registration just like `-r ts-node/register` + const tsNodeInstance = register(opts) + + // Custom implementation that considers additional file extensions and automatically adds file extensions + const nodeResolveImplementation = createResolve({ + ...getExtensions(tsNodeInstance.config), + preferTsExts: tsNodeInstance.options.preferTsExts + }) + + return { resolve, getFormat, transformSource } + + function isFileUrlOrNodeStyleSpecifier (parsed: UrlWithStringQuery) { + // We only understand file:// URLs, but in node, the specifier can be a node-style `./foo` or `foo` + const { protocol } = parsed + return protocol === null || protocol === 'file:' + } + + async function resolve (specifier: string, context: {parentURL: string}, defaultResolve: typeof resolve): Promise<{url: string}> { + const defer = async () => { + const r = await defaultResolve(specifier, context, defaultResolve) + return r + } + + const parsed = parseUrl(specifier) + const { pathname, protocol, hostname } = parsed + + if (!isFileUrlOrNodeStyleSpecifier(parsed)) { + return defer() + } + + if (protocol !== null && protocol !== 'file:') { + return defer() + } + + // Malformed file:// URL? We should always see `null` or `''` + if (hostname) { + // TODO file://./foo sets `hostname` to `'.'`. Perhaps we should special-case this. + return defer() + } + + // pathname is the path to be resolved + + return nodeResolveImplementation.defaultResolve(specifier, context, defaultResolve) + } + + type Format = 'builtin' | 'commonjs' | 'dynamic' | 'json' | 'module' | 'wasm' + async function getFormat (url: string, context: {}, defaultGetFormat: typeof getFormat): Promise<{format: Format}> { + const defer = (overrideUrl: string = url) => defaultGetFormat(overrideUrl, context, defaultGetFormat) + + const parsed = parseUrl(url) + + if (!isFileUrlOrNodeStyleSpecifier(parsed)) { + return defer() + } + + const { pathname } = parsed + assert(pathname !== null, 'ESM getFormat() hook: URL should never have null pathname') + + // If file has .ts, .tsx, or .jsx extension, then ask node how it would treat this file if it were .js + const ext = posixPath.extname(pathname!) + if (ext === '.ts' || ext === '.tsx' || ext === '.jsx') { + return defer(formatUrl({ + ...parsed, + pathname: pathname + '.js' + })) + } + + return defer() + } + + async function transformSource (source: string | Buffer, context: {url: string, format: Format}, defaultTransformSource: typeof transformSource): Promise<{source: string | Buffer}> { + const defer = () => defaultTransformSource(source, context, defaultTransformSource) + + const sourceAsString = typeof source === 'string' ? source : source.toString('utf8') + + const { url } = context + const parsed = parseUrl(url) + + if (!isFileUrlOrNodeStyleSpecifier(parsed)) { + return defer() + } + const { pathname } = parsed + if (pathname === null || !posixPath.isAbsolute(pathname)) { + // If we are meant to handle this URL, then it has already been resolved to an absolute path by our resolver hook + return defer() + } + + // Assigning to a new variable so it's clear that we have stopped thinking of it as a URL, and started using it like a native FS path + const fileName = pathname + + if (tsNodeInstance.ignored(fileName)) { + return defer() + } + + const emittedJs = tsNodeInstance.compile(sourceAsString, fileName) + + return { source: emittedJs } + } +} diff --git a/src/index.spec.ts b/src/index.spec.ts index 8e7007175..355cfcdf3 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -649,4 +649,30 @@ describe('ts-node', function () { expect(output).to.contain('var x = 10;') }) }) + + if (semver.gte(process.version, '13.0.0')) { + describe('esm', () => { + this.slow(1000) + + const cmd = `node --loader ../../esm.mjs` + + it('should compile and execute as ESM', (done) => { + exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff\n') + + return done() + }) + }) + it('supports --experimental-specifier-resolution=node', (done) => { + exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff\n') + + return done() + }) + + }) + }) + } }) diff --git a/src/index.ts b/src/index.ts index 50059bff8..e37442a90 100644 --- a/src/index.ts +++ b/src/index.ts @@ -38,18 +38,19 @@ function yn (value: string | undefined) { * Debugging `ts-node`. */ const shouldDebug = yn(process.env.TS_NODE_DEBUG) -const debug = shouldDebug ? +/** @internal */ +export const debug = shouldDebug ? (...args: any) => console.log(`[ts-node ${new Date().toISOString()}]`, ...args) : () => undefined const debugFn = shouldDebug ? - (key: string, fn: (arg: T) => U) => { + (key: string, fn: (arg: T) => U) => { let i = 0 return (x: T) => { debug(key, x, ++i) return fn(x) } } : - (_: string, fn: (arg: T) => U) => fn + (_: string, fn: (arg: T) => U) => fn /** * Common TypeScript interfaces between versions. @@ -202,12 +203,12 @@ export interface TsConfigOptions extends Omit {} + > { } /** * Like `Object.assign`, but ignores `undefined` properties. */ -function assign (initialValue: T, ...sources: Array): T { +function assign (initialValue: T, ...sources: Array): T { for (const source of sources) { for (const key of Object.keys(source)) { const value = (source as any)[key] @@ -316,7 +317,7 @@ export interface Register { /** * Cached fs operation wrapper. */ -function cachedLookup (fn: (arg: string) => T): (arg: string) => T { +function cachedLookup (fn: (arg: string) => T): (arg: string) => T { const cache = new Map() return (arg: string): T => { @@ -328,18 +329,26 @@ function cachedLookup (fn: (arg: string) => T): (arg: string) => T { } } +/** @internal */ +export function getExtensions (config: _ts.ParsedCommandLine) { + const tsExtensions = ['.ts'] + const jsExtensions = [] + + // Enable additional extensions when JSX or `allowJs` is enabled. + if (config.options.jsx) tsExtensions.push('.tsx') + if (config.options.allowJs) jsExtensions.push('.js') + if (config.options.jsx && config.options.allowJs) jsExtensions.push('.jsx') + return { tsExtensions, jsExtensions } +} + /** * Register TypeScript compiler instance onto node.js */ export function register (opts: RegisterOptions = {}): Register { const originalJsHandler = require.extensions['.js'] // tslint:disable-line const service = create(opts) - const extensions = ['.ts'] - - // Enable additional extensions when JSX or `allowJs` is enabled. - if (service.config.options.jsx) extensions.push('.tsx') - if (service.config.options.allowJs) extensions.push('.js') - if (service.config.options.jsx && service.config.options.allowJs) extensions.push('.jsx') + const { tsExtensions, jsExtensions } = getExtensions(service.config) + const extensions = [...tsExtensions, ...jsExtensions] // Expose registered instance globally. process[REGISTER_INSTANCE] = service @@ -392,7 +401,9 @@ export function create (rawOptions: CreateOptions = {}): Register { ].map(Number) const configDiagnosticList = filterDiagnostics(config.errors, ignoreDiagnostics) - const outputCache = new Map() + const outputCache = new Map() const isScoped = options.scope ? (relname: string) => relname.charAt(0) !== '.' : () => true const shouldIgnore = createIgnore(options.skipIgnore ? [] : ( @@ -409,7 +420,7 @@ export function create (rawOptions: CreateOptions = {}): Register { sourceMapSupport.install({ environment: 'node', retrieveFile (path: string) { - return outputCache.get(path) || '' + return outputCache.get(path)?.content || '' } }) @@ -447,9 +458,22 @@ export function create (rawOptions: CreateOptions = {}): Register { /** * Create the basic required function using transpile mode. */ - let getOutput: (code: string, fileName: string, lineOffset: number) => SourceOutput + let getOutput: (code: string, fileName: string) => SourceOutput let getTypeInfo: (_code: string, _fileName: string, _position: number) => TypeInfo + const getOutputTranspileOnly = (code: string, fileName: string, overrideCompilerOptions?: Partial<_ts.CompilerOptions>): SourceOutput => { + const result = ts.transpileModule(code, { + fileName, + compilerOptions: overrideCompilerOptions ? { ...config.options, ...overrideCompilerOptions } : config.options, + reportDiagnostics: true + }) + + const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) + if (diagnosticList.length) reportTSError(diagnosticList) + + return [result.outputText, result.sourceMapText as string] + } + // Use full language services when the fast option is disabled. if (!transpileOnly) { const fileContents = new Map() @@ -735,31 +759,22 @@ export function create (rawOptions: CreateOptions = {}): Register { throw new TypeError('Transformers function is unavailable in "--transpile-only"') } - getOutput = (code: string, fileName: string): SourceOutput => { - const result = ts.transpileModule(code, { - fileName, - transformers, - compilerOptions: config.options, - reportDiagnostics: true - }) - - const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) - if (diagnosticList.length) reportTSError(diagnosticList) - - return [result.outputText, result.sourceMapText as string] - } + getOutput = getOutputTranspileOnly getTypeInfo = () => { throw new TypeError('Type information is unavailable in "--transpile-only"') } } + const cannotCompileViaBothCodepathsErrorMessage = 'Cannot compile the same file via both `require()` and ESM hooks codepaths. ' + + 'This breaks source-map-support, which cannot tell the difference between the two sourcemaps. ' + + 'To avoid this problem, load each .ts file as only ESM or only CommonJS.' // Create a simple TypeScript compiler proxy. function compile (code: string, fileName: string, lineOffset = 0) { const normalizedFileName = normalizeSlashes(fileName) - const [value, sourceMap] = getOutput(code, normalizedFileName, lineOffset) + const [value, sourceMap] = getOutput(code, normalizedFileName) const output = updateOutput(value, normalizedFileName, sourceMap, getExtension) - outputCache.set(fileName, output) + outputCache.set(normalizedFileName, { content: output }) return output } @@ -768,6 +783,10 @@ export function create (rawOptions: CreateOptions = {}): Register { const ignored = (fileName: string) => { if (!active) return true const relname = relative(cwd, fileName) + if (!config.options.allowJs) { + const ext = extname(fileName) + if (ext === '.js' || ext === '.jsx') return true + } return !isScoped(relname) || shouldIgnore(relname) } diff --git a/tests/esm-node-resolver/bar/index.ts b/tests/esm-node-resolver/bar/index.ts new file mode 100644 index 000000000..4bfad1a30 --- /dev/null +++ b/tests/esm-node-resolver/bar/index.ts @@ -0,0 +1,3 @@ +export const bar: string = 'bar' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm-node-resolver/baz.js b/tests/esm-node-resolver/baz.js new file mode 100644 index 000000000..51474b54f --- /dev/null +++ b/tests/esm-node-resolver/baz.js @@ -0,0 +1,3 @@ +export const baz = 'baz' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm-node-resolver/biff.jsx b/tests/esm-node-resolver/biff.jsx new file mode 100644 index 000000000..e397d5217 --- /dev/null +++ b/tests/esm-node-resolver/biff.jsx @@ -0,0 +1,8 @@ +export const biff = 'biff' + +const React = { + createElement() {} +} +const div =
+ +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm-node-resolver/foo.ts b/tests/esm-node-resolver/foo.ts new file mode 100644 index 000000000..501c0021d --- /dev/null +++ b/tests/esm-node-resolver/foo.ts @@ -0,0 +1,3 @@ +export const foo: string = 'foo' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm-node-resolver/index.ts b/tests/esm-node-resolver/index.ts new file mode 100644 index 000000000..88b9bc868 --- /dev/null +++ b/tests/esm-node-resolver/index.ts @@ -0,0 +1,8 @@ +import {foo} from './foo' +import {bar} from './bar' +import {baz} from './baz' +import {biff} from './biff' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') + +console.log(`${foo} ${bar} ${baz} ${biff}`) diff --git a/tests/esm-node-resolver/package.json b/tests/esm-node-resolver/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/esm-node-resolver/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/esm-node-resolver/tsconfig.json b/tests/esm-node-resolver/tsconfig.json new file mode 100644 index 000000000..635b5b872 --- /dev/null +++ b/tests/esm-node-resolver/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "module": "ESNext", + "allowJs": true, + "jsx": "react", + "moduleResolution": "node" + } +} diff --git a/tests/esm/bar.ts b/tests/esm/bar.ts new file mode 100644 index 000000000..4bfad1a30 --- /dev/null +++ b/tests/esm/bar.ts @@ -0,0 +1,3 @@ +export const bar: string = 'bar' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm/baz.js b/tests/esm/baz.js new file mode 100644 index 000000000..51474b54f --- /dev/null +++ b/tests/esm/baz.js @@ -0,0 +1,3 @@ +export const baz = 'baz' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm/biff.jsx b/tests/esm/biff.jsx new file mode 100644 index 000000000..e397d5217 --- /dev/null +++ b/tests/esm/biff.jsx @@ -0,0 +1,8 @@ +export const biff = 'biff' + +const React = { + createElement() {} +} +const div =
+ +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm/foo.ts b/tests/esm/foo.ts new file mode 100644 index 000000000..501c0021d --- /dev/null +++ b/tests/esm/foo.ts @@ -0,0 +1,3 @@ +export const foo: string = 'foo' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') diff --git a/tests/esm/index.ts b/tests/esm/index.ts new file mode 100644 index 000000000..3b955e28b --- /dev/null +++ b/tests/esm/index.ts @@ -0,0 +1,8 @@ +import {foo} from './foo.js' +import {bar} from './bar.js' +import {baz} from './baz.js' +import {biff} from './biff.js' + +if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') + +console.log(`${foo} ${bar} ${baz} ${biff}`) diff --git a/tests/esm/package.json b/tests/esm/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/esm/tsconfig.json b/tests/esm/tsconfig.json new file mode 100644 index 000000000..03e0c3c5d --- /dev/null +++ b/tests/esm/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "ESNext", + "allowJs": true, + "jsx": "react" + } +} From 6fc4298ed1019c1ea9d1ebb3cd5ec8f6a8a86a83 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 3 May 2020 01:08:14 -0400 Subject: [PATCH 026/113] 8.10.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9274408a5..6d6c01b8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.9.1", + "version": "8.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index af860b502..abfc19510 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.9.1", + "version": "8.10.0", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "exports": { From 9fb567ae112cf51c8d5a21ce6c129a1462f860b2 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 3 May 2020 02:52:11 -0400 Subject: [PATCH 027/113] revert addition of package.json "exports" because it is a breaking change and requires more thought (#1027) --- package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package.json b/package.json index abfc19510..7e0e42061 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,6 @@ "version": "8.10.0", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", - "exports": { - ".": "./dist/index.js", - "./esm": "./esm.mjs" - }, "types": "dist/index.d.ts", "bin": { "ts-node": "dist/bin.js", From c1ae9a069a824368c9aaf89f4454b131af44a92f Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 3 May 2020 02:54:34 -0400 Subject: [PATCH 028/113] 8.10.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d6c01b8c..dc05ff3c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.10.0", + "version": "8.10.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7e0e42061..4c4eb65f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.10.0", + "version": "8.10.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "types": "dist/index.d.ts", From a335834d0a5a03c241beaada730cbc1c2ed77c73 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 10 May 2020 17:51:55 -0400 Subject: [PATCH 029/113] fix failing tests (#1035) * fix * fix --- package-lock.json | 178 +++++++++++++++++++++++----------------------- package.json | 4 +- src/esm.ts | 2 +- 3 files changed, 92 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc05ff3c6..b983b8851 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "integrity": "sha1-M+JZA9dIEYFTThLsCiXxa2/PQZ4=", "dev": true, "requires": { "@babel/highlight": "^7.8.3" @@ -22,7 +22,7 @@ "@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "integrity": "sha1-TptFzLgreWBycbKXmtgse2gWMHk=", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.9.0", @@ -47,31 +47,31 @@ "@types/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-mIenTfsIe586/yzsyfql69KRnA75S8SVXQbTLpDejRrjH0QSJcpu3AUOi/Vjnt9IOsXKxPhJfGpQUNMueIU1fQ==", + "integrity": "sha1-Lpu4n5rMOrAQjw89xNvc8v/4qZw=", "dev": true }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "integrity": "sha1-OP1z3f2bVaux4bLtV4y1W9e30zk=", "dev": true }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "integrity": "sha1-MV1XDMtWxTRS/4Y4c432BybVtuo=", "dev": true }, "@types/node": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.1.tgz", - "integrity": "sha512-uysqysLJ+As9jqI5yqjwP3QJrhOcUwBjHUlUxPxjbplwKoILvXVsmYWEhfmAQlrPfbRZmhJB007o4L9sKqtHqQ==", + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==", "dev": true }, "@types/proxyquire": { "version": "1.3.28", "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", - "integrity": "sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q==", + "integrity": "sha1-BaZHuw2P5I/I7cwZPkPMeTEPqn0=", "dev": true }, "@types/react": { @@ -83,7 +83,7 @@ "@types/semver": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.1.0.tgz", - "integrity": "sha512-pOKLaubrAEMUItGNpgwl0HMFPrSAFic8oSVIvfu1UwcgGNmNyK9gyhBHKmBnUTwwVvpZfkzUC0GaMgnL6P86uA==", + "integrity": "sha1-yMYw1MGM0ya+/3dASIdZb5ZAhAg=", "dev": true, "requires": { "@types/node": "*" @@ -114,7 +114,7 @@ "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", "dev": true }, "ansi-regex": { @@ -126,7 +126,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -193,13 +193,13 @@ "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==", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", "dev": true }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" }, "builtin-modules": { "version": "1.1.1", @@ -210,7 +210,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", "dev": true }, "chai": { @@ -230,7 +230,7 @@ "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -241,7 +241,7 @@ "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -258,7 +258,7 @@ "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", "dev": true, "requires": { "string-width": "^3.1.0", @@ -269,13 +269,13 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -286,7 +286,7 @@ "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -297,7 +297,7 @@ "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", "dev": true, "requires": { "color-name": "1.1.3" @@ -345,7 +345,7 @@ "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -360,7 +360,7 @@ "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", "dev": true, "requires": { "object-keys": "^1.0.12" @@ -392,7 +392,7 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", "dev": true }, "encoding": { @@ -426,7 +426,7 @@ "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -517,7 +517,7 @@ "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -526,7 +526,7 @@ "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", "dev": true, "requires": { "is-buffer": "~2.0.3" @@ -535,7 +535,7 @@ "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", "dev": true, "requires": { "debug": "=3.1.0" @@ -567,13 +567,13 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, "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==", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", "dev": true }, "get-func-name": { @@ -598,7 +598,7 @@ "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", "dev": true }, "handlebars": { @@ -616,7 +616,7 @@ "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -631,13 +631,13 @@ "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", "dev": true }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", "dev": true }, "iconv-lite": { @@ -665,19 +665,19 @@ "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=", "dev": true }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", "dev": true }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", "dev": true }, "is-fullwidth-code-point": { @@ -695,7 +695,7 @@ "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", "dev": true, "requires": { "has": "^1.0.3" @@ -710,7 +710,7 @@ "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", "dev": true, "requires": { "has-symbols": "^1.0.1" @@ -786,7 +786,7 @@ "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", "dev": true, "requires": { "argparse": "^1.0.7", @@ -796,7 +796,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", "dev": true } } @@ -829,7 +829,7 @@ "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -839,13 +839,13 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", "dev": true }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", "dev": true, "requires": { "chalk": "^2.0.1" @@ -874,7 +874,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -937,13 +937,13 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", "dev": true }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -995,13 +995,13 @@ "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=", "dev": true }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", @@ -1011,7 +1011,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", "dev": true } } @@ -1050,19 +1050,19 @@ "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -1074,7 +1074,7 @@ "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", "dev": true, "requires": { "define-properties": "^1.1.3", @@ -1134,7 +1134,7 @@ "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -1143,7 +1143,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", "dev": true }, "path-exists": { @@ -1161,7 +1161,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", "dev": true }, "pathval": { @@ -1228,7 +1228,7 @@ "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", "dev": true }, "resolve": { @@ -1283,7 +1283,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" }, "source-map-support": { "version": "0.5.17", @@ -1303,7 +1303,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -1384,7 +1384,7 @@ "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1407,7 +1407,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", "dev": true } } @@ -1415,7 +1415,7 @@ "tslint-config-standard": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-9.0.0.tgz", - "integrity": "sha512-CAw9J743RnPMemQV/XQ4YyNreC+A1NItACfkm+cBedrOkz6CQfwlnbKn8anUXBfoa4Zo4tjAhblRbsMNcSLfSw==", + "integrity": "sha1-NJqUgZ2T1fjYA+PHHLWO847/iOA=", "dev": true, "requires": { "tslint-eslint-rules": "^5.3.1" @@ -1424,7 +1424,7 @@ "tslint-eslint-rules": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "integrity": "sha1-5IjMkYG/GT/lzXv8ohOnaV8XN7U=", "dev": true, "requires": { "doctrine": "0.7.2", @@ -1435,13 +1435,13 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", "dev": true }, "tsutils": { "version": "3.17.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "integrity": "sha1-7XGZF/EcoN7lhicrKsSeAVot11k=", "dev": true, "requires": { "tslib": "^1.8.1" @@ -1452,7 +1452,7 @@ "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=", "dev": true, "requires": { "tslib": "^1.8.1" @@ -1474,15 +1474,15 @@ "dev": true }, "typescript": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz", - "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "typescript-json-schema": { "version": "0.42.0", "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.42.0.tgz", - "integrity": "sha512-9WO+lVmlph7Ecb7lPd9tU84XFUQh44kpAf3cWe/Ym4G5EKw/SS6XGpi1DZDthvxqkIdNSDlWi7FhKfxuIV/3yw==", + "integrity": "sha1-aV8hKnLZHUfAYFNx3Gl1l7eBfBs=", "dev": true, "requires": { "@types/json-schema": "^7.0.3", @@ -1495,13 +1495,13 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1515,7 +1515,7 @@ "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -1526,7 +1526,7 @@ "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -1535,7 +1535,7 @@ "yargs": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "integrity": "sha1-Ghw+3O0a+yov6jNgS8bR2NaIpBQ=", "dev": true, "requires": { "cliui": "^5.0.0", @@ -1554,7 +1554,7 @@ "yargs-parser": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "integrity": "sha1-VHhq9AuCDcsvuAJbEbTWWddjI7M=", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -1604,7 +1604,7 @@ "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", "dev": true, "requires": { "string-width": "^1.0.2 || 2" @@ -1619,7 +1619,7 @@ "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -1630,13 +1630,13 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -1647,7 +1647,7 @@ "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -1664,7 +1664,7 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", "dev": true }, "yargs": { @@ -1688,13 +1688,13 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -1705,7 +1705,7 @@ "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -1726,7 +1726,7 @@ "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", "dev": true, "requires": { "flat": "^4.1.0", @@ -1737,7 +1737,7 @@ "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A=" } } } diff --git a/package.json b/package.json index 4c4eb65f0..b966398ba 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", "@types/mocha": "^5.2.7", - "@types/node": "^13.13.1", + "@types/node": "13.13.5", "@types/proxyquire": "^1.3.28", "@types/react": "^16.0.2", "@types/semver": "^7.1.0", @@ -76,7 +76,7 @@ "semver": "^7.1.3", "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", - "typescript": "^3.7.2", + "typescript": "3.8.3", "typescript-json-schema": "^0.42.0" }, "peerDependencies": { diff --git a/src/esm.ts b/src/esm.ts index ed1e6003c..2443d7f7b 100644 --- a/src/esm.ts +++ b/src/esm.ts @@ -66,7 +66,7 @@ export function registerAndCreateEsmHooks (opts?: RegisterOptions) { assert(pathname !== null, 'ESM getFormat() hook: URL should never have null pathname') // If file has .ts, .tsx, or .jsx extension, then ask node how it would treat this file if it were .js - const ext = posixPath.extname(pathname!) + const ext = posixPath.extname(pathname) if (ext === '.ts' || ext === '.tsx' || ext === '.jsx') { return defer(formatUrl({ ...parsed, From c24a76818d4f1c1985d31150c98123b9778748b4 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 10 May 2020 19:16:07 -0400 Subject: [PATCH 030/113] Push coverage from GH Actions; remove TravisCI (#1034) * attempt to push coverage from gh actions * fix * fix * fix failing lint because node 6 npm install doesn't obey package-lock and pulls newer @types/node * fix * fix * try using coveralls gh action * parallel coveralls * add nigthly test * try to force finish to run always * try again * fix * remove intentially failing test --- .github/workflows/continuous-integration.yml | 29 ++++++++++++++++++-- .travis.yml | 27 ------------------ 2 files changed, 27 insertions(+), 29 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 3895aeee2..e12e70424 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -1,5 +1,12 @@ name: Continuous Integration -on: [push, pull_request] +on: + # branches pushed by collaborators + push: {} + # pull request from non-collaborators + pull_request: {} + # nightly + schedule: + - cron: '0 0 * * *' jobs: test: name: "Test #${{ matrix.flavor }}: node v${{ matrix.node }}, ${{ matrix.typescript }}" @@ -40,7 +47,25 @@ jobs: node-version: ${{ matrix.node }} # lint, build, test - run: npm install + - run: npm run lint - run: npm run build - run: npm rm tslint - - run: npm install ${{ matrix.typescript }} + - run: npm install ${{ matrix.typescript }} --force - run: npm run test-cov + - name: Coveralls + if: ${{ always() }} + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.github_token }} + flag-name: run-${{ matrix.flavor }} + parallel: true + finish: + needs: test + runs-on: ubuntu-latest + if: ${{ always() }} + steps: + - name: Coveralls Finished + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.github_token }} + parallel-finished: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e63194f85..000000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: node_js - -notifications: - email: - on_success: never - on_failure: change - -before_install: - - nvm install $NODE - -script: - - npm run lint - - npm run build - - npm rm tslint - - npm install $TYPESCRIPT --force - - npm run test-cov - -env: - - NODE=6 TYPESCRIPT=typescript@latest - - NODE=stable TYPESCRIPT=typescript@latest - - NODE=stable TYPESCRIPT=typescript@2.7 - - NODE=stable TYPESCRIPT=typescript@next - -node_js: - - stable - -after_script: "npm install coveralls@2 && cat ./coverage/lcov.info | coveralls" From 2397f3afa59024ca84cba0dfa6f456211c7522d0 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 11 May 2020 00:46:17 -0400 Subject: [PATCH 031/113] Run tests e2e against an `npm pack && npm install`ed ts-node (#1032) * Tweak tests to run against packed and installed ts-node instead of local dev tree * avoid re-building when packing * fix for node 6 * move npm pack into build step * update package-lock --- package-lock.json | 12 +++++++++ package.json | 11 +++++--- scripts/build-pack.js | 20 ++++++++++++++ src/externs.d.ts | 4 +++ src/index.spec.ts | 26 ++++++++++++++----- tests/.gitignore | 4 ++- .../from-node-modules.ts | 0 .../node_modules/test.ts | 0 tests/package.json | 5 ++++ 9 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 scripts/build-pack.js create mode 100644 src/externs.d.ts rename tests/{ => from-node-modules}/from-node-modules.ts (100%) rename tests/{ => from-node-modules}/node_modules/test.ts (100%) create mode 100644 tests/package.json diff --git a/package-lock.json b/package-lock.json index b983b8851..23e6967c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1580,6 +1580,18 @@ "source-map": "~0.6.1" } }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, "whatwg-fetch": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", diff --git a/package.json b/package.json index b966398ba..fb6f91962 100644 --- a/package.json +++ b/package.json @@ -22,14 +22,16 @@ "scripts": { "lint": "tslint \"src/**/*.ts\" --project tsconfig.json", "lint-fix": "tslint \"src/**/*.ts\" --project tsconfig.json --fix", - "clean": "rimraf dist && rimraf tsconfig.schema.json && rimraf tsconfig.schemastore-schema.json", - "build": "npm run clean && npm run build-tsc && npm run build-configSchema", + "clean": "rimraf dist && rimraf tsconfig.schema.json && rimraf tsconfig.schemastore-schema.json && rimraf tests/ts-node-packed.tgz", + "build": "npm run build-nopack && npm run build-pack", + "build-nopack": "npm run clean && npm run build-tsc && npm run build-configSchema", "build-tsc": "tsc", "build-configSchema": "typescript-json-schema --topRef --refs --validationKeywords allOf --out tsconfig.schema.json tsconfig.json TsConfigSchema && node --require ./register ./scripts/create-merged-schema", + "build-pack": "node ./scripts/build-pack.js", "test-spec": "mocha dist/**/*.spec.js -R spec --bail", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- \"dist/**/*.spec.js\" -R spec --bail", "test": "npm run build && npm run lint && npm run test-cov", - "prepare": "npm run build" + "prepare": "npm run build-nopack" }, "engines": { "node": ">=6.0.0" @@ -77,7 +79,8 @@ "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", "typescript": "3.8.3", - "typescript-json-schema": "^0.42.0" + "typescript-json-schema": "^0.42.0", + "util.promisify": "^1.0.1" }, "peerDependencies": { "typescript": ">=2.7" diff --git a/scripts/build-pack.js b/scripts/build-pack.js new file mode 100644 index 000000000..38811e99c --- /dev/null +++ b/scripts/build-pack.js @@ -0,0 +1,20 @@ +// Written in JS to support Windows +// Would otherwise be written as inline bash in package.json script + +const { exec } = require('child_process') +const { mkdtempSync, writeFileSync, readFileSync, unlinkSync, rmdirSync, readdirSync } = require('fs') +const { join } = require('path') + +const testDir = join(__dirname, '../tests') +const tarballPath = join(testDir, 'ts-node-packed.tgz') +const tempDir = mkdtempSync(join(testDir, 'tmp')) +exec(`npm pack "${join(__dirname, '..')}"`, { cwd: tempDir }, (err, stdout) => { + if (err) { + console.error(err) + process.exit(1) + } + const tempTarballPath = join(tempDir, readdirSync(tempDir)[0]) + writeFileSync(tarballPath, readFileSync(tempTarballPath)) + unlinkSync(tempTarballPath) + rmdirSync(tempDir) +}) diff --git a/src/externs.d.ts b/src/externs.d.ts new file mode 100644 index 000000000..d9257bd38 --- /dev/null +++ b/src/externs.d.ts @@ -0,0 +1,4 @@ +declare module 'util.promisify' { + const _export: typeof import('util').promisify + export = _export +} diff --git a/src/index.spec.ts b/src/index.spec.ts index 355cfcdf3..0d41f65d2 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -5,16 +5,28 @@ import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') import { register, create, VERSION } from './index' +import { unlinkSync, existsSync } from 'fs' +import * as promisify from 'util.promisify' + +const execP = promisify(exec) const TEST_DIR = join(__dirname, '../tests') const PROJECT = join(TEST_DIR, 'tsconfig.json') -const BIN_PATH = join(__dirname, '../dist/bin') -const BIN_SCRIPT_PATH = join(__dirname, '../dist/bin-script') +const BIN_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node') +const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ +// Pack and install ts-node locally, necessary to test package "exports" +before(async function () { + this.timeout(30000) + await execP(`npm install`, { cwd: TEST_DIR }) + const packageLockPath = join(TEST_DIR, 'package-lock.json') + existsSync(packageLockPath) && unlinkSync(packageLockPath) +}) + describe('ts-node', function () { - const cmd = `node "${BIN_PATH}" --project "${PROJECT}"` + const cmd = `"${BIN_PATH}" --project "${PROJECT}"` this.timeout(10000) @@ -35,7 +47,7 @@ describe('ts-node', function () { }) it('should register via cli', function (done) { - exec(`node -r ../register hello-world.ts`, { + exec(`node -r ts-node/register hello-world.ts`, { cwd: TEST_DIR }, function (err, stdout) { expect(err).to.equal(null) @@ -73,7 +85,7 @@ describe('ts-node', function () { }) it('should provide registered information on register', function (done) { - exec(`node -r ../register env.ts`, { + exec(`node -r ts-node/register env.ts`, { cwd: TEST_DIR }, function (err, stdout) { expect(err).to.equal(null) @@ -408,7 +420,7 @@ describe('ts-node', function () { } describe('should read ts-node options from tsconfig.json', function () { - const BIN_EXEC = `node "${join(__dirname, '../dist/bin')}" --project tests/tsconfig-options/tsconfig.json` + const BIN_EXEC = `"${BIN_PATH}" --project tests/tsconfig-options/tsconfig.json` it('should override compiler options from env', function (done) { exec(`${BIN_EXEC} tests/tsconfig-options/log-options.js`, { @@ -481,7 +493,7 @@ describe('ts-node', function () { }) it('should give ts error for invalid node_modules', function (done) { - exec(`${cmd} --compiler-host --skip-ignore tests/from-node-modules`, function (err, stdout) { + exec(`${cmd} --compiler-host --skip-ignore tests/from-node-modules/from-node-modules`, function (err, stdout) { if (err === null) return done('Expected an error') expect(err.message).to.contain('Unable to compile file from external library') diff --git a/tests/.gitignore b/tests/.gitignore index ddf342489..1f16711ae 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1 +1,3 @@ -!node_modules/ +!from-node-modules/node_modules/ +package-lock.json +ts-node-packed.tgz diff --git a/tests/from-node-modules.ts b/tests/from-node-modules/from-node-modules.ts similarity index 100% rename from tests/from-node-modules.ts rename to tests/from-node-modules/from-node-modules.ts diff --git a/tests/node_modules/test.ts b/tests/from-node-modules/node_modules/test.ts similarity index 100% rename from tests/node_modules/test.ts rename to tests/from-node-modules/node_modules/test.ts diff --git a/tests/package.json b/tests/package.json new file mode 100644 index 000000000..26351d2b8 --- /dev/null +++ b/tests/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "ts-node": "file:ts-node-packed.tgz" + } +} From 907935c382f4a35c5a186eb2a49162b1e1ea5b12 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 13 May 2020 01:13:23 -0400 Subject: [PATCH 032/113] Normalize paths when looking up items on outputCache (#1038) * Normalize paths when looking up items on outputCache * Tweak tests to be absolutely sure sourcemaps are working --- src/index.spec.ts | 6 +-- src/index.ts | 2 +- tests/throw.ts | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 0d41f65d2..064f42ee0 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -189,7 +189,7 @@ describe('ts-node', function () { } expect(err.message).to.contain([ - `${join(__dirname, '../tests/throw.ts')}:3`, + `${join(__dirname, '../tests/throw.ts')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^', 'Error: this is a demo' @@ -206,7 +206,7 @@ describe('ts-node', function () { } expect(err.message).to.contain([ - `${join(__dirname, '../tests/throw.ts')}:3`, + `${join(__dirname, '../tests/throw.ts')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^' ].join('\n')) @@ -611,7 +611,7 @@ describe('ts-node', function () { } catch (error) { expect(error.stack).to.contain([ 'Error: this is a demo', - ` at Foo.bar (${join(__dirname, '../tests/throw.ts')}:3:18)` + ` at Foo.bar (${join(__dirname, '../tests/throw.ts')}:100:18)` ].join('\n')) done() diff --git a/src/index.ts b/src/index.ts index e37442a90..9ee508ad4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -420,7 +420,7 @@ export function create (rawOptions: CreateOptions = {}): Register { sourceMapSupport.install({ environment: 'node', retrieveFile (path: string) { - return outputCache.get(path)?.content || '' + return outputCache.get(normalizeSlashes(path))?.content || '' } }) diff --git a/tests/throw.ts b/tests/throw.ts index 1183d9ff5..dbd4cbc2e 100644 --- a/tests/throw.ts +++ b/tests/throw.ts @@ -1,4 +1,101 @@ +// intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. +// 100 lines is meant to be far more space than the helper functions would take. class Foo { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + constructor () { this.bar() } bar () { throw new Error('this is a demo') } } From d339107fa8b82e356ce31ebea7e38b6f56edafcf Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 13 May 2020 21:27:17 -0400 Subject: [PATCH 033/113] CI run tests on windows (#1041) * Run tests on windows * fix * fix * fix * fix * debug * fix * fix * fix * fix * fix * fix failing test * run bin scripts directly, not via node, so that windows cmd shims are invoked * fix failing test * fix failing test * fix test * fix failing tests * remove unused import * skip symlink tests on windows when git symlinks disabled * linting * tweak symlink test * rename artifact * disable failing test on windows --- .github/workflows/continuous-integration.yml | 38 ++++++++++++--- src/esm.ts | 26 ++++------- src/index.spec.ts | 49 ++++++++++++-------- 3 files changed, 70 insertions(+), 43 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index e12e70424..b255a7ebe 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -8,12 +8,35 @@ on: schedule: - cron: '0 0 * * *' jobs: - test: - name: "Test #${{ matrix.flavor }}: node v${{ matrix.node }}, ${{ matrix.typescript }}" + lint-build: + name: "Lint & Build" runs-on: ubuntu-latest + steps: + # checkout code + - uses: actions/checkout@v2 + # install node + - name: Use Node.js 14 + uses: actions/setup-node@v1 + with: + node-version: 14 + # lint, build, test + - run: npm install + - run: npm run lint + - run: npm run build + - name: Upload package artifact + uses: actions/upload-artifact@v1 + with: + name: ts-node-packed.tgz + path: tests/ts-node-packed.tgz + + test: + needs: lint-build + name: "Test #${{ matrix.flavor }}: ${{ matrix.os }}, node v${{ matrix.node }}, ${{ matrix.typescript }}" + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: + os: [ubuntu-latest, windows-latest] flavor: [1, 2, 3, 4, 5, 6, 7] include: - flavor: 1 @@ -47,9 +70,12 @@ jobs: node-version: ${{ matrix.node }} # lint, build, test - run: npm install - - run: npm run lint - - run: npm run build - - run: npm rm tslint + - run: npm run build-nopack + - name: Download package artifact + uses: actions/download-artifact@v1 + with: + name: ts-node-packed.tgz + path: tests/ - run: npm install ${{ matrix.typescript }} --force - run: npm run test-cov - name: Coveralls @@ -57,7 +83,7 @@ jobs: uses: coverallsapp/github-action@master with: github-token: ${{ secrets.github_token }} - flag-name: run-${{ matrix.flavor }} + flag-name: run-${{ matrix.os }}-${{ matrix.flavor }} parallel: true finish: needs: test diff --git a/src/esm.ts b/src/esm.ts index 2443d7f7b..53adfc8a1 100644 --- a/src/esm.ts +++ b/src/esm.ts @@ -1,6 +1,6 @@ import { register, getExtensions, RegisterOptions } from './index' -import { parse as parseUrl, format as formatUrl, UrlWithStringQuery } from 'url' -import { posix as posixPath } from 'path' +import { parse as parseUrl, format as formatUrl, UrlWithStringQuery, fileURLToPath, pathToFileURL } from 'url' +import { extname } from 'path' import * as assert from 'assert' const { createResolve } = require('../dist-raw/node-esm-resolve-implementation') @@ -65,13 +65,12 @@ export function registerAndCreateEsmHooks (opts?: RegisterOptions) { const { pathname } = parsed assert(pathname !== null, 'ESM getFormat() hook: URL should never have null pathname') + const nativePath = fileURLToPath(url) + // If file has .ts, .tsx, or .jsx extension, then ask node how it would treat this file if it were .js - const ext = posixPath.extname(pathname) + const ext = extname(nativePath) if (ext === '.ts' || ext === '.tsx' || ext === '.jsx') { - return defer(formatUrl({ - ...parsed, - pathname: pathname + '.js' - })) + return defer(formatUrl(pathToFileURL(nativePath + '.js'))) } return defer() @@ -88,20 +87,13 @@ export function registerAndCreateEsmHooks (opts?: RegisterOptions) { if (!isFileUrlOrNodeStyleSpecifier(parsed)) { return defer() } - const { pathname } = parsed - if (pathname === null || !posixPath.isAbsolute(pathname)) { - // If we are meant to handle this URL, then it has already been resolved to an absolute path by our resolver hook - return defer() - } - - // Assigning to a new variable so it's clear that we have stopped thinking of it as a URL, and started using it like a native FS path - const fileName = pathname + const nativePath = fileURLToPath(url) - if (tsNodeInstance.ignored(fileName)) { + if (tsNodeInstance.ignored(nativePath)) { return defer() } - const emittedJs = tsNodeInstance.compile(sourceAsString, fileName) + const emittedJs = tsNodeInstance.compile(sourceAsString, nativePath) return { source: emittedJs } } diff --git a/src/index.spec.ts b/src/index.spec.ts index 064f42ee0..20affb929 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -5,7 +5,7 @@ import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') import { register, create, VERSION } from './index' -import { unlinkSync, existsSync } from 'fs' +import { unlinkSync, existsSync, statSync } from 'fs' import * as promisify from 'util.promisify' const execP = promisify(exec) @@ -262,7 +262,7 @@ describe('ts-node', function () { }) it('should pipe into an eval script', function (done) { - const cp = exec(`${cmd} --transpile-only -pe 'process.stdin.isTTY'`, function (err, stdout) { + const cp = exec(`${cmd} --transpile-only -pe "process.stdin.isTTY"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('undefined\n') @@ -369,18 +369,23 @@ describe('ts-node', function () { describe('issue #884', function () { it('should compile', function (done) { - exec(`node "${BIN_PATH}" --project tests/issue-884/tsconfig.json tests/issue-884`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('') + // TODO disabled because it consistently fails on Windows on TS 2.7 + if (process.platform === 'win32' && semver.satisfies(ts.version, '2.7')) { + this.skip() + } else { + exec(`"${BIN_PATH}" --project tests/issue-884/tsconfig.json tests/issue-884`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('') - return done() - }) + return done() + }) + } }) }) describe('issue #986', function () { it('should not compile', function (done) { - exec(`node "${BIN_PATH}" --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { + exec(`"${BIN_PATH}" --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { expect(err).not.to.equal(null) expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. expect(stdout).to.equal('') @@ -390,7 +395,7 @@ describe('ts-node', function () { }) it('should compile with `--files`', function (done) { - exec(`node "${BIN_PATH}" --files --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { + exec(`"${BIN_PATH}" --files --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { expect(err).not.to.equal(null) expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. expect(stdout).to.equal('') @@ -402,7 +407,7 @@ describe('ts-node', function () { if (semver.gte(ts.version, '2.7.0')) { it('should support script mode', function (done) { - exec(`node ${BIN_SCRIPT_PATH} tests/scope/a/log`, function (err, stdout) { + exec(`${BIN_SCRIPT_PATH} tests/scope/a/log`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('.ts\n') @@ -410,12 +415,16 @@ describe('ts-node', function () { }) }) it('should read tsconfig relative to realpath, not symlink, in scriptMode', function (done) { - exec(`node ${BIN_SCRIPT_PATH} tests/main-realpath/symlink/symlink.tsx`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('') + if (statSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { + exec(`${BIN_SCRIPT_PATH} tests/main-realpath/symlink/symlink.tsx`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('') - return done() - }) + return done() + }) + } else { + this.skip() + } }) } @@ -431,7 +440,7 @@ describe('ts-node', function () { }, function (err, stdout) { expect(err).to.equal(null) const { config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/env-typeroots')]) + expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/env-typeroots').replace(/\\/g, '/')]) return done() }) }) @@ -440,7 +449,7 @@ describe('ts-node', function () { exec(`${BIN_EXEC} tests/tsconfig-options/log-options.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots')]) + expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(false) @@ -450,10 +459,10 @@ describe('ts-node', function () { }) it('should have flags override `tsconfig.json`', function (done) { - exec(`${BIN_EXEC} --skip-ignore --compiler-options '{"types": ["flags-types"]}' tests/tsconfig-options/log-options.js`, function (err, stdout) { + exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" tests/tsconfig-options/log-options.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots')]) + expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['flags-types']) expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(true) @@ -472,7 +481,7 @@ describe('ts-node', function () { }, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots')]) + expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) expect(options.pretty).to.equal(true) expect(options.skipIgnore).to.equal(false) From d989d4ce431e4f2f824f9ee1f9e183a9edbe39d0 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 13 May 2020 21:31:24 -0400 Subject: [PATCH 034/113] run ci only once for pull request comments and for master commits (#1042) --- .github/workflows/continuous-integration.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index b255a7ebe..542bf7fcf 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -1,7 +1,9 @@ name: Continuous Integration on: # branches pushed by collaborators - push: {} + push: + branches: + - master # pull request from non-collaborators pull_request: {} # nightly From 838bd55037672e4e4e23bbe2039e96896fbf9db3 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 16 May 2020 06:52:42 -0400 Subject: [PATCH 035/113] Make #884 regression test repro correctly; also fix the bug (#999) * tweak issue #884 regression test so it triggers on master * Simplify while stil reproducing the issue * getScriptFileNames returns rootFileNames, not everything from memory cache --- src/index.ts | 23 +++++++++++++---------- tests/issue-884/index-2.ts | 7 +++++++ tests/issue-884/index.ts | 8 +++----- 3 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 tests/issue-884/index-2.ts diff --git a/src/index.ts b/src/index.ts index 9ee508ad4..463818844 100644 --- a/src/index.ts +++ b/src/index.ts @@ -477,13 +477,13 @@ export function create (rawOptions: CreateOptions = {}): Register { // Use full language services when the fast option is disabled. if (!transpileOnly) { const fileContents = new Map() - const rootFileNames = config.fileNames.slice() + const rootFileNames = new Set(config.fileNames) const cachedReadFile = cachedLookup(debugFn('readFile', readFile)) // Use language services by default (TODO: invert next major version). if (!options.compilerHost) { let projectVersion = 1 - const fileVersions = new Map(rootFileNames.map(fileName => [fileName, 0])) + const fileVersions = new Map(Array.from(rootFileNames).map(fileName => [fileName, 0])) const getCustomTransformers = () => { if (typeof transformers === 'function') { @@ -497,7 +497,7 @@ export function create (rawOptions: CreateOptions = {}): Register { // Create the compiler host for type checking. const serviceHost: _ts.LanguageServiceHost = { getProjectVersion: () => String(projectVersion), - getScriptFileNames: () => Array.from(fileVersions.keys()), + getScriptFileNames: () => Array.from(rootFileNames), getScriptVersion: (fileName: string) => { const version = fileVersions.get(fileName) return version ? version.toString() : '' @@ -533,9 +533,12 @@ export function create (rawOptions: CreateOptions = {}): Register { const service = ts.createLanguageService(serviceHost, registry) const updateMemoryCache = (contents: string, fileName: string) => { - // Add to `rootFiles` when discovered for the first time. - if (!fileVersions.has(fileName)) { - rootFileNames.push(fileName) + // Add to `rootFiles` if not already there + // This is necessary to force TS to emit output + if (!rootFileNames.has(fileName)) { + rootFileNames.add(fileName) + // Increment project version for every change to rootFileNames. + projectVersion++ } const previousVersion = fileVersions.get(fileName) || 0 @@ -637,14 +640,14 @@ export function create (rawOptions: CreateOptions = {}): Register { // Fallback for older TypeScript releases without incremental API. let builderProgram = ts.createIncrementalProgram ? ts.createIncrementalProgram({ - rootNames: rootFileNames.slice(), + rootNames: Array.from(rootFileNames), options: config.options, host: host, configFileParsingDiagnostics: config.errors, projectReferences: config.projectReferences }) : ts.createEmitAndSemanticDiagnosticsBuilderProgram( - rootFileNames.slice(), + Array.from(rootFileNames), config.options, host, undefined, @@ -665,13 +668,13 @@ export function create (rawOptions: CreateOptions = {}): Register { // Add to `rootFiles` when discovered by compiler for the first time. if (sourceFile === undefined) { - rootFileNames.push(fileName) + rootFileNames.add(fileName) } // Update program when file changes. if (sourceFile === undefined || sourceFile.text !== contents) { builderProgram = ts.createEmitAndSemanticDiagnosticsBuilderProgram( - rootFileNames.slice(), + Array.from(rootFileNames), config.options, host, builderProgram, diff --git a/tests/issue-884/index-2.ts b/tests/issue-884/index-2.ts new file mode 100644 index 000000000..ddacd3c42 --- /dev/null +++ b/tests/issue-884/index-2.ts @@ -0,0 +1,7 @@ +export {}; + +const timeout = setTimeout(() => {}, 0); + +if (timeout.unref) { + timeout.unref(); +} diff --git a/tests/issue-884/index.ts b/tests/issue-884/index.ts index 84dc7d9a6..8c23188df 100644 --- a/tests/issue-884/index.ts +++ b/tests/issue-884/index.ts @@ -1,5 +1,3 @@ -const timeout = setTimeout(() => {}, 0); - -if (timeout.unref) { - timeout.unref(); -} +// 2x index files required so that memory cache is populated with all build-in lib and @types +// declarations *before* this require() call. +require('./index-2'); From 5f305ea61438e454708b47319bae24c69507348c Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 16 May 2020 07:26:47 -0400 Subject: [PATCH 036/113] Fix #996: bump projectVersion every time getSourceFileNames changes (#998) * Add failing test * bump projectVersion every time getScriptFileNames changes * fix tests * tweak error reporting in test --- src/index.spec.ts | 7 +++++++ src/index.ts | 1 + 2 files changed, 8 insertions(+) diff --git a/src/index.spec.ts b/src/index.spec.ts index 20affb929..25346385f 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -511,6 +511,13 @@ describe('ts-node', function () { }) }) }) + + it('should transpile files inside a node_modules directory when not ignored', function (done) { + exec(`${cmd} --skip-ignore tests/from-node-modules/from-node-modules`, function (err, stdout, stderr) { + if (err) return done(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) + done() + }) + }) }) describe('register', function () { diff --git a/src/index.ts b/src/index.ts index 463818844..0ac879fd2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -512,6 +512,7 @@ export function create (rawOptions: CreateOptions = {}): Register { fileVersions.set(fileName, 1) fileContents.set(fileName, contents) + projectVersion++ } return ts.ScriptSnapshot.fromString(contents) From 4f18cebb0c64fbc388cfe25b3b827fcb1554203b Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 16 May 2020 12:43:11 -0400 Subject: [PATCH 037/113] Bump minimum supported node version to 10 (#1036) --- .github/workflows/continuous-integration.yml | 17 ++++++++++------- package.json | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 542bf7fcf..2ad4a661f 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -39,27 +39,30 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] - flavor: [1, 2, 3, 4, 5, 6, 7] + flavor: [1, 2, 3, 4, 5, 6, 7, 8] include: - flavor: 1 - node: 6 + node: 10 typescript: typescript@latest - flavor: 2 - node: 13 + node: 12 typescript: typescript@latest - flavor: 3 node: 13 - typescript: typescript@2.7 + typescript: typescript@latest - flavor: 4 node: 13 - typescript: typescript@next + typescript: typescript@2.7 - flavor: 5 + node: 13 + typescript: typescript@next + - flavor: 6 node: 14 typescript: typescript@latest - - flavor: 6 + - flavor: 7 node: 14 typescript: typescript@2.7 - - flavor: 7 + - flavor: 8 node: 14 typescript: typescript@next steps: diff --git a/package.json b/package.json index fb6f91962..a92934d4d 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "prepare": "npm run build-nopack" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" }, "repository": { "type": "git", From f40b02453ff83b1b8c40db54b57014bef7f3da5f Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 16 May 2020 13:18:17 -0400 Subject: [PATCH 038/113] fix test being erroneously skipped (#1044) --- src/index.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 25346385f..630236214 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -5,7 +5,7 @@ import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') import { register, create, VERSION } from './index' -import { unlinkSync, existsSync, statSync } from 'fs' +import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' const execP = promisify(exec) @@ -415,7 +415,7 @@ describe('ts-node', function () { }) }) it('should read tsconfig relative to realpath, not symlink, in scriptMode', function (done) { - if (statSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { + if (lstatSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { exec(`${BIN_SCRIPT_PATH} tests/main-realpath/symlink/symlink.tsx`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') From 4ce5846704737db8e7f1ae0b19ea90ac31fa3ec3 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 16 May 2020 13:21:36 -0400 Subject: [PATCH 039/113] Fix code coverage so it maps to TS sources (#1043) * Fix coverage so it maps to .ts upgrade from istanbul to nyc use a remapper script to remap from ./node_modules/ts-node to our source tree, since all coverage is captured from an `npm install`ed instance of ts-node * remove commented-out code --- .gitignore | 1 + nyc.config.js | 12 + package-lock.json | 1316 ++++++++++++++++++++++++----- package.json | 7 +- scripts/rewrite-coverage-paths.js | 26 + src/index.spec.ts | 2 + 6 files changed, 1140 insertions(+), 224 deletions(-) create mode 100644 nyc.config.js create mode 100644 scripts/rewrite-coverage-paths.js diff --git a/.gitignore b/.gitignore index 574e3cfc4..f359ce335 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules/ +.nyc_output/ coverage/ .DS_Store npm-debug.log diff --git a/nyc.config.js b/nyc.config.js new file mode 100644 index 000000000..4a886a910 --- /dev/null +++ b/nyc.config.js @@ -0,0 +1,12 @@ +module.exports = { + all: true, + include: [ + 'tests/node_modules/ts-node/**', + ], + exclude: [ + '**/*.d.ts', + 'tests/node_modules/ts-node/node_modules/**', + ], + excludeNodeModules: false, + excludeAfterRemap: false +}; diff --git a/package-lock.json b/package-lock.json index 23e6967c2..7d331b7fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,12 +13,192 @@ "@babel/highlight": "^7.8.3" } }, + "@babel/core": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, "@babel/helper-validator-identifier": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", "dev": true }, + "@babel/helpers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, "@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", @@ -38,24 +218,177 @@ } } }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, "@types/chai": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.10.tgz", "integrity": "sha512-Ejh1AXTY8lm+x91X/yar3G2z4x9RyKwdTVdyyu7Xj3dNB35fMNCnEWqTO9FgS3zjzlRNqk1MruYhgb8yhRN9rA==", "dev": true }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/diff/-/diff-4.0.2.tgz", "integrity": "sha1-Lpu4n5rMOrAQjw89xNvc8v/4qZw=", "dev": true }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", "integrity": "sha1-OP1z3f2bVaux4bLtV4y1W9e30zk=", "dev": true }, + "@types/lodash": { + "version": "4.14.151", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.151.tgz", + "integrity": "sha512-Zst90IcBX5wnwSu7CAS0vvJkTjTELY4ssKbHiTnGcJgi170uiS8yQDdc3v6S77bRqYQIN1App5a1Pc2lceE5/g==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", @@ -80,6 +413,16 @@ "integrity": "sha512-ft7OuDGUo39e+9LGwUewf2RyEaNBOjWbHUmD5bzjNuSuDabccE/1IuO7iR0dkzLjVUKxTMq69E+FmKfbgBcfbQ==", "dev": true }, + "@types/rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, "@types/semver": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.1.0.tgz", @@ -98,18 +441,15 @@ "@types/node": "*" } }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, - "optional": true + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } }, "ansi-colors": { "version": "3.2.3", @@ -132,6 +472,21 @@ "color-convert": "^1.9.0" } }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "arg": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", @@ -158,12 +513,6 @@ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "axios": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", @@ -207,6 +556,18 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -255,6 +616,12 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -315,18 +682,55 @@ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "core-js": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", "dev": true }, + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -351,11 +755,14 @@ "type-detect": "^4.0.0" } }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } }, "define-properties": { "version": "1.1.3", @@ -434,61 +841,18 @@ "is-symbol": "^1.0.2" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, "fbjs": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", @@ -514,6 +878,17 @@ "merge-descriptors": "~1.0.0" } }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -558,6 +933,22 @@ } } }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -570,6 +961,12 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -582,18 +979,17 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "growl": { "version": "1.10.5", @@ -601,18 +997,6 @@ "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", "dev": true }, - "handlebars": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", - "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -634,18 +1018,54 @@ "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", "dev": true }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + } + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", "dev": true }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -716,6 +1136,18 @@ "has-symbols": "^1.0.1" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -738,45 +1170,116 @@ "whatwg-fetch": ">=0.10.0" } }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "ms": "^2.1.1" } } } }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -801,6 +1304,12 @@ } } }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", @@ -810,22 +1319,29 @@ "jsonify": "~0.0.0" } }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -839,7 +1355,13 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "log-symbols": { @@ -860,6 +1382,23 @@ "js-tokens": "^3.0.0" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "make-error": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", @@ -880,12 +1419,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, "mkdirp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", @@ -992,12 +1525,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=", - "dev": true - }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", @@ -1026,13 +1553,13 @@ "is-stream": "^1.0.1" } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { - "abbrev": "1" + "process-on-spawn": "^1.0.0" } }, "ntypescript": { @@ -1041,6 +1568,204 @@ "integrity": "sha1-hmrpzDZoixQWBhVu0LzDXN9TYnE=", "dev": true }, + "nyc": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz", + "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1090,38 +1815,6 @@ "wrappy": "1" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, "p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", @@ -1140,12 +1833,33 @@ "p-limit": "^2.0.0" } }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", "dev": true }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -1158,6 +1872,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -1170,11 +1890,59 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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==", + "dev": true + } + } + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } }, "promise": { "version": "7.3.1", @@ -1219,6 +1987,15 @@ "prop-types": "^15.6.0" } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1237,6 +2014,12 @@ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, "rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", @@ -1262,6 +2045,12 @@ } } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "semver": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", @@ -1280,6 +2069,27 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1294,6 +2104,31 @@ "source-map": "^0.6.0" } }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1339,6 +2174,12 @@ "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -1354,6 +2195,39 @@ "has-flag": "^3.0.0" } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "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" + } + } + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -1458,21 +2332,27 @@ "tslib": "^1.8.1" } }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, "type-detect": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", "dev": true }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", @@ -1569,17 +2449,6 @@ "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", "dev": true }, - "uglify-js": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", - "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - } - }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", @@ -1592,21 +2461,18 @@ "object.getownpropertydescriptors": "^2.1.0" } }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, "whatwg-fetch": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", "dev": true }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -1622,12 +2488,6 @@ "string-width": "^1.0.2 || 2" } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -1673,6 +2533,18 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", diff --git a/package.json b/package.json index a92934d4d..cd596c98e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "build-configSchema": "typescript-json-schema --topRef --refs --validationKeywords allOf --out tsconfig.schema.json tsconfig.json TsConfigSchema && node --require ./register ./scripts/create-merged-schema", "build-pack": "node ./scripts/build-pack.js", "test-spec": "mocha dist/**/*.spec.js -R spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- \"dist/**/*.spec.js\" -R spec --bail", + "test-cov": "nyc mocha -- \"dist/**/*.spec.js\" -R spec --bail && node ./scripts/rewrite-coverage-paths.js && nyc report --reporter=lcov", "test": "npm run build && npm run lint && npm run test-cov", "prepare": "npm run build-nopack" }, @@ -61,17 +61,20 @@ "devDependencies": { "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", + "@types/lodash": "^4.14.151", "@types/mocha": "^5.2.7", "@types/node": "13.13.5", "@types/proxyquire": "^1.3.28", "@types/react": "^16.0.2", + "@types/rimraf": "^3.0.0", "@types/semver": "^7.1.0", "@types/source-map-support": "^0.5.0", "axios": "^0.19.0", "chai": "^4.0.1", - "istanbul": "^0.4.0", + "lodash": "^4.17.15", "mocha": "^6.2.2", "ntypescript": "^1.201507091536.1", + "nyc": "^15.0.1", "proxyquire": "^2.0.0", "react": "^16.0.0", "rimraf": "^3.0.0", diff --git a/scripts/rewrite-coverage-paths.js b/scripts/rewrite-coverage-paths.js new file mode 100644 index 000000000..8793839cc --- /dev/null +++ b/scripts/rewrite-coverage-paths.js @@ -0,0 +1,26 @@ +const {readdirSync, readFileSync, writeFileSync, statSync} = require('fs') +const {resolve, sep} = require('path') +const {mapKeys, each} = require('lodash') + +const fromPrefix = resolve(__dirname, '../tests/node_modules/ts-node') + sep +const toPrefix = resolve(__dirname, '..') + sep + +function rewritePath(input) { + if(input.indexOf(fromPrefix) === 0) { + return toPrefix + input.slice(fromPrefix.length) + } + return input +} + +const nycOutputDir = resolve(__dirname, '../.nyc_output') +for(const filename of readdirSync(nycOutputDir)) { + const filePath = resolve(nycOutputDir, filename) + if(statSync(filePath).isDirectory()) continue + let json = JSON.parse(readFileSync(filePath, 'utf8')) + json = mapKeys(json, (_, key) => rewritePath(key)) + each(json, obj => { + if(obj.path) + obj.path = rewritePath(obj.path) + }) + writeFileSync(filePath, JSON.stringify(json)) +} diff --git a/src/index.spec.ts b/src/index.spec.ts index 630236214..d77970385 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -7,6 +7,7 @@ import proxyquire = require('proxyquire') import { register, create, VERSION } from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' +import { sync as rimrafSync } from 'rimraf' const execP = promisify(exec) @@ -20,6 +21,7 @@ const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset // Pack and install ts-node locally, necessary to test package "exports" before(async function () { this.timeout(30000) + rimrafSync(join(TEST_DIR, 'node_modules')) await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) From 9840cb19421f5acfc700783660c1941b9e71c6c2 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 May 2020 07:32:13 -0400 Subject: [PATCH 040/113] Update .gitignore (#1045) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f359ce335..9b3c84d16 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ npm-debug.log dist/ tsconfig.schema.json tsconfig.schemastore-schema.json +.idea/ From 196aafb002069d585e87e13891197db14c68d72f Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 18 May 2020 01:55:58 -0400 Subject: [PATCH 041/113] Fix coverage reporting when tests fail; also push to codecov (#1047) * Try pushing to codecov; maybe that'll work better * fix * fix * fix * fix * fix * fix * fix * fix * fix --- .github/workflows/continuous-integration.yml | 50 +++++++++++++++----- codecov.yml | 4 ++ package.json | 4 +- 3 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 codecov.yml diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 2ad4a661f..90bf4a2dc 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -33,38 +33,54 @@ jobs: test: needs: lint-build - name: "Test #${{ matrix.flavor }}: ${{ matrix.os }}, node v${{ matrix.node }}, ${{ matrix.typescript }}" - runs-on: ${{ matrix.os }} + name: "Test: ${{ matrix.os }}, node ${{ matrix.node }}, TS ${{ matrix.typescript }}" + runs-on: ${{ matrix.os }}-latest strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu, windows] flavor: [1, 2, 3, 4, 5, 6, 7, 8] include: - flavor: 1 node: 10 - typescript: typescript@latest + nodeFlag: 10 + typescript: latest + typescriptFlag: latest - flavor: 2 node: 12 - typescript: typescript@latest + nodeFlag: 12 + typescript: latest + typescriptFlag: latest - flavor: 3 node: 13 - typescript: typescript@latest + nodeFlag: 13 + typescript: latest + typescriptFlag: latest - flavor: 4 node: 13 - typescript: typescript@2.7 + nodeFlag: 13 + typescript: 2.7 + typescriptFlag: 2_7 - flavor: 5 node: 13 - typescript: typescript@next + nodeFlag: 13 + typescript: next + typescriptFlag: next - flavor: 6 node: 14 - typescript: typescript@latest + nodeFlag: 14 + typescript: latest + typescriptFlag: latest - flavor: 7 node: 14 - typescript: typescript@2.7 + nodeFlag: 14 + typescript: 2.7 + typescriptFlag: 2_7 - flavor: 8 node: 14 - typescript: typescript@next + nodeFlag: 14 + typescript: next + typescriptFlag: next steps: # checkout code - uses: actions/checkout@v2 @@ -81,14 +97,22 @@ jobs: with: name: ts-node-packed.tgz path: tests/ - - run: npm install ${{ matrix.typescript }} --force + - run: npm install typescript@${{ matrix.typescript }} --force - run: npm run test-cov + - run: npm run coverage-report + if: ${{ always() }} + - name: Codecov + if: ${{ always() }} + uses: codecov/codecov-action@v1 + with: + flags: ${{ matrix.os }},node_${{ matrix.nodeFlag }},typescript_${{ matrix.typescriptFlag }} + - run: npm run coverage-fix-paths + - run: npm run coverage-report - name: Coveralls if: ${{ always() }} uses: coverallsapp/github-action@master with: github-token: ${{ secrets.github_token }} - flag-name: run-${{ matrix.os }}-${{ matrix.flavor }} parallel: true finish: needs: test diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..28ca33092 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,4 @@ +fixes: + # Remap from npm-installed ts-node to root of project + # This can take the place of ./scripts/rewrite-coverage-paths.js + - "tests/node_modules/ts-node/::" diff --git a/package.json b/package.json index cd596c98e..fb0138c9c 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,10 @@ "build-configSchema": "typescript-json-schema --topRef --refs --validationKeywords allOf --out tsconfig.schema.json tsconfig.json TsConfigSchema && node --require ./register ./scripts/create-merged-schema", "build-pack": "node ./scripts/build-pack.js", "test-spec": "mocha dist/**/*.spec.js -R spec --bail", - "test-cov": "nyc mocha -- \"dist/**/*.spec.js\" -R spec --bail && node ./scripts/rewrite-coverage-paths.js && nyc report --reporter=lcov", + "test-cov": "nyc mocha -- \"dist/**/*.spec.js\" -R spec --bail", "test": "npm run build && npm run lint && npm run test-cov", + "coverage-fix-paths": "node ./scripts/rewrite-coverage-paths.js", + "coverage-report": "nyc report --reporter=lcov", "prepare": "npm run build-nopack" }, "engines": { From 3978f328a3970cd4f81f6a1ad1ed9d5c31fad8c0 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 19 May 2020 20:27:37 -0400 Subject: [PATCH 042/113] Implement ERR_REQUIRE_ESM when a file is `require()`d which should be loaded as ESM (#1031) * revert addition of package.json "exports" because it is a breaking change and requires more thought * Implement ERR_REQUIRE_ESM error when attempting to require() an ESM file * fix * test on node 12.15 and 12.16 due to weird ESM handling * Switch package.json "type" feature detection to a simple version number check * Remove dead code * Only throw ERR_REQUIRE_ESM if experimental ESM loader is enabled, since it is a breaking change * Fix linter failures * Add tests * fix test? * Fix tests * add comments to explain copy-pasted cjs loader code from node core * fix * tweak comment --- .github/workflows/continuous-integration.yml | 21 +-- dist-raw/README.md | 13 ++ dist-raw/node-cjs-loader-utils.js | 136 ++++++++++++++++++ src/esm.ts | 5 +- src/index.spec.ts | 27 +++- src/index.ts | 35 ++++- .../esm-package/loaded-as.ts | 5 + .../esm-package/package.json | 3 + tests/esm-err-require-esm/index.js | 1 + 9 files changed, 228 insertions(+), 18 deletions(-) create mode 100644 dist-raw/README.md create mode 100644 dist-raw/node-cjs-loader-utils.js create mode 100644 tests/esm-err-require-esm/esm-package/loaded-as.ts create mode 100644 tests/esm-err-require-esm/esm-package/package.json create mode 100644 tests/esm-err-require-esm/index.js diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 90bf4a2dc..4c49393fd 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -39,7 +39,7 @@ jobs: fail-fast: false matrix: os: [ubuntu, windows] - flavor: [1, 2, 3, 4, 5, 6, 7, 8] + flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9] include: - flavor: 1 node: 10 @@ -47,36 +47,41 @@ jobs: typescript: latest typescriptFlag: latest - flavor: 2 - node: 12 - nodeFlag: 12 + node: 12.15 + nodeFlag: 12_15 typescript: latest typescriptFlag: latest - flavor: 3 + node: 12.16 + nodeFlag: 12_16 + typescript: latest + typescriptFlag: latest + - flavor: 4 node: 13 nodeFlag: 13 typescript: latest typescriptFlag: latest - - flavor: 4 + - flavor: 5 node: 13 nodeFlag: 13 typescript: 2.7 typescriptFlag: 2_7 - - flavor: 5 + - flavor: 6 node: 13 nodeFlag: 13 typescript: next typescriptFlag: next - - flavor: 6 + - flavor: 7 node: 14 nodeFlag: 14 typescript: latest typescriptFlag: latest - - flavor: 7 + - flavor: 8 node: 14 nodeFlag: 14 typescript: 2.7 typescriptFlag: 2_7 - - flavor: 8 + - flavor: 9 node: 14 nodeFlag: 14 typescript: next diff --git a/dist-raw/README.md b/dist-raw/README.md new file mode 100644 index 000000000..b7b4c4d7d --- /dev/null +++ b/dist-raw/README.md @@ -0,0 +1,13 @@ +The `dist-raw` directory contains JS sources that are distributed verbatim, not compiled nor typechecked via TS. + +To implement ESM support, we unfortunately must duplicate some of node's built-in functionality that is not +exposed via an API. We have copy-pasted the necessary code from https://github.com/nodejs/node/tree/master/lib +then modified it to suite our needs. + +Formatting may be intentionally bad to keep the diff as small as possible, to make it easier to merge +upstream changes and understand our modifications. For example, when we need to wrap node's source code +in a factory function, we will not indent the function body, to avoid whitespace changes in the diff. + +One obvious problem with this approach: the code has been pulled from one version of node, whereas users of ts-node +run multiple versions of node. +Users running node 12 may see that ts-node behaves like node 14, for example. diff --git a/dist-raw/node-cjs-loader-utils.js b/dist-raw/node-cjs-loader-utils.js new file mode 100644 index 000000000..0c5fabf9c --- /dev/null +++ b/dist-raw/node-cjs-loader-utils.js @@ -0,0 +1,136 @@ +// Copied from several files in node's source code. +// https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js +// Each function and variable below must have a comment linking to the source in node's github repo. + +const path = require('path'); +const fs = require('fs'); + +module.exports.assertScriptCanLoadAsCJSImpl = assertScriptCanLoadAsCJSImpl; + +// copied from Module._extensions['.js'] +// https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L1211-L1217 +function assertScriptCanLoadAsCJSImpl(filename) { + const pkg = readPackageScope(filename); + // Function require shouldn't be used in ES modules. + if (pkg && pkg.data && pkg.data.type === 'module') { + const parentPath = module.parent && module.parent.filename; + const packageJsonPath = path.resolve(pkg.path, 'package.json'); + throw createErrRequireEsm(filename, parentPath, packageJsonPath); + } +} + +// Copied from https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L285-L301 +function readPackageScope(checkPath) { + const rootSeparatorIndex = checkPath.indexOf(path.sep); + let separatorIndex; + while ( + (separatorIndex = checkPath.lastIndexOf(path.sep)) > rootSeparatorIndex + ) { + checkPath = checkPath.slice(0, separatorIndex); + if (checkPath.endsWith(path.sep + 'node_modules')) + return false; + const pjson = readPackage(checkPath); + if (pjson) return { + path: checkPath, + data: pjson + }; + } + return false; +} + +// Copied from https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L249 +const packageJsonCache = new Map(); + +// Copied from https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L251-L283 +function readPackage(requestPath) { + const jsonPath = path.resolve(requestPath, 'package.json'); + + const existing = packageJsonCache.get(jsonPath); + if (existing !== undefined) return existing; + + const json = internalModuleReadJSON(path.toNamespacedPath(jsonPath)); + if (json === undefined) { + packageJsonCache.set(jsonPath, false); + return false; + } + + // TODO Related to `--experimental-policy`? Disabling for now + // if (manifest) { + // const jsonURL = pathToFileURL(jsonPath); + // manifest.assertIntegrity(jsonURL, json); + // } + + try { + const parsed = JSON.parse(json); + const filtered = { + name: parsed.name, + main: parsed.main, + exports: parsed.exports, + type: parsed.type + }; + packageJsonCache.set(jsonPath, filtered); + return filtered; + } catch (e) { + e.path = jsonPath; + e.message = 'Error parsing ' + jsonPath + ': ' + e.message; + throw e; + } +} + +// In node's core, this is implemented in C +// https://github.com/nodejs/node/blob/e9f293750760d59243020d0376edf242c9a26b67/src/node_file.cc#L845-L939 +function internalModuleReadJSON(path) { + try { + return fs.readFileSync(path, 'utf8') + } catch (e) { + if (e.code === 'ENOENT') return undefined + throw e + } +} + +// Native ERR_REQUIRE_ESM Error is declared here: +// https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/errors.js#L1294-L1313 +// Error class factory is implemented here: +// function E: https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/errors.js#L323-L341 +// function makeNodeErrorWithCode: https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/errors.js#L251-L278 +// The code below should create an error that matches the native error as closely as possible. +// Third-party libraries which attempt to catch the native ERR_REQUIRE_ESM should recognize our imitation error. +function createErrRequireEsm(filename, parentPath, packageJsonPath) { + const code = 'ERR_REQUIRE_ESM' + const err = new Error(getMessage(filename, parentPath, packageJsonPath)) + // Set `name` to be used in stack trace, generate stack trace with that name baked in, then re-declare the `name` field. + // This trick is copied from node's source. + err.name = `Error [${ code }]` + err.stack + Object.defineProperty(err, 'name', { + value: 'Error', + enumerable: false, + writable: true, + configurable: true + }) + err.code = code + return err + + // Copy-pasted from https://github.com/nodejs/node/blob/b533fb3508009e5f567cc776daba8fbf665386a6/lib/internal/errors.js#L1293-L1311 + // so that our error message is identical to the native message. + function getMessage(filename, parentPath = null, packageJsonPath = null) { + const ext = path.extname(filename) + let msg = `Must use import to load ES Module: ${filename}`; + if (parentPath && packageJsonPath) { + const path = require('path'); + const basename = path.basename(filename) === path.basename(parentPath) ? + filename : path.basename(filename); + msg += + '\nrequire() of ES modules is not supported.\nrequire() of ' + + `${filename} ${parentPath ? `from ${parentPath} ` : ''}` + + `is an ES module file as it is a ${ext} file whose nearest parent ` + + `package.json contains "type": "module" which defines all ${ext} ` + + 'files in that package scope as ES modules.\nInstead ' + + 'change the requiring code to use ' + + 'import(), or remove "type": "module" from ' + + `${packageJsonPath}.\n`; + return msg; + } + return msg; + } +} diff --git a/src/esm.ts b/src/esm.ts index 53adfc8a1..ae08ada32 100644 --- a/src/esm.ts +++ b/src/esm.ts @@ -8,7 +8,10 @@ const { createResolve } = require('../dist-raw/node-esm-resolve-implementation') export function registerAndCreateEsmHooks (opts?: RegisterOptions) { // Automatically performs registration just like `-r ts-node/register` - const tsNodeInstance = register(opts) + const tsNodeInstance = register({ + ...opts, + experimentalEsmLoader: true + }) // Custom implementation that considers additional file extensions and automatically adds file extensions const nodeResolveImplementation = createResolve({ diff --git a/src/index.spec.ts b/src/index.spec.ts index d77970385..7e257a2fd 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -680,12 +680,12 @@ describe('ts-node', function () { }) }) - if (semver.gte(process.version, '13.0.0')) { - describe('esm', () => { - this.slow(1000) + describe('esm', () => { + this.slow(1000) - const cmd = `node --loader ../../esm.mjs` + const cmd = `node --loader ts-node/esm.mjs` + if (semver.gte(process.version, '13.0.0')) { it('should compile and execute as ESM', (done) => { exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { expect(err).to.equal(null) @@ -703,6 +703,23 @@ describe('ts-node', function () { }) }) + it('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', function (done) { + exec(`${cmd} ./index.js`, { cwd: join(__dirname, '../tests/esm-err-require-esm') }, function (err, stdout, stderr) { + expect(err).to.not.equal(null) + expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') + + return done() + }) + }) + } + + it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', function (done) { + exec(`${BIN_PATH} ./tests/esm-err-require-esm/index.js`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('CommonJS\n') + + return done() + }) }) - } + }) }) diff --git a/src/index.ts b/src/index.ts index 0ac879fd2..ad8d250f5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,25 @@ import { BaseError } from 'make-error' import * as util from 'util' import * as _ts from 'typescript' +/** + * Does this version of node obey the package.json "type" field + * and throw ERR_REQUIRE_ESM when attempting to require() an ESM modules. + */ +const engineSupportsPackageTypeField = parseInt(process.versions.node.split('.')[0], 10) >= 12 + +// Loaded conditionally so we don't need to support older node versions +let assertScriptCanLoadAsCJSImpl: ((filename: string) => void) | undefined + +/** + * Assert that script can be loaded as CommonJS when we attempt to require it. + * If it should be loaded as ESM, throw ERR_REQUIRE_ESM like node does. + */ +function assertScriptCanLoadAsCJS (filename: string) { + if (!engineSupportsPackageTypeField) return + if (!assertScriptCanLoadAsCJSImpl) assertScriptCanLoadAsCJSImpl = require('../dist-raw/node-cjs-loader-utils').assertScriptCanLoadAsCJSImpl + assertScriptCanLoadAsCJSImpl!(filename) +} + /** * Registered `ts-node` instance information. */ @@ -179,6 +198,12 @@ export interface CreateOptions { readFile?: (path: string) => string | undefined fileExists?: (path: string) => boolean transformers?: _ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers) + /** + * True if require() hooks should interop with experimental ESM loader. + * Enabled explicitly via a flag since it is a breaking change. + * @internal + */ + experimentalEsmLoader?: boolean } /** @@ -247,7 +272,8 @@ export const DEFAULTS: RegisterOptions = { transpileOnly: yn(process.env.TS_NODE_TRANSPILE_ONLY), typeCheck: yn(process.env.TS_NODE_TYPE_CHECK), compilerHost: yn(process.env.TS_NODE_COMPILER_HOST), - logError: yn(process.env.TS_NODE_LOG_ERROR) + logError: yn(process.env.TS_NODE_LOG_ERROR), + experimentalEsmLoader: false } /** @@ -770,9 +796,6 @@ export function create (rawOptions: CreateOptions = {}): Register { } } - const cannotCompileViaBothCodepathsErrorMessage = 'Cannot compile the same file via both `require()` and ESM hooks codepaths. ' + - 'This breaks source-map-support, which cannot tell the difference between the two sourcemaps. ' + - 'To avoid this problem, load each .ts file as only ESM or only CommonJS.' // Create a simple TypeScript compiler proxy. function compile (code: string, fileName: string, lineOffset = 0) { const normalizedFileName = normalizeSlashes(fileName) @@ -854,6 +877,10 @@ function registerExtension ( require.extensions[ext] = function (m: any, filename) { // tslint:disable-line if (register.ignored(filename)) return old(m, filename) + if (register.options.experimentalEsmLoader) { + assertScriptCanLoadAsCJS(filename) + } + const _compile = m._compile m._compile = function (code: string, fileName: string) { diff --git a/tests/esm-err-require-esm/esm-package/loaded-as.ts b/tests/esm-err-require-esm/esm-package/loaded-as.ts new file mode 100644 index 000000000..df054c0bc --- /dev/null +++ b/tests/esm-err-require-esm/esm-package/loaded-as.ts @@ -0,0 +1,5 @@ +// Log if this file is loaded as ESM or CommonJS +if(typeof module !== 'undefined') + console.log('CommonJS') +else + console.log('ESM') diff --git a/tests/esm-err-require-esm/esm-package/package.json b/tests/esm-err-require-esm/esm-package/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/esm-err-require-esm/esm-package/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/esm-err-require-esm/index.js b/tests/esm-err-require-esm/index.js new file mode 100644 index 000000000..b2bf5a5fc --- /dev/null +++ b/tests/esm-err-require-esm/index.js @@ -0,0 +1 @@ +require('./esm-package/loaded-as') From e567002325c71012ec29b8af55c8ce0ed3d0f23f Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 23 May 2020 00:20:38 -0400 Subject: [PATCH 043/113] Re-add "exports" declaration to package.json in backwards-compatible way (#1028) * Re-add "exports" declaration to package.json in backwards-compatible way * add package.json "exports" tests * more * fix * fix * fix * tweak test to check esm loader entrypoint * narrow list of exported files * Update index.spec.ts --- package.json | 17 ++++++++++++++ src/index.spec.ts | 57 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index fb0138c9c..e458b78e8 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,23 @@ "version": "8.10.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", + "exports": { + ".": "./dist/index.js", + "./package": "./package.json", + "./package.json": "./package.json", + "./dist/bin": "./dist/bin.js", + "./dist/bin.js": "./dist/bin.js", + "./dist/bin-transpile": "./dist/bin-transpile.js", + "./dist/bin-transpile.js": "./dist/bin-transpile.js", + "./dist/bin-script": "./dist/bin-script.js", + "./dist/bin-script.js": "./dist/bin-script.js", + "./register": "./register/index.js", + "./register/files": "./register/files.js", + "./register/transpile-only": "./register/transpile-only.js", + "./register/type-check": "./register/type-check.js", + "./esm": "./esm.mjs", + "./esm.mjs": "./esm.mjs" + }, "types": "dist/index.d.ts", "bin": { "ts-node": "dist/bin.js", diff --git a/src/index.spec.ts b/src/index.spec.ts index 7e257a2fd..1ed62bd7d 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -4,10 +4,12 @@ import { join } from 'path' import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') -import { register, create, VERSION } from './index' +import type * as tsNodeTypes from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' +import { createRequire, createRequireFromPath } from 'module' +import Module = require('module') const execP = promisify(exec) @@ -18,6 +20,12 @@ const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ +// `createRequire` does not exist on older node versions +const testsDirRequire = (createRequire || createRequireFromPath)(join(TEST_DIR, 'index.js')) // tslint:disable-line + +// Set after ts-node is installed locally +let { register, create, VERSION }: typeof tsNodeTypes = {} as any + // Pack and install ts-node locally, necessary to test package "exports" before(async function () { this.timeout(30000) @@ -25,6 +33,7 @@ before(async function () { await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) + ;({ register, create, VERSION } = testsDirRequire('ts-node')) }) describe('ts-node', function () { @@ -35,6 +44,34 @@ describe('ts-node', function () { it('should export the correct version', function () { expect(VERSION).to.equal(require('../package.json').version) }) + it('should export all CJS entrypoints', function () { + // Ensure our package.json "exports" declaration allows `require()`ing all our entrypoints + // https://github.com/TypeStrong/ts-node/pull/1026 + + testsDirRequire.resolve('ts-node') + + // only reliably way to ask node for the root path of a dependency is Path.resolve(require.resolve('ts-node/package'), '..') + testsDirRequire.resolve('ts-node/package') + testsDirRequire.resolve('ts-node/package.json') + + // All bin entrypoints for people who need to augment our CLI: `node -r otherstuff ./node_modules/ts-node/dist/bin` + testsDirRequire.resolve('ts-node/dist/bin') + testsDirRequire.resolve('ts-node/dist/bin.js') + testsDirRequire.resolve('ts-node/dist/bin-transpile') + testsDirRequire.resolve('ts-node/dist/bin-transpile.js') + testsDirRequire.resolve('ts-node/dist/bin-script') + testsDirRequire.resolve('ts-node/dist/bin-script.js') + + // Must be `require()`able obviously + testsDirRequire.resolve('ts-node/register') + testsDirRequire.resolve('ts-node/register/files') + testsDirRequire.resolve('ts-node/register/transpile-only') + testsDirRequire.resolve('ts-node/register/type-check') + + // `node --loader ts-node/esm` + testsDirRequire.resolve('ts-node/esm') + testsDirRequire.resolve('ts-node/esm.mjs') + }) describe('cli', function () { this.slow(1000) @@ -523,11 +560,14 @@ describe('ts-node', function () { }) describe('register', function () { - const registered = register({ - project: PROJECT, - compilerOptions: { - jsx: 'preserve' - } + let registered: tsNodeTypes.Register + before(() => { + registered = register({ + project: PROJECT, + compilerOptions: { + jsx: 'preserve' + } + }) }) const moduleTestPath = require.resolve('../tests/module') @@ -637,10 +677,11 @@ describe('ts-node', function () { }) describe('JSX preserve', () => { - let old = require.extensions['.tsx'] // tslint:disable-line + let old: (m: Module, filename: string) => any let compiled: string before(function () { + old = require.extensions['.tsx']! // tslint:disable-line require.extensions['.tsx'] = (m: any, fileName) => { // tslint:disable-line const _compile = m._compile @@ -649,7 +690,7 @@ describe('ts-node', function () { return _compile.call(this, code, fileName) } - return old!(m, fileName) + return old(m, fileName) } }) From 1f5b1e0d003ea30cfdbff01c2e4400d395109eca Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Tue, 26 May 2020 03:39:30 +0530 Subject: [PATCH 044/113] fix: pass transformers object to ts.transpileModule method (Fixes #1051) (#1054) * fix: pass transformers object to ts.transpileModule method * refactor: move typeof factory check to its original position --- src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index ad8d250f5..547483fde 100644 --- a/src/index.ts +++ b/src/index.ts @@ -491,7 +491,8 @@ export function create (rawOptions: CreateOptions = {}): Register { const result = ts.transpileModule(code, { fileName, compilerOptions: overrideCompilerOptions ? { ...config.options, ...overrideCompilerOptions } : config.options, - reportDiagnostics: true + reportDiagnostics: true, + transformers: transformers as Exclude }) const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) From 866bce6a175ec124fe62f269b22e91c92b40f875 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 25 May 2020 18:37:24 -0400 Subject: [PATCH 045/113] move getOutputTranspileOnly back where it used to be (#1056) * move getOutputTranspileOnly back where it used to be * fix * remove overrideCompilerOptions argument --- src/index.ts | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/index.ts b/src/index.ts index 547483fde..2b7513f2d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -487,20 +487,6 @@ export function create (rawOptions: CreateOptions = {}): Register { let getOutput: (code: string, fileName: string) => SourceOutput let getTypeInfo: (_code: string, _fileName: string, _position: number) => TypeInfo - const getOutputTranspileOnly = (code: string, fileName: string, overrideCompilerOptions?: Partial<_ts.CompilerOptions>): SourceOutput => { - const result = ts.transpileModule(code, { - fileName, - compilerOptions: overrideCompilerOptions ? { ...config.options, ...overrideCompilerOptions } : config.options, - reportDiagnostics: true, - transformers: transformers as Exclude - }) - - const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) - if (diagnosticList.length) reportTSError(diagnosticList) - - return [result.outputText, result.sourceMapText as string] - } - // Use full language services when the fast option is disabled. if (!transpileOnly) { const fileContents = new Map() @@ -790,7 +776,19 @@ export function create (rawOptions: CreateOptions = {}): Register { throw new TypeError('Transformers function is unavailable in "--transpile-only"') } - getOutput = getOutputTranspileOnly + getOutput = (code: string, fileName: string): SourceOutput => { + const result = ts.transpileModule(code, { + fileName, + compilerOptions: config.options, + reportDiagnostics: true, + transformers: transformers + }) + + const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) + if (diagnosticList.length) reportTSError(diagnosticList) + + return [result.outputText, result.sourceMapText as string] + } getTypeInfo = () => { throw new TypeError('Type information is unavailable in "--transpile-only"') From cc364bff95486a2dbeb8b8ae68eaaa5f4df8de8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2020 21:12:44 -0700 Subject: [PATCH 046/113] Bump lodash from 4.17.15 to 4.17.19 (#1077) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d331b7fe..7dd6f696f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1353,9 +1353,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash.flattendeep": { From b3f84bc6535c8b284458b85d038e27a6d40511ee Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 28 Jul 2020 21:39:13 -0400 Subject: [PATCH 047/113] ignore vscode config files (#1084) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9b3c84d16..54fca00d2 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ dist/ tsconfig.schema.json tsconfig.schemastore-schema.json .idea/ +/.vscode/ From 04e789693768dad32c3cd3396fb2a6077b4a76db Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 29 Jul 2020 03:07:32 -0400 Subject: [PATCH 048/113] enable test for react tsx sourcemaps (#1088) --- src/index.spec.ts | 13 +++-- tests/throw-react-tsx.tsx | 106 ++++++++++++++++++++++++++++++++++++++ tests/throw.ts | 1 + 3 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 tests/throw-react-tsx.tsx diff --git a/src/index.spec.ts b/src/index.spec.ts index 1ed62bd7d..05497fb6f 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -344,10 +344,15 @@ describe('ts-node', function () { }) }) - it.skip('should use source maps with react tsx', function (done) { - exec(`${cmd} -r ./tests/emit-compiled.ts tests/jsx-react.tsx`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('todo') + it('should use source maps with react tsx', function (done) { + exec(`${cmd} tests/throw-react-tsx.tsx`, function (err, stdout) { + expect(err).not.to.equal(null) + expect(err!.message).to.contain([ + `${join(__dirname, '../tests/throw-react-tsx.tsx')}:100`, + ' bar () { throw new Error(\'this is a demo\') }', + ' ^', + 'Error: this is a demo' + ].join('\n')) return done() }) diff --git a/tests/throw-react-tsx.tsx b/tests/throw-react-tsx.tsx new file mode 100644 index 000000000..88886824f --- /dev/null +++ b/tests/throw-react-tsx.tsx @@ -0,0 +1,106 @@ +// intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. +// 100 lines is meant to be far more space than the helper functions would take. +const React = {createElement: (...args: any[]) => null} +class Foo { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + constructor () { this.bar() } + bar () { throw new Error('this is a demo') } + someJsx() { + return
+ } +} +new Foo() +export {} diff --git a/tests/throw.ts b/tests/throw.ts index dbd4cbc2e..85ba6da48 100644 --- a/tests/throw.ts +++ b/tests/throw.ts @@ -100,3 +100,4 @@ class Foo { bar () { throw new Error('this is a demo') } } new Foo() +export {} From 54d1bfa24a2723f7c1c2a3131ad556813d05cb22 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 29 Jul 2020 03:54:52 -0400 Subject: [PATCH 049/113] Fix #1060 (#1087) * Fix #1060 * fix linter failures * fix lint failure * fix test coverage * fix tests on windows * generous timeout for npm install before() hook hopefully to avoid CI timeouts --- src/index.spec.ts | 18 +++++++- src/index.ts | 15 ++++++- tests/esm/throw.ts | 103 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 tests/esm/throw.ts diff --git a/src/index.spec.ts b/src/index.spec.ts index 05497fb6f..1b7d12324 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -9,6 +9,7 @@ import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' import { createRequire, createRequireFromPath } from 'module' +import { pathToFileURL } from 'url' import Module = require('module') const execP = promisify(exec) @@ -28,7 +29,7 @@ let { register, create, VERSION }: typeof tsNodeTypes = {} as any // Pack and install ts-node locally, necessary to test package "exports" before(async function () { - this.timeout(30000) + this.timeout(5 * 60e3) rimrafSync(join(TEST_DIR, 'node_modules')) await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') @@ -729,7 +730,7 @@ describe('ts-node', function () { describe('esm', () => { this.slow(1000) - const cmd = `node --loader ts-node/esm.mjs` + const cmd = `node --loader ts-node/esm` if (semver.gte(process.version, '13.0.0')) { it('should compile and execute as ESM', (done) => { @@ -740,6 +741,19 @@ describe('ts-node', function () { return done() }) }) + it('should use source maps', function (done) { + exec(`${cmd} throw.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { + expect(err).not.to.equal(null) + expect(err!.message).to.contain([ + `${pathToFileURL(join(__dirname, '../tests/esm/throw.ts'))}:100`, + ' bar () { throw new Error(\'this is a demo\') }', + ' ^', + 'Error: this is a demo' + ].join('\n')) + + return done() + }) + }) it('supports --experimental-specifier-resolution=node', (done) => { exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { expect(err).to.equal(null) diff --git a/src/index.ts b/src/index.ts index 2b7513f2d..c1a6215f5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import sourceMapSupport = require('source-map-support') import * as ynModule from 'yn' import { BaseError } from 'make-error' import * as util from 'util' +import { fileURLToPath } from 'url' import * as _ts from 'typescript' /** @@ -445,8 +446,18 @@ export function create (rawOptions: CreateOptions = {}): Register { // Install source map support and read from memory cache. sourceMapSupport.install({ environment: 'node', - retrieveFile (path: string) { - return outputCache.get(normalizeSlashes(path))?.content || '' + retrieveFile (pathOrUrl: string) { + let path = pathOrUrl + // If it's a file URL, convert to local path + // Note: fileURLToPath does not exist on early node v10 + // I could not find a way to handle non-URLs except to swallow an error + if (options.experimentalEsmLoader && path.startsWith('file://')) { + try { + path = fileURLToPath(path) + } catch (e) {/* swallow error */} + } + path = normalizeSlashes(path) + return outputCache.get(path)?.content || '' } }) diff --git a/tests/esm/throw.ts b/tests/esm/throw.ts new file mode 100644 index 000000000..85ba6da48 --- /dev/null +++ b/tests/esm/throw.ts @@ -0,0 +1,103 @@ +// intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. +// 100 lines is meant to be far more space than the helper functions would take. +class Foo { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + constructor () { this.bar() } + bar () { throw new Error('this is a demo') } +} +new Foo() +export {} From f03f09dd040f850cb80c16c6507b1a5ba30eb4a5 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 29 Jul 2020 15:04:15 -0400 Subject: [PATCH 050/113] fix #1075 (#1086) * fix #1075 * Update README.md * Update README.md * Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2bf4d7174..282fdf13b 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,11 @@ Any error that is not a `TSError` is from node.js (e.g. `SyntaxError`), and cann ### Import Statements -Current node.js stable releases do not support ES modules. Additionally, `ts-node` does not have the required hooks into node.js to support ES modules. You will need to set `"module": "commonjs"` in your `tsconfig.json` for your code to work. +There are two options when using `import` statements: compile them to CommonJS or use node's native ESM support. + +To compile to CommonJS, you must set `"module": "CommonJS"` in your `tsconfig.json` or compiler options. + +Node's native ESM support is currently experimental and so is `ts-node`'s ESM loader hook. For usage, limitations, and to provide feedback, see [#1007](https://github.com/TypeStrong/ts-node/issues/1007). ## Help! My Types Are Missing! From 436e3a809585dd445deea40d09d65a59e5aa5644 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Thu, 30 Jul 2020 12:47:49 -0400 Subject: [PATCH 051/113] Allow specifying "require" option via tsconfig (#925) --- dist-raw/node-createrequire.js | 29 ++++++++++++++ src/bin.ts | 6 +-- src/index.spec.ts | 16 +++++--- src/index.ts | 38 ++++++++++++++++++- .../{log-options.js => log-options1.js} | 1 + tests/tsconfig-options/log-options2.js | 3 ++ tests/tsconfig-options/required1.js | 1 + tests/tsconfig-options/required2.js | 2 + tests/tsconfig-options/tsconfig.json | 1 + 9 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 dist-raw/node-createrequire.js rename tests/tsconfig-options/{log-options.js => log-options1.js} (87%) create mode 100644 tests/tsconfig-options/log-options2.js create mode 100644 tests/tsconfig-options/required1.js create mode 100644 tests/tsconfig-options/required2.js diff --git a/dist-raw/node-createrequire.js b/dist-raw/node-createrequire.js new file mode 100644 index 000000000..649deb10d --- /dev/null +++ b/dist-raw/node-createrequire.js @@ -0,0 +1,29 @@ +// Extracted from https://github.com/nodejs/node/blob/ec2ffd6b9d255e19818b6949d2f7dc7ac70faee9/lib/internal/modules/cjs/loader.js +// then modified to suit our needs + +const path = require('path'); +const Module = require('module'); + +exports.createRequireFromPath = createRequireFromPath; + +function createRequireFromPath(filename) { + // Allow a directory to be passed as the filename + const trailingSlash = + filename.endsWith('/') || (isWindows && filename.endsWith('\\')); + + const proxyPath = trailingSlash ? + path.join(filename, 'noop.js') : + filename; + + const m = new Module(proxyPath); + m.filename = proxyPath; + + m.paths = Module._nodeModulePaths(m.path); + return makeRequireFunction(m, proxyPath); +} + +// This trick is much smaller than copy-pasting from https://github.com/nodejs/node/blob/ec2ffd6b9d255e19818b6949d2f7dc7ac70faee9/lib/internal/modules/cjs/helpers.js#L32-L101 +function makeRequireFunction(module, filename) { + module._compile('module.exports = require;', filename) + return mod.exports +} diff --git a/src/bin.ts b/src/bin.ts index 001e1f483..ee3380ffc 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -90,7 +90,7 @@ export function main (argv: string[]) { '--help': help = false, '--script-mode': scriptMode = false, '--version': version = 0, - '--require': requires = [], + '--require': argsRequire = [], '--eval': code = undefined, '--print': print = false, '--interactive': interactive = false, @@ -176,6 +176,7 @@ export function main (argv: string[]) { compiler, ignoreDiagnostics, compilerOptions, + require: argsRequire, readFile: code !== undefined ? (path: string) => { if (path === state.path) return state.input @@ -212,9 +213,6 @@ export function main (argv: string[]) { module.filename = state.path module.paths = (Module as any)._nodeModulePaths(cwd) - // Require specified modules before start-up. - ;(Module as any)._preloadModules(requires) - // Prepend `ts-node` arguments to CLI for child processes. process.execArgv.unshift(__filename, ...process.argv.slice(2, process.argv.length - args._.length)) process.argv = [process.argv[1]].concat(scriptPath || []).concat(args._.slice(1)) diff --git a/src/index.spec.ts b/src/index.spec.ts index 1b7d12324..3e64030ae 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -477,7 +477,7 @@ describe('ts-node', function () { const BIN_EXEC = `"${BIN_PATH}" --project tests/tsconfig-options/tsconfig.json` it('should override compiler options from env', function (done) { - exec(`${BIN_EXEC} tests/tsconfig-options/log-options.js`, { + exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_COMPILER_OPTIONS: '{"typeRoots": ["env-typeroots"]}' @@ -491,7 +491,7 @@ describe('ts-node', function () { }) it('should use options from `tsconfig.json`', function (done) { - exec(`${BIN_EXEC} tests/tsconfig-options/log-options.js`, function (err, stdout) { + exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) @@ -499,12 +499,13 @@ describe('ts-node', function () { expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(false) expect(options.transpileOnly).to.equal(true) + expect(options.require).to.deep.equal([join(__dirname, '../tests/tsconfig-options/required1.js')]) return done() }) }) - it('should have flags override `tsconfig.json`', function (done) { - exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" tests/tsconfig-options/log-options.js`, function (err, stdout) { + it('should have flags override / merge with `tsconfig.json`', function (done) { + exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tests/tsconfig-options/required2.js tests/tsconfig-options/log-options2.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) @@ -512,12 +513,16 @@ describe('ts-node', function () { expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(true) expect(options.transpileOnly).to.equal(true) + expect(options.require).to.deep.equal([ + join(__dirname, '../tests/tsconfig-options/required1.js'), + './tests/tsconfig-options/required2.js' + ]) return done() }) }) it('should have `tsconfig.json` override environment', function (done) { - exec(`${BIN_EXEC} tests/tsconfig-options/log-options.js`, { + exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_PRETTY: 'true', @@ -531,6 +536,7 @@ describe('ts-node', function () { expect(options.pretty).to.equal(true) expect(options.skipIgnore).to.equal(false) expect(options.transpileOnly).to.equal(true) + expect(options.require).to.deep.equal([join(__dirname, '../tests/tsconfig-options/required1.js')]) return done() }) }) diff --git a/src/index.ts b/src/index.ts index c1a6215f5..5aa2ea23b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,7 @@ import { BaseError } from 'make-error' import * as util from 'util' import { fileURLToPath } from 'url' import * as _ts from 'typescript' +import * as Module from 'module' /** * Does this version of node obey the package.json "type" field @@ -196,6 +197,15 @@ export interface CreateOptions { * Ignore TypeScript warnings by diagnostic code. */ ignoreDiagnostics?: Array + /** + * Modules to require, like node's `--require` flag. + * + * If specified in tsconfig.json, the modules will be resolved relative to the tsconfig.json file. + * + * If specified programmatically, each input string should be pre-resolved to an absolute path for + * best results. + */ + require?: Array readFile?: (path: string) => string | undefined fileExists?: (path: string) => boolean transformers?: _ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers) @@ -229,7 +239,7 @@ export interface TsConfigOptions extends Omit { } + > {} /** * Like `Object.assign`, but ignores `undefined` properties. @@ -383,6 +393,9 @@ export function register (opts: RegisterOptions = {}): Register { // Register the extensions. registerExtensions(service.options.preferTsExts, extensions, service, originalJsHandler) + // Require specified modules before start-up. + ;(Module as any)._preloadModules(service.options.require) + return service } @@ -409,7 +422,11 @@ export function create (rawOptions: CreateOptions = {}): Register { // Read config file and merge new options between env and CLI options. const { config, options: tsconfigOptions } = readConfig(cwd, ts, rawOptions) - const options = assign({}, DEFAULTS, tsconfigOptions || {}, rawOptions) + const options = assign({}, DEFAULTS, tsconfigOptions || {}, rawOptions) + options.require = [ + ...tsconfigOptions.require || [], + ...rawOptions.require || [] + ] // If `compiler` option changed based on tsconfig, re-load the compiler. if (options.compiler !== compilerName) { @@ -1002,6 +1019,14 @@ function readConfig ( useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames }, basePath, undefined, configFileName)) + if (tsconfigOptions.require) { + // Modules are found relative to the tsconfig file, not the `dir` option + const tsconfigRelativeRequire = createRequire(configFileName!) + tsconfigOptions.require = tsconfigOptions.require.map((path: string) => { + return tsconfigRelativeRequire.resolve(path) + }) + } + return { config: fixedConfig, options: tsconfigOptions } } @@ -1062,3 +1087,12 @@ function getTokenAtPosition (ts: typeof _ts, sourceFile: _ts.SourceFile, positio return current } } + +let nodeCreateRequire: (path: string) => NodeRequire +function createRequire (filename: string) { + if (!nodeCreateRequire) { + // tslint:disable-next-line + nodeCreateRequire = Module.createRequire || Module.createRequireFromPath || require('../dist-raw/node-createrequire').createRequireFromPath + } + return nodeCreateRequire(filename) +} diff --git a/tests/tsconfig-options/log-options.js b/tests/tsconfig-options/log-options1.js similarity index 87% rename from tests/tsconfig-options/log-options.js rename to tests/tsconfig-options/log-options1.js index 8a5a76de8..59bc33323 100644 --- a/tests/tsconfig-options/log-options.js +++ b/tests/tsconfig-options/log-options1.js @@ -1,4 +1,5 @@ const assert = require('assert') +assert(process.required1) const register = process[Symbol.for('ts-node.register.instance')] console.log(JSON.stringify({ options: register.options, diff --git a/tests/tsconfig-options/log-options2.js b/tests/tsconfig-options/log-options2.js new file mode 100644 index 000000000..30f402d16 --- /dev/null +++ b/tests/tsconfig-options/log-options2.js @@ -0,0 +1,3 @@ +const assert = require('assert') +require('./log-options1') +assert(process.required2) diff --git a/tests/tsconfig-options/required1.js b/tests/tsconfig-options/required1.js new file mode 100644 index 000000000..8f3ac408f --- /dev/null +++ b/tests/tsconfig-options/required1.js @@ -0,0 +1 @@ +process.required1 = true diff --git a/tests/tsconfig-options/required2.js b/tests/tsconfig-options/required2.js new file mode 100644 index 000000000..69a3ba618 --- /dev/null +++ b/tests/tsconfig-options/required2.js @@ -0,0 +1,2 @@ +require('assert')(process.required1) +process.required2 = true diff --git a/tests/tsconfig-options/tsconfig.json b/tests/tsconfig-options/tsconfig.json index 6efea1e6f..3f248317e 100644 --- a/tests/tsconfig-options/tsconfig.json +++ b/tests/tsconfig-options/tsconfig.json @@ -5,6 +5,7 @@ "types": ["tsconfig-tsnode-types"] }, "transpileOnly": true, + "require": ["./required1"], "skipIgnore": false }, "compilerOptions": { From 8dfb75cfe811b8741218c19f56bd9ff5d1425daa Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 4 Aug 2020 17:57:32 -0400 Subject: [PATCH 052/113] NODE_NO_READLINE support (#1090) * NODE_NO_READLINE support https://nodejs.org/api/repl.html#repl_using_the_node_js_repl_with_advanced_line_editors * Update bin.ts * Update bin.ts * Update bin.ts * Update bin.ts --- src/bin.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin.ts b/src/bin.ts index ee3380ffc..13c19c38a 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -363,7 +363,8 @@ function startRepl (service: Register, state: EvalState, code?: string) { prompt: '> ', input: process.stdin, output: process.stdout, - terminal: process.stdout.isTTY, + // Mimicking node's REPL implementation: https://github.com/nodejs/node/blob/168b22ba073ee1cbf8d0bcb4ded7ff3099335d04/lib/internal/repl.js#L28-L30 + terminal: process.stdout.isTTY && !parseInt(process.env.NODE_NO_READLINE!, 10), eval: replEval, useGlobal: true }) From 490ed8ae1735659a840fb5f51fc57a6340dd1613 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 4 Aug 2020 18:40:11 -0400 Subject: [PATCH 053/113] Fix #1072 (#1085) * Fix #1072 * add tests --- dist-raw/node-esm-resolve-implementation.js | 32 +------- dist-raw/node-options.js | 83 +++++++++++++++++++++ src/index.spec.ts | 25 +++++++ 3 files changed, 109 insertions(+), 31 deletions(-) create mode 100644 dist-raw/node-options.js diff --git a/dist-raw/node-esm-resolve-implementation.js b/dist-raw/node-esm-resolve-implementation.js index 1a5846673..a3da2f9a0 100644 --- a/dist-raw/node-esm-resolve-implementation.js +++ b/dist-raw/node-esm-resolve-implementation.js @@ -50,37 +50,7 @@ const { Stats, } = require('fs'); // const { getOptionValue } = require('internal/options'); -const { getOptionValue } = (() => { - let options; - function parseOptions() { - if (!options) { - options = { - '--preserve-symlinks': false, - '--preserve-symlinks-main': false, - '--input-type': undefined, - '--experimental-specifier-resolution': 'explicit', - ...parseExecArgv() - } - } - }; - function parseExecArgv () { - return require('arg')({ - '--preserve-symlinks': Boolean, - '--preserve-symlinks-main': Boolean, - '--input-type': String, - '--experimental-specifier-resolution': String - }, { - argv: process.execArgv, - permissive: true - }); - } - return { - getOptionValue: (opt) => { - parseOptions(); - return options[opt]; - } - }; -})(); +const { getOptionValue } = require('./node-options'); const { sep } = require('path'); const preserveSymlinks = getOptionValue('--preserve-symlinks'); diff --git a/dist-raw/node-options.js b/dist-raw/node-options.js new file mode 100644 index 000000000..f27a44689 --- /dev/null +++ b/dist-raw/node-options.js @@ -0,0 +1,83 @@ +// Replacement for node's internal 'internal/options' module + +exports.getOptionValue = getOptionValue; +function getOptionValue(opt) { + parseOptions(); + return options[opt]; +} + +let options; +function parseOptions() { + if (!options) { + options = { + '--preserve-symlinks': false, + '--preserve-symlinks-main': false, + '--input-type': undefined, + '--experimental-specifier-resolution': 'explicit', + ...parseArgv(getNodeOptionsEnvArgv()), + ...parseArgv(process.execArgv) + } + } +} + +function parseArgv(argv) { + return require('arg')({ + '--preserve-symlinks': Boolean, + '--preserve-symlinks-main': Boolean, + '--input-type': String, + '--experimental-specifier-resolution': String + }, { + argv, + permissive: true + }); +} + +function getNodeOptionsEnvArgv() { + const errors = []; + const envArgv = ParseNodeOptionsEnvVar(process.env.NODE_OPTIONS || '', errors); + if (errors.length !== 0) { + // TODO: handle errors somehow + } + return envArgv; +} + +// Direct JS port of C implementation: https://github.com/nodejs/node/blob/67ba825037b4082d5d16f922fb9ce54516b4a869/src/node_options.cc#L1024-L1063 +function ParseNodeOptionsEnvVar(node_options, errors) { + const env_argv = []; + + let is_in_string = false; + let will_start_new_arg = true; + for (let index = 0; index < node_options.length; ++index) { + let c = node_options[index]; + + // Backslashes escape the following character + if (c === '\\' && is_in_string) { + if (index + 1 === node_options.length) { + errors.push("invalid value for NODE_OPTIONS " + + "(invalid escape)\n"); + return env_argv; + } else { + c = node_options[++index]; + } + } else if (c === ' ' && !is_in_string) { + will_start_new_arg = true; + continue; + } else if (c === '"') { + is_in_string = !is_in_string; + continue; + } + + if (will_start_new_arg) { + env_argv.push(c); + will_start_new_arg = false; + } else { + env_argv[env_argv.length - 1] += c; + } + } + + if (is_in_string) { + errors.push("invalid value for NODE_OPTIONS " + + "(unterminated string)\n"); + } + return env_argv; +} diff --git a/src/index.spec.ts b/src/index.spec.ts index 3e64030ae..9c0a37d34 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -767,8 +767,33 @@ describe('ts-node', function () { return done() }) + }) + + describe('supports experimental-specifier-resolution=node', () => { + it('via --experimental-specifier-resolution', (done) => { + exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff\n') + + return done() + }) + }) + it('via NODE_OPTIONS', (done) => { + exec(`${cmd} index.ts`, { + cwd: join(__dirname, '../tests/esm-node-resolver'), + env: { + ...process.env, + NODE_OPTIONS: '--experimental-specifier-resolution=node' + } + }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff\n') + return done() + }) + }) }) + it('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', function (done) { exec(`${cmd} ./index.js`, { cwd: join(__dirname, '../tests/esm-err-require-esm') }, function (err, stdout, stderr) { expect(err).to.not.equal(null) From ce7c323557c15bf878bbc4dd5b2c0aac219fca4b Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 8 Aug 2020 17:39:14 -0400 Subject: [PATCH 054/113] Add helpful links to "Create issue" page, directing people to Discord, StackOverflow, etc (#1097) * Create config.yml * Update config.yml * Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..e62997d71 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,18 @@ +--- +contact_links: + - + name: Question + about: "Please ask and answer usage questions on Stack Overflow." + url: "https://stackoverflow.com/questions/tagged/ts-node" + - + name: Chat + about: "Alternatively, you can use the TypeScript Community Discord." + url: "https://discord.gg/typescript" + - + name: "Help! My Types Are Missing!" + about: "This is likely a configuration problem. Check our README" + url: "https://github.com/TypeStrong/ts-node/blob/master/README.md#help-my-types-are-missing" + - + name: "TSError or SyntaxError" + about: "These errors come from TypeScript and node, respectively. Use StackOverflow or Discord for usage and configuration help." + url: "https://stackoverflow.com/questions/tagged/ts-node" From 145190de3606725a8e656fcc6c5e5bd45d426c53 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 11 Aug 2020 12:27:20 -0400 Subject: [PATCH 055/113] Add mocharc file (#1105) --- .mocharc.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .mocharc.js diff --git a/.mocharc.js b/.mocharc.js new file mode 100644 index 000000000..089a7cfd0 --- /dev/null +++ b/.mocharc.js @@ -0,0 +1,3 @@ +module.exports = { + spec: ['dist/**/*.spec.js'] +}; From b91aa851765687367611cb1db74ac8874e4053eb Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 11 Aug 2020 15:57:17 -0400 Subject: [PATCH 056/113] Add script for adding missing compilerOptions to tsconfig schema (#1107) --- scripts/create-merged-schema.ts | 13 ++-- ...chemastore-schema-with-compiler-options.ts | 68 +++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 scripts/update-schemastore-schema-with-compiler-options.ts diff --git a/scripts/create-merged-schema.ts b/scripts/create-merged-schema.ts index f615bb42b..3e81a1e7c 100755 --- a/scripts/create-merged-schema.ts +++ b/scripts/create-merged-schema.ts @@ -12,10 +12,7 @@ import {writeFileSync} from 'fs'; async function main() { /** schemastore definition */ - const schemastoreSchema = (await axios.get( - 'https://schemastore.azurewebsites.net/schemas/json/tsconfig.json', - { responseType: "json" } - )).data; + const schemastoreSchema = await getSchemastoreSchema(); /** ts-node schema auto-generated from ts-node source code */ const typescriptNodeSchema = require('../tsconfig.schema.json'); @@ -57,4 +54,12 @@ async function main() { ); } +async function getSchemastoreSchema() { + const {data: schemastoreSchema} = await axios.get( + 'https://schemastore.azurewebsites.net/schemas/json/tsconfig.json', + { responseType: "json" } + ); + return schemastoreSchema; +} + main(); diff --git a/scripts/update-schemastore-schema-with-compiler-options.ts b/scripts/update-schemastore-schema-with-compiler-options.ts new file mode 100644 index 000000000..c4405f39b --- /dev/null +++ b/scripts/update-schemastore-schema-with-compiler-options.ts @@ -0,0 +1,68 @@ +/* + * NOTE this script is meant to be run very rarely, + * to help patch missing compilerOptions into the tsconfig schema. + * The TS team updates it manually and sometimes forget to + * add new options to the schema. + * For example, here is the first PR I sent after running this script: + * https://github.com/SchemaStore/schemastore/pull/1168 + * + * This script adds some options that should *not* be in the schema, + * so the output requires manual review. + * There is no good, programmatic way to query the TypeScript API + * for a list of all tsconfig options. + * + * TypeScript-Website has a database of rules; maybe we can use them in the future: + * https://github.com/microsoft/TypeScript-Website/blob/v2/packages/tsconfig-reference/scripts/tsconfigRules.ts + * + * Dependencies of this script have deliberately not + * been added to package.json. You can install them locally + * only when needed to run this script. + * + * This script is not strictly related to ts-node, so + * theoretically it should be extracted to somewhere else + * in the TypeStrong org. + */ + +import {} from 'ts-expose-internals' +import * as ts from 'typescript' +import { getSchemastoreSchema } from './create-merged-schema' + +// Sometimes schemastore becomes out of date with the latest tsconfig options. +// This script + +async function main() { + const schemastoreSchema = await getSchemastoreSchema(); + const compilerOptions = schemastoreSchema.definitions.compilerOptionsDefinition.properties.compilerOptions.properties; + + // These options are only available via CLI flags, not in a tsconfig file. + const excludedOptions = [ + 'help', + 'all', + 'version', + 'init', + 'project', + 'build', + 'showConfig', + 'generateCpuProfile', // <- technically gets parsed, but doesn't seem to do anything? + 'locale', + 'out', // <-- deprecated + ]; + + ts.optionDeclarations.forEach(v => { + if(excludedOptions.includes(v.name)) return; + + if(!compilerOptions[v.name]) { + compilerOptions[v.name] = { + description: v.description?.message, + type: v.type, + }; + } + }); + + // Don't write to a file; this is not part of our build process + console.log( + JSON.stringify(schemastoreSchema, null, 2) + ); +} + +main(); From 77f568ded01cae1e37bc36a95e9b8e1f6ca35a78 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 11 Aug 2020 17:22:27 -0400 Subject: [PATCH 057/113] fix broken tests (#1108) * fix broken tests * fix linter failure --- src/index.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 9c0a37d34..59c5cc6b4 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -573,6 +573,7 @@ describe('ts-node', function () { describe('register', function () { let registered: tsNodeTypes.Register + let moduleTestPath: string before(() => { registered = register({ project: PROJECT, @@ -580,10 +581,9 @@ describe('ts-node', function () { jsx: 'preserve' } }) + moduleTestPath = require.resolve('../tests/module') }) - const moduleTestPath = require.resolve('../tests/module') - afterEach(() => { // Re-enable project after every test. registered.enabled(true) From 54963b856162f7a3300e011ed360ea6e5d31b863 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 12 Aug 2020 00:58:43 -0400 Subject: [PATCH 058/113] remove duplicated test (#1110) --- src/index.spec.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 59c5cc6b4..88de298d1 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -760,14 +760,6 @@ describe('ts-node', function () { return done() }) }) - it('supports --experimental-specifier-resolution=node', (done) => { - exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff\n') - - return done() - }) - }) describe('supports experimental-specifier-resolution=node', () => { it('via --experimental-specifier-resolution', (done) => { From 08dc47d06adb9abd72e9f8c9bef3126e222ac56d Mon Sep 17 00:00:00 2001 From: Concision <24931310+concision@users.noreply.github.com> Date: Wed, 12 Aug 2020 08:43:45 -0700 Subject: [PATCH 059/113] =?UTF-8?q?Fix=20#1098:=20`ignored()`=20bug:=20ESM?= =?UTF-8?q?=20loader=20will=20try=20to=20compile=20.cjs,=20.mjs=E2=80=A6?= =?UTF-8?q?=20(#1103)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix #1098: `ignored()` bug: ESM loader will try to compile .cjs, .mjs, and other unexpected file extensions * tests: Add test matrix for ignored() to ensure only specific extensions are sent to TypeScript compiler * feat: Changed ESM getFormat to use a Register.ignored() lookup * Add .d.ts extension to tests Co-authored-by: Andrew Bradley --- src/esm.ts | 2 +- src/index.spec.ts | 29 ++++++++++++++++++++++++++++- src/index.ts | 11 ++++++----- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/esm.ts b/src/esm.ts index ae08ada32..a00b2110e 100644 --- a/src/esm.ts +++ b/src/esm.ts @@ -72,7 +72,7 @@ export function registerAndCreateEsmHooks (opts?: RegisterOptions) { // If file has .ts, .tsx, or .jsx extension, then ask node how it would treat this file if it were .js const ext = extname(nativePath) - if (ext === '.ts' || ext === '.tsx' || ext === '.jsx') { + if (ext !== '.js' && !tsNodeInstance.ignored(nativePath)) { return defer(formatUrl(pathToFileURL(nativePath + '.js'))) } diff --git a/src/index.spec.ts b/src/index.spec.ts index 88de298d1..d9085e4cf 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -728,11 +728,38 @@ describe('ts-node', function () { it('should create generic compiler instances', () => { const service = create({ compilerOptions: { target: 'es5' }, skipProject: true }) const output = service.compile('const x = 10', 'test.ts') - expect(output).to.contain('var x = 10;') }) }) + describe('issue #1098', () => { + function testIgnored (ignored: tsNodeTypes.Register['ignored'], allowed: string[], disallowed: string[]) { + for (const ext of allowed) { + expect(ignored(join(__dirname, `index${ext}`))).equal(false, `should accept ${ext} files`) + } + for (const ext of disallowed) { + expect(ignored(join(__dirname, `index${ext}`))).equal(true, `should ignore ${ext} files`) + } + } + + it('correctly filters file extensions from the compiler when allowJs=false and jsx=false', () => { + const { ignored } = create({ compilerOptions: { }, skipProject: true }) + testIgnored(ignored, ['.ts', '.d.ts'], ['.js', '.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) + }) + it('correctly filters file extensions from the compiler when allowJs=true and jsx=false', () => { + const { ignored } = create({ compilerOptions: { allowJs: true }, skipProject: true }) + testIgnored(ignored, ['.ts', '.js', '.d.ts'], ['.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) + }) + it('correctly filters file extensions from the compiler when allowJs=false and jsx=true', () => { + const { ignored } = create({ compilerOptions: { allowJs: false, jsx: 'preserve' }, skipProject: true }) + testIgnored(ignored, ['.ts', '.tsx', '.d.ts'], ['.js', '.jsx', '.mjs', '.cjs', '.xyz', '']) + }) + it('correctly filters file extensions from the compiler when allowJs=true and jsx=true', () => { + const { ignored } = create({ compilerOptions: { allowJs: true, jsx: 'preserve' }, skipProject: true }) + testIgnored(ignored, ['.ts', '.tsx', '.js', '.jsx', '.d.ts'], ['.mjs', '.cjs', '.xyz', '']) + }) + }) + describe('esm', () => { this.slow(1000) diff --git a/src/index.ts b/src/index.ts index 5aa2ea23b..ac55811b2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -834,14 +834,15 @@ export function create (rawOptions: CreateOptions = {}): Register { let active = true const enabled = (enabled?: boolean) => enabled === undefined ? active : (active = !!enabled) + const extensions = getExtensions(config) const ignored = (fileName: string) => { if (!active) return true - const relname = relative(cwd, fileName) - if (!config.options.allowJs) { - const ext = extname(fileName) - if (ext === '.js' || ext === '.jsx') return true + const ext = extname(fileName) + if (extensions.tsExtensions.includes(ext) || extensions.jsExtensions.includes(ext)) { + const relname = relative(cwd, fileName) + return !isScoped(relname) || shouldIgnore(relname) } - return !isScoped(relname) || shouldIgnore(relname) + return true } return { ts, config, compile, getTypeInfo, ignored, enabled, options } From e29ae0470fcf02751c2e1913f66ae1451518fe4f Mon Sep 17 00:00:00 2001 From: Concision <24931310+concision@users.noreply.github.com> Date: Wed, 12 Aug 2020 10:37:32 -0700 Subject: [PATCH 060/113] Added a transpile-only ESM loader (#1101) (#1102) * Added a transpile-only ESM loader (#1101) * feat: Added transpile-only ESM loader to package.json exports and resolve tests * feat: Added success/failure tests for transpile-only ESM loader * fix: Fix transpile-only ESM loader tests Fixed ESM tests being executed under node 13.0.0 Fixed error message matching criteria * fix: Fix erroneous quotations in transpile-only ESM loader tests * feat: Removed imports on tests for esm-transpile-only tests * feat: Renamed and restructured esm-transpile-only tests --- esm/transpile-only.mjs | 7 +++++++ package.json | 5 ++++- src/index.spec.ts | 25 +++++++++++++++++++++++++ tests/esm-transpile-only/index.ts | 5 +++++ tests/esm-transpile-only/package.json | 3 +++ tests/esm-transpile-only/tsconfig.json | 7 +++++++ 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 esm/transpile-only.mjs create mode 100644 tests/esm-transpile-only/index.ts create mode 100644 tests/esm-transpile-only/package.json create mode 100644 tests/esm-transpile-only/tsconfig.json diff --git a/esm/transpile-only.mjs b/esm/transpile-only.mjs new file mode 100644 index 000000000..4823d5217 --- /dev/null +++ b/esm/transpile-only.mjs @@ -0,0 +1,7 @@ +import {fileURLToPath} from 'url' +import {createRequire} from 'module' +const require = createRequire(fileURLToPath(import.meta.url)) + +/** @type {import('../dist/esm')} */ +const esm = require('../dist/esm') +export const {resolve, getFormat, transformSource} = esm.registerAndCreateEsmHooks({transpileOnly: true}) diff --git a/package.json b/package.json index e458b78e8..95174ba56 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ "./register/transpile-only": "./register/transpile-only.js", "./register/type-check": "./register/type-check.js", "./esm": "./esm.mjs", - "./esm.mjs": "./esm.mjs" + "./esm.mjs": "./esm.mjs", + "./esm/transpile-only": "./esm/transpile-only.mjs", + "./esm/transpile-only.mjs": "./esm/transpile-only.mjs" }, "types": "dist/index.d.ts", "bin": { @@ -31,6 +33,7 @@ "dist/", "dist-raw/", "register/", + "esm/", "esm.mjs", "LICENSE", "tsconfig.schema.json", diff --git a/src/index.spec.ts b/src/index.spec.ts index d9085e4cf..c3def2b5e 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -72,6 +72,8 @@ describe('ts-node', function () { // `node --loader ts-node/esm` testsDirRequire.resolve('ts-node/esm') testsDirRequire.resolve('ts-node/esm.mjs') + testsDirRequire.resolve('ts-node/esm/transpile-only') + testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') }) describe('cli', function () { @@ -821,6 +823,29 @@ describe('ts-node', function () { return done() }) }) + + it('should support transpile only mode via dedicated loader entrypoint', (done) => { + exec(`${cmd}/transpile-only index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('') + + return done() + }) + }) + it('should throw type errors without transpile-only enabled', (done) => { + exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { + if (err === null) { + return done('Command was expected to fail, but it succeeded.') + } + + expect(err.message).to.contain('Unable to compile TypeScript') + expect(err.message).to.match(new RegExp('TS2345: Argument of type \'(?:number|1101)\' is not assignable to parameter of type \'string\'\\.')) + expect(err.message).to.match(new RegExp('TS2322: Type \'(?:"hello world"|string)\' is not assignable to type \'number\'\\.')) + expect(stdout).to.equal('') + + return done() + }) + }) } it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', function (done) { diff --git a/tests/esm-transpile-only/index.ts b/tests/esm-transpile-only/index.ts new file mode 100644 index 000000000..e99da7cfd --- /dev/null +++ b/tests/esm-transpile-only/index.ts @@ -0,0 +1,5 @@ +if (typeof module !== 'undefined') throw new Error('module should not exist in ESM') + +// intentional type errors to check transpile-only ESM loader skips type checking +parseInt(1101, 2) +const x: number = 'hello world' diff --git a/tests/esm-transpile-only/package.json b/tests/esm-transpile-only/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/esm-transpile-only/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/esm-transpile-only/tsconfig.json b/tests/esm-transpile-only/tsconfig.json new file mode 100644 index 000000000..03e0c3c5d --- /dev/null +++ b/tests/esm-transpile-only/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "ESNext", + "allowJs": true, + "jsx": "react" + } +} From 7cb6d570f531fd7efaa83a526b68610abd927dab Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 12 Aug 2020 19:29:17 -0400 Subject: [PATCH 061/113] Add test coverage (#1109) * WIP * fix lint failures * Add tests --- src/index.spec.ts | 59 ++++++++++++++++++++++++++++- tests/esm-import-http-url/index.mjs | 1 + 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/esm-import-http-url/index.mjs diff --git a/src/index.spec.ts b/src/index.spec.ts index c3def2b5e..7a175c9c1 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -39,6 +39,7 @@ before(async function () { describe('ts-node', function () { const cmd = `"${BIN_PATH}" --project "${PROJECT}"` + const cmdNoProject = `"${BIN_PATH}"` this.timeout(10000) @@ -88,6 +89,32 @@ describe('ts-node', function () { }) }) + it('shows usage via --help', function (done) { + exec(`${cmdNoProject} --help`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.match(/Usage: ts-node /) + return done() + }) + }) + it('shows version via -v', function (done) { + exec(`${cmdNoProject} -v`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout.trim()).to.equal('v' + testsDirRequire('ts-node/package').version) + return done() + }) + }) + it('shows version of compiler via -vv', function (done) { + exec(`${cmdNoProject} -vv`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout.trim()).to.equal( + `ts-node v${ testsDirRequire('ts-node/package').version }\n` + + `node ${ process.version }\n` + + `compiler v${ testsDirRequire('typescript/package').version }` + ) + return done() + }) + }) + it('should register via cli', function (done) { exec(`node -r ts-node/register hello-world.ts`, { cwd: TEST_DIR @@ -727,11 +754,30 @@ describe('ts-node', function () { }) describe('create', () => { + let service: tsNodeTypes.Register + before(() => { + service = create({ compilerOptions: { target: 'es5' }, skipProject: true }) + }) + it('should create generic compiler instances', () => { - const service = create({ compilerOptions: { target: 'es5' }, skipProject: true }) const output = service.compile('const x = 10', 'test.ts') expect(output).to.contain('var x = 10;') }) + + describe('should get type information', () => { + it('given position of identifier', () => { + expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 21)).to.deep.equal({ + comment: 'jsdoc here', + name: 'const x: 10' + }) + }) + it('given position that does not point to an identifier', () => { + expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 0)).to.deep.equal({ + comment: '', + name: '' + }) + }) + }) }) describe('issue #1098', () => { @@ -824,6 +870,17 @@ describe('ts-node', function () { }) }) + it('defers to fallback loaders when URL should not be handled by ts-node', function (done) { + exec(`${cmd} index.mjs`, { + cwd: join(__dirname, '../tests/esm-import-http-url') + }, function (err, stdout, stderr) { + expect(err).to.not.equal(null) + // expect error from node's default resolver + expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*\n *at defaultResolve/) + return done() + }) + }) + it('should support transpile only mode via dedicated loader entrypoint', (done) => { exec(`${cmd}/transpile-only index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { expect(err).to.equal(null) diff --git a/tests/esm-import-http-url/index.mjs b/tests/esm-import-http-url/index.mjs new file mode 100644 index 000000000..35e59a6c6 --- /dev/null +++ b/tests/esm-import-http-url/index.mjs @@ -0,0 +1 @@ +import 'http://example.com/this-url-should-be-ignored-by-our-esm-loader.js' From 66732d6679ccde9fc94ac4dc2fc2c8a7d6ff6f25 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 12 Aug 2020 23:09:28 -0400 Subject: [PATCH 062/113] Fix coverage and testing badges (#1095) * Update README.md * Update README.md * Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 282fdf13b..1c4f7f990 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ [![NPM version][npm-image]][npm-url] [![NPM downloads][downloads-image]][downloads-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] +[![Build status][github-actions-image]][github-actions-url] +[![Test coverage][codecov-image]][codecov-url] > TypeScript execution and REPL for node.js, with source map support. **Works with `typescript@>=2.7`**. @@ -300,7 +300,7 @@ MIT [npm-url]: https://npmjs.org/package/ts-node [downloads-image]: https://img.shields.io/npm/dm/ts-node.svg?style=flat [downloads-url]: https://npmjs.org/package/ts-node -[travis-image]: https://img.shields.io/travis/TypeStrong/ts-node.svg?style=flat -[travis-url]: https://travis-ci.org/TypeStrong/ts-node -[coveralls-image]: https://img.shields.io/coveralls/TypeStrong/ts-node.svg?style=flat -[coveralls-url]: https://coveralls.io/r/TypeStrong/ts-node?branch=master +[github-actions-image]: https://img.shields.io/github/workflow/status/TypeStrong/ts-node/Continuous%20Integration +[github-actions-url]: https://github.com/TypeStrong/ts-node/actions?query=workflow%3A%22Continuous+Integration%22 +[codecov-image]: https://codecov.io/gh/TypeStrong/ts-node/branch/master/graph/badge.svg +[codecov-url]: https://codecov.io/gh/TypeStrong/ts-node From 89e42cc09af89e9007b93e4cb2d0de8b66fb4c28 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 12 Aug 2020 23:43:57 -0400 Subject: [PATCH 063/113] add test for REPL .type command (#1115) --- src/index.spec.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/index.spec.ts b/src/index.spec.ts index 7a175c9c1..0c78dcd98 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -355,6 +355,20 @@ describe('ts-node', function () { cp.stdin!.end('console.log("123")\n') }) + it('REPL has command to get type information', function (done) { + const cp = exec(`${cmd} --interactive`, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal( + '> undefined\n' + + '> undefined\n' + + '> const a: 123\n' + + '> ' + ) + return done() + }) + + cp.stdin!.end('\nconst a = 123\n.type a') + }) it('should support require flags', function (done) { exec(`${cmd} -r ./tests/hello-world -pe "console.log('success')"`, function (err, stdout) { From 836d1f22cca49c8e5b55e11d55f791b606136e51 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 21 Aug 2020 00:10:17 -0400 Subject: [PATCH 064/113] bump to typescript 4.0.2 (#1117) --- package-lock.json | 12 +++++++++--- package.json | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7dd6f696f..72ae33f9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2354,9 +2354,9 @@ } }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", "dev": true }, "typescript-json-schema": { @@ -2412,6 +2412,12 @@ "ansi-regex": "^4.1.0" } }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true + }, "yargs": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", diff --git a/package.json b/package.json index 95174ba56..8d480fc30 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "semver": "^7.1.3", "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", - "typescript": "3.8.3", + "typescript": "4.0.2", "typescript-json-schema": "^0.42.0", "util.promisify": "^1.0.1" }, From c2a2048aa6a4697bd11c20b48605c2db9adc5f08 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 21 Aug 2020 00:59:59 -0400 Subject: [PATCH 065/113] Override `isExternalLibraryImport` as needed; re-add `realpath` (#970) * Re-add "realpath" to LanguageServiceHost Implement resolveModuleNames that forces modules to be considered internal (not from an external library) when we need them to be emitted * fix linter failures * fix failure on old ts version * Add $$ts-node-root.ts synthetic root file, which `/// string +} + /** * Export the current version. */ @@ -515,6 +527,103 @@ export function create (rawOptions: CreateOptions = {}): Register { let getOutput: (code: string, fileName: string) => SourceOutput let getTypeInfo: (_code: string, _fileName: string, _position: number) => TypeInfo + const getCanonicalFileName = (ts as unknown as TSInternal).createGetCanonicalFileName(ts.sys.useCaseSensitiveFileNames) + + // In a factory because these are shared across both CompilerHost and LanguageService codepaths + function createResolverFunctions (serviceHost: _ts.ModuleResolutionHost) { + const moduleResolutionCache = ts.createModuleResolutionCache(cwd, getCanonicalFileName, config.options) + const knownInternalFilenames = new Set() + /** "Buckets" (module directories) whose contents should be marked "internal" */ + const internalBuckets = new Set() + + // Get bucket for a source filename. Bucket is the containing `./node_modules/*/` directory + // For '/project/node_modules/foo/node_modules/bar/lib/index.js' bucket is '/project/node_modules/foo/node_modules/bar/' + // For '/project/node_modules/foo/node_modules/@scope/bar/lib/index.js' bucket is '/project/node_modules/foo/node_modules/@scope/bar/' + const moduleBucketRe = /.*\/node_modules\/(?:@[^\/]+\/)?[^\/]+\// + function getModuleBucket (filename: string) { + const find = moduleBucketRe.exec(filename) + if (find) return find[0] + return '' + } + + // Mark that this file and all siblings in its bucket should be "internal" + function markBucketOfFilenameInternal (filename: string) { + internalBuckets.add(getModuleBucket(filename)) + } + + function isFileInInternalBucket (filename: string) { + return internalBuckets.has(getModuleBucket(filename)) + } + + function isFileKnownToBeInternal (filename: string) { + return knownInternalFilenames.has(filename) + } + + /** + * If we need to emit JS for a file, force TS to consider it non-external + */ + const fixupResolvedModule = (resolvedModule: _ts.ResolvedModule | _ts.ResolvedTypeReferenceDirective) => { + const { resolvedFileName } = resolvedModule + if (resolvedFileName === undefined) return + // .ts is always switched to internal + // .js is switched on-demand + if ( + resolvedModule.isExternalLibraryImport && ( + (resolvedFileName.endsWith('.ts') && !resolvedFileName.endsWith('.d.ts')) || + isFileKnownToBeInternal(resolvedFileName) || + isFileInInternalBucket(resolvedFileName) + ) + ) { + resolvedModule.isExternalLibraryImport = false + } + if (!resolvedModule.isExternalLibraryImport) { + knownInternalFilenames.add(resolvedFileName) + } + } + /* + * NOTE: + * Older ts versions do not pass `redirectedReference` nor `options`. + * We must pass `redirectedReference` to newer ts versions, but cannot rely on `options`, hence the weird argument name + */ + const resolveModuleNames: _ts.LanguageServiceHost['resolveModuleNames'] = (moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: _ts.ResolvedProjectReference | undefined, optionsOnlyWithNewerTsVersions: _ts.CompilerOptions): (_ts.ResolvedModule | undefined)[] => { + return moduleNames.map(moduleName => { + const { resolvedModule } = ts.resolveModuleName(moduleName, containingFile, config.options, serviceHost, moduleResolutionCache, redirectedReference) + if (resolvedModule) { + fixupResolvedModule(resolvedModule) + } + return resolvedModule + }) + } + + // language service never calls this, but TS docs recommend that we implement it + const getResolvedModuleWithFailedLookupLocationsFromCache: _ts.LanguageServiceHost['getResolvedModuleWithFailedLookupLocationsFromCache'] = (moduleName, containingFile): _ts.ResolvedModuleWithFailedLookupLocations | undefined => { + const ret = ts.resolveModuleNameFromCache(moduleName, containingFile, moduleResolutionCache) + if (ret && ret.resolvedModule) { + fixupResolvedModule(ret.resolvedModule) + } + return ret + } + + const resolveTypeReferenceDirectives: _ts.LanguageServiceHost['resolveTypeReferenceDirectives'] = (typeDirectiveNames: string[], containingFile: string, redirectedReference: _ts.ResolvedProjectReference | undefined, options: _ts.CompilerOptions): (_ts.ResolvedTypeReferenceDirective | undefined)[] => { + // Note: seems to be called with empty typeDirectiveNames array for all files. + return typeDirectiveNames.map(typeDirectiveName => { + const { resolvedTypeReferenceDirective } = ts.resolveTypeReferenceDirective(typeDirectiveName, containingFile, config.options, serviceHost, redirectedReference) + if (resolvedTypeReferenceDirective) { + fixupResolvedModule(resolvedTypeReferenceDirective) + } + return resolvedTypeReferenceDirective + }) + } + + return { + resolveModuleNames, + getResolvedModuleWithFailedLookupLocationsFromCache, + resolveTypeReferenceDirectives, + isFileKnownToBeInternal, + markBucketOfFilenameInternal + } + } + // Use full language services when the fast option is disabled. if (!transpileOnly) { const fileContents = new Map() @@ -536,7 +645,7 @@ export function create (rawOptions: CreateOptions = {}): Register { } // Create the compiler host for type checking. - const serviceHost: _ts.LanguageServiceHost = { + const serviceHost: _ts.LanguageServiceHost & Required> = { getProjectVersion: () => String(projectVersion), getScriptFileNames: () => Array.from(rootFileNames), getScriptVersion: (fileName: string) => { @@ -544,6 +653,7 @@ export function create (rawOptions: CreateOptions = {}): Register { return version ? version.toString() : '' }, getScriptSnapshot (fileName: string) { + // TODO ordering of this with getScriptVersion? Should they sync up? let contents = fileContents.get(fileName) // Read contents into TypeScript memory cache. @@ -563,6 +673,7 @@ export function create (rawOptions: CreateOptions = {}): Register { getDirectories: cachedLookup(debugFn('getDirectories', ts.sys.getDirectories)), fileExists: cachedLookup(debugFn('fileExists', fileExists)), directoryExists: cachedLookup(debugFn('directoryExists', ts.sys.directoryExists)), + realpath: ts.sys.realpath ? cachedLookup(debugFn('realpath', ts.sys.realpath)) : undefined, getNewLine: () => ts.sys.newLine, useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames, getCurrentDirectory: () => cwd, @@ -570,14 +681,19 @@ export function create (rawOptions: CreateOptions = {}): Register { getDefaultLibFileName: () => ts.getDefaultLibFilePath(config.options), getCustomTransformers: getCustomTransformers } + const { resolveModuleNames, getResolvedModuleWithFailedLookupLocationsFromCache, resolveTypeReferenceDirectives, isFileKnownToBeInternal, markBucketOfFilenameInternal } = createResolverFunctions(serviceHost) + serviceHost.resolveModuleNames = resolveModuleNames + serviceHost.getResolvedModuleWithFailedLookupLocationsFromCache = getResolvedModuleWithFailedLookupLocationsFromCache + serviceHost.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives const registry = ts.createDocumentRegistry(ts.sys.useCaseSensitiveFileNames, cwd) const service = ts.createLanguageService(serviceHost, registry) const updateMemoryCache = (contents: string, fileName: string) => { - // Add to `rootFiles` if not already there - // This is necessary to force TS to emit output - if (!rootFileNames.has(fileName)) { + // Add to `rootFiles` as necessary, either to make TS include a file it has not seen, + // or to trigger a re-classification of files from external to internal. + if (!rootFileNames.has(fileName) && !isFileKnownToBeInternal(fileName)) { + markBucketOfFilenameInternal(fileName) rootFileNames.add(fileName) // Increment project version for every change to rootFileNames. projectVersion++ @@ -649,13 +765,15 @@ export function create (rawOptions: CreateOptions = {}): Register { return { name, comment } } } else { - const sys = { + const sys: _ts.System & _ts.FormatDiagnosticsHost = { ...ts.sys, ...diagnosticHost, readFile: (fileName: string) => { const cacheContents = fileContents.get(fileName) if (cacheContents !== undefined) return cacheContents - return cachedReadFile(fileName) + const contents = cachedReadFile(fileName) + if (contents) fileContents.set(fileName, contents) + return contents }, readDirectory: ts.sys.readDirectory, getDirectories: cachedLookup(debugFn('getDirectories', ts.sys.getDirectories)), @@ -678,6 +796,9 @@ export function create (rawOptions: CreateOptions = {}): Register { getDefaultLibFileName: () => normalizeSlashes(join(dirname(compiler), ts.getDefaultLibFileName(config.options))), useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames } + const { resolveModuleNames, resolveTypeReferenceDirectives, isFileKnownToBeInternal, markBucketOfFilenameInternal } = createResolverFunctions(host) + host.resolveModuleNames = resolveModuleNames + host.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives // Fallback for older TypeScript releases without incremental API. let builderProgram = ts.createIncrementalProgram @@ -704,17 +825,22 @@ export function create (rawOptions: CreateOptions = {}): Register { // Set the file contents into cache manually. const updateMemoryCache = (contents: string, fileName: string) => { - const sourceFile = builderProgram.getSourceFile(fileName) - - fileContents.set(fileName, contents) + const previousContents = fileContents.get(fileName) + const contentsChanged = previousContents !== contents + if (contentsChanged) { + fileContents.set(fileName, contents) + } // Add to `rootFiles` when discovered by compiler for the first time. - if (sourceFile === undefined) { + let addedToRootFileNames = false + if (!rootFileNames.has(fileName) && !isFileKnownToBeInternal(fileName)) { + markBucketOfFilenameInternal(fileName) rootFileNames.add(fileName) + addedToRootFileNames = true } // Update program when file changes. - if (sourceFile === undefined || sourceFile.text !== contents) { + if (addedToRootFileNames || contentsChanged) { builderProgram = ts.createEmitAndSemanticDiagnosticsBuilderProgram( Array.from(rootFileNames), config.options, diff --git a/tests/from-node-modules/from-node-modules.ts b/tests/from-node-modules/from-node-modules.ts index 9fc3e3f58..8a4ed4a37 100644 --- a/tests/from-node-modules/from-node-modules.ts +++ b/tests/from-node-modules/from-node-modules.ts @@ -1 +1,10 @@ -import 'test' +// These files are resolved by the typechecker +import * as tsmie from 'external/typescript-module-imported-externally' +import * as jsmie from 'external/javascript-module-imported-externally' +// These files are unknown to the compiler until required. +const tsmre = require('external/typescript-module-required-externally') +const jsmre = require('external/javascript-module-required-externally') + +import * as external from 'external' + +console.log(JSON.stringify({external, tsmie, jsmie, tsmre, jsmre}, null, 2)) diff --git a/tests/from-node-modules/node_modules/external/index.ts b/tests/from-node-modules/node_modules/external/index.ts new file mode 100644 index 000000000..c0d482858 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/index.ts @@ -0,0 +1,8 @@ +// These files are resolved by the typechecker +import * as tsmii from './typescript-module-imported-internally' +export {tsmii} +import * as jsmii from './javascript-module-imported-internally' +export {jsmii} +// These files are unknown to the compiler until required. +export const tsmri = require('./typescript-module-required-internally') +export const jsmri = require('./javascript-module-required-internally') diff --git a/tests/from-node-modules/node_modules/external/javascript-module-imported-externally/index.ts b/tests/from-node-modules/node_modules/external/javascript-module-imported-externally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/javascript-module-imported-externally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/external/javascript-module-imported-internally/index.ts b/tests/from-node-modules/node_modules/external/javascript-module-imported-internally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/javascript-module-imported-internally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/external/javascript-module-required-externally/index.ts b/tests/from-node-modules/node_modules/external/javascript-module-required-externally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/javascript-module-required-externally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/external/javascript-module-required-internally/index.ts b/tests/from-node-modules/node_modules/external/javascript-module-required-internally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/javascript-module-required-internally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/external/typescript-module-imported-externally/index.ts b/tests/from-node-modules/node_modules/external/typescript-module-imported-externally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/typescript-module-imported-externally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/external/typescript-module-imported-internally/index.ts b/tests/from-node-modules/node_modules/external/typescript-module-imported-internally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/typescript-module-imported-internally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/external/typescript-module-required-externally/index.ts b/tests/from-node-modules/node_modules/external/typescript-module-required-externally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/typescript-module-required-externally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/external/typescript-module-required-internally/index.ts b/tests/from-node-modules/node_modules/external/typescript-module-required-internally/index.ts new file mode 100644 index 000000000..c11bbc593 --- /dev/null +++ b/tests/from-node-modules/node_modules/external/typescript-module-required-internally/index.ts @@ -0,0 +1,2 @@ +import {basename} from 'path' +export const name = basename(__dirname) diff --git a/tests/from-node-modules/node_modules/test.ts b/tests/from-node-modules/node_modules/test.ts deleted file mode 100644 index 9bf72d93a..000000000 --- a/tests/from-node-modules/node_modules/test.ts +++ /dev/null @@ -1,3 +0,0 @@ -const message: string = 'hello world' - -console.log(message) diff --git a/tests/from-node-modules/tsconfig.json b/tests/from-node-modules/tsconfig.json new file mode 100644 index 000000000..cd8ababe0 --- /dev/null +++ b/tests/from-node-modules/tsconfig.json @@ -0,0 +1,8 @@ +{ + "ts-node": { + "ignore": [] + }, + "compilerOptions": { + "allowJs": true + } +} diff --git a/tests/maxnodemodulesjsdepth-scoped/index.ts b/tests/maxnodemodulesjsdepth-scoped/index.ts new file mode 100644 index 000000000..434f70cba --- /dev/null +++ b/tests/maxnodemodulesjsdepth-scoped/index.ts @@ -0,0 +1,10 @@ +// Import as values, forcing internal classification. All files are typechecked +import {foo as a_foo, bar as a_bar} from '@scoped/a' +// Values are not used, so classification remains external. Obeys maxNodeModulesJsDepth +import {foo as b_foo, bar as b_bar} from '@scoped/b' + +// We must have two .ts files, one without type errors. +// Otherwise, type errors would prevent imports from executing, so external modules would not be reclassified as internal. +a_foo + +import './other' diff --git a/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/has-semantic-error.js b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/has-semantic-error.js new file mode 100644 index 000000000..8fc0d16ac --- /dev/null +++ b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/has-semantic-error.js @@ -0,0 +1,4 @@ +// Due to allowJs and skipIgnore, this file is typechecked because it is reclassified as internal + +/** @type {string} */ +export const bar = 123 diff --git a/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/index.js b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/index.js new file mode 100644 index 000000000..ca80949e5 --- /dev/null +++ b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/index.js @@ -0,0 +1,4 @@ +export {bar} from './has-semantic-error' + +/** @type {string} */ +export const foo = 'foo' diff --git a/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/has-semantic-error.js b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/has-semantic-error.js new file mode 100644 index 000000000..ef2739768 --- /dev/null +++ b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/has-semantic-error.js @@ -0,0 +1,4 @@ +// Due to maxNodeModuleJsDepth of 1, this file is not typechecked + +/** @type {string} */ +export const bar = 123 diff --git a/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/index.js b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/index.js new file mode 100644 index 000000000..ca80949e5 --- /dev/null +++ b/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/index.js @@ -0,0 +1,4 @@ +export {bar} from './has-semantic-error' + +/** @type {string} */ +export const foo = 'foo' diff --git a/tests/maxnodemodulesjsdepth-scoped/other.ts b/tests/maxnodemodulesjsdepth-scoped/other.ts new file mode 100644 index 000000000..319936b5e --- /dev/null +++ b/tests/maxnodemodulesjsdepth-scoped/other.ts @@ -0,0 +1,10 @@ +// Import as values, forcing internal classification. All files are typechecked +import {foo as a_foo, bar as a_bar} from '@scoped/a' +// Values are not used, so classification remains external. Obeys maxNodeModulesJsDepth +import {foo as b_foo, bar as b_bar} from '@scoped/b' + +// `a_bar` has type information because it has been reclassified as internal +const shouldBeBoolean2: boolean = a_bar + +// `b_bar` is missing type information, so this is not an error +const shouldBeBoolean4: boolean = null as typeof b_bar diff --git a/tests/maxnodemodulesjsdepth-scoped/tsconfig.json b/tests/maxnodemodulesjsdepth-scoped/tsconfig.json new file mode 100644 index 000000000..530b7e33d --- /dev/null +++ b/tests/maxnodemodulesjsdepth-scoped/tsconfig.json @@ -0,0 +1,11 @@ +{ + "ts-node": { + // Force transpilation of node_modules + "skipIgnore": true + }, + "compilerOptions": { + "allowJs": true, + "maxNodeModuleJsDepth": 1, + "moduleResolution": "node" + } +} diff --git a/tests/maxnodemodulesjsdepth/index.ts b/tests/maxnodemodulesjsdepth/index.ts new file mode 100644 index 000000000..7c5c75990 --- /dev/null +++ b/tests/maxnodemodulesjsdepth/index.ts @@ -0,0 +1,2 @@ +import {foo, bar} from 'external' +import './other' diff --git a/tests/maxnodemodulesjsdepth/node_modules/external/has-semantic-error.js b/tests/maxnodemodulesjsdepth/node_modules/external/has-semantic-error.js new file mode 100644 index 000000000..b8a7e88e4 --- /dev/null +++ b/tests/maxnodemodulesjsdepth/node_modules/external/has-semantic-error.js @@ -0,0 +1,4 @@ +// Due to maxNodeModuleJsDepth of 1, this file is not typechecked + +/** @type {string} */ +exports.bar = 123 diff --git a/tests/maxnodemodulesjsdepth/node_modules/external/index.js b/tests/maxnodemodulesjsdepth/node_modules/external/index.js new file mode 100644 index 000000000..def1c4f5c --- /dev/null +++ b/tests/maxnodemodulesjsdepth/node_modules/external/index.js @@ -0,0 +1,5 @@ +const hasSemanticError = require('./has-semantic-error'); +exports.bar = hasSemanticError.bar; + +/** @type {string} */ +exports.foo = 'foo' diff --git a/tests/maxnodemodulesjsdepth/other.ts b/tests/maxnodemodulesjsdepth/other.ts new file mode 100644 index 000000000..897e4a8c0 --- /dev/null +++ b/tests/maxnodemodulesjsdepth/other.ts @@ -0,0 +1,7 @@ +import {foo, bar} from 'external' + +// `foo` has type information so this is an error +const shouldBeBoolean: boolean = foo + +// `bar` is missing type information, so this is not an error +const shouldBeBoolean2: boolean = bar diff --git a/tests/maxnodemodulesjsdepth/tsconfig.json b/tests/maxnodemodulesjsdepth/tsconfig.json new file mode 100644 index 000000000..618fe1779 --- /dev/null +++ b/tests/maxnodemodulesjsdepth/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "allowJs": true, + "maxNodeModuleJsDepth": 1, + "moduleResolution": "node" + } +} From 41e7109e9f6c4ac3f072b16859f5f2876377b185 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 21 Aug 2020 13:55:32 -0400 Subject: [PATCH 066/113] 9.0.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 72ae33f9b..997c65b9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.10.1", + "version": "9.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8d480fc30..808cf56d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "8.10.1", + "version": "9.0.0", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "exports": { From 4dba8e8a79a517a0f40ca827a1ebf1b8351610f1 Mon Sep 17 00:00:00 2001 From: Lily Nguyen Date: Tue, 15 Sep 2020 05:26:15 -0700 Subject: [PATCH 067/113] fix: Alias --es-module-specifier-resolution to --experimental-specifier-resolution for Node 12 compatibility (#1122) * fix: Alias --es-module-specifier-resolution to --experimental-specifier-resolution for node 12 compatibility * Update node-options.js Co-authored-by: Andrew Bradley --- dist-raw/node-options.js | 4 +++- esm-usage-example/package.json | 2 +- src/index.spec.ts | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dist-raw/node-options.js b/dist-raw/node-options.js index f27a44689..7a68872ce 100644 --- a/dist-raw/node-options.js +++ b/dist-raw/node-options.js @@ -25,7 +25,9 @@ function parseArgv(argv) { '--preserve-symlinks': Boolean, '--preserve-symlinks-main': Boolean, '--input-type': String, - '--experimental-specifier-resolution': String + '--experimental-specifier-resolution': String, + // Legacy alias for node versions prior to 12.16 + '--es-module-specifier-resolution': '--experimental-specifier-resolution', }, { argv, permissive: true diff --git a/esm-usage-example/package.json b/esm-usage-example/package.json index e9974a780..6c23fab66 100644 --- a/esm-usage-example/package.json +++ b/esm-usage-example/package.json @@ -1,7 +1,7 @@ { "type": "module", "dependencies": { - "ts-node": "github:TypeStrong/ts-node#ab/esm-support", + "ts-node": "github:TypeStrong/ts-node#master", "typescript": "^3.8.3" } } diff --git a/src/index.spec.ts b/src/index.spec.ts index 10e6aa376..80ea31857 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -887,6 +887,14 @@ describe('ts-node', function () { return done() }) }) + it('via --es-module-specifier-resolution alias', (done) => { + exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff\n') + + return done() + }) + }) it('via NODE_OPTIONS', (done) => { exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver'), From 8af10a578cba5692ce639f841940e959d6358d14 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 15 Sep 2020 08:34:19 -0400 Subject: [PATCH 068/113] Rewrite `transformers` doc (#1123) Reword to make it clearer that factory function cannot be used with transpileOnly, but object is still allowed --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c4f7f990..c23656411 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ _The name of the environment variable and the option's default value are denoted ### Programmatic-only Options -* `transformers` `_ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers)`: An object with transformers or a function that accepts a program and returns an transformers object to pass to TypeScript. Function isn't available with `transpileOnly` flag +* `transformers` `_ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers)`: An object with transformers or a factory function that accepts a program and returns a transformers object to pass to TypeScript. Factory function cannot be used with `transpileOnly` flag * `readFile`: Custom TypeScript-compatible file reading function * `fileExists`: Custom TypeScript-compatible file existence function From 5a90aac8b93718ca46c7cee0c7451eff0def0df9 Mon Sep 17 00:00:00 2001 From: Andrew Luca Date: Fri, 23 Oct 2020 20:09:48 +0300 Subject: [PATCH 069/113] docs: fix misspellings about ts-node-dev (#1131) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c23656411..0ef1317cc 100644 --- a/README.md +++ b/README.md @@ -290,7 +290,7 @@ import UntypedJsLib from "untyped_js_lib" **TypeScript Node** compiles source code via `require()`, watching files and code reloads are out of scope for the project. If you want to restart the `ts-node` process on file change, existing node.js tools such as [nodemon](https://github.com/remy/nodemon), [onchange](https://github.com/Qard/onchange) and [node-dev](https://github.com/fgnass/node-dev) work. -There's also [`ts-node-dev`](https://github.com/whitecolor/ts-node-dev), a modified version of [`node-dev`](https://github.com/fgnass/node-dev) using `ts-node` for compilation and won't restart the process on file change. +There's also [`ts-node-dev`](https://github.com/whitecolor/ts-node-dev), a modified version of [`node-dev`](https://github.com/fgnass/node-dev) using `ts-node` for compilation that will restart the process on file change. ## License From a0f7aa18a703b7761ef64f2f7eed2058072003a9 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 31 Oct 2020 18:51:32 -0400 Subject: [PATCH 070/113] Test against node 15 (#1138) * Test against node 15 * Avoid npm v7 when running against node 15 * fix npm downgrade logic * Fix error message detection regexp for node 15 * Removing accidentally-committed local code * remove debug logging --- .github/workflows/continuous-integration.yml | 32 +++++++++++++++++++- src/index.spec.ts | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 4c49393fd..5ffccfbea 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -39,23 +39,30 @@ jobs: fail-fast: false matrix: os: [ubuntu, windows] - flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9] + # Don't forget to add all new flavors to this list! + flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] include: + # Node 10 - flavor: 1 node: 10 nodeFlag: 10 typescript: latest typescriptFlag: latest + # Node 12.15 - flavor: 2 node: 12.15 nodeFlag: 12_15 typescript: latest typescriptFlag: latest + # Node 12.16 + # TODO Add comments about why we test 2.15 and 2.16; I think git blame says it's because of an ESM behavioral change that happened at this version number + # TODO switch to '12' to get latest patch? - flavor: 3 node: 12.16 nodeFlag: 12_16 typescript: latest typescriptFlag: latest + # Node 13 - flavor: 4 node: 13 nodeFlag: 13 @@ -71,6 +78,7 @@ jobs: nodeFlag: 13 typescript: next typescriptFlag: next + # Node 14 - flavor: 7 node: 14 nodeFlag: 14 @@ -86,6 +94,25 @@ jobs: nodeFlag: 14 typescript: next typescriptFlag: next + # Node 15 + - flavor: 10 + node: 15 + nodeFlag: 15 + typescript: latest + typescriptFlag: latest + downgradeNpm: true + - flavor: 11 + node: 15 + nodeFlag: 15 + typescript: 2.7 + typescriptFlag: 2_7 + downgradeNpm: true + - flavor: 12 + node: 15 + nodeFlag: 15 + typescript: next + typescriptFlag: next + downgradeNpm: true steps: # checkout code - uses: actions/checkout@v2 @@ -95,6 +122,9 @@ jobs: with: node-version: ${{ matrix.node }} # lint, build, test + # Downgrade from npm 7 to 6 because 7 still seems buggy to me + - if: ${{ matrix.downgradeNpm }} + run: npm install -g npm@6 - run: npm install - run: npm run build-nopack - name: Download package artifact diff --git a/src/index.spec.ts b/src/index.spec.ts index 80ea31857..74a2959a4 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -926,7 +926,7 @@ describe('ts-node', function () { }, function (err, stdout, stderr) { expect(err).to.not.equal(null) // expect error from node's default resolver - expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*\n *at defaultResolve/) + expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*(?:\n.*){0,1}\n *at defaultResolve/) return done() }) }) From 5f813b18436075f5860fc4c9d4553cc50244277f Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 31 Oct 2020 19:02:14 -0400 Subject: [PATCH 071/113] Fix #1130 (#1136) * Test against additional node versions: 14.13.0 and 15 * Add ESM test of builtin module resolution * Use version number test to switch node's builtin module URI protocol in ESM resolver * add new test matrix entries to flavors array --- .github/workflows/continuous-integration.yml | 15 +++++++++++---- dist-raw/node-esm-resolve-implementation.js | 16 ++++++++++++++-- tests/esm/index.ts | 4 ++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 5ffccfbea..6735af97a 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -40,7 +40,7 @@ jobs: matrix: os: [ubuntu, windows] # Don't forget to add all new flavors to this list! - flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] include: # Node 10 - flavor: 1 @@ -94,20 +94,27 @@ jobs: nodeFlag: 14 typescript: next typescriptFlag: next - # Node 15 + # Node 14.13.0 + # To test ESM builtin module resolution immediately before a node behavioral change: https://github.com/TypeStrong/ts-node/issues/1130 - flavor: 10 + node: 14.13.0 + nodeFlag: 14_13_0 + typescript: latest + typescriptFlag: latest + # Node 15 + - flavor: 11 node: 15 nodeFlag: 15 typescript: latest typescriptFlag: latest downgradeNpm: true - - flavor: 11 + - flavor: 12 node: 15 nodeFlag: 15 typescript: 2.7 typescriptFlag: 2_7 downgradeNpm: true - - flavor: 12 + - flavor: 13 node: 15 nodeFlag: 15 typescript: next diff --git a/dist-raw/node-esm-resolve-implementation.js b/dist-raw/node-esm-resolve-implementation.js index a3da2f9a0..ef9cd106e 100644 --- a/dist-raw/node-esm-resolve-implementation.js +++ b/dist-raw/node-esm-resolve-implementation.js @@ -4,6 +4,18 @@ // upstream changes and understand our modifications. 'use strict'; +const [nodeMajor, nodeMinor, nodePatch] = process.versions.node.split('.').map(s => parseInt(s, 10)) +// Test for 14.13.1 or higher +const builtinModuleProtocol = nodeMajor > 14 || ( + nodeMajor === 14 && ( + nodeMinor > 13 || ( + nodeMinor === 13 && nodePatch > 0 + ) + ) + ) + ? 'node:' + : 'nodejs:'; + const { ArrayIsArray, JSONParse, @@ -688,13 +700,13 @@ function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { }; } } catch {} - if (parsed && parsed.protocol === 'nodejs:') + if (parsed && parsed.protocol === builtinModuleProtocol) return { url: specifier }; if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(); if (NativeModule.canBeRequiredByUsers(specifier)) { return { - url: 'nodejs:' + specifier + url: builtinModuleProtocol + specifier }; } if (parentURL && StringPrototypeStartsWith(parentURL, 'data:')) { diff --git a/tests/esm/index.ts b/tests/esm/index.ts index 3b955e28b..9f7091dcf 100644 --- a/tests/esm/index.ts +++ b/tests/esm/index.ts @@ -3,6 +3,10 @@ import {bar} from './bar.js' import {baz} from './baz.js' import {biff} from './biff.js' +// Test import builtin modules +import {readFileSync} from 'fs'; +if(typeof readFileSync !== 'function') throw new Error('failed to import builtin module') + if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') console.log(`${foo} ${bar} ${baz} ${biff}`) From c1e6e3ec5ae544fb61a8c9e2f6d011b9b3bc65d2 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 31 Oct 2020 20:39:11 -0400 Subject: [PATCH 072/113] Cleanup bin script entrypoint; accepts a args object so we don't need to slice process.argv (#1141) --- src/bin-script-deprecated.ts | 2 +- src/bin-script.ts | 2 +- src/bin-transpile.ts | 2 +- src/bin.ts | 105 ++++++++++++++++++----------------- 4 files changed, 57 insertions(+), 54 deletions(-) diff --git a/src/bin-script-deprecated.ts b/src/bin-script-deprecated.ts index 6c0dc6f82..e24d5e81b 100644 --- a/src/bin-script-deprecated.ts +++ b/src/bin-script-deprecated.ts @@ -7,4 +7,4 @@ console.warn( 'Please use ts-node-script instead' ) -main(['--script-mode', ...process.argv.slice(2)]) +main(undefined, { '--script-mode': true }) diff --git a/src/bin-script.ts b/src/bin-script.ts index 66e1113ee..47f6e1587 100644 --- a/src/bin-script.ts +++ b/src/bin-script.ts @@ -2,4 +2,4 @@ import { main } from './bin' -main(['--script-mode', ...process.argv.slice(2)]) +main(undefined, { '--script-mode': true }) diff --git a/src/bin-transpile.ts b/src/bin-transpile.ts index 241c15f43..68c1df1aa 100644 --- a/src/bin-transpile.ts +++ b/src/bin-transpile.ts @@ -2,4 +2,4 @@ import { main } from './bin' -main(['--transpile-only', ...process.argv.slice(2)]) +main(undefined, { '--transpile-only': true }) diff --git a/src/bin.ts b/src/bin.ts index 13c19c38a..bac650106 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -31,56 +31,59 @@ class EvalState { /** * Main `bin` functionality. */ -export function main (argv: string[]) { - const args = arg({ - // Node.js-like options. - '--eval': String, - '--interactive': Boolean, - '--print': Boolean, - '--require': [String], - - // CLI options. - '--help': Boolean, - '--script-mode': Boolean, - '--version': arg.COUNT, - - // Project options. - '--dir': String, - '--files': Boolean, - '--compiler': String, - '--compiler-options': parse, - '--project': String, - '--ignore-diagnostics': [String], - '--ignore': [String], - '--transpile-only': Boolean, - '--type-check': Boolean, - '--compiler-host': Boolean, - '--pretty': Boolean, - '--skip-project': Boolean, - '--skip-ignore': Boolean, - '--prefer-ts-exts': Boolean, - '--log-error': Boolean, - '--emit': Boolean, - - // Aliases. - '-e': '--eval', - '-i': '--interactive', - '-p': '--print', - '-r': '--require', - '-h': '--help', - '-s': '--script-mode', - '-v': '--version', - '-T': '--transpile-only', - '-H': '--compiler-host', - '-I': '--ignore', - '-P': '--project', - '-C': '--compiler', - '-D': '--ignore-diagnostics', - '-O': '--compiler-options' - }, { - argv, - stopAtPositional: true - }) +export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Record = {}) { + const args = { + ...entrypointArgs, + ...arg({ + // Node.js-like options. + '--eval': String, + '--interactive': Boolean, + '--print': Boolean, + '--require': [String], + + // CLI options. + '--help': Boolean, + '--script-mode': Boolean, + '--version': arg.COUNT, + + // Project options. + '--dir': String, + '--files': Boolean, + '--compiler': String, + '--compiler-options': parse, + '--project': String, + '--ignore-diagnostics': [String], + '--ignore': [String], + '--transpile-only': Boolean, + '--type-check': Boolean, + '--compiler-host': Boolean, + '--pretty': Boolean, + '--skip-project': Boolean, + '--skip-ignore': Boolean, + '--prefer-ts-exts': Boolean, + '--log-error': Boolean, + '--emit': Boolean, + + // Aliases. + '-e': '--eval', + '-i': '--interactive', + '-p': '--print', + '-r': '--require', + '-h': '--help', + '-s': '--script-mode', + '-v': '--version', + '-T': '--transpile-only', + '-H': '--compiler-host', + '-I': '--ignore', + '-P': '--project', + '-C': '--compiler', + '-D': '--ignore-diagnostics', + '-O': '--compiler-options' + }, { + argv, + stopAtPositional: true + }) + } // Only setting defaults for CLI-specific flags // Anything passed to `register()` can be `undefined`; `create()` will apply @@ -509,5 +512,5 @@ function hasOwnProperty (object: any, property: string): boolean { } if (require.main === module) { - main(process.argv.slice(2)) + main() } From d0468792ebbbd16eb62755124d5be22223ab2ba8 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 3 Nov 2020 10:12:10 -0500 Subject: [PATCH 073/113] allow typeCheck cli flag to override transpileOnly tsconfig flag (#1142) --- src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index e2b759afc..491f7f4dc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -447,7 +447,8 @@ export function create (rawOptions: CreateOptions = {}): Register { const readFile = options.readFile || ts.sys.readFile const fileExists = options.fileExists || ts.sys.fileExists - const transpileOnly = options.transpileOnly === true || options.typeCheck === false + // typeCheck can override transpileOnly, useful for CLI flag to override config file + const transpileOnly = options.transpileOnly === true && options.typeCheck !== true const transformers = options.transformers || undefined const ignoreDiagnostics = [ 6059, // "'rootDir' is expected to contain all source files." From 48fc3903b11921339ea98787ed2d99753e684fd2 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 8 Nov 2020 16:07:58 -0500 Subject: [PATCH 074/113] Tweak a comment that always confuses me (#1146) * Tweak a comment that always confuses me * Update index.ts --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 491f7f4dc..277378226 100644 --- a/src/index.ts +++ b/src/index.ts @@ -300,7 +300,7 @@ export const DEFAULTS: RegisterOptions = { } /** - * Default TypeScript compiler options required by `ts-node`. + * TypeScript compiler option values required by `ts-node` which cannot be overridden. */ const TS_NODE_COMPILER_OPTIONS = { sourceMap: true, From f848983623308d1688bef82287c993095315f1c3 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Thu, 12 Nov 2020 12:51:29 -0500 Subject: [PATCH 075/113] Remove coveralls reporting (#1149) * Remove coveralls reporting * Update package.json * Delete rewrite-coverage-paths.js * Update continuous-integration.yml --- .github/workflows/continuous-integration.yml | 18 -------------- package.json | 1 - scripts/rewrite-coverage-paths.js | 26 -------------------- 3 files changed, 45 deletions(-) delete mode 100644 scripts/rewrite-coverage-paths.js diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 6735af97a..3be3ed8d0 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -148,21 +148,3 @@ jobs: uses: codecov/codecov-action@v1 with: flags: ${{ matrix.os }},node_${{ matrix.nodeFlag }},typescript_${{ matrix.typescriptFlag }} - - run: npm run coverage-fix-paths - - run: npm run coverage-report - - name: Coveralls - if: ${{ always() }} - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.github_token }} - parallel: true - finish: - needs: test - runs-on: ubuntu-latest - if: ${{ always() }} - steps: - - name: Coveralls Finished - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.github_token }} - parallel-finished: true diff --git a/package.json b/package.json index 808cf56d9..2e6cc5a1d 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "test-spec": "mocha dist/**/*.spec.js -R spec --bail", "test-cov": "nyc mocha -- \"dist/**/*.spec.js\" -R spec --bail", "test": "npm run build && npm run lint && npm run test-cov", - "coverage-fix-paths": "node ./scripts/rewrite-coverage-paths.js", "coverage-report": "nyc report --reporter=lcov", "prepare": "npm run build-nopack" }, diff --git a/scripts/rewrite-coverage-paths.js b/scripts/rewrite-coverage-paths.js deleted file mode 100644 index 8793839cc..000000000 --- a/scripts/rewrite-coverage-paths.js +++ /dev/null @@ -1,26 +0,0 @@ -const {readdirSync, readFileSync, writeFileSync, statSync} = require('fs') -const {resolve, sep} = require('path') -const {mapKeys, each} = require('lodash') - -const fromPrefix = resolve(__dirname, '../tests/node_modules/ts-node') + sep -const toPrefix = resolve(__dirname, '..') + sep - -function rewritePath(input) { - if(input.indexOf(fromPrefix) === 0) { - return toPrefix + input.slice(fromPrefix.length) - } - return input -} - -const nycOutputDir = resolve(__dirname, '../.nyc_output') -for(const filename of readdirSync(nycOutputDir)) { - const filePath = resolve(nycOutputDir, filename) - if(statSync(filePath).isDirectory()) continue - let json = JSON.parse(readFileSync(filePath, 'utf8')) - json = mapKeys(json, (_, key) => rewritePath(key)) - each(json, obj => { - if(obj.path) - obj.path = rewritePath(obj.path) - }) - writeFileSync(filePath, JSON.stringify(json)) -} From c0a1598b17dccf8768dc580e859806b5e7cd0e65 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 22 Nov 2020 01:01:02 -0500 Subject: [PATCH 076/113] Upgrade to TS 4.1 (#1157) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 997c65b9a..df7e8885d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2354,9 +2354,9 @@ } }, "typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true }, "typescript-json-schema": { diff --git a/package.json b/package.json index 2e6cc5a1d..e04ad3548 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "semver": "^7.1.3", "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", - "typescript": "4.0.2", + "typescript": "4.1.2", "typescript-json-schema": "^0.42.0", "util.promisify": "^1.0.1" }, From 8b9489a8cd6c9eaeab40e0154a2e28e36a843f0d Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 22 Nov 2020 01:03:29 -0500 Subject: [PATCH 077/113] tweak codecov minimum coverage rules (#1159) --- codecov.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/codecov.yml b/codecov.yml index 28ca33092..fd87799a9 100644 --- a/codecov.yml +++ b/codecov.yml @@ -2,3 +2,14 @@ fixes: # Remap from npm-installed ts-node to root of project # This can take the place of ./scripts/rewrite-coverage-paths.js - "tests/node_modules/ts-node/::" + +coverage: + status: + patch: + default: + # Do not fail when `patch` coverage is low. When this fails, it is misleading and not necessarily bad. + # For example if a patch changes 2 lines, and only one is covered, then patch coverage is 50%. + target: 0% + project: + default: + threshold: 1% From a7aa0af9aefae1a7d801bbfe969148866c852a5c Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 22 Nov 2020 01:18:07 -0500 Subject: [PATCH 078/113] Switch from bundled createRequire shim to npm "create-require" (#1156) * Switch from bundled createRequire shim to npm create-require * Fix linter failures --- dist-raw/node-createrequire.js | 29 ----------------------------- package-lock.json | 5 +++++ package.json | 1 + src/index.spec.ts | 5 +++-- src/index.ts | 14 ++++---------- tsconfig.json | 2 +- 6 files changed, 14 insertions(+), 42 deletions(-) delete mode 100644 dist-raw/node-createrequire.js diff --git a/dist-raw/node-createrequire.js b/dist-raw/node-createrequire.js deleted file mode 100644 index 649deb10d..000000000 --- a/dist-raw/node-createrequire.js +++ /dev/null @@ -1,29 +0,0 @@ -// Extracted from https://github.com/nodejs/node/blob/ec2ffd6b9d255e19818b6949d2f7dc7ac70faee9/lib/internal/modules/cjs/loader.js -// then modified to suit our needs - -const path = require('path'); -const Module = require('module'); - -exports.createRequireFromPath = createRequireFromPath; - -function createRequireFromPath(filename) { - // Allow a directory to be passed as the filename - const trailingSlash = - filename.endsWith('/') || (isWindows && filename.endsWith('\\')); - - const proxyPath = trailingSlash ? - path.join(filename, 'noop.js') : - filename; - - const m = new Module(proxyPath); - m.filename = proxyPath; - - m.paths = Module._nodeModulePaths(m.path); - return makeRequireFunction(m, proxyPath); -} - -// This trick is much smaller than copy-pasting from https://github.com/nodejs/node/blob/ec2ffd6b9d255e19818b6949d2f7dc7ac70faee9/lib/internal/modules/cjs/helpers.js#L32-L101 -function makeRequireFunction(module, filename) { - module._compile('module.exports = require;', filename) - return mod.exports -} diff --git a/package-lock.json b/package-lock.json index df7e8885d..d7a2f0d25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -709,6 +709,11 @@ "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", "dev": true }, + "create-require": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.0.tgz", + "integrity": "sha512-yEFVS7dQjDXp5iOEtWisN4uFmL+pUTyIaEizKda9Eb77XX58p6pgFOLAPaBCP+IR6ZPZ1jgJLAuf+ABk0zXYBQ==" + }, "cross-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", diff --git a/package.json b/package.json index e04ad3548..7bc36e5ad 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,7 @@ }, "dependencies": { "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.17", diff --git a/src/index.spec.ts b/src/index.spec.ts index 74a2959a4..58fc64c56 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -8,7 +8,8 @@ import type * as tsNodeTypes from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' -import { createRequire, createRequireFromPath } from 'module' +import type _createRequire from 'create-require' +const createRequire: typeof _createRequire = require('create-require') import { pathToFileURL } from 'url' import Module = require('module') @@ -22,7 +23,7 @@ const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ // `createRequire` does not exist on older node versions -const testsDirRequire = (createRequire || createRequireFromPath)(join(TEST_DIR, 'index.js')) // tslint:disable-line +const testsDirRequire = createRequire(join(TEST_DIR, 'index.js')) // tslint:disable-line // Set after ts-node is installed locally let { register, create, VERSION }: typeof tsNodeTypes = {} as any diff --git a/src/index.ts b/src/index.ts index 277378226..3c51f8094 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,10 @@ import { BaseError } from 'make-error' import * as util from 'util' import { fileURLToPath } from 'url' import type * as _ts from 'typescript' -import * as Module from 'module' +import { Module, createRequire as nodeCreateRequire, createRequireFromPath as nodeCreateRequireFromPath } from 'module' +import type _createRequire from 'create-require' +// tslint:disable-next-line +const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire /** * Does this version of node obey the package.json "type" field @@ -1215,12 +1218,3 @@ function getTokenAtPosition (ts: typeof _ts, sourceFile: _ts.SourceFile, positio return current } } - -let nodeCreateRequire: (path: string) => NodeRequire -function createRequire (filename: string) { - if (!nodeCreateRequire) { - // tslint:disable-next-line - nodeCreateRequire = Module.createRequire || Module.createRequireFromPath || require('../dist-raw/node-createrequire').createRequireFromPath - } - return nodeCreateRequire(filename) -} diff --git a/tsconfig.json b/tsconfig.json index 465293630..0132c19cf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "$schema": "./tsconfig.schemastore-schema.json", "compilerOptions": { "target": "es2015", - "lib": ["es2015"], + "lib": ["es2015", "dom"], "rootDir": "src", "outDir": "dist", "module": "commonjs", From c11aa8ae59259d5b0ad17fe4b342e2b8782cea32 Mon Sep 17 00:00:00 2001 From: Fran Dios Date: Sat, 28 Nov 2020 05:11:58 +0900 Subject: [PATCH 079/113] Fix: Keep search in resolveReplacementExtensions (#1165) * Fix: Keep search in resolveReplacementExtensions * Test: bypass import cache --- dist-raw/node-esm-resolve-implementation.js | 3 ++- src/index.spec.ts | 9 +++++++++ tests/esm-import-cache/index.ts | 4 ++++ tests/esm-import-cache/log1.ts | 1 + tests/esm-import-cache/log2.ts | 1 + tests/esm-import-cache/package.json | 3 +++ tests/esm-import-cache/tsconfig.json | 7 +++++++ 7 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 tests/esm-import-cache/index.ts create mode 100644 tests/esm-import-cache/log1.ts create mode 100644 tests/esm-import-cache/log2.ts create mode 100644 tests/esm-import-cache/package.json create mode 100644 tests/esm-import-cache/tsconfig.json diff --git a/dist-raw/node-esm-resolve-implementation.js b/dist-raw/node-esm-resolve-implementation.js index ef9cd106e..538d00ac3 100644 --- a/dist-raw/node-esm-resolve-implementation.js +++ b/dist-raw/node-esm-resolve-implementation.js @@ -307,7 +307,8 @@ function resolveReplacementExtensions(search) { const pathnameWithoutExtension = search.pathname.slice(0, search.pathname.length - 3); for (let i = 0; i < replacementExtensions.length; i++) { const extension = replacementExtensions[i]; - const guess = new URL(`${pathnameWithoutExtension}${extension}`, search); + const guess = new URL(search.toString()); + guess.pathname = `${pathnameWithoutExtension}${extension}`; if (fileExists(guess)) return guess; } } diff --git a/src/index.spec.ts b/src/index.spec.ts index 58fc64c56..bed91dd22 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -932,6 +932,15 @@ describe('ts-node', function () { }) }) + it('should bypass import cache when changing search params', (done) => { + exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-import-cache') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('log1\nlog2\nlog2\n') + + return done() + }) + }) + it('should support transpile only mode via dedicated loader entrypoint', (done) => { exec(`${cmd}/transpile-only index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { expect(err).to.equal(null) diff --git a/tests/esm-import-cache/index.ts b/tests/esm-import-cache/index.ts new file mode 100644 index 000000000..5de8f1dac --- /dev/null +++ b/tests/esm-import-cache/index.ts @@ -0,0 +1,4 @@ +import './log1.js' +import './log1.js' +import './log2.js' +import './log2.js?bust' diff --git a/tests/esm-import-cache/log1.ts b/tests/esm-import-cache/log1.ts new file mode 100644 index 000000000..e33d05b5e --- /dev/null +++ b/tests/esm-import-cache/log1.ts @@ -0,0 +1 @@ +console.log('log1') diff --git a/tests/esm-import-cache/log2.ts b/tests/esm-import-cache/log2.ts new file mode 100644 index 000000000..efc53f2eb --- /dev/null +++ b/tests/esm-import-cache/log2.ts @@ -0,0 +1 @@ +console.log('log2') diff --git a/tests/esm-import-cache/package.json b/tests/esm-import-cache/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/esm-import-cache/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/esm-import-cache/tsconfig.json b/tests/esm-import-cache/tsconfig.json new file mode 100644 index 000000000..c5272e687 --- /dev/null +++ b/tests/esm-import-cache/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "ESNext", + "allowJs": true, + "moduleResolution": "node" + } +} From c4a6a026434f8e757857baed00261d67cbd13212 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 1 Dec 2020 00:17:19 -0500 Subject: [PATCH 080/113] Update to latest copy-paste of node's ESM resolve implementation (#1167) * add raw/* copy of latest node's latest esm resolve.js for convenient diffing * auto-applied patch; needs manual application of rejected hunks * Merge latest dist-raw from node v15.3.0 * replace optional chaining operator with legacy replacement compatible with node 13 * fix broken import * fix botched merge * More copy-pasting from node's source code; add test coverage for reading package.json exports field --- .gitignore | 3 +- dist-raw/node-cjs-loader-utils.js | 30 +- dist-raw/node-errors.js | 21 + dist-raw/node-esm-resolve-implementation.js | 717 +++++++++----- dist-raw/node-internal-fs.js | 22 + dist-raw/node-options.js | 18 +- dist-raw/node-package-json-reader.js | 44 + dist-raw/node-primordials.js | 22 + package.json | 2 +- ...de-esm-resolve-implementation-v13.12.0.js} | 0 ...node-esm-resolve-implementation-v15.3.0.js | 899 ++++++++++++++++++ src/index.spec.ts | 8 +- tests/esm-node-resolver/index.ts | 3 +- .../node_modules/libfoo/entrypoint.js | 1 + .../node_modules/libfoo/index.d.ts | 2 + .../node_modules/libfoo/package.json | 6 + tests/esm/index.ts | 3 +- tests/esm/node_modules/libfoo/entrypoint.js | 1 + tests/esm/node_modules/libfoo/index.d.ts | 2 + tests/esm/node_modules/libfoo/package.json | 6 + tests/esm/tsconfig.json | 3 +- 21 files changed, 1530 insertions(+), 283 deletions(-) create mode 100644 dist-raw/node-errors.js create mode 100644 dist-raw/node-internal-fs.js create mode 100644 dist-raw/node-package-json-reader.js create mode 100644 dist-raw/node-primordials.js rename raw/{node-esm-resolve-implementation.js => node-esm-resolve-implementation-v13.12.0.js} (100%) create mode 100644 raw/node-esm-resolve-implementation-v15.3.0.js create mode 100644 tests/esm-node-resolver/node_modules/libfoo/entrypoint.js create mode 100644 tests/esm-node-resolver/node_modules/libfoo/index.d.ts create mode 100644 tests/esm-node-resolver/node_modules/libfoo/package.json create mode 100644 tests/esm/node_modules/libfoo/entrypoint.js create mode 100644 tests/esm/node_modules/libfoo/index.d.ts create mode 100644 tests/esm/node_modules/libfoo/package.json diff --git a/.gitignore b/.gitignore index 54fca00d2..483b6923a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -node_modules/ +/node_modules/ +/tests/node_modules/ .nyc_output/ coverage/ .DS_Store diff --git a/dist-raw/node-cjs-loader-utils.js b/dist-raw/node-cjs-loader-utils.js index 0c5fabf9c..029cf5f77 100644 --- a/dist-raw/node-cjs-loader-utils.js +++ b/dist-raw/node-cjs-loader-utils.js @@ -3,12 +3,13 @@ // Each function and variable below must have a comment linking to the source in node's github repo. const path = require('path'); -const fs = require('fs'); +const packageJsonReader = require('./node-package-json-reader'); +const {JSONParse} = require('./node-primordials'); module.exports.assertScriptCanLoadAsCJSImpl = assertScriptCanLoadAsCJSImpl; // copied from Module._extensions['.js'] -// https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L1211-L1217 +// https://github.com/nodejs/node/blob/v15.3.0/lib/internal/modules/cjs/loader.js#L1113-L1120 function assertScriptCanLoadAsCJSImpl(filename) { const pkg = readPackageScope(filename); // Function require shouldn't be used in ES modules. @@ -41,31 +42,27 @@ function readPackageScope(checkPath) { // Copied from https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L249 const packageJsonCache = new Map(); -// Copied from https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L251-L283 +// Copied from https://github.com/nodejs/node/blob/v15.3.0/lib/internal/modules/cjs/loader.js#L275-L304 function readPackage(requestPath) { const jsonPath = path.resolve(requestPath, 'package.json'); const existing = packageJsonCache.get(jsonPath); if (existing !== undefined) return existing; - const json = internalModuleReadJSON(path.toNamespacedPath(jsonPath)); + const result = packageJsonReader.read(jsonPath); + const json = result.containsKeys === false ? '{}' : result.string; if (json === undefined) { packageJsonCache.set(jsonPath, false); return false; } - // TODO Related to `--experimental-policy`? Disabling for now - // if (manifest) { - // const jsonURL = pathToFileURL(jsonPath); - // manifest.assertIntegrity(jsonURL, json); - // } - try { - const parsed = JSON.parse(json); + const parsed = JSONParse(json); const filtered = { name: parsed.name, main: parsed.main, exports: parsed.exports, + imports: parsed.imports, type: parsed.type }; packageJsonCache.set(jsonPath, filtered); @@ -77,17 +74,6 @@ function readPackage(requestPath) { } } -// In node's core, this is implemented in C -// https://github.com/nodejs/node/blob/e9f293750760d59243020d0376edf242c9a26b67/src/node_file.cc#L845-L939 -function internalModuleReadJSON(path) { - try { - return fs.readFileSync(path, 'utf8') - } catch (e) { - if (e.code === 'ENOENT') return undefined - throw e - } -} - // Native ERR_REQUIRE_ESM Error is declared here: // https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/errors.js#L1294-L1313 // Error class factory is implemented here: diff --git a/dist-raw/node-errors.js b/dist-raw/node-errors.js new file mode 100644 index 000000000..fefcd3ec7 --- /dev/null +++ b/dist-raw/node-errors.js @@ -0,0 +1,21 @@ +exports.codes = { + ERR_INPUT_TYPE_NOT_ALLOWED: createErrorCtor('ERR_INPUT_TYPE_NOT_ALLOWED'), + ERR_INVALID_ARG_VALUE: createErrorCtor('ERR_INVALID_ARG_VALUE'), + ERR_INVALID_MODULE_SPECIFIER: createErrorCtor('ERR_INVALID_MODULE_SPECIFIER'), + ERR_INVALID_PACKAGE_CONFIG: createErrorCtor('ERR_INVALID_PACKAGE_CONFIG'), + ERR_INVALID_PACKAGE_TARGET: createErrorCtor('ERR_INVALID_PACKAGE_TARGET'), + ERR_MANIFEST_DEPENDENCY_MISSING: createErrorCtor('ERR_MANIFEST_DEPENDENCY_MISSING'), + ERR_MODULE_NOT_FOUND: createErrorCtor('ERR_MODULE_NOT_FOUND'), + ERR_PACKAGE_IMPORT_NOT_DEFINED: createErrorCtor('ERR_PACKAGE_IMPORT_NOT_DEFINED'), + ERR_PACKAGE_PATH_NOT_EXPORTED: createErrorCtor('ERR_PACKAGE_PATH_NOT_EXPORTED'), + ERR_UNSUPPORTED_DIR_IMPORT: createErrorCtor('ERR_UNSUPPORTED_DIR_IMPORT'), + ERR_UNSUPPORTED_ESM_URL_SCHEME: createErrorCtor('ERR_UNSUPPORTED_ESM_URL_SCHEME'), +} + +function createErrorCtor(name) { + return class CustomError extends Error { + constructor(...args) { + super([name, ...args].join(' ')) + } + } +} diff --git a/dist-raw/node-esm-resolve-implementation.js b/dist-raw/node-esm-resolve-implementation.js index 538d00ac3..b57090002 100644 --- a/dist-raw/node-esm-resolve-implementation.js +++ b/dist-raw/node-esm-resolve-implementation.js @@ -1,4 +1,4 @@ -// Copied from https://raw.githubusercontent.com/nodejs/node/v13.12.0/lib/internal/modules/esm/resolve.js +// Copied from https://raw.githubusercontent.com/nodejs/node/v15.3.0/lib/internal/modules/esm/resolve.js // Then modified to suite our needs. // Formatting is intentionally bad to keep the diff as small as possible, to make it easier to merge // upstream changes and understand our modifications. @@ -18,31 +18,27 @@ const builtinModuleProtocol = nodeMajor > 14 || ( const { ArrayIsArray, + ArrayPrototypeJoin, + ArrayPrototypeShift, JSONParse, JSONStringify, + ObjectFreeze, ObjectGetOwnPropertyNames, ObjectPrototypeHasOwnProperty, + // RegExp, + RegExpPrototypeTest, SafeMap, + SafeSet, + // String, StringPrototypeEndsWith, - StringPrototypeIncludes, StringPrototypeIndexOf, + StringPrototypeLastIndexOf, + StringPrototypeReplace, StringPrototypeSlice, + StringPrototypeSplit, StringPrototypeStartsWith, StringPrototypeSubstr, -} = { - ArrayIsArray: Array.isArray, - JSONParse: JSON.parse, - JSONStringify: JSON.stringify, - ObjectGetOwnPropertyNames: Object.getOwnPropertyNames, - ObjectPrototypeHasOwnProperty: (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop), - SafeMap: Map, - StringPrototypeEndsWith: (str, ...rest) => String.prototype.endsWith.apply(str, rest), - StringPrototypeIncludes: (str, ...rest) => String.prototype.includes.apply(str, rest), - StringPrototypeIndexOf: (str, ...rest) => String.prototype.indexOf.apply(str, rest), - StringPrototypeSlice: (str, ...rest) => String.prototype.slice.apply(str, rest), - StringPrototypeStartsWith: (str, ...rest) => String.prototype.startsWith.apply(str, rest), - StringPrototypeSubstr: (str, ...rest) => String.prototype.substr.apply(str, rest), -} // node pulls from `primordials` object +} = require('./node-primordials'); // const internalFS = require('internal/fs/utils'); // const { NativeModule } = require('internal/bootstrap/loaders'); @@ -53,18 +49,19 @@ const NativeModule = { } } const { - closeSync, - fstatSync, - openSync, - readFileSync, realpathSync, statSync, Stats, } = require('fs'); // const { getOptionValue } = require('internal/options'); const { getOptionValue } = require('./node-options'); -const { sep } = require('path'); - +// // Do not eagerly grab .manifest, it may be in TDZ +// const policy = getOptionValue('--experimental-policy') ? +// require('internal/process/policy') : +// null; +// disabled for now. I am not sure if/how we should support this +const policy = null; +const { sep, relative } = require('path'); const preserveSymlinks = getOptionValue('--preserve-symlinks'); const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); const typeFlag = getOptionValue('--input-type'); @@ -72,34 +69,75 @@ const typeFlag = getOptionValue('--input-type'); const { URL, pathToFileURL, fileURLToPath } = require('url'); const { ERR_INPUT_TYPE_NOT_ALLOWED, + ERR_INVALID_ARG_VALUE, ERR_INVALID_MODULE_SPECIFIER, ERR_INVALID_PACKAGE_CONFIG, ERR_INVALID_PACKAGE_TARGET, + ERR_MANIFEST_DEPENDENCY_MISSING, ERR_MODULE_NOT_FOUND, + ERR_PACKAGE_IMPORT_NOT_DEFINED, ERR_PACKAGE_PATH_NOT_EXPORTED, + ERR_UNSUPPORTED_DIR_IMPORT, ERR_UNSUPPORTED_ESM_URL_SCHEME, // } = require('internal/errors').codes; -} = { - ERR_INPUT_TYPE_NOT_ALLOWED: createErrorCtor('ERR_INPUT_TYPE_NOT_ALLOWED'), - ERR_INVALID_MODULE_SPECIFIER: createErrorCtor('ERR_INVALID_MODULE_SPECIFIER'), - ERR_INVALID_PACKAGE_CONFIG: createErrorCtor('ERR_INVALID_PACKAGE_CONFIG'), - ERR_INVALID_PACKAGE_TARGET: createErrorCtor('ERR_INVALID_PACKAGE_TARGET'), - ERR_MODULE_NOT_FOUND: createErrorCtor('ERR_MODULE_NOT_FOUND'), - ERR_PACKAGE_PATH_NOT_EXPORTED: createErrorCtor('ERR_PACKAGE_PATH_NOT_EXPORTED'), - ERR_UNSUPPORTED_ESM_URL_SCHEME: createErrorCtor('ERR_UNSUPPORTED_ESM_URL_SCHEME'), -} -function createErrorCtor(name) { - return class CustomError extends Error { - constructor(...args) { - super([name, ...args].join(' ')) - } - } -} +} = require('./node-errors').codes; + +// const { Module: CJSModule } = require('internal/modules/cjs/loader'); +const CJSModule = Module; + +// const packageJsonReader = require('internal/modules/package_json_reader'); +const packageJsonReader = require('./node-package-json-reader'); +const userConditions = getOptionValue('--conditions'); +const DEFAULT_CONDITIONS = ObjectFreeze(['node', 'import', ...userConditions]); +const DEFAULT_CONDITIONS_SET = new SafeSet(DEFAULT_CONDITIONS); + +const pendingDeprecation = getOptionValue('--pending-deprecation'); function createResolve(opts) { // TODO receive cached fs implementations here const {tsExtensions, jsExtensions, preferTsExts} = opts; +const emittedPackageWarnings = new SafeSet(); +function emitFolderMapDeprecation(match, pjsonUrl, isExports, base) { + const pjsonPath = fileURLToPath(pjsonUrl); + if (!pendingDeprecation) { + const nodeModulesIndex = StringPrototypeLastIndexOf(pjsonPath, + '/node_modules/'); + if (nodeModulesIndex !== -1) { + const afterNodeModulesPath = StringPrototypeSlice(pjsonPath, + nodeModulesIndex + 14, + -13); + try { + const { packageSubpath } = parsePackageName(afterNodeModulesPath); + if (packageSubpath === '.') + return; + } catch {} + } + } + if (emittedPackageWarnings.has(pjsonPath + '|' + match)) + return; + emittedPackageWarnings.add(pjsonPath + '|' + match); + process.emitWarning( + `Use of deprecated folder mapping "${match}" in the ${isExports ? + '"exports"' : '"imports"'} field module resolution of the package at ${ + pjsonPath}${base ? ` imported from ${fileURLToPath(base)}` : ''}.\n` + + `Update this package.json to use a subpath pattern like "${match}*".`, + 'DeprecationWarning', + 'DEP0148' + ); +} + +function getConditionsSet(conditions) { + if (conditions !== undefined && conditions !== DEFAULT_CONDITIONS) { + if (!ArrayIsArray(conditions)) { + throw new ERR_INVALID_ARG_VALUE('conditions', conditions, + 'expected an array'); + } + return new SafeSet(conditions); + } + return DEFAULT_CONDITIONS_SET; +} + const realpathCache = new SafeMap(); const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ @@ -111,39 +149,21 @@ function tryStatSync(path) { } } -function readIfFile(path) { - let fd; - try { - fd = openSync(path, 'r'); - } catch { - return undefined; - } - try { - if (!fstatSync(fd).isFile()) return undefined; - return readFileSync(fd, 'utf8'); - } finally { - closeSync(fd); - } -} - -function getPackageConfig(path, base) { +function getPackageConfig(path, specifier, base) { const existing = packageJSONCache.get(path); if (existing !== undefined) { - if (!existing.isValid) { - throw new ERR_INVALID_PACKAGE_CONFIG(path, fileURLToPath(base), false); - } return existing; } - - const source = readIfFile(path); + const source = packageJsonReader.read(path).string; if (source === undefined) { const packageConfig = { + pjsonPath: path, exists: false, main: undefined, name: undefined, - isValid: true, type: 'none', - exports: undefined + exports: undefined, + imports: undefined, }; packageJSONCache.set(path, packageConfig); return packageConfig; @@ -152,45 +172,43 @@ function getPackageConfig(path, base) { let packageJSON; try { packageJSON = JSONParse(source); - } catch { - const packageConfig = { - exists: true, - main: undefined, - name: undefined, - isValid: false, - type: 'none', - exports: undefined - }; - packageJSONCache.set(path, packageConfig); - return packageConfig; + } catch (error) { + throw new ERR_INVALID_PACKAGE_CONFIG( + path, + (base ? `"${specifier}" from ` : '') + fileURLToPath(base || specifier), + error.message + ); } - let { main, name, type } = packageJSON; + let { imports, main, name, type } = packageJSON; const { exports } = packageJSON; + if (typeof imports !== 'object' || imports === null) imports = undefined; if (typeof main !== 'string') main = undefined; if (typeof name !== 'string') name = undefined; // Ignore unknown types for forwards compatibility if (type !== 'module' && type !== 'commonjs') type = 'none'; const packageConfig = { + pjsonPath: path, exists: true, main, name, - isValid: true, type, - exports + exports, + imports, }; packageJSONCache.set(path, packageConfig); return packageConfig; } -function getPackageScopeConfig(resolved, base) { +function getPackageScopeConfig(resolved) { let packageJSONUrl = new URL('./package.json', resolved); while (true) { const packageJSONPath = packageJSONUrl.pathname; if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) break; - const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), base); + const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), + resolved); if (packageConfig.exists) return packageConfig; const lastPackageJSONUrl = packageJSONUrl; @@ -200,15 +218,17 @@ function getPackageScopeConfig(resolved, base) { // (can't just check "/package.json" for Windows support). if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; } + const packageJSONPath = fileURLToPath(packageJSONUrl); const packageConfig = { + pjsonPath: packageJSONPath, exists: false, main: undefined, name: undefined, - isValid: true, type: 'none', - exports: undefined + exports: undefined, + imports: undefined, }; - packageJSONCache.set(fileURLToPath(packageJSONUrl), packageConfig); + packageJSONCache.set(packageJSONPath, packageConfig); return packageConfig; } @@ -224,7 +244,7 @@ function fileExists(url) { return tryStatSync(fileURLToPath(url)).isFile(); } -function legacyMainResolve(packageJSONUrl, packageConfig) { +function legacyMainResolve(packageJSONUrl, packageConfig, base) { let guess; if (packageConfig.main !== undefined) { // Note: fs check redundances will be handled by Descriptor cache here. @@ -269,7 +289,8 @@ function legacyMainResolve(packageJSONUrl, packageConfig) { return guess; } // Not found. - return undefined; + throw new ERR_MODULE_NOT_FOUND( + fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); } function resolveExtensionsWithTryExactName(search) { @@ -319,119 +340,166 @@ function resolveIndex(search) { return resolveExtensions(new URL('index', search)); } +const encodedSepRegEx = /%2F|%2C/i; function finalizeResolution(resolved, base) { + if (RegExpPrototypeTest(encodedSepRegEx, resolved.pathname)) + throw new ERR_INVALID_MODULE_SPECIFIER( + resolved.pathname, 'must not include encoded "/" or "\\" characters', + fileURLToPath(base)); + if (getOptionValue('--experimental-specifier-resolution') === 'node') { + const path = fileURLToPath(resolved); let file = resolveExtensionsWithTryExactName(resolved); if (file !== undefined) return file; - if (!StringPrototypeEndsWith(resolved.pathname, '/')) { - file = resolveIndex(new URL(`${resolved.pathname}/`, base)); + if (!StringPrototypeEndsWith(path, '/')) { + file = resolveIndex(new URL(`${resolved}/`)); + if (file !== undefined) return file; } else { - file = resolveIndex(resolved); + return resolveIndex(resolved) || resolved; } - if (file !== undefined) return file; throw new ERR_MODULE_NOT_FOUND( resolved.pathname, fileURLToPath(base), 'module'); } - if (StringPrototypeEndsWith(resolved.pathname, '/')) return resolved; - const file = resolveReplacementExtensions(resolved) || resolved; - const path = fileURLToPath(file); - if (!tryStatSync(path).isFile()) { - throw new ERR_MODULE_NOT_FOUND( - path || resolved.pathname, fileURLToPath(base), 'module'); + const stats = tryStatSync(StringPrototypeEndsWith(path, '/') ? + StringPrototypeSlice(path, -1) : path); + if (stats.isDirectory()) { + const err = new ERR_UNSUPPORTED_DIR_IMPORT(path, fileURLToPath(base)); + err.url = String(resolved); + throw err; + } else if (!stats.isFile()) { + throw new ERR_MODULE_NOT_FOUND( + path || resolved.pathname, fileURLToPath(base), 'module'); } return file; } +function throwImportNotDefined(specifier, packageJSONUrl, base) { + throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( + specifier, packageJSONUrl && fileURLToPath(new URL('.', packageJSONUrl)), + fileURLToPath(base)); +} + function throwExportsNotFound(subpath, packageJSONUrl, base) { throw new ERR_PACKAGE_PATH_NOT_EXPORTED( - fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); + fileURLToPath(new URL('.', packageJSONUrl)), subpath, + base && fileURLToPath(base)); } -function throwSubpathInvalid(subpath, packageJSONUrl, base) { - throw new ERR_INVALID_MODULE_SPECIFIER( - fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); +function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { + const reason = `request is not a valid subpath for the "${internal ? + 'imports' : 'exports'}" resolution of ${fileURLToPath(packageJSONUrl)}`; + throw new ERR_INVALID_MODULE_SPECIFIER(subpath, reason, + base && fileURLToPath(base)); } -function throwExportsInvalid( - subpath, target, packageJSONUrl, base) { +function throwInvalidPackageTarget( + subpath, target, packageJSONUrl, internal, base) { if (typeof target === 'object' && target !== null) { target = JSONStringify(target, null, ''); - } else if (ArrayIsArray(target)) { - target = `[${target}]`; } else { target = `${target}`; } throw new ERR_INVALID_PACKAGE_TARGET( - fileURLToPath(packageJSONUrl), null, subpath, target, fileURLToPath(base)); + fileURLToPath(new URL('.', packageJSONUrl)), subpath, target, + internal, base && fileURLToPath(base)); } -function resolveExportsTargetString( - target, subpath, match, packageJSONUrl, base) { - if (target[0] !== '.' || target[1] !== '/' || - (subpath !== '' && target[target.length - 1] !== '/')) { - throwExportsInvalid(match, target, packageJSONUrl, base); +const invalidSegmentRegEx = /(^|\\|\/)(\.\.?|node_modules)(\\|\/|$)/; +const patternRegEx = /\*/g; + +function resolvePackageTargetString( + target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { + if (subpath !== '' && !pattern && target[target.length - 1] !== '/') + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + + if (!StringPrototypeStartsWith(target, './')) { + if (internal && !StringPrototypeStartsWith(target, '../') && + !StringPrototypeStartsWith(target, '/')) { + let isURL = false; + try { + new URL(target); + isURL = true; + } catch {} + if (!isURL) { + const exportTarget = pattern ? + StringPrototypeReplace(target, patternRegEx, subpath) : + target + subpath; + return packageResolve(exportTarget, packageJSONUrl, conditions); + } + } + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); } + if (RegExpPrototypeTest(invalidSegmentRegEx, StringPrototypeSlice(target, 2))) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + const resolved = new URL(target, packageJSONUrl); const resolvedPath = resolved.pathname; const packagePath = new URL('.', packageJSONUrl).pathname; - if (!StringPrototypeStartsWith(resolvedPath, packagePath) || - StringPrototypeIncludes( - resolvedPath, '/node_modules/', packagePath.length - 1)) { - throwExportsInvalid(match, target, packageJSONUrl, base); - } + if (!StringPrototypeStartsWith(resolvedPath, packagePath)) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); if (subpath === '') return resolved; - const subpathResolved = new URL(subpath, resolved); - const subpathResolvedPath = subpathResolved.pathname; - if (!StringPrototypeStartsWith(subpathResolvedPath, resolvedPath) || - StringPrototypeIncludes(subpathResolvedPath, - '/node_modules/', packagePath.length - 1)) { - throwSubpathInvalid(match + subpath, packageJSONUrl, base); - } - return subpathResolved; + + if (RegExpPrototypeTest(invalidSegmentRegEx, subpath)) + throwInvalidSubpath(match + subpath, packageJSONUrl, internal, base); + + if (pattern) + return new URL(StringPrototypeReplace(resolved.href, patternRegEx, + subpath)); + return new URL(subpath, resolved); } -function isArrayIndex(key /* string */) { /* -> boolean */ +/** + * @param {string} key + * @returns {boolean} + */ +function isArrayIndex(key) { const keyNum = +key; if (`${keyNum}` !== key) return false; return keyNum >= 0 && keyNum < 0xFFFF_FFFF; } -function resolveExportsTarget( - packageJSONUrl, target, subpath, packageSubpath, base) { +function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, + base, pattern, internal, conditions) { if (typeof target === 'string') { - const resolved = resolveExportsTargetString( - target, subpath, packageSubpath, packageJSONUrl, base); - return finalizeResolution(resolved, base); + return resolvePackageTargetString( + target, subpath, packageSubpath, packageJSONUrl, base, pattern, internal, + conditions); } else if (ArrayIsArray(target)) { if (target.length === 0) - throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); + return null; let lastException; for (let i = 0; i < target.length; i++) { const targetItem = target[i]; let resolved; try { - resolved = resolveExportsTarget( - packageJSONUrl, targetItem, subpath, packageSubpath, base); + resolved = resolvePackageTarget( + packageJSONUrl, targetItem, subpath, packageSubpath, base, pattern, + internal, conditions); } catch (e) { lastException = e; - if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED' || - e.code === 'ERR_INVALID_PACKAGE_TARGET') { + if (e.code === 'ERR_INVALID_PACKAGE_TARGET') continue; - } throw e; } - - return finalizeResolution(resolved, base); + if (resolved === undefined) + continue; + if (resolved === null) { + lastException = null; + continue; + } + return resolved; } + if (lastException === undefined || lastException === null) + return lastException; throw lastException; } else if (typeof target === 'object' && target !== null) { const keys = ObjectGetOwnPropertyNames(target); @@ -439,26 +507,28 @@ function resolveExportsTarget( const key = keys[i]; if (isArrayIndex(key)) { throw new ERR_INVALID_PACKAGE_CONFIG( - fileURLToPath(packageJSONUrl), - '"exports" cannot contain numeric property keys'); + fileURLToPath(packageJSONUrl), base, + '"exports" cannot contain numeric property keys.'); } } for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if (key === 'node' || key === 'import' || key === 'default') { + if (key === 'default' || conditions.has(key)) { const conditionalTarget = target[key]; - try { - return resolveExportsTarget( - packageJSONUrl, conditionalTarget, subpath, packageSubpath, base); - } catch (e) { - if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') continue; - throw e; - } + const resolved = resolvePackageTarget( + packageJSONUrl, conditionalTarget, subpath, packageSubpath, base, + pattern, internal, conditions); + if (resolved === undefined) + continue; + return resolved; } } - throwExportsNotFound(packageSubpath, packageJSONUrl, base); + return undefined; + } else if (target === null) { + return null; } - throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); + throwInvalidPackageTarget(packageSubpath, target, packageJSONUrl, internal, + base); } function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { @@ -475,7 +545,7 @@ function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { isConditionalSugar = curIsConditionalSugar; } else if (isConditionalSugar !== curIsConditionalSugar) { throw new ERR_INVALID_PACKAGE_CONFIG( - fileURLToPath(packageJSONUrl), + fileURLToPath(packageJSONUrl), base, '"exports" cannot contain some keys starting with \'.\' and some not.' + ' The exports object must either be an object of package subpath keys' + ' or an object of main entry condition name keys only.'); @@ -484,89 +554,126 @@ function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { return isConditionalSugar; } - -function packageMainResolve(packageJSONUrl, packageConfig, base) { - if (packageConfig.exists) { - const exports = packageConfig.exports; - if (exports !== undefined) { - if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { - return resolveExportsTarget(packageJSONUrl, exports, '', '', base); - } else if (typeof exports === 'object' && exports !== null) { - const target = exports['.']; - if (target !== undefined) - return resolveExportsTarget(packageJSONUrl, target, '', '', base); - } - - throw new ERR_PACKAGE_PATH_NOT_EXPORTED(packageJSONUrl, '.'); - } - if (packageConfig.main !== undefined) { - const resolved = new URL(packageConfig.main, packageJSONUrl); - const path = fileURLToPath(resolved); - if (tryStatSync(path).isFile()) return resolved; - } - if (getOptionValue('--experimental-specifier-resolution') === 'node') { - if (packageConfig.main !== undefined) { - return finalizeResolution( - new URL(packageConfig.main, packageJSONUrl), base); - } else { - return finalizeResolution( - new URL('index', packageJSONUrl), base); - } - } - if (packageConfig.type !== 'module') { - return legacyMainResolve(packageJSONUrl, packageConfig); - } - } - - throw new ERR_MODULE_NOT_FOUND( - fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); -} - - +/** + * @param {URL} packageJSONUrl + * @param {string} packageSubpath + * @param {object} packageConfig + * @param {string} base + * @param {Set} conditions + * @returns {URL} + */ function packageExportsResolve( - packageJSONUrl, packageSubpath, packageConfig, base) /* -> URL */ { - const exports = packageConfig.exports; - if (exports === undefined || - isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { - throwExportsNotFound(packageSubpath, packageJSONUrl, base); - } - + packageJSONUrl, packageSubpath, packageConfig, base, conditions) { + let exports = packageConfig.exports; + if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) + exports = { '.': exports }; if (ObjectPrototypeHasOwnProperty(exports, packageSubpath)) { const target = exports[packageSubpath]; - const resolved = resolveExportsTarget( - packageJSONUrl, target, '', packageSubpath, base); - return finalizeResolution(resolved, base); + const resolved = resolvePackageTarget( + packageJSONUrl, target, '', packageSubpath, base, false, false, conditions + ); + if (resolved === null || resolved === undefined) + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + return { resolved, exact: true }; } let bestMatch = ''; const keys = ObjectGetOwnPropertyNames(exports); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - if (key[key.length - 1] !== '/') continue; - if (StringPrototypeStartsWith(packageSubpath, key) && + if (key[key.length - 1] === '*' && + StringPrototypeStartsWith(packageSubpath, + StringPrototypeSlice(key, 0, -1)) && + packageSubpath.length >= key.length && key.length > bestMatch.length) { bestMatch = key; + } else if (key[key.length - 1] === '/' && + StringPrototypeStartsWith(packageSubpath, key) && + key.length > bestMatch.length) { + bestMatch = key; } } if (bestMatch) { const target = exports[bestMatch]; - const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length); - const resolved = resolveExportsTarget( - packageJSONUrl, target, subpath, packageSubpath, base); - return finalizeResolution(resolved, base); + const pattern = bestMatch[bestMatch.length - 1] === '*'; + const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length - + (pattern ? 1 : 0)); + const resolved = resolvePackageTarget(packageJSONUrl, target, subpath, + bestMatch, base, pattern, false, + conditions); + if (resolved === null || resolved === undefined) + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + if (!pattern) + emitFolderMapDeprecation(bestMatch, packageJSONUrl, true, base); + return { resolved, exact: pattern }; } throwExportsNotFound(packageSubpath, packageJSONUrl, base); } +function packageImportsResolve(name, base, conditions) { + if (name === '#' || StringPrototypeStartsWith(name, '#/')) { + const reason = 'is not a valid internal imports specifier name'; + throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); + } + let packageJSONUrl; + const packageConfig = getPackageScopeConfig(base); + if (packageConfig.exists) { + packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); + const imports = packageConfig.imports; + if (imports) { + if (ObjectPrototypeHasOwnProperty(imports, name)) { + const resolved = resolvePackageTarget( + packageJSONUrl, imports[name], '', name, base, false, true, conditions + ); + if (resolved !== null) + return { resolved, exact: true }; + } else { + let bestMatch = ''; + const keys = ObjectGetOwnPropertyNames(imports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key[key.length - 1] === '*' && + StringPrototypeStartsWith(name, + StringPrototypeSlice(key, 0, -1)) && + name.length >= key.length && + key.length > bestMatch.length) { + bestMatch = key; + } else if (key[key.length - 1] === '/' && + StringPrototypeStartsWith(name, key) && + key.length > bestMatch.length) { + bestMatch = key; + } + } + + if (bestMatch) { + const target = imports[bestMatch]; + const pattern = bestMatch[bestMatch.length - 1] === '*'; + const subpath = StringPrototypeSubstr(name, bestMatch.length - + (pattern ? 1 : 0)); + const resolved = resolvePackageTarget( + packageJSONUrl, target, subpath, bestMatch, base, pattern, true, + conditions); + if (resolved !== null) { + if (!pattern) + emitFolderMapDeprecation(bestMatch, packageJSONUrl, false, base); + return { resolved, exact: pattern }; + } + } + } + } + } + throwImportNotDefined(name, packageJSONUrl, base); +} + function getPackageType(url) { - const packageConfig = getPackageScopeConfig(url, url); + const packageConfig = getPackageScopeConfig(url); return packageConfig.type; } -function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ +function parsePackageName(specifier, base) { let separatorIndex = StringPrototypeIndexOf(specifier, '/'); let validPackageName = true; let isScoped = false; @@ -594,35 +701,34 @@ function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ if (!validPackageName) { throw new ERR_INVALID_MODULE_SPECIFIER( - specifier, undefined, fileURLToPath(base)); + specifier, 'is not a valid package name', fileURLToPath(base)); } - const packageSubpath = separatorIndex === -1 ? - '' : '.' + StringPrototypeSlice(specifier, separatorIndex); + const packageSubpath = '.' + (separatorIndex === -1 ? '' : + StringPrototypeSlice(specifier, separatorIndex)); + + return { packageName, packageSubpath, isScoped }; +} + +/** + * @param {string} specifier + * @param {URL} base + * @param {Set} conditions + * @returns {URL} + */ +function packageResolve(specifier, base, conditions) { + const { packageName, packageSubpath, isScoped } = + parsePackageName(specifier, base); // ResolveSelf - const packageConfig = getPackageScopeConfig(base, base); + const packageConfig = getPackageScopeConfig(base); if (packageConfig.exists) { - // TODO(jkrems): Find a way to forward the pair/iterator already generated - // while executing GetPackageScopeConfig - let packageJSONUrl; - for (const [ filename, packageConfigCandidate ] of packageJSONCache) { - if (packageConfig === packageConfigCandidate) { - packageJSONUrl = pathToFileURL(filename); - break; - } - } - if (packageJSONUrl !== undefined && - packageConfig.name === packageName && - packageConfig.exports !== undefined) { - if (packageSubpath === './') { - return new URL('./', packageJSONUrl); - } else if (packageSubpath === '') { - return packageMainResolve(packageJSONUrl, packageConfig, base); - } else { - return packageExportsResolve( - packageJSONUrl, packageSubpath, packageConfig, base); - } + const packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); + if (packageConfig.name === packageName && + packageConfig.exports !== undefined && packageConfig.exports !== null) { + return packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base, conditions + ).resolved; } } @@ -631,8 +737,8 @@ function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ let packageJSONPath = fileURLToPath(packageJSONUrl); let lastPath; do { - const stat = tryStatSync( - StringPrototypeSlice(packageJSONPath, 0, packageJSONPath.length - 13)); + const stat = tryStatSync(StringPrototypeSlice(packageJSONPath, 0, + packageJSONPath.length - 13)); if (!stat.isDirectory()) { lastPath = packageJSONPath; packageJSONUrl = new URL((isScoped ? @@ -643,18 +749,14 @@ function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ } // Package match. - const packageConfig = getPackageConfig(packageJSONPath, base); - if (packageSubpath === './') { - return new URL('./', packageJSONUrl); - } else if (packageSubpath === '') { - return packageMainResolve(packageJSONUrl, packageConfig, base); - } else if (packageConfig.exports !== undefined) { + const packageConfig = getPackageConfig(packageJSONPath, specifier, base); + if (packageConfig.exports !== undefined && packageConfig.exports !== null) return packageExportsResolve( - packageJSONUrl, packageSubpath, packageConfig, base); - } else { - return finalizeResolution( - new URL(packageSubpath, packageJSONUrl), base); - } + packageJSONUrl, packageSubpath, packageConfig, base, conditions + ).resolved; + if (packageSubpath === '.') + return legacyMainResolve(packageJSONUrl, packageConfig, base); + return new URL(packageSubpath, packageJSONUrl); // Cross-platform root check. } while (packageJSONPath.length !== lastPath.length); @@ -663,9 +765,11 @@ function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base)); } -function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { - if (specifier === '') return false; - if (specifier[0] === '/') return true; +function isBareSpecifier(specifier) { + return specifier[0] && specifier[0] !== '/' && specifier[0] !== '.'; +} + +function isRelativeSpecifier(specifier) { if (specifier[0] === '.') { if (specifier.length === 1 || specifier[1] === '/') return true; if (specifier[1] === '.') { @@ -675,23 +779,104 @@ function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { return false; } -function moduleResolve(specifier /* string */, base /* URL */) { /* -> URL */ +function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { + if (specifier === '') return false; + if (specifier[0] === '/') return true; + return isRelativeSpecifier(specifier); +} + +/** + * @param {string} specifier + * @param {URL} base + * @param {Set} conditions + * @returns {URL} + */ +function moduleResolve(specifier, base, conditions) { // Order swapped from spec for minor perf gain. // Ok since relative URLs cannot parse as URLs. let resolved; if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { resolved = new URL(specifier, base); + } else if (specifier[0] === '#') { + ({ resolved } = packageImportsResolve(specifier, base, conditions)); } else { try { resolved = new URL(specifier); } catch { - return packageResolve(specifier, base); + resolved = packageResolve(specifier, base, conditions); } } return finalizeResolution(resolved, base); } -function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { +/** + * Try to resolve an import as a CommonJS module + * @param {string} specifier + * @param {string} parentURL + * @returns {boolean|string} + */ +function resolveAsCommonJS(specifier, parentURL) { + try { + const parent = fileURLToPath(parentURL); + const tmpModule = new CJSModule(parent, null); + tmpModule.paths = CJSModule._nodeModulePaths(parent); + + let found = CJSModule._resolveFilename(specifier, tmpModule, false); + + // If it is a relative specifier return the relative path + // to the parent + if (isRelativeSpecifier(specifier)) { + found = relative(parent, found); + // Add '.separator if the path does not start with '..separator' + // This should be a safe assumption because when loading + // esm modules there should be always a file specified so + // there should not be a specifier like '..' or '.' + if (!StringPrototypeStartsWith(found, `..${sep}`)) { + found = `.${sep}${found}`; + } + } else if (isBareSpecifier(specifier)) { + // If it is a bare specifier return the relative path within the + // module + const pkg = StringPrototypeSplit(specifier, '/')[0]; + const index = StringPrototypeIndexOf(found, pkg); + if (index !== -1) { + found = StringPrototypeSlice(found, index); + } + } + // Normalize the path separator to give a valid suggestion + // on Windows + if (process.platform === 'win32') { + found = StringPrototypeReplace(found, new RegExp(`\\${sep}`, 'g'), '/'); + } + return found; + } catch { + return false; + } +} + +function defaultResolve(specifier, context = {}, defaultResolveUnused) { + let { parentURL, conditions } = context; + if (parentURL && policy != null && policy.manifest) { + const redirects = policy.manifest.getDependencyMapper(parentURL); + if (redirects) { + const { resolve, reaction } = redirects; + const destination = resolve(specifier, new SafeSet(conditions)); + let missing = true; + if (destination === true) { + missing = false; + } else if (destination) { + const href = destination.href; + return { url: href }; + } + if (missing) { + reaction(new ERR_MANIFEST_DEPENDENCY_MISSING( + parentURL, + specifier, + ArrayPrototypeJoin([...conditions], ', ')) + ); + } + } + } let parsed; try { parsed = new URL(specifier); @@ -704,7 +889,7 @@ function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { if (parsed && parsed.protocol === builtinModuleProtocol) return { url: specifier }; if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') - throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(); + throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed); if (NativeModule.canBeRequiredByUsers(specifier)) { return { url: builtinModuleProtocol + specifier @@ -729,7 +914,32 @@ function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { throw new ERR_INPUT_TYPE_NOT_ALLOWED(); } - let url = moduleResolve(specifier, new URL(parentURL)); + conditions = getConditionsSet(conditions); + let url; + try { + url = moduleResolve(specifier, parentURL, conditions); + } catch (error) { + // Try to give the user a hint of what would have been the + // resolved CommonJS module + if (error.code === 'ERR_MODULE_NOT_FOUND' || + error.code === 'ERR_UNSUPPORTED_DIR_IMPORT') { + if (StringPrototypeStartsWith(specifier, 'file://')) { + specifier = fileURLToPath(specifier); + } + const found = resolveAsCommonJS(specifier, parentURL); + if (found) { + // Modify the stack and message string to include the hint + const lines = StringPrototypeSplit(error.stack, '\n'); + const hint = `Did you mean to import ${found}?`; + error.stack = + ArrayPrototypeShift(lines) + '\n' + + hint + '\n' + + ArrayPrototypeJoin(lines, '\n'); + error.message += `\n${hint}`; + } + } + throw error; + } if (isMain ? !preserveSymlinksMain : !preserveSymlinks) { const urlPath = fileURLToPath(url); @@ -737,7 +947,8 @@ function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { // [internalFS.realpathCacheKey]: realpathCache }); const old = url; - url = pathToFileURL(real + (urlPath.endsWith(sep) ? '/' : '')); + url = pathToFileURL( + real + (StringPrototypeEndsWith(urlPath, sep) ? '/' : '')); url.search = old.search; url.hash = old.hash; } @@ -746,10 +957,14 @@ function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { } return { + DEFAULT_CONDITIONS, defaultResolve, - getPackageType + encodedSepRegEx, + getPackageType, + packageExportsResolve, + packageImportsResolve }; } module.exports = { createResolve -} +}; diff --git a/dist-raw/node-internal-fs.js b/dist-raw/node-internal-fs.js new file mode 100644 index 000000000..d9a2528dd --- /dev/null +++ b/dist-raw/node-internal-fs.js @@ -0,0 +1,22 @@ +const fs = require('fs'); + +// In node's core, this is implemented in C +// https://github.com/nodejs/node/blob/v15.3.0/src/node_file.cc#L891-L985 +function internalModuleReadJSON(path) { + let string + try { + string = fs.readFileSync(path, 'utf8') + } catch (e) { + if (e.code === 'ENOENT') return [] + throw e + } + // Node's implementation checks for the presence of relevant keys: main, name, type, exports, imports + // Node does this for performance to skip unnecessary parsing. + // This would slow us down and, based on our usage, we can skip it. + const containsKeys = true + return [string, containsKeys] +} + +module.exports = { + internalModuleReadJSON +}; diff --git a/dist-raw/node-options.js b/dist-raw/node-options.js index 7a68872ce..0602a4769 100644 --- a/dist-raw/node-options.js +++ b/dist-raw/node-options.js @@ -14,8 +14,12 @@ function parseOptions() { '--preserve-symlinks-main': false, '--input-type': undefined, '--experimental-specifier-resolution': 'explicit', + '--experimental-policy': undefined, + '--conditions': [], + '--pending-deprecation': false, ...parseArgv(getNodeOptionsEnvArgv()), - ...parseArgv(process.execArgv) + ...parseArgv(process.execArgv), + ...getOptionValuesFromOtherEnvVars() } } } @@ -28,6 +32,9 @@ function parseArgv(argv) { '--experimental-specifier-resolution': String, // Legacy alias for node versions prior to 12.16 '--es-module-specifier-resolution': '--experimental-specifier-resolution', + '--experimental-policy': String, + '--conditions': [String], + '--pending-deprecation': Boolean }, { argv, permissive: true @@ -83,3 +90,12 @@ function ParseNodeOptionsEnvVar(node_options, errors) { } return env_argv; } + +// Get option values that can be specified via env vars besides NODE_OPTIONS +function getOptionValuesFromOtherEnvVars() { + const options = {}; + if(process.env.NODE_PENDING_DEPRECATION === '1') { + options['--pending-deprecation'] = true; + } + return options; +} diff --git a/dist-raw/node-package-json-reader.js b/dist-raw/node-package-json-reader.js new file mode 100644 index 000000000..1c36501cd --- /dev/null +++ b/dist-raw/node-package-json-reader.js @@ -0,0 +1,44 @@ +// copied from https://github.com/nodejs/node/blob/v15.3.0/lib/internal/modules/package_json_reader.js +'use strict'; + +const { SafeMap } = require('./node-primordials'); +const { internalModuleReadJSON } = require('./node-internal-fs'); +const { pathToFileURL } = require('url'); +const { toNamespacedPath } = require('path'); + +const cache = new SafeMap(); + +let manifest; + +/** + * @param {string} jsonPath + * @return {[string, boolean]} + */ +function read(jsonPath) { + if (cache.has(jsonPath)) { + return cache.get(jsonPath); + } + + const [string, containsKeys] = internalModuleReadJSON( + toNamespacedPath(jsonPath) + ); + const result = { string, containsKeys }; + const { getOptionValue } = require('./node-options'); + if (string !== undefined) { + if (manifest === undefined) { + // manifest = getOptionValue('--experimental-policy') ? + // require('internal/process/policy').manifest : + // null; + // disabled for now. I am not sure if/how we should support this + manifest = null; + } + if (manifest !== null) { + const jsonURL = pathToFileURL(jsonPath); + manifest.assertIntegrity(jsonURL, string); + } + } + cache.set(jsonPath, result); + return result; +} + +module.exports = { read }; diff --git a/dist-raw/node-primordials.js b/dist-raw/node-primordials.js new file mode 100644 index 000000000..eb4972d4d --- /dev/null +++ b/dist-raw/node-primordials.js @@ -0,0 +1,22 @@ +module.exports = { + ArrayIsArray: Array.isArray, + ArrayPrototypeJoin: (obj, separator) => Array.prototype.join.call(obj, separator), + ArrayPrototypeShift: (obj) => Array.prototype.shift.call(obj), + JSONParse: JSON.parse, + JSONStringify: JSON.stringify, + ObjectFreeze: Object.freeze, + ObjectGetOwnPropertyNames: Object.getOwnPropertyNames, + ObjectPrototypeHasOwnProperty: (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop), + RegExpPrototypeTest: (obj, string) => RegExp.prototype.test.call(obj, string), + SafeMap: Map, + SafeSet: Set, + StringPrototypeEndsWith: (str, ...rest) => String.prototype.endsWith.apply(str, rest), + StringPrototypeIncludes: (str, ...rest) => String.prototype.includes.apply(str, rest), + StringPrototypeLastIndexOf: (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest), + StringPrototypeIndexOf: (str, ...rest) => String.prototype.indexOf.apply(str, rest), + StringPrototypeReplace: (str, ...rest) => String.prototype.replace.apply(str, rest), + StringPrototypeSlice: (str, ...rest) => String.prototype.slice.apply(str, rest), + StringPrototypeSplit: (str, ...rest) => String.prototype.split.apply(str, rest), + StringPrototypeStartsWith: (str, ...rest) => String.prototype.startsWith.apply(str, rest), + StringPrototypeSubstr: (str, ...rest) => String.prototype.substr.apply(str, rest) +}; diff --git a/package.json b/package.json index 7bc36e5ad..a08b901d0 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "build-pack": "node ./scripts/build-pack.js", "test-spec": "mocha dist/**/*.spec.js -R spec --bail", "test-cov": "nyc mocha -- \"dist/**/*.spec.js\" -R spec --bail", - "test": "npm run build && npm run lint && npm run test-cov", + "test": "npm run build && npm run lint && npm run test-cov --", "coverage-report": "nyc report --reporter=lcov", "prepare": "npm run build-nopack" }, diff --git a/raw/node-esm-resolve-implementation.js b/raw/node-esm-resolve-implementation-v13.12.0.js similarity index 100% rename from raw/node-esm-resolve-implementation.js rename to raw/node-esm-resolve-implementation-v13.12.0.js diff --git a/raw/node-esm-resolve-implementation-v15.3.0.js b/raw/node-esm-resolve-implementation-v15.3.0.js new file mode 100644 index 000000000..8a5bc841a --- /dev/null +++ b/raw/node-esm-resolve-implementation-v15.3.0.js @@ -0,0 +1,899 @@ +'use strict'; + +const { + ArrayIsArray, + ArrayPrototypeJoin, + ArrayPrototypeShift, + JSONParse, + JSONStringify, + ObjectFreeze, + ObjectGetOwnPropertyNames, + ObjectPrototypeHasOwnProperty, + RegExp, + RegExpPrototypeTest, + SafeMap, + SafeSet, + String, + StringPrototypeEndsWith, + StringPrototypeIndexOf, + StringPrototypeLastIndexOf, + StringPrototypeReplace, + StringPrototypeSlice, + StringPrototypeSplit, + StringPrototypeStartsWith, + StringPrototypeSubstr, +} = primordials; +const internalFS = require('internal/fs/utils'); +const { NativeModule } = require('internal/bootstrap/loaders'); +const { + realpathSync, + statSync, + Stats, +} = require('fs'); +const { getOptionValue } = require('internal/options'); +// Do not eagerly grab .manifest, it may be in TDZ +const policy = getOptionValue('--experimental-policy') ? + require('internal/process/policy') : + null; +const { sep, relative } = require('path'); +const preserveSymlinks = getOptionValue('--preserve-symlinks'); +const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); +const typeFlag = getOptionValue('--input-type'); +const { URL, pathToFileURL, fileURLToPath } = require('internal/url'); +const { + ERR_INPUT_TYPE_NOT_ALLOWED, + ERR_INVALID_ARG_VALUE, + ERR_INVALID_MODULE_SPECIFIER, + ERR_INVALID_PACKAGE_CONFIG, + ERR_INVALID_PACKAGE_TARGET, + ERR_MANIFEST_DEPENDENCY_MISSING, + ERR_MODULE_NOT_FOUND, + ERR_PACKAGE_IMPORT_NOT_DEFINED, + ERR_PACKAGE_PATH_NOT_EXPORTED, + ERR_UNSUPPORTED_DIR_IMPORT, + ERR_UNSUPPORTED_ESM_URL_SCHEME, +} = require('internal/errors').codes; +const { Module: CJSModule } = require('internal/modules/cjs/loader'); + +const packageJsonReader = require('internal/modules/package_json_reader'); +const userConditions = getOptionValue('--conditions'); +const DEFAULT_CONDITIONS = ObjectFreeze(['node', 'import', ...userConditions]); +const DEFAULT_CONDITIONS_SET = new SafeSet(DEFAULT_CONDITIONS); + +const pendingDeprecation = getOptionValue('--pending-deprecation'); +const emittedPackageWarnings = new SafeSet(); +function emitFolderMapDeprecation(match, pjsonUrl, isExports, base) { + const pjsonPath = fileURLToPath(pjsonUrl); + if (!pendingDeprecation) { + const nodeModulesIndex = StringPrototypeLastIndexOf(pjsonPath, + '/node_modules/'); + if (nodeModulesIndex !== -1) { + const afterNodeModulesPath = StringPrototypeSlice(pjsonPath, + nodeModulesIndex + 14, + -13); + try { + const { packageSubpath } = parsePackageName(afterNodeModulesPath); + if (packageSubpath === '.') + return; + } catch {} + } + } + if (emittedPackageWarnings.has(pjsonPath + '|' + match)) + return; + emittedPackageWarnings.add(pjsonPath + '|' + match); + process.emitWarning( + `Use of deprecated folder mapping "${match}" in the ${isExports ? + '"exports"' : '"imports"'} field module resolution of the package at ${ + pjsonPath}${base ? ` imported from ${fileURLToPath(base)}` : ''}.\n` + + `Update this package.json to use a subpath pattern like "${match}*".`, + 'DeprecationWarning', + 'DEP0148' + ); +} + +function getConditionsSet(conditions) { + if (conditions !== undefined && conditions !== DEFAULT_CONDITIONS) { + if (!ArrayIsArray(conditions)) { + throw new ERR_INVALID_ARG_VALUE('conditions', conditions, + 'expected an array'); + } + return new SafeSet(conditions); + } + return DEFAULT_CONDITIONS_SET; +} + +const realpathCache = new SafeMap(); +const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ + +function tryStatSync(path) { + try { + return statSync(path); + } catch { + return new Stats(); + } +} + +function getPackageConfig(path, specifier, base) { + const existing = packageJSONCache.get(path); + if (existing !== undefined) { + return existing; + } + const source = packageJsonReader.read(path).string; + if (source === undefined) { + const packageConfig = { + pjsonPath: path, + exists: false, + main: undefined, + name: undefined, + type: 'none', + exports: undefined, + imports: undefined, + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; + } + + let packageJSON; + try { + packageJSON = JSONParse(source); + } catch (error) { + throw new ERR_INVALID_PACKAGE_CONFIG( + path, + (base ? `"${specifier}" from ` : '') + fileURLToPath(base || specifier), + error.message + ); + } + + let { imports, main, name, type } = packageJSON; + const { exports } = packageJSON; + if (typeof imports !== 'object' || imports === null) imports = undefined; + if (typeof main !== 'string') main = undefined; + if (typeof name !== 'string') name = undefined; + // Ignore unknown types for forwards compatibility + if (type !== 'module' && type !== 'commonjs') type = 'none'; + + const packageConfig = { + pjsonPath: path, + exists: true, + main, + name, + type, + exports, + imports, + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; +} + +function getPackageScopeConfig(resolved) { + let packageJSONUrl = new URL('./package.json', resolved); + while (true) { + const packageJSONPath = packageJSONUrl.pathname; + if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) + break; + const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), + resolved); + if (packageConfig.exists) return packageConfig; + + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new URL('../package.json', packageJSONUrl); + + // Terminates at root where ../package.json equals ../../package.json + // (can't just check "/package.json" for Windows support). + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; + } + const packageJSONPath = fileURLToPath(packageJSONUrl); + const packageConfig = { + pjsonPath: packageJSONPath, + exists: false, + main: undefined, + name: undefined, + type: 'none', + exports: undefined, + imports: undefined, + }; + packageJSONCache.set(packageJSONPath, packageConfig); + return packageConfig; +} + +/* + * Legacy CommonJS main resolution: + * 1. let M = pkg_url + (json main field) + * 2. TRY(M, M.js, M.json, M.node) + * 3. TRY(M/index.js, M/index.json, M/index.node) + * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node) + * 5. NOT_FOUND + */ +function fileExists(url) { + return tryStatSync(fileURLToPath(url)).isFile(); +} + +function legacyMainResolve(packageJSONUrl, packageConfig, base) { + let guess; + if (packageConfig.main !== undefined) { + // Note: fs check redundances will be handled by Descriptor cache here. + if (fileExists(guess = new URL(`./${packageConfig.main}`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.js`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.json`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}.node`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.js`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.json`, + packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL(`./${packageConfig.main}/index.node`, + packageJSONUrl))) { + return guess; + } + // Fallthrough. + } + if (fileExists(guess = new URL('./index.js', packageJSONUrl))) { + return guess; + } + // So fs. + if (fileExists(guess = new URL('./index.json', packageJSONUrl))) { + return guess; + } + if (fileExists(guess = new URL('./index.node', packageJSONUrl))) { + return guess; + } + // Not found. + throw new ERR_MODULE_NOT_FOUND( + fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); +} + +function resolveExtensionsWithTryExactName(search) { + if (fileExists(search)) return search; + return resolveExtensions(search); +} + +const extensions = ['.js', '.json', '.node', '.mjs']; +function resolveExtensions(search) { + for (let i = 0; i < extensions.length; i++) { + const extension = extensions[i]; + const guess = new URL(`${search.pathname}${extension}`, search); + if (fileExists(guess)) return guess; + } + return undefined; +} + +function resolveIndex(search) { + return resolveExtensions(new URL('index', search)); +} + +const encodedSepRegEx = /%2F|%2C/i; +function finalizeResolution(resolved, base) { + if (RegExpPrototypeTest(encodedSepRegEx, resolved.pathname)) + throw new ERR_INVALID_MODULE_SPECIFIER( + resolved.pathname, 'must not include encoded "/" or "\\" characters', + fileURLToPath(base)); + + const path = fileURLToPath(resolved); + if (getOptionValue('--experimental-specifier-resolution') === 'node') { + let file = resolveExtensionsWithTryExactName(resolved); + if (file !== undefined) return file; + if (!StringPrototypeEndsWith(path, '/')) { + file = resolveIndex(new URL(`${resolved}/`)); + if (file !== undefined) return file; + } else { + return resolveIndex(resolved) || resolved; + } + throw new ERR_MODULE_NOT_FOUND( + resolved.pathname, fileURLToPath(base), 'module'); + } + + const stats = tryStatSync(StringPrototypeEndsWith(path, '/') ? + StringPrototypeSlice(path, -1) : path); + if (stats.isDirectory()) { + const err = new ERR_UNSUPPORTED_DIR_IMPORT(path, fileURLToPath(base)); + err.url = String(resolved); + throw err; + } else if (!stats.isFile()) { + throw new ERR_MODULE_NOT_FOUND( + path || resolved.pathname, base && fileURLToPath(base), 'module'); + } + + return resolved; +} + +function throwImportNotDefined(specifier, packageJSONUrl, base) { + throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( + specifier, packageJSONUrl && fileURLToPath(new URL('.', packageJSONUrl)), + fileURLToPath(base)); +} + +function throwExportsNotFound(subpath, packageJSONUrl, base) { + throw new ERR_PACKAGE_PATH_NOT_EXPORTED( + fileURLToPath(new URL('.', packageJSONUrl)), subpath, + base && fileURLToPath(base)); +} + +function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { + const reason = `request is not a valid subpath for the "${internal ? + 'imports' : 'exports'}" resolution of ${fileURLToPath(packageJSONUrl)}`; + throw new ERR_INVALID_MODULE_SPECIFIER(subpath, reason, + base && fileURLToPath(base)); +} + +function throwInvalidPackageTarget( + subpath, target, packageJSONUrl, internal, base) { + if (typeof target === 'object' && target !== null) { + target = JSONStringify(target, null, ''); + } else { + target = `${target}`; + } + throw new ERR_INVALID_PACKAGE_TARGET( + fileURLToPath(new URL('.', packageJSONUrl)), subpath, target, + internal, base && fileURLToPath(base)); +} + +const invalidSegmentRegEx = /(^|\\|\/)(\.\.?|node_modules)(\\|\/|$)/; +const patternRegEx = /\*/g; + +function resolvePackageTargetString( + target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { + if (subpath !== '' && !pattern && target[target.length - 1] !== '/') + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + + if (!StringPrototypeStartsWith(target, './')) { + if (internal && !StringPrototypeStartsWith(target, '../') && + !StringPrototypeStartsWith(target, '/')) { + let isURL = false; + try { + new URL(target); + isURL = true; + } catch {} + if (!isURL) { + const exportTarget = pattern ? + StringPrototypeReplace(target, patternRegEx, subpath) : + target + subpath; + return packageResolve(exportTarget, packageJSONUrl, conditions); + } + } + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + } + + if (RegExpPrototypeTest(invalidSegmentRegEx, StringPrototypeSlice(target, 2))) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + + const resolved = new URL(target, packageJSONUrl); + const resolvedPath = resolved.pathname; + const packagePath = new URL('.', packageJSONUrl).pathname; + + if (!StringPrototypeStartsWith(resolvedPath, packagePath)) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + + if (subpath === '') return resolved; + + if (RegExpPrototypeTest(invalidSegmentRegEx, subpath)) + throwInvalidSubpath(match + subpath, packageJSONUrl, internal, base); + + if (pattern) + return new URL(StringPrototypeReplace(resolved.href, patternRegEx, + subpath)); + return new URL(subpath, resolved); +} + +/** + * @param {string} key + * @returns {boolean} + */ +function isArrayIndex(key) { + const keyNum = +key; + if (`${keyNum}` !== key) return false; + return keyNum >= 0 && keyNum < 0xFFFF_FFFF; +} + +function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, + base, pattern, internal, conditions) { + if (typeof target === 'string') { + return resolvePackageTargetString( + target, subpath, packageSubpath, packageJSONUrl, base, pattern, internal, + conditions); + } else if (ArrayIsArray(target)) { + if (target.length === 0) + return null; + + let lastException; + for (let i = 0; i < target.length; i++) { + const targetItem = target[i]; + let resolved; + try { + resolved = resolvePackageTarget( + packageJSONUrl, targetItem, subpath, packageSubpath, base, pattern, + internal, conditions); + } catch (e) { + lastException = e; + if (e.code === 'ERR_INVALID_PACKAGE_TARGET') + continue; + throw e; + } + if (resolved === undefined) + continue; + if (resolved === null) { + lastException = null; + continue; + } + return resolved; + } + if (lastException === undefined || lastException === null) + return lastException; + throw lastException; + } else if (typeof target === 'object' && target !== null) { + const keys = ObjectGetOwnPropertyNames(target); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (isArrayIndex(key)) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), base, + '"exports" cannot contain numeric property keys.'); + } + } + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === 'default' || conditions.has(key)) { + const conditionalTarget = target[key]; + const resolved = resolvePackageTarget( + packageJSONUrl, conditionalTarget, subpath, packageSubpath, base, + pattern, internal, conditions); + if (resolved === undefined) + continue; + return resolved; + } + } + return undefined; + } else if (target === null) { + return null; + } + throwInvalidPackageTarget(packageSubpath, target, packageJSONUrl, internal, + base); +} + +function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { + if (typeof exports === 'string' || ArrayIsArray(exports)) return true; + if (typeof exports !== 'object' || exports === null) return false; + + const keys = ObjectGetOwnPropertyNames(exports); + let isConditionalSugar = false; + let i = 0; + for (let j = 0; j < keys.length; j++) { + const key = keys[j]; + const curIsConditionalSugar = key === '' || key[0] !== '.'; + if (i++ === 0) { + isConditionalSugar = curIsConditionalSugar; + } else if (isConditionalSugar !== curIsConditionalSugar) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), base, + '"exports" cannot contain some keys starting with \'.\' and some not.' + + ' The exports object must either be an object of package subpath keys' + + ' or an object of main entry condition name keys only.'); + } + } + return isConditionalSugar; +} + +/** + * @param {URL} packageJSONUrl + * @param {string} packageSubpath + * @param {object} packageConfig + * @param {string} base + * @param {Set} conditions + * @returns {URL} + */ +function packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base, conditions) { + let exports = packageConfig.exports; + if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) + exports = { '.': exports }; + + if (ObjectPrototypeHasOwnProperty(exports, packageSubpath)) { + const target = exports[packageSubpath]; + const resolved = resolvePackageTarget( + packageJSONUrl, target, '', packageSubpath, base, false, false, conditions + ); + if (resolved === null || resolved === undefined) + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + return { resolved, exact: true }; + } + + let bestMatch = ''; + const keys = ObjectGetOwnPropertyNames(exports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key[key.length - 1] === '*' && + StringPrototypeStartsWith(packageSubpath, + StringPrototypeSlice(key, 0, -1)) && + packageSubpath.length >= key.length && + key.length > bestMatch.length) { + bestMatch = key; + } else if (key[key.length - 1] === '/' && + StringPrototypeStartsWith(packageSubpath, key) && + key.length > bestMatch.length) { + bestMatch = key; + } + } + + if (bestMatch) { + const target = exports[bestMatch]; + const pattern = bestMatch[bestMatch.length - 1] === '*'; + const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length - + (pattern ? 1 : 0)); + const resolved = resolvePackageTarget(packageJSONUrl, target, subpath, + bestMatch, base, pattern, false, + conditions); + if (resolved === null || resolved === undefined) + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + if (!pattern) + emitFolderMapDeprecation(bestMatch, packageJSONUrl, true, base); + return { resolved, exact: pattern }; + } + + throwExportsNotFound(packageSubpath, packageJSONUrl, base); +} + +function packageImportsResolve(name, base, conditions) { + if (name === '#' || StringPrototypeStartsWith(name, '#/')) { + const reason = 'is not a valid internal imports specifier name'; + throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); + } + let packageJSONUrl; + const packageConfig = getPackageScopeConfig(base); + if (packageConfig.exists) { + packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); + const imports = packageConfig.imports; + if (imports) { + if (ObjectPrototypeHasOwnProperty(imports, name)) { + const resolved = resolvePackageTarget( + packageJSONUrl, imports[name], '', name, base, false, true, conditions + ); + if (resolved !== null) + return { resolved, exact: true }; + } else { + let bestMatch = ''; + const keys = ObjectGetOwnPropertyNames(imports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key[key.length - 1] === '*' && + StringPrototypeStartsWith(name, + StringPrototypeSlice(key, 0, -1)) && + name.length >= key.length && + key.length > bestMatch.length) { + bestMatch = key; + } else if (key[key.length - 1] === '/' && + StringPrototypeStartsWith(name, key) && + key.length > bestMatch.length) { + bestMatch = key; + } + } + + if (bestMatch) { + const target = imports[bestMatch]; + const pattern = bestMatch[bestMatch.length - 1] === '*'; + const subpath = StringPrototypeSubstr(name, bestMatch.length - + (pattern ? 1 : 0)); + const resolved = resolvePackageTarget( + packageJSONUrl, target, subpath, bestMatch, base, pattern, true, + conditions); + if (resolved !== null) { + if (!pattern) + emitFolderMapDeprecation(bestMatch, packageJSONUrl, false, base); + return { resolved, exact: pattern }; + } + } + } + } + } + throwImportNotDefined(name, packageJSONUrl, base); +} + +function getPackageType(url) { + const packageConfig = getPackageScopeConfig(url); + return packageConfig.type; +} + +function parsePackageName(specifier, base) { + let separatorIndex = StringPrototypeIndexOf(specifier, '/'); + let validPackageName = true; + let isScoped = false; + if (specifier[0] === '@') { + isScoped = true; + if (separatorIndex === -1 || specifier.length === 0) { + validPackageName = false; + } else { + separatorIndex = StringPrototypeIndexOf( + specifier, '/', separatorIndex + 1); + } + } + + const packageName = separatorIndex === -1 ? + specifier : StringPrototypeSlice(specifier, 0, separatorIndex); + + // Package name cannot have leading . and cannot have percent-encoding or + // separators. + for (let i = 0; i < packageName.length; i++) { + if (packageName[i] === '%' || packageName[i] === '\\') { + validPackageName = false; + break; + } + } + + if (!validPackageName) { + throw new ERR_INVALID_MODULE_SPECIFIER( + specifier, 'is not a valid package name', fileURLToPath(base)); + } + + const packageSubpath = '.' + (separatorIndex === -1 ? '' : + StringPrototypeSlice(specifier, separatorIndex)); + + return { packageName, packageSubpath, isScoped }; +} + +/** + * @param {string} specifier + * @param {URL} base + * @param {Set} conditions + * @returns {URL} + */ +function packageResolve(specifier, base, conditions) { + const { packageName, packageSubpath, isScoped } = + parsePackageName(specifier, base); + + // ResolveSelf + const packageConfig = getPackageScopeConfig(base); + if (packageConfig.exists) { + const packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); + if (packageConfig.name === packageName && + packageConfig.exports !== undefined && packageConfig.exports !== null) { + return packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base, conditions + ).resolved; + } + } + + let packageJSONUrl = + new URL('./node_modules/' + packageName + '/package.json', base); + let packageJSONPath = fileURLToPath(packageJSONUrl); + let lastPath; + do { + const stat = tryStatSync(StringPrototypeSlice(packageJSONPath, 0, + packageJSONPath.length - 13)); + if (!stat.isDirectory()) { + lastPath = packageJSONPath; + packageJSONUrl = new URL((isScoped ? + '../../../../node_modules/' : '../../../node_modules/') + + packageName + '/package.json', packageJSONUrl); + packageJSONPath = fileURLToPath(packageJSONUrl); + continue; + } + + // Package match. + const packageConfig = getPackageConfig(packageJSONPath, specifier, base); + if (packageConfig.exports !== undefined && packageConfig.exports !== null) + return packageExportsResolve( + packageJSONUrl, packageSubpath, packageConfig, base, conditions + ).resolved; + if (packageSubpath === '.') + return legacyMainResolve(packageJSONUrl, packageConfig, base); + return new URL(packageSubpath, packageJSONUrl); + // Cross-platform root check. + } while (packageJSONPath.length !== lastPath.length); + + // eslint can't handle the above code. + // eslint-disable-next-line no-unreachable + throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base)); +} + +function isBareSpecifier(specifier) { + return specifier[0] && specifier[0] !== '/' && specifier[0] !== '.'; +} + +function isRelativeSpecifier(specifier) { + if (specifier[0] === '.') { + if (specifier.length === 1 || specifier[1] === '/') return true; + if (specifier[1] === '.') { + if (specifier.length === 2 || specifier[2] === '/') return true; + } + } + return false; +} + +function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { + if (specifier === '') return false; + if (specifier[0] === '/') return true; + return isRelativeSpecifier(specifier); +} + +/** + * @param {string} specifier + * @param {URL} base + * @param {Set} conditions + * @returns {URL} + */ +function moduleResolve(specifier, base, conditions) { + // Order swapped from spec for minor perf gain. + // Ok since relative URLs cannot parse as URLs. + let resolved; + if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { + resolved = new URL(specifier, base); + } else if (specifier[0] === '#') { + ({ resolved } = packageImportsResolve(specifier, base, conditions)); + } else { + try { + resolved = new URL(specifier); + } catch { + resolved = packageResolve(specifier, base, conditions); + } + } + return finalizeResolution(resolved, base); +} + +/** + * Try to resolve an import as a CommonJS module + * @param {string} specifier + * @param {string} parentURL + * @returns {boolean|string} + */ +function resolveAsCommonJS(specifier, parentURL) { + try { + const parent = fileURLToPath(parentURL); + const tmpModule = new CJSModule(parent, null); + tmpModule.paths = CJSModule._nodeModulePaths(parent); + + let found = CJSModule._resolveFilename(specifier, tmpModule, false); + + // If it is a relative specifier return the relative path + // to the parent + if (isRelativeSpecifier(specifier)) { + found = relative(parent, found); + // Add '.separator if the path does not start with '..separator' + // This should be a safe assumption because when loading + // esm modules there should be always a file specified so + // there should not be a specifier like '..' or '.' + if (!StringPrototypeStartsWith(found, `..${sep}`)) { + found = `.${sep}${found}`; + } + } else if (isBareSpecifier(specifier)) { + // If it is a bare specifier return the relative path within the + // module + const pkg = StringPrototypeSplit(specifier, '/')[0]; + const index = StringPrototypeIndexOf(found, pkg); + if (index !== -1) { + found = StringPrototypeSlice(found, index); + } + } + // Normalize the path separator to give a valid suggestion + // on Windows + if (process.platform === 'win32') { + found = StringPrototypeReplace(found, new RegExp(`\\${sep}`, 'g'), '/'); + } + return found; + } catch { + return false; + } +} + +function defaultResolve(specifier, context = {}, defaultResolveUnused) { + let { parentURL, conditions } = context; + if (parentURL && policy?.manifest) { + const redirects = policy.manifest.getDependencyMapper(parentURL); + if (redirects) { + const { resolve, reaction } = redirects; + const destination = resolve(specifier, new SafeSet(conditions)); + let missing = true; + if (destination === true) { + missing = false; + } else if (destination) { + const href = destination.href; + return { url: href }; + } + if (missing) { + reaction(new ERR_MANIFEST_DEPENDENCY_MISSING( + parentURL, + specifier, + ArrayPrototypeJoin([...conditions], ', ')) + ); + } + } + } + let parsed; + try { + parsed = new URL(specifier); + if (parsed.protocol === 'data:') { + return { + url: specifier + }; + } + } catch {} + if (parsed && parsed.protocol === 'node:') + return { url: specifier }; + if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') + throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed); + if (NativeModule.canBeRequiredByUsers(specifier)) { + return { + url: 'node:' + specifier + }; + } + if (parentURL && StringPrototypeStartsWith(parentURL, 'data:')) { + // This is gonna blow up, we want the error + new URL(specifier, parentURL); + } + + const isMain = parentURL === undefined; + if (isMain) { + parentURL = pathToFileURL(`${process.cwd()}/`).href; + + // This is the initial entry point to the program, and --input-type has + // been passed as an option; but --input-type can only be used with + // --eval, --print or STDIN string input. It is not allowed with file + // input, to avoid user confusion over how expansive the effect of the + // flag should be (i.e. entry point only, package scope surrounding the + // entry point, etc.). + if (typeFlag) + throw new ERR_INPUT_TYPE_NOT_ALLOWED(); + } + + conditions = getConditionsSet(conditions); + let url; + try { + url = moduleResolve(specifier, parentURL, conditions); + } catch (error) { + // Try to give the user a hint of what would have been the + // resolved CommonJS module + if (error.code === 'ERR_MODULE_NOT_FOUND' || + error.code === 'ERR_UNSUPPORTED_DIR_IMPORT') { + if (StringPrototypeStartsWith(specifier, 'file://')) { + specifier = fileURLToPath(specifier); + } + const found = resolveAsCommonJS(specifier, parentURL); + if (found) { + // Modify the stack and message string to include the hint + const lines = StringPrototypeSplit(error.stack, '\n'); + const hint = `Did you mean to import ${found}?`; + error.stack = + ArrayPrototypeShift(lines) + '\n' + + hint + '\n' + + ArrayPrototypeJoin(lines, '\n'); + error.message += `\n${hint}`; + } + } + throw error; + } + + if (isMain ? !preserveSymlinksMain : !preserveSymlinks) { + const urlPath = fileURLToPath(url); + const real = realpathSync(urlPath, { + [internalFS.realpathCacheKey]: realpathCache + }); + const old = url; + url = pathToFileURL( + real + (StringPrototypeEndsWith(urlPath, sep) ? '/' : '')); + url.search = old.search; + url.hash = old.hash; + } + + return { url: `${url}` }; +} + +module.exports = { + DEFAULT_CONDITIONS, + defaultResolve, + encodedSepRegEx, + getPackageType, + packageExportsResolve, + packageImportsResolve +}; diff --git a/src/index.spec.ts b/src/index.spec.ts index bed91dd22..4c82742a1 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -860,7 +860,7 @@ describe('ts-node', function () { it('should compile and execute as ESM', (done) => { exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff\n') + expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) @@ -883,7 +883,7 @@ describe('ts-node', function () { it('via --experimental-specifier-resolution', (done) => { exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff\n') + expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) @@ -891,7 +891,7 @@ describe('ts-node', function () { it('via --es-module-specifier-resolution alias', (done) => { exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff\n') + expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) @@ -905,7 +905,7 @@ describe('ts-node', function () { } }, function (err, stdout) { expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff\n') + expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) diff --git a/tests/esm-node-resolver/index.ts b/tests/esm-node-resolver/index.ts index 88b9bc868..df7ccd019 100644 --- a/tests/esm-node-resolver/index.ts +++ b/tests/esm-node-resolver/index.ts @@ -2,7 +2,8 @@ import {foo} from './foo' import {bar} from './bar' import {baz} from './baz' import {biff} from './biff' +import {libfoo} from 'libfoo' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') -console.log(`${foo} ${bar} ${baz} ${biff}`) +console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`) diff --git a/tests/esm-node-resolver/node_modules/libfoo/entrypoint.js b/tests/esm-node-resolver/node_modules/libfoo/entrypoint.js new file mode 100644 index 000000000..97ec5ba03 --- /dev/null +++ b/tests/esm-node-resolver/node_modules/libfoo/entrypoint.js @@ -0,0 +1 @@ +export const libfoo = 'libfoo' diff --git a/tests/esm-node-resolver/node_modules/libfoo/index.d.ts b/tests/esm-node-resolver/node_modules/libfoo/index.d.ts new file mode 100644 index 000000000..dc2a05001 --- /dev/null +++ b/tests/esm-node-resolver/node_modules/libfoo/index.d.ts @@ -0,0 +1,2 @@ +// TypeScript does not yet support package.json "exports" +export const libfoo: string diff --git a/tests/esm-node-resolver/node_modules/libfoo/package.json b/tests/esm-node-resolver/node_modules/libfoo/package.json new file mode 100644 index 000000000..bda92d96b --- /dev/null +++ b/tests/esm-node-resolver/node_modules/libfoo/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "exports": { + "import": "./entrypoint.js" + } +} diff --git a/tests/esm/index.ts b/tests/esm/index.ts index 9f7091dcf..7c0b3e9fc 100644 --- a/tests/esm/index.ts +++ b/tests/esm/index.ts @@ -2,6 +2,7 @@ import {foo} from './foo.js' import {bar} from './bar.js' import {baz} from './baz.js' import {biff} from './biff.js' +import {libfoo} from 'libfoo' // Test import builtin modules import {readFileSync} from 'fs'; @@ -9,4 +10,4 @@ if(typeof readFileSync !== 'function') throw new Error('failed to import builtin if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') -console.log(`${foo} ${bar} ${baz} ${biff}`) +console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`) diff --git a/tests/esm/node_modules/libfoo/entrypoint.js b/tests/esm/node_modules/libfoo/entrypoint.js new file mode 100644 index 000000000..97ec5ba03 --- /dev/null +++ b/tests/esm/node_modules/libfoo/entrypoint.js @@ -0,0 +1 @@ +export const libfoo = 'libfoo' diff --git a/tests/esm/node_modules/libfoo/index.d.ts b/tests/esm/node_modules/libfoo/index.d.ts new file mode 100644 index 000000000..dc2a05001 --- /dev/null +++ b/tests/esm/node_modules/libfoo/index.d.ts @@ -0,0 +1,2 @@ +// TypeScript does not yet support package.json "exports" +export const libfoo: string diff --git a/tests/esm/node_modules/libfoo/package.json b/tests/esm/node_modules/libfoo/package.json new file mode 100644 index 000000000..bda92d96b --- /dev/null +++ b/tests/esm/node_modules/libfoo/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "exports": { + "import": "./entrypoint.js" + } +} diff --git a/tests/esm/tsconfig.json b/tests/esm/tsconfig.json index 03e0c3c5d..635b5b872 100644 --- a/tests/esm/tsconfig.json +++ b/tests/esm/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "module": "ESNext", "allowJs": true, - "jsx": "react" + "jsx": "react", + "moduleResolution": "node" } } From 286c2947ec6773f4ecd281a78d78a3e45ce4ac71 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Thu, 3 Dec 2020 01:14:41 -0500 Subject: [PATCH 081/113] =?UTF-8?q?Rename=20`Register`=20to=20`Service`;?= =?UTF-8?q?=20re-export=20as=20`Register`=20for=20backwards=E2=80=A6=20(#1?= =?UTF-8?q?158)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rename `Register` to `Service`; re-export as `Register` for backwards compatibility * rename variable 'register' to 'service' --- src/bin.ts | 8 ++++---- src/index.spec.ts | 6 +++--- src/index.ts | 29 ++++++++++++++++++----------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/bin.ts b/src/bin.ts index bac650106..b9a0bb591 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -9,7 +9,7 @@ import { diffLines } from 'diff' import { Script } from 'vm' import { readFileSync, statSync, realpathSync } from 'fs' import { homedir } from 'os' -import { VERSION, TSError, parse, Register, register } from './index' +import { VERSION, TSError, parse, Service, register } from './index' /** * Eval filename for REPL/debug. @@ -284,7 +284,7 @@ function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { /** * Evaluate a script. */ -function evalAndExit (service: Register, state: EvalState, module: Module, code: string, isPrinted: boolean) { +function evalAndExit (service: Service, state: EvalState, module: Module, code: string, isPrinted: boolean) { let result: any ;(global as any).__filename = module.filename @@ -312,7 +312,7 @@ function evalAndExit (service: Register, state: EvalState, module: Module, code: /** * Evaluate the code snippet. */ -function _eval (service: Register, state: EvalState, input: string) { +function _eval (service: Service, state: EvalState, input: string) { const lines = state.lines const isCompletion = !/\n$/.test(input) const undo = appendEval(state, input) @@ -351,7 +351,7 @@ function exec (code: string, filename: string) { /** * Start a CLI REPL. */ -function startRepl (service: Register, state: EvalState, code?: string) { +function startRepl (service: Service, state: EvalState, code?: string) { // Eval incoming code before the REPL starts. if (code) { try { diff --git a/src/index.spec.ts b/src/index.spec.ts index 4c82742a1..f2c5e3a3b 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -644,7 +644,7 @@ describe('ts-node', function () { }) describe('register', function () { - let registered: tsNodeTypes.Register + let registered: tsNodeTypes.Service let moduleTestPath: string before(() => { registered = register({ @@ -797,7 +797,7 @@ describe('ts-node', function () { }) describe('create', () => { - let service: tsNodeTypes.Register + let service: tsNodeTypes.Service before(() => { service = create({ compilerOptions: { target: 'es5' }, skipProject: true }) }) @@ -824,7 +824,7 @@ describe('ts-node', function () { }) describe('issue #1098', () => { - function testIgnored (ignored: tsNodeTypes.Register['ignored'], allowed: string[], disallowed: string[]) { + function testIgnored (ignored: tsNodeTypes.Service['ignored'], allowed: string[], disallowed: string[]) { for (const ext of allowed) { expect(ignored(join(__dirname, `index${ext}`))).equal(false, `should accept ${ext} files`) } diff --git a/src/index.ts b/src/index.ts index 3c51f8094..09860c6d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -40,7 +40,7 @@ export const REGISTER_INSTANCE = Symbol.for('ts-node.register.instance') declare global { namespace NodeJS { interface Process { - [REGISTER_INSTANCE]?: Register + [REGISTER_INSTANCE]?: Service } } } @@ -354,9 +354,9 @@ export class TSError extends BaseError { } /** - * Return type for registering `ts-node`. + * Primary ts-node service, which wraps the TypeScript API and can compile TypeScript to JavaScript */ -export interface Register { +export interface Service { ts: TSCommon config: _ts.ParsedCommandLine options: RegisterOptions @@ -366,6 +366,13 @@ export interface Register { getTypeInfo (code: string, fileName: string, position: number): TypeInfo } +/** + * Re-export of `Service` interface for backwards-compatibility + * @deprecated use `Service` instead + * @see Service + */ +export type Register = Service + /** * Cached fs operation wrapper. */ @@ -396,7 +403,7 @@ export function getExtensions (config: _ts.ParsedCommandLine) { /** * Register TypeScript compiler instance onto node.js */ -export function register (opts: RegisterOptions = {}): Register { +export function register (opts: RegisterOptions = {}): Service { const originalJsHandler = require.extensions['.js'] // tslint:disable-line const service = create(opts) const { tsExtensions, jsExtensions } = getExtensions(service.config) @@ -417,7 +424,7 @@ export function register (opts: RegisterOptions = {}): Register { /** * Create TypeScript compiler instance. */ -export function create (rawOptions: CreateOptions = {}): Register { +export function create (rawOptions: CreateOptions = {}): Service { const dir = rawOptions.dir ?? DEFAULTS.dir const compilerName = rawOptions.compiler ?? DEFAULTS.compiler const cwd = dir ? resolve(dir) : process.cwd() @@ -1006,12 +1013,12 @@ function reorderRequireExtension (ext: string) { function registerExtensions ( preferTsExts: boolean | null | undefined, extensions: string[], - register: Register, + service: Service, originalJsHandler: (m: NodeModule, filename: string) => any ) { // Register new extensions. for (const ext of extensions) { - registerExtension(ext, register, originalJsHandler) + registerExtension(ext, service, originalJsHandler) } if (preferTsExts) { @@ -1027,15 +1034,15 @@ function registerExtensions ( */ function registerExtension ( ext: string, - register: Register, + service: Service, originalHandler: (m: NodeModule, filename: string) => any ) { const old = require.extensions[ext] || originalHandler // tslint:disable-line require.extensions[ext] = function (m: any, filename) { // tslint:disable-line - if (register.ignored(filename)) return old(m, filename) + if (service.ignored(filename)) return old(m, filename) - if (register.options.experimentalEsmLoader) { + if (service.options.experimentalEsmLoader) { assertScriptCanLoadAsCJS(filename) } @@ -1044,7 +1051,7 @@ function registerExtension ( m._compile = function (code: string, fileName: string) { debug('module._compile', fileName) - return _compile.call(this, register.compile(code, fileName), fileName) + return _compile.call(this, service.compile(code, fileName), fileName) } return old(m, filename) From ded513d862e15316d2d19422d504a6b3e38b01a7 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Thu, 3 Dec 2020 01:21:31 -0500 Subject: [PATCH 082/113] Remove node 13 tests; change 12.16 to latest 12.x.x (#1148) --- .github/workflows/continuous-integration.yml | 47 +++++++------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 3be3ed8d0..f383e3724 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -40,7 +40,7 @@ jobs: matrix: os: [ubuntu, windows] # Don't forget to add all new flavors to this list! - flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] + flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] include: # Node 10 - flavor: 1 @@ -49,72 +49,55 @@ jobs: typescript: latest typescriptFlag: latest # Node 12.15 + # TODO Add comments about why we test 12.15; I think git blame says it's because of an ESM behavioral change that happened at 12.16 - flavor: 2 node: 12.15 nodeFlag: 12_15 typescript: latest typescriptFlag: latest - # Node 12.16 - # TODO Add comments about why we test 2.15 and 2.16; I think git blame says it's because of an ESM behavioral change that happened at this version number - # TODO switch to '12' to get latest patch? + # Node 12 - flavor: 3 - node: 12.16 - nodeFlag: 12_16 + node: 12 + nodeFlag: 12 typescript: latest typescriptFlag: latest - # Node 13 + # Node 14.13.0 + # To test ESM builtin module resolution immediately before a node behavioral change: https://github.com/TypeStrong/ts-node/issues/1130 - flavor: 4 - node: 13 - nodeFlag: 13 + node: 14.13.0 + nodeFlag: 14_13_0 typescript: latest typescriptFlag: latest - - flavor: 5 - node: 13 - nodeFlag: 13 - typescript: 2.7 - typescriptFlag: 2_7 - - flavor: 6 - node: 13 - nodeFlag: 13 - typescript: next - typescriptFlag: next # Node 14 - - flavor: 7 + - flavor: 5 node: 14 nodeFlag: 14 typescript: latest typescriptFlag: latest - - flavor: 8 + - flavor: 6 node: 14 nodeFlag: 14 typescript: 2.7 typescriptFlag: 2_7 - - flavor: 9 + - flavor: 7 node: 14 nodeFlag: 14 typescript: next typescriptFlag: next - # Node 14.13.0 - # To test ESM builtin module resolution immediately before a node behavioral change: https://github.com/TypeStrong/ts-node/issues/1130 - - flavor: 10 - node: 14.13.0 - nodeFlag: 14_13_0 - typescript: latest - typescriptFlag: latest # Node 15 - - flavor: 11 + - flavor: 8 node: 15 nodeFlag: 15 typescript: latest typescriptFlag: latest downgradeNpm: true - - flavor: 12 + - flavor: 9 node: 15 nodeFlag: 15 typescript: 2.7 typescriptFlag: 2_7 downgradeNpm: true - - flavor: 13 + - flavor: 10 node: 15 nodeFlag: 15 typescript: next From 657de4aa6b7da1fc1c8818fb8b008818179f4a83 Mon Sep 17 00:00:00 2001 From: Marc Maniez Date: Wed, 2 Dec 2020 22:33:39 -0800 Subject: [PATCH 083/113] Make ts-node eval public for node REPL consumption (#1121) * Add createReplEval function * Add a test * Fix a couple of typos * Actually test the evaluator * Try removing spec * Use service creation pattern * Move REPL code to its own file * - Reorder repl.ts declarations to match the original order from bin.ts - promote createReplService to top of the file since it will hopefully be the main entrypoint to any REPL functionality * Expand ReplService API; use new API in bin.ts, which further decouples bin.ts from repl.ts * Add brief, internal docs for REPL API * Add support for DI of alternative stdio streams into REPL * export REPL from index.ts * remove unnecessary export * Add test for new REPL API * API surface, naming, docs tweaks * tweak identifiers * fix name * Tweak repl API test to match REPL CLI test, allowing it to pass on Windows Co-authored-by: Andrew Bradley --- development-docs/repl-api.md | 27 +++ package-lock.json | 6 + package.json | 1 + src/bin.ts | 265 ++-------------------------- src/index.spec.ts | 34 +++- src/index.ts | 4 +- src/repl.ts | 324 +++++++++++++++++++++++++++++++++++ 7 files changed, 411 insertions(+), 250 deletions(-) create mode 100644 development-docs/repl-api.md create mode 100644 src/repl.ts diff --git a/development-docs/repl-api.md b/development-docs/repl-api.md new file mode 100644 index 000000000..782a13dc2 --- /dev/null +++ b/development-docs/repl-api.md @@ -0,0 +1,27 @@ +## How to create your own ts-node powered REPL + +- Create ts-node REPL service which includes EvalState +- Create ts-node compiler service using EvalState-aware `readFile` and `fileExists` implementations from REPL +- Bind REPL service to compiler service (chicken-and-egg problem necessitates late binding) +- Either: + - call REPL method start() to start a REPL + - create your own node repl but pass it REPL service's nodeEval() function + +``` +import * as tsnode from 'ts-node'; +const repl = tsnode.createRepl(); +const service = tsnode.register({ + ... options, + ...repl.evalAwarePartialHost +}); +repl.setService(service); + +// Start it +repl.start(); + +// or +const nodeRepl = require('repl').start({ + ...options, + eval: repl.nodeEval +}); +``` diff --git a/package-lock.json b/package-lock.json index d7a2f0d25..889eb55c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -984,6 +984,12 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", diff --git a/package.json b/package.json index a08b901d0..9020a58fc 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "@types/source-map-support": "^0.5.0", "axios": "^0.19.0", "chai": "^4.0.1", + "get-stream": "^6.0.0", "lodash": "^4.17.15", "mocha": "^6.2.2", "ntypescript": "^1.201507091536.1", diff --git a/src/bin.ts b/src/bin.ts index b9a0bb591..9ec856798 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -1,32 +1,16 @@ #!/usr/bin/env node import { join, resolve, dirname } from 'path' -import { start, Recoverable } from 'repl' import { inspect } from 'util' import Module = require('module') import arg = require('arg') -import { diffLines } from 'diff' -import { Script } from 'vm' -import { readFileSync, statSync, realpathSync } from 'fs' -import { homedir } from 'os' -import { VERSION, TSError, parse, Service, register } from './index' - -/** - * Eval filename for REPL/debug. - */ -const EVAL_FILENAME = `[eval].ts` - -/** - * Eval state management. - */ -class EvalState { - input = '' - output = '' - version = 0 - lines = 0 - - constructor (public path: string) {} -} +import { + EVAL_FILENAME, + EvalState, + createRepl, + ReplService + } from './repl' +import { VERSION, TSError, parse, register } from './index' /** * Main `bin` functionality. @@ -160,6 +144,8 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re /** Unresolved. May point to a symlink, not realpath. May be missing file extension */ const scriptPath = args._.length ? resolve(cwd, args._[0]) : undefined const state = new EvalState(scriptPath || join(cwd, EVAL_FILENAME)) + const replService = createRepl({ state }) + const { evalAwarePartialHost } = replService // Register the TypeScript compiler instance. const service = register({ @@ -180,29 +166,13 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re ignoreDiagnostics, compilerOptions, require: argsRequire, - readFile: code !== undefined - ? (path: string) => { - if (path === state.path) return state.input - - try { - return readFileSync(path, 'utf8') - } catch (err) {/* Ignore. */} - } - : undefined, - fileExists: code !== undefined - ? (path: string) => { - if (path === state.path) return true - - try { - const stats = statSync(path) - return stats.isFile() || stats.isFIFO() - } catch (err) { - return false - } - } - : undefined + readFile: code !== undefined ? evalAwarePartialHost.readFile : undefined, + fileExists: code !== undefined ? evalAwarePartialHost.fileExists : undefined }) + // Bind REPL service to ts-node compiler service (chicken-and-egg problem) + replService.setService(service) + // Output project information. if (version >= 2) { console.log(`ts-node v${VERSION}`) @@ -222,7 +192,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re // Execute the main contents (either eval, script or piped). if (code !== undefined && !interactive) { - evalAndExit(service, state, module, code, print) + evalAndExit(replService, module, code, print) } else { if (args._.length) { Module.runMain() @@ -230,11 +200,11 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re // Piping of execution _only_ occurs when no other script is specified. // --interactive flag forces REPL if (interactive || process.stdin.isTTY) { - startRepl(service, state, code) + replService.start(code) } else { let buffer = code || '' process.stdin.on('data', (chunk: Buffer) => buffer += chunk) - process.stdin.on('end', () => evalAndExit(service, state, module, buffer, print)) + process.stdin.on('end', () => evalAndExit(replService, module, buffer, print)) } } } @@ -284,7 +254,7 @@ function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { /** * Evaluate a script. */ -function evalAndExit (service: Service, state: EvalState, module: Module, code: string, isPrinted: boolean) { +function evalAndExit (replService: ReplService, module: Module, code: string, isPrinted: boolean) { let result: any ;(global as any).__filename = module.filename @@ -294,7 +264,7 @@ function evalAndExit (service: Service, state: EvalState, module: Module, code: ;(global as any).require = module.require.bind(module) try { - result = _eval(service, state, code) + result = replService.evalCode(code) } catch (error) { if (error instanceof TSError) { console.error(error) @@ -309,203 +279,6 @@ function evalAndExit (service: Service, state: EvalState, module: Module, code: } } -/** - * Evaluate the code snippet. - */ -function _eval (service: Service, state: EvalState, input: string) { - const lines = state.lines - const isCompletion = !/\n$/.test(input) - const undo = appendEval(state, input) - let output: string - - try { - output = service.compile(state.input, state.path, -lines) - } catch (err) { - undo() - throw err - } - - // Use `diff` to check for new JavaScript to execute. - const changes = diffLines(state.output, output) - - if (isCompletion) { - undo() - } else { - state.output = output - } - - return changes.reduce((result, change) => { - return change.added ? exec(change.value, state.path) : result - }, undefined) -} - -/** - * Execute some code. - */ -function exec (code: string, filename: string) { - const script = new Script(code, { filename: filename }) - - return script.runInThisContext() -} - -/** - * Start a CLI REPL. - */ -function startRepl (service: Service, state: EvalState, code?: string) { - // Eval incoming code before the REPL starts. - if (code) { - try { - _eval(service, state, `${code}\n`) - } catch (err) { - console.error(err) - process.exit(1) - } - } - - const repl = start({ - prompt: '> ', - input: process.stdin, - output: process.stdout, - // Mimicking node's REPL implementation: https://github.com/nodejs/node/blob/168b22ba073ee1cbf8d0bcb4ded7ff3099335d04/lib/internal/repl.js#L28-L30 - terminal: process.stdout.isTTY && !parseInt(process.env.NODE_NO_READLINE!, 10), - eval: replEval, - useGlobal: true - }) - - /** - * Eval code from the REPL. - */ - function replEval (code: string, _context: any, _filename: string, callback: (err: Error | null, result?: any) => any) { - let err: Error | null = null - let result: any - - // TODO: Figure out how to handle completion here. - if (code === '.scope') { - callback(err) - return - } - - try { - result = _eval(service, state, code) - } catch (error) { - if (error instanceof TSError) { - // Support recoverable compilations using >= node 6. - if (Recoverable && isRecoverable(error)) { - err = new Recoverable(error) - } else { - console.error(error) - } - } else { - err = error - } - } - - return callback(err, result) - } - - // Bookmark the point where we should reset the REPL state. - const resetEval = appendEval(state, '') - - function reset () { - resetEval() - - // Hard fix for TypeScript forcing `Object.defineProperty(exports, ...)`. - exec('exports = module.exports', state.path) - } - - reset() - repl.on('reset', reset) - - repl.defineCommand('type', { - help: 'Check the type of a TypeScript identifier', - action: function (identifier: string) { - if (!identifier) { - repl.displayPrompt() - return - } - - const undo = appendEval(state, identifier) - const { name, comment } = service.getTypeInfo(state.input, state.path, state.input.length) - - undo() - - if (name) repl.outputStream.write(`${name}\n`) - if (comment) repl.outputStream.write(`${comment}\n`) - repl.displayPrompt() - } - }) - - // Set up REPL history when available natively via node.js >= 11. - if (repl.setupHistory) { - const historyPath = process.env.TS_NODE_HISTORY || join(homedir(), '.ts_node_repl_history') - - repl.setupHistory(historyPath, err => { - if (!err) return - - console.error(err) - process.exit(1) - }) - } -} - -/** - * Append to the eval instance and return an undo function. - */ -function appendEval (state: EvalState, input: string) { - const undoInput = state.input - const undoVersion = state.version - const undoOutput = state.output - const undoLines = state.lines - - // Handle ASI issues with TypeScript re-evaluation. - if (undoInput.charAt(undoInput.length - 1) === '\n' && /^\s*[\/\[(`-]/.test(input) && !/;\s*$/.test(undoInput)) { - state.input = `${state.input.slice(0, -1)};\n` - } - - state.input += input - state.lines += lineCount(input) - state.version++ - - return function () { - state.input = undoInput - state.output = undoOutput - state.version = undoVersion - state.lines = undoLines - } -} - -/** - * Count the number of lines. - */ -function lineCount (value: string) { - let count = 0 - - for (const char of value) { - if (char === '\n') { - count++ - } - } - - return count -} - -const RECOVERY_CODES: Set = new Set([ - 1003, // "Identifier expected." - 1005, // "')' expected." - 1109, // "Expression expected." - 1126, // "Unexpected end of text." - 1160, // "Unterminated template literal." - 1161, // "Unterminated regular expression literal." - 2355 // "A function whose declared type is neither 'void' nor 'any' must return a value." -]) - -/** - * Check if a function can recover gracefully. - */ -function isRecoverable (error: TSError) { - return error.diagnosticCodes.every(code => RECOVERY_CODES.has(code)) -} - /** Safe `hasOwnProperty` */ function hasOwnProperty (object: any, property: string): boolean { return Object.prototype.hasOwnProperty.call(object, property) diff --git a/src/index.spec.ts b/src/index.spec.ts index f2c5e3a3b..0f7e0f908 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -12,6 +12,8 @@ import type _createRequire from 'create-require' const createRequire: typeof _createRequire = require('create-require') import { pathToFileURL } from 'url' import Module = require('module') +import { PassThrough } from 'stream' +import * as getStream from 'get-stream' const execP = promisify(exec) @@ -26,7 +28,7 @@ const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset const testsDirRequire = createRequire(join(TEST_DIR, 'index.js')) // tslint:disable-line // Set after ts-node is installed locally -let { register, create, VERSION }: typeof tsNodeTypes = {} as any +let { register, create, VERSION, createRepl }: typeof tsNodeTypes = {} as any // Pack and install ts-node locally, necessary to test package "exports" before(async function () { @@ -35,7 +37,7 @@ before(async function () { await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) - ;({ register, create, VERSION } = testsDirRequire('ts-node')) + ;({ register, create, VERSION, createRepl } = testsDirRequire('ts-node')) }) describe('ts-node', function () { @@ -354,8 +356,8 @@ describe('ts-node', function () { }) cp.stdin!.end('console.log("123")\n') - }) + it('REPL has command to get type information', function (done) { const cp = exec(`${cmd} --interactive`, function (err, stdout) { expect(err).to.equal(null) @@ -371,6 +373,32 @@ describe('ts-node', function () { cp.stdin!.end('\nconst a = 123\n.type a') }) + it('REPL can be created via API', async () => { + const stdin = new PassThrough() + const stdout = new PassThrough() + const stderr = new PassThrough() + const replService = createRepl({ + stdin, + stdout, + stderr + }) + const service = create(replService.evalAwarePartialHost) + replService.setService(service) + replService.start() + stdin.write('\nconst a = 123\n.type a\n') + stdin.end() + await promisify(setTimeout)(1e3) + stdout.end() + stderr.end() + expect(await getStream(stderr)).to.equal('') + expect(await getStream(stdout)).to.equal( + '> \'use strict\'\n' + + '> undefined\n' + + '> const a: 123\n' + + '> ' + ) + }) + it('should support require flags', function (done) { exec(`${cmd} -r ./tests/hello-world -pe "console.log('success')"`, function (err, stdout) { expect(err).to.equal(null) diff --git a/src/index.ts b/src/index.ts index 09860c6d1..47b986374 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { relative, basename, extname, resolve, dirname, join, isAbsolute } from 'path' +import { relative, basename, extname, resolve, dirname, join } from 'path' import sourceMapSupport = require('source-map-support') import * as ynModule from 'yn' import { BaseError } from 'make-error' @@ -10,6 +10,8 @@ import type _createRequire from 'create-require' // tslint:disable-next-line const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire +export { createRepl, CreateReplOptions, ReplService } from './repl' + /** * Does this version of node obey the package.json "type" field * and throw ERR_REQUIRE_ESM when attempting to require() an ESM modules. diff --git a/src/repl.ts b/src/repl.ts new file mode 100644 index 000000000..122abbf51 --- /dev/null +++ b/src/repl.ts @@ -0,0 +1,324 @@ +import { diffLines } from 'diff' +import { homedir } from 'os' +import { join } from 'path' +import { Recoverable, start } from 'repl' +import { Script } from 'vm' +import { Service, CreateOptions, TSError } from './index' +import { readFileSync, statSync } from 'fs' +import { Console } from 'console' +import * as tty from 'tty' + +/** + * Eval filename for REPL/debug. + * @internal + */ +export const EVAL_FILENAME = `[eval].ts` + +export interface ReplService { + readonly state: EvalState + /** + * Bind this REPL to a ts-node compiler service. A compiler service must be bound before `eval`-ing code or starting the REPL + */ + setService (service: Service): void + evalCode (code: string): void + /** + * `eval` implementation compatible with node's REPL API + */ + nodeEval (code: string, _context: any, _filename: string, callback: (err: Error | null, result?: any) => any): void + evalAwarePartialHost: EvalAwarePartialHost + /** Start a node REPL */ + start (code?: string): void + /** @internal */ + readonly stdin: NodeJS.ReadableStream + /** @internal */ + readonly stdout: NodeJS.WritableStream + /** @internal */ + readonly stderr: NodeJS.WritableStream + /** @internal */ + readonly console: Console +} + +export interface CreateReplOptions { + service?: Service + state?: EvalState + stdin?: NodeJS.ReadableStream + stdout?: NodeJS.WritableStream + stderr?: NodeJS.WritableStream +} + +export function createRepl (options: CreateReplOptions = {}) { + let service = options.service + const state = options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)) + const evalAwarePartialHost = createEvalAwarePartialHost(state) + const stdin = options.stdin ?? process.stdin + const stdout = options.stdout ?? process.stdout + const stderr = options.stderr ?? process.stderr + const _console = stdout === process.stdout && stderr === process.stderr ? console : new Console(stdout, stderr) + + const replService: ReplService = { + state: options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)), + setService, + evalCode, + nodeEval, + evalAwarePartialHost, + start, + stdin, + stdout, + stderr, + console: _console + } + return replService + + function setService (_service: Service) { + service = _service + } + + function evalCode (code: string) { + return _eval(service!, state, code) + } + + function nodeEval (code: string, _context: any, _filename: string, callback: (err: Error | null, result?: any) => any) { + let err: Error | null = null + let result: any + + // TODO: Figure out how to handle completion here. + if (code === '.scope') { + callback(err) + return + } + + try { + result = evalCode(code) + } catch (error) { + if (error instanceof TSError) { + // Support recoverable compilations using >= node 6. + if (Recoverable && isRecoverable(error)) { + err = new Recoverable(error) + } else { + console.error(error) + } + } else { + err = error + } + } + + return callback(err, result) + } + + function start (code?: string) { + // TODO assert that service is set; remove all ! postfixes + return startRepl(replService, service!, state, code) + } +} + +/** + * Eval state management. Stores virtual `[eval].ts` file + */ +export class EvalState { + /** @internal */ + input = '' + /** @internal */ + output = '' + /** @internal */ + version = 0 + /** @internal */ + lines = 0 + + // tslint:disable-next-line:variable-name + __tsNodeEvalStateBrand: unknown + + constructor (public path: string) { } +} + +/** + * Filesystem host functions which are aware of the "virtual" [eval].ts file used to compile REPL inputs. + * Must be passed to `create()` to create a ts-node compiler service which can compile REPL inputs. + */ +export type EvalAwarePartialHost = Pick + +export function createEvalAwarePartialHost (state: EvalState): EvalAwarePartialHost { + function readFile (path: string) { + if (path === state.path) return state.input + + try { + return readFileSync(path, 'utf8') + } catch (err) {/* Ignore. */} + } + function fileExists (path: string) { + if (path === state.path) return true + + try { + const stats = statSync(path) + return stats.isFile() || stats.isFIFO() + } catch (err) { + return false + } + } + return { readFile, fileExists } +} + +/** + * Evaluate the code snippet. + */ +function _eval (service: Service, state: EvalState, input: string) { + const lines = state.lines + const isCompletion = !/\n$/.test(input) + const undo = appendEval(state, input) + let output: string + + try { + output = service.compile(state.input, state.path, -lines) + } catch (err) { + undo() + throw err + } + + // Use `diff` to check for new JavaScript to execute. + const changes = diffLines(state.output, output) + + if (isCompletion) { + undo() + } else { + state.output = output + } + + return changes.reduce((result, change) => { + return change.added ? exec(change.value, state.path) : result + }, undefined) +} + +/** + * Execute some code. + */ +function exec (code: string, filename: string) { + const script = new Script(code, { filename: filename }) + + return script.runInThisContext() +} + +/** + * Start a CLI REPL. + */ +function startRepl (replService: ReplService, service: Service, state: EvalState, code?: string) { + // Eval incoming code before the REPL starts. + if (code) { + try { + replService.evalCode(`${code}\n`) + } catch (err) { + replService.console.error(err) + process.exit(1) + } + } + + const repl = start({ + prompt: '> ', + input: replService.stdin, + output: replService.stdout, + // Mimicking node's REPL implementation: https://github.com/nodejs/node/blob/168b22ba073ee1cbf8d0bcb4ded7ff3099335d04/lib/internal/repl.js#L28-L30 + terminal: (replService.stdout as tty.WriteStream).isTTY && !parseInt(process.env.NODE_NO_READLINE!, 10), + eval: replService.nodeEval, + useGlobal: true + }) + + // Bookmark the point where we should reset the REPL state. + const resetEval = appendEval(state, '') + + function reset () { + resetEval() + + // Hard fix for TypeScript forcing `Object.defineProperty(exports, ...)`. + exec('exports = module.exports', state.path) + } + + reset() + repl.on('reset', reset) + + repl.defineCommand('type', { + help: 'Check the type of a TypeScript identifier', + action: function (identifier: string) { + if (!identifier) { + repl.displayPrompt() + return + } + + const undo = appendEval(state, identifier) + const { name, comment } = service.getTypeInfo(state.input, state.path, state.input.length) + + undo() + + if (name) repl.outputStream.write(`${name}\n`) + if (comment) repl.outputStream.write(`${comment}\n`) + repl.displayPrompt() + } + }) + + // Set up REPL history when available natively via node.js >= 11. + if (repl.setupHistory) { + const historyPath = process.env.TS_NODE_HISTORY || join(homedir(), '.ts_node_repl_history') + + repl.setupHistory(historyPath, err => { + if (!err) return + + replService.console.error(err) + process.exit(1) + }) + } +} + +/** + * Append to the eval instance and return an undo function. + */ +function appendEval (state: EvalState, input: string) { + const undoInput = state.input + const undoVersion = state.version + const undoOutput = state.output + const undoLines = state.lines + + // Handle ASI issues with TypeScript re-evaluation. + if (undoInput.charAt(undoInput.length - 1) === '\n' && /^\s*[\/\[(`-]/.test(input) && !/;\s*$/.test(undoInput)) { + state.input = `${state.input.slice(0, -1)};\n` + } + + state.input += input + state.lines += lineCount(input) + state.version++ + + return function () { + state.input = undoInput + state.output = undoOutput + state.version = undoVersion + state.lines = undoLines + } +} + +/** + * Count the number of lines. + */ +function lineCount (value: string) { + let count = 0 + + for (const char of value) { + if (char === '\n') { + count++ + } + } + + return count +} + +const RECOVERY_CODES: Set = new Set([ + 1003, // "Identifier expected." + 1005, // "')' expected." + 1109, // "Expression expected." + 1126, // "Unexpected end of text." + 1160, // "Unterminated template literal." + 1161, // "Unterminated regular expression literal." + 2355 // "A function whose declared type is neither 'void' nor 'any' must return a value." +]) + +/** + * Check if a function can recover gracefully. + */ +function isRecoverable (error: TSError) { + return error.diagnosticCodes.every(code => RECOVERY_CODES.has(code)) +} From 8b05af72661f5a2fdee92e7f30965f8623d0e41d Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Thu, 3 Dec 2020 02:09:05 -0500 Subject: [PATCH 084/113] 9.1.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 889eb55c5..3e45228d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "9.0.0", + "version": "9.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9020a58fc..6e35adce7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "9.0.0", + "version": "9.1.0", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "exports": { From d2ccc5cd20c77828817cd3acb639430eac4a884d Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 7 Dec 2020 09:47:10 -0500 Subject: [PATCH 085/113] 9.1.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e45228d1..20eef5edd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "9.1.0", + "version": "9.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6e35adce7..2e8a950c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-node", - "version": "9.1.0", + "version": "9.1.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "exports": { From ece567b4d513e11a7d478e655bb7222b76cdd895 Mon Sep 17 00:00:00 2001 From: Adrian Leonhard Date: Wed, 16 Dec 2020 21:11:09 +0100 Subject: [PATCH 086/113] Clarify README for tsx/jsx endings. (#1179) * Clarify README for tsx/jsx endings. * Make wording less ambiguous * Update README.md * Update README.md Co-authored-by: Andrew Bradley --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0ef1317cc..cb9994de8 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,10 @@ Create a new Node.js configuration and add `-r ts-node/register` to "Node parame ## How It Works -**TypeScript Node** works by registering the TypeScript compiler for `.tsx?` and `.jsx?` (when `allowJs == true`) extensions. When node.js has an extension registered (via `require.extensions`), it will use the extension internally for module resolution. When an extension is unknown to node.js, it handles the file as `.js` (JavaScript). By default, **TypeScript Node** avoids compiling files in `/node_modules/` for three reasons: +**TypeScript Node** works by registering the TypeScript compiler for `.ts`, `.tsx`, `.js`, and `.jsx` extensions. +`.js` and `.jsx` are only registered when [`allowJs`](https://www.typescriptlang.org/docs/handbook/compiler-options.html#compiler-options) is enabled. +`.tsx` and `.jsx` are only registered when [`jsx`](https://www.typescriptlang.org/docs/handbook/jsx.html) is enabled. +When node.js has an extension registered (via `require.extensions`), it will use the extension internally for module resolution. When an extension is unknown to node.js, it handles the file as `.js` (JavaScript). By default, **TypeScript Node** avoids compiling files in `/node_modules/` for three reasons: 1. Modules should always be published in a format node.js can consume 2. Transpiling the entire dependency tree will make your project slower From 186e6267d4fbc369efa251cb22bb37277d8a1295 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 23 Dec 2020 12:36:05 -0500 Subject: [PATCH 087/113] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index e62997d71..c78ef6f1a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,8 +2,8 @@ contact_links: - name: Question - about: "Please ask and answer usage questions on Stack Overflow." - url: "https://stackoverflow.com/questions/tagged/ts-node" + about: "Please ask and answer usage questions in our Discussion forum." + url: "https://github.com/TypeStrong/ts-node/discussions" - name: Chat about: "Alternatively, you can use the TypeScript Community Discord." From 3d103b71b1c7695fcc5f5bdb9bf3c018677dce55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Jan 2021 14:42:47 -0500 Subject: [PATCH 088/113] Bump axios from 0.19.0 to 0.21.1 (#1187) Bumps [axios](https://github.com/axios/axios) from 0.19.0 to 0.21.1. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.19.0...v0.21.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 37 ++++++++----------------------------- package.json | 2 +- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20eef5edd..166249471 100644 --- a/package-lock.json +++ b/package-lock.json @@ -514,13 +514,12 @@ "dev": true }, "axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "dev": true, "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" + "follow-redirects": "^1.10.0" } }, "balanced-match": { @@ -913,30 +912,10 @@ } }, "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", - "dev": true, - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "dev": true }, "foreground-child": { "version": "2.0.0", diff --git a/package.json b/package.json index 2e8a950c6..d934ede48 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "@types/rimraf": "^3.0.0", "@types/semver": "^7.1.0", "@types/source-map-support": "^0.5.0", - "axios": "^0.19.0", + "axios": "^0.21.1", "chai": "^4.0.1", "get-stream": "^6.0.0", "lodash": "^4.17.15", From c46a956ce8bc8836394db11723b4904ce52541ee Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 Jan 2021 17:03:32 -0500 Subject: [PATCH 089/113] Declare all env vars (#1191) --- src/index.ts | 67 ++++++++++++++++++++++++++++++++++++++-------------- src/repl.ts | 6 ++--- 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/index.ts b/src/index.ts index 47b986374..d82f78e55 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,6 +47,37 @@ declare global { } } +/** @internal */ +export const env = process.env as ProcessEnv +/** + * Declare all env vars, to aid discoverability. + * If an env var affects ts-node's behavior, it should not be buried somewhere in our codebase. + * @internal + */ +export interface ProcessEnv { + TS_NODE_DEBUG?: string + TS_NODE_DIR?: string + TS_NODE_EMIT?: string + TS_NODE_SCOPE?: string + TS_NODE_FILES?: string + TS_NODE_PRETTY?: string + TS_NODE_COMPILER?: string + TS_NODE_COMPILER_OPTIONS?: string + TS_NODE_IGNORE?: string + TS_NODE_PROJECT?: string + TS_NODE_SKIP_PROJECT?: string + TS_NODE_SKIP_IGNORE?: string + TS_NODE_PREFER_TS_EXTS?: string + TS_NODE_IGNORE_DIAGNOSTICS?: string + TS_NODE_TRANSPILE_ONLY?: string + TS_NODE_TYPE_CHECK?: string + TS_NODE_COMPILER_HOST?: string + TS_NODE_LOG_ERROR?: string + TS_NODE_HISTORY?: string + + NODE_NO_READLINE?: string +} + /** * @internal */ @@ -63,7 +94,7 @@ function yn (value: string | undefined) { /** * Debugging `ts-node`. */ -const shouldDebug = yn(process.env.TS_NODE_DEBUG) +const shouldDebug = yn(env.TS_NODE_DEBUG) /** @internal */ export const debug = shouldDebug ? (...args: any) => console.log(`[ts-node ${new Date().toISOString()}]`, ...args) @@ -284,23 +315,23 @@ export interface TypeInfo { * variables. */ export const DEFAULTS: RegisterOptions = { - dir: process.env.TS_NODE_DIR, - emit: yn(process.env.TS_NODE_EMIT), - scope: yn(process.env.TS_NODE_SCOPE), - files: yn(process.env.TS_NODE_FILES), - pretty: yn(process.env.TS_NODE_PRETTY), - compiler: process.env.TS_NODE_COMPILER, - compilerOptions: parse(process.env.TS_NODE_COMPILER_OPTIONS), - ignore: split(process.env.TS_NODE_IGNORE), - project: process.env.TS_NODE_PROJECT, - skipProject: yn(process.env.TS_NODE_SKIP_PROJECT), - skipIgnore: yn(process.env.TS_NODE_SKIP_IGNORE), - preferTsExts: yn(process.env.TS_NODE_PREFER_TS_EXTS), - ignoreDiagnostics: split(process.env.TS_NODE_IGNORE_DIAGNOSTICS), - transpileOnly: yn(process.env.TS_NODE_TRANSPILE_ONLY), - typeCheck: yn(process.env.TS_NODE_TYPE_CHECK), - compilerHost: yn(process.env.TS_NODE_COMPILER_HOST), - logError: yn(process.env.TS_NODE_LOG_ERROR), + dir: env.TS_NODE_DIR, + emit: yn(env.TS_NODE_EMIT), + scope: yn(env.TS_NODE_SCOPE), + files: yn(env.TS_NODE_FILES), + pretty: yn(env.TS_NODE_PRETTY), + compiler: env.TS_NODE_COMPILER, + compilerOptions: parse(env.TS_NODE_COMPILER_OPTIONS), + ignore: split(env.TS_NODE_IGNORE), + project: env.TS_NODE_PROJECT, + skipProject: yn(env.TS_NODE_SKIP_PROJECT), + skipIgnore: yn(env.TS_NODE_SKIP_IGNORE), + preferTsExts: yn(env.TS_NODE_PREFER_TS_EXTS), + ignoreDiagnostics: split(env.TS_NODE_IGNORE_DIAGNOSTICS), + transpileOnly: yn(env.TS_NODE_TRANSPILE_ONLY), + typeCheck: yn(env.TS_NODE_TYPE_CHECK), + compilerHost: yn(env.TS_NODE_COMPILER_HOST), + logError: yn(env.TS_NODE_LOG_ERROR), experimentalEsmLoader: false } diff --git a/src/repl.ts b/src/repl.ts index 122abbf51..35dd6919b 100644 --- a/src/repl.ts +++ b/src/repl.ts @@ -3,7 +3,7 @@ import { homedir } from 'os' import { join } from 'path' import { Recoverable, start } from 'repl' import { Script } from 'vm' -import { Service, CreateOptions, TSError } from './index' +import { Service, CreateOptions, TSError, env } from './index' import { readFileSync, statSync } from 'fs' import { Console } from 'console' import * as tty from 'tty' @@ -215,7 +215,7 @@ function startRepl (replService: ReplService, service: Service, state: EvalState input: replService.stdin, output: replService.stdout, // Mimicking node's REPL implementation: https://github.com/nodejs/node/blob/168b22ba073ee1cbf8d0bcb4ded7ff3099335d04/lib/internal/repl.js#L28-L30 - terminal: (replService.stdout as tty.WriteStream).isTTY && !parseInt(process.env.NODE_NO_READLINE!, 10), + terminal: (replService.stdout as tty.WriteStream).isTTY && !parseInt(env.NODE_NO_READLINE!, 10), eval: replService.nodeEval, useGlobal: true }) @@ -254,7 +254,7 @@ function startRepl (replService: ReplService, service: Service, state: EvalState // Set up REPL history when available natively via node.js >= 11. if (repl.setupHistory) { - const historyPath = process.env.TS_NODE_HISTORY || join(homedir(), '.ts_node_repl_history') + const historyPath = env.TS_NODE_HISTORY || join(homedir(), '.ts_node_repl_history') repl.setupHistory(historyPath, err => { if (!err) return From 7324e29719b7f99efcb3322e76e2ca23d24401b0 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 Jan 2021 17:25:29 -0500 Subject: [PATCH 090/113] Add self to package.json contributors array (#1190) --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index d934ede48..6b632d010 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,11 @@ "email": "hello@blakeembrey.com", "url": "http://blakeembrey.me" }, + "contributors": [{ + "name": "Andrew Bradley", + "email": "cspotcode@gmail.com", + "url": "https://github.com/cspotcode" + }], "license": "MIT", "bugs": { "url": "https://github.com/TypeStrong/ts-node/issues" From 660d0c250ac2ba74d24daf1a53d6130b52d3248b Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 Jan 2021 17:39:53 -0500 Subject: [PATCH 091/113] try out a smaller codecov report in gh comments (#1192) --- codecov.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/codecov.yml b/codecov.yml index fd87799a9..0268f4d32 100644 --- a/codecov.yml +++ b/codecov.yml @@ -13,3 +13,6 @@ coverage: project: default: threshold: 1% + +comment: + layout: "reach, files" From 67ebd4d3320d776722d89b9836fe040d437dd8f6 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 Jan 2021 17:52:43 -0500 Subject: [PATCH 092/113] Update codecov.yml (#1196) --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 0268f4d32..4aaa7bb83 100644 --- a/codecov.yml +++ b/codecov.yml @@ -15,4 +15,4 @@ coverage: threshold: 1% comment: - layout: "reach, files" + layout: "files" From 82755eb269a1815759302ab840e248a5b26fa213 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 Jan 2021 17:53:05 -0500 Subject: [PATCH 093/113] fix dependabot alerts (#1193) --- package-lock.json | 266 +++++++++++++++------------------------------- package.json | 16 +-- 2 files changed, 97 insertions(+), 185 deletions(-) diff --git a/package-lock.json b/package-lock.json index 166249471..833345fb2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -454,7 +454,7 @@ "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, "ansi-regex": { @@ -501,12 +501,6 @@ "sprintf-js": "~1.0.2" } }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, "assertion-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", @@ -541,7 +535,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "buffer-from": { @@ -702,12 +696,6 @@ "safe-buffer": "~5.1.1" } }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - }, "create-require": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.0.tgz", @@ -806,15 +794,6 @@ "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, "es-abstract": { "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", @@ -857,21 +836,6 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" - } - }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -903,9 +867,9 @@ } }, "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, "requires": { "is-buffer": "~2.0.3" @@ -969,6 +933,20 @@ "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "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" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -984,7 +962,7 @@ "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "has": { @@ -1029,7 +1007,7 @@ "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "html-escaper": { @@ -1038,12 +1016,6 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -1073,9 +1045,9 @@ "dev": true }, "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true }, "is-callable": { @@ -1111,12 +1083,6 @@ "has": "^1.0.3" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -1150,16 +1116,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -1271,9 +1227,9 @@ } }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { @@ -1357,19 +1313,19 @@ "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { "chalk": "^2.0.1" } }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "make-dir": { @@ -1409,6 +1365,12 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, "mkdirp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", @@ -1427,9 +1389,9 @@ } }, "mocha": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", - "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -1444,7 +1406,7 @@ "js-yaml": "3.13.1", "log-symbols": "2.2.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", + "mkdirp": "0.5.4", "ms": "2.1.1", "node-environment-flags": "1.0.5", "object.assign": "4.1.0", @@ -1452,53 +1414,24 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.3.0", - "yargs-parser": "13.1.1", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", "yargs-unparser": "1.6.0" }, "dependencies": { "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "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" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "dev": true, "requires": { - "minimist": "0.0.8" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" + "minimist": "^1.2.5" } } } @@ -1518,7 +1451,7 @@ "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", @@ -1528,21 +1461,11 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -1934,24 +1857,15 @@ "fromentries": "^1.2.0" } }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, "prop-types": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "dev": true, "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, "proxyquire": { @@ -1966,17 +1880,22 @@ } }, "react": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", - "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "dev": true, "requires": { - "fbjs": "^0.8.16", "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "prop-types": "^15.6.2" } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -2053,12 +1972,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2128,7 +2041,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -2439,12 +2352,6 @@ } } }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", - "dev": true - }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", @@ -2463,11 +2370,14 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", - "dev": true + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } }, "which-module": { "version": "2.0.0", @@ -2478,7 +2388,7 @@ "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "^1.0.2 || 2" @@ -2548,9 +2458,9 @@ "dev": true }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -2562,19 +2472,19 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "yargs-parser": "^13.1.2" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -2585,7 +2495,7 @@ "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -2594,9 +2504,9 @@ } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -2606,7 +2516,7 @@ "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { "flat": "^4.1.0", diff --git a/package.json b/package.json index 6b632d010..ec831c6fc 100644 --- a/package.json +++ b/package.json @@ -74,11 +74,13 @@ "email": "hello@blakeembrey.com", "url": "http://blakeembrey.me" }, - "contributors": [{ - "name": "Andrew Bradley", - "email": "cspotcode@gmail.com", - "url": "https://github.com/cspotcode" - }], + "contributors": [ + { + "name": "Andrew Bradley", + "email": "cspotcode@gmail.com", + "url": "https://github.com/cspotcode" + } + ], "license": "MIT", "bugs": { "url": "https://github.com/TypeStrong/ts-node/issues" @@ -99,11 +101,11 @@ "chai": "^4.0.1", "get-stream": "^6.0.0", "lodash": "^4.17.15", - "mocha": "^6.2.2", + "mocha": "^6.2.3", "ntypescript": "^1.201507091536.1", "nyc": "^15.0.1", "proxyquire": "^2.0.0", - "react": "^16.0.0", + "react": "^16.14.0", "rimraf": "^3.0.0", "semver": "^7.1.3", "tslint": "^6.1.0", From ed4828d6b3c4ec28489d4dd5d5e2b24b0fbea32d Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 30 Jan 2021 20:20:34 -0500 Subject: [PATCH 094/113] Create .gitattributes (#1205) --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..9b98cc127 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +raw/* linguist-vendored From 237ea5a4830a83e4bf9e0414d46c44ca2b9f7f76 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 31 Jan 2021 02:22:41 -0500 Subject: [PATCH 095/113] trigger linguist reindex (#1206) * Create .gitattributes * Update node-esm-resolve-implementation-v13.12.0.js * Update node-esm-resolve-implementation-v15.3.0.js --- raw/node-esm-resolve-implementation-v13.12.0.js | 1 + raw/node-esm-resolve-implementation-v15.3.0.js | 1 + 2 files changed, 2 insertions(+) diff --git a/raw/node-esm-resolve-implementation-v13.12.0.js b/raw/node-esm-resolve-implementation-v13.12.0.js index 730c815b8..1c2b8e67f 100644 --- a/raw/node-esm-resolve-implementation-v13.12.0.js +++ b/raw/node-esm-resolve-implementation-v13.12.0.js @@ -661,3 +661,4 @@ module.exports = { defaultResolve, getPackageType }; + diff --git a/raw/node-esm-resolve-implementation-v15.3.0.js b/raw/node-esm-resolve-implementation-v15.3.0.js index 8a5bc841a..782b892a6 100644 --- a/raw/node-esm-resolve-implementation-v15.3.0.js +++ b/raw/node-esm-resolve-implementation-v15.3.0.js @@ -897,3 +897,4 @@ module.exports = { packageExportsResolve, packageImportsResolve }; + From b3b8573e9be633bcfa5bbaee5e1246c0c67f541e Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 10 Feb 2021 16:21:20 -0500 Subject: [PATCH 096/113] Docusaurus-powered documentation website (#1207) * add results of `npx @docusaurus/init@latest init ts-node classic` * make screenshot look nice on dark themes via transparent background and outline * customize website * add gh workflow to publish the site * fix the build * change color palette to be TS-ey * add square logo icon * cleanup getting started page * misc futzing * tweak screenshot to trim border * fix docusaurus config with proper url & baseurl * fix screenshot on homepage * add typedoc rendered to `./api` url * marker internal helper functions as "internal"; they were showing up in typedoc * writing out a bunch of docs pages * homepage code cleanup * fix workflow * fix workflow * fix workflow * add "under construction" message * fix readme link * tweak docs; stop building on this topic branch * update package-lock and tweak git user for publishing --- .github/workflows/website.yml | 31 + .gitignore | 1 + logo-icon.svg | 180 + package-lock.json | 189 + package.json | 1 + screenshot.png | Bin 121651 -> 92219 bytes src/index.ts | 3 + tsconfig.json | 7 +- website/.gitignore | 20 + website/README.md | 33 + website/babel.config.js | 3 + website/docs/configuration.md | 105 + website/docs/errors.md | 32 + website/docs/getting-started.md | 153 + website/docs/how-it-works.md | 14 + website/docs/imports.md | 23 + website/docs/integrations.md | 62 + website/docs/shebang.md | 3 + website/docusaurus.config.js | 97 + website/package.json | 34 + website/sidebars.js | 13 + website/src/css/custom.css | 35 + website/src/pages/index.js | 58 + website/src/pages/styles.module.css | 37 + website/static/.nojekyll | 0 website/static/img/favicon.ico | Bin 0 -> 221398 bytes website/static/img/logo-icon.svg | 1 + website/static/img/logo.svg | 1 + website/static/img/screenshot.png | 1 + .../static/img/undraw_docusaurus_mountain.svg | 170 + .../static/img/undraw_docusaurus_react.svg | 169 + website/static/img/undraw_docusaurus_tree.svg | 1 + website/yarn.lock | 10294 ++++++++++++++++ 33 files changed, 11770 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/website.yml create mode 100644 logo-icon.svg create mode 100644 website/.gitignore create mode 100644 website/README.md create mode 100644 website/babel.config.js create mode 100644 website/docs/configuration.md create mode 100644 website/docs/errors.md create mode 100644 website/docs/getting-started.md create mode 100644 website/docs/how-it-works.md create mode 100644 website/docs/imports.md create mode 100644 website/docs/integrations.md create mode 100644 website/docs/shebang.md create mode 100644 website/docusaurus.config.js create mode 100644 website/package.json create mode 100644 website/sidebars.js create mode 100644 website/src/css/custom.css create mode 100644 website/src/pages/index.js create mode 100644 website/src/pages/styles.module.css create mode 100644 website/static/.nojekyll create mode 100644 website/static/img/favicon.ico create mode 120000 website/static/img/logo-icon.svg create mode 100644 website/static/img/logo.svg create mode 120000 website/static/img/screenshot.png create mode 100644 website/static/img/undraw_docusaurus_mountain.svg create mode 100644 website/static/img/undraw_docusaurus_react.svg create mode 100644 website/static/img/undraw_docusaurus_tree.svg create mode 100644 website/yarn.lock diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 000000000..68e1b0377 --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,31 @@ +name: Publish website +on: + # branches pushed by collaborators + push: + branches: + - master +jobs: + build: + name: Build & Deploy + runs-on: ubuntu-20.04 + steps: + # checkout code + - uses: actions/checkout@v2 + # install node + - name: Use Node.js 14 + uses: actions/setup-node@v1 + with: + node-version: 14 + # Render typedoc + - run: npm install && ./node_modules/.bin/typedoc + # Render docusaurus and deploy website + - run: | + set -euo pipefail + git config --global user.name "GitHub Action" + git config --global user.email "github-action@users.noreply.github.com" + cd website + yarn + yarn deploy + env: + GIT_USER: ${{ github.actor }} + GIT_PASS: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 483b6923a..600675c4f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ tsconfig.schema.json tsconfig.schemastore-schema.json .idea/ /.vscode/ +/website/static/api diff --git a/logo-icon.svg b/logo-icon.svg new file mode 100644 index 000000000..8757b0806 --- /dev/null +++ b/logo-icon.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index 833345fb2..9d3d84035 100644 --- a/package-lock.json +++ b/package-lock.json @@ -507,6 +507,12 @@ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -669,6 +675,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", @@ -897,6 +909,18 @@ "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", "dev": true }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -965,6 +989,19 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1044,6 +1081,12 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -1282,6 +1325,16 @@ } } }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -1328,6 +1381,21 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -1350,6 +1418,12 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=" }, + "marked": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz", + "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -1448,6 +1522,12 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", @@ -1728,6 +1808,15 @@ "wrappy": "1" } }, + "onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + } + }, "p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", @@ -1857,6 +1946,12 @@ "fromentries": "^1.2.0" } }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -1896,6 +1991,15 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -1987,6 +2091,27 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shiki": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.2.tgz", + "integrity": "sha512-BjUCxVbxMnvjs8jC4b+BQ808vwjJ9Q8NtLqPwXShZ307HdXiDFYP968ORSVfaTNNSWYDBYdMnVKJ0fYNsoZUBA==", + "dev": true, + "requires": { + "onigasm": "^2.2.5", + "vscode-textmate": "^5.2.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -2256,6 +2381,39 @@ "is-typedarray": "^1.0.0" } }, + "typedoc": { + "version": "0.20.23", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.23.tgz", + "integrity": "sha512-RBXuM0MJ2V/7eGg4YrDEmV1bn/ypa3Wx6AO1B0mUBHEQJaOIKEEnNI0Su75J6q7dkB5ksZvGNgsGjvfWL8Myjg==", + "dev": true, + "requires": { + "colors": "^1.4.0", + "fs-extra": "^9.1.0", + "handlebars": "^4.7.6", + "lodash": "^4.17.20", + "lunr": "^2.3.9", + "marked": "^1.2.9", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.4", + "shiki": "^0.9.2", + "typedoc-default-themes": "^0.12.7" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "typedoc-default-themes": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.7.tgz", + "integrity": "sha512-0XAuGEqID+gon1+fhi4LycOEFM+5Mvm2PjwaiVZNAzU7pn3G2DEpsoXnFOPlLDnHY6ZW0BY0nO7ur9fHOFkBLQ==", + "dev": true + }, "typescript": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", @@ -2352,6 +2510,19 @@ } } }, + "uglify-js": { + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.7.tgz", + "integrity": "sha512-SIZhkoh+U/wjW+BHGhVwE9nt8tWJspncloBcFapkpGRwNPqcH8pzX36BXe3TPBjzHWPMUZotpCigak/udWNr1Q==", + "dev": true, + "optional": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", @@ -2370,6 +2541,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2394,6 +2571,12 @@ "string-width": "^1.0.2 || 2" } }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -2457,6 +2640,12 @@ "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", "dev": true }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", diff --git a/package.json b/package.json index ec831c6fc..fbee06d37 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "semver": "^7.1.3", "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", + "typedoc": "^0.20.20", "typescript": "4.1.2", "typescript-json-schema": "^0.42.0", "util.promisify": "^1.0.1" diff --git a/screenshot.png b/screenshot.png index cf35ed5fb0573b42ebc5ba76b14a5e4ccbe6f19c..6204474193f4990fe66a94aa07b115551fb21166 100644 GIT binary patch literal 92219 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 literal 121651 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�v~NPW~-Ncb3&-V$hvXo zBhS|WZFJR^Zw_jN;9=-9QD+~hGMgq(nDO~xg$X?0_Ekz94}0}$sFU&B2^FTL{`A@y z*f3$?QK_$_IbHeI?^I=^W=Iw4@>I*I-XxN}H(DNa1Csa^E-g-7~m)$#A_tqi3%Za@GkI&R@j8SOB%vvanz1TR4Rc zhZB3)TVk^LmuFT3g$BD~r@3Qu!HWuV9?SckbMvFgMY0yH&;N&l`$?Cv{A4#6m^|I_ zk#+`j<+54eRpVZ>_;;60#>;!DBV5IculCg&kQyx=ue!(48l}l!F@ih-c zlcB;I6%T_r_D!_8s;Zc}!s)aR^$V_ox$CDnm%OV7?%%WIh0o9hVp&fi~jqXGd?PL7F z&%Hz#PtdnhOq@2VC-%xu3Bzv5X4cVVFmy&({s>K|dIi@NUYv5;Ip)suFtgB`AKOX< zq`99@MO0ST%VsJBefZF5GM)~yn{I%aj|7LeG*4?oOR^A7e}?J1o0M3;Xs)50UJRT% z5veqzH1>dEn!jJiJY;6hFQ>L6OmN(BmlEA=_UAeYpVuGX9v#Sm_DMTgi=A zNl#^>&C0)28%LG}Qn5hB9 z9KNg7_$97dr)?(v6~?TI!hCRQpp0dWsrVm@?58i2`1p&m-ckC*@7?1=5ahw6{e{}| zq^KzD34QVpO*WjrNbZD$3yymdrn1MFtN=NKNT;WznGBX$JBY2sn!xhaNj!Pzbxy}i z?qry!L_-4obAU|yokt{iPzN)G=jjr2 zY5W;?Z{IBr{AtZX4O5Id9}_f>w2Kbqc$iJ7GZ{LlRVx2|1sk? z7PNn&cML7$9{1=EM0au13yz;|<|cBW2q5wwRe+zvl)$yiGzL(;Q-!6 zm0)*Wits<5^r_cV_{Fno!(-z9zV?sz?#27FpVsvI{O6`VZ~lz7Q6T)E1N z=djUtueF{#bIC8kHdv}!)yl&V^Dkjb*gSCp6fVk`>^bX8HEDXujotm^>CJ(HdJ5Z| zyB~49^=G+(Jlk2+;N+rY`+d3lzpgzjO|_VvA_LrSut8r}uWx<*Uuna- zLoL3aTs6GVDi{HU0KE(8w{st#RF~@)(~UC85IT6*D*peDkB=W8P-H)PYO1#M7th2` z81C~`4G0MlIdAv5A}1U&s`C{Q~PT5j?e3MKe}{UZ@qE+ghq^FS!&XO(C~jY zesWe@6n%Hz+R629)qzqhyAyr*;d zoTU%+RA)Rx4-cUBO#%XUQWvgaLpKQ+nNygWc27x|g%M>O0w;ijSJPWJNntTB2-uwu zYRdG(h%pBRZpMSLVyCh&f)`lE0w;OBIhR>tafA+Vejrj~wIdeumNtxf3LKcDF$K?n zqsb3ej*sRkSX)%COn!mHKG|Czr{;_!d Zmw(C|8yP!^ubcr0JYD@<);T3K0RY~}u#Nx# diff --git a/src/index.ts b/src/index.ts index d82f78e55..bae0f5263 100644 --- a/src/index.ts +++ b/src/index.ts @@ -349,6 +349,7 @@ const TS_NODE_COMPILER_OPTIONS = { /** * Split a string array of values. + * @internal */ export function split (value: string | undefined) { return typeof value === 'string' ? value.split(/ *, */g) : undefined @@ -356,6 +357,7 @@ export function split (value: string | undefined) { /** * Parse a string as JSON. + * @internal */ export function parse (value: string | undefined): object | undefined { return typeof value === 'string' ? JSON.parse(value) : undefined @@ -363,6 +365,7 @@ export function parse (value: string | undefined): object | undefined { /** * Replace backslashes with forward slashes. + * @internal */ export function normalizeSlashes (value: string): string { return value.replace(/\\/g, '/') diff --git a/tsconfig.json b/tsconfig.json index 0132c19cf..b710eb46f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,5 +16,10 @@ }, "include": [ "src/**/*" - ] + ], + "typedocOptions": { + "entryPoints": ["./src/index.ts"], + "readme": "none", + "out": "website/static/api" + } } diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 000000000..b2d6de306 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/website/README.md b/website/README.md new file mode 100644 index 000000000..8960fa2af --- /dev/null +++ b/website/README.md @@ -0,0 +1,33 @@ +# Website + +This website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. + +## Installation + +```console +yarn install +``` + +## Local Development + +```console +yarn start +``` + +This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. + +## Build + +```console +yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +## Deployment + +```console +GIT_USER= USE_SSH=true yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/babel.config.js b/website/babel.config.js new file mode 100644 index 000000000..e00595dae --- /dev/null +++ b/website/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/website/docs/configuration.md b/website/docs/configuration.md new file mode 100644 index 000000000..21025d955 --- /dev/null +++ b/website/docs/configuration.md @@ -0,0 +1,105 @@ +--- +title: Configuration +--- + +You can set options by passing them before the script path, via programmatic usage, via `tsconfig.json`, or via environment variables. + +```sh +ts-node --compiler ntypescript --project src/tsconfig.json hello-world.ts +``` + +**Note:** [`ntypescript`](https://github.com/TypeStrong/ntypescript#readme) is an example of a TypeScript-compatible `compiler`. + + +## Options via tsconfig.json (recommended) + +`ts-node` loads `tsconfig.json` automatically. Use this recommended configuration as a starting point. + +```jsonc +// tsconfig.json +{ + "ts-node": { + // Most ts-node options can be specified here using their programmatic, camel-case names. + "transpileOnly": true, // It is faster to skip typechecking. Remove if you want ts-node to do typechecking + "files": true, + "compilerOptions": { + // typescript compilerOptions specified here will override those declared below, but *only* in ts-node + } + }, + + "compilerOptions": { + // Copied from @tsconfig/node10: https://github.com/tsconfig/bases/blob/master/bases/node10.json + "lib": ["es2018"], + "module": "commonjs", + "target": "es2018", + + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} +``` + +Use `--skip-project` to skip loading the `tsconfig.json`. + +Our bundled [JSON schema](https://unpkg.com/browse/ts-node@latest/tsconfig.schema.json) lists all compatible options. + +### Finding `tsconfig.json` + +It is resolved relative to `--dir` using [the same search behavior as `tsc`](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html). In `--script-mode`, this is the directory containing the script. Otherwise it is resolved relative to `process.cwd()`, which matches the behavior of `tsc`. + +Use `--project` to specify the path to your `tsconfig.json`, ignoring `--dir`. + +**Tip**: You can use `ts-node` together with [tsconfig-paths](https://www.npmjs.com/package/tsconfig-paths) to load modules according to the `paths` section in `tsconfig.json`. + +## CLI Options + +`ts-node` supports `--print` (`-p`), `--eval` (`-e`), `--require` (`-r`) and `--interactive` (`-i`) similar to the [node.js CLI options](https://nodejs.org/api/cli.html). + +* `-h, --help` Prints the help text +* `-v, --version` Prints the version. `-vv` prints node and typescript compiler versions, too +* `-s, --script-mode` Resolve config relative to the directory of the passed script instead of the current directory. Changes default of `--dir` + +## CLI and Programmatic Options + +_The name of the environment variable and the option's default value are denoted in parentheses._ + +* `-T, --transpile-only` Use TypeScript's faster `transpileModule` (`TS_NODE_TRANSPILE_ONLY`, default: `false`) +* `-H, --compiler-host` Use TypeScript's compiler host API (`TS_NODE_COMPILER_HOST`, default: `false`) +* `-I, --ignore [pattern]` Override the path patterns to skip compilation (`TS_NODE_IGNORE`, default: `/node_modules/`) +* `-P, --project [path]` Path to TypeScript JSON project file (`TS_NODE_PROJECT`) +* `-C, --compiler [name]` Specify a custom TypeScript compiler (`TS_NODE_COMPILER`, default: `typescript`) +* `-D, --ignore-diagnostics [code]` Ignore TypeScript warnings by diagnostic code (`TS_NODE_IGNORE_DIAGNOSTICS`) +* `-O, --compiler-options [opts]` JSON object to merge with compiler options (`TS_NODE_COMPILER_OPTIONS`) +* `--dir` Specify working directory for config resolution (`TS_NODE_CWD`, default: `process.cwd()`, or `dirname(scriptPath)` if `--script-mode`) +* `--scope` Scope compiler to files within `cwd` (`TS_NODE_SCOPE`, default: `false`) +* `--files` Load `files`, `include` and `exclude` from `tsconfig.json` on startup (`TS_NODE_FILES`, default: `false`) +* `--pretty` Use pretty diagnostic formatter (`TS_NODE_PRETTY`, default: `false`) +* `--skip-project` Skip project config resolution and loading (`TS_NODE_SKIP_PROJECT`, default: `false`) +* `--skip-ignore` Skip ignore checks (`TS_NODE_SKIP_IGNORE`, default: `false`) +* `--emit` Emit output files into `.ts-node` directory (`TS_NODE_EMIT`, default: `false`) +* `--prefer-ts-exts` Re-order file extensions so that TypeScript imports are preferred (`TS_NODE_PREFER_TS_EXTS`, default: `false`) +* `--log-error` Logs TypeScript errors to stderr instead of throwing exceptions (`TS_NODE_LOG_ERROR`, default: `false`) + +## Programmatic-only Options + +* `transformers` `_ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers)`: An object with transformers or a factory function that accepts a program and returns a transformers object to pass to TypeScript. Factory function cannot be used with `transpileOnly` flag +* `readFile`: Custom TypeScript-compatible file reading function +* `fileExists`: Custom TypeScript-compatible file existence function + +## `node` flags + +[`node` flags](https://nodejs.org/api/cli.html) must be passed directly to `node`; they cannot be passed to the `ts-node` binary nor can they be specified in `tsconfig.json` + +We recommend using the `NODE_OPTIONS`](https://nodejs.org/api/cli.html#cli_node_options_options) environment variable to pass options to `node`. + +``` +NODE_OPTIONS='--trace-deprecation --abort-on-uncaught-exception' ts-node ./index.ts +``` + +Alternatively, you can invoke `node` directly and install `ts-node` via `--require`/`-r` + +``` +node --trace-deprecation --abort-on-uncaught-exception -r ts-node/register ./index.ts +``` diff --git a/website/docs/errors.md b/website/docs/errors.md new file mode 100644 index 000000000..0d3b4c085 --- /dev/null +++ b/website/docs/errors.md @@ -0,0 +1,32 @@ +--- +title: Troubleshooting Errors +--- + +It is important to differentiate between errors from `ts-node`, errors from the TypeScript compiler, and errors from `node`. It is also important to understand when errors are caused by a type error in your code, a bug in your code, or a flaw in your configuration. + +## `TSError` + +Type errors from the compiler are thrown as a `TSError`. These are the same as errors you get from `tsc`. + +## `SyntaxError` + +Any error that is not a `TSError` is from node.js (e.g. `SyntaxError`), and cannot be fixed by TypeScript or `ts-node`. These are bugs in your code or configuration. + +### Unsupported JavaScript syntax + +Your version of `node` may not support all JavaScript syntax supported by TypeScript. The compiler must transform this syntax via "downleveling," which is controlled by +the [tsconfig `"target"` option](https://www.typescriptlang.org/tsconfig#target). Otherwise your code will compile fine, but node will throw a `SyntaxError`. + +For example, `node` 12 does not understand the `?.` optional chaining operator. If you use `"target": "esnext"`, then the following TypeScript syntax: + +```typescript +const bar: string | undefined = foo?.bar; +``` + +will compile into this JavaScript: + +```javascript +const a = foo?.bar; +``` + +When you try to run this code, node 12 will throw a `SyntaxError`. To fix this, you must switch to `"target": "es2019"` or lower so TypeScript transforms `?.` into something `node` can understand. diff --git a/website/docs/getting-started.md b/website/docs/getting-started.md new file mode 100644 index 000000000..6a3182f04 --- /dev/null +++ b/website/docs/getting-started.md @@ -0,0 +1,153 @@ +--- +# id: getting-started +title: Getting Started +# sidebar_label: Style Guide +slug: / +--- + +*This website is still under construction. Until it is ready, official documentation lives in our [README](https://github.com/TypeStrong/ts-node)* + +## Installation + +```sh +# Locally in your project. +npm install -D typescript +npm install -D ts-node + +# Or globally with TypeScript. +npm install -g typescript +npm install -g ts-node +``` + +**Tip:** Installing modules locally allows you to control and share the versions through `package.json`. TS Node will always resolve the compiler from `cwd` before checking relative to its own installation. + +## Usage + +### Shell + +```sh +# Execute a script as `node` + `tsc`. +ts-node script.ts + +# Starts a TypeScript REPL. +ts-node + +# Execute code with TypeScript. +ts-node -e 'console.log("Hello, world!")' + +# Execute, and print, code with TypeScript. +ts-node -p -e '"Hello, world!"' + +# Pipe scripts to execute with TypeScript. +echo 'console.log("Hello, world!")' | ts-node + +# Equivalent to ts-node --script-mode +ts-node-script scripts.ts + +# Equivalent to ts-node --transpile-only +ts-node-transpile-only scripts.ts +``` + +![TypeScript REPL](/img/screenshot.png) + +### Shebang + +```typescript +#!/usr/bin/env ts-node-script + +console.log("Hello, world!") +``` + +`ts-node-script` is recommended because it enables `--script-mode`, discovering `tsconfig.json` relative to the script's location instead of `process.cwd()`. This makes scripts more portable. + +Passing CLI arguments via shebang is allowed on Mac but not Linux. For example, the following will fail on Linux: + +``` +#!/usr/bin/env ts-node --script-mode --transpile-only --files +// This shebang is not portable. It only works on Mac +``` + +### Programmatic + +You can require `ts-node` and register the loader for future requires by using `require('ts-node').register({ /* options */ })`. You can also use file shortcuts - `node -r ts-node/register` or `node -r ts-node/register/transpile-only` - depending on your preferences. + +**Note:** If you need to use advanced node.js CLI arguments (e.g. `--inspect`), use them with `node -r ts-node/register` instead of the `ts-node` CLI. + +#### Developers + +**TS Node** exports a `create()` function that can be used to initialize a TypeScript compiler that isn't registered to `require.extensions`, and it uses the same code as `register`. + +## Help! My Types Are Missing! + +**TypeScript Node** does _not_ use `files`, `include` or `exclude`, by default. This is because a large majority projects do not use all of the files in a project directory (e.g. `Gulpfile.ts`, runtime vs tests) and parsing every file for types slows startup time. Instead, `ts-node` starts with the script file (e.g. `ts-node index.ts`) and TypeScript resolves dependencies based on imports and references. + +For global definitions, you can use the `typeRoots` compiler option. This requires that your type definitions be structured as type packages (not loose TypeScript definition files). More details on how this works can be found in the [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types). + +Example `tsconfig.json`: + +```json +{ + "compilerOptions": { + "typeRoots" : ["./node_modules/@types", "./typings"] + } +} +``` + +Example project structure: + +```text +/ +-- tsconfig.json +-- typings/ + -- / + -- index.d.ts +``` + +Example module declaration file: + +```typescript +declare module '' { + // module definitions go here +} +``` + +For module definitions, you can use [`paths`](https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping): + +```json +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "custom-module-type": ["types/custom-module-type"] + } + } +} +``` + +An alternative approach for definitions of third-party libraries are [triple-slash directives](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html). This may be helpful if you prefer not to change your TypeScript `compilerOptions` or structure your custom type definitions when using `typeRoots`. Below is an example of the triple-slash directive as a relative path within your project: + +```typescript +/// +import UntypedJsLib from "untyped_js_lib" +``` + +**Tip:** If you _must_ use `files`, `include`, or `exclude`, enable `--files` flags or set `TS_NODE_FILES=true`. + +## Watching and Restarting + +**TypeScript Node** compiles source code via `require()`, watching files and code reloads are out of scope for the project. If you want to restart the `ts-node` process on file change, existing node.js tools such as [nodemon](https://github.com/remy/nodemon), [onchange](https://github.com/Qard/onchange) and [node-dev](https://github.com/fgnass/node-dev) work. + +There's also [`ts-node-dev`](https://github.com/whitecolor/ts-node-dev), a modified version of [`node-dev`](https://github.com/fgnass/node-dev) using `ts-node` for compilation that will restart the process on file change. + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/ts-node.svg?style=flat +[npm-url]: https://npmjs.org/package/ts-node +[downloads-image]: https://img.shields.io/npm/dm/ts-node.svg?style=flat +[downloads-url]: https://npmjs.org/package/ts-node +[github-actions-image]: https://img.shields.io/github/workflow/status/TypeStrong/ts-node/Continuous%20Integration +[github-actions-url]: https://github.com/TypeStrong/ts-node/actions?query=workflow%3A%22Continuous+Integration%22 +[codecov-image]: https://codecov.io/gh/TypeStrong/ts-node/branch/master/graph/badge.svg +[codecov-url]: https://codecov.io/gh/TypeStrong/ts-node diff --git a/website/docs/how-it-works.md b/website/docs/how-it-works.md new file mode 100644 index 000000000..c6ad03373 --- /dev/null +++ b/website/docs/how-it-works.md @@ -0,0 +1,14 @@ +--- +title: How It Works +--- + +`ts-node` works by registering the TypeScript compiler for `.ts`, `.tsx`, `.js`, and `.jsx` extensions. `.js` and `.jsx` are only registered when [`allowJs`](https://www.typescriptlang.org/docs/handbook/compiler-options.html#compiler-options) is enabled. +`.tsx` and `.jsx` are only registered when [`jsx`](https://www.typescriptlang.org/docs/handbook/jsx.html) is enabled. + +When node.js has an extension registered (via `require.extensions`), it will use the extension internally for module resolution. When an extension is unknown to node.js, it handles the file as `.js` (JavaScript). By default, **TypeScript Node** avoids compiling files in `/node_modules/` for three reasons: + +1. Modules should always be published in a format node.js can consume +2. Transpiling the entire dependency tree will make your project slower +3. Differing behaviours between TypeScript and node.js (e.g. ES2015 modules) can result in a project that works until you decide to support a feature natively from node.js + +**P.S.** This means if you don't register an extension, it is compiled as JavaScript. When `ts-node` is used with `allowJs`, JavaScript files are transpiled using the TypeScript compiler. diff --git a/website/docs/imports.md b/website/docs/imports.md new file mode 100644 index 000000000..b1a010ca2 --- /dev/null +++ b/website/docs/imports.md @@ -0,0 +1,23 @@ +--- +title: "Imports: CommonJS vs native modules" +--- + +TypeScript should almost always be written using `import` and `export` syntax. You can either compile it to CommonJS or use node's native ESM support. You do not need to use node's native modules to use `import` syntax. + +### CommonJS (recommended) + +We recommend compiling to CommonJS. To do this, you must set `"module": "CommonJS"` in your `tsconfig.json` or compiler options, and make sure your package.json does *not* have `"type": "module"`. + +``` +{ + "compilerOptions": { + "module": "CommonJS" + } +} +``` + +### Native ECMAScript modules + +Node's native ESM loader hooks are currently experimental and so is `ts-node`'s ESM loader hook. This means breaking changes may happen in minor and patch releases, and it is not recommended for production. + +For usage, limitations, and to provide feedback, see [#1007](https://github.com/TypeStrong/ts-node/issues/1007). diff --git a/website/docs/integrations.md b/website/docs/integrations.md new file mode 100644 index 000000000..37a230c56 --- /dev/null +++ b/website/docs/integrations.md @@ -0,0 +1,62 @@ +--- +title: Integrations +--- + +Guides for using ts-node alongside test runners, build systems, and editors. + +### Mocha + +Mocha 6 + +```sh +mocha --require ts-node/register --watch-extensions ts,tsx "test/**/*.{ts,tsx}" [...args] +``` + +**Note:** `--watch-extensions` is only used in `--watch` mode. + +Mocha 7 + +```sh +mocha --require ts-node/register --extensions ts,tsx --watch --watch-files src 'tests/**/*.{ts,tsx}' [...args] +``` + +### Tape + +```sh +ts-node node_modules/tape/bin/tape [...args] +``` + +### Gulp + +```sh +# Create a `gulpfile.ts` and run `gulp`. +gulp +``` + +### Visual Studio Code + +Create a new node.js configuration, add `-r ts-node/register` to node args and move the `program` to the `args` list (so VS Code doesn't look for `outFiles`). + +```json +{ + "type": "node", + "request": "launch", + "name": "Launch Program", + "runtimeArgs": [ + "-r", + "ts-node/register" + ], + "args": [ + "${workspaceFolder}/index.ts" + ] +} +``` + +**Note:** If you are using the `--project ` command line argument as per the [Configuration Options](configuration), and want to apply this same behavior when launching in VS Code, add an "env" key into the launch configuration: `"env": { "TS_NODE_PROJECT": "" }`. + +### IntelliJ (and WebStorm) + +Create a new Node.js configuration and add `-r ts-node/register` to "Node parameters." + +**Note:** If you are using the `--project ` command line argument as per the [Configuration Options](configuration), and want to apply this same behavior when launching in IntelliJ, specify under "Environment Variables": `TS_NODE_PROJECT=`. + diff --git a/website/docs/shebang.md b/website/docs/shebang.md new file mode 100644 index 000000000..fef972020 --- /dev/null +++ b/website/docs/shebang.md @@ -0,0 +1,3 @@ +--- +title: Shebang +--- diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 000000000..50932db25 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,97 @@ +module.exports = { + title: 'ts-node', + tagline: 'TypeScript execution and REPL for node.js', + url: 'https://typestrong.org/ts-node', + baseUrl: '/ts-node/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + favicon: 'img/favicon.ico', + organizationName: 'TypeStrong', // Usually your GitHub org/user name. + projectName: 'ts-node', // Usually your repo name. + themeConfig: { + navbar: { + title: 'ts-node', + logo: { + alt: 'ts-node logo', + src: 'img/logo-icon.svg', + }, + items: [ + { + to: 'docs/', + activeBasePath: 'docs', + label: 'Docs', + position: 'left', + }, + { + href: 'https://typestrong.org/ts-node/api/', + label: 'API', + position: 'right', + }, + { + href: 'https://github.com/TypeStrong/ts-node', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Docs', + to: 'docs/', + } + ], + }, + { + title: 'Community', + items: [ + { + label: 'Discord', + href: 'https://discord.gg/typescript' + }, + { + label: 'Github Discussions', + href: 'https://github.com/TypeStrong/ts-node/discussions' + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'GitHub', + href: 'https://github.com/TypeStrong/ts-node', + }, + ], + }, + ], + // copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, + }, + }, + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + sidebarPath: require.resolve('./sidebars.js'), + // Please change this to your repo. + editUrl: + 'https://github.com/TypeStrong/ts-node/edit/master/website/', + }, + // blog: { + // showReadingTime: true, + // // Please change this to your repo. + // editUrl: + // 'https://github.com/facebook/docusaurus/edit/master/website/blog/', + // }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }, + ], + ], +}; diff --git a/website/package.json b/website/package.json new file mode 100644 index 000000000..13401da1a --- /dev/null +++ b/website/package.json @@ -0,0 +1,34 @@ +{ + "name": "@ts-node/website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "serve": "docusaurus serve", + "clear": "docusaurus clear" + }, + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.70", + "@docusaurus/preset-classic": "2.0.0-alpha.70", + "@mdx-js/react": "^1.6.21", + "clsx": "^1.1.1", + "react": "^16.8.4", + "react-dom": "^16.8.4" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 000000000..340bdd719 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,13 @@ +module.exports = { + primarySidebar: { + Docs: [ + 'getting-started', + 'how-it-works', + 'configuration', + 'imports', + 'integrations', + 'shebang', + 'interpreting-errors', + ], + }, +}; diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 000000000..9b7e4d80f --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,35 @@ +/* stylelint-disable docusaurus/copyright-header */ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + /* Generating by pasting #3178C6, the shade of blue from typescriptlang.org's navbar, into the palette generator at https://v2.docusaurus.io/docs/styling-layout/ */ + --ifm-color-primary: #3178c6; + --ifm-color-primary-dark: #2c6cb2; + --ifm-color-primary-darker: #2a66a8; + --ifm-color-primary-darkest: #22548b; + --ifm-color-primary-light: #4084d0; + --ifm-color-primary-lighter: #4a8bd2; + --ifm-color-primary-lightest: #689eda; + + /* Docusaurus defaults */ + /* --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: rgb(33, 175, 144); + --ifm-color-primary-darker: rgb(31, 165, 136); + --ifm-color-primary-darkest: rgb(26, 136, 112); + --ifm-color-primary-light: rgb(70, 203, 174); + --ifm-color-primary-lighter: rgb(102, 212, 189); + --ifm-color-primary-lightest: rgb(146, 224, 208); + --ifm-code-font-size: 95%; */ +} + +.docusaurus-highlight-code-line { + background-color: rgb(72, 77, 91); + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100644 index 000000000..d4434c13d --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,58 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import styles from './styles.module.css'; + +function Feature({imageUrl, title, description}) { + const imgUrl = useBaseUrl(imageUrl); + return ( +
+ {imgUrl && ( +
+ {title} +
+ )} +
+ ); +} + +function Home() { + const context = useDocusaurusContext(); + const {siteConfig = {}} = context; + return ( + +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + Get Started + +
+
+
+
+
+
+
+ screenshot of ts-node +
+
+
+
+
+ ); +} + +export default Home; diff --git a/website/src/pages/styles.module.css b/website/src/pages/styles.module.css new file mode 100644 index 000000000..c1aa85121 --- /dev/null +++ b/website/src/pages/styles.module.css @@ -0,0 +1,37 @@ +/* stylelint-disable docusaurus/copyright-header */ + +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 966px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} + +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureImage { + height: 200px; + width: 200px; +} diff --git a/website/static/.nojekyll b/website/static/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a20456b03d46c7b9c8411a1f95d72632b4e881f1 GIT binary patch literal 221398 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 \ No newline at end of file diff --git a/website/static/img/screenshot.png b/website/static/img/screenshot.png new file mode 120000 index 000000000..ad2460bf3 --- /dev/null +++ b/website/static/img/screenshot.png @@ -0,0 +1 @@ +../../../screenshot.png \ No newline at end of file diff --git a/website/static/img/undraw_docusaurus_mountain.svg b/website/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 000000000..431cef2f7 --- /dev/null +++ b/website/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_react.svg b/website/static/img/undraw_docusaurus_react.svg new file mode 100644 index 000000000..e41705043 --- /dev/null +++ b/website/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_tree.svg b/website/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 000000000..a05cc03dd --- /dev/null +++ b/website/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1 @@ +docu_tree \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 000000000..4395feb55 --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,10294 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@^1.0.0-alpha.35": + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.0.0-alpha.39.tgz#46d4c612243df75da9f2c57edd6f6d7b08633f13" + integrity sha512-Iaer2aItGbNlJr5/lI65zR0yfFCEVedBwm8A3MTLB6Gj/A5sXscL+X4mP04hQemUMqZ9c2cLryVN1UI0h09t3w== + dependencies: + "@algolia/autocomplete-shared" "1.0.0-alpha.39" + +"@algolia/autocomplete-preset-algolia@^1.0.0-alpha.35": + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.0.0-alpha.39.tgz#efbd238cf8fba4ed178344cca70b84addb0f0209" + integrity sha512-0E9dvwk1ibGpQk7Kq1M8bqcxZ5ToXowAxcICLpy6SwQoWAV4P5lygkeU3gkkEwqZCzCdRbB+KbahUP62ie26Jw== + dependencies: + "@algolia/autocomplete-shared" "1.0.0-alpha.39" + +"@algolia/autocomplete-shared@1.0.0-alpha.39": + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.0.0-alpha.39.tgz#5f661a09150cb5a049d4697eb57fffb4adbceb63" + integrity sha512-t0tOPVBjWicKWtysQZbblXmFDRToTgXXtjSeiDCeAfD9lCN7jx52F8kkT1ZnzhmAHcSpcaLagjTLttcyJwJjwQ== + +"@algolia/cache-browser-local-storage@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.4.tgz#6a03ffc6b0b5b5aa7f74732bf8091a0f3d2b0986" + integrity sha512-qSS3VMP3oMhcLrYIFveRyt3F5XB6MqWogF4Vooj8KvOvqv6jBmYwkAueSXCF5pkJEaA72VL9+9NbBpfC8ez2ww== + dependencies: + "@algolia/cache-common" "4.8.4" + +"@algolia/cache-common@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.8.4.tgz#b105bdfe3fa0ba15db936177c4db420befed2ab7" + integrity sha512-5+dLmj6qFy4WOtnNQuFRfWTIIDdpUigv+dXaKMFplNPBvZHGFy3hcRjWqYzGcqaeLqcXbN8cU5r75mvrlJIxcw== + +"@algolia/cache-in-memory@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.8.4.tgz#e978935dd8c4bbd555820e9b9fc863a24f3d38dd" + integrity sha512-PBN4YKxn/L+HjVKqUE5rtLiFKqzm4qnUoF7QvCFFmFAViCdYwZSMFVmDobstqWY3KULfsEqaeD4eU4jxZbKhEA== + dependencies: + "@algolia/cache-common" "4.8.4" + +"@algolia/client-account@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.8.4.tgz#a0af429e3587b33a988fec98ce0c739fd16143aa" + integrity sha512-mrsOnGV4O2b+t1CumUH72+Psw9d9qwngBEp2le7IMSceJQywQvNCyJ4B4qyoozHsIGapXfcVAOhRxqUsNQ6U6g== + dependencies: + "@algolia/client-common" "4.8.4" + "@algolia/client-search" "4.8.4" + "@algolia/transporter" "4.8.4" + +"@algolia/client-analytics@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.8.4.tgz#77c81b699909b50ecd9bf97997f014cfeb358fc3" + integrity sha512-Xy70njSUgG/QTv5+rPjsTIzBF/bjxseS5h9SawrQGzovTosbJbu9JBlg4YwVJnYvjovzpr7S39+gPIPc8M7+Rg== + dependencies: + "@algolia/client-common" "4.8.4" + "@algolia/client-search" "4.8.4" + "@algolia/requester-common" "4.8.4" + "@algolia/transporter" "4.8.4" + +"@algolia/client-common@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.8.4.tgz#a1b35645253c7f96925bfe91bac486e755329b77" + integrity sha512-sQlRa+KWFn+D8AOEZb4kj6RE/i6DnPwVOF4AnNf9IjNB0mUUhLWw96cQN6GDx0KE4lhW67t+qR39ZuuDBgR9ww== + dependencies: + "@algolia/requester-common" "4.8.4" + "@algolia/transporter" "4.8.4" + +"@algolia/client-recommendation@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.8.4.tgz#1aaa9735e96865ff06321a8bc850829445c945d1" + integrity sha512-CE0CVqLGWotVOaUXyU33FVD9FZ/7rqcbwFPH5MgSjVdE0B1YWVedhR0s2BNKodXLcIGVLVYfXR05CLdvOlTw+A== + dependencies: + "@algolia/client-common" "4.8.4" + "@algolia/requester-common" "4.8.4" + "@algolia/transporter" "4.8.4" + +"@algolia/client-search@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.8.4.tgz#0320c4a109d2cc220a9d1002f9ec64655a4494dc" + integrity sha512-eH2tRPnDU3tqpp0BSqP6coRRQe8fceqsupuf/1ho+Mcs5DM13mEuFmNOyPywHRlYLVPmbbCPRhDr5rB8QoN7XQ== + dependencies: + "@algolia/client-common" "4.8.4" + "@algolia/requester-common" "4.8.4" + "@algolia/transporter" "4.8.4" + +"@algolia/logger-common@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.8.4.tgz#42ecab3c92388a0d81b8532cefb47670da46cdd3" + integrity sha512-6hOaFG75Onmant9adcaeCZgvPYfnif7n0H1ycbixm6/WH3SmxqPMG+CMiW8mTNTRrrAEceQVrq6tDHD8jdnOOw== + +"@algolia/logger-console@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.8.4.tgz#adfac58df84848443bff1326986a0ca98db866b9" + integrity sha512-+9T3t/eB9vseANFz9YbFHG0cHjzVP/DVfGqzTAkeSlvMHP69JzJga9Wb0Ai6J3xXE3d4k9K+k6t+kkjCQjzEqg== + dependencies: + "@algolia/logger-common" "4.8.4" + +"@algolia/requester-browser-xhr@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.4.tgz#30c5c9d129fafd863b7c9c7a988c36ec5754b973" + integrity sha512-BYa8O/pht0UL2bcm0ZkLZiyC+5dHrbc6gvKIo+OgqxmDb/K4KrVo6RIof3BVpR8fgcfxQJohjNVHKXHxEUhBCQ== + dependencies: + "@algolia/requester-common" "4.8.4" + +"@algolia/requester-common@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.8.4.tgz#670f5e43e4d09ff9a3b9bfda7ac0c03476a9e4b1" + integrity sha512-br3LXb6srfAy7F04axwExmrkPOlXCDckgTFoLFv/RT9Oo28SpoyvHqktyBovQLdzdTs+Laglf+LtOHr0iUrZJg== + +"@algolia/requester-node-http@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.8.4.tgz#8af2cceb45e5bb2b9e7ed3b7daa34f3c2580912a" + integrity sha512-o5Cc4UxYPn3IBHQSDBNFFhq1LQLv40eYvCvK0FPJ8xZkrnNXhjPvaLCu/lQTHpk/HX7DaE6fQ/KboU0OSPKevQ== + dependencies: + "@algolia/requester-common" "4.8.4" + +"@algolia/transporter@4.8.4": + version "4.8.4" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.8.4.tgz#09452334e380ff0706676303e6642e76b72ae0bf" + integrity sha512-EvXFYICxrr9QEO6m6awUeNOBstOxePQ2Fy0jtYlS1v9TY2P5HqKRzkxmaZjeYRBsXOImpVjgQIzTzj1Au4br2w== + dependencies: + "@algolia/cache-common" "4.8.4" + "@algolia/logger-common" "4.8.4" + "@algolia/requester-common" "4.8.4" + +"@babel/code-frame@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" + integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.12.3": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.12.5": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" + integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== + dependencies: + "@babel/types" "^7.12.11" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" + integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== + dependencies: + "@babel/compat-data" "^7.12.5" + "@babel/helper-validator-option" "^7.12.1" + browserslist "^4.14.5" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" + integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + regexpu-core "^4.7.1" + +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" + integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" + integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/types" "^7.12.11" + +"@babel/helper-get-function-arity@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" + integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== + dependencies: + "@babel/types" "^7.12.7" + +"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== + dependencies: + "@babel/types" "^7.12.5" + +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" + integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-plugin-utils@7.10.4", "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/types" "^7.12.1" + +"@babel/helper-replace-supers@^7.12.1": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d" + integrity sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.7" + "@babel/helper-optimise-call-expression" "^7.12.10" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.11" + +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" + integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== + dependencies: + "@babel/types" "^7.12.11" + +"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" + integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.5", "@babel/parser@^7.12.7": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" + integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== + +"@babel/plugin-proposal-async-generator-functions@^7.12.1": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" + integrity sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" + integrity sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" + integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" + integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" + integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" + integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" + integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" + integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" + integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" + integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" + integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1", "@babel/plugin-syntax-jsx@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-typescript@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5" + integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" + integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + +"@babel/plugin-transform-block-scoped-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" + integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.12.11": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz#d93a567a152c22aea3b1929bb118d1d0a175cdca" + integrity sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-classes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" + integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" + integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" + integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" + integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" + integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" + integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" + integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" + integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" + integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" + integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" + integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-identifier" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" + integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" + integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + +"@babel/plugin-transform-new-target@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" + integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" + integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + +"@babel/plugin-transform-parameters@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" + integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.1.tgz#4471f0851feec3231cc9aaa0dccde39947c1ac1e" + integrity sha512-KOHd0tIRLoER+J+8f9DblZDa1fLGPwaaN1DI1TVHuQFOpjHV22C3CUB3obeC4fexHY9nx+fH0hQNvLFFfA1mxA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-display-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" + integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-jsx-development@^7.12.7": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.12.tgz#bccca33108fe99d95d7f9e82046bfe762e71f4e7" + integrity sha512-i1AxnKxHeMxUaWVXQOSIco4tvVvvCxMSfeBMnMM06mpaJt3g+MpxYQQrDfojUQldP1xxraPSJYSMEljoWM/dCg== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.12.12" + +"@babel/plugin-transform-react-jsx@^7.12.10", "@babel/plugin-transform-react-jsx@^7.12.12": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.12.tgz#b0da51ffe5f34b9a900e9f1f5fb814f9e512d25e" + integrity sha512-JDWGuzGNWscYcq8oJVCtSE61a5+XAOos+V0HrxnDieUus4UMnBEosDnY1VJqU5iZ4pA04QY7l0+JvHL1hZEfsw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.10" + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/types" "^7.12.12" + +"@babel/plugin-transform-react-pure-annotations@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" + integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" + integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-runtime@^7.12.1": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" + integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== + dependencies: + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" + integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" + integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + +"@babel/plugin-transform-sticky-regex@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" + integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" + integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" + integrity sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typescript@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4" + integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.12.1" + +"@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" + integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" + integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@^7.12.1": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" + integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== + dependencies: + "@babel/compat-data" "^7.12.7" + "@babel/helper-compilation-targets" "^7.12.5" + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.11" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.7" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.11" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.7" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.10" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.11" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.5": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.10.tgz#4fed65f296cbb0f5fb09de6be8cddc85cc909be9" + integrity sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.10" + "@babel/plugin-transform-react-jsx-development" "^7.12.7" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + +"@babel/preset-typescript@^7.12.1": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz#fc7df8199d6aae747896f1e6c61fc872056632a3" + integrity sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.1" + "@babel/plugin-transform-typescript" "^7.12.1" + +"@babel/runtime-corejs3@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz#ffee91da0eb4c6dae080774e94ba606368e414f4" + integrity sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4", "@babel/template@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" + integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== + dependencies: + "@babel/code-frame" "^7.12.11" + "@babel/generator" "^7.12.11" + "@babel/helper-function-name" "^7.12.11" + "@babel/helper-split-export-declaration" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/types" "^7.12.12" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.6", "@babel/types@^7.12.7", "@babel/types@^7.4.4": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@docsearch/css@3.0.0-alpha.32": + version "3.0.0-alpha.32" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0-alpha.32.tgz#3d89c8db4035531d201f74ef2115f72094a24036" + integrity sha512-wafLX/jT1NPAwifPhzMJX394PjKdqf5TA4cz/JgvBYR1/+MiErLk/pyCmocXkawWGR17/6u2qw3wYvXu/Qe/DQ== + +"@docsearch/react@^3.0.0-alpha.31": + version "3.0.0-alpha.32" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0-alpha.32.tgz#ae3fa82e9c88683d9415bc439c4af7e2c0cfa5b7" + integrity sha512-2jqzPJu4y0mWiwwm+Kfgf/97Q8XaGxj1+jJfGJpJLkJyD8S2tK4OikyIRWI9gI9k3m48HxFm0+P8uAYYtIyjqA== + dependencies: + "@algolia/autocomplete-core" "^1.0.0-alpha.35" + "@algolia/autocomplete-preset-algolia" "^1.0.0-alpha.35" + "@docsearch/css" "3.0.0-alpha.32" + algoliasearch "^4.0.0" + +"@docusaurus/core@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-alpha.70.tgz#81bff8b093421a0c740fac02903dd23938806077" + integrity sha512-ccDcr5eb5T3C6k7VoqTclBFwjVkIHK1zISdhqzRNVl8AZTql1bYMvGUJP+2WbF6RSdmsGTNWreaUlrJc00dQqw== + dependencies: + "@babel/core" "^7.12.3" + "@babel/generator" "^7.12.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@babel/preset-typescript" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/runtime-corejs3" "^7.12.5" + "@babel/traverse" "^7.12.5" + "@docusaurus/cssnano-preset" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + "@docusaurus/utils-validation" "2.0.0-alpha.70" + "@endiliey/static-site-generator-webpack-plugin" "^4.0.0" + "@svgr/webpack" "^5.4.0" + babel-loader "^8.2.1" + babel-plugin-dynamic-import-node "2.3.0" + boxen "^4.2.0" + cache-loader "^4.1.0" + chalk "^3.0.0" + chokidar "^3.4.3" + clean-css "^4.2.3" + commander "^4.0.1" + copy-webpack-plugin "^6.3.0" + core-js "^2.6.5" + css-loader "^3.4.2" + del "^5.1.0" + detect-port "^1.3.0" + eta "^1.11.0" + express "^4.17.1" + file-loader "^6.2.0" + fs-extra "^9.0.1" + globby "^10.0.1" + html-minifier-terser "^5.1.1" + html-tags "^3.1.0" + html-webpack-plugin "^4.5.0" + import-fresh "^3.2.2" + inquirer "^7.2.0" + is-root "^2.1.0" + joi "^17.2.1" + leven "^3.1.0" + lodash "^4.17.20" + lodash.flatmap "^4.5.0" + lodash.has "^4.5.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + mini-css-extract-plugin "^0.8.0" + nprogress "^0.2.0" + null-loader "^3.0.0" + optimize-css-assets-webpack-plugin "^5.0.4" + pnp-webpack-plugin "^1.6.4" + postcss-loader "^3.0.0" + postcss-preset-env "^6.7.0" + react-dev-utils "^10.2.1" + react-helmet "^6.1.0" + react-loadable "^5.5.0" + react-loadable-ssr-addon "^0.3.0" + react-router "^5.2.0" + react-router-config "^5.1.1" + react-router-dom "^5.2.0" + resolve-pathname "^3.0.0" + semver "^6.3.0" + serve-handler "^6.1.3" + shelljs "^0.8.4" + std-env "^2.2.1" + terser-webpack-plugin "^4.1.0" + update-notifier "^4.1.0" + url-loader "^4.1.1" + wait-on "^5.2.0" + webpack "^4.44.1" + webpack-bundle-analyzer "^3.6.1" + webpack-dev-server "^3.11.0" + webpack-merge "^4.2.2" + webpackbar "^4.0.0" + +"@docusaurus/cssnano-preset@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.70.tgz#75dc56a71dc365a450729fd109b86fab72a6f560" + integrity sha512-Zwk3SrlE5r/z5j/tjDcs4XoyeoyymCtEovoxLWLV7wb+iR1qb+Jdso4TRShAepbW/ff6SzjCZ8hRy8ahXPD9TA== + dependencies: + cssnano-preset-advanced "^4.0.7" + postcss "^7.0.2" + postcss-combine-duplicated-selectors "^9.1.0" + postcss-sort-media-queries "^1.7.26" + +"@docusaurus/mdx-loader@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.70.tgz#4cc3c92a5a89ffdc8313da998d4646564940b3e7" + integrity sha512-CDR4O4z7wO5/S8O3TAggCynnuBIGIlUT9q9uhhkDe8h5XDhF8n8d6bwqir0O+fUMN3EnyrMq6z1g4IDRB5G2vw== + dependencies: + "@babel/parser" "^7.12.5" + "@babel/traverse" "^7.12.5" + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + "@mdx-js/mdx" "^1.6.21" + "@mdx-js/react" "^1.6.21" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^9.0.1" + github-slugger "^1.3.0" + gray-matter "^4.0.2" + loader-utils "^2.0.0" + mdast-util-to-string "^1.1.0" + remark-emoji "^2.1.0" + stringify-object "^3.3.0" + unist-util-visit "^2.0.2" + url-loader "^4.1.1" + webpack "^4.44.1" + +"@docusaurus/plugin-content-blog@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.70.tgz#795a5ddf181dfb314873a5dc33010d1a5bd94d28" + integrity sha512-qWXlSDovkhCZLJR0Wz4e3YcNjlelpuSNkS1rJ8sI1ehs/n32lj7A/nVoRfS/LnOMfIciY48vVPr64VLb6dfEeg== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/mdx-loader" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + "@docusaurus/utils-validation" "2.0.0-alpha.70" + chalk "^3.0.0" + feed "^4.2.1" + fs-extra "^9.0.1" + globby "^10.0.1" + joi "^17.2.1" + loader-utils "^1.2.3" + lodash "^4.17.20" + reading-time "^1.2.0" + remark-admonitions "^1.2.1" + webpack "^4.44.1" + +"@docusaurus/plugin-content-docs@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.70.tgz#42dfa40786e819b42974dd167048b190b37bbee5" + integrity sha512-LZre12Q0sxLgi2XgjQbNQMV+jFG7v0+8hRzgBL+iCRiLCa4NlV7+M6mEHJGJJXSKqbfH7CelaUOESqEgPpVQXQ== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/mdx-loader" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + "@docusaurus/utils-validation" "2.0.0-alpha.70" + chalk "^3.0.0" + execa "^3.4.0" + fs-extra "^9.0.1" + globby "^10.0.1" + import-fresh "^3.2.2" + joi "^17.2.1" + loader-utils "^1.2.3" + lodash "^4.17.19" + lodash.flatmap "^4.5.0" + lodash.groupby "^4.6.0" + lodash.pick "^4.4.0" + lodash.pickby "^4.6.0" + lodash.sortby "^4.6.0" + remark-admonitions "^1.2.1" + shelljs "^0.8.4" + utility-types "^3.10.0" + webpack "^4.44.1" + +"@docusaurus/plugin-content-pages@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.70.tgz#6cb937c9601d92bb616c7d95974d780d1a708ef7" + integrity sha512-HiFa5l1RDs155ATyYKkPtyIs/d6WJgSAyVfY5ji0Bsixp/K/Kh9YUZYMeTfeMIdhGYe3AAJz+PSZHYRpwTo1wA== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/mdx-loader" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + "@docusaurus/utils-validation" "2.0.0-alpha.70" + globby "^10.0.1" + joi "^17.2.1" + loader-utils "^1.2.3" + lodash "^4.17.19" + minimatch "^3.0.4" + remark-admonitions "^1.2.1" + slash "^3.0.0" + webpack "^4.44.1" + +"@docusaurus/plugin-debug@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.70.tgz#7a41d24151a92195311c85ab827656cf705a0c68" + integrity sha512-h/x5KtS/YJerhY6C6sJOaP9gMaSVnjj1qZ6r9E/IFujQJ7bSKnk1unqBQpVXADkQhP081ENPL01ubc0/JbE1Mw== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + react-json-view "^1.19.1" + +"@docusaurus/plugin-google-analytics@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.70.tgz#9476314353d585716cbdd408319ff30bdbda4f87" + integrity sha512-Ah9W83ZnA0VvmflKNuGq5f/CaEjWJxhjkISQn09/ykEvXfWV33000Bhck4RoCr5YxD+GBEBT5suG5LKH7Qkigw== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + +"@docusaurus/plugin-google-gtag@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.70.tgz#a90e54830a6f95a83cf51b82e7e6adcf6a699dc1" + integrity sha512-K3s894PqMPQnGXEZs0bSs2bRE3bVXFYSb/RN+K9sNd7zxGuOX4UytuvpXP+1r0Hj/YTwQIjj7AKsND0ZpDJHyw== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + +"@docusaurus/plugin-sitemap@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.70.tgz#1eb02e4a4ecf5fb2bdf641a6f962ae421ff86916" + integrity sha512-ev9yNLPoeHP03jTz67daGd7yA7YhUwHeoWz14SyiKuU7OYtwL/8SJTn/V5kMDRl7o8FRQt9T//mRkpa270hmXw== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + fs-extra "^9.0.1" + joi "^17.2.1" + sitemap "^3.2.2" + +"@docusaurus/preset-classic@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.70.tgz#7857f606eecdbaa34f8df83d62812908be02126f" + integrity sha512-Zx98KryJjHiqzGisWKR0glXl0HXuf/YbcK9yUl6ySyS+6cIMAuGMS0HGLgbvvEmYjywz7nMLpijzGderEOihjQ== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/plugin-content-blog" "2.0.0-alpha.70" + "@docusaurus/plugin-content-docs" "2.0.0-alpha.70" + "@docusaurus/plugin-content-pages" "2.0.0-alpha.70" + "@docusaurus/plugin-debug" "2.0.0-alpha.70" + "@docusaurus/plugin-google-analytics" "2.0.0-alpha.70" + "@docusaurus/plugin-google-gtag" "2.0.0-alpha.70" + "@docusaurus/plugin-sitemap" "2.0.0-alpha.70" + "@docusaurus/theme-classic" "2.0.0-alpha.70" + "@docusaurus/theme-search-algolia" "2.0.0-alpha.70" + +"@docusaurus/theme-classic@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.70.tgz#58e2dceee1076980700865df460e771e8d78cb68" + integrity sha512-lKU+fgSd08fo3LNYTw31Wty7RgAdFm8bEOwBNkKZcCFnatTSG4qyDbrDZclCQT/SpXSv9XIEKUc0irg2IH6Qrg== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/plugin-content-blog" "2.0.0-alpha.70" + "@docusaurus/plugin-content-docs" "2.0.0-alpha.70" + "@docusaurus/plugin-content-pages" "2.0.0-alpha.70" + "@docusaurus/theme-common" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + "@docusaurus/utils-validation" "2.0.0-alpha.70" + "@mdx-js/mdx" "^1.6.21" + "@mdx-js/react" "^1.6.21" + "@types/react-toggle" "^4.0.2" + clsx "^1.1.1" + copy-text-to-clipboard "^2.2.0" + infima "0.2.0-alpha.18" + joi "^17.2.1" + lodash "^4.17.19" + parse-numeric-range "^1.2.0" + prism-react-renderer "^1.1.1" + prismjs "^1.22.0" + prop-types "^15.7.2" + react-router-dom "^5.2.0" + react-toggle "^4.1.1" + +"@docusaurus/theme-common@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.70.tgz#fa42aef2ec1b535d37f72fc978a3138c49667a37" + integrity sha512-Ge/dLGPCJhtyvumSMg0BlWcF00d1Qd2KnHf8kL/0nTxe257yNTHIOK95LKhIPAdcVgxG+ge9N0XcBm4KaubASQ== + dependencies: + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/plugin-content-blog" "2.0.0-alpha.70" + "@docusaurus/plugin-content-docs" "2.0.0-alpha.70" + "@docusaurus/plugin-content-pages" "2.0.0-alpha.70" + "@docusaurus/types" "2.0.0-alpha.70" + +"@docusaurus/theme-search-algolia@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.70.tgz#7f41241e0d22e89438817a3d4a27d880116c06c1" + integrity sha512-xuoWZ+HUKzn1A5vPlNZM8mtyRL5uo15o34OX/i7HkTRmBVymWO1bBE0lECfDVJU2JUYGmwjpDXhZzNLDZmZRWg== + dependencies: + "@docsearch/react" "^3.0.0-alpha.31" + "@docusaurus/core" "2.0.0-alpha.70" + "@docusaurus/theme-common" "2.0.0-alpha.70" + "@docusaurus/utils" "2.0.0-alpha.70" + algoliasearch "^4.0.0" + algoliasearch-helper "^3.1.1" + clsx "^1.1.1" + eta "^1.11.0" + joi "^17.2.1" + lodash "^4.17.19" + +"@docusaurus/types@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-alpha.70.tgz#44b98290919cca2505aea334daecf762c7537d10" + integrity sha512-QoHmMiJhRDq5P/4o3eUIiJebdwRjShFlal01DST5B8MZo4k0ogl57FNHqJvIHc93NgonZzFlvC/auLlBnc/d4Q== + dependencies: + "@types/webpack" "^4.41.0" + commander "^4.0.1" + querystring "0.2.0" + webpack-merge "^4.2.2" + +"@docusaurus/utils-validation@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.70.tgz#04f24a7b3a4568ca164a8c1a4cf0caa8ba5caa6e" + integrity sha512-GJonaRjiJtlCk1+RfKA9f0YwRsSRGFMVbl6DrFidTgs4FmRb0hQsN4fnllsBvBJtbDZYwPTQ3T7c4cKJ/Ll7bQ== + dependencies: + "@docusaurus/utils" "2.0.0-alpha.70" + chalk "^3.0.0" + joi "^17.2.1" + +"@docusaurus/utils@2.0.0-alpha.70": + version "2.0.0-alpha.70" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-alpha.70.tgz#01779efcb4ff3bf39f9e74b3ef06fc2c8a43633a" + integrity sha512-xNSUcE7fGcneH00CPCEY0SP5V7H6pLEcu620UiU/m1367tCMsmv+MZcnII2ACcjAtvhjS22v/KLippM3VeTXqQ== + dependencies: + "@docusaurus/types" "2.0.0-alpha.70" + chalk "^3.0.0" + escape-string-regexp "^2.0.0" + fs-extra "^9.0.1" + gray-matter "^4.0.2" + lodash "^4.17.20" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + resolve-pathname "^3.0.0" + +"@endiliey/static-site-generator-webpack-plugin@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz#94bfe58fd83aeda355de797fcb5112adaca3a6b1" + integrity sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng== + dependencies: + bluebird "^3.7.1" + cheerio "^0.22.0" + eval "^0.1.4" + url "^0.11.0" + webpack-sources "^1.4.3" + +"@hapi/hoek@^9.0.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz#9daf5745156fd84b8e9889a2dc721f0c58e894aa" + integrity sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw== + +"@hapi/topo@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" + integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@mdx-js/mdx@^1.6.21": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.21": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@npmcli/move-file@^1.0.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.1.tgz#31a3afae95308ef12f58ac147b3e33aae621241d" + integrity sha512-LtWTicuF2wp7PNTuyCwABx7nNG+DnzSE8gN0iWxkC6mpgm/iOPu0ZMTkXuCxmJxtWFsDxUaixM9COSNJEMUfuQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@sideway/address@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.0.tgz#0b301ada10ac4e0e3fa525c90615e0b61a72b78d" + integrity sha512-wAH/JYRXeIFQRsxerIuLjgUu2Xszam+O5xKeatJ4oudShOOirfmsQ1D6LL54XOU2tizpCYku+s1wmU0SYdpoSA== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.4.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@types/anymatch@*": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" + integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9" + integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q== + dependencies: + "@types/unist" "*" + +"@types/html-minifier-terser@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" + integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== + +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "14.14.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" + integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +"@types/react-toggle@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/react-toggle/-/react-toggle-4.0.2.tgz#46ffa5af1a55de5f25d0aa78ef0b557b5c8bf276" + integrity sha512-sHqfoKFnL0YU2+OC4meNEC8Ptx9FE8/+nFeFvNcdBa6ANA8KpAzj3R9JN8GtrvlLgjKDoYgI7iILgXYcTPo2IA== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8" + integrity sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/tapable@*", "@types/tapable@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== + +"@types/uglify-js@*": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.1.tgz#97ff30e61a0aa6876c270b5f538737e2d6ab8ceb" + integrity sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q== + dependencies: + source-map "^0.6.1" + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + +"@types/webpack-sources@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz#8882b0bd62d1e0ce62f183d0d01b72e6e82e8c10" + integrity sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.41.0", "@types/webpack@^4.41.8": + version "4.41.26" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz#27a30d7d531e16489f9c7607c747be6bc1a459ef" + integrity sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA== + dependencies: + "@types/anymatch" "*" + "@types/node" "*" + "@types/tapable" "*" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + source-map "^0.6.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +algoliasearch-helper@^3.1.1: + version "3.3.4" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.3.4.tgz#4a3c56d42a2a81589d5722b73653b2deaf3e7064" + integrity sha512-1Ts2XcgGdjGlDrp3v6zbY8VW+X9+jJ5rBmtPBmXOQLd4b5t/LpJlaBdxoAnlMfVFjywP7KSAdmyFUNNYVHDyRQ== + dependencies: + events "^1.1.1" + +algoliasearch@^4.0.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.8.4.tgz#ac2fc9335dfe06f55b9bd4faf6050ea0c8e0feea" + integrity sha512-QbXpFvBKj/QhKWE7xBoqaWOWyw7ni6W6THSuFJHOcADRrInhjFCBYjrv+YsIhv9huCepKXWpfV4UJup9BslVhQ== + dependencies: + "@algolia/cache-browser-local-storage" "4.8.4" + "@algolia/cache-common" "4.8.4" + "@algolia/cache-in-memory" "4.8.4" + "@algolia/client-account" "4.8.4" + "@algolia/client-analytics" "4.8.4" + "@algolia/client-common" "4.8.4" + "@algolia/client-recommendation" "4.8.4" + "@algolia/client-search" "4.8.4" + "@algolia/logger-common" "4.8.4" + "@algolia/logger-console" "4.8.4" + "@algolia/requester-browser-xhr" "4.8.4" + "@algolia/requester-common" "4.8.4" + "@algolia/requester-node-http" "4.8.4" + "@algolia/transporter" "4.8.4" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^9.4.7, autoprefixer@^9.6.1: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-loader@^8.2.1: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5, bluebird@^3.7.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.1, browserslist@^4.6.4: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cache-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" + integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^3.0.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^2.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181: + version "1.0.30001181" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz#4f0e5184e1ea7c3bf2727e735cbe7ca9a451d673" + integrity sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ== + +ccount@^1.0.0, ccount@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.3.0, chokidar@^3.4.1, chokidar@^3.4.3: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +clipboard@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" + integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.4" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.18.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.1, commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +consola@^2.10.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.0.tgz#40fc4eefa4d2f8ef2e2806147f056ea207fcc0e9" + integrity sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-text-to-clipboard@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-2.2.0.tgz#329dd6daf8c42034c763ace567418401764579ae" + integrity sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ== + +copy-webpack-plugin@^6.3.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e" + integrity sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA== + dependencies: + cacache "^15.0.5" + fast-glob "^3.2.4" + find-cache-dir "^3.3.1" + glob-parent "^5.1.1" + globby "^11.0.1" + loader-utils "^2.0.0" + normalize-path "^3.0.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + webpack-sources "^1.4.3" + +core-js-compat@^3.8.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.3.tgz#9123fb6b9cad30f0651332dc77deba48ef9b0b3f" + integrity sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog== + dependencies: + browserslist "^4.16.1" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.3.tgz#10e9e3b2592ecaede4283e8f3ad7020811587c02" + integrity sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA== + +core-js@^2.6.5: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.0.4: + version "3.0.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" + integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== + dependencies: + node-fetch "2.6.1" + +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@^3.4.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0, css-select@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz#d981527b77712e2f3f3f09c73313e9b71b278b88" + integrity sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw== + dependencies: + autoprefixer "^9.4.7" + cssnano-preset-default "^4.0.7" + postcss-discard-unused "^4.0.1" + postcss-merge-idents "^4.0.1" + postcss-reduce-idents "^4.0.2" + postcss-zindex "^4.0.1" + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.6.tgz#865d0b5833d7d8d40f4e5b8a6d76aea3de4725ef" + integrity sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +del@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.649: + version "1.3.649" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.649.tgz#3aa8be052d4d268ede45d8e98d0cd60ffefad607" + integrity sha512-ojGDupQ3UMkvPWcTICe4JYe17+o9OLiFMPoduoR72Zp2ILt1mRVeqnxBEd6s/ptekrnsFU+0A4lStfBe/wyG/A== + +elliptic@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +"emoji-regex@>=6.0.0 <=6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" + integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.1" + is-regex "^1.1.1" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^1.11.0: + version "1.12.1" + resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.1.tgz#d985766591676c323f02dfc48a67539212745937" + integrity sha512-H8npoci2J/7XiPnVcCVulBSPsTNGvGaINyMjQDU8AFqp9LGsEYS88g2CiU+d01Sg44WtX7o4nb8wUJ9vnI+tiA== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eval@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.4.tgz#e05dbe0dab4b9330215cbb7bf4886eb24bd58700" + integrity sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw== + dependencies: + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.16.3, express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz#0907067fb3f57a78f45d95f1eacffcacd623c165" + integrity sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +feed@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +flux@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.1.tgz#7843502b02841d4aaa534af0b373034a1f75ee5c" + integrity sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.0" + +follow-redirects@^1.0.0, follow-redirects@^1.10.0: + version "1.13.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147" + integrity sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" + integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.0.tgz#892e62931e6938c8a23ea5aaebcfb67bd97da97e" + integrity sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +github-slugger@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz#9bd0a95c5efdfc46005e82a906ef8e2a059124c9" + integrity sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q== + dependencies: + emoji-regex ">=6.0.0 <=6.1.1" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + 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" + +global-dirs@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" + integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== + dependencies: + ini "1.3.7" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +globby@^11.0.1: + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +gray-matter@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz#9aa379e3acaf421193fce7d2a28cebd4518ac454" + integrity sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw== + dependencies: + js-yaml "^3.11.0" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@5.1.1, gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz#3089dc0ee2ccf6ec8bc416919b51a54a589e097c" + integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== + dependencies: + ccount "^1.0.3" + hastscript "^5.0.0" + property-information "^5.0.0" + web-namespaces "^1.1.2" + xtend "^4.0.1" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" + integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^4.5.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.1.tgz#40aaf1b5cb78f2f23a83333999625c20929cda65" + integrity sha512-yzK7RQZwv9xB+pcdHNTjcqbaaDZ+5L0zJHXfi89iWIZmb/FtzxhLk0635rmJihcQbs3ZUF27Xp4oWGx6EK56zg== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.20" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.10.1, htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^5.1.1, ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.2.1, import-fresh@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +infima@0.2.0-alpha.18: + version "0.2.0-alpha.18" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.18.tgz#8ac62711f13ef99b1f4a45b3ac14571722a2ccf6" + integrity sha512-ndSEffXzjgM/eiSm5jpLTX6ON9MmylzxqBnV2bTiC3kCSyDYdvzTs+bSwf+C4TWayuqnRTnBK1JUePo3m6Bnfg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.2.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" + integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== + dependencies: + global-dirs "^2.0.1" + is-path-inside "^3.0.1" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-npm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" + integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0, is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^26.5.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +joi@^17.2.1, joi@^17.3.0: + version "17.3.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.3.0.tgz#f1be4a6ce29bc1716665819ac361dfa139fff5d2" + integrity sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.0" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.11.0, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +latest-version@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.chunk@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" + integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flatmap@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" + integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.groupby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" + integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.4.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.padstart@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= + +lodash.pick@^4.2.1, lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.pickby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + integrity sha1-feoh2MGNdwOifHBMFdO4SmfjOv8= + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.sortby@^4.6.0, lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" + integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.45.0, "mime-db@>= 1.43.0 < 2": + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.0.tgz#2b4af934401779806ee98026bb42e8c1ae1876b1" + integrity sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@^0.8.0: + version "0.8.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz#a875e169beb27c88af77dd962771c9eedc3da161" + integrity sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + dependencies: + lodash.toarray "^4.4.0" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.52, node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +null-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-3.0.0.tgz#3e2b6c663c5bda8c73a54357d8fa0708dc61b245" + integrity sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw== + dependencies: + loader-utils "^1.2.3" + schema-utils "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.8.0, object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-is@^1.0.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068" + integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.3.1" + resolved "https://registry.yarnpkg.com/open/-/open-7.3.1.tgz#111119cb919ca1acd988f49685c4fdd0f4755356" + integrity sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz#aa70b00f29624ed13e9f943e9461b306e386b0fa" + integrity sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg== + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@1.0.2, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0, pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pnp-webpack-plugin@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-combine-duplicated-selectors@^9.1.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/postcss-combine-duplicated-selectors/-/postcss-combine-duplicated-selectors-9.4.0.tgz#dae866debae5f93b58e13e6cc69419105e91336a" + integrity sha512-rMnO1H3wgR1T6QSlK3i8Slz9p3xD+0yOi4J7qwh/5PGR3z8jbgYvRlNKAIvXDtGBQbJKoWs4df5skL3a/fdUEA== + dependencies: + postcss "^7.0.0" + postcss-selector-parser "^6.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-discard-unused@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz#ee7cc66af8c7e8c19bd36f12d09c4bde4039abea" + integrity sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA== + dependencies: + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-idents@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz#b7df282a92f052ea0a66c62d8f8812e6d2cbed23" + integrity sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A== + dependencies: + cssnano-util-same-parent "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-idents@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz#30447a6ec20941e78e21bd4482a11f569c4f455b" + integrity sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^1.7.26: + version "1.31.21" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz#3225ec6eb490402602284ac99963b80461783cee" + integrity sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg== + dependencies: + postcss "^7.0.27" + sort-css-media-queries "1.5.0" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-zindex@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz#8db6a4cec3111e5d3fd99ea70abeda61873d10c1" + integrity sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.1.1.tgz#1c1be61b1eb9446a146ca7a50b7bcf36f2a70a44" + integrity sha512-MgMhSdHuHymNRqD6KM3eGS0PNqgK9q4QF5P0yoQQvpB6jNjeSAi3jcSAz0Sua/t9fa4xDOMar9HJbLa08gl9ug== + +prismjs@^1.22.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" + integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== + optionalDependencies: + clipboard "^2.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@^16.8.4: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-error-overlay@^6.0.7: + version "6.0.8" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz#474ed11d04fc6bda3af643447d85e9127ed6b5de" + integrity sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== + +react-fast-compare@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.19.1: + version "1.20.4" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.20.4.tgz#c993baa28bf2a16110f61e4434af3b4fecb416d8" + integrity sha512-QBhb1STnWif+wY8Bsl+ISyDnKTocN/37gSauq8MNHjvu7UOLmdTAgynnC5/rrPh1sAdakg7oIhxU0l660xQg+Q== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^6.1.0" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-loadable-ssr-addon@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz#ae9b2d3b11721930f8d8255476d288c0e9f9290f" + integrity sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw== + dependencies: + "@babel/runtime" "^7.10.3" + +react-loadable@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/react-loadable/-/react-loadable-5.5.0.tgz#582251679d3da86c32aae2c8e689c59f1196d8c4" + integrity sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg== + dependencies: + prop-types "^15.5.0" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.0, react-router@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-side-effect@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" + integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== + +react-textarea-autosize@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz#df91387f8a8f22020b77e3833c09829d706a09a5" + integrity sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A== + dependencies: + prop-types "^15.6.0" + +react-toggle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.1.tgz#2317f67bf918ea3508a96b09dd383efd9da572af" + integrity sha512-+wXlMcSpg8SmnIXauMaZiKpR+r2wp2gMUteroejp2UTSqGTVvZLN+m9EhMzFARBKEw7KpQOwzCyfzeHeAndQGw== + dependencies: + classnames "^2.2.5" + +react@^16.8.4: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.3.0.tgz#d13e74431589a4a9038669f24d5acbc08bbb015d" + integrity sha512-RJ8J5O6UvrclfZpcPSPuKusrdRfoY7uXXoYOOdeswZNtSkQaewT3919yz6RyloDBR+iwcUyz5zGOUjhgvfuv3g== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== + dependencies: + jsesc "~0.5.0" + +rehype-parse@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz#aeb3fdd68085f9f796f1d3137ae2b85a98406964" + integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== + dependencies: + hast-util-from-parse5 "^5.0.0" + parse5 "^5.0.0" + xtend "^4.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-admonitions@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz#87caa1a442aa7b4c0cafa04798ed58a342307870" + integrity sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow== + dependencies: + rehype-parse "^6.0.2" + unified "^8.4.2" + unist-util-visit "^2.0.1" + +remark-emoji@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.1.0.tgz#69165d1181b98a54ad5d9ef811003d53d7ebc7db" + integrity sha512-lDddGsxXURV01WS9WAiS9rO/cedO1pvr9tahtLhr6qCGFhHG4yZSJW3Ha4Nw9Uk1hLNmUBtPC0+m45Ms+xEitg== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.2" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" + integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== + dependencies: + css-select "^2.0.2" + dom-converter "^0.2" + htmlparser2 "^3.10.1" + lodash "^4.17.20" + strip-ansi "^3.0.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.6, resolve@^1.3.2: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.5.3, rxjs@^6.6.0, rxjs@^6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.0.0, schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + +selfsigned@^1.10.8: + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + dependencies: + node-forge "^0.10.0" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shelljs@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sitemap@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-3.2.2.tgz#3f77c358fa97b555c879e457098e39910095c62b" + integrity sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg== + dependencies: + lodash.chunk "^4.2.0" + lodash.padstart "^4.6.1" + whatwg-url "^7.0.0" + xmlbuilder "^13.0.0" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" + integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.4.7" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-css-media-queries@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz#8f605ad372caad0b81be010311882c046e738093" + integrity sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw== + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +std-env@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.2.1.tgz#2ffa0fdc9e2263e0004c1211966e960948a40f6b" + integrity sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ== + dependencies: + ci-info "^1.6.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +term-size@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser-webpack-plugin@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser@^4.1.2, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.3.4: + version "5.5.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" + integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@^0.7.18: + version "0.7.23" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.23.tgz#704d67f951e13195fbcd3d78818577f5bc1d547b" + integrity sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" + integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50" + integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.0.1.tgz#fa13c424ff8e964f3aa20d1098b9a690c6bfaa39" + integrity sha512-YtuetK6o16CMfG+0u4nndsWpujgsHDHHLyE0yGpJLLn5xSjKeyGyzEBOI2XbmoUHCYabmNgX52uxlWoQhcvR7Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-notifier@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" + integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== + dependencies: + boxen "^4.2.0" + chalk "^3.0.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.3.1" + is-npm "^4.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" + pupa "^2.0.1" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-parse@^1.4.3, url-parse@^1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +wait-on@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.2.1.tgz#05b66fcb4d7f5da01537f03e7cf96e8836422996" + integrity sha512-H2F986kNWMU9hKlI9l/ppO6tN8ZSJd35yBljMLa1/vjzWP++Qh6aXyt77/u7ySJFZQqBtQxnvm/xgG48AObXcw== + dependencies: + axios "^0.21.1" + joi "^17.3.0" + lodash "^4.17.20" + minimist "^1.2.5" + rxjs "^6.6.3" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0, web-namespaces@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^3.6.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" + integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.19" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.11.0: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.44.1: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +webpackbar@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-4.0.0.tgz#ee7a87f16077505b5720551af413c8ecd5b1f780" + integrity sha512-k1qRoSL/3BVuINzngj09nIwreD8wxV4grcuhHTD8VJgUbGcy8lQSPqv+bM00B7F+PffwIsQ8ISd4mIwRbr23eQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + consola "^2.10.0" + figures "^3.0.0" + pretty-time "^1.1.0" + std-env "^2.2.1" + text-table "^0.2.0" + wrap-ansi "^6.0.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^6.0.0, ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xmlbuilder@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" + integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From 4e93fe32f01d29166e2bb15c636ce4aa21c13fd4 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 12 Feb 2021 21:16:25 -0500 Subject: [PATCH 097/113] spawn ts-node in tests with cwd set to ./tests subdirectory (#1216) --- src/index.spec.ts | 128 +++++++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 59 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 0f7e0f908..164a76c2c 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai' -import { exec } from 'child_process' +import { ChildProcess, exec as childProcessExec, ExecException, ExecOptions } from 'child_process' import { join } from 'path' import semver = require('semver') import ts = require('typescript') @@ -15,7 +15,17 @@ import Module = require('module') import { PassThrough } from 'stream' import * as getStream from 'get-stream' -const execP = promisify(exec) +function exec (cmd: string, callback: (err: ExecException | null, stdout: string, stderr: string) => void): ChildProcess +function exec (cmd: string, opts: ExecOptions, callback: (err: ExecException | null, stdout: string, stderr: string) => void): ChildProcess +function exec (cmd: string, opts: ExecOptions | ((err: ExecException | null, stdout: string, stderr: string) => void), callback?: (err: ExecException | null, stdout: string, stderr: string) => void) { + const _opts = typeof opts === 'function' ? {} : opts + const _callback = typeof opts === 'function' ? opts : callback + return childProcessExec(cmd, { + cwd: TEST_DIR, + ..._opts + }, _callback) +} +const execP = promisify(exec) as any as typeof childProcessExec['__promisify__'] const TEST_DIR = join(__dirname, '../tests') const PROJECT = join(TEST_DIR, 'tsconfig.json') @@ -84,7 +94,7 @@ describe('ts-node', function () { this.slow(1000) it('should execute cli', function (done) { - exec(`${cmd} tests/hello-world`, function (err, stdout) { + exec(`${cmd} hello-world`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') @@ -139,7 +149,7 @@ describe('ts-node', function () { }) it('should print scripts', function (done) { - exec(`${cmd} -pe "import { example } from './tests/complex/index';example()"`, function (err, stdout) { + exec(`${cmd} -pe "import { example } from './complex/index';example()"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('example\n') @@ -148,7 +158,7 @@ describe('ts-node', function () { }) it('should provide registered information globally', function (done) { - exec(`${cmd} tests/env`, function (err, stdout) { + exec(`${cmd} env`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('object\n') @@ -173,7 +183,7 @@ describe('ts-node', function () { [ cmd, '-O "{\\\"allowJs\\\":true}"', - '-pe "import { main } from \'./tests/allow-js/run\';main()"' + '-pe "import { main } from \'./allow-js/run\';main()"' ].join(' '), function (err, stdout) { expect(err).to.equal(null) @@ -189,7 +199,7 @@ describe('ts-node', function () { [ cmd, '-O "{\\\"allowJs\\\":true}"', - '-pe "import { Foo2 } from \'./tests/allow-js/with-jsx\'; Foo2.sayHi()"' + '-pe "import { Foo2 } from \'./allow-js/with-jsx\'; Foo2.sayHi()"' ].join(' '), function (err, stdout) { expect(err).to.equal(null) @@ -203,7 +213,7 @@ describe('ts-node', function () { it('should eval code', function (done) { exec( - `${cmd} -e "import * as m from './tests/module';console.log(m.example('test'))"`, + `${cmd} -e "import * as m from './module';console.log(m.example('test'))"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('TEST\n') @@ -214,7 +224,7 @@ describe('ts-node', function () { }) it('should import empty files', function (done) { - exec(`${cmd} -e "import './tests/empty'"`, function (err, stdout) { + exec(`${cmd} -e "import './empty'"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') @@ -223,7 +233,7 @@ describe('ts-node', function () { }) it('should throw errors', function (done) { - exec(`${cmd} -e "import * as m from './tests/module';console.log(m.example(123))"`, function (err) { + exec(`${cmd} -e "import * as m from './module';console.log(m.example(123))"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } @@ -239,7 +249,7 @@ describe('ts-node', function () { it('should be able to ignore diagnostic', function (done) { exec( - `${cmd} --ignore-diagnostics 2345 -e "import * as m from './tests/module';console.log(m.example(123))"`, + `${cmd} --ignore-diagnostics 2345 -e "import * as m from './module';console.log(m.example(123))"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') @@ -255,13 +265,13 @@ describe('ts-node', function () { }) it('should work with source maps', function (done) { - exec(`${cmd} tests/throw`, function (err) { + exec(`${cmd} throw`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.contain([ - `${join(__dirname, '../tests/throw.ts')}:100`, + `${join(TEST_DIR, 'throw.ts')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^', 'Error: this is a demo' @@ -272,13 +282,13 @@ describe('ts-node', function () { }) it('eval should work with source maps', function (done) { - exec(`${cmd} -pe "import './tests/throw'"`, function (err) { + exec(`${cmd} -pe "import './throw'"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.contain([ - `${join(__dirname, '../tests/throw.ts')}:100`, + `${join(TEST_DIR, 'throw.ts')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^' ].join('\n')) @@ -400,7 +410,7 @@ describe('ts-node', function () { }) it('should support require flags', function (done) { - exec(`${cmd} -r ./tests/hello-world -pe "console.log('success')"`, function (err, stdout) { + exec(`${cmd} -r ./hello-world -pe "console.log('success')"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n') @@ -418,10 +428,10 @@ describe('ts-node', function () { }) it('should use source maps with react tsx', function (done) { - exec(`${cmd} tests/throw-react-tsx.tsx`, function (err, stdout) { + exec(`${cmd} throw-react-tsx.tsx`, function (err, stdout) { expect(err).not.to.equal(null) expect(err!.message).to.contain([ - `${join(__dirname, '../tests/throw-react-tsx.tsx')}:100`, + `${join(TEST_DIR, './throw-react-tsx.tsx')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^', 'Error: this is a demo' @@ -432,7 +442,7 @@ describe('ts-node', function () { }) it('should allow custom typings', function (done) { - exec(`${cmd} tests/custom-types`, function (err, stdout) { + exec(`${cmd} custom-types`, function (err, stdout) { expect(err).to.match(/Error: Cannot find module 'does-not-exist'/) return done() @@ -440,7 +450,7 @@ describe('ts-node', function () { }) it('should preserve `ts-node` context with child process', function (done) { - exec(`${cmd} tests/child-process`, function (err, stdout) { + exec(`${cmd} child-process`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') @@ -449,7 +459,7 @@ describe('ts-node', function () { }) it('should import js before ts by default', function (done) { - exec(`${cmd} tests/import-order/compiled`, function (err, stdout) { + exec(`${cmd} import-order/compiled`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, JavaScript!\n') @@ -458,7 +468,7 @@ describe('ts-node', function () { }) it('should import ts before js when --prefer-ts-exts flag is present', function (done) { - exec(`${cmd} --prefer-ts-exts tests/import-order/compiled`, function (err, stdout) { + exec(`${cmd} --prefer-ts-exts import-order/compiled`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') @@ -467,7 +477,7 @@ describe('ts-node', function () { }) it('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', function (done) { - exec(`${cmd} tests/import-order/compiled`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { + exec(`${cmd} import-order/compiled`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') @@ -476,7 +486,7 @@ describe('ts-node', function () { }) it('should ignore .d.ts files', function (done) { - exec(`${cmd} tests/import-order/importer`, function (err, stdout) { + exec(`${cmd} import-order/importer`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, World!\n') @@ -490,7 +500,7 @@ describe('ts-node', function () { if (process.platform === 'win32' && semver.satisfies(ts.version, '2.7')) { this.skip() } else { - exec(`"${BIN_PATH}" --project tests/issue-884/tsconfig.json tests/issue-884`, function (err, stdout) { + exec(`"${BIN_PATH}" --project issue-884/tsconfig.json issue-884`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') @@ -502,7 +512,7 @@ describe('ts-node', function () { describe('issue #986', function () { it('should not compile', function (done) { - exec(`"${BIN_PATH}" --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { + exec(`"${BIN_PATH}" --project issue-986/tsconfig.json issue-986`, function (err, stdout, stderr) { expect(err).not.to.equal(null) expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. expect(stdout).to.equal('') @@ -512,7 +522,7 @@ describe('ts-node', function () { }) it('should compile with `--files`', function (done) { - exec(`"${BIN_PATH}" --files --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { + exec(`"${BIN_PATH}" --files --project issue-986/tsconfig.json issue-986`, function (err, stdout, stderr) { expect(err).not.to.equal(null) expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. expect(stdout).to.equal('') @@ -524,7 +534,7 @@ describe('ts-node', function () { if (semver.gte(ts.version, '2.7.0')) { it('should support script mode', function (done) { - exec(`${BIN_SCRIPT_PATH} tests/scope/a/log`, function (err, stdout) { + exec(`${BIN_SCRIPT_PATH} scope/a/log`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('.ts\n') @@ -533,7 +543,7 @@ describe('ts-node', function () { }) it('should read tsconfig relative to realpath, not symlink, in scriptMode', function (done) { if (lstatSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { - exec(`${BIN_SCRIPT_PATH} tests/main-realpath/symlink/symlink.tsx`, function (err, stdout) { + exec(`${BIN_SCRIPT_PATH} main-realpath/symlink/symlink.tsx`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') @@ -546,10 +556,10 @@ describe('ts-node', function () { } describe('should read ts-node options from tsconfig.json', function () { - const BIN_EXEC = `"${BIN_PATH}" --project tests/tsconfig-options/tsconfig.json` + const BIN_EXEC = `"${BIN_PATH}" --project tsconfig-options/tsconfig.json` it('should override compiler options from env', function (done) { - exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, { + exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_COMPILER_OPTIONS: '{"typeRoots": ["env-typeroots"]}' @@ -557,44 +567,44 @@ describe('ts-node', function () { }, function (err, stdout) { expect(err).to.equal(null) const { config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/env-typeroots').replace(/\\/g, '/')]) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/env-typeroots').replace(/\\/g, '/')]) return done() }) }) it('should use options from `tsconfig.json`', function (done) { - exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, function (err, stdout) { + exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(false) expect(options.transpileOnly).to.equal(true) - expect(options.require).to.deep.equal([join(__dirname, '../tests/tsconfig-options/required1.js')]) + expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) return done() }) }) it('should have flags override / merge with `tsconfig.json`', function (done) { - exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tests/tsconfig-options/required2.js tests/tsconfig-options/log-options2.js`, function (err, stdout) { + exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tsconfig-options/required2.js tsconfig-options/log-options2.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['flags-types']) expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(true) expect(options.transpileOnly).to.equal(true) expect(options.require).to.deep.equal([ - join(__dirname, '../tests/tsconfig-options/required1.js'), - './tests/tsconfig-options/required2.js' + join(TEST_DIR, './tsconfig-options/required1.js'), + './tsconfig-options/required2.js' ]) return done() }) }) it('should have `tsconfig.json` override environment', function (done) { - exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, { + exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_PRETTY: 'true', @@ -603,12 +613,12 @@ describe('ts-node', function () { }, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) expect(options.pretty).to.equal(true) expect(options.skipIgnore).to.equal(false) expect(options.transpileOnly).to.equal(true) - expect(options.require).to.deep.equal([join(__dirname, '../tests/tsconfig-options/required1.js')]) + expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) return done() }) }) @@ -616,7 +626,7 @@ describe('ts-node', function () { describe('compiler host', function () { it('should execute cli', function (done) { - exec(`${cmd} --compiler-host tests/hello-world`, function (err, stdout) { + exec(`${cmd} --compiler-host hello-world`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') @@ -626,7 +636,7 @@ describe('ts-node', function () { }) it('should transpile files inside a node_modules directory when not ignored', function (done) { - exec(`${cmdNoProject} --script-mode tests/from-node-modules/from-node-modules`, function (err, stdout, stderr) { + exec(`${cmdNoProject} --script-mode from-node-modules/from-node-modules`, function (err, stdout, stderr) { if (err) return done(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) expect(JSON.parse(stdout)).to.deep.equal({ external: { @@ -646,7 +656,7 @@ describe('ts-node', function () { describe('should respect maxNodeModulesJsDepth', function () { it('for unscoped modules', function (done) { - exec(`${cmdNoProject} --script-mode tests/maxnodemodulesjsdepth`, function (err, stdout, stderr) { + exec(`${cmdNoProject} --script-mode maxnodemodulesjsdepth`, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + @@ -658,7 +668,7 @@ describe('ts-node', function () { }) it('for @scoped modules', function (done) { - exec(`${cmdNoProject} --script-mode tests/maxnodemodulesjsdepth-scoped`, function (err, stdout, stderr) { + exec(`${cmdNoProject} --script-mode maxnodemodulesjsdepth-scoped`, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + @@ -781,7 +791,7 @@ describe('ts-node', function () { } catch (error) { expect(error.stack).to.contain([ 'Error: this is a demo', - ` at Foo.bar (${join(__dirname, '../tests/throw.ts')}:100:18)` + ` at Foo.bar (${join(TEST_DIR, './throw.ts')}:100:18)` ].join('\n')) done() @@ -886,7 +896,7 @@ describe('ts-node', function () { if (semver.gte(process.version, '13.0.0')) { it('should compile and execute as ESM', (done) => { - exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { + exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') @@ -894,10 +904,10 @@ describe('ts-node', function () { }) }) it('should use source maps', function (done) { - exec(`${cmd} throw.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { + exec(`${cmd} throw.ts`, { cwd: join(TEST_DIR, './esm') }, function (err, stdout) { expect(err).not.to.equal(null) expect(err!.message).to.contain([ - `${pathToFileURL(join(__dirname, '../tests/esm/throw.ts'))}:100`, + `${pathToFileURL(join(TEST_DIR, './esm/throw.ts'))}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^', 'Error: this is a demo' @@ -909,7 +919,7 @@ describe('ts-node', function () { describe('supports experimental-specifier-resolution=node', () => { it('via --experimental-specifier-resolution', (done) => { - exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { + exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') @@ -917,7 +927,7 @@ describe('ts-node', function () { }) }) it('via --es-module-specifier-resolution alias', (done) => { - exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { + exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') @@ -926,7 +936,7 @@ describe('ts-node', function () { }) it('via NODE_OPTIONS', (done) => { exec(`${cmd} index.ts`, { - cwd: join(__dirname, '../tests/esm-node-resolver'), + cwd: join(TEST_DIR, './esm-node-resolver'), env: { ...process.env, NODE_OPTIONS: '--experimental-specifier-resolution=node' @@ -941,7 +951,7 @@ describe('ts-node', function () { }) it('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', function (done) { - exec(`${cmd} ./index.js`, { cwd: join(__dirname, '../tests/esm-err-require-esm') }, function (err, stdout, stderr) { + exec(`${cmd} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') @@ -951,7 +961,7 @@ describe('ts-node', function () { it('defers to fallback loaders when URL should not be handled by ts-node', function (done) { exec(`${cmd} index.mjs`, { - cwd: join(__dirname, '../tests/esm-import-http-url') + cwd: join(TEST_DIR, './esm-import-http-url') }, function (err, stdout, stderr) { expect(err).to.not.equal(null) // expect error from node's default resolver @@ -961,7 +971,7 @@ describe('ts-node', function () { }) it('should bypass import cache when changing search params', (done) => { - exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-import-cache') }, function (err, stdout) { + exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-import-cache') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('log1\nlog2\nlog2\n') @@ -970,7 +980,7 @@ describe('ts-node', function () { }) it('should support transpile only mode via dedicated loader entrypoint', (done) => { - exec(`${cmd}/transpile-only index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { + exec(`${cmd}/transpile-only index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') @@ -978,7 +988,7 @@ describe('ts-node', function () { }) }) it('should throw type errors without transpile-only enabled', (done) => { - exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { + exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }, function (err, stdout) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } @@ -994,7 +1004,7 @@ describe('ts-node', function () { } it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', function (done) { - exec(`${BIN_PATH} ./tests/esm-err-require-esm/index.js`, function (err, stdout) { + exec(`${BIN_PATH} ./esm-err-require-esm/index.js`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('CommonJS\n') From 080af32d79a63d75e2753117b68363e0896ad024 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 12 Feb 2021 21:51:37 -0500 Subject: [PATCH 098/113] Update sidebars.js --- website/sidebars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/sidebars.js b/website/sidebars.js index 340bdd719..3964a6eff 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -7,7 +7,7 @@ module.exports = { 'imports', 'integrations', 'shebang', - 'interpreting-errors', + 'errors', ], }, }; From bacbeaf4f66726a666103362961bb8640a9239f5 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 15 Feb 2021 19:01:16 -0500 Subject: [PATCH 099/113] make --script-mode the default; add --cwd-mode to switch back to old behavior; other cwd, project, and dir fixes (#1155) * Use `--script-mode` by default * Add `--cwd-mode` flag to opt-out of `--script-mode` * Add `ts-node-cwd` entry-point that uses `--cwd-mode` by default * Rename `--dir` to `--cwd`; `TS_NODE_DIR` to `TS_NODE_CWD`; parse legacy names for backwards compatibility * Rewrite `--cwd` docs to say it changes effective `cwd` * Add `projectSearchDir` API option to set directory from which tsconfig search is performed * Fix bug where resolving entry-point location could poison `require.resolve` cache and prevent correct extension from loading (#1220) * `--cwd` no longer sets `--scope` * Remove `--scope` from CLI flags and tsconfig-loaded options; it is an API-only option, to match the intended use-case: programmatically installing multiple ts-node instances * Add `scopeDir` API option * Deprecate `TS_NODE_SCOPE` env var * `ignore` rules evaluated relative to `tsconfig.json`, otherwise `cwd`; no longer tied to `--dir` * `compiler` is loaded relative to `tsconfig.json` instead of `cwd` or entrypoint script (#1225) --- *Original GH-generated squash summary* * make --script-mode the default; add --cwd-mode to switch back to old behavior * Fix bug where --script-mode entrypoint require.resolve poisons the require.resolve cache; causes entrypoint to resolve incorrectly when --prefer-ts-exts is used * WIP TODO amend / rewrite this commit * wip * WIP * add ts-node-cwd bin, which is equivalent to ts-node --cwd-mode * rename projectSearchPath to projectSearchDir * Revert undesirable changes from WIP commits * add --cwd-mode and --script-mode tests * revert undesirable logging from WIP commits * update tests which relied on --dir affecting to cwd to instead use projectSearchDir as needed * remove --script-mode from test invocations that don't need it anymore * fix lint failures * fix tests * fix requireResolveNonCached to avoid hack on node 10 & 11 * fix tests to avoid type error on ts2.7 * fix tests on node 10 * update README and final cleanup * more cleanup * Load typescript compiler relative to tsconfig.json --- README.md | 30 +++--- package.json | 3 + src/bin-cwd.ts | 5 + src/bin.ts | 80 +++++++++----- src/index.spec.ts | 65 +++++++++--- src/index.ts | 122 ++++++++++++++-------- tests/cwd-and-script-mode/a/index.ts | 7 ++ tests/cwd-and-script-mode/a/tsconfig.json | 7 ++ tests/cwd-and-script-mode/b/index.ts | 7 ++ tests/cwd-and-script-mode/b/tsconfig.json | 7 ++ tests/import-order/require-compiled.js | 2 + 11 files changed, 242 insertions(+), 93 deletions(-) create mode 100644 src/bin-cwd.ts create mode 100644 tests/cwd-and-script-mode/a/index.ts create mode 100644 tests/cwd-and-script-mode/a/tsconfig.json create mode 100644 tests/cwd-and-script-mode/b/index.ts create mode 100644 tests/cwd-and-script-mode/b/tsconfig.json create mode 100644 tests/import-order/require-compiled.js diff --git a/README.md b/README.md index cb9994de8..ec75beb53 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,8 @@ ts-node -p -e '"Hello, world!"' # Pipe scripts to execute with TypeScript. echo 'console.log("Hello, world!")' | ts-node -# Equivalent to ts-node --script-mode -ts-node-script scripts.ts +# Equivalent to ts-node --cwd-mode +ts-node-cwd scripts.ts # Equivalent to ts-node --transpile-only ts-node-transpile-only scripts.ts @@ -57,17 +57,15 @@ ts-node-transpile-only scripts.ts ### Shebang ```typescript -#!/usr/bin/env ts-node-script +#!/usr/bin/env ts-node console.log("Hello, world!") ``` -`ts-node-script` is recommended because it enables `--script-mode`, discovering `tsconfig.json` relative to the script's location instead of `process.cwd()`. This makes scripts more portable. - Passing CLI arguments via shebang is allowed on Mac but not Linux. For example, the following will fail on Linux: ``` -#!/usr/bin/env ts-node --script-mode --transpile-only --files +#!/usr/bin/env ts-node --transpile-only --files // This shebang is not portable. It only works on Mac ``` @@ -152,11 +150,14 @@ When node.js has an extension registered (via `require.extensions`), it will use ## Loading `tsconfig.json` -**Typescript Node** loads `tsconfig.json` automatically. Use `--skip-project` to skip loading the `tsconfig.json`. +**Typescript Node** finds and loads `tsconfig.json` automatically. Use `--skip-project` to skip loading the `tsconfig.json`. Use `--project` to explicitly specify the path to a `tsconfig.json` + +When searching, it is resolved using [the same search behavior as `tsc`](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html). By default, this search is performed relative to the directory containing the entrypoint script. In `--cwd-mode` or if no entrypoint is specified -- for example when using the REPL -- the search is performed relative to `--cwd` / `process.cwd()`, which matches the behavior of `tsc`. -It is resolved relative to `--dir` using [the same search behavior as `tsc`](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html). In `--script-mode`, this is the directory containing the script. Otherwise it is resolved relative to `process.cwd()`, which matches the behavior of `tsc`. +For example: -Use `--project` to specify the path to your `tsconfig.json`, ignoring `--dir`. +* if you run `ts-node ./src/app/index.ts`, we will automatically use `./src/tsconfig.json`. +* if you run `ts-node`, we will automatically use `./tsconfig.json`. **Tip**: You can use `ts-node` together with [tsconfig-paths](https://www.npmjs.com/package/tsconfig-paths) to load modules according to the `paths` section in `tsconfig.json`. @@ -176,7 +177,8 @@ ts-node --compiler ntypescript --project src/tsconfig.json hello-world.ts * `-h, --help` Prints the help text * `-v, --version` Prints the version. `-vv` prints node and typescript compiler versions, too -* `-s, --script-mode` Resolve config relative to the directory of the passed script instead of the current directory. Changes default of `--dir` +* `-c, --cwd-mode` Resolve config relative to the current directory instead of the directory of the entrypoint script. +* `--script-mode` Resolve config relative to the directory of the entrypoint script. This is the default behavior. ### CLI and Programmatic Options @@ -189,8 +191,7 @@ _The name of the environment variable and the option's default value are denoted * `-C, --compiler [name]` Specify a custom TypeScript compiler (`TS_NODE_COMPILER`, default: `typescript`) * `-D, --ignore-diagnostics [code]` Ignore TypeScript warnings by diagnostic code (`TS_NODE_IGNORE_DIAGNOSTICS`) * `-O, --compiler-options [opts]` JSON object to merge with compiler options (`TS_NODE_COMPILER_OPTIONS`) -* `--dir` Specify working directory for config resolution (`TS_NODE_CWD`, default: `process.cwd()`, or `dirname(scriptPath)` if `--script-mode`) -* `--scope` Scope compiler to files within `cwd` (`TS_NODE_SCOPE`, default: `false`) +* `--cwd` Behave as if invoked within this working directory. (`TS_NODE_CWD`, default: `process.cwd()`) * `--files` Load `files`, `include` and `exclude` from `tsconfig.json` on startup (`TS_NODE_FILES`, default: `false`) * `--pretty` Use pretty diagnostic formatter (`TS_NODE_PRETTY`, default: `false`) * `--skip-project` Skip project config resolution and loading (`TS_NODE_SKIP_PROJECT`, default: `false`) @@ -201,6 +202,9 @@ _The name of the environment variable and the option's default value are denoted ### Programmatic-only Options +* `scope` Scope compiler to files within `scopeDir`. Files outside this directory will be ignored. (default: `false`) +* `scopeDir` Sets directory for `scope`. Defaults to tsconfig `rootDir`, directory containing `tsconfig.json`, or `cwd` +* `projectSearchDir` Search for TypeScript config file (`tsconfig.json`) in this or parent directories. * `transformers` `_ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers)`: An object with transformers or a factory function that accepts a program and returns a transformers object to pass to TypeScript. Factory function cannot be used with `transpileOnly` flag * `readFile`: Custom TypeScript-compatible file reading function * `fileExists`: Custom TypeScript-compatible file existence function @@ -219,7 +223,7 @@ Most options can be specified by a `"ts-node"` object in `tsconfig.json` using t } ``` -Our bundled [JSON schema](https://unpkg.com/browse/ts-node@8.8.2/tsconfig.schema.json) lists all compatible options. +Our bundled [JSON schema](https://unpkg.com/browse/ts-node@latest/tsconfig.schema.json) lists all compatible options. ## SyntaxError diff --git a/package.json b/package.json index fbee06d37..866591fe1 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,8 @@ "./dist/bin-transpile.js": "./dist/bin-transpile.js", "./dist/bin-script": "./dist/bin-script.js", "./dist/bin-script.js": "./dist/bin-script.js", + "./dist/bin-cwd": "./dist/bin-cwd.js", + "./dist/bin-cwd.js": "./dist/bin-cwd.js", "./register": "./register/index.js", "./register/files": "./register/files.js", "./register/transpile-only": "./register/transpile-only.js", @@ -27,6 +29,7 @@ "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-script": "dist/bin-script.js", + "ts-node-cwd": "dist/bin-cwd.js", "ts-node-transpile-only": "dist/bin-transpile.js" }, "files": [ diff --git a/src/bin-cwd.ts b/src/bin-cwd.ts new file mode 100644 index 000000000..fb2c1e63b --- /dev/null +++ b/src/bin-cwd.ts @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { main } from './bin' + +main(undefined, { '--cwd-mode': true }) diff --git a/src/bin.ts b/src/bin.ts index 9ec856798..d07a124e8 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { join, resolve, dirname } from 'path' +import { join, resolve, dirname, parse as parsePath } from 'path' import { inspect } from 'util' import Module = require('module') import arg = require('arg') @@ -10,7 +10,7 @@ import { createRepl, ReplService } from './repl' -import { VERSION, TSError, parse, register } from './index' +import { VERSION, TSError, parse, register, createRequire } from './index' /** * Main `bin` functionality. @@ -27,11 +27,12 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re // CLI options. '--help': Boolean, + '--cwd-mode': Boolean, '--script-mode': Boolean, '--version': arg.COUNT, // Project options. - '--dir': String, + '--cwd': String, '--files': Boolean, '--compiler': String, '--compiler-options': parse, @@ -62,7 +63,8 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re '-P': '--project', '-C': '--compiler', '-D': '--ignore-diagnostics', - '-O': '--compiler-options' + '-O': '--compiler-options', + '--dir': '--cwd' }, { argv, stopAtPositional: true @@ -73,9 +75,10 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re // Anything passed to `register()` can be `undefined`; `create()` will apply // defaults. const { - '--dir': dir, + '--cwd': cwdArg, '--help': help = false, - '--script-mode': scriptMode = false, + '--script-mode': scriptMode, + '--cwd-mode': cwdMode, '--version': version = 0, '--require': argsRequire = [], '--eval': code = undefined, @@ -111,7 +114,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re -h, --help Print CLI usage -v, --version Print module version information - -s, --script-mode Use cwd from instead of current directory + --cwd-mode Use current directory instead of for config resolution -T, --transpile-only Use TypeScript's faster \`transpileModule\` -H, --compiler-host Use TypeScript's compiler host API @@ -121,8 +124,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re -D, --ignore-diagnostics [code] Ignore TypeScript warnings by diagnostic code -O, --compiler-options [opts] JSON object to merge with compiler options - --dir Specify working directory for config resolution - --scope Scope compiler to files within \`cwd\` only + --cwd Behave as if invoked within this working directory. --files Load \`files\`, \`include\` and \`exclude\` from \`tsconfig.json\` on startup --pretty Use pretty diagnostic formatter (usually enabled by default) --skip-project Skip reading \`tsconfig.json\` @@ -140,7 +142,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re process.exit(0) } - const cwd = dir || process.cwd() + const cwd = cwdArg || process.cwd() /** Unresolved. May point to a symlink, not realpath. May be missing file extension */ const scriptPath = args._.length ? resolve(cwd, args._[0]) : undefined const state = new EvalState(scriptPath || join(cwd, EVAL_FILENAME)) @@ -149,7 +151,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re // Register the TypeScript compiler instance. const service = register({ - dir: getCwd(dir, scriptMode, scriptPath), + cwd, emit, files, pretty, @@ -159,6 +161,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re ignore, preferTsExts, logError, + projectSearchDir: getProjectSearchDir(cwd, scriptMode, cwdMode, scriptPath), project, skipProject, skipIgnore, @@ -211,19 +214,21 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re } /** - * Get project path from args. + * Get project search path from args. */ -function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { - // Validate `--script-mode` usage is correct. - if (scriptMode) { - if (!scriptPath) { - throw new TypeError('Script mode must be used with a script name, e.g. `ts-node -s `') - } - - if (dir) { - throw new TypeError('Script mode cannot be combined with `--dir`') - } - +function getProjectSearchDir (cwd?: string, scriptMode?: boolean, cwdMode?: boolean, scriptPath?: string) { + // Validate `--script-mode` / `--cwd-mode` / `--cwd` usage is correct. + if (scriptMode && cwdMode) { + throw new TypeError('--cwd-mode cannot be combined with --script-mode') + } + if (scriptMode && !scriptPath) { + throw new TypeError('--script-mode must be used with a script name, e.g. `ts-node --script-mode `') + } + const doScriptMode = + scriptMode === true ? true + : cwdMode === true ? false + : !!scriptPath + if (doScriptMode) { // Use node's own resolution behavior to ensure we follow symlinks. // scriptPath may omit file extension or point to a directory with or without package.json. // This happens before we are registered, so we tell node's resolver to consider ts, tsx, and jsx files. @@ -240,7 +245,7 @@ function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { } } try { - return dirname(require.resolve(scriptPath)) + return dirname(requireResolveNonCached(scriptPath!)) } finally { for (const ext of extsTemporarilyInstalled) { delete require.extensions[ext] // tslint:disable-line @@ -248,7 +253,32 @@ function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { } } - return dir + return cwd +} + +const guaranteedNonexistentDirectoryPrefix = resolve(__dirname, 'doesnotexist') +let guaranteedNonexistentDirectorySuffix = 0 + +/** + * require.resolve an absolute path, tricking node into *not* caching the results. + * Necessary so that we do not pollute require.resolve cache prior to installing require.extensions + * + * Is a terrible hack, because node does not expose the necessary cache invalidation APIs + * https://stackoverflow.com/questions/59865584/how-to-invalidate-cached-require-resolve-results + */ +function requireResolveNonCached (absoluteModuleSpecifier: string) { + // node 10 and 11 fallback: The trick below triggers a node 10 & 11 bug + // On those node versions, pollute the require cache instead. This is a deliberate + // ts-node limitation that will *rarely* manifest, and will not matter once node 10 + // is end-of-life'd on 2021-04-30 + const isSupportedNodeVersion = parseInt(process.versions.node.split('.')[0], 10) >= 12 + if (!isSupportedNodeVersion) return require.resolve(absoluteModuleSpecifier) + + const { dir, base } = parsePath(absoluteModuleSpecifier) + const relativeModuleSpecifier = `./${base}` + + const req = createRequire(join(dir, 'imaginaryUncacheableRequireResolveScript')) + return req.resolve(relativeModuleSpecifier, { paths: [`${ guaranteedNonexistentDirectoryPrefix }${ guaranteedNonexistentDirectorySuffix++ }`, ...req.resolve.paths(relativeModuleSpecifier) || []] }) } /** diff --git a/src/index.spec.ts b/src/index.spec.ts index 164a76c2c..37f9be53d 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -31,6 +31,7 @@ const TEST_DIR = join(__dirname, '../tests') const PROJECT = join(TEST_DIR, 'tsconfig.json') const BIN_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node') const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') +const BIN_CWD_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-cwd') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ @@ -76,6 +77,8 @@ describe('ts-node', function () { testsDirRequire.resolve('ts-node/dist/bin-transpile.js') testsDirRequire.resolve('ts-node/dist/bin-script') testsDirRequire.resolve('ts-node/dist/bin-script.js') + testsDirRequire.resolve('ts-node/dist/bin-cwd') + testsDirRequire.resolve('ts-node/dist/bin-cwd.js') // Must be `require()`able obviously testsDirRequire.resolve('ts-node/register') @@ -467,8 +470,10 @@ describe('ts-node', function () { }) }) + const preferTsExtsEntrypoint = semver.gte(process.version, '12.0.0') ? 'import-order/compiled' : 'import-order/require-compiled' it('should import ts before js when --prefer-ts-exts flag is present', function (done) { - exec(`${cmd} --prefer-ts-exts import-order/compiled`, function (err, stdout) { + + exec(`${cmd} --prefer-ts-exts ${preferTsExtsEntrypoint}`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') @@ -477,7 +482,7 @@ describe('ts-node', function () { }) it('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', function (done) { - exec(`${cmd} import-order/compiled`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { + exec(`${cmd} ${preferTsExtsEntrypoint}`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') @@ -533,17 +538,49 @@ describe('ts-node', function () { }) if (semver.gte(ts.version, '2.7.0')) { - it('should support script mode', function (done) { - exec(`${BIN_SCRIPT_PATH} scope/a/log`, function (err, stdout) { + it('should locate tsconfig relative to entry-point by default', function (done) { + exec(`${BIN_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-a/) + + return done() + }) + }) + it('should locate tsconfig relative to entry-point via ts-node-script', function (done) { + exec(`${BIN_SCRIPT_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-a/) + + return done() + }) + }) + it('should locate tsconfig relative to entry-point with --script-mode', function (done) { + exec(`${BIN_PATH} --script-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-a/) + + return done() + }) + }) + it('should locate tsconfig relative to cwd via ts-node-cwd', function (done) { + exec(`${BIN_CWD_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-b/) + + return done() + }) + }) + it('should locate tsconfig relative to cwd in --cwd-mode', function (done) { + exec(`${BIN_PATH} --cwd-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { expect(err).to.equal(null) - expect(stdout).to.equal('.ts\n') + expect(stdout).to.match(/plugin-b/) return done() }) }) - it('should read tsconfig relative to realpath, not symlink, in scriptMode', function (done) { + it('should locate tsconfig relative to realpath, not symlink, when entrypoint is a symlink', function (done) { if (lstatSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { - exec(`${BIN_SCRIPT_PATH} main-realpath/symlink/symlink.tsx`, function (err, stdout) { + exec(`${BIN_PATH} main-realpath/symlink/symlink.tsx`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') @@ -636,7 +673,7 @@ describe('ts-node', function () { }) it('should transpile files inside a node_modules directory when not ignored', function (done) { - exec(`${cmdNoProject} --script-mode from-node-modules/from-node-modules`, function (err, stdout, stderr) { + exec(`${cmdNoProject} from-node-modules/from-node-modules`, function (err, stdout, stderr) { if (err) return done(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) expect(JSON.parse(stdout)).to.deep.equal({ external: { @@ -656,11 +693,11 @@ describe('ts-node', function () { describe('should respect maxNodeModulesJsDepth', function () { it('for unscoped modules', function (done) { - exec(`${cmdNoProject} --script-mode maxnodemodulesjsdepth`, function (err, stdout, stderr) { + exec(`${cmdNoProject} maxnodemodulesjsdepth`, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + - "other.ts(4,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + + "maxnodemodulesjsdepth/other.ts(4,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + '\n' ) done() @@ -668,11 +705,11 @@ describe('ts-node', function () { }) it('for @scoped modules', function (done) { - exec(`${cmdNoProject} --script-mode maxnodemodulesjsdepth-scoped`, function (err, stdout, stderr) { + exec(`${cmdNoProject} maxnodemodulesjsdepth-scoped`, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + - "other.ts(7,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + + "maxnodemodulesjsdepth-scoped/other.ts(7,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + '\n' ) done() @@ -734,8 +771,8 @@ describe('ts-node', function () { registered.enabled(false) const compilers = [ - register({ dir: join(TEST_DIR, 'scope/a'), scope: true }), - register({ dir: join(TEST_DIR, 'scope/b'), scope: true }) + register({ projectSearchDir: join(TEST_DIR, 'scope/a'), scopeDir: join(TEST_DIR, 'scope/a'), scope: true }), + register({ projectSearchDir: join(TEST_DIR, 'scope/a'), scopeDir: join(TEST_DIR, 'scope/b'), scope: true }) ] compilers.forEach(c => { diff --git a/src/index.ts b/src/index.ts index bae0f5263..b716611c9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,8 +7,8 @@ import { fileURLToPath } from 'url' import type * as _ts from 'typescript' import { Module, createRequire as nodeCreateRequire, createRequireFromPath as nodeCreateRequireFromPath } from 'module' import type _createRequire from 'create-require' -// tslint:disable-next-line -const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire +// tslint:disable-next-line:deprecation +export const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire export { createRepl, CreateReplOptions, ReplService } from './repl' @@ -56,8 +56,11 @@ export const env = process.env as ProcessEnv */ export interface ProcessEnv { TS_NODE_DEBUG?: string + TS_NODE_CWD?: string + /** @deprecated */ TS_NODE_DIR?: string TS_NODE_EMIT?: string + /** @deprecated */ TS_NODE_SCOPE?: string TS_NODE_FILES?: string TS_NODE_PRETTY?: string @@ -153,10 +156,16 @@ export const VERSION = require('../package.json').version */ export interface CreateOptions { /** - * Specify working directory for config resolution. + * Behave as if invoked within this working directory. Roughly equivalent to `cd $dir && ts-node ...` * * @default process.cwd() */ + cwd?: string + /** + * Legacy alias for `cwd` + * + * @deprecated use `projectSearchDir` or `cwd` + */ dir?: string /** * Emit output files into `.ts-node` directory. @@ -165,11 +174,15 @@ export interface CreateOptions { */ emit?: boolean /** - * Scope compiler to files within `cwd`. + * Scope compiler to files within `scopeDir`. * * @default false */ scope?: boolean + /** + * @default First of: `tsconfig.json` "rootDir" if specified, directory containing `tsconfig.json`, or cwd if no `tsconfig.json` is loaded. + */ + scopeDir?: string /** * Use pretty diagnostic formatter. * @@ -189,7 +202,7 @@ export interface CreateOptions { */ typeCheck?: boolean /** - * Use TypeScript's compiler host API. + * Use TypeScript's compiler host API instead of the language service API. * * @default false */ @@ -201,7 +214,9 @@ export interface CreateOptions { */ logError?: boolean /** - * Load files from `tsconfig.json` on startup. + * Load "files" and "include" from `tsconfig.json` on startup. + * + * Default is to override `tsconfig.json` "files" and "include" to only include the entrypoint script. * * @default false */ @@ -213,16 +228,26 @@ export interface CreateOptions { */ compiler?: string /** - * Override the path patterns to skip compilation. + * Paths which should not be compiled. * - * @default /node_modules/ - * @docsDefault "/node_modules/" + * Each string in the array is converted to a regular expression via `new RegExp()` and tested against source paths prior to compilation. + * + * Source paths are normalized to posix-style separators, relative to the directory containing `tsconfig.json` or to cwd if no `tsconfig.json` is loaded. + * + * Default is to ignore all node_modules subdirectories. + * + * @default ["(?:^|/)node_modules/"] */ ignore?: string[] /** - * Path to TypeScript JSON project file. + * Path to TypeScript config file or directory containing a `tsconfig.json`. + * Similar to the `tsc --project` flag: https://www.typescriptlang.org/docs/handbook/compiler-options.html */ project?: string + /** + * Search for TypeScript config file (`tsconfig.json`) in this or parent directories. + */ + projectSearchDir?: string /** * Skip project config resolution and loading. * @@ -230,13 +255,13 @@ export interface CreateOptions { */ skipProject?: boolean /** - * Skip ignore check. + * Skip ignore check, so that compilation will be attempted for all files with matching extensions. * * @default false */ skipIgnore?: boolean /** - * JSON object to merge with compiler options. + * JSON object to merge with TypeScript `compilerOptions`. * * @allOf [{"$ref": "https://schemastore.azurewebsites.net/schemas/json/tsconfig.json#definitions/compilerOptionsDefinition/properties/compilerOptions"}] */ @@ -248,7 +273,7 @@ export interface CreateOptions { /** * Modules to require, like node's `--require` flag. * - * If specified in tsconfig.json, the modules will be resolved relative to the tsconfig.json file. + * If specified in `tsconfig.json`, the modules will be resolved relative to the `tsconfig.json` file. * * If specified programmatically, each input string should be pre-resolved to an absolute path for * best results. @@ -272,6 +297,8 @@ export interface RegisterOptions extends CreateOptions { /** * Re-order file extensions so that TypeScript imports are preferred. * + * For example, when both `index.js` and `index.ts` exist, enabling this option causes `require('./index')` to resolve to `index.ts` instead of `index.js` + * * @default false */ preferTsExts?: boolean @@ -287,6 +314,11 @@ export interface TsConfigOptions extends Omit {} /** @@ -315,9 +347,9 @@ export interface TypeInfo { * variables. */ export const DEFAULTS: RegisterOptions = { - dir: env.TS_NODE_DIR, + cwd: env.TS_NODE_CWD ?? env.TS_NODE_DIR, // tslint:disable-line:deprecation emit: yn(env.TS_NODE_EMIT), - scope: yn(env.TS_NODE_SCOPE), + scope: yn(env.TS_NODE_SCOPE), // tslint:disable-line:deprecation files: yn(env.TS_NODE_FILES), pretty: yn(env.TS_NODE_PRETTY), compiler: env.TS_NODE_COMPILER, @@ -461,34 +493,35 @@ export function register (opts: RegisterOptions = {}): Service { * Create TypeScript compiler instance. */ export function create (rawOptions: CreateOptions = {}): Service { - const dir = rawOptions.dir ?? DEFAULTS.dir + const cwd = resolve(rawOptions.cwd ?? rawOptions.dir ?? DEFAULTS.cwd ?? process.cwd()) // tslint:disable-line:deprecation const compilerName = rawOptions.compiler ?? DEFAULTS.compiler - const cwd = dir ? resolve(dir) : process.cwd() /** * Load the typescript compiler. It is required to load the tsconfig but might - * be changed by the tsconfig, so we sometimes have to do this twice. + * be changed by the tsconfig, so we have to do this twice. */ - function loadCompiler (name: string | undefined) { - const compiler = require.resolve(name || 'typescript', { paths: [cwd, __dirname] }) + function loadCompiler (name: string | undefined, relativeToPath: string) { + const compiler = require.resolve(name || 'typescript', { paths: [relativeToPath, __dirname] }) const ts: typeof _ts = require(compiler) return { compiler, ts } } // Compute minimum options to read the config file. - let { compiler, ts } = loadCompiler(compilerName) + let { compiler, ts } = loadCompiler(compilerName, rawOptions.projectSearchDir ?? rawOptions.project ?? cwd) // Read config file and merge new options between env and CLI options. - const { config, options: tsconfigOptions } = readConfig(cwd, ts, rawOptions) + const { configFilePath, config, options: tsconfigOptions } = readConfig(cwd, ts, rawOptions) const options = assign({}, DEFAULTS, tsconfigOptions || {}, rawOptions) options.require = [ ...tsconfigOptions.require || [], ...rawOptions.require || [] ] - // If `compiler` option changed based on tsconfig, re-load the compiler. - if (options.compiler !== compilerName) { - ({ compiler, ts } = loadCompiler(options.compiler)) + // Re-load the compiler in case it has changed. + // Compiler is loaded relative to tsconfig.json, so tsconfig discovery may cause us to load a + // different compiler than we did above, even if the name has not changed. + if (configFilePath) { + ({ compiler, ts } = loadCompiler(options.compiler, configFilePath)) } const readFile = options.readFile || ts.sys.readFile @@ -508,8 +541,11 @@ export function create (rawOptions: CreateOptions = {}): Service { content: string }>() - const isScoped = options.scope ? (relname: string) => relname.charAt(0) !== '.' : () => true - const shouldIgnore = createIgnore(options.skipIgnore ? [] : ( + const configFileDirname = configFilePath ? dirname(configFilePath) : null + const scopeDir = options.scopeDir ?? config.options.rootDir ?? configFileDirname ?? cwd + const ignoreBaseDir = configFileDirname ?? cwd + const isScoped = options.scope ? (fileName: string) => relative(scopeDir, fileName).charAt(0) !== '.' : () => true + const shouldIgnore = createIgnore(ignoreBaseDir, options.skipIgnore ? [] : ( options.ignore || ['(?:^|/)node_modules/'] ).map(str => new RegExp(str))) @@ -1012,8 +1048,7 @@ export function create (rawOptions: CreateOptions = {}): Service { if (!active) return true const ext = extname(fileName) if (extensions.tsExtensions.includes(ext) || extensions.jsExtensions.includes(ext)) { - const relname = relative(cwd, fileName) - return !isScoped(relname) || shouldIgnore(relname) + return !isScoped(fileName) || shouldIgnore(fileName) } return true } @@ -1024,8 +1059,9 @@ export function create (rawOptions: CreateOptions = {}): Service { /** * Check if the filename should be ignored. */ -function createIgnore (ignore: RegExp[]) { - return (relname: string) => { +function createIgnore (ignoreBaseDir: string, ignore: RegExp[]) { + return (fileName: string) => { + const relname = relative(ignoreBaseDir, fileName) const path = normalizeSlashes(relname) return ignore.some(x => x.test(path)) @@ -1058,7 +1094,7 @@ function registerExtensions ( } if (preferTsExts) { - // tslint:disable-next-line + // tslint:disable-next-line:deprecation const preferredExtensions = new Set([...extensions, ...Object.keys(require.extensions)]) for (const ext of preferredExtensions) reorderRequireExtension(ext) @@ -1128,6 +1164,8 @@ function readConfig ( ts: TSCommon, rawOptions: CreateOptions ): { + // Path of tsconfig file + configFilePath: string | undefined, // Parsed TypeScript configuration. config: _ts.ParsedCommandLine // Options pulled from `tsconfig.json`. @@ -1135,7 +1173,8 @@ function readConfig ( } { let config: any = { compilerOptions: {} } let basePath = cwd - let configFileName: string | undefined = undefined + let configFilePath: string | undefined = undefined + const projectSearchDir = resolve(cwd, rawOptions.projectSearchDir ?? cwd) const { fileExists = ts.sys.fileExists, @@ -1146,23 +1185,24 @@ function readConfig ( // Read project configuration when available. if (!skipProject) { - configFileName = project + configFilePath = project ? resolve(cwd, project) - : ts.findConfigFile(cwd, fileExists) + : ts.findConfigFile(projectSearchDir, fileExists) - if (configFileName) { - const result = ts.readConfigFile(configFileName, readFile) + if (configFilePath) { + const result = ts.readConfigFile(configFilePath, readFile) // Return diagnostics. if (result.error) { return { + configFilePath, config: { errors: [result.error], fileNames: [], options: {} }, options: {} } } config = result.config - basePath = dirname(configFileName) + basePath = dirname(configFilePath) } } @@ -1191,17 +1231,17 @@ function readConfig ( readFile, readDirectory: ts.sys.readDirectory, useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames - }, basePath, undefined, configFileName)) + }, basePath, undefined, configFilePath)) if (tsconfigOptions.require) { // Modules are found relative to the tsconfig file, not the `dir` option - const tsconfigRelativeRequire = createRequire(configFileName!) + const tsconfigRelativeRequire = createRequire(configFilePath!) tsconfigOptions.require = tsconfigOptions.require.map((path: string) => { return tsconfigRelativeRequire.resolve(path) }) } - return { config: fixedConfig, options: tsconfigOptions } + return { configFilePath, config: fixedConfig, options: tsconfigOptions } } /** diff --git a/tests/cwd-and-script-mode/a/index.ts b/tests/cwd-and-script-mode/a/index.ts new file mode 100644 index 000000000..f5fbb60fd --- /dev/null +++ b/tests/cwd-and-script-mode/a/index.ts @@ -0,0 +1,7 @@ +export {} +// Type assertion to please TS 2.7 +const register = process[(Symbol as any).for('ts-node.register.instance')] +console.log(JSON.stringify({ + options: register.options, + config: register.config +})) diff --git a/tests/cwd-and-script-mode/a/tsconfig.json b/tests/cwd-and-script-mode/a/tsconfig.json new file mode 100644 index 000000000..8e2e88090 --- /dev/null +++ b/tests/cwd-and-script-mode/a/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "plugins": [{ + "name": "plugin-a" + }] + } +} diff --git a/tests/cwd-and-script-mode/b/index.ts b/tests/cwd-and-script-mode/b/index.ts new file mode 100644 index 000000000..f5fbb60fd --- /dev/null +++ b/tests/cwd-and-script-mode/b/index.ts @@ -0,0 +1,7 @@ +export {} +// Type assertion to please TS 2.7 +const register = process[(Symbol as any).for('ts-node.register.instance')] +console.log(JSON.stringify({ + options: register.options, + config: register.config +})) diff --git a/tests/cwd-and-script-mode/b/tsconfig.json b/tests/cwd-and-script-mode/b/tsconfig.json new file mode 100644 index 000000000..0c761dd31 --- /dev/null +++ b/tests/cwd-and-script-mode/b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "plugins": [{ + "name": "plugin-b" + }] + } +} diff --git a/tests/import-order/require-compiled.js b/tests/import-order/require-compiled.js new file mode 100644 index 000000000..3977135dd --- /dev/null +++ b/tests/import-order/require-compiled.js @@ -0,0 +1,2 @@ +// indirectly load ./compiled in node < 12 (soon to be end-of-life'd) +require('./compiled') From 87399c4777abfb9db913b1d356b8aa25cb98d585 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 15 Feb 2021 19:48:35 -0500 Subject: [PATCH 100/113] filter tsconfig "ts-node" options so that un-approved options do not affect compiler behavior (#1223) --- src/index.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index b716611c9..5bba3b8d7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1207,7 +1207,7 @@ function readConfig ( } // Fix ts-node options that come from tsconfig.json - const tsconfigOptions: TsConfigOptions = Object.assign({}, config['ts-node']) + const tsconfigOptions: TsConfigOptions = Object.assign({}, filterRecognizedTsConfigTsNodeOptions(config['ts-node'])) // Remove resolution of "files". const files = rawOptions.files ?? tsconfigOptions.files ?? DEFAULTS.files @@ -1244,6 +1244,28 @@ function readConfig ( return { configFilePath, config: fixedConfig, options: tsconfigOptions } } +/** + * Given the raw "ts-node" sub-object from a tsconfig, return an object with only the properties + * recognized by "ts-node" + */ +function filterRecognizedTsConfigTsNodeOptions (jsonObject: any): TsConfigOptions { + if (jsonObject == null) return jsonObject + const { + compiler, compilerHost, compilerOptions, emit, files, ignore, + ignoreDiagnostics, logError, preferTsExts, pretty, require, skipIgnore, + transpileOnly, typeCheck + } = jsonObject as TsConfigOptions + const filteredTsConfigOptions = { + compiler, compilerHost, compilerOptions, emit, files, ignore, + ignoreDiagnostics, logError, preferTsExts, pretty, require, skipIgnore, + transpileOnly, typeCheck + } + // Use the typechecker to make sure this implementation has the correct set of properties + const catchExtraneousProps: keyof TsConfigOptions = null as any as keyof typeof filteredTsConfigOptions + const catchMissingProps: keyof typeof filteredTsConfigOptions = null as any as keyof TsConfigOptions + return filteredTsConfigOptions +} + /** * Internal source output. */ From 7caba3b18abf6d3af3f779643ee8fec0adf7da1e Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 15 Feb 2021 21:17:41 -0500 Subject: [PATCH 101/113] fix #1217 (#1224) --- src/repl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/repl.ts b/src/repl.ts index 35dd6919b..a0b9c60e5 100644 --- a/src/repl.ts +++ b/src/repl.ts @@ -95,7 +95,7 @@ export function createRepl (options: CreateReplOptions = {}) { if (Recoverable && isRecoverable(error)) { err = new Recoverable(error) } else { - console.error(error) + _console.error(error) } } else { err = error From 99aa4dcfe1c1f449348e96658ae2453d47a647f3 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 15 Feb 2021 22:04:32 -0500 Subject: [PATCH 102/113] Refactor tests to stop using callbacks (#1227) --- src/index.spec.ts | 972 +++++++++++++++++++--------------------------- 1 file changed, 400 insertions(+), 572 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 37f9be53d..a2d02f0fd 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -15,17 +15,23 @@ import Module = require('module') import { PassThrough } from 'stream' import * as getStream from 'get-stream' -function exec (cmd: string, callback: (err: ExecException | null, stdout: string, stderr: string) => void): ChildProcess -function exec (cmd: string, opts: ExecOptions, callback: (err: ExecException | null, stdout: string, stderr: string) => void): ChildProcess -function exec (cmd: string, opts: ExecOptions | ((err: ExecException | null, stdout: string, stderr: string) => void), callback?: (err: ExecException | null, stdout: string, stderr: string) => void) { - const _opts = typeof opts === 'function' ? {} : opts - const _callback = typeof opts === 'function' ? opts : callback - return childProcessExec(cmd, { - cwd: TEST_DIR, - ..._opts - }, _callback) +type TestExecReturn = { stdout: string, stderr: string, err: null | ExecException } +function exec (cmd: string, opts: ExecOptions = {}): Promise & { child: ChildProcess } { + let childProcess!: ChildProcess + return Object.assign( + new Promise((resolve, reject) => { + childProcess = childProcessExec(cmd, { + cwd: TEST_DIR, + ...opts + }, (error, stdout, stderr) => { + resolve({ err: error, stdout, stderr }) + }) + }), + { + child: childProcess + } + ) } -const execP = promisify(exec) as any as typeof childProcessExec['__promisify__'] const TEST_DIR = join(__dirname, '../tests') const PROJECT = join(TEST_DIR, 'tsconfig.json') @@ -45,10 +51,10 @@ let { register, create, VERSION, createRepl }: typeof tsNodeTypes = {} as any before(async function () { this.timeout(5 * 60e3) rimrafSync(join(TEST_DIR, 'node_modules')) - await execP(`npm install`, { cwd: TEST_DIR }) + await promisify(childProcessExec)(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) - ;({ register, create, VERSION, createRepl } = testsDirRequire('ts-node')) + ; ({ register, create, VERSION, createRepl } = testsDirRequire('ts-node')) }) describe('ts-node', function () { @@ -57,10 +63,10 @@ describe('ts-node', function () { this.timeout(10000) - it('should export the correct version', function () { + it('should export the correct version', () => { expect(VERSION).to.equal(require('../package.json').version) }) - it('should export all CJS entrypoints', function () { + it('should export all CJS entrypoints', () => { // Ensure our package.json "exports" declaration allows `require()`ing all our entrypoints // https://github.com/TypeStrong/ts-node/pull/1026 @@ -93,297 +99,226 @@ describe('ts-node', function () { testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') }) - describe('cli', function () { + describe('cli', () => { this.slow(1000) - it('should execute cli', function (done) { - exec(`${cmd} hello-world`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - - return done() - }) - }) - - it('shows usage via --help', function (done) { - exec(`${cmdNoProject} --help`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.match(/Usage: ts-node /) - return done() - }) - }) - it('shows version via -v', function (done) { - exec(`${cmdNoProject} -v`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout.trim()).to.equal('v' + testsDirRequire('ts-node/package').version) - return done() - }) - }) - it('shows version of compiler via -vv', function (done) { - exec(`${cmdNoProject} -vv`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout.trim()).to.equal( - `ts-node v${ testsDirRequire('ts-node/package').version }\n` + - `node ${ process.version }\n` + - `compiler v${ testsDirRequire('typescript/package').version }` - ) - return done() - }) + it('should execute cli', async () => { + const { err, stdout } = await exec(`${cmd} hello-world`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, world!\n') + }) + + it('shows usage via --help', async () => { + const { err, stdout } = await exec(`${cmdNoProject} --help`) + expect(err).to.equal(null) + expect(stdout).to.match(/Usage: ts-node /) + }) + it('shows version via -v', async () => { + const { err, stdout } = await exec(`${cmdNoProject} -v`) + expect(err).to.equal(null) + expect(stdout.trim()).to.equal('v' + testsDirRequire('ts-node/package').version) + }) + it('shows version of compiler via -vv', async () => { + const { err, stdout } = await exec(`${cmdNoProject} -vv`) + expect(err).to.equal(null) + expect(stdout.trim()).to.equal( + `ts-node v${testsDirRequire('ts-node/package').version}\n` + + `node ${process.version}\n` + + `compiler v${testsDirRequire('typescript/package').version}` + ) }) - it('should register via cli', function (done) { - exec(`node -r ts-node/register hello-world.ts`, { + it('should register via cli', async () => { + const { err, stdout } = await exec(`node -r ts-node/register hello-world.ts`, { cwd: TEST_DIR - }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - - return done() }) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, world!\n') }) - it('should execute cli with absolute path', function (done) { - exec(`${cmd} "${join(TEST_DIR, 'hello-world')}"`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - - return done() - }) + it('should execute cli with absolute path', async () => { + const { err, stdout } = await exec(`${cmd} "${join(TEST_DIR, 'hello-world')}"`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, world!\n') }) - it('should print scripts', function (done) { - exec(`${cmd} -pe "import { example } from './complex/index';example()"`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('example\n') - - return done() - }) + it('should print scripts', async () => { + const { err, stdout } = await exec(`${cmd} -pe "import { example } from './complex/index';example()"`) + expect(err).to.equal(null) + expect(stdout).to.equal('example\n') }) - it('should provide registered information globally', function (done) { - exec(`${cmd} env`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('object\n') - - return done() - }) + it('should provide registered information globally', async () => { + const { err, stdout } = await exec(`${cmd} env`) + expect(err).to.equal(null) + expect(stdout).to.equal('object\n') }) - it('should provide registered information on register', function (done) { - exec(`node -r ts-node/register env.ts`, { + it('should provide registered information on register', async () => { + const { err, stdout } = await exec(`node -r ts-node/register env.ts`, { cwd: TEST_DIR - }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('object\n') - - return done() }) + expect(err).to.equal(null) + expect(stdout).to.equal('object\n') }) if (semver.gte(ts.version, '1.8.0')) { - it('should allow js', function (done) { - exec( + it('should allow js', async () => { + const { err, stdout } = await exec( [ cmd, '-O "{\\\"allowJs\\\":true}"', '-pe "import { main } from \'./allow-js/run\';main()"' - ].join(' '), - function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('hello world\n') - - return done() - } - ) - }) + ].join(' ')) + expect(err).to.equal(null) + expect(stdout).to.equal('hello world\n') + } + ) - it('should include jsx when `allow-js` true', function (done) { - exec( + it('should include jsx when `allow-js` true', async () => { + const { err, stdout } = await exec( [ cmd, '-O "{\\\"allowJs\\\":true}"', '-pe "import { Foo2 } from \'./allow-js/with-jsx\'; Foo2.sayHi()"' - ].join(' '), - function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('hello world\n') - - return done() - } - ) + ].join(' ')) + expect(err).to.equal(null) + expect(stdout).to.equal('hello world\n') }) } - it('should eval code', function (done) { - exec( - `${cmd} -e "import * as m from './module';console.log(m.example('test'))"`, - function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('TEST\n') - - return done() - } - ) + it('should eval code', async () => { + const { err, stdout } = await exec( + `${cmd} -e "import * as m from './module';console.log(m.example('test'))"`) + expect(err).to.equal(null) + expect(stdout).to.equal('TEST\n') }) - it('should import empty files', function (done) { - exec(`${cmd} -e "import './empty'"`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('') - - return done() - }) + it('should import empty files', async () => { + const { err, stdout } = await exec(`${cmd} -e "import './empty'"`) + expect(err).to.equal(null) + expect(stdout).to.equal('') }) - it('should throw errors', function (done) { - exec(`${cmd} -e "import * as m from './module';console.log(m.example(123))"`, function (err) { - if (err === null) { - return done('Command was expected to fail, but it succeeded.') - } - - expect(err.message).to.match(new RegExp( - 'TS2345: Argument of type \'(?:number|123)\' ' + - 'is not assignable to parameter of type \'string\'\\.' - )) + it('should throw errors', async () => { + const { err } = await exec(`${cmd} -e "import * as m from './module';console.log(m.example(123))"`) + if (err === null) { + throw new Error('Command was expected to fail, but it succeeded.') + } - return done() - }) + expect(err.message).to.match(new RegExp( + 'TS2345: Argument of type \'(?:number|123)\' ' + + 'is not assignable to parameter of type \'string\'\\.' + )) }) - it('should be able to ignore diagnostic', function (done) { - exec( - `${cmd} --ignore-diagnostics 2345 -e "import * as m from './module';console.log(m.example(123))"`, - function (err) { - if (err === null) { - return done('Command was expected to fail, but it succeeded.') - } - - expect(err.message).to.match( - /TypeError: (?:(?:undefined|foo\.toUpperCase) is not a function|.*has no method \'toUpperCase\')/ - ) + it('should be able to ignore diagnostic', async () => { + const { err } = await exec( + `${cmd} --ignore-diagnostics 2345 -e "import * as m from './module';console.log(m.example(123))"`) + if (err === null) { + throw new Error('Command was expected to fail, but it succeeded.') + } - return done() - } + expect(err.message).to.match( + /TypeError: (?:(?:undefined|foo\.toUpperCase) is not a function|.*has no method \'toUpperCase\')/ ) }) - it('should work with source maps', function (done) { - exec(`${cmd} throw`, function (err) { - if (err === null) { - return done('Command was expected to fail, but it succeeded.') - } - - expect(err.message).to.contain([ - `${join(TEST_DIR, 'throw.ts')}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^', - 'Error: this is a demo' - ].join('\n')) + it('should work with source maps', async () => { + const { err } = await exec(`${cmd} throw`) + if (err === null) { + throw new Error('Command was expected to fail, but it succeeded.') + } - return done() - }) + expect(err.message).to.contain([ + `${join(TEST_DIR, 'throw.ts')}:100`, + ' bar () { throw new Error(\'this is a demo\') }', + ' ^', + 'Error: this is a demo' + ].join('\n')) }) - it('eval should work with source maps', function (done) { - exec(`${cmd} -pe "import './throw'"`, function (err) { - if (err === null) { - return done('Command was expected to fail, but it succeeded.') - } - - expect(err.message).to.contain([ - `${join(TEST_DIR, 'throw.ts')}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^' - ].join('\n')) + it('eval should work with source maps', async () => { + const { err } = await exec(`${cmd} -pe "import './throw'"`) + if (err === null) { + throw new Error('Command was expected to fail, but it succeeded.') + } - return done() - }) + expect(err.message).to.contain([ + `${join(TEST_DIR, 'throw.ts')}:100`, + ' bar () { throw new Error(\'this is a demo\') }', + ' ^' + ].join('\n')) }) - it('should support transpile only mode', function (done) { - exec(`${cmd} --transpile-only -pe "x"`, function (err) { - if (err === null) { - return done('Command was expected to fail, but it succeeded.') - } - - expect(err.message).to.contain('ReferenceError: x is not defined') + it('should support transpile only mode', async () => { + const { err } = await exec(`${cmd} --transpile-only -pe "x"`) + if (err === null) { + throw new Error('Command was expected to fail, but it succeeded.') + } - return done() - }) + expect(err.message).to.contain('ReferenceError: x is not defined') }) - it('should throw error even in transpileOnly mode', function (done) { - exec(`${cmd} --transpile-only -pe "console."`, function (err) { - if (err === null) { - return done('Command was expected to fail, but it succeeded.') - } - - expect(err.message).to.contain('error TS1003: Identifier expected') + it('should throw error even in transpileOnly mode', async () => { + const { err } = await exec(`${cmd} --transpile-only -pe "console."`) + if (err === null) { + throw new Error('Command was expected to fail, but it succeeded.') + } - return done() - }) + expect(err.message).to.contain('error TS1003: Identifier expected') }) - it('should pipe into `ts-node` and evaluate', function (done) { - const cp = exec(cmd, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('hello\n') - - return done() - }) - - cp.stdin!.end("console.log('hello')") + it('should pipe into `ts-node` and evaluate', async () => { + const execPromise = exec(cmd) + execPromise.child.stdin!.end("console.log('hello')") + const { err, stdout } = await execPromise + expect(err).to.equal(null) + expect(stdout).to.equal('hello\n') }) - it('should pipe into `ts-node`', function (done) { - const cp = exec(`${cmd} -p`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('true\n') - - return done() - }) + it('should pipe into `ts-node`', async () => { + const execPromise = exec(`${cmd} -p`) + execPromise.child.stdin!.end('true') + const { err, stdout } = await execPromise + expect(err).to.equal(null) + expect(stdout).to.equal('true\n') - cp.stdin!.end('true') }) - it('should pipe into an eval script', function (done) { - const cp = exec(`${cmd} --transpile-only -pe "process.stdin.isTTY"`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('undefined\n') + it('should pipe into an eval script', async () => { + const execPromise = exec(`${cmd} --transpile-only -pe "process.stdin.isTTY"`) + execPromise.child.stdin!.end('true') + const { err, stdout } = await execPromise + expect(err).to.equal(null) + expect(stdout).to.equal('undefined\n') - return done() - }) - - cp.stdin!.end('true') }) - it('should run REPL when --interactive passed and stdin is not a TTY', function (done) { - const cp = exec(`${cmd} --interactive`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal( - '> 123\n' + - 'undefined\n' + - '> ' - ) - return done() - }) + it('should run REPL when --interactive passed and stdin is not a TTY', async () => { + const execPromise = exec(`${cmd} --interactive`) + execPromise.child.stdin!.end('console.log("123")\n') + const { err, stdout } = await execPromise + expect(err).to.equal(null) + expect(stdout).to.equal( + '> 123\n' + + 'undefined\n' + + '> ' + ) - cp.stdin!.end('console.log("123")\n') }) - it('REPL has command to get type information', function (done) { - const cp = exec(`${cmd} --interactive`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal( - '> undefined\n' + - '> undefined\n' + - '> const a: 123\n' + - '> ' - ) - return done() - }) - - cp.stdin!.end('\nconst a = 123\n.type a') + it('REPL has command to get type information', async () => { + const execPromise = exec(`${cmd} --interactive`) + execPromise.child.stdin!.end('\nconst a = 123\n.type a') + const { err, stdout } = await execPromise + expect(err).to.equal(null) + expect(stdout).to.equal( + '> undefined\n' + + '> undefined\n' + + '> const a: 123\n' + + '> ' + ) }) it('REPL can be created via API', async () => { @@ -412,313 +347,242 @@ describe('ts-node', function () { ) }) - it('should support require flags', function (done) { - exec(`${cmd} -r ./hello-world -pe "console.log('success')"`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n') - - return done() - }) + it('should support require flags', async () => { + const { err, stdout } = await exec(`${cmd} -r ./hello-world -pe "console.log('success')"`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n') }) - it('should support require from node modules', function (done) { - exec(`${cmd} -r typescript -e "console.log('success')"`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('success\n') - - return done() - }) + it('should support require from node modules', async () => { + const { err, stdout } = await exec(`${cmd} -r typescript -e "console.log('success')"`) + expect(err).to.equal(null) + expect(stdout).to.equal('success\n') }) - it('should use source maps with react tsx', function (done) { - exec(`${cmd} throw-react-tsx.tsx`, function (err, stdout) { - expect(err).not.to.equal(null) - expect(err!.message).to.contain([ - `${join(TEST_DIR, './throw-react-tsx.tsx')}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^', - 'Error: this is a demo' - ].join('\n')) - - return done() - }) + it('should use source maps with react tsx', async () => { + const { err, stdout } = await exec(`${cmd} throw-react-tsx.tsx`) + expect(err).not.to.equal(null) + expect(err!.message).to.contain([ + `${join(TEST_DIR, './throw-react-tsx.tsx')}:100`, + ' bar () { throw new Error(\'this is a demo\') }', + ' ^', + 'Error: this is a demo' + ].join('\n')) }) - it('should allow custom typings', function (done) { - exec(`${cmd} custom-types`, function (err, stdout) { - expect(err).to.match(/Error: Cannot find module 'does-not-exist'/) - - return done() - }) + it('should allow custom typings', async () => { + const { err, stdout } = await exec(`${cmd} custom-types`) + expect(err).to.match(/Error: Cannot find module 'does-not-exist'/) }) - it('should preserve `ts-node` context with child process', function (done) { - exec(`${cmd} child-process`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - - return done() - }) + it('should preserve `ts-node` context with child process', async () => { + const { err, stdout } = await exec(`${cmd} child-process`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, world!\n') }) - it('should import js before ts by default', function (done) { - exec(`${cmd} import-order/compiled`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, JavaScript!\n') - - return done() - }) + it('should import js before ts by default', async () => { + const { err, stdout } = await exec(`${cmd} import-order/compiled`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, JavaScript!\n') }) const preferTsExtsEntrypoint = semver.gte(process.version, '12.0.0') ? 'import-order/compiled' : 'import-order/require-compiled' - it('should import ts before js when --prefer-ts-exts flag is present', function (done) { - - exec(`${cmd} --prefer-ts-exts ${preferTsExtsEntrypoint}`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, TypeScript!\n') + it('should import ts before js when --prefer-ts-exts flag is present', async () => { - return done() - }) + const { err, stdout } = await exec(`${cmd} --prefer-ts-exts ${preferTsExtsEntrypoint}`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, TypeScript!\n') }) - it('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', function (done) { - exec(`${cmd} ${preferTsExtsEntrypoint}`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, TypeScript!\n') - - return done() - }) + it('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', async () => { + const { err, stdout } = await exec(`${cmd} ${preferTsExtsEntrypoint}`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, TypeScript!\n') }) - it('should ignore .d.ts files', function (done) { - exec(`${cmd} import-order/importer`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, World!\n') - - return done() - }) + it('should ignore .d.ts files', async () => { + const { err, stdout } = await exec(`${cmd} import-order/importer`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, World!\n') }) - describe('issue #884', function () { - it('should compile', function (done) { + describe('issue #884', () => { + it('should compile', async function () { // TODO disabled because it consistently fails on Windows on TS 2.7 if (process.platform === 'win32' && semver.satisfies(ts.version, '2.7')) { this.skip() } else { - exec(`"${BIN_PATH}" --project issue-884/tsconfig.json issue-884`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('') - - return done() - }) + const { err, stdout } = await exec(`"${BIN_PATH}" --project issue-884/tsconfig.json issue-884`) + expect(err).to.equal(null) + expect(stdout).to.equal('') } }) }) - describe('issue #986', function () { - it('should not compile', function (done) { - exec(`"${BIN_PATH}" --project issue-986/tsconfig.json issue-986`, function (err, stdout, stderr) { - expect(err).not.to.equal(null) - expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. - expect(stdout).to.equal('') - - return done() - }) + describe('issue #986', () => { + it('should not compile', async () => { + const { err, stdout, stderr } = await exec(`"${BIN_PATH}" --project issue-986/tsconfig.json issue-986`) + expect(err).not.to.equal(null) + expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. + expect(stdout).to.equal('') }) - it('should compile with `--files`', function (done) { - exec(`"${BIN_PATH}" --files --project issue-986/tsconfig.json issue-986`, function (err, stdout, stderr) { - expect(err).not.to.equal(null) - expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. - expect(stdout).to.equal('') - - return done() - }) + it('should compile with `--files`', async () => { + const { err, stdout, stderr } = await exec(`"${BIN_PATH}" --files --project issue-986/tsconfig.json issue-986`) + expect(err).not.to.equal(null) + expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. + expect(stdout).to.equal('') }) }) if (semver.gte(ts.version, '2.7.0')) { - it('should locate tsconfig relative to entry-point by default', function (done) { - exec(`${BIN_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-a/) - - return done() - }) + it('should locate tsconfig relative to entry-point by default', async () => { + const { err, stdout } = await exec(`${BIN_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-a/) }) - it('should locate tsconfig relative to entry-point via ts-node-script', function (done) { - exec(`${BIN_SCRIPT_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-a/) - - return done() - }) + it('should locate tsconfig relative to entry-point via ts-node-script', async () => { + const { err, stdout } = await exec(`${BIN_SCRIPT_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-a/) }) - it('should locate tsconfig relative to entry-point with --script-mode', function (done) { - exec(`${BIN_PATH} --script-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-a/) - - return done() - }) + it('should locate tsconfig relative to entry-point with --script-mode', async () => { + const { err, stdout } = await exec(`${BIN_PATH} --script-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-a/) }) - it('should locate tsconfig relative to cwd via ts-node-cwd', function (done) { - exec(`${BIN_CWD_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-b/) - - return done() - }) + it('should locate tsconfig relative to cwd via ts-node-cwd', async () => { + const { err, stdout } = await exec(`${BIN_CWD_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-b/) }) - it('should locate tsconfig relative to cwd in --cwd-mode', function (done) { - exec(`${BIN_PATH} --cwd-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-b/) - - return done() - }) + it('should locate tsconfig relative to cwd in --cwd-mode', async () => { + const { err, stdout } = await exec(`${BIN_PATH} --cwd-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) + expect(err).to.equal(null) + expect(stdout).to.match(/plugin-b/) }) - it('should locate tsconfig relative to realpath, not symlink, when entrypoint is a symlink', function (done) { + it('should locate tsconfig relative to realpath, not symlink, when entrypoint is a symlink', async function () { if (lstatSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { - exec(`${BIN_PATH} main-realpath/symlink/symlink.tsx`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('') - - return done() - }) + const { err, stdout } = await exec(`${BIN_PATH} main-realpath/symlink/symlink.tsx`) + expect(err).to.equal(null) + expect(stdout).to.equal('') } else { this.skip() } }) } - describe('should read ts-node options from tsconfig.json', function () { + describe('should read ts-node options from tsconfig.json', () => { const BIN_EXEC = `"${BIN_PATH}" --project tsconfig-options/tsconfig.json` - it('should override compiler options from env', function (done) { - exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { + it('should override compiler options from env', async () => { + const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_COMPILER_OPTIONS: '{"typeRoots": ["env-typeroots"]}' } - }, function (err, stdout) { - expect(err).to.equal(null) - const { config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/env-typeroots').replace(/\\/g, '/')]) - return done() }) + expect(err).to.equal(null) + const { config } = JSON.parse(stdout) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/env-typeroots').replace(/\\/g, '/')]) }) - it('should use options from `tsconfig.json`', function (done) { - exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, function (err, stdout) { - expect(err).to.equal(null) - const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) - expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) - expect(options.pretty).to.equal(undefined) - expect(options.skipIgnore).to.equal(false) - expect(options.transpileOnly).to.equal(true) - expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) - return done() - }) + it('should use options from `tsconfig.json`', async () => { + const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`) + expect(err).to.equal(null) + const { options, config } = JSON.parse(stdout) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) + expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) + expect(options.pretty).to.equal(undefined) + expect(options.skipIgnore).to.equal(false) + expect(options.transpileOnly).to.equal(true) + expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) }) - it('should have flags override / merge with `tsconfig.json`', function (done) { - exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tsconfig-options/required2.js tsconfig-options/log-options2.js`, function (err, stdout) { - expect(err).to.equal(null) - const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) - expect(config.options.types).to.deep.equal(['flags-types']) - expect(options.pretty).to.equal(undefined) - expect(options.skipIgnore).to.equal(true) - expect(options.transpileOnly).to.equal(true) - expect(options.require).to.deep.equal([ - join(TEST_DIR, './tsconfig-options/required1.js'), - './tsconfig-options/required2.js' - ]) - return done() - }) + it('should have flags override / merge with `tsconfig.json`', async () => { + const { err, stdout } = await exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tsconfig-options/required2.js tsconfig-options/log-options2.js`) + expect(err).to.equal(null) + const { options, config } = JSON.parse(stdout) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) + expect(config.options.types).to.deep.equal(['flags-types']) + expect(options.pretty).to.equal(undefined) + expect(options.skipIgnore).to.equal(true) + expect(options.transpileOnly).to.equal(true) + expect(options.require).to.deep.equal([ + join(TEST_DIR, './tsconfig-options/required1.js'), + './tsconfig-options/required2.js' + ]) }) - it('should have `tsconfig.json` override environment', function (done) { - exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { + it('should have `tsconfig.json` override environment', async () => { + const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_PRETTY: 'true', TS_NODE_SKIP_IGNORE: 'true' } - }, function (err, stdout) { - expect(err).to.equal(null) - const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) - expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) - expect(options.pretty).to.equal(true) - expect(options.skipIgnore).to.equal(false) - expect(options.transpileOnly).to.equal(true) - expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) - return done() - }) - }) - }) - - describe('compiler host', function () { - it('should execute cli', function (done) { - exec(`${cmd} --compiler-host hello-world`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - - return done() }) + expect(err).to.equal(null) + const { options, config } = JSON.parse(stdout) + expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) + expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) + expect(options.pretty).to.equal(true) + expect(options.skipIgnore).to.equal(false) + expect(options.transpileOnly).to.equal(true) + expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) }) }) - it('should transpile files inside a node_modules directory when not ignored', function (done) { - exec(`${cmdNoProject} from-node-modules/from-node-modules`, function (err, stdout, stderr) { - if (err) return done(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) - expect(JSON.parse(stdout)).to.deep.equal({ - external: { - tsmri: { name: 'typescript-module-required-internally' }, - jsmri: { name: 'javascript-module-required-internally' }, - tsmii: { name: 'typescript-module-imported-internally' }, - jsmii: { name: 'javascript-module-imported-internally' } - }, - tsmie: { name: 'typescript-module-imported-externally' }, - jsmie: { name: 'javascript-module-imported-externally' }, - tsmre: { name: 'typescript-module-required-externally' }, - jsmre: { name: 'javascript-module-required-externally' } - }) - done() + describe('compiler host', () => { + it('should execute cli', async () => { + const { err, stdout } = await exec(`${cmd} --compiler-host hello-world`) + expect(err).to.equal(null) + expect(stdout).to.equal('Hello, world!\n') }) }) - describe('should respect maxNodeModulesJsDepth', function () { - it('for unscoped modules', function (done) { - exec(`${cmdNoProject} maxnodemodulesjsdepth`, function (err, stdout, stderr) { - expect(err).to.not.equal(null) - expect(stderr.replace(/\r\n/g, '\n')).to.contain( - 'TSError: ⨯ Unable to compile TypeScript:\n' + - "maxnodemodulesjsdepth/other.ts(4,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + - '\n' - ) - done() - }) + it('should transpile files inside a node_modules directory when not ignored', async () => { + const { err, stdout, stderr } = await exec(`${cmdNoProject} from-node-modules/from-node-modules`) + if (err) throw new Error(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) + expect(JSON.parse(stdout)).to.deep.equal({ + external: { + tsmri: { name: 'typescript-module-required-internally' }, + jsmri: { name: 'javascript-module-required-internally' }, + tsmii: { name: 'typescript-module-imported-internally' }, + jsmii: { name: 'javascript-module-imported-internally' } + }, + tsmie: { name: 'typescript-module-imported-externally' }, + jsmie: { name: 'javascript-module-imported-externally' }, + tsmre: { name: 'typescript-module-required-externally' }, + jsmre: { name: 'javascript-module-required-externally' } + }) + }) + + describe('should respect maxNodeModulesJsDepth', () => { + it('for unscoped modules', async () => { + const { err, stdout, stderr } = await exec(`${cmdNoProject} maxnodemodulesjsdepth`) + expect(err).to.not.equal(null) + expect(stderr.replace(/\r\n/g, '\n')).to.contain( + 'TSError: ⨯ Unable to compile TypeScript:\n' + + "maxnodemodulesjsdepth/other.ts(4,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + + '\n' + ) }) - it('for @scoped modules', function (done) { - exec(`${cmdNoProject} maxnodemodulesjsdepth-scoped`, function (err, stdout, stderr) { - expect(err).to.not.equal(null) - expect(stderr.replace(/\r\n/g, '\n')).to.contain( - 'TSError: ⨯ Unable to compile TypeScript:\n' + - "maxnodemodulesjsdepth-scoped/other.ts(7,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + - '\n' - ) - done() - }) + it('for @scoped modules', async () => { + const { err, stdout, stderr } = await exec(`${cmdNoProject} maxnodemodulesjsdepth-scoped`) + expect(err).to.not.equal(null) + expect(stderr.replace(/\r\n/g, '\n')).to.contain( + 'TSError: ⨯ Unable to compile TypeScript:\n' + + "maxnodemodulesjsdepth-scoped/other.ts(7,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + + '\n' + ) }) }) }) - describe('register', function () { + describe('register', () => { let registered: tsNodeTypes.Service let moduleTestPath: string before(() => { @@ -736,13 +600,13 @@ describe('ts-node', function () { registered.enabled(true) }) - it('should be able to require typescript', function () { + it('should be able to require typescript', () => { const m = require(moduleTestPath) expect(m.example('foo')).to.equal('FOO') }) - it('should support dynamically disabling', function () { + it('should support dynamically disabling', () => { delete require.cache[moduleTestPath] expect(registered.enabled(false)).to.equal(false) @@ -765,7 +629,7 @@ describe('ts-node', function () { }) if (semver.gte(ts.version, '2.7.0')) { - it('should support compiler scopes', function () { + it('should support compiler scopes', () => { const calls: string[] = [] registered.enabled(false) @@ -802,13 +666,13 @@ describe('ts-node', function () { }) } - it('should compile through js and ts', function () { + it('should compile through js and ts', () => { const m = require('../tests/complex') expect(m.example()).to.equal('example') }) - it('should work with proxyquire', function () { + it('should work with proxyquire', () => { const m = proxyquire('../tests/complex', { './example': 'hello' }) @@ -816,13 +680,13 @@ describe('ts-node', function () { expect(m.example()).to.equal('hello') }) - it('should work with `require.cache`', function () { + it('should work with `require.cache`', () => { const { example1, example2 } = require('../tests/require-cache') expect(example1).to.not.equal(example2) }) - it('should use source maps', function (done) { + it('should use source maps', async () => { try { require('../tests/throw') } catch (error) { @@ -830,8 +694,6 @@ describe('ts-node', function () { 'Error: this is a demo', ` at Foo.bar (${join(TEST_DIR, './throw.ts')}:100:18)` ].join('\n')) - - done() } }) @@ -839,7 +701,7 @@ describe('ts-node', function () { let old: (m: Module, filename: string) => any let compiled: string - before(function () { + before(() => { old = require.extensions['.tsx']! // tslint:disable-line require.extensions['.tsx'] = (m: any, fileName) => { // tslint:disable-line const _compile = m._compile @@ -853,11 +715,11 @@ describe('ts-node', function () { } }) - after(function () { + after(() => { require.extensions['.tsx'] = old // tslint:disable-line }) - it('should use source maps', function (done) { + it('should use source maps', async () => { try { require('../tests/with-jsx.tsx') } catch (error) { @@ -865,8 +727,6 @@ describe('ts-node', function () { } expect(compiled).to.match(SOURCE_MAP_REGEXP) - - done() }) }) }) @@ -909,7 +769,7 @@ describe('ts-node', function () { } it('correctly filters file extensions from the compiler when allowJs=false and jsx=false', () => { - const { ignored } = create({ compilerOptions: { }, skipProject: true }) + const { ignored } = create({ compilerOptions: {}, skipProject: true }) testIgnored(ignored, ['.ts', '.d.ts'], ['.js', '.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) }) it('correctly filters file extensions from the compiler when allowJs=true and jsx=false', () => { @@ -932,121 +792,89 @@ describe('ts-node', function () { const cmd = `node --loader ts-node/esm` if (semver.gte(process.version, '13.0.0')) { - it('should compile and execute as ESM', (done) => { - exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - - return done() - }) + it('should compile and execute as ESM', async () => { + const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm') }) + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff libfoo\n') }) - it('should use source maps', function (done) { - exec(`${cmd} throw.ts`, { cwd: join(TEST_DIR, './esm') }, function (err, stdout) { - expect(err).not.to.equal(null) - expect(err!.message).to.contain([ - `${pathToFileURL(join(TEST_DIR, './esm/throw.ts'))}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^', - 'Error: this is a demo' - ].join('\n')) - - return done() - }) + it('should use source maps', async () => { + const { err, stdout } = await exec(`${cmd} throw.ts`, { cwd: join(TEST_DIR, './esm') }) + expect(err).not.to.equal(null) + expect(err!.message).to.contain([ + `${pathToFileURL(join(TEST_DIR, './esm/throw.ts'))}:100`, + ' bar () { throw new Error(\'this is a demo\') }', + ' ^', + 'Error: this is a demo' + ].join('\n')) }) describe('supports experimental-specifier-resolution=node', () => { - it('via --experimental-specifier-resolution', (done) => { - exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - - return done() - }) + it('via --experimental-specifier-resolution', async () => { + const { err, stdout } = await exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }) + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff libfoo\n') }) - it('via --es-module-specifier-resolution alias', (done) => { - exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - - return done() - }) + it('via --es-module-specifier-resolution alias', async () => { + const { err, stdout } = await exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }) + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff libfoo\n') }) - it('via NODE_OPTIONS', (done) => { - exec(`${cmd} index.ts`, { + it('via NODE_OPTIONS', async () => { + const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver'), env: { ...process.env, NODE_OPTIONS: '--experimental-specifier-resolution=node' } - }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - - return done() }) + expect(err).to.equal(null) + expect(stdout).to.equal('foo bar baz biff libfoo\n') }) }) - it('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', function (done) { - exec(`${cmd} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }, function (err, stdout, stderr) { - expect(err).to.not.equal(null) - expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') - - return done() - }) + it('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', async () => { + const { err, stdout, stderr } = await exec(`${cmd} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) + expect(err).to.not.equal(null) + expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') }) - it('defers to fallback loaders when URL should not be handled by ts-node', function (done) { - exec(`${cmd} index.mjs`, { + it('defers to fallback loaders when URL should not be handled by ts-node', async () => { + const { err, stdout, stderr } = await exec(`${cmd} index.mjs`, { cwd: join(TEST_DIR, './esm-import-http-url') - }, function (err, stdout, stderr) { - expect(err).to.not.equal(null) - // expect error from node's default resolver - expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*(?:\n.*){0,1}\n *at defaultResolve/) - return done() }) + expect(err).to.not.equal(null) + // expect error from node's default resolver + expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*(?:\n.*){0,1}\n *at defaultResolve/) }) - it('should bypass import cache when changing search params', (done) => { - exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-import-cache') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('log1\nlog2\nlog2\n') - - return done() - }) + it('should bypass import cache when changing search params', async () => { + const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-import-cache') }) + expect(err).to.equal(null) + expect(stdout).to.equal('log1\nlog2\nlog2\n') }) - it('should support transpile only mode via dedicated loader entrypoint', (done) => { - exec(`${cmd}/transpile-only index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('') - - return done() - }) + it('should support transpile only mode via dedicated loader entrypoint', async () => { + const { err, stdout } = await exec(`${cmd}/transpile-only index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }) + expect(err).to.equal(null) + expect(stdout).to.equal('') }) - it('should throw type errors without transpile-only enabled', (done) => { - exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }, function (err, stdout) { - if (err === null) { - return done('Command was expected to fail, but it succeeded.') - } - - expect(err.message).to.contain('Unable to compile TypeScript') - expect(err.message).to.match(new RegExp('TS2345: Argument of type \'(?:number|1101)\' is not assignable to parameter of type \'string\'\\.')) - expect(err.message).to.match(new RegExp('TS2322: Type \'(?:"hello world"|string)\' is not assignable to type \'number\'\\.')) - expect(stdout).to.equal('') + it('should throw type errors without transpile-only enabled', async () => { + const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }) + if (err === null) { + throw new Error('Command was expected to fail, but it succeeded.') + } - return done() - }) + expect(err.message).to.contain('Unable to compile TypeScript') + expect(err.message).to.match(new RegExp('TS2345: Argument of type \'(?:number|1101)\' is not assignable to parameter of type \'string\'\\.')) + expect(err.message).to.match(new RegExp('TS2322: Type \'(?:"hello world"|string)\' is not assignable to type \'number\'\\.')) + expect(stdout).to.equal('') }) } - it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', function (done) { - exec(`${BIN_PATH} ./esm-err-require-esm/index.js`, function (err, stdout) { - expect(err).to.equal(null) - expect(stdout).to.equal('CommonJS\n') - - return done() - }) + it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', async () => { + const { err, stdout } = await exec(`${BIN_PATH} ./esm-err-require-esm/index.js`) + expect(err).to.equal(null) + expect(stdout).to.equal('CommonJS\n') }) }) }) From f6ed08cbba6c2963c52662f23b7694394b399769 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 22 Feb 2021 08:46:06 -0500 Subject: [PATCH 103/113] Switch from mocha to ava to make tests faster (#1230) * WIP switching to ava * more WIP * increase timeout to hopefully pass on gh actions * Limit test concurrency * other test speed improvements * skip rerunning npm scripts when packing tarball for tests * test fixes * fix tests * fix tests * cleanup * cleanup * cleanup --- .gitignore | 1 + .mocharc.js | 3 - package-lock.json | 2650 ++++++++++++++++++++++++++++++++---- package.json | 25 +- scripts/build-pack.js | 2 +- src/index.spec.ts | 257 ++-- src/index.ts | 1 + src/testlib.ts | 167 +++ tests/env.ts | 2 +- tests/tsconfig.json | 1 + tsconfig.build-schema.json | 6 + tsconfig.json | 6 +- 12 files changed, 2694 insertions(+), 427 deletions(-) delete mode 100644 .mocharc.js create mode 100644 src/testlib.ts create mode 100644 tsconfig.build-schema.json diff --git a/.gitignore b/.gitignore index 600675c4f..65b40f90d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ tsconfig.schemastore-schema.json .idea/ /.vscode/ /website/static/api +/tsconfig.tsbuildinfo diff --git a/.mocharc.js b/.mocharc.js deleted file mode 100644 index 089a7cfd0..000000000 --- a/.mocharc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - spec: ['dist/**/*.spec.js'] -}; diff --git a/package-lock.json b/package-lock.json index 9d3d84035..b9a603a99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -282,6 +282,23 @@ } } }, + "@concordance/react": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", + "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", + "dev": true, + "requires": { + "arrify": "^1.0.1" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", @@ -336,6 +353,47 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, "@types/chai": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.10.tgz", @@ -389,18 +447,18 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, - "@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha1-MV1XDMtWxTRS/4Y4c432BybVtuo=", - "dev": true - }, "@types/node": { "version": "13.13.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, "@types/proxyquire": { "version": "1.3.28", "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", @@ -441,6 +499,18 @@ "@types/node": "*" } }, + "acorn": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", + "dev": true + }, + "acorn-walk": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.2.tgz", + "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A==", + "dev": true + }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -451,17 +521,42 @@ "indent-string": "^4.0.0" } }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { + "ansi-align": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } }, "ansi-styles": { "version": "3.2.1", @@ -472,6 +567,16 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", @@ -501,18 +606,317 @@ "sprintf-js": "~1.0.2" } }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, "assertion-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, + "ava": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-3.15.0.tgz", + "integrity": "sha512-HGAnk1SHPk4Sx6plFAUkzV/XC1j9+iQhOzt4vBly18/yo0AV8Oytx7mtJd/CR8igCJ5p160N/Oo/cNJi2uSeWA==", + "dev": true, + "requires": { + "@concordance/react": "^2.0.0", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "ansi-styles": "^5.0.0", + "arrgv": "^1.0.2", + "arrify": "^2.0.1", + "callsites": "^3.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.4.3", + "chunkd": "^2.0.1", + "ci-info": "^2.0.0", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "code-excerpt": "^3.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.1", + "convert-source-map": "^1.7.0", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.1", + "del": "^6.0.0", + "emittery": "^0.8.0", + "equal-length": "^1.0.0", + "figures": "^3.2.0", + "globby": "^11.0.1", + "ignore-by-default": "^2.0.0", + "import-local": "^3.0.2", + "indent-string": "^4.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "lodash": "^4.17.20", + "matcher": "^3.0.0", + "md5-hex": "^3.0.1", + "mem": "^8.0.0", + "ms": "^2.1.3", + "ora": "^5.2.0", + "p-event": "^4.2.0", + "p-map": "^4.0.0", + "picomatch": "^2.2.2", + "pkg-conf": "^3.1.0", + "plur": "^4.0.0", + "pretty-ms": "^7.0.1", + "read-pkg": "^5.2.0", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "source-map-support": "^0.5.19", + "stack-utils": "^2.0.3", + "strip-ansi": "^6.0.0", + "supertap": "^2.0.0", + "temp-dir": "^2.0.0", + "trim-off-newlines": "^1.0.1", + "update-notifier": "^5.0.1", + "write-file-atomic": "^3.0.3", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.1.0.tgz", + "integrity": "sha512-osxifZo3ar56+e8tdYreU6p8FZGciBHo5O0JoDAxMUqZuyNUb+yHEwYtJZ+Z32R459jEgtwVf1u8D7qYwU0l6w==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + } + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + } + } + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.5.tgz", + "integrity": "sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg==", + "dev": true + } + } + }, "axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -528,6 +932,171 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "blueimp-md5": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", + "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==", + "dev": true + }, + "boxen": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.0.tgz", + "integrity": "sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.0", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -538,11 +1107,24 @@ "concat-map": "0.0.1" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, "buffer-from": { "version": "1.1.1", @@ -555,6 +1137,38 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -567,6 +1181,12 @@ "write-file-atomic": "^3.0.0" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -615,12 +1235,123 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", + "dev": true + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -660,6 +1391,30 @@ } } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-excerpt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", + "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "dev": true, + "requires": { + "convert-to-spaces": "^1.0.1" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -687,6 +1442,12 @@ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -699,6 +1460,62 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concordance": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.2.tgz", + "integrity": "sha512-hC63FKdGM9tBcd4VQIa+LQjmrgorrnxESb8B3J21Qe/FzL0blBv0pb8iNyymt+bmsvGSUqO0uhPi2ZSLgLtLdg==", + "dev": true, + "requires": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -708,6 +1525,12 @@ "safe-buffer": "~5.1.1" } }, + "convert-to-spaces": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", + "dev": true + }, "create-require": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.0.tgz", @@ -735,13 +1558,28 @@ } } }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", "dev": true, "requires": { - "ms": "^2.1.1" + "time-zone": "^1.0.0" } }, "decamelize": { @@ -750,6 +1588,15 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -759,6 +1606,12 @@ "type-detect": "^4.0.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", @@ -768,6 +1621,21 @@ "strip-bom": "^4.0.0" } }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -777,11 +1645,56 @@ "object-keys": "^1.0.12" } }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "diff": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "doctrine": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", @@ -800,12 +1713,57 @@ } } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", "dev": true }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "equal-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", + "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", @@ -842,12 +1800,74 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fastq": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", + "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -858,6 +1878,15 @@ "merge-descriptors": "~1.0.0" } }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -878,15 +1907,6 @@ "locate-path": "^3.0.0" } }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, "follow-redirects": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", @@ -927,6 +1947,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -971,24 +1998,80 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "handlebars": { "version": "4.7.6", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", @@ -1023,6 +2106,12 @@ "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", "dev": true }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, "hasha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", @@ -1041,10 +2130,10 @@ } } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "html-escaper": { @@ -1053,6 +2142,46 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ignore-by-default": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.0.0.tgz", + "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA==", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -1081,42 +2210,160 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "irregular-plurals": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz", + "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "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==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", "dev": true }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", "dev": true }, + "is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -1147,6 +2394,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -1269,6 +2522,12 @@ "istanbul-lib-report": "^3.0.0" } }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1299,6 +2558,24 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", @@ -1341,6 +2618,57 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -1363,15 +2691,6 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -1381,6 +2700,12 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -1418,18 +2743,99 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=" }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "marked": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz", "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==", "dev": true }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "requires": { + "escape-string-regexp": "^4.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + } + } + }, + "md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "requires": { + "blueimp-md5": "^2.10.0" + } + }, + "mem": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz", + "integrity": "sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1462,54 +2868,6 @@ } } }, - "mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", @@ -1528,16 +2886,37 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" }, "dependencies": { + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1546,14 +2925,17 @@ } } }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true }, "ntypescript": { "version": "1.201706190042.1", @@ -1734,88 +3116,215 @@ "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + } + }, + "ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" } }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "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==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "has-flag": "^4.0.0" } } } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", "dev": true, "requires": { - "wrappy": "1" + "p-timeout": "^3.1.0" } }, - "onigasm": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", - "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", - "dev": true, - "requires": { - "lru-cache": "^5.1.1" - } + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "p-limit": { "version": "2.2.2", @@ -1844,6 +3353,15 @@ "aggregate-error": "^3.0.0" } }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -1862,6 +3380,42 @@ "release-zalgo": "^1.0.0" } }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -1886,12 +3440,40 @@ "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + } + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -1937,6 +3519,30 @@ } } }, + "plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "dev": true, + "requires": { + "irregular-plurals": "^3.2.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "requires": { + "parse-ms": "^2.1.0" + } + }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -1974,6 +3580,51 @@ "resolve": "~1.1.7" } }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "queue-microtask": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", + "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } + } + }, "react": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", @@ -1991,6 +3642,58 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -2000,6 +3703,24 @@ "resolve": "^1.1.6" } }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -2027,12 +3748,46 @@ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", @@ -2058,6 +3813,15 @@ } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2070,6 +3834,40 @@ "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + } + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -2112,12 +3910,61 @@ "vscode-textmate": "^5.2.0" } }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2157,20 +4004,59 @@ } } }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } } }, "string.prototype.trimleft": { @@ -2193,13 +4079,21 @@ "function-bind": "^1.1.1" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "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==", + "dev": true + } } }, "strip-bom": { @@ -2214,15 +4108,52 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "supertap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-2.0.0.tgz", + "integrity": "sha512-jRzcXlCeDYvKoZGA5oRhYyR3jUIYu0enkSxtmAgHRlD7HwrovTpH4bDSi0py9FtuA8si9cW/fKommJHuaoDHJA==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "arrify": "^2.0.1", + "indent-string": "^4.0.0", + "js-yaml": "^3.14.0", + "serialize-error": "^7.0.1", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -2250,12 +4181,45 @@ } } }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -2517,12 +4481,133 @@ "dev": true, "optional": true }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", @@ -2541,34 +4626,90 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vscode-textmate": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", "dev": true }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "dev": true, "requires": { - "isexe": "^2.0.0" + "defaults": "^1.0.3" } }, + "well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "wordwrap": { @@ -2634,6 +4775,12 @@ "typedarray-to-buffer": "^3.1.5" } }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", @@ -2646,73 +4793,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 866591fe1..8ef5d1902 100644 --- a/package.json +++ b/package.json @@ -45,17 +45,19 @@ "scripts": { "lint": "tslint \"src/**/*.ts\" --project tsconfig.json", "lint-fix": "tslint \"src/**/*.ts\" --project tsconfig.json --fix", - "clean": "rimraf dist && rimraf tsconfig.schema.json && rimraf tsconfig.schemastore-schema.json && rimraf tests/ts-node-packed.tgz", + "clean": "rimraf dist tsconfig.schema.json tsconfig.schemastore-schema.json tsconfig.tsbuildinfo tests/ts-node-packed.tgz", + "rebuild": "npm run clean && npm run build", "build": "npm run build-nopack && npm run build-pack", - "build-nopack": "npm run clean && npm run build-tsc && npm run build-configSchema", + "build-nopack": "npm run build-tsc && npm run build-configSchema", "build-tsc": "tsc", - "build-configSchema": "typescript-json-schema --topRef --refs --validationKeywords allOf --out tsconfig.schema.json tsconfig.json TsConfigSchema && node --require ./register ./scripts/create-merged-schema", + "build-configSchema": "typescript-json-schema --topRef --refs --validationKeywords allOf --out tsconfig.schema.json tsconfig.build-schema.json TsConfigSchema && node --require ./register ./scripts/create-merged-schema", "build-pack": "node ./scripts/build-pack.js", - "test-spec": "mocha dist/**/*.spec.js -R spec --bail", - "test-cov": "nyc mocha -- \"dist/**/*.spec.js\" -R spec --bail", + "test-spec": "ava", + "test-cov": "nyc ava", "test": "npm run build && npm run lint && npm run test-cov --", + "test-local": "npm run lint && npm run build-tsc && npm run build-pack && npm run test-spec --", "coverage-report": "nyc report --reporter=lcov", - "prepare": "npm run build-nopack" + "prepare": "npm run clean && npm run build-nopack" }, "engines": { "node": ">=10.0.0" @@ -89,28 +91,35 @@ "url": "https://github.com/TypeStrong/ts-node/issues" }, "homepage": "https://github.com/TypeStrong/ts-node", + "ava": { + "files": [ + "dist/*.spec.js" + ], + "failWithoutAssertions": false, + "timeout": "300s" + }, "devDependencies": { "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", "@types/lodash": "^4.14.151", - "@types/mocha": "^5.2.7", "@types/node": "13.13.5", "@types/proxyquire": "^1.3.28", "@types/react": "^16.0.2", "@types/rimraf": "^3.0.0", "@types/semver": "^7.1.0", "@types/source-map-support": "^0.5.0", + "ava": "^3.15.0", "axios": "^0.21.1", "chai": "^4.0.1", "get-stream": "^6.0.0", "lodash": "^4.17.15", - "mocha": "^6.2.3", "ntypescript": "^1.201507091536.1", "nyc": "^15.0.1", "proxyquire": "^2.0.0", "react": "^16.14.0", "rimraf": "^3.0.0", "semver": "^7.1.3", + "throat": "^6.0.1", "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", "typedoc": "^0.20.20", diff --git a/scripts/build-pack.js b/scripts/build-pack.js index 38811e99c..d914a1af1 100644 --- a/scripts/build-pack.js +++ b/scripts/build-pack.js @@ -8,7 +8,7 @@ const { join } = require('path') const testDir = join(__dirname, '../tests') const tarballPath = join(testDir, 'ts-node-packed.tgz') const tempDir = mkdtempSync(join(testDir, 'tmp')) -exec(`npm pack "${join(__dirname, '..')}"`, { cwd: tempDir }, (err, stdout) => { +exec(`npm pack --ignore-scripts "${join(__dirname, '..')}"`, { cwd: tempDir }, (err, stdout) => { if (err) { console.error(err) process.exit(1) diff --git a/src/index.spec.ts b/src/index.spec.ts index a2d02f0fd..553d99b94 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,3 +1,4 @@ +import { test, TestInterface } from './testlib' import { expect } from 'chai' import { ChildProcess, exec as childProcessExec, ExecException, ExecOptions } from 'child_process' import { join } from 'path' @@ -14,6 +15,7 @@ import { pathToFileURL } from 'url' import Module = require('module') import { PassThrough } from 'stream' import * as getStream from 'get-stream' +import { once } from 'lodash' type TestExecReturn = { stdout: string, stderr: string, err: null | ExecException } function exec (cmd: string, opts: ExecOptions = {}): Promise & { child: ChildProcess } { @@ -48,8 +50,7 @@ const testsDirRequire = createRequire(join(TEST_DIR, 'index.js')) // tslint:disa let { register, create, VERSION, createRepl }: typeof tsNodeTypes = {} as any // Pack and install ts-node locally, necessary to test package "exports" -before(async function () { - this.timeout(5 * 60e3) +test.beforeAll(async () => { rimrafSync(join(TEST_DIR, 'node_modules')) await promisify(childProcessExec)(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') @@ -57,16 +58,14 @@ before(async function () { ; ({ register, create, VERSION, createRepl } = testsDirRequire('ts-node')) }) -describe('ts-node', function () { +test.suite('ts-node', (test) => { const cmd = `"${BIN_PATH}" --project "${PROJECT}"` const cmdNoProject = `"${BIN_PATH}"` - this.timeout(10000) - - it('should export the correct version', () => { + test('should export the correct version', () => { expect(VERSION).to.equal(require('../package.json').version) }) - it('should export all CJS entrypoints', () => { + test('should export all CJS entrypoints', () => { // Ensure our package.json "exports" declaration allows `require()`ing all our entrypoints // https://github.com/TypeStrong/ts-node/pull/1026 @@ -99,26 +98,24 @@ describe('ts-node', function () { testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') }) - describe('cli', () => { - this.slow(1000) - - it('should execute cli', async () => { + test.suite('cli', (test) => { + test('should execute cli', async () => { const { err, stdout } = await exec(`${cmd} hello-world`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') }) - it('shows usage via --help', async () => { + test('shows usage via --help', async () => { const { err, stdout } = await exec(`${cmdNoProject} --help`) expect(err).to.equal(null) expect(stdout).to.match(/Usage: ts-node /) }) - it('shows version via -v', async () => { + test('shows version via -v', async () => { const { err, stdout } = await exec(`${cmdNoProject} -v`) expect(err).to.equal(null) expect(stdout.trim()).to.equal('v' + testsDirRequire('ts-node/package').version) }) - it('shows version of compiler via -vv', async () => { + test('shows version of compiler via -vv', async () => { const { err, stdout } = await exec(`${cmdNoProject} -vv`) expect(err).to.equal(null) expect(stdout.trim()).to.equal( @@ -128,7 +125,7 @@ describe('ts-node', function () { ) }) - it('should register via cli', async () => { + test('should register via cli', async () => { const { err, stdout } = await exec(`node -r ts-node/register hello-world.ts`, { cwd: TEST_DIR }) @@ -136,25 +133,25 @@ describe('ts-node', function () { expect(stdout).to.equal('Hello, world!\n') }) - it('should execute cli with absolute path', async () => { + test('should execute cli with absolute path', async () => { const { err, stdout } = await exec(`${cmd} "${join(TEST_DIR, 'hello-world')}"`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') }) - it('should print scripts', async () => { + test('should print scripts', async () => { const { err, stdout } = await exec(`${cmd} -pe "import { example } from './complex/index';example()"`) expect(err).to.equal(null) expect(stdout).to.equal('example\n') }) - it('should provide registered information globally', async () => { + test('should provide registered information globally', async () => { const { err, stdout } = await exec(`${cmd} env`) expect(err).to.equal(null) expect(stdout).to.equal('object\n') }) - it('should provide registered information on register', async () => { + test('should provide registered information on register', async () => { const { err, stdout } = await exec(`node -r ts-node/register env.ts`, { cwd: TEST_DIR }) @@ -163,7 +160,7 @@ describe('ts-node', function () { }) if (semver.gte(ts.version, '1.8.0')) { - it('should allow js', async () => { + test('should allow js', async () => { const { err, stdout } = await exec( [ cmd, @@ -175,7 +172,7 @@ describe('ts-node', function () { } ) - it('should include jsx when `allow-js` true', async () => { + test('should include jsx when `allow-js` true', async () => { const { err, stdout } = await exec( [ cmd, @@ -187,20 +184,20 @@ describe('ts-node', function () { }) } - it('should eval code', async () => { + test('should eval code', async () => { const { err, stdout } = await exec( `${cmd} -e "import * as m from './module';console.log(m.example('test'))"`) expect(err).to.equal(null) expect(stdout).to.equal('TEST\n') }) - it('should import empty files', async () => { + test('should import empty files', async () => { const { err, stdout } = await exec(`${cmd} -e "import './empty'"`) expect(err).to.equal(null) expect(stdout).to.equal('') }) - it('should throw errors', async () => { + test('should throw errors', async () => { const { err } = await exec(`${cmd} -e "import * as m from './module';console.log(m.example(123))"`) if (err === null) { throw new Error('Command was expected to fail, but it succeeded.') @@ -212,7 +209,7 @@ describe('ts-node', function () { )) }) - it('should be able to ignore diagnostic', async () => { + test('should be able to ignore diagnostic', async () => { const { err } = await exec( `${cmd} --ignore-diagnostics 2345 -e "import * as m from './module';console.log(m.example(123))"`) if (err === null) { @@ -224,7 +221,7 @@ describe('ts-node', function () { ) }) - it('should work with source maps', async () => { + test('should work with source maps', async () => { const { err } = await exec(`${cmd} throw`) if (err === null) { throw new Error('Command was expected to fail, but it succeeded.') @@ -238,7 +235,7 @@ describe('ts-node', function () { ].join('\n')) }) - it('eval should work with source maps', async () => { + test('eval should work with source maps', async () => { const { err } = await exec(`${cmd} -pe "import './throw'"`) if (err === null) { throw new Error('Command was expected to fail, but it succeeded.') @@ -251,7 +248,7 @@ describe('ts-node', function () { ].join('\n')) }) - it('should support transpile only mode', async () => { + test('should support transpile only mode', async () => { const { err } = await exec(`${cmd} --transpile-only -pe "x"`) if (err === null) { throw new Error('Command was expected to fail, but it succeeded.') @@ -260,7 +257,7 @@ describe('ts-node', function () { expect(err.message).to.contain('ReferenceError: x is not defined') }) - it('should throw error even in transpileOnly mode', async () => { + test('should throw error even in transpileOnly mode', async () => { const { err } = await exec(`${cmd} --transpile-only -pe "console."`) if (err === null) { throw new Error('Command was expected to fail, but it succeeded.') @@ -269,7 +266,7 @@ describe('ts-node', function () { expect(err.message).to.contain('error TS1003: Identifier expected') }) - it('should pipe into `ts-node` and evaluate', async () => { + test('should pipe into `ts-node` and evaluate', async () => { const execPromise = exec(cmd) execPromise.child.stdin!.end("console.log('hello')") const { err, stdout } = await execPromise @@ -277,7 +274,7 @@ describe('ts-node', function () { expect(stdout).to.equal('hello\n') }) - it('should pipe into `ts-node`', async () => { + test('should pipe into `ts-node`', async () => { const execPromise = exec(`${cmd} -p`) execPromise.child.stdin!.end('true') const { err, stdout } = await execPromise @@ -286,7 +283,7 @@ describe('ts-node', function () { }) - it('should pipe into an eval script', async () => { + test('should pipe into an eval script', async () => { const execPromise = exec(`${cmd} --transpile-only -pe "process.stdin.isTTY"`) execPromise.child.stdin!.end('true') const { err, stdout } = await execPromise @@ -295,7 +292,7 @@ describe('ts-node', function () { }) - it('should run REPL when --interactive passed and stdin is not a TTY', async () => { + test('should run REPL when --interactive passed and stdin is not a TTY', async () => { const execPromise = exec(`${cmd} --interactive`) execPromise.child.stdin!.end('console.log("123")\n') const { err, stdout } = await execPromise @@ -308,20 +305,21 @@ describe('ts-node', function () { }) - it('REPL has command to get type information', async () => { + test('REPL has command to get type information', async () => { const execPromise = exec(`${cmd} --interactive`) execPromise.child.stdin!.end('\nconst a = 123\n.type a') const { err, stdout } = await execPromise expect(err).to.equal(null) expect(stdout).to.equal( - '> undefined\n' + + '> \'use strict\'\n' + '> undefined\n' + '> const a: 123\n' + '> ' ) }) - it('REPL can be created via API', async () => { + // Serial because it's timing-sensitive + test.serial('REPL can be created via API', async () => { const stdin = new PassThrough() const stdout = new PassThrough() const stderr = new PassThrough() @@ -330,7 +328,10 @@ describe('ts-node', function () { stdout, stderr }) - const service = create(replService.evalAwarePartialHost) + const service = create({ + ...replService.evalAwarePartialHost, + project: `${ TEST_DIR }/tsconfig.json` + }) replService.setService(service) replService.start() stdin.write('\nconst a = 123\n.type a\n') @@ -347,19 +348,19 @@ describe('ts-node', function () { ) }) - it('should support require flags', async () => { + test('should support require flags', async () => { const { err, stdout } = await exec(`${cmd} -r ./hello-world -pe "console.log('success')"`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n') }) - it('should support require from node modules', async () => { + test('should support require from node modules', async () => { const { err, stdout } = await exec(`${cmd} -r typescript -e "console.log('success')"`) expect(err).to.equal(null) expect(stdout).to.equal('success\n') }) - it('should use source maps with react tsx', async () => { + test('should use source maps with react tsx', async () => { const { err, stdout } = await exec(`${cmd} throw-react-tsx.tsx`) expect(err).not.to.equal(null) expect(err!.message).to.contain([ @@ -370,48 +371,49 @@ describe('ts-node', function () { ].join('\n')) }) - it('should allow custom typings', async () => { + test('should allow custom typings', async () => { const { err, stdout } = await exec(`${cmd} custom-types`) expect(err).to.match(/Error: Cannot find module 'does-not-exist'/) }) - it('should preserve `ts-node` context with child process', async () => { + test('should preserve `ts-node` context with child process', async () => { const { err, stdout } = await exec(`${cmd} child-process`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') }) - it('should import js before ts by default', async () => { + test('should import js before ts by default', async () => { const { err, stdout } = await exec(`${cmd} import-order/compiled`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, JavaScript!\n') }) const preferTsExtsEntrypoint = semver.gte(process.version, '12.0.0') ? 'import-order/compiled' : 'import-order/require-compiled' - it('should import ts before js when --prefer-ts-exts flag is present', async () => { + test('should import ts before js when --prefer-ts-exts flag is present', async () => { const { err, stdout } = await exec(`${cmd} --prefer-ts-exts ${preferTsExtsEntrypoint}`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') }) - it('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', async () => { + test('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', async () => { const { err, stdout } = await exec(`${cmd} ${preferTsExtsEntrypoint}`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }) expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') }) - it('should ignore .d.ts files', async () => { + test('should ignore .d.ts files', async () => { const { err, stdout } = await exec(`${cmd} import-order/importer`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, World!\n') }) - describe('issue #884', () => { - it('should compile', async function () { + test.suite('issue #884', (test) => { + test('should compile', async (t) => { // TODO disabled because it consistently fails on Windows on TS 2.7 if (process.platform === 'win32' && semver.satisfies(ts.version, '2.7')) { - this.skip() + t.log('Skipping') + return } else { const { err, stdout } = await exec(`"${BIN_PATH}" --project issue-884/tsconfig.json issue-884`) expect(err).to.equal(null) @@ -420,15 +422,15 @@ describe('ts-node', function () { }) }) - describe('issue #986', () => { - it('should not compile', async () => { + test.suite('issue #986', (test) => { + test('should not compile', async () => { const { err, stdout, stderr } = await exec(`"${BIN_PATH}" --project issue-986/tsconfig.json issue-986`) expect(err).not.to.equal(null) expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. expect(stdout).to.equal('') }) - it('should compile with `--files`', async () => { + test('should compile with `--files`', async () => { const { err, stdout, stderr } = await exec(`"${BIN_PATH}" --files --project issue-986/tsconfig.json issue-986`) expect(err).not.to.equal(null) expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. @@ -437,46 +439,47 @@ describe('ts-node', function () { }) if (semver.gte(ts.version, '2.7.0')) { - it('should locate tsconfig relative to entry-point by default', async () => { + test('should locate tsconfig relative to entry-point by default', async () => { const { err, stdout } = await exec(`${BIN_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) expect(err).to.equal(null) expect(stdout).to.match(/plugin-a/) }) - it('should locate tsconfig relative to entry-point via ts-node-script', async () => { + test('should locate tsconfig relative to entry-point via ts-node-script', async () => { const { err, stdout } = await exec(`${BIN_SCRIPT_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) expect(err).to.equal(null) expect(stdout).to.match(/plugin-a/) }) - it('should locate tsconfig relative to entry-point with --script-mode', async () => { + test('should locate tsconfig relative to entry-point with --script-mode', async () => { const { err, stdout } = await exec(`${BIN_PATH} --script-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) expect(err).to.equal(null) expect(stdout).to.match(/plugin-a/) }) - it('should locate tsconfig relative to cwd via ts-node-cwd', async () => { + test('should locate tsconfig relative to cwd via ts-node-cwd', async () => { const { err, stdout } = await exec(`${BIN_CWD_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) expect(err).to.equal(null) expect(stdout).to.match(/plugin-b/) }) - it('should locate tsconfig relative to cwd in --cwd-mode', async () => { + test('should locate tsconfig relative to cwd in --cwd-mode', async () => { const { err, stdout } = await exec(`${BIN_PATH} --cwd-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) expect(err).to.equal(null) expect(stdout).to.match(/plugin-b/) }) - it('should locate tsconfig relative to realpath, not symlink, when entrypoint is a symlink', async function () { + test('should locate tsconfig relative to realpath, not symlink, when entrypoint is a symlink', async (t) => { if (lstatSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { const { err, stdout } = await exec(`${BIN_PATH} main-realpath/symlink/symlink.tsx`) expect(err).to.equal(null) expect(stdout).to.equal('') } else { - this.skip() + t.log('Skipping') + return } }) } - describe('should read ts-node options from tsconfig.json', () => { + test.suite('should read ts-node options from tsconfig.json', (test) => { const BIN_EXEC = `"${BIN_PATH}" --project tsconfig-options/tsconfig.json` - it('should override compiler options from env', async () => { + test('should override compiler options from env', async () => { const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { env: { ...process.env, @@ -488,7 +491,7 @@ describe('ts-node', function () { expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/env-typeroots').replace(/\\/g, '/')]) }) - it('should use options from `tsconfig.json`', async () => { + test('should use options from `tsconfig.json`', async () => { const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`) expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) @@ -500,7 +503,7 @@ describe('ts-node', function () { expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) }) - it('should have flags override / merge with `tsconfig.json`', async () => { + test('should have flags override / merge with `tsconfig.json`', async () => { const { err, stdout } = await exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tsconfig-options/required2.js tsconfig-options/log-options2.js`) expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) @@ -515,7 +518,7 @@ describe('ts-node', function () { ]) }) - it('should have `tsconfig.json` override environment', async () => { + test('should have `tsconfig.json` override environment', async () => { const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { env: { ...process.env, @@ -534,15 +537,15 @@ describe('ts-node', function () { }) }) - describe('compiler host', () => { - it('should execute cli', async () => { + test.suite('compiler host', (test) => { + test('should execute cli', async () => { const { err, stdout } = await exec(`${cmd} --compiler-host hello-world`) expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') }) }) - it('should transpile files inside a node_modules directory when not ignored', async () => { + test('should transpile files inside a node_modules directory when not ignored', async () => { const { err, stdout, stderr } = await exec(`${cmdNoProject} from-node-modules/from-node-modules`) if (err) throw new Error(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) expect(JSON.parse(stdout)).to.deep.equal({ @@ -559,8 +562,8 @@ describe('ts-node', function () { }) }) - describe('should respect maxNodeModulesJsDepth', () => { - it('for unscoped modules', async () => { + test.suite('should respect maxNodeModulesJsDepth', (test) => { + test('for unscoped modules', async () => { const { err, stdout, stderr } = await exec(`${cmdNoProject} maxnodemodulesjsdepth`) expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( @@ -570,7 +573,7 @@ describe('ts-node', function () { ) }) - it('for @scoped modules', async () => { + test('for @scoped modules', async () => { const { err, stdout, stderr } = await exec(`${cmdNoProject} maxnodemodulesjsdepth-scoped`) expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( @@ -582,31 +585,31 @@ describe('ts-node', function () { }) }) - describe('register', () => { - let registered: tsNodeTypes.Service - let moduleTestPath: string - before(() => { - registered = register({ - project: PROJECT, - compilerOptions: { - jsx: 'preserve' - } - }) - moduleTestPath = require.resolve('../tests/module') - }) - - afterEach(() => { - // Re-enable project after every test. + test.suite('register', (_test) => { + const test = _test.context(once(async () => { + return { + registered: register({ + project: PROJECT, + compilerOptions: { + jsx: 'preserve' + } + }), + moduleTestPath: require.resolve('../tests/module') + } + })) + test.beforeEach(async ({ context: { registered } }) => { + // Re-enable project for every test. registered.enabled(true) }) + test.runSerially() - it('should be able to require typescript', () => { + test('should be able to require typescript', ({ context: { moduleTestPath } }) => { const m = require(moduleTestPath) expect(m.example('foo')).to.equal('FOO') }) - it('should support dynamically disabling', () => { + test('should support dynamically disabling', ({ context: { registered, moduleTestPath } }) => { delete require.cache[moduleTestPath] expect(registered.enabled(false)).to.equal(false) @@ -629,7 +632,7 @@ describe('ts-node', function () { }) if (semver.gte(ts.version, '2.7.0')) { - it('should support compiler scopes', () => { + test('should support compiler scopes', ({ context: { registered, moduleTestPath } }) => { const calls: string[] = [] registered.enabled(false) @@ -666,13 +669,13 @@ describe('ts-node', function () { }) } - it('should compile through js and ts', () => { + test('should compile through js and ts', () => { const m = require('../tests/complex') expect(m.example()).to.equal('example') }) - it('should work with proxyquire', () => { + test('should work with proxyquire', () => { const m = proxyquire('../tests/complex', { './example': 'hello' }) @@ -680,13 +683,13 @@ describe('ts-node', function () { expect(m.example()).to.equal('hello') }) - it('should work with `require.cache`', () => { + test('should work with `require.cache`', () => { const { example1, example2 } = require('../tests/require-cache') expect(example1).to.not.equal(example2) }) - it('should use source maps', async () => { + test('should use source maps', async () => { try { require('../tests/throw') } catch (error) { @@ -697,16 +700,17 @@ describe('ts-node', function () { } }) - describe('JSX preserve', () => { + test.suite('JSX preserve', (test) => { let old: (m: Module, filename: string) => any let compiled: string - before(() => { + test.runSerially() + test.beforeAll(async () => { old = require.extensions['.tsx']! // tslint:disable-line require.extensions['.tsx'] = (m: any, fileName) => { // tslint:disable-line const _compile = m._compile - m._compile = (code: string, fileName: string) => { + m._compile = function (code: string, fileName: string) { compiled = code return _compile.call(this, code, fileName) } @@ -715,11 +719,10 @@ describe('ts-node', function () { } }) - after(() => { - require.extensions['.tsx'] = old // tslint:disable-line - }) - - it('should use source maps', async () => { + test('should use source maps', async (t) => { + t.teardown(() => { + require.extensions['.tsx'] = old // tslint:disable-line + }) try { require('../tests/with-jsx.tsx') } catch (error) { @@ -731,25 +734,26 @@ describe('ts-node', function () { }) }) - describe('create', () => { - let service: tsNodeTypes.Service - before(() => { - service = create({ compilerOptions: { target: 'es5' }, skipProject: true }) + test.suite('create', (_test) => { + const test = _test.context(async t => { + return { + service: create({ compilerOptions: { target: 'es5' }, skipProject: true }) + } }) - it('should create generic compiler instances', () => { + test('should create generic compiler instances', ({ context: { service } }) => { const output = service.compile('const x = 10', 'test.ts') expect(output).to.contain('var x = 10;') }) - describe('should get type information', () => { - it('given position of identifier', () => { + test.suite('should get type information', (test) => { + test('given position of identifier', ({ context: { service } }) => { expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 21)).to.deep.equal({ comment: 'jsdoc here', name: 'const x: 10' }) }) - it('given position that does not point to an identifier', () => { + test('given position that does not point to an identifier', ({ context: { service } }) => { expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 0)).to.deep.equal({ comment: '', name: '' @@ -758,7 +762,7 @@ describe('ts-node', function () { }) }) - describe('issue #1098', () => { + test.suite('issue #1098', (test) => { function testIgnored (ignored: tsNodeTypes.Service['ignored'], allowed: string[], disallowed: string[]) { for (const ext of allowed) { expect(ignored(join(__dirname, `index${ext}`))).equal(false, `should accept ${ext} files`) @@ -768,36 +772,35 @@ describe('ts-node', function () { } } - it('correctly filters file extensions from the compiler when allowJs=false and jsx=false', () => { + test('correctly filters file extensions from the compiler when allowJs=false and jsx=false', () => { const { ignored } = create({ compilerOptions: {}, skipProject: true }) testIgnored(ignored, ['.ts', '.d.ts'], ['.js', '.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) }) - it('correctly filters file extensions from the compiler when allowJs=true and jsx=false', () => { + test('correctly filters file extensions from the compiler when allowJs=true and jsx=false', () => { const { ignored } = create({ compilerOptions: { allowJs: true }, skipProject: true }) testIgnored(ignored, ['.ts', '.js', '.d.ts'], ['.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) }) - it('correctly filters file extensions from the compiler when allowJs=false and jsx=true', () => { + test('correctly filters file extensions from the compiler when allowJs=false and jsx=true', () => { const { ignored } = create({ compilerOptions: { allowJs: false, jsx: 'preserve' }, skipProject: true }) testIgnored(ignored, ['.ts', '.tsx', '.d.ts'], ['.js', '.jsx', '.mjs', '.cjs', '.xyz', '']) }) - it('correctly filters file extensions from the compiler when allowJs=true and jsx=true', () => { + test('correctly filters file extensions from the compiler when allowJs=true and jsx=true', () => { const { ignored } = create({ compilerOptions: { allowJs: true, jsx: 'preserve' }, skipProject: true }) testIgnored(ignored, ['.ts', '.tsx', '.js', '.jsx', '.d.ts'], ['.mjs', '.cjs', '.xyz', '']) }) }) - describe('esm', () => { - this.slow(1000) + test.suite('esm', (test) => { const cmd = `node --loader ts-node/esm` if (semver.gte(process.version, '13.0.0')) { - it('should compile and execute as ESM', async () => { + test('should compile and execute as ESM', async () => { const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm') }) expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') }) - it('should use source maps', async () => { + test('should use source maps', async () => { const { err, stdout } = await exec(`${cmd} throw.ts`, { cwd: join(TEST_DIR, './esm') }) expect(err).not.to.equal(null) expect(err!.message).to.contain([ @@ -808,18 +811,18 @@ describe('ts-node', function () { ].join('\n')) }) - describe('supports experimental-specifier-resolution=node', () => { - it('via --experimental-specifier-resolution', async () => { + test.suite('supports experimental-specifier-resolution=node', (test) => { + test('via --experimental-specifier-resolution', async () => { const { err, stdout } = await exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }) expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') }) - it('via --es-module-specifier-resolution alias', async () => { + test('via --es-module-specifier-resolution alias', async () => { const { err, stdout } = await exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }) expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') }) - it('via NODE_OPTIONS', async () => { + test('via NODE_OPTIONS', async () => { const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver'), env: { @@ -832,13 +835,13 @@ describe('ts-node', function () { }) }) - it('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', async () => { + test('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', async () => { const { err, stdout, stderr } = await exec(`${cmd} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) expect(err).to.not.equal(null) expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') }) - it('defers to fallback loaders when URL should not be handled by ts-node', async () => { + test('defers to fallback loaders when URL should not be handled by ts-node', async () => { const { err, stdout, stderr } = await exec(`${cmd} index.mjs`, { cwd: join(TEST_DIR, './esm-import-http-url') }) @@ -847,18 +850,18 @@ describe('ts-node', function () { expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*(?:\n.*){0,1}\n *at defaultResolve/) }) - it('should bypass import cache when changing search params', async () => { + test('should bypass import cache when changing search params', async () => { const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-import-cache') }) expect(err).to.equal(null) expect(stdout).to.equal('log1\nlog2\nlog2\n') }) - it('should support transpile only mode via dedicated loader entrypoint', async () => { + test('should support transpile only mode via dedicated loader entrypoint', async () => { const { err, stdout } = await exec(`${cmd}/transpile-only index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }) expect(err).to.equal(null) expect(stdout).to.equal('') }) - it('should throw type errors without transpile-only enabled', async () => { + test('should throw type errors without transpile-only enabled', async () => { const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }) if (err === null) { throw new Error('Command was expected to fail, but it succeeded.') @@ -871,7 +874,7 @@ describe('ts-node', function () { }) } - it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', async () => { + test('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', async () => { const { err, stdout } = await exec(`${BIN_PATH} ./esm-err-require-esm/index.js`) expect(err).to.equal(null) expect(stdout).to.equal('CommonJS\n') diff --git a/src/index.ts b/src/index.ts index 5bba3b8d7..eb937d07d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ +import { test } from './testlib' import { relative, basename, extname, resolve, dirname, join } from 'path' import sourceMapSupport = require('source-map-support') import * as ynModule from 'yn' diff --git a/src/testlib.ts b/src/testlib.ts new file mode 100644 index 000000000..6e45bd960 --- /dev/null +++ b/src/testlib.ts @@ -0,0 +1,167 @@ +import avaTest, { ExecutionContext, Implementation, OneOrMoreMacros } from 'ava' +import * as assert from 'assert' +import throat from 'throat' + +const concurrencyLimiter = throat(8) + +function once (func: T): T { + let run = false + let ret: any = undefined + return function (...args: any[]) { + if (run) return ret + run = true + ret = func(...args) + return ret + } as any as T +} + +export const test = createTestInterface({ + beforeEachFunctions: [], + mustDoSerial: false, + automaticallyDoSerial: false, + separator: ' > ', + titlePrefix: undefined +}) +export interface TestInterface /*extends Omit, 'before' | 'beforeEach' | 'after' | 'afterEach' | 'failing' | 'serial'>*/ { + + //#region copy-pasted from ava's .d.ts + /** Declare a concurrent test. */ + (title: string, implementation: Implementation): void + /** Declare a concurrent test that uses one or more macros. Additional arguments are passed to the macro. */ + (title: string, macros: OneOrMoreMacros, ...rest: T): void + /** Declare a concurrent test that uses one or more macros. The macro is responsible for generating a unique test title. */ + (macros: OneOrMoreMacros, ...rest: T): void + //#endregion + + serial (title: string, implementation: Implementation): void + /** Declare a concurrent test that uses one or more macros. Additional arguments are passed to the macro. */ + serial (title: string, macros: OneOrMoreMacros, ...rest: T): void + /** Declare a concurrent test that uses one or more macros. The macro is responsible for generating a unique test title. */ + serial (macros: OneOrMoreMacros, ...rest: T): void + + macro (cb: (...args: Args) => [(title: string | undefined) => string, (t: TestInterface) => Promise]): (test: TestInterface, ...args: Args) => Promise & { + title (givenTitle: string | undefined, ...args: Args): string; + } + + beforeAll (cb: (t: ExecutionContext) => Promise): void + beforeEach (cb: (t: ExecutionContext) => Promise): void + context (cb: (t: ExecutionContext) => Promise): TestInterface + suite (title: string, cb: (test: TestInterface) => void): void + + runSerially (): void + + // TODO add teardownEach +} +function createTestInterface (opts: { + titlePrefix: string | undefined, + separator: string | undefined, + mustDoSerial: boolean, + automaticallyDoSerial: boolean, + beforeEachFunctions: Function[] +}): TestInterface { + const { titlePrefix, separator = ' > ' } = opts + const beforeEachFunctions = [...(opts.beforeEachFunctions ?? [])] + let { mustDoSerial, automaticallyDoSerial } = opts + let hookDeclared = false + let suiteOrTestDeclared = false + function computeTitle (title: string | undefined) { + assert(title) + // return `${ titlePrefix }${ separator }${ title }`; + if (titlePrefix != null && title != null) { // tslint:disable-line:strict-type-predicates + return `${ titlePrefix }${ separator }${ title }` + } + if (titlePrefix == null && title != null) { // tslint:disable-line:strict-type-predicates + return title + } + } + function parseArgs (args: any[]) { + const title = typeof args[0] === 'string' ? args.shift() as string : undefined + const macros = typeof args[0] === 'function' ? [args.shift() as Function] : Array.isArray(args[0]) ? args.shift() as Function[] : [] + return { title, macros, args } + } + function assertOrderingForDeclaringTest () { + suiteOrTestDeclared = true + } + function assertOrderingForDeclaringHook () { + if (suiteOrTestDeclared) { + throw new Error('Hooks must be declared before declaring sub-suites or tests') + } + hookDeclared = true + } + /** + * @param avaDeclareFunction either test or test.serial + */ + function declareTest (title: string | undefined, macros: Function[], avaDeclareFunction: Function, args: any[]) { + const wrappedMacros = macros.map(macro => { + return async function (t: ExecutionContext, ...args: any[]) { + return concurrencyLimiter(async () => { + let i = 0 + for (const func of beforeEachFunctions) { + await func(t) + i++ + } + return macro(t, ...args) + }) + } + }) + const computedTitle = computeTitle(title) + avaDeclareFunction(computedTitle, wrappedMacros, ...args) + } + function test (...inputArgs: any[]) { + assertOrderingForDeclaringTest() + // TODO is this safe to disable? + // X parallel tests will each invoke the beforeAll hook, but once()ification means each invocation will return the same promise, and tests cannot + // start till it finishes. + // HOWEVER if it returns a single shared state, can tests concurrently use this shared state? + // if(!automaticallyDoSerial && mustDoSerial) throw new Error('Cannot declare non-serial tests because you have declared a beforeAll() hook for this test suite.'); + const { args, macros, title } = parseArgs(inputArgs) + return declareTest(title, macros, automaticallyDoSerial ? avaTest.serial : avaTest, args) + } + test.serial = function (...inputArgs: any[]) { + assertOrderingForDeclaringTest() + const { args, macros, title } = parseArgs(inputArgs) + return declareTest(title, macros, avaTest.serial, args) + } + test.beforeEach = function (cb: (test: ExecutionContext) => Promise) { + assertOrderingForDeclaringHook() + beforeEachFunctions.push(cb) + } + test.context = function (cb: (test: ExecutionContext) => Promise) { + assertOrderingForDeclaringHook() + beforeEachFunctions.push(async (t: ExecutionContext) => { + const addedContextFields = await cb(t) + Object.assign(t.context, addedContextFields) + }) + return test + } + test.beforeAll = function (cb: (test: ExecutionContext) => Promise) { + assertOrderingForDeclaringHook() + mustDoSerial = true + beforeEachFunctions.push(once(cb)) + } + test.macro = function(cb: (...args: Args) => [(title: string | undefined) => string, (t: ExecutionContext) => Promise]) { + function macro (testInterface: ExecutionContext, ...args: Args) { + const [, macroFunction] = cb(...args) + return macroFunction(testInterface) + } + macro.title = function (givenTitle: string | undefined, ...args: Args) { + const [macroTitleFunction ] = cb(...args) + return macroTitleFunction(givenTitle) + } + return macro + } + test.suite = function (title: string, cb: (test: TestInterface) => void) { + const newApi = createTestInterface({ + mustDoSerial, + automaticallyDoSerial, + separator, + titlePrefix: computeTitle(title), + beforeEachFunctions + }) + cb(newApi) + } + test.runSerially = function () { + automaticallyDoSerial = true + } + return test as any +} diff --git a/tests/env.ts b/tests/env.ts index 8a3b78aba..e156a7db9 100644 --- a/tests/env.ts +++ b/tests/env.ts @@ -1 +1 @@ -console.log(typeof process[Symbol.for('ts-node.register.instance')]) +console.log(typeof (process as any)[Symbol.for('ts-node.register.instance')]) diff --git a/tests/tsconfig.json b/tests/tsconfig.json index 561005005..0a9ec999e 100644 --- a/tests/tsconfig.json +++ b/tests/tsconfig.json @@ -3,6 +3,7 @@ "target": "es2015", "jsx": "react", "noEmit": true, + "strict": true, // Global type definitions. "typeRoots": [ "./typings", diff --git a/tsconfig.build-schema.json b/tsconfig.build-schema.json new file mode 100644 index 000000000..adf48b4c9 --- /dev/null +++ b/tsconfig.build-schema.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "incremental": false + } +} diff --git a/tsconfig.json b/tsconfig.json index b710eb46f..c92bfb256 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,8 +11,10 @@ "declaration": true, "sourceMap": true, "inlineSources": true, - "types": ["node", "mocha"], - "stripInternal": true + "types": ["node"], + "stripInternal": true, + "incremental": true, + "skipLibCheck": true }, "include": [ "src/**/*" From e53619ef85a58ed730d3268d914f3069363df7c6 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 22 Feb 2021 11:57:01 -0500 Subject: [PATCH 104/113] Fix #1229 and #1235: [BREAKING] always throw ERR_REQUIRE_ESM when attempting to execute ESM as CJS, even when ESM loader is not loaded (#1232) * always throw ERR_REQUIRE_ESM when attempting to execute ESM as CJS, even when ESM loader is not loaded * cleanup * Fix #1235 * fix bug --- src/index.spec.ts | 25 ++++++++++++++++++------- src/index.ts | 18 +++++++----------- src/testlib.ts | 11 ++++++----- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 553d99b94..b1fb16d7f 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -835,8 +835,8 @@ test.suite('ts-node', (test) => { }) }) - test('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', async () => { - const { err, stdout, stderr } = await exec(`${cmd} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) + test('throws ERR_REQUIRE_ESM when attempting to require() an ESM script when ESM loader is enabled', async () => { + const { err, stderr } = await exec(`${cmd} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) expect(err).to.not.equal(null) expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') }) @@ -874,10 +874,21 @@ test.suite('ts-node', (test) => { }) } - test('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', async () => { - const { err, stdout } = await exec(`${BIN_PATH} ./esm-err-require-esm/index.js`) - expect(err).to.equal(null) - expect(stdout).to.equal('CommonJS\n') - }) + if (semver.gte(process.version, '12.0.0')) { + test('throws ERR_REQUIRE_ESM when attempting to require() an ESM script when ESM loader is *not* enabled and node version is >= 12', async () => { + // Node versions >= 12 support package.json "type" field and so will throw an error when attempting to load ESM as CJS + const { err, stderr } = await exec(`${BIN_PATH} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) + expect(err).to.not.equal(null) + expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') + }) + } else { + test('Loads as CommonJS when attempting to require() an ESM script when ESM loader is *not* enabled and node version is < 12', async () => { + // Node versions less than 12 do not support package.json "type" field and so will load ESM as CommonJS + const { err, stdout } = await exec(`${BIN_PATH} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) + expect(err).to.equal(null) + expect(stdout).to.contain('CommonJS') + }) + } + }) }) diff --git a/src/index.ts b/src/index.ts index eb937d07d..b94798678 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,18 +19,16 @@ export { createRepl, CreateReplOptions, ReplService } from './repl' */ const engineSupportsPackageTypeField = parseInt(process.versions.node.split('.')[0], 10) >= 12 -// Loaded conditionally so we don't need to support older node versions -let assertScriptCanLoadAsCJSImpl: ((filename: string) => void) | undefined - /** * Assert that script can be loaded as CommonJS when we attempt to require it. * If it should be loaded as ESM, throw ERR_REQUIRE_ESM like node does. + * + * Loaded conditionally so we don't need to support older node versions */ -function assertScriptCanLoadAsCJS (filename: string) { - if (!engineSupportsPackageTypeField) return - if (!assertScriptCanLoadAsCJSImpl) assertScriptCanLoadAsCJSImpl = require('../dist-raw/node-cjs-loader-utils').assertScriptCanLoadAsCJSImpl - assertScriptCanLoadAsCJSImpl!(filename) -} +const assertScriptCanLoadAsCJS: (filename: string) => void = + engineSupportsPackageTypeField + ? require('../dist-raw/node-cjs-loader-utils').assertScriptCanLoadAsCJSImpl + : () => {/* noop */} /** * Registered `ts-node` instance information. @@ -1115,9 +1113,7 @@ function registerExtension ( require.extensions[ext] = function (m: any, filename) { // tslint:disable-line if (service.ignored(filename)) return old(m, filename) - if (service.options.experimentalEsmLoader) { - assertScriptCanLoadAsCJS(filename) - } + assertScriptCanLoadAsCJS(filename) const _compile = m._compile diff --git a/src/testlib.ts b/src/testlib.ts index 6e45bd960..14533f9a2 100644 --- a/src/testlib.ts +++ b/src/testlib.ts @@ -39,7 +39,7 @@ export interface TestInterface /*extends Omit /** Declare a concurrent test that uses one or more macros. The macro is responsible for generating a unique test title. */ serial (macros: OneOrMoreMacros, ...rest: T): void - macro (cb: (...args: Args) => [(title: string | undefined) => string, (t: TestInterface) => Promise]): (test: TestInterface, ...args: Args) => Promise & { + macro (cb: (...args: Args) => ([(title: string | undefined) => string, (t: ExecutionContext) => Promise] | ((t: ExecutionContext) => Promise))): (test: ExecutionContext, ...args: Args) => Promise & { title (givenTitle: string | undefined, ...args: Args): string; } @@ -139,14 +139,15 @@ function createTestInterface (opts: { mustDoSerial = true beforeEachFunctions.push(once(cb)) } - test.macro = function(cb: (...args: Args) => [(title: string | undefined) => string, (t: ExecutionContext) => Promise]) { + test.macro = function(cb: (...args: Args) => [(title: string | undefined) => string, (t: ExecutionContext) => Promise] | ((t: ExecutionContext) => Promise)) { function macro (testInterface: ExecutionContext, ...args: Args) { - const [, macroFunction] = cb(...args) + const ret = cb(...args) + const macroFunction = Array.isArray(ret) ? ret[1] : ret return macroFunction(testInterface) } macro.title = function (givenTitle: string | undefined, ...args: Args) { - const [macroTitleFunction ] = cb(...args) - return macroTitleFunction(givenTitle) + const ret = cb(...args) + return Array.isArray(ret) ? ret[0](givenTitle) : givenTitle } return macro } From 68a6a1057aaa1c9b7aebb3bfd65616fe0cbdda00 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 23 Feb 2021 12:37:55 -0500 Subject: [PATCH 105/113] remove duplicate build step from CI (#1237) --- .github/workflows/continuous-integration.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index f383e3724..27b3d751f 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -116,7 +116,6 @@ jobs: - if: ${{ matrix.downgradeNpm }} run: npm install -g npm@6 - run: npm install - - run: npm run build-nopack - name: Download package artifact uses: actions/download-artifact@v1 with: From 83fdf6a815062da44eb464fef0cd1ddff595a03b Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 23 Feb 2021 14:50:34 -0500 Subject: [PATCH 106/113] Fix bug from ava changes: remove erroneous testlib import from index.ts (#1238) --- src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index b94798678..6a69b5758 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ -import { test } from './testlib' import { relative, basename, extname, resolve, dirname, join } from 'path' import sourceMapSupport = require('source-map-support') import * as ynModule from 'yn' From 9e34e182e8302258e6d71a2231253da68cb40549 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 23 Feb 2021 17:31:42 -0500 Subject: [PATCH 107/113] mark @internals and improve jsdoc (#1242) --- src/index.ts | 8 +++++--- src/repl.ts | 10 ++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6a69b5758..914e7b205 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,8 +7,9 @@ import { fileURLToPath } from 'url' import type * as _ts from 'typescript' import { Module, createRequire as nodeCreateRequire, createRequireFromPath as nodeCreateRequireFromPath } from 'module' import type _createRequire from 'create-require' -// tslint:disable-next-line:deprecation -export const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire + +/** @internal */ +export const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire // tslint:disable-line:deprecation export { createRepl, CreateReplOptions, ReplService } from './repl' @@ -343,6 +344,7 @@ export interface TypeInfo { /** * Default register options, including values specified via environment * variables. + * @internal */ export const DEFAULTS: RegisterOptions = { cwd: env.TS_NODE_CWD ?? env.TS_NODE_DIR, // tslint:disable-line:deprecation @@ -435,7 +437,7 @@ export interface Service { /** * Re-export of `Service` interface for backwards-compatibility * @deprecated use `Service` instead - * @see Service + * @see {Service} */ export type Register = Service diff --git a/src/repl.ts b/src/repl.ts index a0b9c60e5..2b8074021 100644 --- a/src/repl.ts +++ b/src/repl.ts @@ -46,6 +46,16 @@ export interface CreateReplOptions { stderr?: NodeJS.WritableStream } +/** + * Create a ts-node REPL instance. + * + * Usage example: + * + * const repl = tsNode.createRepl() + * const service = tsNode.create({...repl.evalAwarePartialHost}) + * repl.setService(service) + * repl.start() + */ export function createRepl (options: CreateReplOptions = {}) { let service = options.service const state = options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)) From 4e04302e36dc118a1e64cba8e0194bbe7f5d364a Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 23 Feb 2021 21:03:41 -0500 Subject: [PATCH 108/113] #1100: adds --show-config to log the resolved configuration (#1243) * add --show-config which is like a ts-node equivalent of tsc --showConfig * fix and add tests * try to fix test * fix tests and sneak in an update to ts 4.2 since it affects the output of --showConfig --- package-lock.json | 6 +++--- package.json | 2 +- src/bin.ts | 30 ++++++++++++++++++++++++++++-- src/index.spec.ts | 42 +++++++++++++++++++++++++++++++++++++++++- src/index.ts | 17 ++++++++++++++--- 5 files changed, 87 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9a603a99..0eee58dae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4379,9 +4379,9 @@ "dev": true }, "typescript": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", - "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.2.tgz", + "integrity": "sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ==", "dev": true }, "typescript-json-schema": { diff --git a/package.json b/package.json index 8ef5d1902..0d36a3287 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", "typedoc": "^0.20.20", - "typescript": "4.1.2", + "typescript": "4.2.2", "typescript-json-schema": "^0.42.0", "util.promisify": "^1.0.1" }, diff --git a/src/bin.ts b/src/bin.ts index d07a124e8..0924f96b0 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -10,7 +10,7 @@ import { createRepl, ReplService } from './repl' -import { VERSION, TSError, parse, register, createRequire } from './index' +import { VERSION, TSError, parse, register, createRequire, TSInternal } from './index' /** * Main `bin` functionality. @@ -30,6 +30,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re '--cwd-mode': Boolean, '--script-mode': Boolean, '--version': arg.COUNT, + '--show-config': Boolean, // Project options. '--cwd': String, @@ -64,7 +65,8 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re '-C': '--compiler', '-D': '--ignore-diagnostics', '-O': '--compiler-options', - '--dir': '--cwd' + '--dir': '--cwd', + '--showConfig': '--show-config' }, { argv, stopAtPositional: true @@ -80,6 +82,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re '--script-mode': scriptMode, '--cwd-mode': cwdMode, '--version': version = 0, + '--show-config': showConfig, '--require': argsRequire = [], '--eval': code = undefined, '--print': print = false, @@ -115,6 +118,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re -h, --help Print CLI usage -v, --version Print module version information --cwd-mode Use current directory instead of for config resolution + --show-config Print resolved configuration and exit -T, --transpile-only Use TypeScript's faster \`transpileModule\` -H, --compiler-host Use TypeScript's compiler host API @@ -184,6 +188,28 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re process.exit(0) } + if (showConfig) { + const ts = service.ts as any as TSInternal + if (typeof ts.convertToTSConfig !== 'function') { // tslint:disable-line:strict-type-predicates + console.error('Error: --show-config requires a typescript versions >=3.2 that support --showConfig') + process.exit(1) + } + const json = ts.convertToTSConfig(service.config, service.configFilePath ?? join(cwd, 'ts-node-implicit-tsconfig.json'), service.ts.sys) + json['ts-node'] = { + ...service.options, + experimentalEsmLoader: undefined, + compilerOptions: undefined, + project: service.configFilePath ?? service.options.project + } + console.log( + // Assumes that all configuration options which can possibly be specified via the CLI are JSON-compatible. + // If, in the future, we must log functions, for example readFile and fileExists, then we can implement a JSON + // replacer function. + JSON.stringify(json, null, 2) + ) + process.exit(0) + } + // Create a local module instance based on `cwd`. const module = new Module(state.path) module.filename = state.path diff --git a/src/index.spec.ts b/src/index.spec.ts index b1fb16d7f..d7db0f5ed 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,7 +1,7 @@ import { test, TestInterface } from './testlib' import { expect } from 'chai' import { ChildProcess, exec as childProcessExec, ExecException, ExecOptions } from 'child_process' -import { join } from 'path' +import { join, resolve, sep as pathSep } from 'path' import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') @@ -35,6 +35,7 @@ function exec (cmd: string, opts: ExecOptions = {}): Promise & { ) } +const ROOT_DIR = resolve(__dirname, '..') const TEST_DIR = join(__dirname, '../tests') const PROJECT = join(TEST_DIR, 'tsconfig.json') const BIN_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node') @@ -583,6 +584,45 @@ test.suite('ts-node', (test) => { ) }) }) + + if (semver.gte(ts.version, '3.2.0')) { + test('--show-config should log resolved configuration', async (t) => { + function native (path: string) { return path.replace(/\/|\\/g, pathSep) } + function posix (path: string) { return path.replace(/\/|\\/g, '/') } + const { err, stdout } = await exec(`${cmd} --showConfig`) + expect(err).to.equal(null) + t.is(stdout, JSON.stringify({ + 'compilerOptions': { + 'target': 'es6', + 'jsx': 'react', + 'noEmit': false, + 'strict': true, + 'typeRoots': [ + posix(`${ ROOT_DIR }/tests/typings`), + posix(`${ ROOT_DIR }/node_modules/@types`) + ], + 'sourceMap': true, + 'inlineSourceMap': false, + 'inlineSources': true, + 'declaration': false, + 'outDir': './.ts-node', + 'module': 'commonjs' + }, + 'ts-node': { + 'cwd': native(`${ ROOT_DIR }/tests`), + 'projectSearchDir': native(`${ ROOT_DIR }/tests`), + 'project': native(`${ ROOT_DIR }/tests/tsconfig.json`), + 'require': [] + } + }, null, 2) + '\n') + }) + } else { + test('--show-config should log error message when used with old typescript versions', async (t) => { + const { err, stderr } = await exec(`${cmd} --showConfig`) + expect(err).to.not.equal(null) + expect(stderr).to.contain('Error: --show-config requires') + }) + } }) test.suite('register', (_test) => { diff --git a/src/index.ts b/src/index.ts index 914e7b205..0866d293d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -135,14 +135,23 @@ export interface TSCommon { /** * Compiler APIs we use that are marked internal and not included in TypeScript's public API declarations + * @internal */ -interface TSInternal { +export interface TSInternal { // https://github.com/microsoft/TypeScript/blob/4a34294908bed6701dcba2456ca7ac5eafe0ddff/src/compiler/core.ts#L1906-L1909 createGetCanonicalFileName (useCaseSensitiveFileNames: boolean): TSInternal.GetCanonicalFileName + // https://github.com/microsoft/TypeScript/blob/c117c266e09c80e8a06b24a6e94b9d018f5fae6b/src/compiler/commandLineParser.ts#L2054 + convertToTSConfig (configParseResult: _ts.ParsedCommandLine, configFileName: string, host: TSInternal.ConvertToTSConfigHost): any } -namespace TSInternal { +/** @internal */ +export namespace TSInternal { // https://github.com/microsoft/TypeScript/blob/4a34294908bed6701dcba2456ca7ac5eafe0ddff/src/compiler/core.ts#L1906 export type GetCanonicalFileName = (fileName: string) => string + // https://github.com/microsoft/TypeScript/blob/c117c266e09c80e8a06b24a6e94b9d018f5fae6b/src/compiler/commandLineParser.ts#L2041 + export interface ConvertToTSConfigHost { + getCurrentDirectory (): string + useCaseSensitiveFileNames: boolean + } } /** @@ -432,6 +441,8 @@ export interface Service { ignored (fileName: string): boolean compile (code: string, fileName: string, lineOffset?: number): string getTypeInfo (code: string, fileName: string, position: number): TypeInfo + /** @internal */ + configFilePath: string | undefined } /** @@ -1053,7 +1064,7 @@ export function create (rawOptions: CreateOptions = {}): Service { return true } - return { ts, config, compile, getTypeInfo, ignored, enabled, options } + return { ts, config, compile, getTypeInfo, ignored, enabled, options, configFilePath } } /** From 78af0454c27f75d05906ea72adf8dbeeacd6a243 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 26 Feb 2021 20:23:23 -0500 Subject: [PATCH 109/113] upgrade typedoc (#1250) --- package-lock.json | 36 ++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0eee58dae..3050c4e6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2073,9 +2073,9 @@ "dev": true }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -2753,9 +2753,9 @@ } }, "marked": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz", - "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.0.tgz", + "integrity": "sha512-NqRSh2+LlN2NInpqTQnS614Y/3NkVMFFU6sJlRFEpxJ/LHuK/qJECH7/fXZjk4VZstPW/Pevjil/VtSONsLc7Q==", "dev": true }, "matcher": { @@ -4346,17 +4346,17 @@ } }, "typedoc": { - "version": "0.20.23", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.23.tgz", - "integrity": "sha512-RBXuM0MJ2V/7eGg4YrDEmV1bn/ypa3Wx6AO1B0mUBHEQJaOIKEEnNI0Su75J6q7dkB5ksZvGNgsGjvfWL8Myjg==", + "version": "0.20.28", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.28.tgz", + "integrity": "sha512-8j0T8u9FuyDkoe+M/3cyoaGJSVgXCY9KwVoo7TLUnmQuzXwqH+wkScY530ZEdK6G39UZ2LFTYPIrL5eykWjx6A==", "dev": true, "requires": { "colors": "^1.4.0", "fs-extra": "^9.1.0", - "handlebars": "^4.7.6", - "lodash": "^4.17.20", + "handlebars": "^4.7.7", + "lodash": "^4.17.21", "lunr": "^2.3.9", - "marked": "^1.2.9", + "marked": "^2.0.0", "minimatch": "^3.0.0", "progress": "^2.0.3", "shelljs": "^0.8.4", @@ -4365,9 +4365,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true } } @@ -4475,9 +4475,9 @@ } }, "uglify-js": { - "version": "3.12.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.7.tgz", - "integrity": "sha512-SIZhkoh+U/wjW+BHGhVwE9nt8tWJspncloBcFapkpGRwNPqcH8pzX36BXe3TPBjzHWPMUZotpCigak/udWNr1Q==", + "version": "3.12.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.8.tgz", + "integrity": "sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w==", "dev": true, "optional": true }, diff --git a/package.json b/package.json index 0d36a3287..5d1c68402 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "throat": "^6.0.1", "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", - "typedoc": "^0.20.20", + "typedoc": "^0.20.28", "typescript": "4.2.2", "typescript-json-schema": "^0.42.0", "util.promisify": "^1.0.1" From 3b5b9c2eb7c853cc0a685cd59dafe72934c19038 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 26 Feb 2021 20:27:13 -0500 Subject: [PATCH 110/113] Implement #1202: default @tsconfig/bases (#1236) * Implementation * fix * fix lint * fix * fix * cleanup * fallback to older @tsconfig/node* config when we detect an incompatibility with the lib or target options * lint fix * WIP * Add CLI and programmatic option to disable implicit compiler options * Remove --no-implicit-compiler-options flag and programmatic option; it is implemented in another PR * add tests * fix tests * fix tests * fix tests --- node10/tsconfig.json | 3 ++ node12/tsconfig.json | 3 ++ node14/tsconfig.json | 3 ++ package-lock.json | 15 ++++++ package.json | 13 ++++- src/index.spec.ts | 54 +++++++++++++++++++- src/index.ts | 61 ++++++++++++++++------- src/tsconfigs.ts | 33 ++++++++++++ tests/tsconfig-bases/node10/tsconfig.json | 3 ++ tests/tsconfig-bases/node12/tsconfig.json | 3 ++ tests/tsconfig-bases/node14/tsconfig.json | 3 ++ 11 files changed, 172 insertions(+), 22 deletions(-) create mode 100644 node10/tsconfig.json create mode 100644 node12/tsconfig.json create mode 100644 node14/tsconfig.json create mode 100644 src/tsconfigs.ts create mode 100644 tests/tsconfig-bases/node10/tsconfig.json create mode 100644 tests/tsconfig-bases/node12/tsconfig.json create mode 100644 tests/tsconfig-bases/node14/tsconfig.json diff --git a/node10/tsconfig.json b/node10/tsconfig.json new file mode 100644 index 000000000..7079f3adb --- /dev/null +++ b/node10/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@tsconfig/node10/tsconfig.json" +} diff --git a/node12/tsconfig.json b/node12/tsconfig.json new file mode 100644 index 000000000..76603f1cd --- /dev/null +++ b/node12/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@tsconfig/node12/tsconfig.json", +} diff --git a/node14/tsconfig.json b/node14/tsconfig.json new file mode 100644 index 000000000..b08285106 --- /dev/null +++ b/node14/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@tsconfig/node14/tsconfig.json" +} diff --git a/package-lock.json b/package-lock.json index 3050c4e6e..849393ce9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -394,6 +394,21 @@ "defer-to-connect": "^1.0.1" } }, + "@tsconfig/node10": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.7.tgz", + "integrity": "sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ==" + }, + "@tsconfig/node12": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.7.tgz", + "integrity": "sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A==" + }, + "@tsconfig/node14": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", + "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==" + }, "@types/chai": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.10.tgz", diff --git a/package.json b/package.json index 5d1c68402..0ff87b8a4 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,10 @@ "./esm": "./esm.mjs", "./esm.mjs": "./esm.mjs", "./esm/transpile-only": "./esm/transpile-only.mjs", - "./esm/transpile-only.mjs": "./esm/transpile-only.mjs" + "./esm/transpile-only.mjs": "./esm/transpile-only.mjs", + "./node10/tsconfig.json": "./node10/tsconfig.json", + "./node12/tsconfig.json": "./node12/tsconfig.json", + "./node14/tsconfig.json": "./node14/tsconfig.json" }, "types": "dist/index.d.ts", "bin": { @@ -40,7 +43,10 @@ "esm.mjs", "LICENSE", "tsconfig.schema.json", - "tsconfig.schemastore-schema.json" + "tsconfig.schemastore-schema.json", + "node10/", + "node12/", + "node14/" ], "scripts": { "lint": "tslint \"src/**/*.ts\" --project tsconfig.json", @@ -131,6 +137,9 @@ "typescript": ">=2.7" }, "dependencies": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", diff --git a/src/index.spec.ts b/src/index.spec.ts index d7db0f5ed..e6ea53eff 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -2,11 +2,12 @@ import { test, TestInterface } from './testlib' import { expect } from 'chai' import { ChildProcess, exec as childProcessExec, ExecException, ExecOptions } from 'child_process' import { join, resolve, sep as pathSep } from 'path' +import { tmpdir } from 'os' import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') import type * as tsNodeTypes from './index' -import { unlinkSync, existsSync, lstatSync } from 'fs' +import { unlinkSync, existsSync, lstatSync, mkdtempSync, fstat, copyFileSync, writeFileSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' import type _createRequire from 'create-require' @@ -97,6 +98,10 @@ test.suite('ts-node', (test) => { testsDirRequire.resolve('ts-node/esm.mjs') testsDirRequire.resolve('ts-node/esm/transpile-only') testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') + + testsDirRequire.resolve('ts-node/node10/tsconfig.json') + testsDirRequire.resolve('ts-node/node12/tsconfig.json') + testsDirRequire.resolve('ts-node/node14/tsconfig.json') }) test.suite('cli', (test) => { @@ -538,6 +543,53 @@ test.suite('ts-node', (test) => { }) }) + test.suite('should use implicit @tsconfig/bases config when one is not loaded from disk', _test => { + const test = _test.context(async t => ({ + tempDir: mkdtempSync(join(tmpdir(), 'ts-node-spec')) + })) + if (semver.gte(ts.version, '3.5.0') && semver.gte(process.versions.node, '14.0.0')) { + test('implicitly uses @tsconfig/node14 compilerOptions when both TS and node versions support it', async t => { + const { context: { tempDir } } = t + const { err: err1, stdout: stdout1, stderr: stderr1 } = await exec(`${BIN_PATH} --showConfig`, { cwd: tempDir }) + expect(err1).to.equal(null) + t.like(JSON.parse(stdout1), { + compilerOptions: { + target: 'es2020', + lib: ['es2020'] + } + }) + const { err: err2, stdout: stdout2, stderr: stderr2 } = await exec(`${BIN_PATH} -pe 10n`, { cwd: tempDir }) + expect(err2).to.equal(null) + expect(stdout2).to.equal('10n\n') + }) + } else { + test('implicitly uses @tsconfig/* lower than node14 (node10 or node12) when either TS or node versions do not support @tsconfig/node14', async ({ context: { tempDir } }) => { + const { err, stdout, stderr } = await exec(`${BIN_PATH} -pe 10n`, { cwd: tempDir }) + expect(err).to.not.equal(null) + expect(stderr).to.match(/BigInt literals are not available when targeting lower than|error TS2304: Cannot find name 'n'/) + }) + } + }) + + if (semver.gte(ts.version, '3.2.0')) { + test.suite('should bundle @tsconfig/bases to be used in your own tsconfigs', test => { + const macro = test.macro((nodeVersion: string) => async t => { + const config = require(`@tsconfig/${ nodeVersion }/tsconfig.json`) + const { err, stdout, stderr } = await exec(`${BIN_PATH} --showConfig -e 10n`, { cwd: join(TEST_DIR, 'tsconfig-bases', nodeVersion) }) + expect(err).to.equal(null) + t.like(JSON.parse(stdout), { + compilerOptions: { + target: config.compilerOptions.target, + lib: config.compilerOptions.lib + } + }) + }) + test(`ts-node/node10/tsconfig.json`, macro, 'node10') + test(`ts-node/node12/tsconfig.json`, macro, 'node12') + test(`ts-node/node14/tsconfig.json`, macro, 'node14') + }) + } + test.suite('compiler host', (test) => { test('should execute cli', async () => { const { err, stdout } = await exec(`${cmd} --compiler-host hello-world`) diff --git a/src/index.ts b/src/index.ts index 0866d293d..f9fb36593 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import { fileURLToPath } from 'url' import type * as _ts from 'typescript' import { Module, createRequire as nodeCreateRequire, createRequireFromPath as nodeCreateRequireFromPath } from 'module' import type _createRequire from 'create-require' +import { getDefaultTsconfigJsonForNodeVersion } from './tsconfigs' /** @internal */ export const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire // tslint:disable-line:deprecation @@ -131,6 +132,7 @@ export interface TSCommon { parseJsonConfigFileContent: typeof _ts.parseJsonConfigFileContent formatDiagnostics: typeof _ts.formatDiagnostics formatDiagnosticsWithColorAndContext: typeof _ts.formatDiagnosticsWithColorAndContext + libs?: string[] } /** @@ -521,10 +523,10 @@ export function create (rawOptions: CreateOptions = {}): Service { let { compiler, ts } = loadCompiler(compilerName, rawOptions.projectSearchDir ?? rawOptions.project ?? cwd) // Read config file and merge new options between env and CLI options. - const { configFilePath, config, options: tsconfigOptions } = readConfig(cwd, ts, rawOptions) - const options = assign({}, DEFAULTS, tsconfigOptions || {}, rawOptions) + const { configFilePath, config, tsNodeOptionsFromTsconfig } = readConfig(cwd, ts, rawOptions) + const options = assign({}, DEFAULTS, tsNodeOptionsFromTsconfig || {}, rawOptions) options.require = [ - ...tsconfigOptions.require || [], + ...tsNodeOptionsFromTsconfig.require || [], ...rawOptions.require || [] ] @@ -1167,30 +1169,40 @@ function fixConfig (ts: TSCommon, config: _ts.ParsedCommandLine) { /** * Load TypeScript configuration. Returns the parsed TypeScript config and * any `ts-node` options specified in the config file. + * + * Even when a tsconfig.json is not loaded, this function still handles merging + * compilerOptions from various sources: API, environment variables, etc. */ function readConfig ( cwd: string, ts: TSCommon, - rawOptions: CreateOptions + rawApiOptions: CreateOptions ): { - // Path of tsconfig file + /** + * Path of tsconfig file if one was loaded + */ configFilePath: string | undefined, - // Parsed TypeScript configuration. + /** + * Parsed TypeScript configuration with compilerOptions merged from all other sources (env vars, etc) + */ config: _ts.ParsedCommandLine - // Options pulled from `tsconfig.json`. - options: TsConfigOptions + /** + * ts-node options pulled from `tsconfig.json`, NOT merged with any other sources. Merging must happen outside + * this function. + */ + tsNodeOptionsFromTsconfig: TsConfigOptions } { let config: any = { compilerOptions: {} } let basePath = cwd let configFilePath: string | undefined = undefined - const projectSearchDir = resolve(cwd, rawOptions.projectSearchDir ?? cwd) + const projectSearchDir = resolve(cwd, rawApiOptions.projectSearchDir ?? cwd) const { fileExists = ts.sys.fileExists, readFile = ts.sys.readFile, skipProject = DEFAULTS.skipProject, project = DEFAULTS.project - } = rawOptions + } = rawApiOptions // Read project configuration when available. if (!skipProject) { @@ -1206,7 +1218,7 @@ function readConfig ( return { configFilePath, config: { errors: [result.error], fileNames: [], options: {} }, - options: {} + tsNodeOptionsFromTsconfig: {} } } @@ -1216,22 +1228,33 @@ function readConfig ( } // Fix ts-node options that come from tsconfig.json - const tsconfigOptions: TsConfigOptions = Object.assign({}, filterRecognizedTsConfigTsNodeOptions(config['ts-node'])) + const tsNodeOptionsFromTsconfig: TsConfigOptions = Object.assign({}, filterRecognizedTsConfigTsNodeOptions(config['ts-node'])) // Remove resolution of "files". - const files = rawOptions.files ?? tsconfigOptions.files ?? DEFAULTS.files + const files = rawApiOptions.files ?? tsNodeOptionsFromTsconfig.files ?? DEFAULTS.files if (!files) { config.files = [] config.include = [] } - // Override default configuration options `ts-node` requires. + // Only if a config file is *not* loaded, load an implicit configuration from @tsconfig/bases + const skipDefaultCompilerOptions = configFilePath != null // tslint:disable-line + const defaultCompilerOptionsForNodeVersion = skipDefaultCompilerOptions ? undefined : getDefaultTsconfigJsonForNodeVersion(ts).compilerOptions + + // Merge compilerOptions from all sources config.compilerOptions = Object.assign( {}, + // automatically-applied options from @tsconfig/bases + defaultCompilerOptionsForNodeVersion, + // tsconfig.json "compilerOptions" config.compilerOptions, + // from env var DEFAULTS.compilerOptions, - tsconfigOptions.compilerOptions, - rawOptions.compilerOptions, + // tsconfig.json "ts-node": "compilerOptions" + tsNodeOptionsFromTsconfig.compilerOptions, + // passed programmatically + rawApiOptions.compilerOptions, + // overrides required by ts-node, cannot be changed TS_NODE_COMPILER_OPTIONS ) @@ -1242,15 +1265,15 @@ function readConfig ( useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames }, basePath, undefined, configFilePath)) - if (tsconfigOptions.require) { + if (tsNodeOptionsFromTsconfig.require) { // Modules are found relative to the tsconfig file, not the `dir` option const tsconfigRelativeRequire = createRequire(configFilePath!) - tsconfigOptions.require = tsconfigOptions.require.map((path: string) => { + tsNodeOptionsFromTsconfig.require = tsNodeOptionsFromTsconfig.require.map((path: string) => { return tsconfigRelativeRequire.resolve(path) }) } - return { configFilePath, config: fixedConfig, options: tsconfigOptions } + return { configFilePath, config: fixedConfig, tsNodeOptionsFromTsconfig } } /** diff --git a/src/tsconfigs.ts b/src/tsconfigs.ts new file mode 100644 index 000000000..2ce944a4d --- /dev/null +++ b/src/tsconfigs.ts @@ -0,0 +1,33 @@ +import { TSCommon } from '.' + +const nodeMajor = parseInt(process.versions.node.split('.')[0], 10) +/** + * return parsed JSON of the bundled @tsconfig/bases config appropriate for the + * running version of nodejs + * @internal + */ +export function getDefaultTsconfigJsonForNodeVersion (ts: TSCommon): any { + if (nodeMajor >= 14) { + const config = require('@tsconfig/node14/tsconfig.json') + if (configCompatible(config)) return config + } + if (nodeMajor >= 12) { + const config = require('@tsconfig/node12/tsconfig.json') + if (configCompatible(config)) return config + } + return require('@tsconfig/node10/tsconfig.json') + + // Verify that tsconfig target and lib options are compatible with TypeScript compiler + function configCompatible (config: { + compilerOptions: { + lib: string[], + target: string + } + }) { + return ( + typeof (ts.ScriptTarget as any)[config.compilerOptions.target.toUpperCase()] === 'number' && + ts.libs && + config.compilerOptions.lib.every(lib => ts.libs!.includes(lib)) + ) + } +} diff --git a/tests/tsconfig-bases/node10/tsconfig.json b/tests/tsconfig-bases/node10/tsconfig.json new file mode 100644 index 000000000..f8b881e4c --- /dev/null +++ b/tests/tsconfig-bases/node10/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "ts-node/node10/tsconfig.json" +} diff --git a/tests/tsconfig-bases/node12/tsconfig.json b/tests/tsconfig-bases/node12/tsconfig.json new file mode 100644 index 000000000..eda168e10 --- /dev/null +++ b/tests/tsconfig-bases/node12/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "ts-node/node12/tsconfig.json" +} diff --git a/tests/tsconfig-bases/node14/tsconfig.json b/tests/tsconfig-bases/node14/tsconfig.json new file mode 100644 index 000000000..8a496b8a8 --- /dev/null +++ b/tests/tsconfig-bases/node14/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "ts-node/node14/tsconfig.json" +} From 0274f814e749fe11a309f15b9cdcc067869fd8df Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 27 Feb 2021 15:36:00 -0500 Subject: [PATCH 111/113] swc transpiler and new --transpiler option to use third-party transpilers (#1160) * WIP experimental swc compiler * Fix optional peer dep * wip * properly merge all of ts onto exports object * fix clobbering of code because swc does not append a //# sourcemap comment * More changes: - rename from ts-node/compilers/swc to ts-node/compiler/swc-experimental - add @swc/wasm fallback when @swc/core is not installed or available - expand TSCommon to include all api surface used by ts-node; use TSCommon consistently (should be extracted to a different PR) - ts-node's compiler loading logic detects a createTypescriptCompiler function and will invoke it to get instance of compiler - fix ts-node's sourcemap comment appender to work even when TS compiler does not append a sourcemap comment. swc does not append such a comment * Fix bug in swc loading to allow swc API instance to be passed to factory * lint fixes * Fix typo in createTypescriptCompiler function name * Switch from hacky overloading the "compiler" config to implementing a new, dedicated custom transpiler API * fix package.json files array and add --transpiler CLI flag * make --transpiler imply --transpile-only and add tests * fixes * add missing test files * add @swc/core dep to tests * add some jsdoc to new transpiler api surface * change transpiler options to be specified as "transpiler: [name, {/*options*/}]" * fix * cleanup comments --- package-lock.json | 111 ++++++++++++++++++ package.json | 14 +++ src/bin.ts | 8 +- src/index.spec.ts | 14 +++ src/index.ts | 78 +++++++++--- src/transpilers/swc.ts | 100 ++++++++++++++++ src/transpilers/types.ts | 32 +++++ tests/package.json | 3 +- .../transpile-only-swc-via-tsconfig/index.ts | 4 + .../tsconfig.json | 11 ++ tests/transpile-only-swc/index.ts | 4 + tests/transpile-only-swc/tsconfig.json | 7 ++ transpilers/swc-experimental.js | 1 + 13 files changed, 367 insertions(+), 20 deletions(-) create mode 100644 src/transpilers/swc.ts create mode 100644 src/transpilers/types.ts create mode 100644 tests/transpile-only-swc-via-tsconfig/index.ts create mode 100644 tests/transpile-only-swc-via-tsconfig/tsconfig.json create mode 100644 tests/transpile-only-swc/index.ts create mode 100644 tests/transpile-only-swc/tsconfig.json create mode 100644 transpilers/swc-experimental.js diff --git a/package-lock.json b/package-lock.json index 849393ce9..b0cba38d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -353,6 +353,30 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, + "@napi-rs/triples": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.2.tgz", + "integrity": "sha512-EL3SiX43m9poFSnhDx4d4fn9SSaqyO2rHsCNhETi9bWPmjXK3uPJ0QpPFtx39FEdHcz1vJmsiW41kqc0AgvtzQ==", + "dev": true + }, + "@node-rs/helper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.1.0.tgz", + "integrity": "sha512-r43YnnrY5JNzDuXJdW3sBJrKzvejvFmFWbiItUEoBJsaPzOIWFMhXB7i5j4c9EMXcFfxveF4l7hT+rLmwtjrVQ==", + "dev": true, + "requires": { + "@napi-rs/triples": "^1.0.2", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", @@ -385,6 +409,93 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, + "@swc/core": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.48.tgz", + "integrity": "sha512-gL8Xy61wp4w35OLCTdUHx+B8/iiL7yoNejw3Kbd3Cm4ajf/rGXlM8nACuD3O9+Ilgw4uqIwYWr9SP4APBSloOQ==", + "dev": true, + "requires": { + "@node-rs/helper": "^1.0.0", + "@swc/core-android-arm64": "^1.2.48", + "@swc/core-darwin-arm64": "^1.2.48", + "@swc/core-darwin-x64": "^1.2.48", + "@swc/core-linux-arm-gnueabihf": "^1.2.48", + "@swc/core-linux-arm64-gnu": "^1.2.48", + "@swc/core-linux-x64-gnu": "^1.2.48", + "@swc/core-linux-x64-musl": "^1.2.48", + "@swc/core-win32-ia32-msvc": "^1.2.48", + "@swc/core-win32-x64-msvc": "^1.2.48" + } + }, + "@swc/core-android-arm64": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.48.tgz", + "integrity": "sha512-/aRdn5RBHNRaPh8GRZ6pJQRevqYpWdvlW7hkh5XPAqYotiL7DeL5KzWuW8wBZlDQuLZ3/i3LLE/ts/HzhdxQ5Q==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-arm64": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.48.tgz", + "integrity": "sha512-OzGVZ9kB1Wg6sRFLkvRVVFiEFcpyHagkr4sZQi7F6J8H7kBQji8J6j4Xm7thNeD0dkHeF3m3iN6SDyphp/fC4Q==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.48.tgz", + "integrity": "sha512-rlwDBEY8qSLVEODUG++qWIig79CxpGCQS4ZG56FsjApEYKZ27Pi04eF+K2eN6Nr9DtxDD2fIIR8hZUn37sRf7w==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.48.tgz", + "integrity": "sha512-XRl3Xa3uie9kRC3o+WhQtqfQ6FOBDnq5KqIdTXxXJYFjjGCq5lpNnJG61kRSh+AoQtvCcbL07peozQ5ThzCbKA==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.48.tgz", + "integrity": "sha512-wbhFe++C0Q9mRlu7HJZtezEFpPVAMwJUWRIebi7uMQNjKnnJDIbQQA/4LFO3JEHMsyqkDAbV2N6ZnQdyYnrilQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.48.tgz", + "integrity": "sha512-4bMqUsP7yUWCRkPLl8peNgC/dclUMGV8quHvs7Tv/JAV1sV9JGZ+0RrtUaT0hd6cx7T/zhJDkuz+eArCac8tqQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.48.tgz", + "integrity": "sha512-yHV314AkFoGEmqMFBYXqqzDG5PGfYHwXHH9H6ErKE6anJMEPcICCrROk7gCzAu3yTSoIkT0mEUn+33vnded6ig==", + "dev": true, + "optional": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.48.tgz", + "integrity": "sha512-wytnwb7Yby+Skpf6uSeQIJNG14NZax1NVApTUs4Lguw+ibUPJvFHlaMjnZwugQqbV80vpCUZQMXRa5MwZwZo/w==", + "dev": true, + "optional": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.48.tgz", + "integrity": "sha512-3/Ec4rtZwt3BQZVsSOe47ahY4YlxHxdslCsOnsQ7hMe1ynMvq47Lo1DAX8J6r7YfthYG6HUrM5qHDIxpCgAftA==", + "dev": true, + "optional": true + }, + "@swc/wasm": { + "version": "1.2.48", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.48.tgz", + "integrity": "sha512-Nn9Y6dIVETcBXjQkYZUtijppvOwRUXmYJLENK1hpgMP4BiGJJ/UrM5yp4YgRWWxo1QL6J/2qTadyF3t9KnE9Eg==", + "dev": true + }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", diff --git a/package.json b/package.json index 0ff87b8a4..6a7518da5 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "./esm.mjs": "./esm.mjs", "./esm/transpile-only": "./esm/transpile-only.mjs", "./esm/transpile-only.mjs": "./esm/transpile-only.mjs", + "./transpilers/swc-experimental": "./transpilers/swc-experimental.js", "./node10/tsconfig.json": "./node10/tsconfig.json", "./node12/tsconfig.json": "./node12/tsconfig.json", "./node14/tsconfig.json": "./node14/tsconfig.json" @@ -36,6 +37,7 @@ "ts-node-transpile-only": "dist/bin-transpile.js" }, "files": [ + "transpilers/", "dist/", "dist-raw/", "register/", @@ -105,6 +107,8 @@ "timeout": "300s" }, "devDependencies": { + "@swc/core": ">=1.2.45", + "@swc/wasm": ">=1.2.45", "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", "@types/lodash": "^4.14.151", @@ -134,8 +138,18 @@ "util.promisify": "^1.0.1" }, "peerDependencies": { + "@swc/core": ">=1.2.45", + "@swc/wasm": ">=1.2.45", "typescript": ">=2.7" }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + }, "dependencies": { "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", diff --git a/src/bin.ts b/src/bin.ts index 0924f96b0..f9378969f 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -41,6 +41,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re '--ignore-diagnostics': [String], '--ignore': [String], '--transpile-only': Boolean, + '--transpiler': String, '--type-check': Boolean, '--compiler-host': Boolean, '--pretty': Boolean, @@ -95,6 +96,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re '--ignore': ignore, '--transpile-only': transpileOnly, '--type-check': typeCheck, + '--transpiler': transpiler, '--compiler-host': compilerHost, '--pretty': pretty, '--skip-project': skipProject, @@ -120,11 +122,12 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re --cwd-mode Use current directory instead of for config resolution --show-config Print resolved configuration and exit - -T, --transpile-only Use TypeScript's faster \`transpileModule\` + -T, --transpile-only Use TypeScript's faster \`transpileModule\` or a third-party transpiler -H, --compiler-host Use TypeScript's compiler host API -I, --ignore [pattern] Override the path patterns to skip compilation -P, --project [path] Path to TypeScript JSON project file -C, --compiler [name] Specify a custom TypeScript compiler + --transpiler [name] Specify a third-party, non-typechecking transpiler -D, --ignore-diagnostics [code] Ignore TypeScript warnings by diagnostic code -O, --compiler-options [opts] JSON object to merge with compiler options @@ -159,8 +162,9 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re emit, files, pretty, - transpileOnly, + transpileOnly: transpileOnly ?? transpiler != null ? true : undefined, // tslint:disable-line:strict-type-predicates typeCheck, + transpiler, compilerHost, ignore, preferTsExts, diff --git a/src/index.spec.ts b/src/index.spec.ts index e6ea53eff..895c339bf 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -99,6 +99,8 @@ test.suite('ts-node', (test) => { testsDirRequire.resolve('ts-node/esm/transpile-only') testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') + testsDirRequire.resolve('ts-node/transpilers/swc-experimental') + testsDirRequire.resolve('ts-node/node10/tsconfig.json') testsDirRequire.resolve('ts-node/node12/tsconfig.json') testsDirRequire.resolve('ts-node/node14/tsconfig.json') @@ -272,6 +274,18 @@ test.suite('ts-node', (test) => { expect(err.message).to.contain('error TS1003: Identifier expected') }) + test('should support third-party transpilers via --transpiler', async () => { + const { err, stdout } = await exec(`${cmdNoProject} --transpiler ts-node/transpilers/swc-experimental transpile-only-swc`) + expect(err).to.equal(null) + expect(stdout).to.contain('hello world') + }) + + test('should support third-party transpilers via tsconfig', async () => { + const { err, stdout } = await exec(`${cmdNoProject} transpile-only-swc-via-tsconfig`) + expect(err).to.equal(null) + expect(stdout).to.contain('hello world') + }) + test('should pipe into `ts-node` and evaluate', async () => { const execPromise = exec(cmd) execPromise.child.stdin!.end("console.log('hello')") diff --git a/src/index.ts b/src/index.ts index f9fb36593..32f2d3233 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import { fileURLToPath } from 'url' import type * as _ts from 'typescript' import { Module, createRequire as nodeCreateRequire, createRequireFromPath as nodeCreateRequireFromPath } from 'module' import type _createRequire from 'create-require' +import { Transpiler, TranspilerFactory } from './transpilers/types' import { getDefaultTsconfigJsonForNodeVersion } from './tsconfigs' /** @internal */ @@ -132,6 +133,19 @@ export interface TSCommon { parseJsonConfigFileContent: typeof _ts.parseJsonConfigFileContent formatDiagnostics: typeof _ts.formatDiagnostics formatDiagnosticsWithColorAndContext: typeof _ts.formatDiagnosticsWithColorAndContext + + createDocumentRegistry: typeof _ts.createDocumentRegistry + JsxEmit: typeof _ts.JsxEmit + createModuleResolutionCache: typeof _ts.createModuleResolutionCache + resolveModuleName: typeof _ts.resolveModuleName + resolveModuleNameFromCache: typeof _ts.resolveModuleNameFromCache + resolveTypeReferenceDirective: typeof _ts.resolveTypeReferenceDirective + createIncrementalCompilerHost: typeof _ts.createIncrementalCompilerHost + createSourceFile: typeof _ts.createSourceFile + getDefaultLibFileName: typeof _ts.getDefaultLibFileName + createIncrementalProgram: typeof _ts.createIncrementalProgram + createEmitAndSemanticDiagnosticsBuilderProgram: typeof _ts.createEmitAndSemanticDiagnosticsBuilderProgram + libs?: string[] } @@ -156,6 +170,10 @@ export namespace TSInternal { } } +export interface TSCompilerFactory { + createTypescriptCompiler (options?: any): TSCommon +} + /** * Export the current version. */ @@ -237,6 +255,10 @@ export interface CreateOptions { * @default "typescript" */ compiler?: string + /** + * Specify a custom transpiler for use with transpileOnly + */ + transpiler?: string | [string, object] /** * Paths which should not be compiled. * @@ -568,6 +590,24 @@ export function create (rawOptions: CreateOptions = {}): Service { getCanonicalFileName: ts.sys.useCaseSensitiveFileNames ? x => x : x => x.toLowerCase() } + if (options.transpileOnly && typeof transformers === 'function') { + throw new TypeError('Transformers function is unavailable in "--transpile-only"') + } + let customTranspiler: Transpiler | undefined = undefined + if (options.transpiler) { + if (!transpileOnly) throw new Error('Custom transpiler can only be used when transpileOnly is enabled.') + const transpilerName = typeof options.transpiler === 'string' ? options.transpiler : options.transpiler[0] + const transpilerOptions = typeof options.transpiler === 'string' ? {} : options.transpiler[1] ?? {} + // TODO mimic fixed resolution logic from loadCompiler master + // TODO refactor into a more generic "resolve dep relative to project" helper + const transpilerPath = require.resolve(transpilerName, { paths: [cwd, __dirname] }) + const transpilerFactory: TranspilerFactory = require(transpilerPath).create + customTranspiler = transpilerFactory({ + service: { options, config }, + ...transpilerOptions + }) + } + // Install source map support and read from memory cache. sourceMapSupport.install({ environment: 'node', @@ -1022,17 +1062,20 @@ export function create (rawOptions: CreateOptions = {}): Service { } } } else { - if (typeof transformers === 'function') { - throw new TypeError('Transformers function is unavailable in "--transpile-only"') - } - getOutput = (code: string, fileName: string): SourceOutput => { - const result = ts.transpileModule(code, { - fileName, - compilerOptions: config.options, - reportDiagnostics: true, - transformers: transformers - }) + let result: _ts.TranspileOutput + if (customTranspiler) { + result = customTranspiler.transpile(code, { + fileName + }) + } else { + result = ts.transpileModule(code, { + fileName, + compilerOptions: config.options, + reportDiagnostics: true, + transformers: transformers as _ts.CustomTransformers | undefined + }) + } const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) if (diagnosticList.length) reportTSError(diagnosticList) @@ -1285,12 +1328,12 @@ function filterRecognizedTsConfigTsNodeOptions (jsonObject: any): TsConfigOption const { compiler, compilerHost, compilerOptions, emit, files, ignore, ignoreDiagnostics, logError, preferTsExts, pretty, require, skipIgnore, - transpileOnly, typeCheck + transpileOnly, typeCheck, transpiler } = jsonObject as TsConfigOptions const filteredTsConfigOptions = { compiler, compilerHost, compilerOptions, emit, files, ignore, ignoreDiagnostics, logError, preferTsExts, pretty, require, skipIgnore, - transpileOnly, typeCheck + transpileOnly, typeCheck, transpiler } // Use the typechecker to make sure this implementation has the correct set of properties const catchExtraneousProps: keyof TsConfigOptions = null as any as keyof typeof filteredTsConfigOptions @@ -1308,10 +1351,11 @@ type SourceOutput = [string, string] */ function updateOutput (outputText: string, fileName: string, sourceMap: string, getExtension: (fileName: string) => string) { const base64Map = Buffer.from(updateSourceMap(sourceMap, fileName), 'utf8').toString('base64') - const sourceMapContent = `data:application/json;charset=utf-8;base64,${base64Map}` - const sourceMapLength = `${basename(fileName)}.map`.length + (getExtension(fileName).length - extname(fileName).length) - - return outputText.slice(0, -sourceMapLength) + sourceMapContent + const sourceMapContent = `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${base64Map}` + // Expected form: `//# sourceMappingURL=foo.js.map` for input file foo.tsx + const sourceMapLength = /*//# sourceMappingURL=*/ 21 + /*foo.tsx*/ basename(fileName).length - /*.tsx*/ extname(fileName).length + /*.js*/ getExtension(fileName).length + /*.map*/ 4 + // Only rewrite if existing directive exists, to support compilers that do not append a sourcemap directive + return (outputText.slice(-sourceMapLength, -sourceMapLength + 21) === '//# sourceMappingURL=' ? outputText.slice(0, -sourceMapLength) : outputText) + sourceMapContent } /** @@ -1337,7 +1381,7 @@ function filterDiagnostics (diagnostics: readonly _ts.Diagnostic[], ignore: numb * * Reference: https://github.com/microsoft/TypeScript/blob/fcd9334f57d85b73dd66ad2d21c02e84822f4841/src/services/utilities.ts#L705-L731 */ -function getTokenAtPosition (ts: typeof _ts, sourceFile: _ts.SourceFile, position: number): _ts.Node { +function getTokenAtPosition (ts: TSCommon, sourceFile: _ts.SourceFile, position: number): _ts.Node { let current: _ts.Node = sourceFile outer: while (true) { diff --git a/src/transpilers/swc.ts b/src/transpilers/swc.ts new file mode 100644 index 000000000..220e8b03b --- /dev/null +++ b/src/transpilers/swc.ts @@ -0,0 +1,100 @@ +import type * as ts from 'typescript' +import type * as swcWasm from '@swc/wasm' +import type * as swcTypes from '@swc/core' +import { CreateTranspilerOptions, Transpiler } from './types' + +export interface SwcTranspilerOptions extends CreateTranspilerOptions { + /** + * swc compiler to use for compilation + * Set to '@swc/wasm' to use swc's WASM compiler + * Default: '@swc/core', falling back to '@swc/wasm' + */ + swc?: string | typeof swcWasm +} + +export function create (createOptions: SwcTranspilerOptions): Transpiler { + const { swc, service: { config } } = createOptions + + // Load swc compiler + let swcInstance: typeof swcWasm + if (typeof swc === 'string') { + swcInstance = require(swc) as typeof swcWasm + } else if (swc == null) { // tslint:disable-line + let swcResolved + try { + swcResolved = require.resolve('@swc/core') + } catch (e) { + try { + swcResolved = require.resolve('@swc/wasm') + } catch (e) { + throw new Error('swc compiler requires either @swc/core or @swc/wasm to be installed as dependencies') + } + } + swcInstance = require(swcResolved) as typeof swcWasm + } else { + swcInstance = swc + } + + // Prepare SWC options derived from typescript compiler options + const compilerOptions = config.options + const { esModuleInterop, sourceMap, importHelpers, experimentalDecorators, emitDecoratorMetadata, target, jsxFactory, jsxFragmentFactory } = compilerOptions + const nonTsxOptions = createSwcOptions(false) + const tsxOptions = createSwcOptions(true) + function createSwcOptions (isTsx: boolean): swcTypes.Options { + return { + sourceMaps: sourceMap, + // isModule: true, + module: { + type: 'commonjs', + noInterop: !esModuleInterop + }, + swcrc: false, + jsc: { + externalHelpers: importHelpers, + parser: { + syntax: 'typescript', + tsx: isTsx, + decorators: experimentalDecorators, + dynamicImport: true + }, + target: targetMapping.get(target!) ?? 'es3', + transform: { + decoratorMetadata: emitDecoratorMetadata, + legacyDecorator: true, + react: { + throwIfNamespace: false, + development: false, + useBuiltins: false, + pragma: jsxFactory!, + pragmaFrag: jsxFragmentFactory! + } + } + } + } + } + + const transpile: Transpiler['transpile'] = (input, transpileOptions) => { + const { fileName } = transpileOptions + const swcOptions = fileName.endsWith('.tsx') || fileName.endsWith('.jsx') ? tsxOptions : nonTsxOptions + const { code, map } = swcInstance.transformSync(input, { + ...swcOptions, + filename: fileName + }) + return { outputText: code, sourceMapText: map } + } + + return { + transpile + } +} + +const targetMapping = new Map() +targetMapping.set(/* ts.ScriptTarget.ES3 */ 0, 'es3') +targetMapping.set(/* ts.ScriptTarget.ES5 */ 1, 'es5') +targetMapping.set(/* ts.ScriptTarget.ES2015 */ 2, 'es2015') +targetMapping.set(/* ts.ScriptTarget.ES2016 */ 3, 'es2016') +targetMapping.set(/* ts.ScriptTarget.ES2017 */ 4, 'es2017') +targetMapping.set(/* ts.ScriptTarget.ES2018 */ 5, 'es2018') +targetMapping.set(/* ts.ScriptTarget.ES2019 */ 6, 'es2019') +targetMapping.set(/* ts.ScriptTarget.ES2020 */ 7, 'es2019') +targetMapping.set(/* ts.ScriptTarget.ESNext */ 99, 'es2019') diff --git a/src/transpilers/types.ts b/src/transpilers/types.ts new file mode 100644 index 000000000..295f67e8d --- /dev/null +++ b/src/transpilers/types.ts @@ -0,0 +1,32 @@ +import type * as ts from 'typescript' +import { Service } from '..' + +/** + * Third-party transpilers are implemented as a CommonJS module with a + * named export "create" + */ +export interface TranspilerModule { + create: TranspilerFactory +} +/** + * Called by ts-node to create a custom transpiler. + */ +export type TranspilerFactory = (options: CreateTranspilerOptions) => Transpiler +export interface CreateTranspilerOptions { + // TODO this is confusing because its only a partial Service. Rename? + service: Pick +} +export interface Transpiler { + // TODOs + // Create spec for returning diagnostics? Currently transpilers are allowed to + // throw an error but that's it. + transpile (input: string, options: TranspileOptions): TranspileOutput +} +export interface TranspileOptions { + fileName: string +} +export interface TranspileOutput { + outputText: string + diagnostics?: ts.Diagnostic[] + sourceMapText?: string +} diff --git a/tests/package.json b/tests/package.json index 26351d2b8..2c03119b3 100644 --- a/tests/package.json +++ b/tests/package.json @@ -1,5 +1,6 @@ { "dependencies": { - "ts-node": "file:ts-node-packed.tgz" + "ts-node": "file:ts-node-packed.tgz", + "@swc/core": "latest" } } diff --git a/tests/transpile-only-swc-via-tsconfig/index.ts b/tests/transpile-only-swc-via-tsconfig/index.ts new file mode 100644 index 000000000..bf54bf041 --- /dev/null +++ b/tests/transpile-only-swc-via-tsconfig/index.ts @@ -0,0 +1,4 @@ +// intentional type errors to check transpile-only ESM loader skips type checking +parseInt(1101, 2) +const x: number = 'hello world' +console.log(x) diff --git a/tests/transpile-only-swc-via-tsconfig/tsconfig.json b/tests/transpile-only-swc-via-tsconfig/tsconfig.json new file mode 100644 index 000000000..a0a168951 --- /dev/null +++ b/tests/transpile-only-swc-via-tsconfig/tsconfig.json @@ -0,0 +1,11 @@ +{ + "ts-node": { + "transpileOnly": true, + "transpiler": "ts-node/transpilers/swc-experimental" + }, + "compilerOptions": { + "module": "ESNext", + "allowJs": true, + "jsx": "react" + } +} diff --git a/tests/transpile-only-swc/index.ts b/tests/transpile-only-swc/index.ts new file mode 100644 index 000000000..bf54bf041 --- /dev/null +++ b/tests/transpile-only-swc/index.ts @@ -0,0 +1,4 @@ +// intentional type errors to check transpile-only ESM loader skips type checking +parseInt(1101, 2) +const x: number = 'hello world' +console.log(x) diff --git a/tests/transpile-only-swc/tsconfig.json b/tests/transpile-only-swc/tsconfig.json new file mode 100644 index 000000000..03e0c3c5d --- /dev/null +++ b/tests/transpile-only-swc/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "ESNext", + "allowJs": true, + "jsx": "react" + } +} diff --git a/transpilers/swc-experimental.js b/transpilers/swc-experimental.js new file mode 100644 index 000000000..7cf79b13c --- /dev/null +++ b/transpilers/swc-experimental.js @@ -0,0 +1 @@ +module.exports = require('../dist/transpilers/swc') From 45a9c63f4837609398efc212a98348748d7e169e Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 27 Feb 2021 16:00:18 -0500 Subject: [PATCH 112/113] Config changes to remove tslint, add prettier, using all defaults expect (#1231) for singlequotes --- .editorconfig | 5 ++ .prettierignore | 9 +++ package-lock.json | 163 ++-------------------------------------------- package.json | 10 +-- 4 files changed, 26 insertions(+), 161 deletions(-) create mode 100644 .prettierignore diff --git a/.editorconfig b/.editorconfig index 8e84accde..2925ccbba 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,9 +3,14 @@ root = true [*] +# This also tells github.com how wide to render tabs indent_size = 2 indent_style = space end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true + +[{package.json,*.yml,dist-raw/**}] +# In case we switch to tabs above, these must still be spaces +indent_style = space diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..3fd852746 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +/* +!/*.js +!/*.mjs +!/esm +!/register +!/scripts +!/src +!/tests +tests/main-realpath/symlink/tsconfig.json diff --git a/package-lock.json b/package-lock.json index b0cba38d2..c281a4a4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1257,12 +1257,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -1562,12 +1556,6 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, "common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", @@ -1821,24 +1809,6 @@ "path-type": "^4.0.0" } }, - "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", - "dev": true, - "requires": { - "esutils": "^1.1.6", - "isarray": "0.0.1" - }, - "dependencies": { - "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", - "dev": true - } - } - }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -2526,12 +2496,6 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2977,23 +2941,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, "module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", @@ -3660,6 +3607,12 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, "pretty-ms": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", @@ -4346,110 +4299,6 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, - "tslint": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", - "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.10.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "dev": true, - "requires": { - "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" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - } - } - }, - "tslint-config-standard": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-9.0.0.tgz", - "integrity": "sha1-NJqUgZ2T1fjYA+PHHLWO847/iOA=", - "dev": true, - "requires": { - "tslint-eslint-rules": "^5.3.1" - } - }, - "tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha1-5IjMkYG/GT/lzXv8ohOnaV8XN7U=", - "dev": true, - "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - }, - "dependencies": { - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha1-7XGZF/EcoN7lhicrKsSeAVot11k=", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, "type-detect": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", diff --git a/package.json b/package.json index 6a7518da5..6523dd29b 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "node14/" ], "scripts": { - "lint": "tslint \"src/**/*.ts\" --project tsconfig.json", - "lint-fix": "tslint \"src/**/*.ts\" --project tsconfig.json --fix", + "lint": "prettier --check .", + "lint-fix": "prettier --write .", "clean": "rimraf dist tsconfig.schema.json tsconfig.schemastore-schema.json tsconfig.tsbuildinfo tests/ts-node-packed.tgz", "rebuild": "npm run clean && npm run build", "build": "npm run build-nopack && npm run build-pack", @@ -125,13 +125,12 @@ "lodash": "^4.17.15", "ntypescript": "^1.201507091536.1", "nyc": "^15.0.1", + "prettier": "^2.2.1", "proxyquire": "^2.0.0", "react": "^16.14.0", "rimraf": "^3.0.0", "semver": "^7.1.3", "throat": "^6.0.1", - "tslint": "^6.1.0", - "tslint-config-standard": "^9.0.0", "typedoc": "^0.20.28", "typescript": "4.2.2", "typescript-json-schema": "^0.42.0", @@ -160,5 +159,8 @@ "make-error": "^1.1.1", "source-map-support": "^0.5.17", "yn": "3.1.1" + }, + "prettier": { + "singleQuote": true } } From 9d05cb684fc3a6e492832100a125ea07d1cc98c5 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 27 Feb 2021 16:10:03 -0500 Subject: [PATCH 113/113] #1231 followup: tslint to prettier: apply formatting changes, remove tslint:disable comments (#1251) * results of lint-fix * Remove tslint:disable comments * re-run lint-fix after removing tslint:disable comments --- esm.mjs | 14 +- esm/transpile-only.mjs | 14 +- nyc.config.js | 11 +- register/files.js | 4 +- register/index.js | 2 +- register/transpile-only.js | 4 +- register/type-check.js | 4 +- scripts/build-pack.js | 41 +- scripts/create-merged-schema.ts | 39 +- ...chemastore-schema-with-compiler-options.ts | 20 +- src/bin-cwd.ts | 4 +- src/bin-script-deprecated.ts | 6 +- src/bin-script.ts | 4 +- src/bin-transpile.ts | 4 +- src/bin.ts | 331 ++-- src/esm.ts | 120 +- src/externs.d.ts | 4 +- src/index.spec.ts | 1605 ++++++++++------- src/index.ts | 1476 +++++++++------ src/repl.ts | 314 ++-- src/testlib.ts | 296 +-- src/transpilers/swc.ts | 109 +- src/transpilers/types.ts | 22 +- src/tsconfig-schema.ts | 4 +- src/tsconfigs.ts | 32 +- tests/allow-js/run.js | 4 +- tests/allow-js/with-jsx.jsx | 10 +- tests/child-process.ts | 6 +- tests/compiler-error.ts | 6 +- tests/complex/example.js | 2 +- tests/complex/foo.ts | 2 +- tests/complex/index.ts | 6 +- tests/custom-types.ts | 4 +- tests/cwd-and-script-mode/a/index.ts | 14 +- tests/cwd-and-script-mode/a/tsconfig.json | 8 +- tests/cwd-and-script-mode/b/index.ts | 14 +- tests/cwd-and-script-mode/b/tsconfig.json | 8 +- tests/emit-compiled.ts | 22 +- tests/env.ts | 2 +- .../esm-package/loaded-as.ts | 6 +- tests/esm-err-require-esm/index.js | 2 +- tests/esm-import-cache/index.ts | 8 +- tests/esm-import-cache/log1.ts | 2 +- tests/esm-import-cache/log2.ts | 2 +- tests/esm-import-http-url/index.mjs | 2 +- tests/esm-node-resolver/bar/index.ts | 5 +- tests/esm-node-resolver/baz.js | 5 +- tests/esm-node-resolver/biff.jsx | 11 +- tests/esm-node-resolver/foo.ts | 5 +- tests/esm-node-resolver/index.ts | 15 +- tests/esm-transpile-only/index.ts | 7 +- tests/esm/bar.ts | 5 +- tests/esm/baz.js | 5 +- tests/esm/biff.jsx | 11 +- tests/esm/foo.ts | 5 +- tests/esm/index.ts | 20 +- tests/esm/throw.ts | 107 +- tests/from-node-modules/from-node-modules.ts | 12 +- tests/hello-world.ts | 2 +- tests/import-order/compiled.ts | 2 +- tests/import-order/defined.d.ts | 4 +- tests/import-order/importer.ts | 4 +- tests/import-order/require-compiled.js | 2 +- tests/issue-986/index.ts | 2 +- tests/issue-986/types.ts | 2 +- tests/jsx-react.tsx | 10 +- tests/main-realpath/target/target.tsx | 2 +- tests/maxnodemodulesjsdepth-scoped/index.ts | 8 +- tests/maxnodemodulesjsdepth-scoped/other.ts | 8 +- tests/maxnodemodulesjsdepth/index.ts | 4 +- tests/maxnodemodulesjsdepth/other.ts | 6 +- tests/module.ts | 4 +- tests/require-cache.ts | 10 +- tests/scope/a/index.ts | 4 +- tests/scope/a/log.ts | 4 +- tests/scope/b/index.ts | 4 +- tests/signals.ts | 12 +- tests/throw-react-tsx.tsx | 110 +- tests/throw.ts | 107 +- .../transpile-only-swc-via-tsconfig/index.ts | 6 +- tests/transpile-only-swc/index.ts | 6 +- tests/tsconfig-options/log-options1.js | 16 +- tests/tsconfig-options/log-options2.js | 6 +- tests/tsconfig-options/required1.js | 2 +- tests/tsconfig-options/required2.js | 4 +- tests/tsconfig.json | 5 +- tests/typings/does-not-exist/index.d.ts | 4 +- tests/with-jsx.tsx | 4 +- 88 files changed, 2852 insertions(+), 2339 deletions(-) diff --git a/esm.mjs b/esm.mjs index 873ff9768..2a11ac36e 100644 --- a/esm.mjs +++ b/esm.mjs @@ -1,7 +1,11 @@ -import {fileURLToPath} from 'url' -import {createRequire} from 'module' -const require = createRequire(fileURLToPath(import.meta.url)) +import { fileURLToPath } from 'url'; +import { createRequire } from 'module'; +const require = createRequire(fileURLToPath(import.meta.url)); /** @type {import('./dist/esm')} */ -const esm = require('./dist/esm') -export const {resolve, getFormat, transformSource} = esm.registerAndCreateEsmHooks() +const esm = require('./dist/esm'); +export const { + resolve, + getFormat, + transformSource, +} = esm.registerAndCreateEsmHooks(); diff --git a/esm/transpile-only.mjs b/esm/transpile-only.mjs index 4823d5217..c19132284 100644 --- a/esm/transpile-only.mjs +++ b/esm/transpile-only.mjs @@ -1,7 +1,11 @@ -import {fileURLToPath} from 'url' -import {createRequire} from 'module' -const require = createRequire(fileURLToPath(import.meta.url)) +import { fileURLToPath } from 'url'; +import { createRequire } from 'module'; +const require = createRequire(fileURLToPath(import.meta.url)); /** @type {import('../dist/esm')} */ -const esm = require('../dist/esm') -export const {resolve, getFormat, transformSource} = esm.registerAndCreateEsmHooks({transpileOnly: true}) +const esm = require('../dist/esm'); +export const { + resolve, + getFormat, + transformSource, +} = esm.registerAndCreateEsmHooks({ transpileOnly: true }); diff --git a/nyc.config.js b/nyc.config.js index 4a886a910..3f15fe94f 100644 --- a/nyc.config.js +++ b/nyc.config.js @@ -1,12 +1,7 @@ module.exports = { all: true, - include: [ - 'tests/node_modules/ts-node/**', - ], - exclude: [ - '**/*.d.ts', - 'tests/node_modules/ts-node/node_modules/**', - ], + include: ['tests/node_modules/ts-node/**'], + exclude: ['**/*.d.ts', 'tests/node_modules/ts-node/node_modules/**'], excludeNodeModules: false, - excludeAfterRemap: false + excludeAfterRemap: false, }; diff --git a/register/files.js b/register/files.js index 93505b69a..9be5bf50d 100644 --- a/register/files.js +++ b/register/files.js @@ -1,3 +1,3 @@ require('../dist').register({ - files: true -}) + files: true, +}); diff --git a/register/index.js b/register/index.js index 63ec2ce5b..456911760 100644 --- a/register/index.js +++ b/register/index.js @@ -1 +1 @@ -require('../').register() +require('../').register(); diff --git a/register/transpile-only.js b/register/transpile-only.js index a42dc27a9..4c526989b 100644 --- a/register/transpile-only.js +++ b/register/transpile-only.js @@ -1,3 +1,3 @@ require('../').register({ - transpileOnly: true -}) + transpileOnly: true, +}); diff --git a/register/type-check.js b/register/type-check.js index 08b410281..3d3c60b5b 100644 --- a/register/type-check.js +++ b/register/type-check.js @@ -1,3 +1,3 @@ require('../').register({ - typeCheck: true -}) + typeCheck: true, +}); diff --git a/scripts/build-pack.js b/scripts/build-pack.js index d914a1af1..ac5e19768 100644 --- a/scripts/build-pack.js +++ b/scripts/build-pack.js @@ -1,20 +1,31 @@ // Written in JS to support Windows // Would otherwise be written as inline bash in package.json script -const { exec } = require('child_process') -const { mkdtempSync, writeFileSync, readFileSync, unlinkSync, rmdirSync, readdirSync } = require('fs') -const { join } = require('path') +const { exec } = require('child_process'); +const { + mkdtempSync, + writeFileSync, + readFileSync, + unlinkSync, + rmdirSync, + readdirSync, +} = require('fs'); +const { join } = require('path'); -const testDir = join(__dirname, '../tests') -const tarballPath = join(testDir, 'ts-node-packed.tgz') -const tempDir = mkdtempSync(join(testDir, 'tmp')) -exec(`npm pack --ignore-scripts "${join(__dirname, '..')}"`, { cwd: tempDir }, (err, stdout) => { - if (err) { - console.error(err) - process.exit(1) +const testDir = join(__dirname, '../tests'); +const tarballPath = join(testDir, 'ts-node-packed.tgz'); +const tempDir = mkdtempSync(join(testDir, 'tmp')); +exec( + `npm pack --ignore-scripts "${join(__dirname, '..')}"`, + { cwd: tempDir }, + (err, stdout) => { + if (err) { + console.error(err); + process.exit(1); + } + const tempTarballPath = join(tempDir, readdirSync(tempDir)[0]); + writeFileSync(tarballPath, readFileSync(tempTarballPath)); + unlinkSync(tempTarballPath); + rmdirSync(tempDir); } - const tempTarballPath = join(tempDir, readdirSync(tempDir)[0]) - writeFileSync(tarballPath, readFileSync(tempTarballPath)) - unlinkSync(tempTarballPath) - rmdirSync(tempDir) -}) +); diff --git a/scripts/create-merged-schema.ts b/scripts/create-merged-schema.ts index 16aa66fe9..4016fd339 100755 --- a/scripts/create-merged-schema.ts +++ b/scripts/create-merged-schema.ts @@ -7,8 +7,8 @@ */ import axios from 'axios'; -import {resolve} from 'path'; -import {writeFileSync} from 'fs'; +import { resolve } from 'path'; +import { writeFileSync } from 'fs'; async function main() { /** schemastore definition */ @@ -26,27 +26,34 @@ async function main() { properties: { 'ts-node': { ...typescriptNodeSchema.definitions.TsConfigOptions, - description: typescriptNodeSchema.definitions.TsConfigSchema.properties['ts-node'].description, + description: + typescriptNodeSchema.definitions.TsConfigSchema.properties[ + 'ts-node' + ].description, properties: { ...typescriptNodeSchema.definitions.TsConfigOptions.properties, compilerOptions: { - ...typescriptNodeSchema.definitions.TsConfigOptions.properties.compilerOptions, - allOf: [{ - $ref: '#/definitions/compilerOptionsDefinition/properties/compilerOptions' - }] - } - } - } - } + ...typescriptNodeSchema.definitions.TsConfigOptions.properties + .compilerOptions, + allOf: [ + { + $ref: + '#/definitions/compilerOptionsDefinition/properties/compilerOptions', + }, + ], + }, + }, + }, + }, }, }, allOf: [ // Splice into the allOf array at a spot that looks good. Does not affect // behavior of the schema, but looks nicer if we want to submit as a PR to schemastore. ...schemastoreSchema.allOf.slice(0, 4), - { "$ref": "#/definitions/tsNodeDefinition" }, + { $ref: '#/definitions/tsNodeDefinition' }, ...schemastoreSchema.allOf.slice(4), - ] + ], }; writeFileSync( resolve(__dirname, '../tsconfig.schemastore-schema.json'), @@ -55,9 +62,11 @@ async function main() { } export async function getSchemastoreSchema() { - const {data: schemastoreSchema} = await axios.get( + const { + data: schemastoreSchema, + } = await axios.get( 'https://schemastore.azurewebsites.net/schemas/json/tsconfig.json', - { responseType: "json" } + { responseType: 'json' } ); return schemastoreSchema; } diff --git a/scripts/update-schemastore-schema-with-compiler-options.ts b/scripts/update-schemastore-schema-with-compiler-options.ts index c4405f39b..25707df94 100644 --- a/scripts/update-schemastore-schema-with-compiler-options.ts +++ b/scripts/update-schemastore-schema-with-compiler-options.ts @@ -23,16 +23,18 @@ * in the TypeStrong org. */ -import {} from 'ts-expose-internals' -import * as ts from 'typescript' -import { getSchemastoreSchema } from './create-merged-schema' +import {} from 'ts-expose-internals'; +import * as ts from 'typescript'; +import { getSchemastoreSchema } from './create-merged-schema'; // Sometimes schemastore becomes out of date with the latest tsconfig options. // This script async function main() { const schemastoreSchema = await getSchemastoreSchema(); - const compilerOptions = schemastoreSchema.definitions.compilerOptionsDefinition.properties.compilerOptions.properties; + const compilerOptions = + schemastoreSchema.definitions.compilerOptionsDefinition.properties + .compilerOptions.properties; // These options are only available via CLI flags, not in a tsconfig file. const excludedOptions = [ @@ -48,10 +50,10 @@ async function main() { 'out', // <-- deprecated ]; - ts.optionDeclarations.forEach(v => { - if(excludedOptions.includes(v.name)) return; + ts.optionDeclarations.forEach((v) => { + if (excludedOptions.includes(v.name)) return; - if(!compilerOptions[v.name]) { + if (!compilerOptions[v.name]) { compilerOptions[v.name] = { description: v.description?.message, type: v.type, @@ -60,9 +62,7 @@ async function main() { }); // Don't write to a file; this is not part of our build process - console.log( - JSON.stringify(schemastoreSchema, null, 2) - ); + console.log(JSON.stringify(schemastoreSchema, null, 2)); } main(); diff --git a/src/bin-cwd.ts b/src/bin-cwd.ts index fb2c1e63b..bd2f4483c 100644 --- a/src/bin-cwd.ts +++ b/src/bin-cwd.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { main } from './bin' +import { main } from './bin'; -main(undefined, { '--cwd-mode': true }) +main(undefined, { '--cwd-mode': true }); diff --git a/src/bin-script-deprecated.ts b/src/bin-script-deprecated.ts index e24d5e81b..07112d85b 100644 --- a/src/bin-script-deprecated.ts +++ b/src/bin-script-deprecated.ts @@ -1,10 +1,10 @@ #!/usr/bin/env node -import { main } from './bin' +import { main } from './bin'; console.warn( 'ts-script has been deprecated and will be removed in the next major release.', 'Please use ts-node-script instead' -) +); -main(undefined, { '--script-mode': true }) +main(undefined, { '--script-mode': true }); diff --git a/src/bin-script.ts b/src/bin-script.ts index 47f6e1587..78f9ab320 100644 --- a/src/bin-script.ts +++ b/src/bin-script.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { main } from './bin' +import { main } from './bin'; -main(undefined, { '--script-mode': true }) +main(undefined, { '--script-mode': true }); diff --git a/src/bin-transpile.ts b/src/bin-transpile.ts index 68c1df1aa..8eb818146 100644 --- a/src/bin-transpile.ts +++ b/src/bin-transpile.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -import { main } from './bin' +import { main } from './bin'; -main(undefined, { '--transpile-only': true }) +main(undefined, { '--transpile-only': true }); diff --git a/src/bin.ts b/src/bin.ts index f9378969f..3ed834295 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -1,78 +1,86 @@ #!/usr/bin/env node -import { join, resolve, dirname, parse as parsePath } from 'path' -import { inspect } from 'util' -import Module = require('module') -import arg = require('arg') +import { join, resolve, dirname, parse as parsePath } from 'path'; +import { inspect } from 'util'; +import Module = require('module'); +import arg = require('arg'); +import { EVAL_FILENAME, EvalState, createRepl, ReplService } from './repl'; import { - EVAL_FILENAME, - EvalState, - createRepl, - ReplService - } from './repl' -import { VERSION, TSError, parse, register, createRequire, TSInternal } from './index' + VERSION, + TSError, + parse, + register, + createRequire, + TSInternal, +} from './index'; /** * Main `bin` functionality. */ -export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Record = {}) { +export function main( + argv: string[] = process.argv.slice(2), + entrypointArgs: Record = {} +) { const args = { ...entrypointArgs, - ...arg({ - // Node.js-like options. - '--eval': String, - '--interactive': Boolean, - '--print': Boolean, - '--require': [String], - - // CLI options. - '--help': Boolean, - '--cwd-mode': Boolean, - '--script-mode': Boolean, - '--version': arg.COUNT, - '--show-config': Boolean, - - // Project options. - '--cwd': String, - '--files': Boolean, - '--compiler': String, - '--compiler-options': parse, - '--project': String, - '--ignore-diagnostics': [String], - '--ignore': [String], - '--transpile-only': Boolean, - '--transpiler': String, - '--type-check': Boolean, - '--compiler-host': Boolean, - '--pretty': Boolean, - '--skip-project': Boolean, - '--skip-ignore': Boolean, - '--prefer-ts-exts': Boolean, - '--log-error': Boolean, - '--emit': Boolean, - - // Aliases. - '-e': '--eval', - '-i': '--interactive', - '-p': '--print', - '-r': '--require', - '-h': '--help', - '-s': '--script-mode', - '-v': '--version', - '-T': '--transpile-only', - '-H': '--compiler-host', - '-I': '--ignore', - '-P': '--project', - '-C': '--compiler', - '-D': '--ignore-diagnostics', - '-O': '--compiler-options', - '--dir': '--cwd', - '--showConfig': '--show-config' - }, { - argv, - stopAtPositional: true - }) - } + ...arg( + { + // Node.js-like options. + '--eval': String, + '--interactive': Boolean, + '--print': Boolean, + '--require': [String], + + // CLI options. + '--help': Boolean, + '--cwd-mode': Boolean, + '--script-mode': Boolean, + '--version': arg.COUNT, + '--show-config': Boolean, + + // Project options. + '--cwd': String, + '--files': Boolean, + '--compiler': String, + '--compiler-options': parse, + '--project': String, + '--ignore-diagnostics': [String], + '--ignore': [String], + '--transpile-only': Boolean, + '--transpiler': String, + '--type-check': Boolean, + '--compiler-host': Boolean, + '--pretty': Boolean, + '--skip-project': Boolean, + '--skip-ignore': Boolean, + '--prefer-ts-exts': Boolean, + '--log-error': Boolean, + '--emit': Boolean, + + // Aliases. + '-e': '--eval', + '-i': '--interactive', + '-p': '--print', + '-r': '--require', + '-h': '--help', + '-s': '--script-mode', + '-v': '--version', + '-T': '--transpile-only', + '-H': '--compiler-host', + '-I': '--ignore', + '-P': '--project', + '-C': '--compiler', + '-D': '--ignore-diagnostics', + '-O': '--compiler-options', + '--dir': '--cwd', + '--showConfig': '--show-config', + }, + { + argv, + stopAtPositional: true, + } + ), + }; // Only setting defaults for CLI-specific flags // Anything passed to `register()` can be `undefined`; `create()` will apply @@ -103,8 +111,8 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re '--skip-ignore': skipIgnore, '--prefer-ts-exts': preferTsExts, '--log-error': logError, - '--emit': emit - } = args + '--emit': emit, + } = args; if (help) { console.log(` @@ -138,23 +146,23 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re --skip-ignore Skip \`--ignore\` checks --prefer-ts-exts Prefer importing TypeScript files over JavaScript files --log-error Logs TypeScript errors to stderr instead of throwing exceptions - `) + `); - process.exit(0) + process.exit(0); } // Output project information. if (version === 1) { - console.log(`v${VERSION}`) - process.exit(0) + console.log(`v${VERSION}`); + process.exit(0); } - const cwd = cwdArg || process.cwd() + const cwd = cwdArg || process.cwd(); /** Unresolved. May point to a symlink, not realpath. May be missing file extension */ - const scriptPath = args._.length ? resolve(cwd, args._[0]) : undefined - const state = new EvalState(scriptPath || join(cwd, EVAL_FILENAME)) - const replService = createRepl({ state }) - const { evalAwarePartialHost } = replService + const scriptPath = args._.length ? resolve(cwd, args._[0]) : undefined; + const state = new EvalState(scriptPath || join(cwd, EVAL_FILENAME)); + const replService = createRepl({ state }); + const { evalAwarePartialHost } = replService; // Register the TypeScript compiler instance. const service = register({ @@ -162,7 +170,7 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re emit, files, pretty, - transpileOnly: transpileOnly ?? transpiler != null ? true : undefined, // tslint:disable-line:strict-type-predicates + transpileOnly: transpileOnly ?? transpiler != null ? true : undefined, typeCheck, transpiler, compilerHost, @@ -178,66 +186,80 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re compilerOptions, require: argsRequire, readFile: code !== undefined ? evalAwarePartialHost.readFile : undefined, - fileExists: code !== undefined ? evalAwarePartialHost.fileExists : undefined - }) + fileExists: + code !== undefined ? evalAwarePartialHost.fileExists : undefined, + }); // Bind REPL service to ts-node compiler service (chicken-and-egg problem) - replService.setService(service) + replService.setService(service); // Output project information. if (version >= 2) { - console.log(`ts-node v${VERSION}`) - console.log(`node ${process.version}`) - console.log(`compiler v${service.ts.version}`) - process.exit(0) + console.log(`ts-node v${VERSION}`); + console.log(`node ${process.version}`); + console.log(`compiler v${service.ts.version}`); + process.exit(0); } if (showConfig) { - const ts = service.ts as any as TSInternal - if (typeof ts.convertToTSConfig !== 'function') { // tslint:disable-line:strict-type-predicates - console.error('Error: --show-config requires a typescript versions >=3.2 that support --showConfig') - process.exit(1) + const ts = (service.ts as any) as TSInternal; + if (typeof ts.convertToTSConfig !== 'function') { + console.error( + 'Error: --show-config requires a typescript versions >=3.2 that support --showConfig' + ); + process.exit(1); } - const json = ts.convertToTSConfig(service.config, service.configFilePath ?? join(cwd, 'ts-node-implicit-tsconfig.json'), service.ts.sys) + const json = ts.convertToTSConfig( + service.config, + service.configFilePath ?? join(cwd, 'ts-node-implicit-tsconfig.json'), + service.ts.sys + ); json['ts-node'] = { ...service.options, experimentalEsmLoader: undefined, compilerOptions: undefined, - project: service.configFilePath ?? service.options.project - } + project: service.configFilePath ?? service.options.project, + }; console.log( // Assumes that all configuration options which can possibly be specified via the CLI are JSON-compatible. // If, in the future, we must log functions, for example readFile and fileExists, then we can implement a JSON // replacer function. JSON.stringify(json, null, 2) - ) - process.exit(0) + ); + process.exit(0); } // Create a local module instance based on `cwd`. - const module = new Module(state.path) - module.filename = state.path - module.paths = (Module as any)._nodeModulePaths(cwd) + const module = new Module(state.path); + module.filename = state.path; + module.paths = (Module as any)._nodeModulePaths(cwd); // Prepend `ts-node` arguments to CLI for child processes. - process.execArgv.unshift(__filename, ...process.argv.slice(2, process.argv.length - args._.length)) - process.argv = [process.argv[1]].concat(scriptPath || []).concat(args._.slice(1)) + process.execArgv.unshift( + __filename, + ...process.argv.slice(2, process.argv.length - args._.length) + ); + process.argv = [process.argv[1]] + .concat(scriptPath || []) + .concat(args._.slice(1)); // Execute the main contents (either eval, script or piped). if (code !== undefined && !interactive) { - evalAndExit(replService, module, code, print) + evalAndExit(replService, module, code, print); } else { if (args._.length) { - Module.runMain() + Module.runMain(); } else { // Piping of execution _only_ occurs when no other script is specified. // --interactive flag forces REPL if (interactive || process.stdin.isTTY) { - replService.start(code) + replService.start(code); } else { - let buffer = code || '' - process.stdin.on('data', (chunk: Buffer) => buffer += chunk) - process.stdin.on('end', () => evalAndExit(replService, module, buffer, print)) + let buffer = code || ''; + process.stdin.on('data', (chunk: Buffer) => (buffer += chunk)); + process.stdin.on('end', () => + evalAndExit(replService, module, buffer, print) + ); } } } @@ -246,18 +268,23 @@ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Re /** * Get project search path from args. */ -function getProjectSearchDir (cwd?: string, scriptMode?: boolean, cwdMode?: boolean, scriptPath?: string) { +function getProjectSearchDir( + cwd?: string, + scriptMode?: boolean, + cwdMode?: boolean, + scriptPath?: string +) { // Validate `--script-mode` / `--cwd-mode` / `--cwd` usage is correct. if (scriptMode && cwdMode) { - throw new TypeError('--cwd-mode cannot be combined with --script-mode') + throw new TypeError('--cwd-mode cannot be combined with --script-mode'); } if (scriptMode && !scriptPath) { - throw new TypeError('--script-mode must be used with a script name, e.g. `ts-node --script-mode `') + throw new TypeError( + '--script-mode must be used with a script name, e.g. `ts-node --script-mode `' + ); } const doScriptMode = - scriptMode === true ? true - : cwdMode === true ? false - : !!scriptPath + scriptMode === true ? true : cwdMode === true ? false : !!scriptPath; if (doScriptMode) { // Use node's own resolution behavior to ensure we follow symlinks. // scriptPath may omit file extension or point to a directory with or without package.json. @@ -266,28 +293,28 @@ function getProjectSearchDir (cwd?: string, scriptMode?: boolean, cwdMode?: bool // because we do not yet know preferTsExts, jsx, nor allowJs. // See also, justification why this will not happen in real-world situations: // https://github.com/TypeStrong/ts-node/pull/1009#issuecomment-613017081 - const exts = ['.js', '.jsx', '.ts', '.tsx'] - const extsTemporarilyInstalled: string[] = [] + const exts = ['.js', '.jsx', '.ts', '.tsx']; + const extsTemporarilyInstalled: string[] = []; for (const ext of exts) { - if (!hasOwnProperty(require.extensions, ext)) { // tslint:disable-line - extsTemporarilyInstalled.push(ext) - require.extensions[ext] = function() {} // tslint:disable-line + if (!hasOwnProperty(require.extensions, ext)) { + extsTemporarilyInstalled.push(ext); + require.extensions[ext] = function () {}; } } try { - return dirname(requireResolveNonCached(scriptPath!)) + return dirname(requireResolveNonCached(scriptPath!)); } finally { for (const ext of extsTemporarilyInstalled) { - delete require.extensions[ext] // tslint:disable-line + delete require.extensions[ext]; } } } - return cwd + return cwd; } -const guaranteedNonexistentDirectoryPrefix = resolve(__dirname, 'doesnotexist') -let guaranteedNonexistentDirectorySuffix = 0 +const guaranteedNonexistentDirectoryPrefix = resolve(__dirname, 'doesnotexist'); +let guaranteedNonexistentDirectorySuffix = 0; /** * require.resolve an absolute path, tricking node into *not* caching the results. @@ -296,54 +323,66 @@ let guaranteedNonexistentDirectorySuffix = 0 * Is a terrible hack, because node does not expose the necessary cache invalidation APIs * https://stackoverflow.com/questions/59865584/how-to-invalidate-cached-require-resolve-results */ -function requireResolveNonCached (absoluteModuleSpecifier: string) { +function requireResolveNonCached(absoluteModuleSpecifier: string) { // node 10 and 11 fallback: The trick below triggers a node 10 & 11 bug // On those node versions, pollute the require cache instead. This is a deliberate // ts-node limitation that will *rarely* manifest, and will not matter once node 10 // is end-of-life'd on 2021-04-30 - const isSupportedNodeVersion = parseInt(process.versions.node.split('.')[0], 10) >= 12 - if (!isSupportedNodeVersion) return require.resolve(absoluteModuleSpecifier) - - const { dir, base } = parsePath(absoluteModuleSpecifier) - const relativeModuleSpecifier = `./${base}` - - const req = createRequire(join(dir, 'imaginaryUncacheableRequireResolveScript')) - return req.resolve(relativeModuleSpecifier, { paths: [`${ guaranteedNonexistentDirectoryPrefix }${ guaranteedNonexistentDirectorySuffix++ }`, ...req.resolve.paths(relativeModuleSpecifier) || []] }) + const isSupportedNodeVersion = + parseInt(process.versions.node.split('.')[0], 10) >= 12; + if (!isSupportedNodeVersion) return require.resolve(absoluteModuleSpecifier); + + const { dir, base } = parsePath(absoluteModuleSpecifier); + const relativeModuleSpecifier = `./${base}`; + + const req = createRequire( + join(dir, 'imaginaryUncacheableRequireResolveScript') + ); + return req.resolve(relativeModuleSpecifier, { + paths: [ + `${guaranteedNonexistentDirectoryPrefix}${guaranteedNonexistentDirectorySuffix++}`, + ...(req.resolve.paths(relativeModuleSpecifier) || []), + ], + }); } /** * Evaluate a script. */ -function evalAndExit (replService: ReplService, module: Module, code: string, isPrinted: boolean) { - let result: any - - ;(global as any).__filename = module.filename - ;(global as any).__dirname = dirname(module.filename) - ;(global as any).exports = module.exports - ;(global as any).module = module - ;(global as any).require = module.require.bind(module) +function evalAndExit( + replService: ReplService, + module: Module, + code: string, + isPrinted: boolean +) { + let result: any; + (global as any).__filename = module.filename; + (global as any).__dirname = dirname(module.filename); + (global as any).exports = module.exports; + (global as any).module = module; + (global as any).require = module.require.bind(module); try { - result = replService.evalCode(code) + result = replService.evalCode(code); } catch (error) { if (error instanceof TSError) { - console.error(error) - process.exit(1) + console.error(error); + process.exit(1); } - throw error + throw error; } if (isPrinted) { - console.log(typeof result === 'string' ? result : inspect(result)) + console.log(typeof result === 'string' ? result : inspect(result)); } } /** Safe `hasOwnProperty` */ -function hasOwnProperty (object: any, property: string): boolean { - return Object.prototype.hasOwnProperty.call(object, property) +function hasOwnProperty(object: any, property: string): boolean { + return Object.prototype.hasOwnProperty.call(object, property); } if (require.main === module) { - main() + main(); } diff --git a/src/esm.ts b/src/esm.ts index a00b2110e..6cc64e86c 100644 --- a/src/esm.ts +++ b/src/esm.ts @@ -1,103 +1,133 @@ -import { register, getExtensions, RegisterOptions } from './index' -import { parse as parseUrl, format as formatUrl, UrlWithStringQuery, fileURLToPath, pathToFileURL } from 'url' -import { extname } from 'path' -import * as assert from 'assert' -const { createResolve } = require('../dist-raw/node-esm-resolve-implementation') +import { register, getExtensions, RegisterOptions } from './index'; +import { + parse as parseUrl, + format as formatUrl, + UrlWithStringQuery, + fileURLToPath, + pathToFileURL, +} from 'url'; +import { extname } from 'path'; +import * as assert from 'assert'; +const { + createResolve, +} = require('../dist-raw/node-esm-resolve-implementation'); // Note: On Windows, URLs look like this: file:///D:/dev/@TypeStrong/ts-node-examples/foo.ts -export function registerAndCreateEsmHooks (opts?: RegisterOptions) { +export function registerAndCreateEsmHooks(opts?: RegisterOptions) { // Automatically performs registration just like `-r ts-node/register` const tsNodeInstance = register({ ...opts, - experimentalEsmLoader: true - }) + experimentalEsmLoader: true, + }); // Custom implementation that considers additional file extensions and automatically adds file extensions const nodeResolveImplementation = createResolve({ ...getExtensions(tsNodeInstance.config), - preferTsExts: tsNodeInstance.options.preferTsExts - }) + preferTsExts: tsNodeInstance.options.preferTsExts, + }); - return { resolve, getFormat, transformSource } + return { resolve, getFormat, transformSource }; - function isFileUrlOrNodeStyleSpecifier (parsed: UrlWithStringQuery) { + function isFileUrlOrNodeStyleSpecifier(parsed: UrlWithStringQuery) { // We only understand file:// URLs, but in node, the specifier can be a node-style `./foo` or `foo` - const { protocol } = parsed - return protocol === null || protocol === 'file:' + const { protocol } = parsed; + return protocol === null || protocol === 'file:'; } - async function resolve (specifier: string, context: {parentURL: string}, defaultResolve: typeof resolve): Promise<{url: string}> { + async function resolve( + specifier: string, + context: { parentURL: string }, + defaultResolve: typeof resolve + ): Promise<{ url: string }> { const defer = async () => { - const r = await defaultResolve(specifier, context, defaultResolve) - return r - } + const r = await defaultResolve(specifier, context, defaultResolve); + return r; + }; - const parsed = parseUrl(specifier) - const { pathname, protocol, hostname } = parsed + const parsed = parseUrl(specifier); + const { pathname, protocol, hostname } = parsed; if (!isFileUrlOrNodeStyleSpecifier(parsed)) { - return defer() + return defer(); } if (protocol !== null && protocol !== 'file:') { - return defer() + return defer(); } // Malformed file:// URL? We should always see `null` or `''` if (hostname) { // TODO file://./foo sets `hostname` to `'.'`. Perhaps we should special-case this. - return defer() + return defer(); } // pathname is the path to be resolved - return nodeResolveImplementation.defaultResolve(specifier, context, defaultResolve) + return nodeResolveImplementation.defaultResolve( + specifier, + context, + defaultResolve + ); } - type Format = 'builtin' | 'commonjs' | 'dynamic' | 'json' | 'module' | 'wasm' - async function getFormat (url: string, context: {}, defaultGetFormat: typeof getFormat): Promise<{format: Format}> { - const defer = (overrideUrl: string = url) => defaultGetFormat(overrideUrl, context, defaultGetFormat) + type Format = 'builtin' | 'commonjs' | 'dynamic' | 'json' | 'module' | 'wasm'; + async function getFormat( + url: string, + context: {}, + defaultGetFormat: typeof getFormat + ): Promise<{ format: Format }> { + const defer = (overrideUrl: string = url) => + defaultGetFormat(overrideUrl, context, defaultGetFormat); - const parsed = parseUrl(url) + const parsed = parseUrl(url); if (!isFileUrlOrNodeStyleSpecifier(parsed)) { - return defer() + return defer(); } - const { pathname } = parsed - assert(pathname !== null, 'ESM getFormat() hook: URL should never have null pathname') + const { pathname } = parsed; + assert( + pathname !== null, + 'ESM getFormat() hook: URL should never have null pathname' + ); - const nativePath = fileURLToPath(url) + const nativePath = fileURLToPath(url); // If file has .ts, .tsx, or .jsx extension, then ask node how it would treat this file if it were .js - const ext = extname(nativePath) + const ext = extname(nativePath); if (ext !== '.js' && !tsNodeInstance.ignored(nativePath)) { - return defer(formatUrl(pathToFileURL(nativePath + '.js'))) + return defer(formatUrl(pathToFileURL(nativePath + '.js'))); } - return defer() + return defer(); } - async function transformSource (source: string | Buffer, context: {url: string, format: Format}, defaultTransformSource: typeof transformSource): Promise<{source: string | Buffer}> { - const defer = () => defaultTransformSource(source, context, defaultTransformSource) + async function transformSource( + source: string | Buffer, + context: { url: string; format: Format }, + defaultTransformSource: typeof transformSource + ): Promise<{ source: string | Buffer }> { + const defer = () => + defaultTransformSource(source, context, defaultTransformSource); - const sourceAsString = typeof source === 'string' ? source : source.toString('utf8') + const sourceAsString = + typeof source === 'string' ? source : source.toString('utf8'); - const { url } = context - const parsed = parseUrl(url) + const { url } = context; + const parsed = parseUrl(url); if (!isFileUrlOrNodeStyleSpecifier(parsed)) { - return defer() + return defer(); } - const nativePath = fileURLToPath(url) + const nativePath = fileURLToPath(url); if (tsNodeInstance.ignored(nativePath)) { - return defer() + return defer(); } - const emittedJs = tsNodeInstance.compile(sourceAsString, nativePath) + const emittedJs = tsNodeInstance.compile(sourceAsString, nativePath); - return { source: emittedJs } + return { source: emittedJs }; } } diff --git a/src/externs.d.ts b/src/externs.d.ts index d9257bd38..ebc98df01 100644 --- a/src/externs.d.ts +++ b/src/externs.d.ts @@ -1,4 +1,4 @@ declare module 'util.promisify' { - const _export: typeof import('util').promisify - export = _export + const _export: typeof import('util').promisify; + export = _export; } diff --git a/src/index.spec.ts b/src/index.spec.ts index 895c339bf..5369b164f 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,1000 +1,1269 @@ -import { test, TestInterface } from './testlib' -import { expect } from 'chai' -import { ChildProcess, exec as childProcessExec, ExecException, ExecOptions } from 'child_process' -import { join, resolve, sep as pathSep } from 'path' -import { tmpdir } from 'os' -import semver = require('semver') -import ts = require('typescript') -import proxyquire = require('proxyquire') -import type * as tsNodeTypes from './index' -import { unlinkSync, existsSync, lstatSync, mkdtempSync, fstat, copyFileSync, writeFileSync } from 'fs' -import * as promisify from 'util.promisify' -import { sync as rimrafSync } from 'rimraf' -import type _createRequire from 'create-require' -const createRequire: typeof _createRequire = require('create-require') -import { pathToFileURL } from 'url' -import Module = require('module') -import { PassThrough } from 'stream' -import * as getStream from 'get-stream' -import { once } from 'lodash' - -type TestExecReturn = { stdout: string, stderr: string, err: null | ExecException } -function exec (cmd: string, opts: ExecOptions = {}): Promise & { child: ChildProcess } { - let childProcess!: ChildProcess +import { test, TestInterface } from './testlib'; +import { expect } from 'chai'; +import { + ChildProcess, + exec as childProcessExec, + ExecException, + ExecOptions, +} from 'child_process'; +import { join, resolve, sep as pathSep } from 'path'; +import { tmpdir } from 'os'; +import semver = require('semver'); +import ts = require('typescript'); +import proxyquire = require('proxyquire'); +import type * as tsNodeTypes from './index'; +import { + unlinkSync, + existsSync, + lstatSync, + mkdtempSync, + fstat, + copyFileSync, + writeFileSync, +} from 'fs'; +import * as promisify from 'util.promisify'; +import { sync as rimrafSync } from 'rimraf'; +import type _createRequire from 'create-require'; +const createRequire: typeof _createRequire = require('create-require'); +import { pathToFileURL } from 'url'; +import Module = require('module'); +import { PassThrough } from 'stream'; +import * as getStream from 'get-stream'; +import { once } from 'lodash'; + +type TestExecReturn = { + stdout: string; + stderr: string; + err: null | ExecException; +}; +function exec( + cmd: string, + opts: ExecOptions = {} +): Promise & { child: ChildProcess } { + let childProcess!: ChildProcess; return Object.assign( new Promise((resolve, reject) => { - childProcess = childProcessExec(cmd, { - cwd: TEST_DIR, - ...opts - }, (error, stdout, stderr) => { - resolve({ err: error, stdout, stderr }) - }) + childProcess = childProcessExec( + cmd, + { + cwd: TEST_DIR, + ...opts, + }, + (error, stdout, stderr) => { + resolve({ err: error, stdout, stderr }); + } + ); }), { - child: childProcess + child: childProcess, } - ) + ); } -const ROOT_DIR = resolve(__dirname, '..') -const TEST_DIR = join(__dirname, '../tests') -const PROJECT = join(TEST_DIR, 'tsconfig.json') -const BIN_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node') -const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') -const BIN_CWD_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-cwd') +const ROOT_DIR = resolve(__dirname, '..'); +const TEST_DIR = join(__dirname, '../tests'); +const PROJECT = join(TEST_DIR, 'tsconfig.json'); +const BIN_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node'); +const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script'); +const BIN_CWD_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-cwd'); -const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ +const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/; // `createRequire` does not exist on older node versions -const testsDirRequire = createRequire(join(TEST_DIR, 'index.js')) // tslint:disable-line +const testsDirRequire = createRequire(join(TEST_DIR, 'index.js')); // Set after ts-node is installed locally -let { register, create, VERSION, createRepl }: typeof tsNodeTypes = {} as any +let { register, create, VERSION, createRepl }: typeof tsNodeTypes = {} as any; // Pack and install ts-node locally, necessary to test package "exports" test.beforeAll(async () => { - rimrafSync(join(TEST_DIR, 'node_modules')) - await promisify(childProcessExec)(`npm install`, { cwd: TEST_DIR }) - const packageLockPath = join(TEST_DIR, 'package-lock.json') - existsSync(packageLockPath) && unlinkSync(packageLockPath) - ; ({ register, create, VERSION, createRepl } = testsDirRequire('ts-node')) -}) + rimrafSync(join(TEST_DIR, 'node_modules')); + await promisify(childProcessExec)(`npm install`, { cwd: TEST_DIR }); + const packageLockPath = join(TEST_DIR, 'package-lock.json'); + existsSync(packageLockPath) && unlinkSync(packageLockPath); + ({ register, create, VERSION, createRepl } = testsDirRequire('ts-node')); +}); test.suite('ts-node', (test) => { - const cmd = `"${BIN_PATH}" --project "${PROJECT}"` - const cmdNoProject = `"${BIN_PATH}"` + const cmd = `"${BIN_PATH}" --project "${PROJECT}"`; + const cmdNoProject = `"${BIN_PATH}"`; test('should export the correct version', () => { - expect(VERSION).to.equal(require('../package.json').version) - }) + expect(VERSION).to.equal(require('../package.json').version); + }); test('should export all CJS entrypoints', () => { // Ensure our package.json "exports" declaration allows `require()`ing all our entrypoints // https://github.com/TypeStrong/ts-node/pull/1026 - testsDirRequire.resolve('ts-node') + testsDirRequire.resolve('ts-node'); // only reliably way to ask node for the root path of a dependency is Path.resolve(require.resolve('ts-node/package'), '..') - testsDirRequire.resolve('ts-node/package') - testsDirRequire.resolve('ts-node/package.json') + testsDirRequire.resolve('ts-node/package'); + testsDirRequire.resolve('ts-node/package.json'); // All bin entrypoints for people who need to augment our CLI: `node -r otherstuff ./node_modules/ts-node/dist/bin` - testsDirRequire.resolve('ts-node/dist/bin') - testsDirRequire.resolve('ts-node/dist/bin.js') - testsDirRequire.resolve('ts-node/dist/bin-transpile') - testsDirRequire.resolve('ts-node/dist/bin-transpile.js') - testsDirRequire.resolve('ts-node/dist/bin-script') - testsDirRequire.resolve('ts-node/dist/bin-script.js') - testsDirRequire.resolve('ts-node/dist/bin-cwd') - testsDirRequire.resolve('ts-node/dist/bin-cwd.js') + testsDirRequire.resolve('ts-node/dist/bin'); + testsDirRequire.resolve('ts-node/dist/bin.js'); + testsDirRequire.resolve('ts-node/dist/bin-transpile'); + testsDirRequire.resolve('ts-node/dist/bin-transpile.js'); + testsDirRequire.resolve('ts-node/dist/bin-script'); + testsDirRequire.resolve('ts-node/dist/bin-script.js'); + testsDirRequire.resolve('ts-node/dist/bin-cwd'); + testsDirRequire.resolve('ts-node/dist/bin-cwd.js'); // Must be `require()`able obviously - testsDirRequire.resolve('ts-node/register') - testsDirRequire.resolve('ts-node/register/files') - testsDirRequire.resolve('ts-node/register/transpile-only') - testsDirRequire.resolve('ts-node/register/type-check') + testsDirRequire.resolve('ts-node/register'); + testsDirRequire.resolve('ts-node/register/files'); + testsDirRequire.resolve('ts-node/register/transpile-only'); + testsDirRequire.resolve('ts-node/register/type-check'); // `node --loader ts-node/esm` - testsDirRequire.resolve('ts-node/esm') - testsDirRequire.resolve('ts-node/esm.mjs') - testsDirRequire.resolve('ts-node/esm/transpile-only') - testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') + testsDirRequire.resolve('ts-node/esm'); + testsDirRequire.resolve('ts-node/esm.mjs'); + testsDirRequire.resolve('ts-node/esm/transpile-only'); + testsDirRequire.resolve('ts-node/esm/transpile-only.mjs'); - testsDirRequire.resolve('ts-node/transpilers/swc-experimental') + testsDirRequire.resolve('ts-node/transpilers/swc-experimental'); - testsDirRequire.resolve('ts-node/node10/tsconfig.json') - testsDirRequire.resolve('ts-node/node12/tsconfig.json') - testsDirRequire.resolve('ts-node/node14/tsconfig.json') - }) + testsDirRequire.resolve('ts-node/node10/tsconfig.json'); + testsDirRequire.resolve('ts-node/node12/tsconfig.json'); + testsDirRequire.resolve('ts-node/node14/tsconfig.json'); + }); test.suite('cli', (test) => { test('should execute cli', async () => { - const { err, stdout } = await exec(`${cmd} hello-world`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - }) + const { err, stdout } = await exec(`${cmd} hello-world`); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, world!\n'); + }); test('shows usage via --help', async () => { - const { err, stdout } = await exec(`${cmdNoProject} --help`) - expect(err).to.equal(null) - expect(stdout).to.match(/Usage: ts-node /) - }) + const { err, stdout } = await exec(`${cmdNoProject} --help`); + expect(err).to.equal(null); + expect(stdout).to.match(/Usage: ts-node /); + }); test('shows version via -v', async () => { - const { err, stdout } = await exec(`${cmdNoProject} -v`) - expect(err).to.equal(null) - expect(stdout.trim()).to.equal('v' + testsDirRequire('ts-node/package').version) - }) + const { err, stdout } = await exec(`${cmdNoProject} -v`); + expect(err).to.equal(null); + expect(stdout.trim()).to.equal( + 'v' + testsDirRequire('ts-node/package').version + ); + }); test('shows version of compiler via -vv', async () => { - const { err, stdout } = await exec(`${cmdNoProject} -vv`) - expect(err).to.equal(null) + const { err, stdout } = await exec(`${cmdNoProject} -vv`); + expect(err).to.equal(null); expect(stdout.trim()).to.equal( `ts-node v${testsDirRequire('ts-node/package').version}\n` + - `node ${process.version}\n` + - `compiler v${testsDirRequire('typescript/package').version}` - ) - }) + `node ${process.version}\n` + + `compiler v${testsDirRequire('typescript/package').version}` + ); + }); test('should register via cli', async () => { - const { err, stdout } = await exec(`node -r ts-node/register hello-world.ts`, { - cwd: TEST_DIR - }) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - }) + const { err, stdout } = await exec( + `node -r ts-node/register hello-world.ts`, + { + cwd: TEST_DIR, + } + ); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, world!\n'); + }); test('should execute cli with absolute path', async () => { - const { err, stdout } = await exec(`${cmd} "${join(TEST_DIR, 'hello-world')}"`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - }) + const { err, stdout } = await exec( + `${cmd} "${join(TEST_DIR, 'hello-world')}"` + ); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, world!\n'); + }); test('should print scripts', async () => { - const { err, stdout } = await exec(`${cmd} -pe "import { example } from './complex/index';example()"`) - expect(err).to.equal(null) - expect(stdout).to.equal('example\n') - }) + const { err, stdout } = await exec( + `${cmd} -pe "import { example } from './complex/index';example()"` + ); + expect(err).to.equal(null); + expect(stdout).to.equal('example\n'); + }); test('should provide registered information globally', async () => { - const { err, stdout } = await exec(`${cmd} env`) - expect(err).to.equal(null) - expect(stdout).to.equal('object\n') - }) + const { err, stdout } = await exec(`${cmd} env`); + expect(err).to.equal(null); + expect(stdout).to.equal('object\n'); + }); test('should provide registered information on register', async () => { const { err, stdout } = await exec(`node -r ts-node/register env.ts`, { - cwd: TEST_DIR - }) - expect(err).to.equal(null) - expect(stdout).to.equal('object\n') - }) + cwd: TEST_DIR, + }); + expect(err).to.equal(null); + expect(stdout).to.equal('object\n'); + }); if (semver.gte(ts.version, '1.8.0')) { test('should allow js', async () => { const { err, stdout } = await exec( [ cmd, - '-O "{\\\"allowJs\\\":true}"', - '-pe "import { main } from \'./allow-js/run\';main()"' - ].join(' ')) - expect(err).to.equal(null) - expect(stdout).to.equal('hello world\n') - } - ) + '-O "{\\"allowJs\\":true}"', + '-pe "import { main } from \'./allow-js/run\';main()"', + ].join(' ') + ); + expect(err).to.equal(null); + expect(stdout).to.equal('hello world\n'); + }); test('should include jsx when `allow-js` true', async () => { const { err, stdout } = await exec( [ cmd, - '-O "{\\\"allowJs\\\":true}"', - '-pe "import { Foo2 } from \'./allow-js/with-jsx\'; Foo2.sayHi()"' - ].join(' ')) - expect(err).to.equal(null) - expect(stdout).to.equal('hello world\n') - }) + '-O "{\\"allowJs\\":true}"', + '-pe "import { Foo2 } from \'./allow-js/with-jsx\'; Foo2.sayHi()"', + ].join(' ') + ); + expect(err).to.equal(null); + expect(stdout).to.equal('hello world\n'); + }); } test('should eval code', async () => { const { err, stdout } = await exec( - `${cmd} -e "import * as m from './module';console.log(m.example('test'))"`) - expect(err).to.equal(null) - expect(stdout).to.equal('TEST\n') - }) + `${cmd} -e "import * as m from './module';console.log(m.example('test'))"` + ); + expect(err).to.equal(null); + expect(stdout).to.equal('TEST\n'); + }); test('should import empty files', async () => { - const { err, stdout } = await exec(`${cmd} -e "import './empty'"`) - expect(err).to.equal(null) - expect(stdout).to.equal('') - }) + const { err, stdout } = await exec(`${cmd} -e "import './empty'"`); + expect(err).to.equal(null); + expect(stdout).to.equal(''); + }); test('should throw errors', async () => { - const { err } = await exec(`${cmd} -e "import * as m from './module';console.log(m.example(123))"`) + const { err } = await exec( + `${cmd} -e "import * as m from './module';console.log(m.example(123))"` + ); if (err === null) { - throw new Error('Command was expected to fail, but it succeeded.') + throw new Error('Command was expected to fail, but it succeeded.'); } - expect(err.message).to.match(new RegExp( - 'TS2345: Argument of type \'(?:number|123)\' ' + - 'is not assignable to parameter of type \'string\'\\.' - )) - }) + expect(err.message).to.match( + new RegExp( + "TS2345: Argument of type '(?:number|123)' " + + "is not assignable to parameter of type 'string'\\." + ) + ); + }); test('should be able to ignore diagnostic', async () => { const { err } = await exec( - `${cmd} --ignore-diagnostics 2345 -e "import * as m from './module';console.log(m.example(123))"`) + `${cmd} --ignore-diagnostics 2345 -e "import * as m from './module';console.log(m.example(123))"` + ); if (err === null) { - throw new Error('Command was expected to fail, but it succeeded.') + throw new Error('Command was expected to fail, but it succeeded.'); } expect(err.message).to.match( /TypeError: (?:(?:undefined|foo\.toUpperCase) is not a function|.*has no method \'toUpperCase\')/ - ) - }) + ); + }); test('should work with source maps', async () => { - const { err } = await exec(`${cmd} throw`) + const { err } = await exec(`${cmd} throw`); if (err === null) { - throw new Error('Command was expected to fail, but it succeeded.') + throw new Error('Command was expected to fail, but it succeeded.'); } - expect(err.message).to.contain([ - `${join(TEST_DIR, 'throw.ts')}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^', - 'Error: this is a demo' - ].join('\n')) - }) + expect(err.message).to.contain( + [ + `${join(TEST_DIR, 'throw.ts')}:100`, + " bar () { throw new Error('this is a demo') }", + ' ^', + 'Error: this is a demo', + ].join('\n') + ); + }); test('eval should work with source maps', async () => { - const { err } = await exec(`${cmd} -pe "import './throw'"`) + const { err } = await exec(`${cmd} -pe "import './throw'"`); if (err === null) { - throw new Error('Command was expected to fail, but it succeeded.') + throw new Error('Command was expected to fail, but it succeeded.'); } - expect(err.message).to.contain([ - `${join(TEST_DIR, 'throw.ts')}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^' - ].join('\n')) - }) + expect(err.message).to.contain( + [ + `${join(TEST_DIR, 'throw.ts')}:100`, + " bar () { throw new Error('this is a demo') }", + ' ^', + ].join('\n') + ); + }); test('should support transpile only mode', async () => { - const { err } = await exec(`${cmd} --transpile-only -pe "x"`) + const { err } = await exec(`${cmd} --transpile-only -pe "x"`); if (err === null) { - throw new Error('Command was expected to fail, but it succeeded.') + throw new Error('Command was expected to fail, but it succeeded.'); } - expect(err.message).to.contain('ReferenceError: x is not defined') - }) + expect(err.message).to.contain('ReferenceError: x is not defined'); + }); test('should throw error even in transpileOnly mode', async () => { - const { err } = await exec(`${cmd} --transpile-only -pe "console."`) + const { err } = await exec(`${cmd} --transpile-only -pe "console."`); if (err === null) { - throw new Error('Command was expected to fail, but it succeeded.') + throw new Error('Command was expected to fail, but it succeeded.'); } - expect(err.message).to.contain('error TS1003: Identifier expected') - }) + expect(err.message).to.contain('error TS1003: Identifier expected'); + }); test('should support third-party transpilers via --transpiler', async () => { - const { err, stdout } = await exec(`${cmdNoProject} --transpiler ts-node/transpilers/swc-experimental transpile-only-swc`) - expect(err).to.equal(null) - expect(stdout).to.contain('hello world') - }) + const { err, stdout } = await exec( + `${cmdNoProject} --transpiler ts-node/transpilers/swc-experimental transpile-only-swc` + ); + expect(err).to.equal(null); + expect(stdout).to.contain('hello world'); + }); test('should support third-party transpilers via tsconfig', async () => { - const { err, stdout } = await exec(`${cmdNoProject} transpile-only-swc-via-tsconfig`) - expect(err).to.equal(null) - expect(stdout).to.contain('hello world') - }) + const { err, stdout } = await exec( + `${cmdNoProject} transpile-only-swc-via-tsconfig` + ); + expect(err).to.equal(null); + expect(stdout).to.contain('hello world'); + }); test('should pipe into `ts-node` and evaluate', async () => { - const execPromise = exec(cmd) - execPromise.child.stdin!.end("console.log('hello')") - const { err, stdout } = await execPromise - expect(err).to.equal(null) - expect(stdout).to.equal('hello\n') - }) + const execPromise = exec(cmd); + execPromise.child.stdin!.end("console.log('hello')"); + const { err, stdout } = await execPromise; + expect(err).to.equal(null); + expect(stdout).to.equal('hello\n'); + }); test('should pipe into `ts-node`', async () => { - const execPromise = exec(`${cmd} -p`) - execPromise.child.stdin!.end('true') - const { err, stdout } = await execPromise - expect(err).to.equal(null) - expect(stdout).to.equal('true\n') - - }) + const execPromise = exec(`${cmd} -p`); + execPromise.child.stdin!.end('true'); + const { err, stdout } = await execPromise; + expect(err).to.equal(null); + expect(stdout).to.equal('true\n'); + }); test('should pipe into an eval script', async () => { - const execPromise = exec(`${cmd} --transpile-only -pe "process.stdin.isTTY"`) - execPromise.child.stdin!.end('true') - const { err, stdout } = await execPromise - expect(err).to.equal(null) - expect(stdout).to.equal('undefined\n') - - }) + const execPromise = exec( + `${cmd} --transpile-only -pe "process.stdin.isTTY"` + ); + execPromise.child.stdin!.end('true'); + const { err, stdout } = await execPromise; + expect(err).to.equal(null); + expect(stdout).to.equal('undefined\n'); + }); test('should run REPL when --interactive passed and stdin is not a TTY', async () => { - const execPromise = exec(`${cmd} --interactive`) - execPromise.child.stdin!.end('console.log("123")\n') - const { err, stdout } = await execPromise - expect(err).to.equal(null) - expect(stdout).to.equal( - '> 123\n' + - 'undefined\n' + - '> ' - ) - - }) + const execPromise = exec(`${cmd} --interactive`); + execPromise.child.stdin!.end('console.log("123")\n'); + const { err, stdout } = await execPromise; + expect(err).to.equal(null); + expect(stdout).to.equal('> 123\n' + 'undefined\n' + '> '); + }); test('REPL has command to get type information', async () => { - const execPromise = exec(`${cmd} --interactive`) - execPromise.child.stdin!.end('\nconst a = 123\n.type a') - const { err, stdout } = await execPromise - expect(err).to.equal(null) + const execPromise = exec(`${cmd} --interactive`); + execPromise.child.stdin!.end('\nconst a = 123\n.type a'); + const { err, stdout } = await execPromise; + expect(err).to.equal(null); expect(stdout).to.equal( - '> \'use strict\'\n' + - '> undefined\n' + - '> const a: 123\n' + - '> ' - ) - }) + "> 'use strict'\n" + '> undefined\n' + '> const a: 123\n' + '> ' + ); + }); // Serial because it's timing-sensitive test.serial('REPL can be created via API', async () => { - const stdin = new PassThrough() - const stdout = new PassThrough() - const stderr = new PassThrough() + const stdin = new PassThrough(); + const stdout = new PassThrough(); + const stderr = new PassThrough(); const replService = createRepl({ stdin, stdout, - stderr - }) + stderr, + }); const service = create({ ...replService.evalAwarePartialHost, - project: `${ TEST_DIR }/tsconfig.json` - }) - replService.setService(service) - replService.start() - stdin.write('\nconst a = 123\n.type a\n') - stdin.end() - await promisify(setTimeout)(1e3) - stdout.end() - stderr.end() - expect(await getStream(stderr)).to.equal('') + project: `${TEST_DIR}/tsconfig.json`, + }); + replService.setService(service); + replService.start(); + stdin.write('\nconst a = 123\n.type a\n'); + stdin.end(); + await promisify(setTimeout)(1e3); + stdout.end(); + stderr.end(); + expect(await getStream(stderr)).to.equal(''); expect(await getStream(stdout)).to.equal( - '> \'use strict\'\n' + - '> undefined\n' + - '> const a: 123\n' + - '> ' - ) - }) + "> 'use strict'\n" + '> undefined\n' + '> const a: 123\n' + '> ' + ); + }); test('should support require flags', async () => { - const { err, stdout } = await exec(`${cmd} -r ./hello-world -pe "console.log('success')"`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n') - }) + const { err, stdout } = await exec( + `${cmd} -r ./hello-world -pe "console.log('success')"` + ); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n'); + }); test('should support require from node modules', async () => { - const { err, stdout } = await exec(`${cmd} -r typescript -e "console.log('success')"`) - expect(err).to.equal(null) - expect(stdout).to.equal('success\n') - }) + const { err, stdout } = await exec( + `${cmd} -r typescript -e "console.log('success')"` + ); + expect(err).to.equal(null); + expect(stdout).to.equal('success\n'); + }); test('should use source maps with react tsx', async () => { - const { err, stdout } = await exec(`${cmd} throw-react-tsx.tsx`) - expect(err).not.to.equal(null) - expect(err!.message).to.contain([ - `${join(TEST_DIR, './throw-react-tsx.tsx')}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^', - 'Error: this is a demo' - ].join('\n')) - }) + const { err, stdout } = await exec(`${cmd} throw-react-tsx.tsx`); + expect(err).not.to.equal(null); + expect(err!.message).to.contain( + [ + `${join(TEST_DIR, './throw-react-tsx.tsx')}:100`, + " bar () { throw new Error('this is a demo') }", + ' ^', + 'Error: this is a demo', + ].join('\n') + ); + }); test('should allow custom typings', async () => { - const { err, stdout } = await exec(`${cmd} custom-types`) - expect(err).to.match(/Error: Cannot find module 'does-not-exist'/) - }) + const { err, stdout } = await exec(`${cmd} custom-types`); + expect(err).to.match(/Error: Cannot find module 'does-not-exist'/); + }); test('should preserve `ts-node` context with child process', async () => { - const { err, stdout } = await exec(`${cmd} child-process`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - }) + const { err, stdout } = await exec(`${cmd} child-process`); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, world!\n'); + }); test('should import js before ts by default', async () => { - const { err, stdout } = await exec(`${cmd} import-order/compiled`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, JavaScript!\n') - }) - - const preferTsExtsEntrypoint = semver.gte(process.version, '12.0.0') ? 'import-order/compiled' : 'import-order/require-compiled' + const { err, stdout } = await exec(`${cmd} import-order/compiled`); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, JavaScript!\n'); + }); + + const preferTsExtsEntrypoint = semver.gte(process.version, '12.0.0') + ? 'import-order/compiled' + : 'import-order/require-compiled'; test('should import ts before js when --prefer-ts-exts flag is present', async () => { - - const { err, stdout } = await exec(`${cmd} --prefer-ts-exts ${preferTsExtsEntrypoint}`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, TypeScript!\n') - }) + const { err, stdout } = await exec( + `${cmd} --prefer-ts-exts ${preferTsExtsEntrypoint}` + ); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, TypeScript!\n'); + }); test('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', async () => { - const { err, stdout } = await exec(`${cmd} ${preferTsExtsEntrypoint}`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, TypeScript!\n') - }) + const { err, stdout } = await exec(`${cmd} ${preferTsExtsEntrypoint}`, { + env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' }, + }); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, TypeScript!\n'); + }); test('should ignore .d.ts files', async () => { - const { err, stdout } = await exec(`${cmd} import-order/importer`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, World!\n') - }) + const { err, stdout } = await exec(`${cmd} import-order/importer`); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, World!\n'); + }); test.suite('issue #884', (test) => { test('should compile', async (t) => { // TODO disabled because it consistently fails on Windows on TS 2.7 - if (process.platform === 'win32' && semver.satisfies(ts.version, '2.7')) { - t.log('Skipping') - return + if ( + process.platform === 'win32' && + semver.satisfies(ts.version, '2.7') + ) { + t.log('Skipping'); + return; } else { - const { err, stdout } = await exec(`"${BIN_PATH}" --project issue-884/tsconfig.json issue-884`) - expect(err).to.equal(null) - expect(stdout).to.equal('') + const { err, stdout } = await exec( + `"${BIN_PATH}" --project issue-884/tsconfig.json issue-884` + ); + expect(err).to.equal(null); + expect(stdout).to.equal(''); } - }) - }) + }); + }); test.suite('issue #986', (test) => { test('should not compile', async () => { - const { err, stdout, stderr } = await exec(`"${BIN_PATH}" --project issue-986/tsconfig.json issue-986`) - expect(err).not.to.equal(null) - expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. - expect(stdout).to.equal('') - }) + const { err, stdout, stderr } = await exec( + `"${BIN_PATH}" --project issue-986/tsconfig.json issue-986` + ); + expect(err).not.to.equal(null); + expect(stderr).to.contain("Cannot find name 'TEST'"); // TypeScript error. + expect(stdout).to.equal(''); + }); test('should compile with `--files`', async () => { - const { err, stdout, stderr } = await exec(`"${BIN_PATH}" --files --project issue-986/tsconfig.json issue-986`) - expect(err).not.to.equal(null) - expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. - expect(stdout).to.equal('') - }) - }) + const { err, stdout, stderr } = await exec( + `"${BIN_PATH}" --files --project issue-986/tsconfig.json issue-986` + ); + expect(err).not.to.equal(null); + expect(stderr).to.contain('ReferenceError: TEST is not defined'); // Runtime error. + expect(stdout).to.equal(''); + }); + }); if (semver.gte(ts.version, '2.7.0')) { test('should locate tsconfig relative to entry-point by default', async () => { - const { err, stdout } = await exec(`${BIN_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-a/) - }) + const { err, stdout } = await exec(`${BIN_PATH} ../a/index`, { + cwd: join(TEST_DIR, 'cwd-and-script-mode/b'), + }); + expect(err).to.equal(null); + expect(stdout).to.match(/plugin-a/); + }); test('should locate tsconfig relative to entry-point via ts-node-script', async () => { - const { err, stdout } = await exec(`${BIN_SCRIPT_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-a/) - }) + const { err, stdout } = await exec(`${BIN_SCRIPT_PATH} ../a/index`, { + cwd: join(TEST_DIR, 'cwd-and-script-mode/b'), + }); + expect(err).to.equal(null); + expect(stdout).to.match(/plugin-a/); + }); test('should locate tsconfig relative to entry-point with --script-mode', async () => { - const { err, stdout } = await exec(`${BIN_PATH} --script-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-a/) - }) + const { err, stdout } = await exec( + `${BIN_PATH} --script-mode ../a/index`, + { + cwd: join(TEST_DIR, 'cwd-and-script-mode/b'), + } + ); + expect(err).to.equal(null); + expect(stdout).to.match(/plugin-a/); + }); test('should locate tsconfig relative to cwd via ts-node-cwd', async () => { - const { err, stdout } = await exec(`${BIN_CWD_PATH} ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-b/) - }) + const { err, stdout } = await exec(`${BIN_CWD_PATH} ../a/index`, { + cwd: join(TEST_DIR, 'cwd-and-script-mode/b'), + }); + expect(err).to.equal(null); + expect(stdout).to.match(/plugin-b/); + }); test('should locate tsconfig relative to cwd in --cwd-mode', async () => { - const { err, stdout } = await exec(`${BIN_PATH} --cwd-mode ../a/index`, { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') }) - expect(err).to.equal(null) - expect(stdout).to.match(/plugin-b/) - }) + const { err, stdout } = await exec( + `${BIN_PATH} --cwd-mode ../a/index`, + { cwd: join(TEST_DIR, 'cwd-and-script-mode/b') } + ); + expect(err).to.equal(null); + expect(stdout).to.match(/plugin-b/); + }); test('should locate tsconfig relative to realpath, not symlink, when entrypoint is a symlink', async (t) => { - if (lstatSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { - const { err, stdout } = await exec(`${BIN_PATH} main-realpath/symlink/symlink.tsx`) - expect(err).to.equal(null) - expect(stdout).to.equal('') + if ( + lstatSync( + join(TEST_DIR, 'main-realpath/symlink/symlink.tsx') + ).isSymbolicLink() + ) { + const { err, stdout } = await exec( + `${BIN_PATH} main-realpath/symlink/symlink.tsx` + ); + expect(err).to.equal(null); + expect(stdout).to.equal(''); } else { - t.log('Skipping') - return + t.log('Skipping'); + return; } - }) + }); } test.suite('should read ts-node options from tsconfig.json', (test) => { - const BIN_EXEC = `"${BIN_PATH}" --project tsconfig-options/tsconfig.json` + const BIN_EXEC = `"${BIN_PATH}" --project tsconfig-options/tsconfig.json`; test('should override compiler options from env', async () => { - const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { - env: { - ...process.env, - TS_NODE_COMPILER_OPTIONS: '{"typeRoots": ["env-typeroots"]}' + const { err, stdout } = await exec( + `${BIN_EXEC} tsconfig-options/log-options1.js`, + { + env: { + ...process.env, + TS_NODE_COMPILER_OPTIONS: '{"typeRoots": ["env-typeroots"]}', + }, } - }) - expect(err).to.equal(null) - const { config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/env-typeroots').replace(/\\/g, '/')]) - }) + ); + expect(err).to.equal(null); + const { config } = JSON.parse(stdout); + expect(config.options.typeRoots).to.deep.equal([ + join(TEST_DIR, './tsconfig-options/env-typeroots').replace( + /\\/g, + '/' + ), + ]); + }); test('should use options from `tsconfig.json`', async () => { - const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`) - expect(err).to.equal(null) - const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) - expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) - expect(options.pretty).to.equal(undefined) - expect(options.skipIgnore).to.equal(false) - expect(options.transpileOnly).to.equal(true) - expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) - }) + const { err, stdout } = await exec( + `${BIN_EXEC} tsconfig-options/log-options1.js` + ); + expect(err).to.equal(null); + const { options, config } = JSON.parse(stdout); + expect(config.options.typeRoots).to.deep.equal([ + join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace( + /\\/g, + '/' + ), + ]); + expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']); + expect(options.pretty).to.equal(undefined); + expect(options.skipIgnore).to.equal(false); + expect(options.transpileOnly).to.equal(true); + expect(options.require).to.deep.equal([ + join(TEST_DIR, './tsconfig-options/required1.js'), + ]); + }); test('should have flags override / merge with `tsconfig.json`', async () => { - const { err, stdout } = await exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tsconfig-options/required2.js tsconfig-options/log-options2.js`) - expect(err).to.equal(null) - const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) - expect(config.options.types).to.deep.equal(['flags-types']) - expect(options.pretty).to.equal(undefined) - expect(options.skipIgnore).to.equal(true) - expect(options.transpileOnly).to.equal(true) + const { err, stdout } = await exec( + `${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tsconfig-options/required2.js tsconfig-options/log-options2.js` + ); + expect(err).to.equal(null); + const { options, config } = JSON.parse(stdout); + expect(config.options.typeRoots).to.deep.equal([ + join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace( + /\\/g, + '/' + ), + ]); + expect(config.options.types).to.deep.equal(['flags-types']); + expect(options.pretty).to.equal(undefined); + expect(options.skipIgnore).to.equal(true); + expect(options.transpileOnly).to.equal(true); expect(options.require).to.deep.equal([ join(TEST_DIR, './tsconfig-options/required1.js'), - './tsconfig-options/required2.js' - ]) - }) + './tsconfig-options/required2.js', + ]); + }); test('should have `tsconfig.json` override environment', async () => { - const { err, stdout } = await exec(`${BIN_EXEC} tsconfig-options/log-options1.js`, { - env: { - ...process.env, - TS_NODE_PRETTY: 'true', - TS_NODE_SKIP_IGNORE: 'true' + const { err, stdout } = await exec( + `${BIN_EXEC} tsconfig-options/log-options1.js`, + { + env: { + ...process.env, + TS_NODE_PRETTY: 'true', + TS_NODE_SKIP_IGNORE: 'true', + }, } - }) - expect(err).to.equal(null) - const { options, config } = JSON.parse(stdout) - expect(config.options.typeRoots).to.deep.equal([join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) - expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) - expect(options.pretty).to.equal(true) - expect(options.skipIgnore).to.equal(false) - expect(options.transpileOnly).to.equal(true) - expect(options.require).to.deep.equal([join(TEST_DIR, './tsconfig-options/required1.js')]) - }) - }) - - test.suite('should use implicit @tsconfig/bases config when one is not loaded from disk', _test => { - const test = _test.context(async t => ({ - tempDir: mkdtempSync(join(tmpdir(), 'ts-node-spec')) - })) - if (semver.gte(ts.version, '3.5.0') && semver.gte(process.versions.node, '14.0.0')) { - test('implicitly uses @tsconfig/node14 compilerOptions when both TS and node versions support it', async t => { - const { context: { tempDir } } = t - const { err: err1, stdout: stdout1, stderr: stderr1 } = await exec(`${BIN_PATH} --showConfig`, { cwd: tempDir }) - expect(err1).to.equal(null) - t.like(JSON.parse(stdout1), { - compilerOptions: { - target: 'es2020', - lib: ['es2020'] - } - }) - const { err: err2, stdout: stdout2, stderr: stderr2 } = await exec(`${BIN_PATH} -pe 10n`, { cwd: tempDir }) - expect(err2).to.equal(null) - expect(stdout2).to.equal('10n\n') - }) - } else { - test('implicitly uses @tsconfig/* lower than node14 (node10 or node12) when either TS or node versions do not support @tsconfig/node14', async ({ context: { tempDir } }) => { - const { err, stdout, stderr } = await exec(`${BIN_PATH} -pe 10n`, { cwd: tempDir }) - expect(err).to.not.equal(null) - expect(stderr).to.match(/BigInt literals are not available when targeting lower than|error TS2304: Cannot find name 'n'/) - }) + ); + expect(err).to.equal(null); + const { options, config } = JSON.parse(stdout); + expect(config.options.typeRoots).to.deep.equal([ + join(TEST_DIR, './tsconfig-options/tsconfig-typeroots').replace( + /\\/g, + '/' + ), + ]); + expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']); + expect(options.pretty).to.equal(true); + expect(options.skipIgnore).to.equal(false); + expect(options.transpileOnly).to.equal(true); + expect(options.require).to.deep.equal([ + join(TEST_DIR, './tsconfig-options/required1.js'), + ]); + }); + }); + + test.suite( + 'should use implicit @tsconfig/bases config when one is not loaded from disk', + (_test) => { + const test = _test.context(async (t) => ({ + tempDir: mkdtempSync(join(tmpdir(), 'ts-node-spec')), + })); + if ( + semver.gte(ts.version, '3.5.0') && + semver.gte(process.versions.node, '14.0.0') + ) { + test('implicitly uses @tsconfig/node14 compilerOptions when both TS and node versions support it', async (t) => { + const { + context: { tempDir }, + } = t; + const { + err: err1, + stdout: stdout1, + stderr: stderr1, + } = await exec(`${BIN_PATH} --showConfig`, { cwd: tempDir }); + expect(err1).to.equal(null); + t.like(JSON.parse(stdout1), { + compilerOptions: { + target: 'es2020', + lib: ['es2020'], + }, + }); + const { + err: err2, + stdout: stdout2, + stderr: stderr2, + } = await exec(`${BIN_PATH} -pe 10n`, { cwd: tempDir }); + expect(err2).to.equal(null); + expect(stdout2).to.equal('10n\n'); + }); + } else { + test('implicitly uses @tsconfig/* lower than node14 (node10 or node12) when either TS or node versions do not support @tsconfig/node14', async ({ + context: { tempDir }, + }) => { + const { err, stdout, stderr } = await exec(`${BIN_PATH} -pe 10n`, { + cwd: tempDir, + }); + expect(err).to.not.equal(null); + expect(stderr).to.match( + /BigInt literals are not available when targeting lower than|error TS2304: Cannot find name 'n'/ + ); + }); + } } - }) + ); if (semver.gte(ts.version, '3.2.0')) { - test.suite('should bundle @tsconfig/bases to be used in your own tsconfigs', test => { - const macro = test.macro((nodeVersion: string) => async t => { - const config = require(`@tsconfig/${ nodeVersion }/tsconfig.json`) - const { err, stdout, stderr } = await exec(`${BIN_PATH} --showConfig -e 10n`, { cwd: join(TEST_DIR, 'tsconfig-bases', nodeVersion) }) - expect(err).to.equal(null) - t.like(JSON.parse(stdout), { - compilerOptions: { - target: config.compilerOptions.target, - lib: config.compilerOptions.lib - } - }) - }) - test(`ts-node/node10/tsconfig.json`, macro, 'node10') - test(`ts-node/node12/tsconfig.json`, macro, 'node12') - test(`ts-node/node14/tsconfig.json`, macro, 'node14') - }) + test.suite( + 'should bundle @tsconfig/bases to be used in your own tsconfigs', + (test) => { + const macro = test.macro((nodeVersion: string) => async (t) => { + const config = require(`@tsconfig/${nodeVersion}/tsconfig.json`); + const { err, stdout, stderr } = await exec( + `${BIN_PATH} --showConfig -e 10n`, + { + cwd: join(TEST_DIR, 'tsconfig-bases', nodeVersion), + } + ); + expect(err).to.equal(null); + t.like(JSON.parse(stdout), { + compilerOptions: { + target: config.compilerOptions.target, + lib: config.compilerOptions.lib, + }, + }); + }); + test(`ts-node/node10/tsconfig.json`, macro, 'node10'); + test(`ts-node/node12/tsconfig.json`, macro, 'node12'); + test(`ts-node/node14/tsconfig.json`, macro, 'node14'); + } + ); } test.suite('compiler host', (test) => { test('should execute cli', async () => { - const { err, stdout } = await exec(`${cmd} --compiler-host hello-world`) - expect(err).to.equal(null) - expect(stdout).to.equal('Hello, world!\n') - }) - }) + const { err, stdout } = await exec( + `${cmd} --compiler-host hello-world` + ); + expect(err).to.equal(null); + expect(stdout).to.equal('Hello, world!\n'); + }); + }); test('should transpile files inside a node_modules directory when not ignored', async () => { - const { err, stdout, stderr } = await exec(`${cmdNoProject} from-node-modules/from-node-modules`) - if (err) throw new Error(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) + const { err, stdout, stderr } = await exec( + `${cmdNoProject} from-node-modules/from-node-modules` + ); + if (err) + throw new Error( + `Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}` + ); expect(JSON.parse(stdout)).to.deep.equal({ external: { tsmri: { name: 'typescript-module-required-internally' }, jsmri: { name: 'javascript-module-required-internally' }, tsmii: { name: 'typescript-module-imported-internally' }, - jsmii: { name: 'javascript-module-imported-internally' } + jsmii: { name: 'javascript-module-imported-internally' }, }, tsmie: { name: 'typescript-module-imported-externally' }, jsmie: { name: 'javascript-module-imported-externally' }, tsmre: { name: 'typescript-module-required-externally' }, - jsmre: { name: 'javascript-module-required-externally' } - }) - }) + jsmre: { name: 'javascript-module-required-externally' }, + }); + }); test.suite('should respect maxNodeModulesJsDepth', (test) => { test('for unscoped modules', async () => { - const { err, stdout, stderr } = await exec(`${cmdNoProject} maxnodemodulesjsdepth`) - expect(err).to.not.equal(null) + const { err, stdout, stderr } = await exec( + `${cmdNoProject} maxnodemodulesjsdepth` + ); + expect(err).to.not.equal(null); expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + - "maxnodemodulesjsdepth/other.ts(4,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + - '\n' - ) - }) + "maxnodemodulesjsdepth/other.ts(4,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + + '\n' + ); + }); test('for @scoped modules', async () => { - const { err, stdout, stderr } = await exec(`${cmdNoProject} maxnodemodulesjsdepth-scoped`) - expect(err).to.not.equal(null) + const { err, stdout, stderr } = await exec( + `${cmdNoProject} maxnodemodulesjsdepth-scoped` + ); + expect(err).to.not.equal(null); expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + - "maxnodemodulesjsdepth-scoped/other.ts(7,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + - '\n' - ) - }) - }) + "maxnodemodulesjsdepth-scoped/other.ts(7,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + + '\n' + ); + }); + }); if (semver.gte(ts.version, '3.2.0')) { test('--show-config should log resolved configuration', async (t) => { - function native (path: string) { return path.replace(/\/|\\/g, pathSep) } - function posix (path: string) { return path.replace(/\/|\\/g, '/') } - const { err, stdout } = await exec(`${cmd} --showConfig`) - expect(err).to.equal(null) - t.is(stdout, JSON.stringify({ - 'compilerOptions': { - 'target': 'es6', - 'jsx': 'react', - 'noEmit': false, - 'strict': true, - 'typeRoots': [ - posix(`${ ROOT_DIR }/tests/typings`), - posix(`${ ROOT_DIR }/node_modules/@types`) - ], - 'sourceMap': true, - 'inlineSourceMap': false, - 'inlineSources': true, - 'declaration': false, - 'outDir': './.ts-node', - 'module': 'commonjs' - }, - 'ts-node': { - 'cwd': native(`${ ROOT_DIR }/tests`), - 'projectSearchDir': native(`${ ROOT_DIR }/tests`), - 'project': native(`${ ROOT_DIR }/tests/tsconfig.json`), - 'require': [] - } - }, null, 2) + '\n') - }) + function native(path: string) { + return path.replace(/\/|\\/g, pathSep); + } + function posix(path: string) { + return path.replace(/\/|\\/g, '/'); + } + const { err, stdout } = await exec(`${cmd} --showConfig`); + expect(err).to.equal(null); + t.is( + stdout, + JSON.stringify( + { + compilerOptions: { + target: 'es6', + jsx: 'react', + noEmit: false, + strict: true, + typeRoots: [ + posix(`${ROOT_DIR}/tests/typings`), + posix(`${ROOT_DIR}/node_modules/@types`), + ], + sourceMap: true, + inlineSourceMap: false, + inlineSources: true, + declaration: false, + outDir: './.ts-node', + module: 'commonjs', + }, + 'ts-node': { + cwd: native(`${ROOT_DIR}/tests`), + projectSearchDir: native(`${ROOT_DIR}/tests`), + project: native(`${ROOT_DIR}/tests/tsconfig.json`), + require: [], + }, + }, + null, + 2 + ) + '\n' + ); + }); } else { test('--show-config should log error message when used with old typescript versions', async (t) => { - const { err, stderr } = await exec(`${cmd} --showConfig`) - expect(err).to.not.equal(null) - expect(stderr).to.contain('Error: --show-config requires') - }) + const { err, stderr } = await exec(`${cmd} --showConfig`); + expect(err).to.not.equal(null); + expect(stderr).to.contain('Error: --show-config requires'); + }); } - }) + }); test.suite('register', (_test) => { - const test = _test.context(once(async () => { - return { - registered: register({ - project: PROJECT, - compilerOptions: { - jsx: 'preserve' - } - }), - moduleTestPath: require.resolve('../tests/module') - } - })) + const test = _test.context( + once(async () => { + return { + registered: register({ + project: PROJECT, + compilerOptions: { + jsx: 'preserve', + }, + }), + moduleTestPath: require.resolve('../tests/module'), + }; + }) + ); test.beforeEach(async ({ context: { registered } }) => { // Re-enable project for every test. - registered.enabled(true) - }) - test.runSerially() + registered.enabled(true); + }); + test.runSerially(); - test('should be able to require typescript', ({ context: { moduleTestPath } }) => { - const m = require(moduleTestPath) + test('should be able to require typescript', ({ + context: { moduleTestPath }, + }) => { + const m = require(moduleTestPath); - expect(m.example('foo')).to.equal('FOO') - }) + expect(m.example('foo')).to.equal('FOO'); + }); - test('should support dynamically disabling', ({ context: { registered, moduleTestPath } }) => { - delete require.cache[moduleTestPath] + test('should support dynamically disabling', ({ + context: { registered, moduleTestPath }, + }) => { + delete require.cache[moduleTestPath]; - expect(registered.enabled(false)).to.equal(false) - expect(() => require(moduleTestPath)).to.throw(/Unexpected token/) + expect(registered.enabled(false)).to.equal(false); + expect(() => require(moduleTestPath)).to.throw(/Unexpected token/); - delete require.cache[moduleTestPath] + delete require.cache[moduleTestPath]; - expect(registered.enabled()).to.equal(false) - expect(() => require(moduleTestPath)).to.throw(/Unexpected token/) + expect(registered.enabled()).to.equal(false); + expect(() => require(moduleTestPath)).to.throw(/Unexpected token/); - delete require.cache[moduleTestPath] + delete require.cache[moduleTestPath]; - expect(registered.enabled(true)).to.equal(true) - expect(() => require(moduleTestPath)).to.not.throw() + expect(registered.enabled(true)).to.equal(true); + expect(() => require(moduleTestPath)).to.not.throw(); - delete require.cache[moduleTestPath] + delete require.cache[moduleTestPath]; - expect(registered.enabled()).to.equal(true) - expect(() => require(moduleTestPath)).to.not.throw() - }) + expect(registered.enabled()).to.equal(true); + expect(() => require(moduleTestPath)).to.not.throw(); + }); if (semver.gte(ts.version, '2.7.0')) { - test('should support compiler scopes', ({ context: { registered, moduleTestPath } }) => { - const calls: string[] = [] + test('should support compiler scopes', ({ + context: { registered, moduleTestPath }, + }) => { + const calls: string[] = []; - registered.enabled(false) + registered.enabled(false); const compilers = [ - register({ projectSearchDir: join(TEST_DIR, 'scope/a'), scopeDir: join(TEST_DIR, 'scope/a'), scope: true }), - register({ projectSearchDir: join(TEST_DIR, 'scope/a'), scopeDir: join(TEST_DIR, 'scope/b'), scope: true }) - ] - - compilers.forEach(c => { - const old = c.compile + register({ + projectSearchDir: join(TEST_DIR, 'scope/a'), + scopeDir: join(TEST_DIR, 'scope/a'), + scope: true, + }), + register({ + projectSearchDir: join(TEST_DIR, 'scope/a'), + scopeDir: join(TEST_DIR, 'scope/b'), + scope: true, + }), + ]; + + compilers.forEach((c) => { + const old = c.compile; c.compile = (code, fileName, lineOffset) => { - calls.push(fileName) + calls.push(fileName); - return old(code, fileName, lineOffset) - } - }) + return old(code, fileName, lineOffset); + }; + }); try { - expect(require('../tests/scope/a').ext).to.equal('.ts') - expect(require('../tests/scope/b').ext).to.equal('.ts') + expect(require('../tests/scope/a').ext).to.equal('.ts'); + expect(require('../tests/scope/b').ext).to.equal('.ts'); } finally { - compilers.forEach(c => c.enabled(false)) + compilers.forEach((c) => c.enabled(false)); } expect(calls).to.deep.equal([ join(TEST_DIR, 'scope/a/index.ts'), - join(TEST_DIR, 'scope/b/index.ts') - ]) + join(TEST_DIR, 'scope/b/index.ts'), + ]); - delete require.cache[moduleTestPath] + delete require.cache[moduleTestPath]; - expect(() => require(moduleTestPath)).to.throw() - }) + expect(() => require(moduleTestPath)).to.throw(); + }); } test('should compile through js and ts', () => { - const m = require('../tests/complex') + const m = require('../tests/complex'); - expect(m.example()).to.equal('example') - }) + expect(m.example()).to.equal('example'); + }); test('should work with proxyquire', () => { const m = proxyquire('../tests/complex', { - './example': 'hello' - }) + './example': 'hello', + }); - expect(m.example()).to.equal('hello') - }) + expect(m.example()).to.equal('hello'); + }); test('should work with `require.cache`', () => { - const { example1, example2 } = require('../tests/require-cache') + const { example1, example2 } = require('../tests/require-cache'); - expect(example1).to.not.equal(example2) - }) + expect(example1).to.not.equal(example2); + }); test('should use source maps', async () => { try { - require('../tests/throw') + require('../tests/throw'); } catch (error) { - expect(error.stack).to.contain([ - 'Error: this is a demo', - ` at Foo.bar (${join(TEST_DIR, './throw.ts')}:100:18)` - ].join('\n')) + expect(error.stack).to.contain( + [ + 'Error: this is a demo', + ` at Foo.bar (${join(TEST_DIR, './throw.ts')}:100:18)`, + ].join('\n') + ); } - }) + }); test.suite('JSX preserve', (test) => { - let old: (m: Module, filename: string) => any - let compiled: string + let old: (m: Module, filename: string) => any; + let compiled: string; - test.runSerially() + test.runSerially(); test.beforeAll(async () => { - old = require.extensions['.tsx']! // tslint:disable-line - require.extensions['.tsx'] = (m: any, fileName) => { // tslint:disable-line - const _compile = m._compile + old = require.extensions['.tsx']!; + require.extensions['.tsx'] = (m: any, fileName) => { + const _compile = m._compile; m._compile = function (code: string, fileName: string) { - compiled = code - return _compile.call(this, code, fileName) - } + compiled = code; + return _compile.call(this, code, fileName); + }; - return old(m, fileName) - } - }) + return old(m, fileName); + }; + }); test('should use source maps', async (t) => { t.teardown(() => { - require.extensions['.tsx'] = old // tslint:disable-line - }) + require.extensions['.tsx'] = old; + }); try { - require('../tests/with-jsx.tsx') + require('../tests/with-jsx.tsx'); } catch (error) { - expect(error.stack).to.contain('SyntaxError: Unexpected token') + expect(error.stack).to.contain('SyntaxError: Unexpected token'); } - expect(compiled).to.match(SOURCE_MAP_REGEXP) - }) - }) - }) + expect(compiled).to.match(SOURCE_MAP_REGEXP); + }); + }); + }); test.suite('create', (_test) => { - const test = _test.context(async t => { + const test = _test.context(async (t) => { return { - service: create({ compilerOptions: { target: 'es5' }, skipProject: true }) - } - }) + service: create({ + compilerOptions: { target: 'es5' }, + skipProject: true, + }), + }; + }); - test('should create generic compiler instances', ({ context: { service } }) => { - const output = service.compile('const x = 10', 'test.ts') - expect(output).to.contain('var x = 10;') - }) + test('should create generic compiler instances', ({ + context: { service }, + }) => { + const output = service.compile('const x = 10', 'test.ts'); + expect(output).to.contain('var x = 10;'); + }); test.suite('should get type information', (test) => { test('given position of identifier', ({ context: { service } }) => { - expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 21)).to.deep.equal({ + expect( + service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 21) + ).to.deep.equal({ comment: 'jsdoc here', - name: 'const x: 10' - }) - }) - test('given position that does not point to an identifier', ({ context: { service } }) => { - expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 0)).to.deep.equal({ + name: 'const x: 10', + }); + }); + test('given position that does not point to an identifier', ({ + context: { service }, + }) => { + expect( + service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 0) + ).to.deep.equal({ comment: '', - name: '' - }) - }) - }) - }) + name: '', + }); + }); + }); + }); test.suite('issue #1098', (test) => { - function testIgnored (ignored: tsNodeTypes.Service['ignored'], allowed: string[], disallowed: string[]) { + function testIgnored( + ignored: tsNodeTypes.Service['ignored'], + allowed: string[], + disallowed: string[] + ) { for (const ext of allowed) { - expect(ignored(join(__dirname, `index${ext}`))).equal(false, `should accept ${ext} files`) + expect(ignored(join(__dirname, `index${ext}`))).equal( + false, + `should accept ${ext} files` + ); } for (const ext of disallowed) { - expect(ignored(join(__dirname, `index${ext}`))).equal(true, `should ignore ${ext} files`) + expect(ignored(join(__dirname, `index${ext}`))).equal( + true, + `should ignore ${ext} files` + ); } } test('correctly filters file extensions from the compiler when allowJs=false and jsx=false', () => { - const { ignored } = create({ compilerOptions: {}, skipProject: true }) - testIgnored(ignored, ['.ts', '.d.ts'], ['.js', '.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) - }) + const { ignored } = create({ compilerOptions: {}, skipProject: true }); + testIgnored( + ignored, + ['.ts', '.d.ts'], + ['.js', '.tsx', '.jsx', '.mjs', '.cjs', '.xyz', ''] + ); + }); test('correctly filters file extensions from the compiler when allowJs=true and jsx=false', () => { - const { ignored } = create({ compilerOptions: { allowJs: true }, skipProject: true }) - testIgnored(ignored, ['.ts', '.js', '.d.ts'], ['.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) - }) + const { ignored } = create({ + compilerOptions: { allowJs: true }, + skipProject: true, + }); + testIgnored( + ignored, + ['.ts', '.js', '.d.ts'], + ['.tsx', '.jsx', '.mjs', '.cjs', '.xyz', ''] + ); + }); test('correctly filters file extensions from the compiler when allowJs=false and jsx=true', () => { - const { ignored } = create({ compilerOptions: { allowJs: false, jsx: 'preserve' }, skipProject: true }) - testIgnored(ignored, ['.ts', '.tsx', '.d.ts'], ['.js', '.jsx', '.mjs', '.cjs', '.xyz', '']) - }) + const { ignored } = create({ + compilerOptions: { allowJs: false, jsx: 'preserve' }, + skipProject: true, + }); + testIgnored( + ignored, + ['.ts', '.tsx', '.d.ts'], + ['.js', '.jsx', '.mjs', '.cjs', '.xyz', ''] + ); + }); test('correctly filters file extensions from the compiler when allowJs=true and jsx=true', () => { - const { ignored } = create({ compilerOptions: { allowJs: true, jsx: 'preserve' }, skipProject: true }) - testIgnored(ignored, ['.ts', '.tsx', '.js', '.jsx', '.d.ts'], ['.mjs', '.cjs', '.xyz', '']) - }) - }) + const { ignored } = create({ + compilerOptions: { allowJs: true, jsx: 'preserve' }, + skipProject: true, + }); + testIgnored( + ignored, + ['.ts', '.tsx', '.js', '.jsx', '.d.ts'], + ['.mjs', '.cjs', '.xyz', ''] + ); + }); + }); test.suite('esm', (test) => { - - const cmd = `node --loader ts-node/esm` + const cmd = `node --loader ts-node/esm`; if (semver.gte(process.version, '13.0.0')) { test('should compile and execute as ESM', async () => { - const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm') }) - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - }) + const { err, stdout } = await exec(`${cmd} index.ts`, { + cwd: join(TEST_DIR, './esm'), + }); + expect(err).to.equal(null); + expect(stdout).to.equal('foo bar baz biff libfoo\n'); + }); test('should use source maps', async () => { - const { err, stdout } = await exec(`${cmd} throw.ts`, { cwd: join(TEST_DIR, './esm') }) - expect(err).not.to.equal(null) - expect(err!.message).to.contain([ - `${pathToFileURL(join(TEST_DIR, './esm/throw.ts'))}:100`, - ' bar () { throw new Error(\'this is a demo\') }', - ' ^', - 'Error: this is a demo' - ].join('\n')) - }) + const { err, stdout } = await exec(`${cmd} throw.ts`, { + cwd: join(TEST_DIR, './esm'), + }); + expect(err).not.to.equal(null); + expect(err!.message).to.contain( + [ + `${pathToFileURL(join(TEST_DIR, './esm/throw.ts'))}:100`, + " bar () { throw new Error('this is a demo') }", + ' ^', + 'Error: this is a demo', + ].join('\n') + ); + }); test.suite('supports experimental-specifier-resolution=node', (test) => { test('via --experimental-specifier-resolution', async () => { - const { err, stdout } = await exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }) - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - }) + const { + err, + stdout, + } = await exec( + `${cmd} --experimental-specifier-resolution=node index.ts`, + { cwd: join(TEST_DIR, './esm-node-resolver') } + ); + expect(err).to.equal(null); + expect(stdout).to.equal('foo bar baz biff libfoo\n'); + }); test('via --es-module-specifier-resolution alias', async () => { - const { err, stdout } = await exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver') }) - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - }) + const { + err, + stdout, + } = await exec( + `${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, + { cwd: join(TEST_DIR, './esm-node-resolver') } + ); + expect(err).to.equal(null); + expect(stdout).to.equal('foo bar baz biff libfoo\n'); + }); test('via NODE_OPTIONS', async () => { const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-node-resolver'), env: { ...process.env, - NODE_OPTIONS: '--experimental-specifier-resolution=node' - } - }) - expect(err).to.equal(null) - expect(stdout).to.equal('foo bar baz biff libfoo\n') - }) - }) + NODE_OPTIONS: '--experimental-specifier-resolution=node', + }, + }); + expect(err).to.equal(null); + expect(stdout).to.equal('foo bar baz biff libfoo\n'); + }); + }); test('throws ERR_REQUIRE_ESM when attempting to require() an ESM script when ESM loader is enabled', async () => { - const { err, stderr } = await exec(`${cmd} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) - expect(err).to.not.equal(null) - expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') - }) + const { err, stderr } = await exec(`${cmd} ./index.js`, { + cwd: join(TEST_DIR, './esm-err-require-esm'), + }); + expect(err).to.not.equal(null); + expect(stderr).to.contain( + 'Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:' + ); + }); test('defers to fallback loaders when URL should not be handled by ts-node', async () => { const { err, stdout, stderr } = await exec(`${cmd} index.mjs`, { - cwd: join(TEST_DIR, './esm-import-http-url') - }) - expect(err).to.not.equal(null) + cwd: join(TEST_DIR, './esm-import-http-url'), + }); + expect(err).to.not.equal(null); // expect error from node's default resolver - expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*(?:\n.*){0,1}\n *at defaultResolve/) - }) + expect(stderr).to.match( + /Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*(?:\n.*){0,1}\n *at defaultResolve/ + ); + }); test('should bypass import cache when changing search params', async () => { - const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-import-cache') }) - expect(err).to.equal(null) - expect(stdout).to.equal('log1\nlog2\nlog2\n') - }) + const { err, stdout } = await exec(`${cmd} index.ts`, { + cwd: join(TEST_DIR, './esm-import-cache'), + }); + expect(err).to.equal(null); + expect(stdout).to.equal('log1\nlog2\nlog2\n'); + }); test('should support transpile only mode via dedicated loader entrypoint', async () => { - const { err, stdout } = await exec(`${cmd}/transpile-only index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }) - expect(err).to.equal(null) - expect(stdout).to.equal('') - }) + const { err, stdout } = await exec(`${cmd}/transpile-only index.ts`, { + cwd: join(TEST_DIR, './esm-transpile-only'), + }); + expect(err).to.equal(null); + expect(stdout).to.equal(''); + }); test('should throw type errors without transpile-only enabled', async () => { - const { err, stdout } = await exec(`${cmd} index.ts`, { cwd: join(TEST_DIR, './esm-transpile-only') }) + const { err, stdout } = await exec(`${cmd} index.ts`, { + cwd: join(TEST_DIR, './esm-transpile-only'), + }); if (err === null) { - throw new Error('Command was expected to fail, but it succeeded.') + throw new Error('Command was expected to fail, but it succeeded.'); } - expect(err.message).to.contain('Unable to compile TypeScript') - expect(err.message).to.match(new RegExp('TS2345: Argument of type \'(?:number|1101)\' is not assignable to parameter of type \'string\'\\.')) - expect(err.message).to.match(new RegExp('TS2322: Type \'(?:"hello world"|string)\' is not assignable to type \'number\'\\.')) - expect(stdout).to.equal('') - }) + expect(err.message).to.contain('Unable to compile TypeScript'); + expect(err.message).to.match( + new RegExp( + "TS2345: Argument of type '(?:number|1101)' is not assignable to parameter of type 'string'\\." + ) + ); + expect(err.message).to.match( + new RegExp( + "TS2322: Type '(?:\"hello world\"|string)' is not assignable to type 'number'\\." + ) + ); + expect(stdout).to.equal(''); + }); } if (semver.gte(process.version, '12.0.0')) { test('throws ERR_REQUIRE_ESM when attempting to require() an ESM script when ESM loader is *not* enabled and node version is >= 12', async () => { // Node versions >= 12 support package.json "type" field and so will throw an error when attempting to load ESM as CJS - const { err, stderr } = await exec(`${BIN_PATH} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) - expect(err).to.not.equal(null) - expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') - }) + const { err, stderr } = await exec(`${BIN_PATH} ./index.js`, { + cwd: join(TEST_DIR, './esm-err-require-esm'), + }); + expect(err).to.not.equal(null); + expect(stderr).to.contain( + 'Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:' + ); + }); } else { test('Loads as CommonJS when attempting to require() an ESM script when ESM loader is *not* enabled and node version is < 12', async () => { // Node versions less than 12 do not support package.json "type" field and so will load ESM as CommonJS - const { err, stdout } = await exec(`${BIN_PATH} ./index.js`, { cwd: join(TEST_DIR, './esm-err-require-esm') }) - expect(err).to.equal(null) - expect(stdout).to.contain('CommonJS') - }) + const { err, stdout } = await exec(`${BIN_PATH} ./index.js`, { + cwd: join(TEST_DIR, './esm-err-require-esm'), + }); + expect(err).to.equal(null); + expect(stdout).to.contain('CommonJS'); + }); } - - }) -}) + }); +}); diff --git a/src/index.ts b/src/index.ts index 32f2d3233..dbde93d1e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,25 +1,33 @@ -import { relative, basename, extname, resolve, dirname, join } from 'path' -import sourceMapSupport = require('source-map-support') -import * as ynModule from 'yn' -import { BaseError } from 'make-error' -import * as util from 'util' -import { fileURLToPath } from 'url' -import type * as _ts from 'typescript' -import { Module, createRequire as nodeCreateRequire, createRequireFromPath as nodeCreateRequireFromPath } from 'module' -import type _createRequire from 'create-require' -import { Transpiler, TranspilerFactory } from './transpilers/types' -import { getDefaultTsconfigJsonForNodeVersion } from './tsconfigs' +import { relative, basename, extname, resolve, dirname, join } from 'path'; +import sourceMapSupport = require('source-map-support'); +import * as ynModule from 'yn'; +import { BaseError } from 'make-error'; +import * as util from 'util'; +import { fileURLToPath } from 'url'; +import type * as _ts from 'typescript'; +import { + Module, + createRequire as nodeCreateRequire, + createRequireFromPath as nodeCreateRequireFromPath, +} from 'module'; +import type _createRequire from 'create-require'; +import { Transpiler, TranspilerFactory } from './transpilers/types'; +import { getDefaultTsconfigJsonForNodeVersion } from './tsconfigs'; /** @internal */ -export const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire // tslint:disable-line:deprecation +export const createRequire = + nodeCreateRequire ?? + nodeCreateRequireFromPath ?? + (require('create-require') as typeof _createRequire); -export { createRepl, CreateReplOptions, ReplService } from './repl' +export { createRepl, CreateReplOptions, ReplService } from './repl'; /** * Does this version of node obey the package.json "type" field * and throw ERR_REQUIRE_ESM when attempting to require() an ESM modules. */ -const engineSupportsPackageTypeField = parseInt(process.versions.node.split('.')[0], 10) >= 12 +const engineSupportsPackageTypeField = + parseInt(process.versions.node.split('.')[0], 10) >= 12; /** * Assert that script can be loaded as CommonJS when we attempt to require it. @@ -27,15 +35,18 @@ const engineSupportsPackageTypeField = parseInt(process.versions.node.split('.') * * Loaded conditionally so we don't need to support older node versions */ -const assertScriptCanLoadAsCJS: (filename: string) => void = - engineSupportsPackageTypeField +const assertScriptCanLoadAsCJS: ( + filename: string +) => void = engineSupportsPackageTypeField ? require('../dist-raw/node-cjs-loader-utils').assertScriptCanLoadAsCJSImpl - : () => {/* noop */} + : () => { + /* noop */ + }; /** * Registered `ts-node` instance information. */ -export const REGISTER_INSTANCE = Symbol.for('ts-node.register.instance') +export const REGISTER_INSTANCE = Symbol.for('ts-node.register.instance'); /** * Expose `REGISTER_INSTANCE` information on node.js `process`. @@ -43,110 +54,111 @@ export const REGISTER_INSTANCE = Symbol.for('ts-node.register.instance') declare global { namespace NodeJS { interface Process { - [REGISTER_INSTANCE]?: Service + [REGISTER_INSTANCE]?: Service; } } } /** @internal */ -export const env = process.env as ProcessEnv +export const env = process.env as ProcessEnv; /** * Declare all env vars, to aid discoverability. * If an env var affects ts-node's behavior, it should not be buried somewhere in our codebase. * @internal */ export interface ProcessEnv { - TS_NODE_DEBUG?: string - TS_NODE_CWD?: string + TS_NODE_DEBUG?: string; + TS_NODE_CWD?: string; /** @deprecated */ - TS_NODE_DIR?: string - TS_NODE_EMIT?: string + TS_NODE_DIR?: string; + TS_NODE_EMIT?: string; /** @deprecated */ - TS_NODE_SCOPE?: string - TS_NODE_FILES?: string - TS_NODE_PRETTY?: string - TS_NODE_COMPILER?: string - TS_NODE_COMPILER_OPTIONS?: string - TS_NODE_IGNORE?: string - TS_NODE_PROJECT?: string - TS_NODE_SKIP_PROJECT?: string - TS_NODE_SKIP_IGNORE?: string - TS_NODE_PREFER_TS_EXTS?: string - TS_NODE_IGNORE_DIAGNOSTICS?: string - TS_NODE_TRANSPILE_ONLY?: string - TS_NODE_TYPE_CHECK?: string - TS_NODE_COMPILER_HOST?: string - TS_NODE_LOG_ERROR?: string - TS_NODE_HISTORY?: string - - NODE_NO_READLINE?: string + TS_NODE_SCOPE?: string; + TS_NODE_FILES?: string; + TS_NODE_PRETTY?: string; + TS_NODE_COMPILER?: string; + TS_NODE_COMPILER_OPTIONS?: string; + TS_NODE_IGNORE?: string; + TS_NODE_PROJECT?: string; + TS_NODE_SKIP_PROJECT?: string; + TS_NODE_SKIP_IGNORE?: string; + TS_NODE_PREFER_TS_EXTS?: string; + TS_NODE_IGNORE_DIAGNOSTICS?: string; + TS_NODE_TRANSPILE_ONLY?: string; + TS_NODE_TYPE_CHECK?: string; + TS_NODE_COMPILER_HOST?: string; + TS_NODE_LOG_ERROR?: string; + TS_NODE_HISTORY?: string; + + NODE_NO_READLINE?: string; } /** * @internal */ -export const INSPECT_CUSTOM = util.inspect.custom || 'inspect' +export const INSPECT_CUSTOM = util.inspect.custom || 'inspect'; /** * Wrapper around yn module that returns `undefined` instead of `null`. * This is implemented by yn v4, but we're staying on v3 to avoid v4's node 10 requirement. */ -function yn (value: string | undefined) { - return ynModule(value) ?? undefined +function yn(value: string | undefined) { + return ynModule(value) ?? undefined; } /** * Debugging `ts-node`. */ -const shouldDebug = yn(env.TS_NODE_DEBUG) +const shouldDebug = yn(env.TS_NODE_DEBUG); /** @internal */ -export const debug = shouldDebug ? - (...args: any) => console.log(`[ts-node ${new Date().toISOString()}]`, ...args) - : () => undefined -const debugFn = shouldDebug ? - (key: string, fn: (arg: T) => U) => { - let i = 0 - return (x: T) => { - debug(key, x, ++i) - return fn(x) +export const debug = shouldDebug + ? (...args: any) => + console.log(`[ts-node ${new Date().toISOString()}]`, ...args) + : () => undefined; +const debugFn = shouldDebug + ? (key: string, fn: (arg: T) => U) => { + let i = 0; + return (x: T) => { + debug(key, x, ++i); + return fn(x); + }; } - } : - (_: string, fn: (arg: T) => U) => fn + : (_: string, fn: (arg: T) => U) => fn; /** * Common TypeScript interfaces between versions. */ export interface TSCommon { - version: typeof _ts.version - sys: typeof _ts.sys - ScriptSnapshot: typeof _ts.ScriptSnapshot - displayPartsToString: typeof _ts.displayPartsToString - createLanguageService: typeof _ts.createLanguageService - getDefaultLibFilePath: typeof _ts.getDefaultLibFilePath - getPreEmitDiagnostics: typeof _ts.getPreEmitDiagnostics - flattenDiagnosticMessageText: typeof _ts.flattenDiagnosticMessageText - transpileModule: typeof _ts.transpileModule - ModuleKind: typeof _ts.ModuleKind - ScriptTarget: typeof _ts.ScriptTarget - findConfigFile: typeof _ts.findConfigFile - readConfigFile: typeof _ts.readConfigFile - parseJsonConfigFileContent: typeof _ts.parseJsonConfigFileContent - formatDiagnostics: typeof _ts.formatDiagnostics - formatDiagnosticsWithColorAndContext: typeof _ts.formatDiagnosticsWithColorAndContext - - createDocumentRegistry: typeof _ts.createDocumentRegistry - JsxEmit: typeof _ts.JsxEmit - createModuleResolutionCache: typeof _ts.createModuleResolutionCache - resolveModuleName: typeof _ts.resolveModuleName - resolveModuleNameFromCache: typeof _ts.resolveModuleNameFromCache - resolveTypeReferenceDirective: typeof _ts.resolveTypeReferenceDirective - createIncrementalCompilerHost: typeof _ts.createIncrementalCompilerHost - createSourceFile: typeof _ts.createSourceFile - getDefaultLibFileName: typeof _ts.getDefaultLibFileName - createIncrementalProgram: typeof _ts.createIncrementalProgram - createEmitAndSemanticDiagnosticsBuilderProgram: typeof _ts.createEmitAndSemanticDiagnosticsBuilderProgram - - libs?: string[] + version: typeof _ts.version; + sys: typeof _ts.sys; + ScriptSnapshot: typeof _ts.ScriptSnapshot; + displayPartsToString: typeof _ts.displayPartsToString; + createLanguageService: typeof _ts.createLanguageService; + getDefaultLibFilePath: typeof _ts.getDefaultLibFilePath; + getPreEmitDiagnostics: typeof _ts.getPreEmitDiagnostics; + flattenDiagnosticMessageText: typeof _ts.flattenDiagnosticMessageText; + transpileModule: typeof _ts.transpileModule; + ModuleKind: typeof _ts.ModuleKind; + ScriptTarget: typeof _ts.ScriptTarget; + findConfigFile: typeof _ts.findConfigFile; + readConfigFile: typeof _ts.readConfigFile; + parseJsonConfigFileContent: typeof _ts.parseJsonConfigFileContent; + formatDiagnostics: typeof _ts.formatDiagnostics; + formatDiagnosticsWithColorAndContext: typeof _ts.formatDiagnosticsWithColorAndContext; + + createDocumentRegistry: typeof _ts.createDocumentRegistry; + JsxEmit: typeof _ts.JsxEmit; + createModuleResolutionCache: typeof _ts.createModuleResolutionCache; + resolveModuleName: typeof _ts.resolveModuleName; + resolveModuleNameFromCache: typeof _ts.resolveModuleNameFromCache; + resolveTypeReferenceDirective: typeof _ts.resolveTypeReferenceDirective; + createIncrementalCompilerHost: typeof _ts.createIncrementalCompilerHost; + createSourceFile: typeof _ts.createSourceFile; + getDefaultLibFileName: typeof _ts.getDefaultLibFileName; + createIncrementalProgram: typeof _ts.createIncrementalProgram; + createEmitAndSemanticDiagnosticsBuilderProgram: typeof _ts.createEmitAndSemanticDiagnosticsBuilderProgram; + + libs?: string[]; } /** @@ -155,29 +167,35 @@ export interface TSCommon { */ export interface TSInternal { // https://github.com/microsoft/TypeScript/blob/4a34294908bed6701dcba2456ca7ac5eafe0ddff/src/compiler/core.ts#L1906-L1909 - createGetCanonicalFileName (useCaseSensitiveFileNames: boolean): TSInternal.GetCanonicalFileName + createGetCanonicalFileName( + useCaseSensitiveFileNames: boolean + ): TSInternal.GetCanonicalFileName; // https://github.com/microsoft/TypeScript/blob/c117c266e09c80e8a06b24a6e94b9d018f5fae6b/src/compiler/commandLineParser.ts#L2054 - convertToTSConfig (configParseResult: _ts.ParsedCommandLine, configFileName: string, host: TSInternal.ConvertToTSConfigHost): any + convertToTSConfig( + configParseResult: _ts.ParsedCommandLine, + configFileName: string, + host: TSInternal.ConvertToTSConfigHost + ): any; } /** @internal */ export namespace TSInternal { // https://github.com/microsoft/TypeScript/blob/4a34294908bed6701dcba2456ca7ac5eafe0ddff/src/compiler/core.ts#L1906 - export type GetCanonicalFileName = (fileName: string) => string + export type GetCanonicalFileName = (fileName: string) => string; // https://github.com/microsoft/TypeScript/blob/c117c266e09c80e8a06b24a6e94b9d018f5fae6b/src/compiler/commandLineParser.ts#L2041 export interface ConvertToTSConfigHost { - getCurrentDirectory (): string - useCaseSensitiveFileNames: boolean + getCurrentDirectory(): string; + useCaseSensitiveFileNames: boolean; } } export interface TSCompilerFactory { - createTypescriptCompiler (options?: any): TSCommon + createTypescriptCompiler(options?: any): TSCommon; } /** * Export the current version. */ -export const VERSION = require('../package.json').version +export const VERSION = require('../package.json').version; /** * Options for creating a new TypeScript compiler instance. @@ -188,59 +206,59 @@ export interface CreateOptions { * * @default process.cwd() */ - cwd?: string + cwd?: string; /** * Legacy alias for `cwd` * * @deprecated use `projectSearchDir` or `cwd` */ - dir?: string + dir?: string; /** * Emit output files into `.ts-node` directory. * * @default false */ - emit?: boolean + emit?: boolean; /** * Scope compiler to files within `scopeDir`. * * @default false */ - scope?: boolean + scope?: boolean; /** * @default First of: `tsconfig.json` "rootDir" if specified, directory containing `tsconfig.json`, or cwd if no `tsconfig.json` is loaded. */ - scopeDir?: string + scopeDir?: string; /** * Use pretty diagnostic formatter. * * @default false */ - pretty?: boolean + pretty?: boolean; /** * Use TypeScript's faster `transpileModule`. * * @default false */ - transpileOnly?: boolean + transpileOnly?: boolean; /** * **DEPRECATED** Specify type-check is enabled (e.g. `transpileOnly == false`). * * @default true */ - typeCheck?: boolean + typeCheck?: boolean; /** * Use TypeScript's compiler host API instead of the language service API. * * @default false */ - compilerHost?: boolean + compilerHost?: boolean; /** * Logs TypeScript errors to stderr instead of throwing exceptions. * * @default false */ - logError?: boolean + logError?: boolean; /** * Load "files" and "include" from `tsconfig.json` on startup. * @@ -248,17 +266,17 @@ export interface CreateOptions { * * @default false */ - files?: boolean + files?: boolean; /** * Specify a custom TypeScript compiler. * * @default "typescript" */ - compiler?: string + compiler?: string; /** * Specify a custom transpiler for use with transpileOnly */ - transpiler?: string | [string, object] + transpiler?: string | [string, object]; /** * Paths which should not be compiled. * @@ -270,38 +288,38 @@ export interface CreateOptions { * * @default ["(?:^|/)node_modules/"] */ - ignore?: string[] + ignore?: string[]; /** * Path to TypeScript config file or directory containing a `tsconfig.json`. * Similar to the `tsc --project` flag: https://www.typescriptlang.org/docs/handbook/compiler-options.html */ - project?: string + project?: string; /** * Search for TypeScript config file (`tsconfig.json`) in this or parent directories. */ - projectSearchDir?: string + projectSearchDir?: string; /** * Skip project config resolution and loading. * * @default false */ - skipProject?: boolean + skipProject?: boolean; /** * Skip ignore check, so that compilation will be attempted for all files with matching extensions. * * @default false */ - skipIgnore?: boolean + skipIgnore?: boolean; /** * JSON object to merge with TypeScript `compilerOptions`. * * @allOf [{"$ref": "https://schemastore.azurewebsites.net/schemas/json/tsconfig.json#definitions/compilerOptionsDefinition/properties/compilerOptions"}] */ - compilerOptions?: object + compilerOptions?: object; /** * Ignore TypeScript warnings by diagnostic code. */ - ignoreDiagnostics?: Array + ignoreDiagnostics?: Array; /** * Modules to require, like node's `--require` flag. * @@ -310,16 +328,18 @@ export interface CreateOptions { * If specified programmatically, each input string should be pre-resolved to an absolute path for * best results. */ - require?: Array - readFile?: (path: string) => string | undefined - fileExists?: (path: string) => boolean - transformers?: _ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers) + require?: Array; + readFile?: (path: string) => string | undefined; + fileExists?: (path: string) => boolean; + transformers?: + | _ts.CustomTransformers + | ((p: _ts.Program) => _ts.CustomTransformers); /** * True if require() hooks should interop with experimental ESM loader. * Enabled explicitly via a flag since it is a breaking change. * @internal */ - experimentalEsmLoader?: boolean + experimentalEsmLoader?: boolean; } /** @@ -333,45 +353,47 @@ export interface RegisterOptions extends CreateOptions { * * @default false */ - preferTsExts?: boolean + preferTsExts?: boolean; } /** * Must be an interface to support `typescript-json-schema`. */ -export interface TsConfigOptions extends Omit {} /** * Like `Object.assign`, but ignores `undefined` properties. */ -function assign (initialValue: T, ...sources: Array): T { +function assign(initialValue: T, ...sources: Array): T { for (const source of sources) { for (const key of Object.keys(source)) { - const value = (source as any)[key] - if (value !== undefined) (initialValue as any)[key] = value + const value = (source as any)[key]; + if (value !== undefined) (initialValue as any)[key] = value; } } - return initialValue + return initialValue; } /** * Information retrieved from type info check. */ export interface TypeInfo { - name: string - comment: string + name: string; + comment: string; } /** @@ -380,9 +402,9 @@ export interface TypeInfo { * @internal */ export const DEFAULTS: RegisterOptions = { - cwd: env.TS_NODE_CWD ?? env.TS_NODE_DIR, // tslint:disable-line:deprecation + cwd: env.TS_NODE_CWD ?? env.TS_NODE_DIR, emit: yn(env.TS_NODE_EMIT), - scope: yn(env.TS_NODE_SCOPE), // tslint:disable-line:deprecation + scope: yn(env.TS_NODE_SCOPE), files: yn(env.TS_NODE_FILES), pretty: yn(env.TS_NODE_PRETTY), compiler: env.TS_NODE_COMPILER, @@ -397,8 +419,8 @@ export const DEFAULTS: RegisterOptions = { typeCheck: yn(env.TS_NODE_TYPE_CHECK), compilerHost: yn(env.TS_NODE_COMPILER_HOST), logError: yn(env.TS_NODE_LOG_ERROR), - experimentalEsmLoader: false -} + experimentalEsmLoader: false, +}; /** * TypeScript compiler option values required by `ts-node` which cannot be overridden. @@ -409,48 +431,48 @@ const TS_NODE_COMPILER_OPTIONS = { inlineSources: true, declaration: false, noEmit: false, - outDir: '.ts-node' -} + outDir: '.ts-node', +}; /** * Split a string array of values. * @internal */ -export function split (value: string | undefined) { - return typeof value === 'string' ? value.split(/ *, */g) : undefined +export function split(value: string | undefined) { + return typeof value === 'string' ? value.split(/ *, */g) : undefined; } /** * Parse a string as JSON. * @internal */ -export function parse (value: string | undefined): object | undefined { - return typeof value === 'string' ? JSON.parse(value) : undefined +export function parse(value: string | undefined): object | undefined { + return typeof value === 'string' ? JSON.parse(value) : undefined; } /** * Replace backslashes with forward slashes. * @internal */ -export function normalizeSlashes (value: string): string { - return value.replace(/\\/g, '/') +export function normalizeSlashes(value: string): string { + return value.replace(/\\/g, '/'); } /** * TypeScript diagnostics error. */ export class TSError extends BaseError { - name = 'TSError' + name = 'TSError'; - constructor (public diagnosticText: string, public diagnosticCodes: number[]) { - super(`⨯ Unable to compile TypeScript:\n${diagnosticText}`) + constructor(public diagnosticText: string, public diagnosticCodes: number[]) { + super(`⨯ Unable to compile TypeScript:\n${diagnosticText}`); } /** * @internal */ - [INSPECT_CUSTOM] () { - return this.diagnosticText + [INSPECT_CUSTOM]() { + return this.diagnosticText; } } @@ -458,15 +480,15 @@ export class TSError extends BaseError { * Primary ts-node service, which wraps the TypeScript API and can compile TypeScript to JavaScript */ export interface Service { - ts: TSCommon - config: _ts.ParsedCommandLine - options: RegisterOptions - enabled (enabled?: boolean): boolean - ignored (fileName: string): boolean - compile (code: string, fileName: string, lineOffset?: number): string - getTypeInfo (code: string, fileName: string, position: number): TypeInfo + ts: TSCommon; + config: _ts.ParsedCommandLine; + options: RegisterOptions; + enabled(enabled?: boolean): boolean; + ignored(fileName: string): boolean; + compile(code: string, fileName: string, lineOffset?: number): string; + getTypeInfo(code: string, fileName: string, position: number): TypeInfo; /** @internal */ - configFilePath: string | undefined + configFilePath: string | undefined; } /** @@ -474,505 +496,651 @@ export interface Service { * @deprecated use `Service` instead * @see {Service} */ -export type Register = Service +export type Register = Service; /** * Cached fs operation wrapper. */ -function cachedLookup (fn: (arg: string) => T): (arg: string) => T { - const cache = new Map() +function cachedLookup(fn: (arg: string) => T): (arg: string) => T { + const cache = new Map(); return (arg: string): T => { if (!cache.has(arg)) { - cache.set(arg, fn(arg)) + cache.set(arg, fn(arg)); } - return cache.get(arg)! - } + return cache.get(arg)!; + }; } /** @internal */ -export function getExtensions (config: _ts.ParsedCommandLine) { - const tsExtensions = ['.ts'] - const jsExtensions = [] +export function getExtensions(config: _ts.ParsedCommandLine) { + const tsExtensions = ['.ts']; + const jsExtensions = []; // Enable additional extensions when JSX or `allowJs` is enabled. - if (config.options.jsx) tsExtensions.push('.tsx') - if (config.options.allowJs) jsExtensions.push('.js') - if (config.options.jsx && config.options.allowJs) jsExtensions.push('.jsx') - return { tsExtensions, jsExtensions } + if (config.options.jsx) tsExtensions.push('.tsx'); + if (config.options.allowJs) jsExtensions.push('.js'); + if (config.options.jsx && config.options.allowJs) jsExtensions.push('.jsx'); + return { tsExtensions, jsExtensions }; } /** * Register TypeScript compiler instance onto node.js */ -export function register (opts: RegisterOptions = {}): Service { - const originalJsHandler = require.extensions['.js'] // tslint:disable-line - const service = create(opts) - const { tsExtensions, jsExtensions } = getExtensions(service.config) - const extensions = [...tsExtensions, ...jsExtensions] +export function register(opts: RegisterOptions = {}): Service { + const originalJsHandler = require.extensions['.js']; + const service = create(opts); + const { tsExtensions, jsExtensions } = getExtensions(service.config); + const extensions = [...tsExtensions, ...jsExtensions]; // Expose registered instance globally. - process[REGISTER_INSTANCE] = service + process[REGISTER_INSTANCE] = service; // Register the extensions. - registerExtensions(service.options.preferTsExts, extensions, service, originalJsHandler) + registerExtensions( + service.options.preferTsExts, + extensions, + service, + originalJsHandler + ); // Require specified modules before start-up. - ;(Module as any)._preloadModules(service.options.require) + (Module as any)._preloadModules(service.options.require); - return service + return service; } /** * Create TypeScript compiler instance. */ -export function create (rawOptions: CreateOptions = {}): Service { - const cwd = resolve(rawOptions.cwd ?? rawOptions.dir ?? DEFAULTS.cwd ?? process.cwd()) // tslint:disable-line:deprecation - const compilerName = rawOptions.compiler ?? DEFAULTS.compiler +export function create(rawOptions: CreateOptions = {}): Service { + const cwd = resolve( + rawOptions.cwd ?? rawOptions.dir ?? DEFAULTS.cwd ?? process.cwd() + ); + const compilerName = rawOptions.compiler ?? DEFAULTS.compiler; /** * Load the typescript compiler. It is required to load the tsconfig but might * be changed by the tsconfig, so we have to do this twice. */ - function loadCompiler (name: string | undefined, relativeToPath: string) { - const compiler = require.resolve(name || 'typescript', { paths: [relativeToPath, __dirname] }) - const ts: typeof _ts = require(compiler) - return { compiler, ts } + function loadCompiler(name: string | undefined, relativeToPath: string) { + const compiler = require.resolve(name || 'typescript', { + paths: [relativeToPath, __dirname], + }); + const ts: typeof _ts = require(compiler); + return { compiler, ts }; } // Compute minimum options to read the config file. - let { compiler, ts } = loadCompiler(compilerName, rawOptions.projectSearchDir ?? rawOptions.project ?? cwd) + let { compiler, ts } = loadCompiler( + compilerName, + rawOptions.projectSearchDir ?? rawOptions.project ?? cwd + ); // Read config file and merge new options between env and CLI options. - const { configFilePath, config, tsNodeOptionsFromTsconfig } = readConfig(cwd, ts, rawOptions) - const options = assign({}, DEFAULTS, tsNodeOptionsFromTsconfig || {}, rawOptions) + const { configFilePath, config, tsNodeOptionsFromTsconfig } = readConfig( + cwd, + ts, + rawOptions + ); + const options = assign( + {}, + DEFAULTS, + tsNodeOptionsFromTsconfig || {}, + rawOptions + ); options.require = [ - ...tsNodeOptionsFromTsconfig.require || [], - ...rawOptions.require || [] - ] + ...(tsNodeOptionsFromTsconfig.require || []), + ...(rawOptions.require || []), + ]; // Re-load the compiler in case it has changed. // Compiler is loaded relative to tsconfig.json, so tsconfig discovery may cause us to load a // different compiler than we did above, even if the name has not changed. if (configFilePath) { - ({ compiler, ts } = loadCompiler(options.compiler, configFilePath)) + ({ compiler, ts } = loadCompiler(options.compiler, configFilePath)); } - const readFile = options.readFile || ts.sys.readFile - const fileExists = options.fileExists || ts.sys.fileExists + const readFile = options.readFile || ts.sys.readFile; + const fileExists = options.fileExists || ts.sys.fileExists; // typeCheck can override transpileOnly, useful for CLI flag to override config file - const transpileOnly = options.transpileOnly === true && options.typeCheck !== true - const transformers = options.transformers || undefined + const transpileOnly = + options.transpileOnly === true && options.typeCheck !== true; + const transformers = options.transformers || undefined; const ignoreDiagnostics = [ 6059, // "'rootDir' is expected to contain all source files." 18002, // "The 'files' list in config file is empty." 18003, // "No inputs were found in config file." - ...(options.ignoreDiagnostics || []) - ].map(Number) - - const configDiagnosticList = filterDiagnostics(config.errors, ignoreDiagnostics) - const outputCache = new Map() - - const configFileDirname = configFilePath ? dirname(configFilePath) : null - const scopeDir = options.scopeDir ?? config.options.rootDir ?? configFileDirname ?? cwd - const ignoreBaseDir = configFileDirname ?? cwd - const isScoped = options.scope ? (fileName: string) => relative(scopeDir, fileName).charAt(0) !== '.' : () => true - const shouldIgnore = createIgnore(ignoreBaseDir, options.skipIgnore ? [] : ( - options.ignore || ['(?:^|/)node_modules/'] - ).map(str => new RegExp(str))) + ...(options.ignoreDiagnostics || []), + ].map(Number); + + const configDiagnosticList = filterDiagnostics( + config.errors, + ignoreDiagnostics + ); + const outputCache = new Map< + string, + { + content: string; + } + >(); + + const configFileDirname = configFilePath ? dirname(configFilePath) : null; + const scopeDir = + options.scopeDir ?? config.options.rootDir ?? configFileDirname ?? cwd; + const ignoreBaseDir = configFileDirname ?? cwd; + const isScoped = options.scope + ? (fileName: string) => relative(scopeDir, fileName).charAt(0) !== '.' + : () => true; + const shouldIgnore = createIgnore( + ignoreBaseDir, + options.skipIgnore + ? [] + : (options.ignore || ['(?:^|/)node_modules/']).map( + (str) => new RegExp(str) + ) + ); const diagnosticHost: _ts.FormatDiagnosticsHost = { getNewLine: () => ts.sys.newLine, getCurrentDirectory: () => cwd, - getCanonicalFileName: ts.sys.useCaseSensitiveFileNames ? x => x : x => x.toLowerCase() - } + getCanonicalFileName: ts.sys.useCaseSensitiveFileNames + ? (x) => x + : (x) => x.toLowerCase(), + }; if (options.transpileOnly && typeof transformers === 'function') { - throw new TypeError('Transformers function is unavailable in "--transpile-only"') + throw new TypeError( + 'Transformers function is unavailable in "--transpile-only"' + ); } - let customTranspiler: Transpiler | undefined = undefined + let customTranspiler: Transpiler | undefined = undefined; if (options.transpiler) { - if (!transpileOnly) throw new Error('Custom transpiler can only be used when transpileOnly is enabled.') - const transpilerName = typeof options.transpiler === 'string' ? options.transpiler : options.transpiler[0] - const transpilerOptions = typeof options.transpiler === 'string' ? {} : options.transpiler[1] ?? {} + if (!transpileOnly) + throw new Error( + 'Custom transpiler can only be used when transpileOnly is enabled.' + ); + const transpilerName = + typeof options.transpiler === 'string' + ? options.transpiler + : options.transpiler[0]; + const transpilerOptions = + typeof options.transpiler === 'string' ? {} : options.transpiler[1] ?? {}; // TODO mimic fixed resolution logic from loadCompiler master // TODO refactor into a more generic "resolve dep relative to project" helper - const transpilerPath = require.resolve(transpilerName, { paths: [cwd, __dirname] }) - const transpilerFactory: TranspilerFactory = require(transpilerPath).create + const transpilerPath = require.resolve(transpilerName, { + paths: [cwd, __dirname], + }); + const transpilerFactory: TranspilerFactory = require(transpilerPath).create; customTranspiler = transpilerFactory({ service: { options, config }, - ...transpilerOptions - }) + ...transpilerOptions, + }); } // Install source map support and read from memory cache. sourceMapSupport.install({ environment: 'node', - retrieveFile (pathOrUrl: string) { - let path = pathOrUrl + retrieveFile(pathOrUrl: string) { + let path = pathOrUrl; // If it's a file URL, convert to local path // Note: fileURLToPath does not exist on early node v10 // I could not find a way to handle non-URLs except to swallow an error if (options.experimentalEsmLoader && path.startsWith('file://')) { try { - path = fileURLToPath(path) - } catch (e) {/* swallow error */} + path = fileURLToPath(path); + } catch (e) { + /* swallow error */ + } } - path = normalizeSlashes(path) - return outputCache.get(path)?.content || '' - } - }) - - const formatDiagnostics = process.stdout.isTTY || options.pretty - ? (ts.formatDiagnosticsWithColorAndContext || ts.formatDiagnostics) - : ts.formatDiagnostics - - function createTSError (diagnostics: ReadonlyArray<_ts.Diagnostic>) { - const diagnosticText = formatDiagnostics(diagnostics, diagnosticHost) - const diagnosticCodes = diagnostics.map(x => x.code) - return new TSError(diagnosticText, diagnosticCodes) + path = normalizeSlashes(path); + return outputCache.get(path)?.content || ''; + }, + }); + + const formatDiagnostics = + process.stdout.isTTY || options.pretty + ? ts.formatDiagnosticsWithColorAndContext || ts.formatDiagnostics + : ts.formatDiagnostics; + + function createTSError(diagnostics: ReadonlyArray<_ts.Diagnostic>) { + const diagnosticText = formatDiagnostics(diagnostics, diagnosticHost); + const diagnosticCodes = diagnostics.map((x) => x.code); + return new TSError(diagnosticText, diagnosticCodes); } - function reportTSError (configDiagnosticList: _ts.Diagnostic[]) { - const error = createTSError(configDiagnosticList) + function reportTSError(configDiagnosticList: _ts.Diagnostic[]) { + const error = createTSError(configDiagnosticList); if (options.logError) { // Print error in red color and continue execution. - console.error('\x1b[31m%s\x1b[0m', error) + console.error('\x1b[31m%s\x1b[0m', error); } else { // Throw error and exit the script. - throw error + throw error; } } // Render the configuration errors. - if (configDiagnosticList.length) reportTSError(configDiagnosticList) + if (configDiagnosticList.length) reportTSError(configDiagnosticList); /** * Get the extension for a transpiled file. */ - const getExtension = config.options.jsx === ts.JsxEmit.Preserve ? - ((path: string) => /\.[tj]sx$/.test(path) ? '.jsx' : '.js') : - ((_: string) => '.js') + const getExtension = + config.options.jsx === ts.JsxEmit.Preserve + ? (path: string) => (/\.[tj]sx$/.test(path) ? '.jsx' : '.js') + : (_: string) => '.js'; /** * Create the basic required function using transpile mode. */ - let getOutput: (code: string, fileName: string) => SourceOutput - let getTypeInfo: (_code: string, _fileName: string, _position: number) => TypeInfo + let getOutput: (code: string, fileName: string) => SourceOutput; + let getTypeInfo: ( + _code: string, + _fileName: string, + _position: number + ) => TypeInfo; - const getCanonicalFileName = (ts as unknown as TSInternal).createGetCanonicalFileName(ts.sys.useCaseSensitiveFileNames) + const getCanonicalFileName = ((ts as unknown) as TSInternal).createGetCanonicalFileName( + ts.sys.useCaseSensitiveFileNames + ); // In a factory because these are shared across both CompilerHost and LanguageService codepaths - function createResolverFunctions (serviceHost: _ts.ModuleResolutionHost) { - const moduleResolutionCache = ts.createModuleResolutionCache(cwd, getCanonicalFileName, config.options) - const knownInternalFilenames = new Set() + function createResolverFunctions(serviceHost: _ts.ModuleResolutionHost) { + const moduleResolutionCache = ts.createModuleResolutionCache( + cwd, + getCanonicalFileName, + config.options + ); + const knownInternalFilenames = new Set(); /** "Buckets" (module directories) whose contents should be marked "internal" */ - const internalBuckets = new Set() + const internalBuckets = new Set(); // Get bucket for a source filename. Bucket is the containing `./node_modules/*/` directory // For '/project/node_modules/foo/node_modules/bar/lib/index.js' bucket is '/project/node_modules/foo/node_modules/bar/' // For '/project/node_modules/foo/node_modules/@scope/bar/lib/index.js' bucket is '/project/node_modules/foo/node_modules/@scope/bar/' - const moduleBucketRe = /.*\/node_modules\/(?:@[^\/]+\/)?[^\/]+\// - function getModuleBucket (filename: string) { - const find = moduleBucketRe.exec(filename) - if (find) return find[0] - return '' + const moduleBucketRe = /.*\/node_modules\/(?:@[^\/]+\/)?[^\/]+\//; + function getModuleBucket(filename: string) { + const find = moduleBucketRe.exec(filename); + if (find) return find[0]; + return ''; } // Mark that this file and all siblings in its bucket should be "internal" - function markBucketOfFilenameInternal (filename: string) { - internalBuckets.add(getModuleBucket(filename)) + function markBucketOfFilenameInternal(filename: string) { + internalBuckets.add(getModuleBucket(filename)); } - function isFileInInternalBucket (filename: string) { - return internalBuckets.has(getModuleBucket(filename)) + function isFileInInternalBucket(filename: string) { + return internalBuckets.has(getModuleBucket(filename)); } - function isFileKnownToBeInternal (filename: string) { - return knownInternalFilenames.has(filename) + function isFileKnownToBeInternal(filename: string) { + return knownInternalFilenames.has(filename); } /** * If we need to emit JS for a file, force TS to consider it non-external */ - const fixupResolvedModule = (resolvedModule: _ts.ResolvedModule | _ts.ResolvedTypeReferenceDirective) => { - const { resolvedFileName } = resolvedModule - if (resolvedFileName === undefined) return + const fixupResolvedModule = ( + resolvedModule: _ts.ResolvedModule | _ts.ResolvedTypeReferenceDirective + ) => { + const { resolvedFileName } = resolvedModule; + if (resolvedFileName === undefined) return; // .ts is always switched to internal // .js is switched on-demand if ( - resolvedModule.isExternalLibraryImport && ( - (resolvedFileName.endsWith('.ts') && !resolvedFileName.endsWith('.d.ts')) || + resolvedModule.isExternalLibraryImport && + ((resolvedFileName.endsWith('.ts') && + !resolvedFileName.endsWith('.d.ts')) || isFileKnownToBeInternal(resolvedFileName) || - isFileInInternalBucket(resolvedFileName) - ) + isFileInInternalBucket(resolvedFileName)) ) { - resolvedModule.isExternalLibraryImport = false + resolvedModule.isExternalLibraryImport = false; } if (!resolvedModule.isExternalLibraryImport) { - knownInternalFilenames.add(resolvedFileName) + knownInternalFilenames.add(resolvedFileName); } - } + }; /* * NOTE: * Older ts versions do not pass `redirectedReference` nor `options`. * We must pass `redirectedReference` to newer ts versions, but cannot rely on `options`, hence the weird argument name */ - const resolveModuleNames: _ts.LanguageServiceHost['resolveModuleNames'] = (moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: _ts.ResolvedProjectReference | undefined, optionsOnlyWithNewerTsVersions: _ts.CompilerOptions): (_ts.ResolvedModule | undefined)[] => { - return moduleNames.map(moduleName => { - const { resolvedModule } = ts.resolveModuleName(moduleName, containingFile, config.options, serviceHost, moduleResolutionCache, redirectedReference) + const resolveModuleNames: _ts.LanguageServiceHost['resolveModuleNames'] = ( + moduleNames: string[], + containingFile: string, + reusedNames: string[] | undefined, + redirectedReference: _ts.ResolvedProjectReference | undefined, + optionsOnlyWithNewerTsVersions: _ts.CompilerOptions + ): (_ts.ResolvedModule | undefined)[] => { + return moduleNames.map((moduleName) => { + const { resolvedModule } = ts.resolveModuleName( + moduleName, + containingFile, + config.options, + serviceHost, + moduleResolutionCache, + redirectedReference + ); if (resolvedModule) { - fixupResolvedModule(resolvedModule) + fixupResolvedModule(resolvedModule); } - return resolvedModule - }) - } + return resolvedModule; + }); + }; // language service never calls this, but TS docs recommend that we implement it - const getResolvedModuleWithFailedLookupLocationsFromCache: _ts.LanguageServiceHost['getResolvedModuleWithFailedLookupLocationsFromCache'] = (moduleName, containingFile): _ts.ResolvedModuleWithFailedLookupLocations | undefined => { - const ret = ts.resolveModuleNameFromCache(moduleName, containingFile, moduleResolutionCache) + const getResolvedModuleWithFailedLookupLocationsFromCache: _ts.LanguageServiceHost['getResolvedModuleWithFailedLookupLocationsFromCache'] = ( + moduleName, + containingFile + ): _ts.ResolvedModuleWithFailedLookupLocations | undefined => { + const ret = ts.resolveModuleNameFromCache( + moduleName, + containingFile, + moduleResolutionCache + ); if (ret && ret.resolvedModule) { - fixupResolvedModule(ret.resolvedModule) + fixupResolvedModule(ret.resolvedModule); } - return ret - } - - const resolveTypeReferenceDirectives: _ts.LanguageServiceHost['resolveTypeReferenceDirectives'] = (typeDirectiveNames: string[], containingFile: string, redirectedReference: _ts.ResolvedProjectReference | undefined, options: _ts.CompilerOptions): (_ts.ResolvedTypeReferenceDirective | undefined)[] => { + return ret; + }; + + const resolveTypeReferenceDirectives: _ts.LanguageServiceHost['resolveTypeReferenceDirectives'] = ( + typeDirectiveNames: string[], + containingFile: string, + redirectedReference: _ts.ResolvedProjectReference | undefined, + options: _ts.CompilerOptions + ): (_ts.ResolvedTypeReferenceDirective | undefined)[] => { // Note: seems to be called with empty typeDirectiveNames array for all files. - return typeDirectiveNames.map(typeDirectiveName => { - const { resolvedTypeReferenceDirective } = ts.resolveTypeReferenceDirective(typeDirectiveName, containingFile, config.options, serviceHost, redirectedReference) + return typeDirectiveNames.map((typeDirectiveName) => { + const { + resolvedTypeReferenceDirective, + } = ts.resolveTypeReferenceDirective( + typeDirectiveName, + containingFile, + config.options, + serviceHost, + redirectedReference + ); if (resolvedTypeReferenceDirective) { - fixupResolvedModule(resolvedTypeReferenceDirective) + fixupResolvedModule(resolvedTypeReferenceDirective); } - return resolvedTypeReferenceDirective - }) - } + return resolvedTypeReferenceDirective; + }); + }; return { resolveModuleNames, getResolvedModuleWithFailedLookupLocationsFromCache, resolveTypeReferenceDirectives, isFileKnownToBeInternal, - markBucketOfFilenameInternal - } + markBucketOfFilenameInternal, + }; } // Use full language services when the fast option is disabled. if (!transpileOnly) { - const fileContents = new Map() - const rootFileNames = new Set(config.fileNames) - const cachedReadFile = cachedLookup(debugFn('readFile', readFile)) + const fileContents = new Map(); + const rootFileNames = new Set(config.fileNames); + const cachedReadFile = cachedLookup(debugFn('readFile', readFile)); // Use language services by default (TODO: invert next major version). if (!options.compilerHost) { - let projectVersion = 1 - const fileVersions = new Map(Array.from(rootFileNames).map(fileName => [fileName, 0])) + let projectVersion = 1; + const fileVersions = new Map( + Array.from(rootFileNames).map((fileName) => [fileName, 0]) + ); const getCustomTransformers = () => { if (typeof transformers === 'function') { - const program = service.getProgram() - return program ? transformers(program) : undefined + const program = service.getProgram(); + return program ? transformers(program) : undefined; } - return transformers - } + return transformers; + }; // Create the compiler host for type checking. - const serviceHost: _ts.LanguageServiceHost & Required> = { + const serviceHost: _ts.LanguageServiceHost & + Required> = { getProjectVersion: () => String(projectVersion), getScriptFileNames: () => Array.from(rootFileNames), getScriptVersion: (fileName: string) => { - const version = fileVersions.get(fileName) - return version ? version.toString() : '' + const version = fileVersions.get(fileName); + return version ? version.toString() : ''; }, - getScriptSnapshot (fileName: string) { + getScriptSnapshot(fileName: string) { // TODO ordering of this with getScriptVersion? Should they sync up? - let contents = fileContents.get(fileName) + let contents = fileContents.get(fileName); // Read contents into TypeScript memory cache. if (contents === undefined) { - contents = cachedReadFile(fileName) - if (contents === undefined) return + contents = cachedReadFile(fileName); + if (contents === undefined) return; - fileVersions.set(fileName, 1) - fileContents.set(fileName, contents) - projectVersion++ + fileVersions.set(fileName, 1); + fileContents.set(fileName, contents); + projectVersion++; } - return ts.ScriptSnapshot.fromString(contents) + return ts.ScriptSnapshot.fromString(contents); }, readFile: cachedReadFile, readDirectory: ts.sys.readDirectory, - getDirectories: cachedLookup(debugFn('getDirectories', ts.sys.getDirectories)), + getDirectories: cachedLookup( + debugFn('getDirectories', ts.sys.getDirectories) + ), fileExists: cachedLookup(debugFn('fileExists', fileExists)), - directoryExists: cachedLookup(debugFn('directoryExists', ts.sys.directoryExists)), - realpath: ts.sys.realpath ? cachedLookup(debugFn('realpath', ts.sys.realpath)) : undefined, + directoryExists: cachedLookup( + debugFn('directoryExists', ts.sys.directoryExists) + ), + realpath: ts.sys.realpath + ? cachedLookup(debugFn('realpath', ts.sys.realpath)) + : undefined, getNewLine: () => ts.sys.newLine, useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames, getCurrentDirectory: () => cwd, getCompilationSettings: () => config.options, getDefaultLibFileName: () => ts.getDefaultLibFilePath(config.options), - getCustomTransformers: getCustomTransformers - } - const { resolveModuleNames, getResolvedModuleWithFailedLookupLocationsFromCache, resolveTypeReferenceDirectives, isFileKnownToBeInternal, markBucketOfFilenameInternal } = createResolverFunctions(serviceHost) - serviceHost.resolveModuleNames = resolveModuleNames - serviceHost.getResolvedModuleWithFailedLookupLocationsFromCache = getResolvedModuleWithFailedLookupLocationsFromCache - serviceHost.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives - - const registry = ts.createDocumentRegistry(ts.sys.useCaseSensitiveFileNames, cwd) - const service = ts.createLanguageService(serviceHost, registry) + getCustomTransformers: getCustomTransformers, + }; + const { + resolveModuleNames, + getResolvedModuleWithFailedLookupLocationsFromCache, + resolveTypeReferenceDirectives, + isFileKnownToBeInternal, + markBucketOfFilenameInternal, + } = createResolverFunctions(serviceHost); + serviceHost.resolveModuleNames = resolveModuleNames; + serviceHost.getResolvedModuleWithFailedLookupLocationsFromCache = getResolvedModuleWithFailedLookupLocationsFromCache; + serviceHost.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives; + + const registry = ts.createDocumentRegistry( + ts.sys.useCaseSensitiveFileNames, + cwd + ); + const service = ts.createLanguageService(serviceHost, registry); const updateMemoryCache = (contents: string, fileName: string) => { // Add to `rootFiles` as necessary, either to make TS include a file it has not seen, // or to trigger a re-classification of files from external to internal. - if (!rootFileNames.has(fileName) && !isFileKnownToBeInternal(fileName)) { - markBucketOfFilenameInternal(fileName) - rootFileNames.add(fileName) + if ( + !rootFileNames.has(fileName) && + !isFileKnownToBeInternal(fileName) + ) { + markBucketOfFilenameInternal(fileName); + rootFileNames.add(fileName); // Increment project version for every change to rootFileNames. - projectVersion++ + projectVersion++; } - const previousVersion = fileVersions.get(fileName) || 0 - const previousContents = fileContents.get(fileName) + const previousVersion = fileVersions.get(fileName) || 0; + const previousContents = fileContents.get(fileName); // Avoid incrementing cache when nothing has changed. if (contents !== previousContents) { - fileVersions.set(fileName, previousVersion + 1) - fileContents.set(fileName, contents) + fileVersions.set(fileName, previousVersion + 1); + fileContents.set(fileName, contents); // Increment project version for every file change. - projectVersion++ + projectVersion++; } - } + }; - let previousProgram: _ts.Program | undefined = undefined + let previousProgram: _ts.Program | undefined = undefined; getOutput = (code: string, fileName: string) => { - updateMemoryCache(code, fileName) + updateMemoryCache(code, fileName); - const programBefore = service.getProgram() + const programBefore = service.getProgram(); if (programBefore !== previousProgram) { - debug(`compiler rebuilt Program instance when getting output for ${fileName}`) + debug( + `compiler rebuilt Program instance when getting output for ${fileName}` + ); } - const output = service.getEmitOutput(fileName) + const output = service.getEmitOutput(fileName); // Get the relevant diagnostics - this is 3x faster than `getPreEmitDiagnostics`. - const diagnostics = service.getSemanticDiagnostics(fileName) - .concat(service.getSyntacticDiagnostics(fileName)) + const diagnostics = service + .getSemanticDiagnostics(fileName) + .concat(service.getSyntacticDiagnostics(fileName)); - const programAfter = service.getProgram() + const programAfter = service.getProgram(); debug( 'invariant: Is service.getProject() identical before and after getting emit output and diagnostics? (should always be true) ', programBefore === programAfter - ) + ); - previousProgram = programAfter + previousProgram = programAfter; - const diagnosticList = filterDiagnostics(diagnostics, ignoreDiagnostics) - if (diagnosticList.length) reportTSError(diagnosticList) + const diagnosticList = filterDiagnostics( + diagnostics, + ignoreDiagnostics + ); + if (diagnosticList.length) reportTSError(diagnosticList); if (output.emitSkipped) { - throw new TypeError(`${relative(cwd, fileName)}: Emit skipped`) + throw new TypeError(`${relative(cwd, fileName)}: Emit skipped`); } // Throw an error when requiring `.d.ts` files. if (output.outputFiles.length === 0) { throw new TypeError( `Unable to require file: ${relative(cwd, fileName)}\n` + - 'This is usually the result of a faulty configuration or import. ' + - 'Make sure there is a `.js`, `.json` or other executable extension with ' + - 'loader attached before `ts-node` available.' - ) + 'This is usually the result of a faulty configuration or import. ' + + 'Make sure there is a `.js`, `.json` or other executable extension with ' + + 'loader attached before `ts-node` available.' + ); } - return [output.outputFiles[1].text, output.outputFiles[0].text] - } + return [output.outputFiles[1].text, output.outputFiles[0].text]; + }; getTypeInfo = (code: string, fileName: string, position: number) => { - updateMemoryCache(code, fileName) + updateMemoryCache(code, fileName); - const info = service.getQuickInfoAtPosition(fileName, position) - const name = ts.displayPartsToString(info ? info.displayParts : []) - const comment = ts.displayPartsToString(info ? info.documentation : []) + const info = service.getQuickInfoAtPosition(fileName, position); + const name = ts.displayPartsToString(info ? info.displayParts : []); + const comment = ts.displayPartsToString(info ? info.documentation : []); - return { name, comment } - } + return { name, comment }; + }; } else { const sys: _ts.System & _ts.FormatDiagnosticsHost = { ...ts.sys, ...diagnosticHost, readFile: (fileName: string) => { - const cacheContents = fileContents.get(fileName) - if (cacheContents !== undefined) return cacheContents - const contents = cachedReadFile(fileName) - if (contents) fileContents.set(fileName, contents) - return contents + const cacheContents = fileContents.get(fileName); + if (cacheContents !== undefined) return cacheContents; + const contents = cachedReadFile(fileName); + if (contents) fileContents.set(fileName, contents); + return contents; }, readDirectory: ts.sys.readDirectory, - getDirectories: cachedLookup(debugFn('getDirectories', ts.sys.getDirectories)), + getDirectories: cachedLookup( + debugFn('getDirectories', ts.sys.getDirectories) + ), fileExists: cachedLookup(debugFn('fileExists', fileExists)), - directoryExists: cachedLookup(debugFn('directoryExists', ts.sys.directoryExists)), + directoryExists: cachedLookup( + debugFn('directoryExists', ts.sys.directoryExists) + ), resolvePath: cachedLookup(debugFn('resolvePath', ts.sys.resolvePath)), - realpath: ts.sys.realpath ? cachedLookup(debugFn('realpath', ts.sys.realpath)) : undefined - } + realpath: ts.sys.realpath + ? cachedLookup(debugFn('realpath', ts.sys.realpath)) + : undefined, + }; const host: _ts.CompilerHost = ts.createIncrementalCompilerHost ? ts.createIncrementalCompilerHost(config.options, sys) : { - ...sys, - getSourceFile: (fileName, languageVersion) => { - const contents = sys.readFile(fileName) - if (contents === undefined) return - return ts.createSourceFile(fileName, contents, languageVersion) - }, - getDefaultLibLocation: () => normalizeSlashes(dirname(compiler)), - getDefaultLibFileName: () => normalizeSlashes(join(dirname(compiler), ts.getDefaultLibFileName(config.options))), - useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames - } - const { resolveModuleNames, resolveTypeReferenceDirectives, isFileKnownToBeInternal, markBucketOfFilenameInternal } = createResolverFunctions(host) - host.resolveModuleNames = resolveModuleNames - host.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives + ...sys, + getSourceFile: (fileName, languageVersion) => { + const contents = sys.readFile(fileName); + if (contents === undefined) return; + return ts.createSourceFile(fileName, contents, languageVersion); + }, + getDefaultLibLocation: () => normalizeSlashes(dirname(compiler)), + getDefaultLibFileName: () => + normalizeSlashes( + join( + dirname(compiler), + ts.getDefaultLibFileName(config.options) + ) + ), + useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames, + }; + const { + resolveModuleNames, + resolveTypeReferenceDirectives, + isFileKnownToBeInternal, + markBucketOfFilenameInternal, + } = createResolverFunctions(host); + host.resolveModuleNames = resolveModuleNames; + host.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives; // Fallback for older TypeScript releases without incremental API. let builderProgram = ts.createIncrementalProgram ? ts.createIncrementalProgram({ - rootNames: Array.from(rootFileNames), - options: config.options, - host: host, - configFileParsingDiagnostics: config.errors, - projectReferences: config.projectReferences - }) + rootNames: Array.from(rootFileNames), + options: config.options, + host: host, + configFileParsingDiagnostics: config.errors, + projectReferences: config.projectReferences, + }) : ts.createEmitAndSemanticDiagnosticsBuilderProgram( - Array.from(rootFileNames), - config.options, - host, - undefined, - config.errors, - config.projectReferences - ) + Array.from(rootFileNames), + config.options, + host, + undefined, + config.errors, + config.projectReferences + ); // Read and cache custom transformers. - const customTransformers = typeof transformers === 'function' - ? transformers(builderProgram.getProgram()) - : transformers + const customTransformers = + typeof transformers === 'function' + ? transformers(builderProgram.getProgram()) + : transformers; // Set the file contents into cache manually. const updateMemoryCache = (contents: string, fileName: string) => { - const previousContents = fileContents.get(fileName) - const contentsChanged = previousContents !== contents + const previousContents = fileContents.get(fileName); + const contentsChanged = previousContents !== contents; if (contentsChanged) { - fileContents.set(fileName, contents) + fileContents.set(fileName, contents); } // Add to `rootFiles` when discovered by compiler for the first time. - let addedToRootFileNames = false - if (!rootFileNames.has(fileName) && !isFileKnownToBeInternal(fileName)) { - markBucketOfFilenameInternal(fileName) - rootFileNames.add(fileName) - addedToRootFileNames = true + let addedToRootFileNames = false; + if ( + !rootFileNames.has(fileName) && + !isFileKnownToBeInternal(fileName) + ) { + markBucketOfFilenameInternal(fileName); + rootFileNames.add(fileName); + addedToRootFileNames = true; } // Update program when file changes. @@ -984,144 +1152,190 @@ export function create (rawOptions: CreateOptions = {}): Service { builderProgram, config.errors, config.projectReferences - ) + ); } - } + }; getOutput = (code: string, fileName: string) => { - const output: [string, string] = ['', ''] - - updateMemoryCache(code, fileName) - - const sourceFile = builderProgram.getSourceFile(fileName) - if (!sourceFile) throw new TypeError(`Unable to read file: ${fileName}`) - - const program = builderProgram.getProgram() - const diagnostics = ts.getPreEmitDiagnostics(program, sourceFile) - const diagnosticList = filterDiagnostics(diagnostics, ignoreDiagnostics) - if (diagnosticList.length) reportTSError(diagnosticList) - - const result = builderProgram.emit(sourceFile, (path, file, writeByteOrderMark) => { - if (path.endsWith('.map')) { - output[1] = file - } else { - output[0] = file - } - - if (options.emit) sys.writeFile(path, file, writeByteOrderMark) - }, undefined, undefined, customTransformers) + const output: [string, string] = ['', '']; + + updateMemoryCache(code, fileName); + + const sourceFile = builderProgram.getSourceFile(fileName); + if (!sourceFile) + throw new TypeError(`Unable to read file: ${fileName}`); + + const program = builderProgram.getProgram(); + const diagnostics = ts.getPreEmitDiagnostics(program, sourceFile); + const diagnosticList = filterDiagnostics( + diagnostics, + ignoreDiagnostics + ); + if (diagnosticList.length) reportTSError(diagnosticList); + + const result = builderProgram.emit( + sourceFile, + (path, file, writeByteOrderMark) => { + if (path.endsWith('.map')) { + output[1] = file; + } else { + output[0] = file; + } + + if (options.emit) sys.writeFile(path, file, writeByteOrderMark); + }, + undefined, + undefined, + customTransformers + ); if (result.emitSkipped) { - throw new TypeError(`${relative(cwd, fileName)}: Emit skipped`) + throw new TypeError(`${relative(cwd, fileName)}: Emit skipped`); } // Throw an error when requiring files that cannot be compiled. if (output[0] === '') { if (program.isSourceFileFromExternalLibrary(sourceFile)) { - throw new TypeError(`Unable to compile file from external library: ${relative(cwd, fileName)}`) + throw new TypeError( + `Unable to compile file from external library: ${relative( + cwd, + fileName + )}` + ); } throw new TypeError( `Unable to require file: ${relative(cwd, fileName)}\n` + - 'This is usually the result of a faulty configuration or import. ' + - 'Make sure there is a `.js`, `.json` or other executable extension with ' + - 'loader attached before `ts-node` available.' - ) + 'This is usually the result of a faulty configuration or import. ' + + 'Make sure there is a `.js`, `.json` or other executable extension with ' + + 'loader attached before `ts-node` available.' + ); } - return output - } + return output; + }; getTypeInfo = (code: string, fileName: string, position: number) => { - updateMemoryCache(code, fileName) + updateMemoryCache(code, fileName); - const sourceFile = builderProgram.getSourceFile(fileName) - if (!sourceFile) throw new TypeError(`Unable to read file: ${fileName}`) + const sourceFile = builderProgram.getSourceFile(fileName); + if (!sourceFile) + throw new TypeError(`Unable to read file: ${fileName}`); - const node = getTokenAtPosition(ts, sourceFile, position) - const checker = builderProgram.getProgram().getTypeChecker() - const symbol = checker.getSymbolAtLocation(node) + const node = getTokenAtPosition(ts, sourceFile, position); + const checker = builderProgram.getProgram().getTypeChecker(); + const symbol = checker.getSymbolAtLocation(node); - if (!symbol) return { name: '', comment: '' } + if (!symbol) return { name: '', comment: '' }; - const type = checker.getTypeOfSymbolAtLocation(symbol, node) - const signatures = [...type.getConstructSignatures(), ...type.getCallSignatures()] + const type = checker.getTypeOfSymbolAtLocation(symbol, node); + const signatures = [ + ...type.getConstructSignatures(), + ...type.getCallSignatures(), + ]; return { - name: signatures.length ? signatures.map(x => checker.signatureToString(x)).join('\n') : checker.typeToString(type), - comment: ts.displayPartsToString(symbol ? symbol.getDocumentationComment(checker) : []) - } - } + name: signatures.length + ? signatures.map((x) => checker.signatureToString(x)).join('\n') + : checker.typeToString(type), + comment: ts.displayPartsToString( + symbol ? symbol.getDocumentationComment(checker) : [] + ), + }; + }; // Write `.tsbuildinfo` when `--build` is enabled. if (options.emit && config.options.incremental) { process.on('exit', () => { // Emits `.tsbuildinfo` to filesystem. - (builderProgram.getProgram() as any).emitBuildInfo() - }) + (builderProgram.getProgram() as any).emitBuildInfo(); + }); } } } else { getOutput = (code: string, fileName: string): SourceOutput => { - let result: _ts.TranspileOutput + let result: _ts.TranspileOutput; if (customTranspiler) { result = customTranspiler.transpile(code, { - fileName - }) + fileName, + }); } else { result = ts.transpileModule(code, { fileName, compilerOptions: config.options, reportDiagnostics: true, - transformers: transformers as _ts.CustomTransformers | undefined - }) + transformers: transformers as _ts.CustomTransformers | undefined, + }); } - const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) - if (diagnosticList.length) reportTSError(diagnosticList) + const diagnosticList = filterDiagnostics( + result.diagnostics || [], + ignoreDiagnostics + ); + if (diagnosticList.length) reportTSError(diagnosticList); - return [result.outputText, result.sourceMapText as string] - } + return [result.outputText, result.sourceMapText as string]; + }; getTypeInfo = () => { - throw new TypeError('Type information is unavailable in "--transpile-only"') - } + throw new TypeError( + 'Type information is unavailable in "--transpile-only"' + ); + }; } // Create a simple TypeScript compiler proxy. - function compile (code: string, fileName: string, lineOffset = 0) { - const normalizedFileName = normalizeSlashes(fileName) - const [value, sourceMap] = getOutput(code, normalizedFileName) - const output = updateOutput(value, normalizedFileName, sourceMap, getExtension) - outputCache.set(normalizedFileName, { content: output }) - return output + function compile(code: string, fileName: string, lineOffset = 0) { + const normalizedFileName = normalizeSlashes(fileName); + const [value, sourceMap] = getOutput(code, normalizedFileName); + const output = updateOutput( + value, + normalizedFileName, + sourceMap, + getExtension + ); + outputCache.set(normalizedFileName, { content: output }); + return output; } - let active = true - const enabled = (enabled?: boolean) => enabled === undefined ? active : (active = !!enabled) - const extensions = getExtensions(config) + let active = true; + const enabled = (enabled?: boolean) => + enabled === undefined ? active : (active = !!enabled); + const extensions = getExtensions(config); const ignored = (fileName: string) => { - if (!active) return true - const ext = extname(fileName) - if (extensions.tsExtensions.includes(ext) || extensions.jsExtensions.includes(ext)) { - return !isScoped(fileName) || shouldIgnore(fileName) + if (!active) return true; + const ext = extname(fileName); + if ( + extensions.tsExtensions.includes(ext) || + extensions.jsExtensions.includes(ext) + ) { + return !isScoped(fileName) || shouldIgnore(fileName); } - return true - } - - return { ts, config, compile, getTypeInfo, ignored, enabled, options, configFilePath } + return true; + }; + + return { + ts, + config, + compile, + getTypeInfo, + ignored, + enabled, + options, + configFilePath, + }; } /** * Check if the filename should be ignored. */ -function createIgnore (ignoreBaseDir: string, ignore: RegExp[]) { +function createIgnore(ignoreBaseDir: string, ignore: RegExp[]) { return (fileName: string) => { - const relname = relative(ignoreBaseDir, fileName) - const path = normalizeSlashes(relname) + const relname = relative(ignoreBaseDir, fileName); + const path = normalizeSlashes(relname); - return ignore.some(x => x.test(path)) - } + return ignore.some((x) => x.test(path)); + }; } /** @@ -1129,16 +1343,16 @@ function createIgnore (ignoreBaseDir: string, ignore: RegExp[]) { * * @param {string} ext */ -function reorderRequireExtension (ext: string) { - const old = require.extensions[ext] // tslint:disable-line - delete require.extensions[ext] // tslint:disable-line - require.extensions[ext] = old // tslint:disable-line +function reorderRequireExtension(ext: string) { + const old = require.extensions[ext]; + delete require.extensions[ext]; + require.extensions[ext] = old; } /** * Register the extensions to support when importing files. */ -function registerExtensions ( +function registerExtensions( preferTsExts: boolean | null | undefined, extensions: string[], service: Service, @@ -1146,67 +1360,69 @@ function registerExtensions ( ) { // Register new extensions. for (const ext of extensions) { - registerExtension(ext, service, originalJsHandler) + registerExtension(ext, service, originalJsHandler); } if (preferTsExts) { - // tslint:disable-next-line:deprecation - const preferredExtensions = new Set([...extensions, ...Object.keys(require.extensions)]) + const preferredExtensions = new Set([ + ...extensions, + ...Object.keys(require.extensions), + ]); - for (const ext of preferredExtensions) reorderRequireExtension(ext) + for (const ext of preferredExtensions) reorderRequireExtension(ext); } } /** * Register the extension for node. */ -function registerExtension ( +function registerExtension( ext: string, service: Service, originalHandler: (m: NodeModule, filename: string) => any ) { - const old = require.extensions[ext] || originalHandler // tslint:disable-line + const old = require.extensions[ext] || originalHandler; - require.extensions[ext] = function (m: any, filename) { // tslint:disable-line - if (service.ignored(filename)) return old(m, filename) + require.extensions[ext] = function (m: any, filename) { + if (service.ignored(filename)) return old(m, filename); - assertScriptCanLoadAsCJS(filename) + assertScriptCanLoadAsCJS(filename); - const _compile = m._compile + const _compile = m._compile; m._compile = function (code: string, fileName: string) { - debug('module._compile', fileName) + debug('module._compile', fileName); - return _compile.call(this, service.compile(code, fileName), fileName) - } + return _compile.call(this, service.compile(code, fileName), fileName); + }; - return old(m, filename) - } + return old(m, filename); + }; } /** * Do post-processing on config options to support `ts-node`. */ -function fixConfig (ts: TSCommon, config: _ts.ParsedCommandLine) { +function fixConfig(ts: TSCommon, config: _ts.ParsedCommandLine) { // Delete options that *should not* be passed through. - delete config.options.out - delete config.options.outFile - delete config.options.composite - delete config.options.declarationDir - delete config.options.declarationMap - delete config.options.emitDeclarationOnly + delete config.options.out; + delete config.options.outFile; + delete config.options.composite; + delete config.options.declarationDir; + delete config.options.declarationMap; + delete config.options.emitDeclarationOnly; // Target ES5 output by default (instead of ES3). if (config.options.target === undefined) { - config.options.target = ts.ScriptTarget.ES5 + config.options.target = ts.ScriptTarget.ES5; } // Target CommonJS modules by default (instead of magically switching to ES6 when the target is ES6). if (config.options.module === undefined) { - config.options.module = ts.ModuleKind.CommonJS + config.options.module = ts.ModuleKind.CommonJS; } - return config + return config; } /** @@ -1216,7 +1432,7 @@ function fixConfig (ts: TSCommon, config: _ts.ParsedCommandLine) { * Even when a tsconfig.json is not loaded, this function still handles merging * compilerOptions from various sources: API, environment variables, etc. */ -function readConfig ( +function readConfig( cwd: string, ts: TSCommon, rawApiOptions: CreateOptions @@ -1224,65 +1440,71 @@ function readConfig ( /** * Path of tsconfig file if one was loaded */ - configFilePath: string | undefined, + configFilePath: string | undefined; /** * Parsed TypeScript configuration with compilerOptions merged from all other sources (env vars, etc) */ - config: _ts.ParsedCommandLine + config: _ts.ParsedCommandLine; /** * ts-node options pulled from `tsconfig.json`, NOT merged with any other sources. Merging must happen outside * this function. */ - tsNodeOptionsFromTsconfig: TsConfigOptions + tsNodeOptionsFromTsconfig: TsConfigOptions; } { - let config: any = { compilerOptions: {} } - let basePath = cwd - let configFilePath: string | undefined = undefined - const projectSearchDir = resolve(cwd, rawApiOptions.projectSearchDir ?? cwd) + let config: any = { compilerOptions: {} }; + let basePath = cwd; + let configFilePath: string | undefined = undefined; + const projectSearchDir = resolve(cwd, rawApiOptions.projectSearchDir ?? cwd); const { fileExists = ts.sys.fileExists, readFile = ts.sys.readFile, skipProject = DEFAULTS.skipProject, - project = DEFAULTS.project - } = rawApiOptions + project = DEFAULTS.project, + } = rawApiOptions; // Read project configuration when available. if (!skipProject) { configFilePath = project ? resolve(cwd, project) - : ts.findConfigFile(projectSearchDir, fileExists) + : ts.findConfigFile(projectSearchDir, fileExists); if (configFilePath) { - const result = ts.readConfigFile(configFilePath, readFile) + const result = ts.readConfigFile(configFilePath, readFile); // Return diagnostics. if (result.error) { return { configFilePath, config: { errors: [result.error], fileNames: [], options: {} }, - tsNodeOptionsFromTsconfig: {} - } + tsNodeOptionsFromTsconfig: {}, + }; } - config = result.config - basePath = dirname(configFilePath) + config = result.config; + basePath = dirname(configFilePath); } } // Fix ts-node options that come from tsconfig.json - const tsNodeOptionsFromTsconfig: TsConfigOptions = Object.assign({}, filterRecognizedTsConfigTsNodeOptions(config['ts-node'])) + const tsNodeOptionsFromTsconfig: TsConfigOptions = Object.assign( + {}, + filterRecognizedTsConfigTsNodeOptions(config['ts-node']) + ); // Remove resolution of "files". - const files = rawApiOptions.files ?? tsNodeOptionsFromTsconfig.files ?? DEFAULTS.files + const files = + rawApiOptions.files ?? tsNodeOptionsFromTsconfig.files ?? DEFAULTS.files; if (!files) { - config.files = [] - config.include = [] + config.files = []; + config.include = []; } // Only if a config file is *not* loaded, load an implicit configuration from @tsconfig/bases - const skipDefaultCompilerOptions = configFilePath != null // tslint:disable-line - const defaultCompilerOptionsForNodeVersion = skipDefaultCompilerOptions ? undefined : getDefaultTsconfigJsonForNodeVersion(ts).compilerOptions + const skipDefaultCompilerOptions = configFilePath != null; + const defaultCompilerOptionsForNodeVersion = skipDefaultCompilerOptions + ? undefined + : getDefaultTsconfigJsonForNodeVersion(ts).compilerOptions; // Merge compilerOptions from all sources config.compilerOptions = Object.assign( @@ -1299,81 +1521,139 @@ function readConfig ( rawApiOptions.compilerOptions, // overrides required by ts-node, cannot be changed TS_NODE_COMPILER_OPTIONS - ) - - const fixedConfig = fixConfig(ts, ts.parseJsonConfigFileContent(config, { - fileExists, - readFile, - readDirectory: ts.sys.readDirectory, - useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames - }, basePath, undefined, configFilePath)) + ); + + const fixedConfig = fixConfig( + ts, + ts.parseJsonConfigFileContent( + config, + { + fileExists, + readFile, + readDirectory: ts.sys.readDirectory, + useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames, + }, + basePath, + undefined, + configFilePath + ) + ); if (tsNodeOptionsFromTsconfig.require) { // Modules are found relative to the tsconfig file, not the `dir` option - const tsconfigRelativeRequire = createRequire(configFilePath!) - tsNodeOptionsFromTsconfig.require = tsNodeOptionsFromTsconfig.require.map((path: string) => { - return tsconfigRelativeRequire.resolve(path) - }) + const tsconfigRelativeRequire = createRequire(configFilePath!); + tsNodeOptionsFromTsconfig.require = tsNodeOptionsFromTsconfig.require.map( + (path: string) => { + return tsconfigRelativeRequire.resolve(path); + } + ); } - return { configFilePath, config: fixedConfig, tsNodeOptionsFromTsconfig } + return { configFilePath, config: fixedConfig, tsNodeOptionsFromTsconfig }; } /** * Given the raw "ts-node" sub-object from a tsconfig, return an object with only the properties * recognized by "ts-node" */ -function filterRecognizedTsConfigTsNodeOptions (jsonObject: any): TsConfigOptions { - if (jsonObject == null) return jsonObject +function filterRecognizedTsConfigTsNodeOptions( + jsonObject: any +): TsConfigOptions { + if (jsonObject == null) return jsonObject; const { - compiler, compilerHost, compilerOptions, emit, files, ignore, - ignoreDiagnostics, logError, preferTsExts, pretty, require, skipIgnore, - transpileOnly, typeCheck, transpiler - } = jsonObject as TsConfigOptions + compiler, + compilerHost, + compilerOptions, + emit, + files, + ignore, + ignoreDiagnostics, + logError, + preferTsExts, + pretty, + require, + skipIgnore, + transpileOnly, + typeCheck, + transpiler, + } = jsonObject as TsConfigOptions; const filteredTsConfigOptions = { - compiler, compilerHost, compilerOptions, emit, files, ignore, - ignoreDiagnostics, logError, preferTsExts, pretty, require, skipIgnore, - transpileOnly, typeCheck, transpiler - } + compiler, + compilerHost, + compilerOptions, + emit, + files, + ignore, + ignoreDiagnostics, + logError, + preferTsExts, + pretty, + require, + skipIgnore, + transpileOnly, + typeCheck, + transpiler, + }; // Use the typechecker to make sure this implementation has the correct set of properties - const catchExtraneousProps: keyof TsConfigOptions = null as any as keyof typeof filteredTsConfigOptions - const catchMissingProps: keyof typeof filteredTsConfigOptions = null as any as keyof TsConfigOptions - return filteredTsConfigOptions + const catchExtraneousProps: keyof TsConfigOptions = (null as any) as keyof typeof filteredTsConfigOptions; + const catchMissingProps: keyof typeof filteredTsConfigOptions = (null as any) as keyof TsConfigOptions; + return filteredTsConfigOptions; } /** * Internal source output. */ -type SourceOutput = [string, string] +type SourceOutput = [string, string]; /** * Update the output remapping the source map. */ -function updateOutput (outputText: string, fileName: string, sourceMap: string, getExtension: (fileName: string) => string) { - const base64Map = Buffer.from(updateSourceMap(sourceMap, fileName), 'utf8').toString('base64') - const sourceMapContent = `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${base64Map}` +function updateOutput( + outputText: string, + fileName: string, + sourceMap: string, + getExtension: (fileName: string) => string +) { + const base64Map = Buffer.from( + updateSourceMap(sourceMap, fileName), + 'utf8' + ).toString('base64'); + const sourceMapContent = `//# sourceMappingURL=data:application/json;charset=utf-8;base64,${base64Map}`; // Expected form: `//# sourceMappingURL=foo.js.map` for input file foo.tsx - const sourceMapLength = /*//# sourceMappingURL=*/ 21 + /*foo.tsx*/ basename(fileName).length - /*.tsx*/ extname(fileName).length + /*.js*/ getExtension(fileName).length + /*.map*/ 4 + const sourceMapLength = + /*//# sourceMappingURL=*/ 21 + + /*foo.tsx*/ basename(fileName).length - + /*.tsx*/ extname(fileName).length + + /*.js*/ getExtension(fileName).length + + /*.map*/ 4; // Only rewrite if existing directive exists, to support compilers that do not append a sourcemap directive - return (outputText.slice(-sourceMapLength, -sourceMapLength + 21) === '//# sourceMappingURL=' ? outputText.slice(0, -sourceMapLength) : outputText) + sourceMapContent + return ( + (outputText.slice(-sourceMapLength, -sourceMapLength + 21) === + '//# sourceMappingURL=' + ? outputText.slice(0, -sourceMapLength) + : outputText) + sourceMapContent + ); } /** * Update the source map contents for improved output. */ -function updateSourceMap (sourceMapText: string, fileName: string) { - const sourceMap = JSON.parse(sourceMapText) - sourceMap.file = fileName - sourceMap.sources = [fileName] - delete sourceMap.sourceRoot - return JSON.stringify(sourceMap) +function updateSourceMap(sourceMapText: string, fileName: string) { + const sourceMap = JSON.parse(sourceMapText); + sourceMap.file = fileName; + sourceMap.sources = [fileName]; + delete sourceMap.sourceRoot; + return JSON.stringify(sourceMap); } /** * Filter diagnostics. */ -function filterDiagnostics (diagnostics: readonly _ts.Diagnostic[], ignore: number[]) { - return diagnostics.filter(x => ignore.indexOf(x.code) === -1) +function filterDiagnostics( + diagnostics: readonly _ts.Diagnostic[], + ignore: number[] +) { + return diagnostics.filter((x) => ignore.indexOf(x.code) === -1); } /** @@ -1381,21 +1661,25 @@ function filterDiagnostics (diagnostics: readonly _ts.Diagnostic[], ignore: numb * * Reference: https://github.com/microsoft/TypeScript/blob/fcd9334f57d85b73dd66ad2d21c02e84822f4841/src/services/utilities.ts#L705-L731 */ -function getTokenAtPosition (ts: TSCommon, sourceFile: _ts.SourceFile, position: number): _ts.Node { - let current: _ts.Node = sourceFile +function getTokenAtPosition( + ts: TSCommon, + sourceFile: _ts.SourceFile, + position: number +): _ts.Node { + let current: _ts.Node = sourceFile; outer: while (true) { for (const child of current.getChildren(sourceFile)) { - const start = child.getFullStart() - if (start > position) break + const start = child.getFullStart(); + if (start > position) break; - const end = child.getEnd() + const end = child.getEnd(); if (position <= end) { - current = child - continue outer + current = child; + continue outer; } } - return current + return current; } } diff --git a/src/repl.ts b/src/repl.ts index 2b8074021..2ded04cc7 100644 --- a/src/repl.ts +++ b/src/repl.ts @@ -1,49 +1,54 @@ -import { diffLines } from 'diff' -import { homedir } from 'os' -import { join } from 'path' -import { Recoverable, start } from 'repl' -import { Script } from 'vm' -import { Service, CreateOptions, TSError, env } from './index' -import { readFileSync, statSync } from 'fs' -import { Console } from 'console' -import * as tty from 'tty' +import { diffLines } from 'diff'; +import { homedir } from 'os'; +import { join } from 'path'; +import { Recoverable, start } from 'repl'; +import { Script } from 'vm'; +import { Service, CreateOptions, TSError, env } from './index'; +import { readFileSync, statSync } from 'fs'; +import { Console } from 'console'; +import * as tty from 'tty'; /** * Eval filename for REPL/debug. * @internal */ -export const EVAL_FILENAME = `[eval].ts` +export const EVAL_FILENAME = `[eval].ts`; export interface ReplService { - readonly state: EvalState + readonly state: EvalState; /** * Bind this REPL to a ts-node compiler service. A compiler service must be bound before `eval`-ing code or starting the REPL */ - setService (service: Service): void - evalCode (code: string): void + setService(service: Service): void; + evalCode(code: string): void; /** * `eval` implementation compatible with node's REPL API */ - nodeEval (code: string, _context: any, _filename: string, callback: (err: Error | null, result?: any) => any): void - evalAwarePartialHost: EvalAwarePartialHost + nodeEval( + code: string, + _context: any, + _filename: string, + callback: (err: Error | null, result?: any) => any + ): void; + evalAwarePartialHost: EvalAwarePartialHost; /** Start a node REPL */ - start (code?: string): void + start(code?: string): void; /** @internal */ - readonly stdin: NodeJS.ReadableStream + readonly stdin: NodeJS.ReadableStream; /** @internal */ - readonly stdout: NodeJS.WritableStream + readonly stdout: NodeJS.WritableStream; /** @internal */ - readonly stderr: NodeJS.WritableStream + readonly stderr: NodeJS.WritableStream; /** @internal */ - readonly console: Console + readonly console: Console; } export interface CreateReplOptions { - service?: Service - state?: EvalState - stdin?: NodeJS.ReadableStream - stdout?: NodeJS.WritableStream - stderr?: NodeJS.WritableStream + service?: Service; + state?: EvalState; + stdin?: NodeJS.ReadableStream; + stdout?: NodeJS.WritableStream; + stderr?: NodeJS.WritableStream; } /** @@ -56,14 +61,18 @@ export interface CreateReplOptions { * repl.setService(service) * repl.start() */ -export function createRepl (options: CreateReplOptions = {}) { - let service = options.service - const state = options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)) - const evalAwarePartialHost = createEvalAwarePartialHost(state) - const stdin = options.stdin ?? process.stdin - const stdout = options.stdout ?? process.stdout - const stderr = options.stderr ?? process.stderr - const _console = stdout === process.stdout && stderr === process.stderr ? console : new Console(stdout, stderr) +export function createRepl(options: CreateReplOptions = {}) { + let service = options.service; + const state = + options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)); + const evalAwarePartialHost = createEvalAwarePartialHost(state); + const stdin = options.stdin ?? process.stdin; + const stdout = options.stdout ?? process.stdout; + const stderr = options.stderr ?? process.stderr; + const _console = + stdout === process.stdout && stderr === process.stderr + ? console + : new Console(stdout, stderr); const replService: ReplService = { state: options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)), @@ -75,49 +84,54 @@ export function createRepl (options: CreateReplOptions = {}) { stdin, stdout, stderr, - console: _console - } - return replService + console: _console, + }; + return replService; - function setService (_service: Service) { - service = _service + function setService(_service: Service) { + service = _service; } - function evalCode (code: string) { - return _eval(service!, state, code) + function evalCode(code: string) { + return _eval(service!, state, code); } - function nodeEval (code: string, _context: any, _filename: string, callback: (err: Error | null, result?: any) => any) { - let err: Error | null = null - let result: any + function nodeEval( + code: string, + _context: any, + _filename: string, + callback: (err: Error | null, result?: any) => any + ) { + let err: Error | null = null; + let result: any; // TODO: Figure out how to handle completion here. if (code === '.scope') { - callback(err) - return + callback(err); + return; } try { - result = evalCode(code) + result = evalCode(code); } catch (error) { if (error instanceof TSError) { // Support recoverable compilations using >= node 6. if (Recoverable && isRecoverable(error)) { - err = new Recoverable(error) + err = new Recoverable(error); } else { - _console.error(error) + _console.error(error); } } else { - err = error + err = error; } } - return callback(err, result) + return callback(err, result); } - function start (code?: string) { + function start(code?: string) { // TODO assert that service is set; remove all ! postfixes - return startRepl(replService, service!, state, code) + return startRepl(replService, service!, state, code); } } @@ -126,97 +140,108 @@ export function createRepl (options: CreateReplOptions = {}) { */ export class EvalState { /** @internal */ - input = '' + input = ''; /** @internal */ - output = '' + output = ''; /** @internal */ - version = 0 + version = 0; /** @internal */ - lines = 0 + lines = 0; - // tslint:disable-next-line:variable-name - __tsNodeEvalStateBrand: unknown + __tsNodeEvalStateBrand: unknown; - constructor (public path: string) { } + constructor(public path: string) {} } /** * Filesystem host functions which are aware of the "virtual" [eval].ts file used to compile REPL inputs. * Must be passed to `create()` to create a ts-node compiler service which can compile REPL inputs. */ -export type EvalAwarePartialHost = Pick +export type EvalAwarePartialHost = Pick< + CreateOptions, + 'readFile' | 'fileExists' +>; -export function createEvalAwarePartialHost (state: EvalState): EvalAwarePartialHost { - function readFile (path: string) { - if (path === state.path) return state.input +export function createEvalAwarePartialHost( + state: EvalState +): EvalAwarePartialHost { + function readFile(path: string) { + if (path === state.path) return state.input; try { - return readFileSync(path, 'utf8') - } catch (err) {/* Ignore. */} + return readFileSync(path, 'utf8'); + } catch (err) { + /* Ignore. */ + } } - function fileExists (path: string) { - if (path === state.path) return true + function fileExists(path: string) { + if (path === state.path) return true; try { - const stats = statSync(path) - return stats.isFile() || stats.isFIFO() + const stats = statSync(path); + return stats.isFile() || stats.isFIFO(); } catch (err) { - return false + return false; } } - return { readFile, fileExists } + return { readFile, fileExists }; } /** * Evaluate the code snippet. */ -function _eval (service: Service, state: EvalState, input: string) { - const lines = state.lines - const isCompletion = !/\n$/.test(input) - const undo = appendEval(state, input) - let output: string +function _eval(service: Service, state: EvalState, input: string) { + const lines = state.lines; + const isCompletion = !/\n$/.test(input); + const undo = appendEval(state, input); + let output: string; try { - output = service.compile(state.input, state.path, -lines) + output = service.compile(state.input, state.path, -lines); } catch (err) { - undo() - throw err + undo(); + throw err; } // Use `diff` to check for new JavaScript to execute. - const changes = diffLines(state.output, output) + const changes = diffLines(state.output, output); if (isCompletion) { - undo() + undo(); } else { - state.output = output + state.output = output; } return changes.reduce((result, change) => { - return change.added ? exec(change.value, state.path) : result - }, undefined) + return change.added ? exec(change.value, state.path) : result; + }, undefined); } /** * Execute some code. */ -function exec (code: string, filename: string) { - const script = new Script(code, { filename: filename }) +function exec(code: string, filename: string) { + const script = new Script(code, { filename: filename }); - return script.runInThisContext() + return script.runInThisContext(); } /** * Start a CLI REPL. */ -function startRepl (replService: ReplService, service: Service, state: EvalState, code?: string) { +function startRepl( + replService: ReplService, + service: Service, + state: EvalState, + code?: string +) { // Eval incoming code before the REPL starts. if (code) { try { - replService.evalCode(`${code}\n`) + replService.evalCode(`${code}\n`); } catch (err) { - replService.console.error(err) - process.exit(1) + replService.console.error(err); + process.exit(1); } } @@ -225,95 +250,106 @@ function startRepl (replService: ReplService, service: Service, state: EvalState input: replService.stdin, output: replService.stdout, // Mimicking node's REPL implementation: https://github.com/nodejs/node/blob/168b22ba073ee1cbf8d0bcb4ded7ff3099335d04/lib/internal/repl.js#L28-L30 - terminal: (replService.stdout as tty.WriteStream).isTTY && !parseInt(env.NODE_NO_READLINE!, 10), + terminal: + (replService.stdout as tty.WriteStream).isTTY && + !parseInt(env.NODE_NO_READLINE!, 10), eval: replService.nodeEval, - useGlobal: true - }) + useGlobal: true, + }); // Bookmark the point where we should reset the REPL state. - const resetEval = appendEval(state, '') + const resetEval = appendEval(state, ''); - function reset () { - resetEval() + function reset() { + resetEval(); // Hard fix for TypeScript forcing `Object.defineProperty(exports, ...)`. - exec('exports = module.exports', state.path) + exec('exports = module.exports', state.path); } - reset() - repl.on('reset', reset) + reset(); + repl.on('reset', reset); repl.defineCommand('type', { help: 'Check the type of a TypeScript identifier', action: function (identifier: string) { if (!identifier) { - repl.displayPrompt() - return + repl.displayPrompt(); + return; } - const undo = appendEval(state, identifier) - const { name, comment } = service.getTypeInfo(state.input, state.path, state.input.length) + const undo = appendEval(state, identifier); + const { name, comment } = service.getTypeInfo( + state.input, + state.path, + state.input.length + ); - undo() + undo(); - if (name) repl.outputStream.write(`${name}\n`) - if (comment) repl.outputStream.write(`${comment}\n`) - repl.displayPrompt() - } - }) + if (name) repl.outputStream.write(`${name}\n`); + if (comment) repl.outputStream.write(`${comment}\n`); + repl.displayPrompt(); + }, + }); // Set up REPL history when available natively via node.js >= 11. if (repl.setupHistory) { - const historyPath = env.TS_NODE_HISTORY || join(homedir(), '.ts_node_repl_history') + const historyPath = + env.TS_NODE_HISTORY || join(homedir(), '.ts_node_repl_history'); - repl.setupHistory(historyPath, err => { - if (!err) return + repl.setupHistory(historyPath, (err) => { + if (!err) return; - replService.console.error(err) - process.exit(1) - }) + replService.console.error(err); + process.exit(1); + }); } } /** * Append to the eval instance and return an undo function. */ -function appendEval (state: EvalState, input: string) { - const undoInput = state.input - const undoVersion = state.version - const undoOutput = state.output - const undoLines = state.lines +function appendEval(state: EvalState, input: string) { + const undoInput = state.input; + const undoVersion = state.version; + const undoOutput = state.output; + const undoLines = state.lines; // Handle ASI issues with TypeScript re-evaluation. - if (undoInput.charAt(undoInput.length - 1) === '\n' && /^\s*[\/\[(`-]/.test(input) && !/;\s*$/.test(undoInput)) { - state.input = `${state.input.slice(0, -1)};\n` + if ( + undoInput.charAt(undoInput.length - 1) === '\n' && + /^\s*[\/\[(`-]/.test(input) && + !/;\s*$/.test(undoInput) + ) { + state.input = `${state.input.slice(0, -1)};\n`; } - state.input += input - state.lines += lineCount(input) - state.version++ + state.input += input; + state.lines += lineCount(input); + state.version++; return function () { - state.input = undoInput - state.output = undoOutput - state.version = undoVersion - state.lines = undoLines - } + state.input = undoInput; + state.output = undoOutput; + state.version = undoVersion; + state.lines = undoLines; + }; } /** * Count the number of lines. */ -function lineCount (value: string) { - let count = 0 +function lineCount(value: string) { + let count = 0; for (const char of value) { if (char === '\n') { - count++ + count++; } } - return count + return count; } const RECOVERY_CODES: Set = new Set([ @@ -323,12 +359,12 @@ const RECOVERY_CODES: Set = new Set([ 1126, // "Unexpected end of text." 1160, // "Unterminated template literal." 1161, // "Unterminated regular expression literal." - 2355 // "A function whose declared type is neither 'void' nor 'any' must return a value." -]) + 2355, // "A function whose declared type is neither 'void' nor 'any' must return a value." +]); /** * Check if a function can recover gracefully. */ -function isRecoverable (error: TSError) { - return error.diagnosticCodes.every(code => RECOVERY_CODES.has(code)) +function isRecoverable(error: TSError) { + return error.diagnosticCodes.every((code) => RECOVERY_CODES.has(code)); } diff --git a/src/testlib.ts b/src/testlib.ts index 14533f9a2..f3b3a2a15 100644 --- a/src/testlib.ts +++ b/src/testlib.ts @@ -1,18 +1,22 @@ -import avaTest, { ExecutionContext, Implementation, OneOrMoreMacros } from 'ava' -import * as assert from 'assert' -import throat from 'throat' +import avaTest, { + ExecutionContext, + Implementation, + OneOrMoreMacros, +} from 'ava'; +import * as assert from 'assert'; +import throat from 'throat'; -const concurrencyLimiter = throat(8) +const concurrencyLimiter = throat(8); -function once (func: T): T { - let run = false - let ret: any = undefined - return function (...args: any[]) { - if (run) return ret - run = true - ret = func(...args) - return ret - } as any as T +function once(func: T): T { + let run = false; + let ret: any = undefined; + return (function (...args: any[]) { + if (run) return ret; + run = true; + ret = func(...args); + return ret; + } as any) as T; } export const test = createTestInterface({ @@ -20,149 +24,211 @@ export const test = createTestInterface({ mustDoSerial: false, automaticallyDoSerial: false, separator: ' > ', - titlePrefix: undefined -}) -export interface TestInterface /*extends Omit, 'before' | 'beforeEach' | 'after' | 'afterEach' | 'failing' | 'serial'>*/ { - + titlePrefix: undefined, +}); +export interface TestInterface< + Context +> /*extends Omit, 'before' | 'beforeEach' | 'after' | 'afterEach' | 'failing' | 'serial'>*/ { //#region copy-pasted from ava's .d.ts - /** Declare a concurrent test. */ - (title: string, implementation: Implementation): void - /** Declare a concurrent test that uses one or more macros. Additional arguments are passed to the macro. */ - (title: string, macros: OneOrMoreMacros, ...rest: T): void - /** Declare a concurrent test that uses one or more macros. The macro is responsible for generating a unique test title. */ - (macros: OneOrMoreMacros, ...rest: T): void + /** Declare a concurrent test. */ + (title: string, implementation: Implementation): void; + /** Declare a concurrent test that uses one or more macros. Additional arguments are passed to the macro. */ + ( + title: string, + macros: OneOrMoreMacros, + ...rest: T + ): void; + /** Declare a concurrent test that uses one or more macros. The macro is responsible for generating a unique test title. */ + (macros: OneOrMoreMacros, ...rest: T): void; //#endregion - serial (title: string, implementation: Implementation): void - /** Declare a concurrent test that uses one or more macros. Additional arguments are passed to the macro. */ - serial (title: string, macros: OneOrMoreMacros, ...rest: T): void - /** Declare a concurrent test that uses one or more macros. The macro is responsible for generating a unique test title. */ - serial (macros: OneOrMoreMacros, ...rest: T): void + serial(title: string, implementation: Implementation): void; + /** Declare a concurrent test that uses one or more macros. Additional arguments are passed to the macro. */ + serial( + title: string, + macros: OneOrMoreMacros, + ...rest: T + ): void; + /** Declare a concurrent test that uses one or more macros. The macro is responsible for generating a unique test title. */ + serial( + macros: OneOrMoreMacros, + ...rest: T + ): void; - macro (cb: (...args: Args) => ([(title: string | undefined) => string, (t: ExecutionContext) => Promise] | ((t: ExecutionContext) => Promise))): (test: ExecutionContext, ...args: Args) => Promise & { - title (givenTitle: string | undefined, ...args: Args): string; - } + macro( + cb: ( + ...args: Args + ) => + | [ + (title: string | undefined) => string, + (t: ExecutionContext) => Promise + ] + | ((t: ExecutionContext) => Promise) + ): ( + test: ExecutionContext, + ...args: Args + ) => Promise & { + title(givenTitle: string | undefined, ...args: Args): string; + }; - beforeAll (cb: (t: ExecutionContext) => Promise): void - beforeEach (cb: (t: ExecutionContext) => Promise): void - context (cb: (t: ExecutionContext) => Promise): TestInterface - suite (title: string, cb: (test: TestInterface) => void): void + beforeAll(cb: (t: ExecutionContext) => Promise): void; + beforeEach(cb: (t: ExecutionContext) => Promise): void; + context( + cb: (t: ExecutionContext) => Promise + ): TestInterface; + suite(title: string, cb: (test: TestInterface) => void): void; - runSerially (): void + runSerially(): void; // TODO add teardownEach } -function createTestInterface (opts: { - titlePrefix: string | undefined, - separator: string | undefined, - mustDoSerial: boolean, - automaticallyDoSerial: boolean, - beforeEachFunctions: Function[] +function createTestInterface(opts: { + titlePrefix: string | undefined; + separator: string | undefined; + mustDoSerial: boolean; + automaticallyDoSerial: boolean; + beforeEachFunctions: Function[]; }): TestInterface { - const { titlePrefix, separator = ' > ' } = opts - const beforeEachFunctions = [...(opts.beforeEachFunctions ?? [])] - let { mustDoSerial, automaticallyDoSerial } = opts - let hookDeclared = false - let suiteOrTestDeclared = false - function computeTitle (title: string | undefined) { - assert(title) + const { titlePrefix, separator = ' > ' } = opts; + const beforeEachFunctions = [...(opts.beforeEachFunctions ?? [])]; + let { mustDoSerial, automaticallyDoSerial } = opts; + let hookDeclared = false; + let suiteOrTestDeclared = false; + function computeTitle(title: string | undefined) { + assert(title); // return `${ titlePrefix }${ separator }${ title }`; - if (titlePrefix != null && title != null) { // tslint:disable-line:strict-type-predicates - return `${ titlePrefix }${ separator }${ title }` + if (titlePrefix != null && title != null) { + return `${titlePrefix}${separator}${title}`; } - if (titlePrefix == null && title != null) { // tslint:disable-line:strict-type-predicates - return title + if (titlePrefix == null && title != null) { + return title; } } - function parseArgs (args: any[]) { - const title = typeof args[0] === 'string' ? args.shift() as string : undefined - const macros = typeof args[0] === 'function' ? [args.shift() as Function] : Array.isArray(args[0]) ? args.shift() as Function[] : [] - return { title, macros, args } + function parseArgs(args: any[]) { + const title = + typeof args[0] === 'string' ? (args.shift() as string) : undefined; + const macros = + typeof args[0] === 'function' + ? [args.shift() as Function] + : Array.isArray(args[0]) + ? (args.shift() as Function[]) + : []; + return { title, macros, args }; } - function assertOrderingForDeclaringTest () { - suiteOrTestDeclared = true + function assertOrderingForDeclaringTest() { + suiteOrTestDeclared = true; } - function assertOrderingForDeclaringHook () { + function assertOrderingForDeclaringHook() { if (suiteOrTestDeclared) { - throw new Error('Hooks must be declared before declaring sub-suites or tests') + throw new Error( + 'Hooks must be declared before declaring sub-suites or tests' + ); } - hookDeclared = true + hookDeclared = true; } /** * @param avaDeclareFunction either test or test.serial */ - function declareTest (title: string | undefined, macros: Function[], avaDeclareFunction: Function, args: any[]) { - const wrappedMacros = macros.map(macro => { + function declareTest( + title: string | undefined, + macros: Function[], + avaDeclareFunction: Function, + args: any[] + ) { + const wrappedMacros = macros.map((macro) => { return async function (t: ExecutionContext, ...args: any[]) { return concurrencyLimiter(async () => { - let i = 0 + let i = 0; for (const func of beforeEachFunctions) { - await func(t) - i++ + await func(t); + i++; } - return macro(t, ...args) - }) - } - }) - const computedTitle = computeTitle(title) - avaDeclareFunction(computedTitle, wrappedMacros, ...args) + return macro(t, ...args); + }); + }; + }); + const computedTitle = computeTitle(title); + avaDeclareFunction(computedTitle, wrappedMacros, ...args); } - function test (...inputArgs: any[]) { - assertOrderingForDeclaringTest() + function test(...inputArgs: any[]) { + assertOrderingForDeclaringTest(); // TODO is this safe to disable? // X parallel tests will each invoke the beforeAll hook, but once()ification means each invocation will return the same promise, and tests cannot // start till it finishes. // HOWEVER if it returns a single shared state, can tests concurrently use this shared state? // if(!automaticallyDoSerial && mustDoSerial) throw new Error('Cannot declare non-serial tests because you have declared a beforeAll() hook for this test suite.'); - const { args, macros, title } = parseArgs(inputArgs) - return declareTest(title, macros, automaticallyDoSerial ? avaTest.serial : avaTest, args) + const { args, macros, title } = parseArgs(inputArgs); + return declareTest( + title, + macros, + automaticallyDoSerial ? avaTest.serial : avaTest, + args + ); } test.serial = function (...inputArgs: any[]) { - assertOrderingForDeclaringTest() - const { args, macros, title } = parseArgs(inputArgs) - return declareTest(title, macros, avaTest.serial, args) - } - test.beforeEach = function (cb: (test: ExecutionContext) => Promise) { - assertOrderingForDeclaringHook() - beforeEachFunctions.push(cb) - } - test.context = function (cb: (test: ExecutionContext) => Promise) { - assertOrderingForDeclaringHook() + assertOrderingForDeclaringTest(); + const { args, macros, title } = parseArgs(inputArgs); + return declareTest(title, macros, avaTest.serial, args); + }; + test.beforeEach = function ( + cb: (test: ExecutionContext) => Promise + ) { + assertOrderingForDeclaringHook(); + beforeEachFunctions.push(cb); + }; + test.context = function ( + cb: (test: ExecutionContext) => Promise + ) { + assertOrderingForDeclaringHook(); beforeEachFunctions.push(async (t: ExecutionContext) => { - const addedContextFields = await cb(t) - Object.assign(t.context, addedContextFields) - }) - return test - } - test.beforeAll = function (cb: (test: ExecutionContext) => Promise) { - assertOrderingForDeclaringHook() - mustDoSerial = true - beforeEachFunctions.push(once(cb)) - } - test.macro = function(cb: (...args: Args) => [(title: string | undefined) => string, (t: ExecutionContext) => Promise] | ((t: ExecutionContext) => Promise)) { - function macro (testInterface: ExecutionContext, ...args: Args) { - const ret = cb(...args) - const macroFunction = Array.isArray(ret) ? ret[1] : ret - return macroFunction(testInterface) + const addedContextFields = await cb(t); + Object.assign(t.context, addedContextFields); + }); + return test; + }; + test.beforeAll = function ( + cb: (test: ExecutionContext) => Promise + ) { + assertOrderingForDeclaringHook(); + mustDoSerial = true; + beforeEachFunctions.push(once(cb)); + }; + test.macro = function ( + cb: ( + ...args: Args + ) => + | [ + (title: string | undefined) => string, + (t: ExecutionContext) => Promise + ] + | ((t: ExecutionContext) => Promise) + ) { + function macro(testInterface: ExecutionContext, ...args: Args) { + const ret = cb(...args); + const macroFunction = Array.isArray(ret) ? ret[1] : ret; + return macroFunction(testInterface); } macro.title = function (givenTitle: string | undefined, ...args: Args) { - const ret = cb(...args) - return Array.isArray(ret) ? ret[0](givenTitle) : givenTitle - } - return macro - } - test.suite = function (title: string, cb: (test: TestInterface) => void) { + const ret = cb(...args); + return Array.isArray(ret) ? ret[0](givenTitle) : givenTitle; + }; + return macro; + }; + test.suite = function ( + title: string, + cb: (test: TestInterface) => void + ) { const newApi = createTestInterface({ mustDoSerial, automaticallyDoSerial, separator, titlePrefix: computeTitle(title), - beforeEachFunctions - }) - cb(newApi) - } + beforeEachFunctions, + }); + cb(newApi); + }; test.runSerially = function () { - automaticallyDoSerial = true - } - return test as any + automaticallyDoSerial = true; + }; + return test as any; } diff --git a/src/transpilers/swc.ts b/src/transpilers/swc.ts index 220e8b03b..450e301a5 100644 --- a/src/transpilers/swc.ts +++ b/src/transpilers/swc.ts @@ -1,7 +1,7 @@ -import type * as ts from 'typescript' -import type * as swcWasm from '@swc/wasm' -import type * as swcTypes from '@swc/core' -import { CreateTranspilerOptions, Transpiler } from './types' +import type * as ts from 'typescript'; +import type * as swcWasm from '@swc/wasm'; +import type * as swcTypes from '@swc/core'; +import { CreateTranspilerOptions, Transpiler } from './types'; export interface SwcTranspilerOptions extends CreateTranspilerOptions { /** @@ -9,44 +9,58 @@ export interface SwcTranspilerOptions extends CreateTranspilerOptions { * Set to '@swc/wasm' to use swc's WASM compiler * Default: '@swc/core', falling back to '@swc/wasm' */ - swc?: string | typeof swcWasm + swc?: string | typeof swcWasm; } -export function create (createOptions: SwcTranspilerOptions): Transpiler { - const { swc, service: { config } } = createOptions +export function create(createOptions: SwcTranspilerOptions): Transpiler { + const { + swc, + service: { config }, + } = createOptions; // Load swc compiler - let swcInstance: typeof swcWasm + let swcInstance: typeof swcWasm; if (typeof swc === 'string') { - swcInstance = require(swc) as typeof swcWasm - } else if (swc == null) { // tslint:disable-line - let swcResolved + swcInstance = require(swc) as typeof swcWasm; + } else if (swc == null) { + let swcResolved; try { - swcResolved = require.resolve('@swc/core') + swcResolved = require.resolve('@swc/core'); } catch (e) { try { - swcResolved = require.resolve('@swc/wasm') + swcResolved = require.resolve('@swc/wasm'); } catch (e) { - throw new Error('swc compiler requires either @swc/core or @swc/wasm to be installed as dependencies') + throw new Error( + 'swc compiler requires either @swc/core or @swc/wasm to be installed as dependencies' + ); } } - swcInstance = require(swcResolved) as typeof swcWasm + swcInstance = require(swcResolved) as typeof swcWasm; } else { - swcInstance = swc + swcInstance = swc; } // Prepare SWC options derived from typescript compiler options - const compilerOptions = config.options - const { esModuleInterop, sourceMap, importHelpers, experimentalDecorators, emitDecoratorMetadata, target, jsxFactory, jsxFragmentFactory } = compilerOptions - const nonTsxOptions = createSwcOptions(false) - const tsxOptions = createSwcOptions(true) - function createSwcOptions (isTsx: boolean): swcTypes.Options { + const compilerOptions = config.options; + const { + esModuleInterop, + sourceMap, + importHelpers, + experimentalDecorators, + emitDecoratorMetadata, + target, + jsxFactory, + jsxFragmentFactory, + } = compilerOptions; + const nonTsxOptions = createSwcOptions(false); + const tsxOptions = createSwcOptions(true); + function createSwcOptions(isTsx: boolean): swcTypes.Options { return { sourceMaps: sourceMap, // isModule: true, module: { type: 'commonjs', - noInterop: !esModuleInterop + noInterop: !esModuleInterop, }, swcrc: false, jsc: { @@ -55,7 +69,7 @@ export function create (createOptions: SwcTranspilerOptions): Transpiler { syntax: 'typescript', tsx: isTsx, decorators: experimentalDecorators, - dynamicImport: true + dynamicImport: true, }, target: targetMapping.get(target!) ?? 'es3', transform: { @@ -66,35 +80,38 @@ export function create (createOptions: SwcTranspilerOptions): Transpiler { development: false, useBuiltins: false, pragma: jsxFactory!, - pragmaFrag: jsxFragmentFactory! - } - } - } - } + pragmaFrag: jsxFragmentFactory!, + }, + }, + }, + }; } const transpile: Transpiler['transpile'] = (input, transpileOptions) => { - const { fileName } = transpileOptions - const swcOptions = fileName.endsWith('.tsx') || fileName.endsWith('.jsx') ? tsxOptions : nonTsxOptions + const { fileName } = transpileOptions; + const swcOptions = + fileName.endsWith('.tsx') || fileName.endsWith('.jsx') + ? tsxOptions + : nonTsxOptions; const { code, map } = swcInstance.transformSync(input, { ...swcOptions, - filename: fileName - }) - return { outputText: code, sourceMapText: map } - } + filename: fileName, + }); + return { outputText: code, sourceMapText: map }; + }; return { - transpile - } + transpile, + }; } -const targetMapping = new Map() -targetMapping.set(/* ts.ScriptTarget.ES3 */ 0, 'es3') -targetMapping.set(/* ts.ScriptTarget.ES5 */ 1, 'es5') -targetMapping.set(/* ts.ScriptTarget.ES2015 */ 2, 'es2015') -targetMapping.set(/* ts.ScriptTarget.ES2016 */ 3, 'es2016') -targetMapping.set(/* ts.ScriptTarget.ES2017 */ 4, 'es2017') -targetMapping.set(/* ts.ScriptTarget.ES2018 */ 5, 'es2018') -targetMapping.set(/* ts.ScriptTarget.ES2019 */ 6, 'es2019') -targetMapping.set(/* ts.ScriptTarget.ES2020 */ 7, 'es2019') -targetMapping.set(/* ts.ScriptTarget.ESNext */ 99, 'es2019') +const targetMapping = new Map(); +targetMapping.set(/* ts.ScriptTarget.ES3 */ 0, 'es3'); +targetMapping.set(/* ts.ScriptTarget.ES5 */ 1, 'es5'); +targetMapping.set(/* ts.ScriptTarget.ES2015 */ 2, 'es2015'); +targetMapping.set(/* ts.ScriptTarget.ES2016 */ 3, 'es2016'); +targetMapping.set(/* ts.ScriptTarget.ES2017 */ 4, 'es2017'); +targetMapping.set(/* ts.ScriptTarget.ES2018 */ 5, 'es2018'); +targetMapping.set(/* ts.ScriptTarget.ES2019 */ 6, 'es2019'); +targetMapping.set(/* ts.ScriptTarget.ES2020 */ 7, 'es2019'); +targetMapping.set(/* ts.ScriptTarget.ESNext */ 99, 'es2019'); diff --git a/src/transpilers/types.ts b/src/transpilers/types.ts index 295f67e8d..9c1d238be 100644 --- a/src/transpilers/types.ts +++ b/src/transpilers/types.ts @@ -1,32 +1,34 @@ -import type * as ts from 'typescript' -import { Service } from '..' +import type * as ts from 'typescript'; +import { Service } from '..'; /** * Third-party transpilers are implemented as a CommonJS module with a * named export "create" */ export interface TranspilerModule { - create: TranspilerFactory + create: TranspilerFactory; } /** * Called by ts-node to create a custom transpiler. */ -export type TranspilerFactory = (options: CreateTranspilerOptions) => Transpiler +export type TranspilerFactory = ( + options: CreateTranspilerOptions +) => Transpiler; export interface CreateTranspilerOptions { // TODO this is confusing because its only a partial Service. Rename? - service: Pick + service: Pick; } export interface Transpiler { // TODOs // Create spec for returning diagnostics? Currently transpilers are allowed to // throw an error but that's it. - transpile (input: string, options: TranspileOptions): TranspileOutput + transpile(input: string, options: TranspileOptions): TranspileOutput; } export interface TranspileOptions { - fileName: string + fileName: string; } export interface TranspileOutput { - outputText: string - diagnostics?: ts.Diagnostic[] - sourceMapText?: string + outputText: string; + diagnostics?: ts.Diagnostic[]; + sourceMapText?: string; } diff --git a/src/tsconfig-schema.ts b/src/tsconfig-schema.ts index d25b3025b..5d2112619 100644 --- a/src/tsconfig-schema.ts +++ b/src/tsconfig-schema.ts @@ -1,4 +1,4 @@ -import { TsConfigOptions } from '.' +import { TsConfigOptions } from '.'; /* * This interface exists solely for generating a JSON schema for tsconfig.json. @@ -16,5 +16,5 @@ export interface TsConfigSchema { * * ts-node offers TypeScript execution and REPL for node.js, with source map support. */ - 'ts-node': TsConfigOptions + 'ts-node': TsConfigOptions; } diff --git a/src/tsconfigs.ts b/src/tsconfigs.ts index 2ce944a4d..ae8ee4ac7 100644 --- a/src/tsconfigs.ts +++ b/src/tsconfigs.ts @@ -1,33 +1,35 @@ -import { TSCommon } from '.' +import { TSCommon } from '.'; -const nodeMajor = parseInt(process.versions.node.split('.')[0], 10) +const nodeMajor = parseInt(process.versions.node.split('.')[0], 10); /** * return parsed JSON of the bundled @tsconfig/bases config appropriate for the * running version of nodejs * @internal */ -export function getDefaultTsconfigJsonForNodeVersion (ts: TSCommon): any { +export function getDefaultTsconfigJsonForNodeVersion(ts: TSCommon): any { if (nodeMajor >= 14) { - const config = require('@tsconfig/node14/tsconfig.json') - if (configCompatible(config)) return config + const config = require('@tsconfig/node14/tsconfig.json'); + if (configCompatible(config)) return config; } if (nodeMajor >= 12) { - const config = require('@tsconfig/node12/tsconfig.json') - if (configCompatible(config)) return config + const config = require('@tsconfig/node12/tsconfig.json'); + if (configCompatible(config)) return config; } - return require('@tsconfig/node10/tsconfig.json') + return require('@tsconfig/node10/tsconfig.json'); // Verify that tsconfig target and lib options are compatible with TypeScript compiler - function configCompatible (config: { + function configCompatible(config: { compilerOptions: { - lib: string[], - target: string - } + lib: string[]; + target: string; + }; }) { return ( - typeof (ts.ScriptTarget as any)[config.compilerOptions.target.toUpperCase()] === 'number' && + typeof (ts.ScriptTarget as any)[ + config.compilerOptions.target.toUpperCase() + ] === 'number' && ts.libs && - config.compilerOptions.lib.every(lib => ts.libs!.includes(lib)) - ) + config.compilerOptions.lib.every((lib) => ts.libs!.includes(lib)) + ); } } diff --git a/tests/allow-js/run.js b/tests/allow-js/run.js index dd3f91cd0..9001625ad 100644 --- a/tests/allow-js/run.js +++ b/tests/allow-js/run.js @@ -1,3 +1,3 @@ -export function main () { - return 'hello world' +export function main() { + return 'hello world'; } diff --git a/tests/allow-js/with-jsx.jsx b/tests/allow-js/with-jsx.jsx index d182b4b5d..a48e85a92 100644 --- a/tests/allow-js/with-jsx.jsx +++ b/tests/allow-js/with-jsx.jsx @@ -1,11 +1,9 @@ export class Foo2 { - - static sayHi () { - return 'hello world' + static sayHi() { + return 'hello world'; } - render () { - return
+ render() { + return
; } - } diff --git a/tests/child-process.ts b/tests/child-process.ts index 05050fec5..c0e9d4b94 100644 --- a/tests/child-process.ts +++ b/tests/child-process.ts @@ -1,4 +1,4 @@ -import { join } from 'path' -import { fork } from 'child_process' +import { join } from 'path'; +import { fork } from 'child_process'; -fork(join(__dirname, 'hello-world.ts')) +fork(join(__dirname, 'hello-world.ts')); diff --git a/tests/compiler-error.ts b/tests/compiler-error.ts index 05800dd5b..ced966e24 100644 --- a/tests/compiler-error.ts +++ b/tests/compiler-error.ts @@ -1,5 +1,5 @@ -function upper (str: string) { - return str.toUpperCase() +function upper(str: string) { + return str.toUpperCase(); } -upper(10) +upper(10); diff --git a/tests/complex/example.js b/tests/complex/example.js index 3971310d0..466e7df08 100644 --- a/tests/complex/example.js +++ b/tests/complex/example.js @@ -1 +1 @@ -module.exports = require('./foo').text +module.exports = require('./foo').text; diff --git a/tests/complex/foo.ts b/tests/complex/foo.ts index 93fb156db..bafb472a7 100644 --- a/tests/complex/foo.ts +++ b/tests/complex/foo.ts @@ -1 +1 @@ -export const text = 'example' +export const text = 'example'; diff --git a/tests/complex/index.ts b/tests/complex/index.ts index e87008576..7ac5a99d2 100644 --- a/tests/complex/index.ts +++ b/tests/complex/index.ts @@ -1,5 +1,5 @@ -declare function require (module: string): any +declare function require(module: string): any; -export function example () { - return require('./example') +export function example() { + return require('./example'); } diff --git a/tests/custom-types.ts b/tests/custom-types.ts index dc3da6ebe..fcd1fbdef 100644 --- a/tests/custom-types.ts +++ b/tests/custom-types.ts @@ -1,3 +1,3 @@ -import { foobar } from 'does-not-exist' +import { foobar } from 'does-not-exist'; -console.log(foobar) +console.log(foobar); diff --git a/tests/cwd-and-script-mode/a/index.ts b/tests/cwd-and-script-mode/a/index.ts index f5fbb60fd..230f5ea09 100644 --- a/tests/cwd-and-script-mode/a/index.ts +++ b/tests/cwd-and-script-mode/a/index.ts @@ -1,7 +1,9 @@ -export {} +export {}; // Type assertion to please TS 2.7 -const register = process[(Symbol as any).for('ts-node.register.instance')] -console.log(JSON.stringify({ - options: register.options, - config: register.config -})) +const register = process[(Symbol as any).for('ts-node.register.instance')]; +console.log( + JSON.stringify({ + options: register.options, + config: register.config, + }) +); diff --git a/tests/cwd-and-script-mode/a/tsconfig.json b/tests/cwd-and-script-mode/a/tsconfig.json index 8e2e88090..196e2b444 100644 --- a/tests/cwd-and-script-mode/a/tsconfig.json +++ b/tests/cwd-and-script-mode/a/tsconfig.json @@ -1,7 +1,9 @@ { "compilerOptions": { - "plugins": [{ - "name": "plugin-a" - }] + "plugins": [ + { + "name": "plugin-a" + } + ] } } diff --git a/tests/cwd-and-script-mode/b/index.ts b/tests/cwd-and-script-mode/b/index.ts index f5fbb60fd..230f5ea09 100644 --- a/tests/cwd-and-script-mode/b/index.ts +++ b/tests/cwd-and-script-mode/b/index.ts @@ -1,7 +1,9 @@ -export {} +export {}; // Type assertion to please TS 2.7 -const register = process[(Symbol as any).for('ts-node.register.instance')] -console.log(JSON.stringify({ - options: register.options, - config: register.config -})) +const register = process[(Symbol as any).for('ts-node.register.instance')]; +console.log( + JSON.stringify({ + options: register.options, + config: register.config, + }) +); diff --git a/tests/cwd-and-script-mode/b/tsconfig.json b/tests/cwd-and-script-mode/b/tsconfig.json index 0c761dd31..3b22d468d 100644 --- a/tests/cwd-and-script-mode/b/tsconfig.json +++ b/tests/cwd-and-script-mode/b/tsconfig.json @@ -1,7 +1,9 @@ { "compilerOptions": { - "plugins": [{ - "name": "plugin-b" - }] + "plugins": [ + { + "name": "plugin-b" + } + ] } } diff --git a/tests/emit-compiled.ts b/tests/emit-compiled.ts index 7708b8551..0b1738d5e 100644 --- a/tests/emit-compiled.ts +++ b/tests/emit-compiled.ts @@ -1,16 +1,16 @@ -const extensions = ['.tsx'] +const extensions = ['.tsx']; -extensions.forEach(ext => { - const old = require.extensions[ext] +extensions.forEach((ext) => { + const old = require.extensions[ext]; require.extensions[ext] = (m, path) => { - const _compile = (m as any)._compile + const _compile = (m as any)._compile; - ;(m as any)._compile = (code, path) => { - console.error(code) - return _compile.call(this, code, path) - } + (m as any)._compile = (code, path) => { + console.error(code); + return _compile.call(this, code, path); + }; - return old(m, path) - } -}) + return old(m, path); + }; +}); diff --git a/tests/env.ts b/tests/env.ts index e156a7db9..94510e045 100644 --- a/tests/env.ts +++ b/tests/env.ts @@ -1 +1 @@ -console.log(typeof (process as any)[Symbol.for('ts-node.register.instance')]) +console.log(typeof (process as any)[Symbol.for('ts-node.register.instance')]); diff --git a/tests/esm-err-require-esm/esm-package/loaded-as.ts b/tests/esm-err-require-esm/esm-package/loaded-as.ts index df054c0bc..1e9f32136 100644 --- a/tests/esm-err-require-esm/esm-package/loaded-as.ts +++ b/tests/esm-err-require-esm/esm-package/loaded-as.ts @@ -1,5 +1,3 @@ // Log if this file is loaded as ESM or CommonJS -if(typeof module !== 'undefined') - console.log('CommonJS') -else - console.log('ESM') +if (typeof module !== 'undefined') console.log('CommonJS'); +else console.log('ESM'); diff --git a/tests/esm-err-require-esm/index.js b/tests/esm-err-require-esm/index.js index b2bf5a5fc..902779786 100644 --- a/tests/esm-err-require-esm/index.js +++ b/tests/esm-err-require-esm/index.js @@ -1 +1 @@ -require('./esm-package/loaded-as') +require('./esm-package/loaded-as'); diff --git a/tests/esm-import-cache/index.ts b/tests/esm-import-cache/index.ts index 5de8f1dac..684e08e60 100644 --- a/tests/esm-import-cache/index.ts +++ b/tests/esm-import-cache/index.ts @@ -1,4 +1,4 @@ -import './log1.js' -import './log1.js' -import './log2.js' -import './log2.js?bust' +import './log1.js'; +import './log1.js'; +import './log2.js'; +import './log2.js?bust'; diff --git a/tests/esm-import-cache/log1.ts b/tests/esm-import-cache/log1.ts index e33d05b5e..886dfba9d 100644 --- a/tests/esm-import-cache/log1.ts +++ b/tests/esm-import-cache/log1.ts @@ -1 +1 @@ -console.log('log1') +console.log('log1'); diff --git a/tests/esm-import-cache/log2.ts b/tests/esm-import-cache/log2.ts index efc53f2eb..f4922a4f6 100644 --- a/tests/esm-import-cache/log2.ts +++ b/tests/esm-import-cache/log2.ts @@ -1 +1 @@ -console.log('log2') +console.log('log2'); diff --git a/tests/esm-import-http-url/index.mjs b/tests/esm-import-http-url/index.mjs index 35e59a6c6..5342c08ed 100644 --- a/tests/esm-import-http-url/index.mjs +++ b/tests/esm-import-http-url/index.mjs @@ -1 +1 @@ -import 'http://example.com/this-url-should-be-ignored-by-our-esm-loader.js' +import 'http://example.com/this-url-should-be-ignored-by-our-esm-loader.js'; diff --git a/tests/esm-node-resolver/bar/index.ts b/tests/esm-node-resolver/bar/index.ts index 4bfad1a30..4bc22c6f7 100644 --- a/tests/esm-node-resolver/bar/index.ts +++ b/tests/esm-node-resolver/bar/index.ts @@ -1,3 +1,4 @@ -export const bar: string = 'bar' +export const bar: string = 'bar'; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm-node-resolver/baz.js b/tests/esm-node-resolver/baz.js index 51474b54f..6363a2880 100644 --- a/tests/esm-node-resolver/baz.js +++ b/tests/esm-node-resolver/baz.js @@ -1,3 +1,4 @@ -export const baz = 'baz' +export const baz = 'baz'; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm-node-resolver/biff.jsx b/tests/esm-node-resolver/biff.jsx index e397d5217..7ac508317 100644 --- a/tests/esm-node-resolver/biff.jsx +++ b/tests/esm-node-resolver/biff.jsx @@ -1,8 +1,9 @@ -export const biff = 'biff' +export const biff = 'biff'; const React = { - createElement() {} -} -const div =
+ createElement() {}, +}; +const div =
; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm-node-resolver/foo.ts b/tests/esm-node-resolver/foo.ts index 501c0021d..c6b5e44c8 100644 --- a/tests/esm-node-resolver/foo.ts +++ b/tests/esm-node-resolver/foo.ts @@ -1,3 +1,4 @@ -export const foo: string = 'foo' +export const foo: string = 'foo'; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm-node-resolver/index.ts b/tests/esm-node-resolver/index.ts index df7ccd019..77eb4efe6 100644 --- a/tests/esm-node-resolver/index.ts +++ b/tests/esm-node-resolver/index.ts @@ -1,9 +1,10 @@ -import {foo} from './foo' -import {bar} from './bar' -import {baz} from './baz' -import {biff} from './biff' -import {libfoo} from 'libfoo' +import { foo } from './foo'; +import { bar } from './bar'; +import { baz } from './baz'; +import { biff } from './biff'; +import { libfoo } from 'libfoo'; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); -console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`) +console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`); diff --git a/tests/esm-transpile-only/index.ts b/tests/esm-transpile-only/index.ts index e99da7cfd..189ad05ca 100644 --- a/tests/esm-transpile-only/index.ts +++ b/tests/esm-transpile-only/index.ts @@ -1,5 +1,6 @@ -if (typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); // intentional type errors to check transpile-only ESM loader skips type checking -parseInt(1101, 2) -const x: number = 'hello world' +parseInt(1101, 2); +const x: number = 'hello world'; diff --git a/tests/esm/bar.ts b/tests/esm/bar.ts index 4bfad1a30..4bc22c6f7 100644 --- a/tests/esm/bar.ts +++ b/tests/esm/bar.ts @@ -1,3 +1,4 @@ -export const bar: string = 'bar' +export const bar: string = 'bar'; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm/baz.js b/tests/esm/baz.js index 51474b54f..6363a2880 100644 --- a/tests/esm/baz.js +++ b/tests/esm/baz.js @@ -1,3 +1,4 @@ -export const baz = 'baz' +export const baz = 'baz'; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm/biff.jsx b/tests/esm/biff.jsx index e397d5217..7ac508317 100644 --- a/tests/esm/biff.jsx +++ b/tests/esm/biff.jsx @@ -1,8 +1,9 @@ -export const biff = 'biff' +export const biff = 'biff'; const React = { - createElement() {} -} -const div =
+ createElement() {}, +}; +const div =
; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm/foo.ts b/tests/esm/foo.ts index 501c0021d..c6b5e44c8 100644 --- a/tests/esm/foo.ts +++ b/tests/esm/foo.ts @@ -1,3 +1,4 @@ -export const foo: string = 'foo' +export const foo: string = 'foo'; -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); diff --git a/tests/esm/index.ts b/tests/esm/index.ts index 7c0b3e9fc..fd9538f11 100644 --- a/tests/esm/index.ts +++ b/tests/esm/index.ts @@ -1,13 +1,15 @@ -import {foo} from './foo.js' -import {bar} from './bar.js' -import {baz} from './baz.js' -import {biff} from './biff.js' -import {libfoo} from 'libfoo' +import { foo } from './foo.js'; +import { bar } from './bar.js'; +import { baz } from './baz.js'; +import { biff } from './biff.js'; +import { libfoo } from 'libfoo'; // Test import builtin modules -import {readFileSync} from 'fs'; -if(typeof readFileSync !== 'function') throw new Error('failed to import builtin module') +import { readFileSync } from 'fs'; +if (typeof readFileSync !== 'function') + throw new Error('failed to import builtin module'); -if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') +if (typeof module !== 'undefined') + throw new Error('module should not exist in ESM'); -console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`) +console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`); diff --git a/tests/esm/throw.ts b/tests/esm/throw.ts index 85ba6da48..f43f5e790 100644 --- a/tests/esm/throw.ts +++ b/tests/esm/throw.ts @@ -1,103 +1,12 @@ // intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. // 100 lines is meant to be far more space than the helper functions would take. class Foo { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - constructor () { this.bar() } - bar () { throw new Error('this is a demo') } + constructor() { + this.bar(); + } + bar() { + throw new Error('this is a demo'); + } } -new Foo() -export {} +new Foo(); +export {}; diff --git a/tests/from-node-modules/from-node-modules.ts b/tests/from-node-modules/from-node-modules.ts index 8a4ed4a37..0f343de39 100644 --- a/tests/from-node-modules/from-node-modules.ts +++ b/tests/from-node-modules/from-node-modules.ts @@ -1,10 +1,10 @@ // These files are resolved by the typechecker -import * as tsmie from 'external/typescript-module-imported-externally' -import * as jsmie from 'external/javascript-module-imported-externally' +import * as tsmie from 'external/typescript-module-imported-externally'; +import * as jsmie from 'external/javascript-module-imported-externally'; // These files are unknown to the compiler until required. -const tsmre = require('external/typescript-module-required-externally') -const jsmre = require('external/javascript-module-required-externally') +const tsmre = require('external/typescript-module-required-externally'); +const jsmre = require('external/javascript-module-required-externally'); -import * as external from 'external' +import * as external from 'external'; -console.log(JSON.stringify({external, tsmie, jsmie, tsmre, jsmre}, null, 2)) +console.log(JSON.stringify({ external, tsmie, jsmie, tsmre, jsmre }, null, 2)); diff --git a/tests/hello-world.ts b/tests/hello-world.ts index 19dfa14da..e9fe0090d 100644 --- a/tests/hello-world.ts +++ b/tests/hello-world.ts @@ -1 +1 @@ -console.log('Hello, world!') +console.log('Hello, world!'); diff --git a/tests/import-order/compiled.ts b/tests/import-order/compiled.ts index 2a508d1c4..fe9e058ef 100644 --- a/tests/import-order/compiled.ts +++ b/tests/import-order/compiled.ts @@ -1 +1 @@ -console.log('Hello, TypeScript!') +console.log('Hello, TypeScript!'); diff --git a/tests/import-order/defined.d.ts b/tests/import-order/defined.d.ts index 3bdda61f2..a40a0188d 100644 --- a/tests/import-order/defined.d.ts +++ b/tests/import-order/defined.d.ts @@ -1,3 +1,3 @@ -declare const v = 'Hello, World!' +declare const v = 'Hello, World!'; -export default v +export default v; diff --git a/tests/import-order/importer.ts b/tests/import-order/importer.ts index f20693337..446f0c501 100644 --- a/tests/import-order/importer.ts +++ b/tests/import-order/importer.ts @@ -1,3 +1,3 @@ -const v = require('./defined') +const v = require('./defined'); -console.log(v) +console.log(v); diff --git a/tests/import-order/require-compiled.js b/tests/import-order/require-compiled.js index 3977135dd..b73d5a376 100644 --- a/tests/import-order/require-compiled.js +++ b/tests/import-order/require-compiled.js @@ -1,2 +1,2 @@ // indirectly load ./compiled in node < 12 (soon to be end-of-life'd) -require('./compiled') +require('./compiled'); diff --git a/tests/issue-986/index.ts b/tests/issue-986/index.ts index fb8e23051..dd81fe7ed 100644 --- a/tests/issue-986/index.ts +++ b/tests/issue-986/index.ts @@ -1 +1 @@ -console.log(TEST) +console.log(TEST); diff --git a/tests/issue-986/types.ts b/tests/issue-986/types.ts index 88473dfa4..8f3818960 100644 --- a/tests/issue-986/types.ts +++ b/tests/issue-986/types.ts @@ -1 +1 @@ -declare const TEST: string +declare const TEST: string; diff --git a/tests/jsx-react.tsx b/tests/jsx-react.tsx index 82d3094f4..0fb0d7e85 100644 --- a/tests/jsx-react.tsx +++ b/tests/jsx-react.tsx @@ -1,7 +1,7 @@ -import * as React from 'react' +import * as React from 'react'; -const Component = props => { - return
-} +const Component = (props) => { + return
; +}; -export default Component +export default Component; diff --git a/tests/main-realpath/target/target.tsx b/tests/main-realpath/target/target.tsx index 1a206f56d..2a03b0ac6 100644 --- a/tests/main-realpath/target/target.tsx +++ b/tests/main-realpath/target/target.tsx @@ -1,4 +1,4 @@ // Will throw a compiler error unless ./tsconfig.json is parsed, which enables JSX function foo() { -
+
; } diff --git a/tests/maxnodemodulesjsdepth-scoped/index.ts b/tests/maxnodemodulesjsdepth-scoped/index.ts index 434f70cba..a4d00ea96 100644 --- a/tests/maxnodemodulesjsdepth-scoped/index.ts +++ b/tests/maxnodemodulesjsdepth-scoped/index.ts @@ -1,10 +1,10 @@ // Import as values, forcing internal classification. All files are typechecked -import {foo as a_foo, bar as a_bar} from '@scoped/a' +import { foo as a_foo, bar as a_bar } from '@scoped/a'; // Values are not used, so classification remains external. Obeys maxNodeModulesJsDepth -import {foo as b_foo, bar as b_bar} from '@scoped/b' +import { foo as b_foo, bar as b_bar } from '@scoped/b'; // We must have two .ts files, one without type errors. // Otherwise, type errors would prevent imports from executing, so external modules would not be reclassified as internal. -a_foo +a_foo; -import './other' +import './other'; diff --git a/tests/maxnodemodulesjsdepth-scoped/other.ts b/tests/maxnodemodulesjsdepth-scoped/other.ts index 319936b5e..f8ed3a02d 100644 --- a/tests/maxnodemodulesjsdepth-scoped/other.ts +++ b/tests/maxnodemodulesjsdepth-scoped/other.ts @@ -1,10 +1,10 @@ // Import as values, forcing internal classification. All files are typechecked -import {foo as a_foo, bar as a_bar} from '@scoped/a' +import { foo as a_foo, bar as a_bar } from '@scoped/a'; // Values are not used, so classification remains external. Obeys maxNodeModulesJsDepth -import {foo as b_foo, bar as b_bar} from '@scoped/b' +import { foo as b_foo, bar as b_bar } from '@scoped/b'; // `a_bar` has type information because it has been reclassified as internal -const shouldBeBoolean2: boolean = a_bar +const shouldBeBoolean2: boolean = a_bar; // `b_bar` is missing type information, so this is not an error -const shouldBeBoolean4: boolean = null as typeof b_bar +const shouldBeBoolean4: boolean = null as typeof b_bar; diff --git a/tests/maxnodemodulesjsdepth/index.ts b/tests/maxnodemodulesjsdepth/index.ts index 7c5c75990..81442b776 100644 --- a/tests/maxnodemodulesjsdepth/index.ts +++ b/tests/maxnodemodulesjsdepth/index.ts @@ -1,2 +1,2 @@ -import {foo, bar} from 'external' -import './other' +import { foo, bar } from 'external'; +import './other'; diff --git a/tests/maxnodemodulesjsdepth/other.ts b/tests/maxnodemodulesjsdepth/other.ts index 897e4a8c0..12737b62f 100644 --- a/tests/maxnodemodulesjsdepth/other.ts +++ b/tests/maxnodemodulesjsdepth/other.ts @@ -1,7 +1,7 @@ -import {foo, bar} from 'external' +import { foo, bar } from 'external'; // `foo` has type information so this is an error -const shouldBeBoolean: boolean = foo +const shouldBeBoolean: boolean = foo; // `bar` is missing type information, so this is not an error -const shouldBeBoolean2: boolean = bar +const shouldBeBoolean2: boolean = bar; diff --git a/tests/module.ts b/tests/module.ts index b0ec363cd..fe33f0801 100644 --- a/tests/module.ts +++ b/tests/module.ts @@ -1,3 +1,3 @@ -export function example (foo: string) { - return foo.toUpperCase() +export function example(foo: string) { + return foo.toUpperCase(); } diff --git a/tests/require-cache.ts b/tests/require-cache.ts index 4fbdd5047..79a6f98f8 100644 --- a/tests/require-cache.ts +++ b/tests/require-cache.ts @@ -1,7 +1,7 @@ -const moduleName = require.resolve('./module') +const moduleName = require.resolve('./module'); -const { example: example1 } = require(moduleName) -delete require.cache[moduleName] -const { example: example2 } = require(moduleName) +const { example: example1 } = require(moduleName); +delete require.cache[moduleName]; +const { example: example2 } = require(moduleName); -export { example1, example2 } +export { example1, example2 }; diff --git a/tests/scope/a/index.ts b/tests/scope/a/index.ts index af2b0fed2..12797e9c6 100644 --- a/tests/scope/a/index.ts +++ b/tests/scope/a/index.ts @@ -1,3 +1,3 @@ -import path from 'path' +import path from 'path'; -export const ext = path.extname(__filename) +export const ext = path.extname(__filename); diff --git a/tests/scope/a/log.ts b/tests/scope/a/log.ts index bf20f0de2..35ff402ef 100644 --- a/tests/scope/a/log.ts +++ b/tests/scope/a/log.ts @@ -1,3 +1,3 @@ -import { ext } from './index' +import { ext } from './index'; -console.log(ext) +console.log(ext); diff --git a/tests/scope/b/index.ts b/tests/scope/b/index.ts index af2b0fed2..12797e9c6 100644 --- a/tests/scope/b/index.ts +++ b/tests/scope/b/index.ts @@ -1,3 +1,3 @@ -import path from 'path' +import path from 'path'; -export const ext = path.extname(__filename) +export const ext = path.extname(__filename); diff --git a/tests/signals.ts b/tests/signals.ts index 0a0ebc6e7..665235754 100644 --- a/tests/signals.ts +++ b/tests/signals.ts @@ -1,12 +1,12 @@ process.on('SIGINT', () => { - process.stdout.write('exited') + process.stdout.write('exited'); setTimeout(() => { - process.stdout.write(' fine') + process.stdout.write(' fine'); // Needed to make sure what we wrote has time // to be written - process.nextTick(() => process.exit()) - }, 500) -}) + process.nextTick(() => process.exit()); + }, 500); +}); -setInterval(() => console.log('should not be reached'), 3000) +setInterval(() => console.log('should not be reached'), 3000); diff --git a/tests/throw-react-tsx.tsx b/tests/throw-react-tsx.tsx index 88886824f..250c5e1e7 100644 --- a/tests/throw-react-tsx.tsx +++ b/tests/throw-react-tsx.tsx @@ -1,106 +1,16 @@ // intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. // 100 lines is meant to be far more space than the helper functions would take. -const React = {createElement: (...args: any[]) => null} +const React = { createElement: (...args: any[]) => null }; class Foo { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - constructor () { this.bar() } - bar () { throw new Error('this is a demo') } + constructor() { + this.bar(); + } + bar() { + throw new Error('this is a demo'); + } someJsx() { - return
+ return
; } } -new Foo() -export {} +new Foo(); +export {}; diff --git a/tests/throw.ts b/tests/throw.ts index 85ba6da48..f43f5e790 100644 --- a/tests/throw.ts +++ b/tests/throw.ts @@ -1,103 +1,12 @@ // intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. // 100 lines is meant to be far more space than the helper functions would take. class Foo { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - constructor () { this.bar() } - bar () { throw new Error('this is a demo') } + constructor() { + this.bar(); + } + bar() { + throw new Error('this is a demo'); + } } -new Foo() -export {} +new Foo(); +export {}; diff --git a/tests/transpile-only-swc-via-tsconfig/index.ts b/tests/transpile-only-swc-via-tsconfig/index.ts index bf54bf041..a893c64ef 100644 --- a/tests/transpile-only-swc-via-tsconfig/index.ts +++ b/tests/transpile-only-swc-via-tsconfig/index.ts @@ -1,4 +1,4 @@ // intentional type errors to check transpile-only ESM loader skips type checking -parseInt(1101, 2) -const x: number = 'hello world' -console.log(x) +parseInt(1101, 2); +const x: number = 'hello world'; +console.log(x); diff --git a/tests/transpile-only-swc/index.ts b/tests/transpile-only-swc/index.ts index bf54bf041..a893c64ef 100644 --- a/tests/transpile-only-swc/index.ts +++ b/tests/transpile-only-swc/index.ts @@ -1,4 +1,4 @@ // intentional type errors to check transpile-only ESM loader skips type checking -parseInt(1101, 2) -const x: number = 'hello world' -console.log(x) +parseInt(1101, 2); +const x: number = 'hello world'; +console.log(x); diff --git a/tests/tsconfig-options/log-options1.js b/tests/tsconfig-options/log-options1.js index 59bc33323..2c248faf7 100644 --- a/tests/tsconfig-options/log-options1.js +++ b/tests/tsconfig-options/log-options1.js @@ -1,7 +1,9 @@ -const assert = require('assert') -assert(process.required1) -const register = process[Symbol.for('ts-node.register.instance')] -console.log(JSON.stringify({ - options: register.options, - config: register.config -})) +const assert = require('assert'); +assert(process.required1); +const register = process[Symbol.for('ts-node.register.instance')]; +console.log( + JSON.stringify({ + options: register.options, + config: register.config, + }) +); diff --git a/tests/tsconfig-options/log-options2.js b/tests/tsconfig-options/log-options2.js index 30f402d16..c2d4c891a 100644 --- a/tests/tsconfig-options/log-options2.js +++ b/tests/tsconfig-options/log-options2.js @@ -1,3 +1,3 @@ -const assert = require('assert') -require('./log-options1') -assert(process.required2) +const assert = require('assert'); +require('./log-options1'); +assert(process.required2); diff --git a/tests/tsconfig-options/required1.js b/tests/tsconfig-options/required1.js index 8f3ac408f..33f6996f1 100644 --- a/tests/tsconfig-options/required1.js +++ b/tests/tsconfig-options/required1.js @@ -1 +1 @@ -process.required1 = true +process.required1 = true; diff --git a/tests/tsconfig-options/required2.js b/tests/tsconfig-options/required2.js index 69a3ba618..f6d7b77bd 100644 --- a/tests/tsconfig-options/required2.js +++ b/tests/tsconfig-options/required2.js @@ -1,2 +1,2 @@ -require('assert')(process.required1) -process.required2 = true +require('assert')(process.required1); +process.required2 = true; diff --git a/tests/tsconfig.json b/tests/tsconfig.json index 0a9ec999e..00dbc5efd 100644 --- a/tests/tsconfig.json +++ b/tests/tsconfig.json @@ -5,9 +5,6 @@ "noEmit": true, "strict": true, // Global type definitions. - "typeRoots": [ - "./typings", - "../node_modules/@types", - ], + "typeRoots": ["./typings", "../node_modules/@types"] } } diff --git a/tests/typings/does-not-exist/index.d.ts b/tests/typings/does-not-exist/index.d.ts index 877673cad..7ed392e4f 100644 --- a/tests/typings/does-not-exist/index.d.ts +++ b/tests/typings/does-not-exist/index.d.ts @@ -1,3 +1,3 @@ -declare module "does-not-exist" { - export const foobar = 'test' +declare module 'does-not-exist' { + export const foobar = 'test'; } diff --git a/tests/with-jsx.tsx b/tests/with-jsx.tsx index 5c7864807..94ce0b184 100644 --- a/tests/with-jsx.tsx +++ b/tests/with-jsx.tsx @@ -1,3 +1,5 @@ class Foo2 { - render () { return
} + render() { + return
; + } }