From 6e56c87744a425ca282e9946f91344e00064a03c Mon Sep 17 00:00:00 2001 From: Sylvain Cau Date: Tue, 7 Apr 2020 10:08:08 +0800 Subject: [PATCH 001/297] 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 5e6402e0..e3d293a5 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 002/297] 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 1f79e972..9a36d75c 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 003/297] 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 7bf11308..e391613f 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 004/297] 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 725bb8b1..29b90495 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 005/297] 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 2c4a4a26..e85c7e1a 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 17c40d3c..a16a2624 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 006/297] 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 c303129a..9d923967 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 29b90495..ce3ba163 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 00000000..c2c3efb1 --- /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 00000000..9f78b68d --- /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 00000000..1a206f56 --- /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 00000000..986627de --- /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 007/297] 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 4ecee291..b988e82b 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 008/297] 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 e3d293a5..50059bff 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 009/297] 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 9a36d75c..6e296fed 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 010/297] 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 e85c7e1a..1331477a 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 a16a2624..2f18775c 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 011/297] 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 1331477a..1754da4b 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 2f18775c..4b689777 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 012/297] 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 9d923967..001e1f48 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 ce3ba163..8e700717 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 013/297] 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 1754da4b..9274408a 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 4b689777..dffaa132 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 014/297] 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 b988e82b..3895aeee 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 6e296fed..2bf4d717 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 00000000..1a584667 --- /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 00000000..f75113aa --- /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 00000000..45dd9d24 --- /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 00000000..185a3dbf --- /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 00000000..1902166b --- /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 00000000..e9974a78 --- /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 00000000..1ac61592 --- /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 00000000..873ff976 --- /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 dffaa132..af860b50 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 00000000..730c815b --- /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 00000000..ed1e6003 --- /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 8e700717..355cfcdf 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 50059bff..e37442a9 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 00000000..4bfad1a3 --- /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 00000000..51474b54 --- /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 00000000..e397d521 --- /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 00000000..501c0021 --- /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 00000000..88b9bc86 --- /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 00000000..3dbc1ca5 --- /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 00000000..635b5b87 --- /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 00000000..4bfad1a3 --- /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 00000000..51474b54 --- /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 00000000..e397d521 --- /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 00000000..501c0021 --- /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 00000000..3b955e28 --- /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 00000000..3dbc1ca5 --- /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 00000000..03e0c3c5 --- /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 015/297] 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 9274408a..6d6c01b8 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 af860b50..abfc1951 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 016/297] 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 abfc1951..7e0e4206 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 017/297] 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 6d6c01b8..dc05ff3c 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 7e0e4206..4c4eb65f 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 018/297] 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 dc05ff3c..b983b885 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 4c4eb65f..b966398b 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 ed1e6003..2443d7f7 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 019/297] 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 3895aeee..e12e7042 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 e63194f8..00000000 --- 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 020/297] 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 b983b885..23e6967c 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 b966398b..fb6f9196 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 00000000..38811e99 --- /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 00000000..d9257bd3 --- /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 355cfcdf..0d41f65d 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 ddf34248..1f16711a 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 00000000..26351d2b --- /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 021/297] 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 0d41f65d..064f42ee 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 e37442a9..9ee508ad 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 1183d9ff..dbd4cbc2 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 022/297] 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 e12e7042..b255a7eb 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 2443d7f7..53adfc8a 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 064f42ee..20affb92 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 023/297] 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 b255a7eb..542bf7fc 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 024/297] 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 9ee508ad..46381884 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 00000000..ddacd3c4 --- /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 84dc7d9a..8c23188d 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 025/297] 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 20affb92..25346385 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 46381884..0ac879fd 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 026/297] 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 542bf7fc..2ad4a661 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 fb6f9196..a92934d4 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 027/297] 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 25346385..63023621 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 028/297] 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 574e3cfc..f359ce33 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 00000000..4a886a91 --- /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 23e6967c..7d331b7f 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 a92934d4..cd596c98 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 00000000..8793839c --- /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 63023621..d7797038 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 029/297] Update .gitignore (#1045) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f359ce33..9b3c84d1 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 030/297] 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 2ad4a661..90bf4a2d 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 00000000..28ca3309 --- /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 cd596c98..fb0138c9 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 031/297] 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 90bf4a2d..4c49393f 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 00000000..b7b4c4d7 --- /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 00000000..0c5fabf9 --- /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 53adfc8a..ae08ada3 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 d7797038..7e257a2f 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 0ac879fd..ad8d250f 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 00000000..df054c0b --- /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 00000000..3dbc1ca5 --- /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 00000000..b2bf5a5f --- /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 032/297] 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 fb0138c9..e458b78e 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 7e257a2f..1ed62bd7 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 033/297] 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 ad8d250f..547483fd 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 034/297] 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 547483fd..2b7513f2 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 035/297] 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 7d331b7f..7dd6f696 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 036/297] ignore vscode config files (#1084) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9b3c84d1..54fca00d 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 037/297] 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 1ed62bd7..05497fb6 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 00000000..88886824 --- /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 dbd4cbc2..85ba6da4 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 038/297] 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 05497fb6..1b7d1232 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 2b7513f2..c1a6215f 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 00000000..85ba6da4 --- /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 039/297] 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 2bf4d717..282fdf13 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 040/297] 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 00000000..649deb10 --- /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 001e1f48..ee3380ff 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 1b7d1232..3e64030a 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 c1a6215f..5aa2ea23 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 8a5a76de..59bc3332 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 00000000..30f402d1 --- /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 00000000..8f3ac408 --- /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 00000000..69a3ba61 --- /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 6efea1e6..3f248317 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 041/297] 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 ee3380ff..13c19c38 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 042/297] 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 1a584667..a3da2f9a 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 00000000..f27a4468 --- /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 3e64030a..9c0a37d3 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 043/297] 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 00000000..e62997d7 --- /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 044/297] 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 00000000..089a7cfd --- /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 045/297] 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 f615bb42..3e81a1e7 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 00000000..c4405f39 --- /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 046/297] 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 9c0a37d3..59c5cc6b 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 047/297] 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 59c5cc6b..88de298d 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 048/297] =?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 ae08ada3..a00b2110 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 88de298d..d9085e4c 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 5aa2ea23..ac55811b 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 049/297] 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 00000000..4823d521 --- /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 e458b78e..95174ba5 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 d9085e4c..c3def2b5 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 00000000..e99da7cf --- /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 00000000..3dbc1ca5 --- /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 00000000..03e0c3c5 --- /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 050/297] 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 c3def2b5..7a175c9c 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 00000000..35e59a6c --- /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 051/297] 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 282fdf13..1c4f7f99 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 052/297] 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 7a175c9c..0c78dcd9 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 053/297] 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 7dd6f696..72ae33f9 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 95174ba5..8d480fc3 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 054/297] 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 9fc3e3f5..8a4ed4a3 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 00000000..c0d48285 --- /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 00000000..c11bbc59 --- /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 00000000..c11bbc59 --- /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 00000000..c11bbc59 --- /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 00000000..c11bbc59 --- /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 00000000..c11bbc59 --- /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 00000000..c11bbc59 --- /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 00000000..c11bbc59 --- /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 00000000..c11bbc59 --- /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 9bf72d93..00000000 --- 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 00000000..cd8ababe --- /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 00000000..434f70cb --- /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 00000000..8fc0d16a --- /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 00000000..ca80949e --- /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 00000000..ef273976 --- /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 00000000..ca80949e --- /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 00000000..319936b5 --- /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 00000000..530b7e33 --- /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 00000000..7c5c7599 --- /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 00000000..b8a7e88e --- /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 00000000..def1c4f5 --- /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 00000000..897e4a8c --- /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 00000000..618fe177 --- /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 055/297] 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 72ae33f9..997c65b9 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 8d480fc3..808cf56d 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 056/297] 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 f27a4468..7a68872c 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 e9974a78..6c23fab6 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 10e6aa37..80ea3185 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 057/297] 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 1c4f7f99..c2365641 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 058/297] 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 c2365641..0ef1317c 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 059/297] 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 4c49393f..5ffccfbe 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 80ea3185..74a2959a 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 060/297] 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 5ffccfbe..6735af97 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 a3da2f9a..ef9cd106 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 3b955e28..9f7091dc 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 061/297] 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 6c0dc6f8..e24d5e81 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 66e1113e..47f6e158 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 241c15f4..68c1df1a 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 13c19c38..bac65010 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 062/297] 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 e2b759af..491f7f4d 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 063/297] 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 491f7f4d..27737822 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 064/297] 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 6735af97..3be3ed8d 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 808cf56d..2e6cc5a1 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 8793839c..00000000 --- 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 065/297] 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 997c65b9..df7e8885 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 2e6cc5a1..e04ad354 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 066/297] tweak codecov minimum coverage rules (#1159) --- codecov.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/codecov.yml b/codecov.yml index 28ca3309..fd87799a 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 067/297] 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 649deb10..00000000 --- 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 df7e8885..d7a2f0d2 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 e04ad354..7bc36e5a 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 74a2959a..58fc64c5 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 27737822..3c51f809 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 46529363..0132c19c 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 068/297] 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 ef9cd106..538d00ac 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 58fc64c5..bed91dd2 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 00000000..5de8f1da --- /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 00000000..e33d05b5 --- /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 00000000..efc53f2e --- /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 00000000..3dbc1ca5 --- /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 00000000..c5272e68 --- /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 069/297] 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 54fca00d..483b6923 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 0c5fabf9..029cf5f7 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 00000000..fefcd3ec --- /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 538d00ac..b5709000 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 00000000..d9a2528d --- /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 7a68872c..0602a476 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 00000000..1c36501c --- /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 00000000..eb4972d4 --- /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 7bc36e5a..a08b901d 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 00000000..8a5bc841 --- /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 bed91dd2..4c82742a 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 88b9bc86..df7ccd01 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 00000000..97ec5ba0 --- /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 00000000..dc2a0500 --- /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 00000000..bda92d96 --- /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 9f7091dc..7c0b3e9f 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 00000000..97ec5ba0 --- /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 00000000..dc2a0500 --- /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 00000000..bda92d96 --- /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 03e0c3c5..635b5b87 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 070/297] =?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 bac65010..b9a0bb59 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 4c82742a..f2c5e3a3 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 3c51f809..09860c6d 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 071/297] 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 3be3ed8d..f383e372 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 072/297] 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 00000000..782a13dc --- /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 d7a2f0d2..889eb55c 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 a08b901d..9020a58f 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 b9a0bb59..9ec85679 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 f2c5e3a3..0f7e0f90 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 09860c6d..47b98637 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 00000000..122abbf5 --- /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 073/297] 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 889eb55c..3e45228d 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 9020a58f..6e35adce 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 074/297] 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 3e45228d..20eef5ed 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 6e35adce..2e8a950c 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 075/297] 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 0ef1317c..cb9994de 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 076/297] 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 e62997d7..c78ef6f1 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 077/297] 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 20eef5ed..16624947 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 2e8a950c..d934ede4 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 078/297] 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 47b98637..d82f78e5 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 122abbf5..35dd6919 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 079/297] 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 d934ede4..6b632d01 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 080/297] 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 fd87799a..0268f4d3 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 081/297] Update codecov.yml (#1196) --- codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 0268f4d3..4aaa7bb8 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 082/297] 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 16624947..833345fb 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 6b632d01..ec831c6f 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 083/297] 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 00000000..9b98cc12 --- /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 084/297] 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 730c815b..1c2b8e67 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 8a5bc841..782b892a 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 085/297] 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 00000000..68e1b037 --- /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 483b6923..600675c4 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 00000000..8757b080 --- /dev/null +++ b/logo-icon.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index 833345fb..9d3d8403 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 ec831c6f..fbee06d3 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 d82f78e5..bae0f526 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 0132c19c..b710eb46 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 00000000..b2d6de30 --- /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 00000000..8960fa2a --- /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 00000000..e00595da --- /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 00000000..21025d95 --- /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 00000000..0d3b4c08 --- /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 00000000..6a3182f0 --- /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 00000000..c6ad0337 --- /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 00000000..b1a010ca --- /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 00000000..37a230c5 --- /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 00000000..fef97202 --- /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 00000000..50932db2 --- /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 00000000..13401da1 --- /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 00000000..340bdd71 --- /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 00000000..9b7e4d80 --- /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 00000000..d4434c13 --- /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 00000000..c1aa8512 --- /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 00000000..e69de29b 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 00000000..ad2460bf --- /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 00000000..431cef2f --- /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 00000000..e4170504 --- /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 00000000..a05cc03d --- /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 00000000..4395feb5 --- /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 086/297] 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 0f7e0f90..164a76c2 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 087/297] 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 340bdd71..3964a6ef 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 088/297] 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 cb9994de..ec75beb5 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 fbee06d3..866591fe 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 00000000..fb2c1e63 --- /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 9ec85679..d07a124e 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 164a76c2..37f9be53 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 bae0f526..b716611c 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 00000000..f5fbb60f --- /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 00000000..8e2e8809 --- /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 00000000..f5fbb60f --- /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 00000000..0c761dd3 --- /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 00000000..3977135d --- /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 089/297] 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 b716611c..5bba3b8d 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 090/297] 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 35dd6919..a0b9c60e 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 091/297] 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 37f9be53..a2d02f0f 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 092/297] 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 600675c4..65b40f90 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 089a7cfd..00000000 --- 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 9d3d8403..b9a603a9 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 866591fe..8ef5d190 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 38811e99..d914a1af 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 a2d02f0f..553d99b9 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 5bba3b8d..eb937d07 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 00000000..6e45bd96 --- /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 8a3b78ab..e156a7db 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 56100500..0a9ec999 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 00000000..adf48b4c --- /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 b710eb46..c92bfb25 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 093/297] 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 553d99b9..b1fb16d7 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 eb937d07..b9479867 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 6e45bd96..14533f9a 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 094/297] 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 f383e372..27b3d751 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 095/297] 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 b9479867..6a69b575 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 096/297] 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 6a69b575..914e7b20 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 a0b9c60e..2b807402 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 097/297] #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 b9a603a9..0eee58da 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 8ef5d190..0d36a328 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 d07a124e..0924f96b 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 b1fb16d7..d7db0f5e 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 914e7b20..0866d293 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 098/297] 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 0eee58da..3050c4e6 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 0d36a328..5d1c6840 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 099/297] 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 00000000..7079f3ad --- /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 00000000..76603f1c --- /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 00000000..b0828510 --- /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 3050c4e6..849393ce 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 5d1c6840..0ff87b8a 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 d7db0f5e..e6ea53ef 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 0866d293..f9fb3659 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 00000000..2ce944a4 --- /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 00000000..f8b881e4 --- /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 00000000..eda168e1 --- /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 00000000..8a496b8a --- /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 100/297] 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 849393ce..b0cba38d 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 0ff87b8a..6a7518da 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 0924f96b..f9378969 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 e6ea53ef..895c339b 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 f9fb3659..32f2d323 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 00000000..220e8b03 --- /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 00000000..295f67e8 --- /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 26351d2b..2c03119b 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 00000000..bf54bf04 --- /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 00000000..a0a16895 --- /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 00000000..bf54bf04 --- /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 00000000..03e0c3c5 --- /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 00000000..7cf79b13 --- /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 101/297] 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 8e84accd..2925ccbb 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 00000000..3fd85274 --- /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 b0cba38d..c281a4a4 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 6a7518da..6523dd29 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 102/297] #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 873ff976..2a11ac36 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 4823d521..c1913228 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 4a886a91..3f15fe94 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 93505b69..9be5bf50 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 63ec2ce5..45691176 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 a42dc27a..4c526989 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 08b41028..3d3c60b5 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 d914a1af..ac5e1976 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 16aa66fe..4016fd33 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 c4405f39..25707df9 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 fb2c1e63..bd2f4483 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 e24d5e81..07112d85 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 47f6e158..78f9ab32 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 68c1df1a..8eb81814 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 f9378969..3ed83429 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 a00b2110..6cc64e86 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 d9257bd3..ebc98df0 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 895c339b..5369b164 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 32f2d323..dbde93d1 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 2b807402..2ded04cc 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 14533f9a..f3b3a2a1 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 220e8b03..450e301a 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 295f67e8..9c1d238b 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 d25b3025..5d211261 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 2ce944a4..ae8ee4ac 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 dd3f91cd..9001625a 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 d182b4b5..a48e85a9 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 05050fec..c0e9d4b9 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 05800dd5..ced966e2 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 3971310d..466e7df0 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 93fb156d..bafb472a 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 e8700857..7ac5a99d 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 dc3da6eb..fcd1fbde 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 f5fbb60f..230f5ea0 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 8e2e8809..196e2b44 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 f5fbb60f..230f5ea0 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 0c761dd3..3b22d468 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 7708b855..0b1738d5 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 e156a7db..94510e04 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 df054c0b..1e9f3213 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 b2bf5a5f..90277978 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 5de8f1da..684e08e6 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 e33d05b5..886dfba9 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 efc53f2e..f4922a4f 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 35e59a6c..5342c08e 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 4bfad1a3..4bc22c6f 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 51474b54..6363a288 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 e397d521..7ac50831 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 501c0021..c6b5e44c 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 df7ccd01..77eb4efe 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 e99da7cf..189ad05c 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 4bfad1a3..4bc22c6f 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 51474b54..6363a288 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 e397d521..7ac50831 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 501c0021..c6b5e44c 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 7c0b3e9f..fd9538f1 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 85ba6da4..f43f5e79 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 8a4ed4a3..0f343de3 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 19dfa14d..e9fe0090 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 2a508d1c..fe9e058e 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 3bdda61f..a40a0188 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 f2069333..446f0c50 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 3977135d..b73d5a37 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 fb8e2305..dd81fe7e 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 88473dfa..8f381896 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 82d3094f..0fb0d7e8 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 1a206f56..2a03b0ac 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 434f70cb..a4d00ea9 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 319936b5..f8ed3a02 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 7c5c7599..81442b77 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 897e4a8c..12737b62 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 b0ec363c..fe33f080 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 4fbdd504..79a6f98f 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 af2b0fed..12797e9c 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 bf20f0de..35ff402e 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 af2b0fed..12797e9c 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 0a0ebc6e..66523575 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 88886824..250c5e1e 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 85ba6da4..f43f5e79 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 bf54bf04..a893c64e 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 bf54bf04..a893c64e 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 59bc3332..2c248faf 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 30f402d1..c2d4c891 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 8f3ac408..33f6996f 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 69a3ba61..f6d7b77b 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 0a9ec999..00dbc5ef 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 877673ca..7ed392e4 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 5c786480..94ce0b18 100644 --- a/tests/with-jsx.tsx +++ b/tests/with-jsx.tsx @@ -1,3 +1,5 @@ class Foo2 { - render () { return
} + render() { + return
; + } } From 16c98431f6cdfb25f8a49fe17f56c4ae180639ff Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 27 Feb 2021 16:22:44 -0500 Subject: [PATCH 103/297] Code changes required to rename default branch to main (#1254) --- .github/ISSUE_TEMPLATE/config.yml | 14 +++++++------- .github/workflows/continuous-integration.yml | 2 +- .github/workflows/website.yml | 2 +- README.md | 4 ++-- esm-usage-example/package.json | 2 +- src/index.ts | 2 +- website/docs/getting-started.md | 2 +- website/docusaurus.config.js | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c78ef6f1..2d1771f6 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,18 +1,18 @@ ---- -contact_links: - - +--- +contact_links: + - name: Question 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." 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" - - + url: "https://github.com/TypeStrong/ts-node/blob/main/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" diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 27b3d751..cd0ccc3a 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -3,7 +3,7 @@ on: # branches pushed by collaborators push: branches: - - master + - main # pull request from non-collaborators pull_request: {} # nightly diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 68e1b037..df4881aa 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -3,7 +3,7 @@ on: # branches pushed by collaborators push: branches: - - master + - main jobs: build: name: Build & Deploy diff --git a/README.md b/README.md index ec75beb5..ee4c729f 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ ts-node-cwd scripts.ts ts-node-transpile-only scripts.ts ``` -![TypeScript REPL](https://github.com/TypeStrong/ts-node/raw/master/screenshot.png) +![TypeScript REPL](https://github.com/TypeStrong/ts-node/raw/main/screenshot.png) ### Shebang @@ -309,5 +309,5 @@ MIT [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-image]: https://codecov.io/gh/TypeStrong/ts-node/branch/main/graph/badge.svg [codecov-url]: https://codecov.io/gh/TypeStrong/ts-node diff --git a/esm-usage-example/package.json b/esm-usage-example/package.json index 6c23fab6..ec1886ad 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#master", + "ts-node": "github:TypeStrong/ts-node#main", "typescript": "^3.8.3" } } diff --git a/src/index.ts b/src/index.ts index dbde93d1..df02a8b1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -667,7 +667,7 @@ export function create(rawOptions: CreateOptions = {}): Service { : options.transpiler[0]; const transpilerOptions = typeof options.transpiler === 'string' ? {} : options.transpiler[1] ?? {}; - // TODO mimic fixed resolution logic from loadCompiler master + // TODO mimic fixed resolution logic from loadCompiler main // TODO refactor into a more generic "resolve dep relative to project" helper const transpilerPath = require.resolve(transpilerName, { paths: [cwd, __dirname], diff --git a/website/docs/getting-started.md b/website/docs/getting-started.md index 6a3182f0..91267c60 100644 --- a/website/docs/getting-started.md +++ b/website/docs/getting-started.md @@ -149,5 +149,5 @@ MIT [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-image]: https://codecov.io/gh/TypeStrong/ts-node/branch/main/graph/badge.svg [codecov-url]: https://codecov.io/gh/TypeStrong/ts-node diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 50932db2..3befa8c2 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -80,7 +80,7 @@ module.exports = { sidebarPath: require.resolve('./sidebars.js'), // Please change this to your repo. editUrl: - 'https://github.com/TypeStrong/ts-node/edit/master/website/', + 'https://github.com/TypeStrong/ts-node/edit/main/website/', }, // blog: { // showReadingTime: true, From 6deb1204251dc8016065507cbf5eb05fa147dcda Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 27 Feb 2021 17:16:22 -0500 Subject: [PATCH 104/297] fix test failures caused by prettier formatting changes (#1255) --- .prettierignore | 3 ++ src/index.spec.ts | 18 ++++---- tests/esm/throw.ts | 97 +++++++++++++++++++++++++++++++++++++-- tests/throw-react-tsx.tsx | 96 ++++++++++++++++++++++++++++++++++++-- tests/throw.ts | 97 +++++++++++++++++++++++++++++++++++++-- 5 files changed, 293 insertions(+), 18 deletions(-) diff --git a/.prettierignore b/.prettierignore index 3fd85274..613c2285 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,3 +7,6 @@ !/src !/tests tests/main-realpath/symlink/tsconfig.json +tests/throw.ts +tests/throw-react-tsx.tsx +tests/esm/throw.ts diff --git a/src/index.spec.ts b/src/index.spec.ts index 5369b164..3f52167f 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -278,8 +278,8 @@ test.suite('ts-node', (test) => { expect(err.message).to.contain( [ `${join(TEST_DIR, 'throw.ts')}:100`, - " bar () { throw new Error('this is a demo') }", - ' ^', + " bar() { throw new Error('this is a demo'); }", + ' ^', 'Error: this is a demo', ].join('\n') ); @@ -294,8 +294,8 @@ test.suite('ts-node', (test) => { expect(err.message).to.contain( [ `${join(TEST_DIR, 'throw.ts')}:100`, - " bar () { throw new Error('this is a demo') }", - ' ^', + " bar() { throw new Error('this is a demo'); }", + ' ^', ].join('\n') ); }); @@ -427,8 +427,8 @@ test.suite('ts-node', (test) => { expect(err!.message).to.contain( [ `${join(TEST_DIR, './throw-react-tsx.tsx')}:100`, - " bar () { throw new Error('this is a demo') }", - ' ^', + " bar() { throw new Error('this is a demo'); }", + ' ^', 'Error: this is a demo', ].join('\n') ); @@ -981,7 +981,7 @@ test.suite('ts-node', (test) => { expect(error.stack).to.contain( [ 'Error: this is a demo', - ` at Foo.bar (${join(TEST_DIR, './throw.ts')}:100:18)`, + ` at Foo.bar (${join(TEST_DIR, './throw.ts')}:100:17)`, ].join('\n') ); } @@ -1142,8 +1142,8 @@ test.suite('ts-node', (test) => { expect(err!.message).to.contain( [ `${pathToFileURL(join(TEST_DIR, './esm/throw.ts'))}:100`, - " bar () { throw new Error('this is a demo') }", - ' ^', + " bar() { throw new Error('this is a demo'); }", + ' ^', 'Error: this is a demo', ].join('\n') ); diff --git a/tests/esm/throw.ts b/tests/esm/throw.ts index f43f5e79..92f75549 100644 --- a/tests/esm/throw.ts +++ b/tests/esm/throw.ts @@ -1,12 +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'); - } + bar() { throw new Error('this is a demo'); } } new Foo(); export {}; diff --git a/tests/throw-react-tsx.tsx b/tests/throw-react-tsx.tsx index 250c5e1e..df73202d 100644 --- a/tests/throw-react-tsx.tsx +++ b/tests/throw-react-tsx.tsx @@ -1,13 +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. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + const React = { createElement: (...args: any[]) => null }; class Foo { constructor() { this.bar(); } - bar() { - throw new Error('this is a demo'); - } + bar() { throw new Error('this is a demo'); } someJsx() { return
; } diff --git a/tests/throw.ts b/tests/throw.ts index f43f5e79..92f75549 100644 --- a/tests/throw.ts +++ b/tests/throw.ts @@ -1,12 +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'); - } + bar() { throw new Error('this is a demo'); } } new Foo(); export {}; From fa1bf89d3b418e48f7bc2f87d8ab961379886b9e Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 28 Feb 2021 22:36:25 -0500 Subject: [PATCH 105/297] implicitly reference "node" types and implement fallback resolution for "node" types to either cwd @types/node or globally-installed @types/node (#1257) --- package.json | 2 ++ src/index.spec.ts | 36 +++++++++++++++++++ src/index.ts | 29 +++++++++++++-- .../node_modules/@types/node/index.d.ts | 4 +++ .../node_modules/@types/node/package.json | 3 ++ 5 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 tests/local-types-node/node_modules/@types/node/index.d.ts create mode 100644 tests/local-types-node/node_modules/@types/node/package.json diff --git a/package.json b/package.json index 6523dd29..3db9249f 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,7 @@ "@types/rimraf": "^3.0.0", "@types/semver": "^7.1.0", "@types/source-map-support": "^0.5.0", + "@yarnpkg/fslib": "^2.4.0", "ava": "^3.15.0", "axios": "^0.21.1", "chai": "^4.0.1", @@ -139,6 +140,7 @@ "peerDependencies": { "@swc/core": ">=1.2.45", "@swc/wasm": ">=1.2.45", + "@types/node": "*", "typescript": ">=2.7" }, "peerDependenciesMeta": { diff --git a/src/index.spec.ts b/src/index.spec.ts index 3f52167f..3dc32c93 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -12,6 +12,7 @@ import semver = require('semver'); import ts = require('typescript'); import proxyquire = require('proxyquire'); import type * as tsNodeTypes from './index'; +import * as fs from 'fs'; import { unlinkSync, existsSync, @@ -21,6 +22,7 @@ import { copyFileSync, writeFileSync, } from 'fs'; +import { NodeFS, npath } from '@yarnpkg/fslib'; import * as promisify from 'util.promisify'; import { sync as rimrafSync } from 'rimraf'; import type _createRequire from 'create-require'; @@ -31,6 +33,8 @@ import { PassThrough } from 'stream'; import * as getStream from 'get-stream'; import { once } from 'lodash'; +const xfs = new NodeFS(fs); + type TestExecReturn = { stdout: string; stderr: string; @@ -715,6 +719,38 @@ test.suite('ts-node', (test) => { ); }); } + test('implicitly loads @types/node even when not installed within local directory', async ({ + context: { tempDir }, + }) => { + const { err, stdout, stderr } = await exec( + `${BIN_PATH} -pe process.env.foo`, + { + cwd: tempDir, + env: { ...process.env, foo: 'hello world' }, + } + ); + expect(err).to.equal(null); + expect(stdout).to.equal('hello world\n'); + }); + test('implicitly loads local @types/node', async ({ + context: { tempDir }, + }) => { + await xfs.copyPromise( + npath.toPortablePath(tempDir), + npath.toPortablePath(join(TEST_DIR, 'local-types-node')) + ); + const { err, stdout, stderr } = await exec( + `${BIN_PATH} -pe process.env.foo`, + { + cwd: tempDir, + env: { ...process.env, foo: 'hello world' }, + } + ); + expect(err).to.not.equal(null); + expect(stderr).to.contain( + "Property 'env' does not exist on type 'LocalNodeTypes_Process'" + ); + }); } ); diff --git a/src/index.ts b/src/index.ts index df02a8b1..7428d51a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -855,7 +855,7 @@ export function create(rawOptions: CreateOptions = {}): Service { ): (_ts.ResolvedTypeReferenceDirective | undefined)[] => { // Note: seems to be called with empty typeDirectiveNames array for all files. return typeDirectiveNames.map((typeDirectiveName) => { - const { + let { resolvedTypeReferenceDirective, } = ts.resolveTypeReferenceDirective( typeDirectiveName, @@ -864,6 +864,28 @@ export function create(rawOptions: CreateOptions = {}): Service { serviceHost, redirectedReference ); + if (typeDirectiveName === 'node' && !resolvedTypeReferenceDirective) { + // Resolve @types/node relative to project first, then __dirname (copy logic from elsewhere / refactor into reusable function) + const typesNodePackageJsonPath = require.resolve( + '@types/node/package.json', + { + paths: [configFilePath ?? cwd, __dirname], + } + ); + const typeRoots = [resolve(typesNodePackageJsonPath, '../..')]; + ({ + resolvedTypeReferenceDirective, + } = ts.resolveTypeReferenceDirective( + typeDirectiveName, + containingFile, + { + ...config.options, + typeRoots, + }, + serviceHost, + redirectedReference + )); + } if (resolvedTypeReferenceDirective) { fixupResolvedModule(resolvedTypeReferenceDirective); } @@ -1504,7 +1526,10 @@ function readConfig( const skipDefaultCompilerOptions = configFilePath != null; const defaultCompilerOptionsForNodeVersion = skipDefaultCompilerOptions ? undefined - : getDefaultTsconfigJsonForNodeVersion(ts).compilerOptions; + : { + ...getDefaultTsconfigJsonForNodeVersion(ts).compilerOptions, + types: ['node'], + }; // Merge compilerOptions from all sources config.compilerOptions = Object.assign( diff --git a/tests/local-types-node/node_modules/@types/node/index.d.ts b/tests/local-types-node/node_modules/@types/node/index.d.ts new file mode 100644 index 00000000..acc6b1da --- /dev/null +++ b/tests/local-types-node/node_modules/@types/node/index.d.ts @@ -0,0 +1,4 @@ +declare const process: LocalNodeTypes_Process; +declare interface LocalNodeTypes_Process { + /* empty */ +} diff --git a/tests/local-types-node/node_modules/@types/node/package.json b/tests/local-types-node/node_modules/@types/node/package.json new file mode 100644 index 00000000..b6d8ad99 --- /dev/null +++ b/tests/local-types-node/node_modules/@types/node/package.json @@ -0,0 +1,3 @@ +{ + "name": "@types/node" +} From 3cd7726e3bf146a380a6e8e1599273aec5b04272 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 28 Feb 2021 23:05:15 -0500 Subject: [PATCH 106/297] update package-lock --- package-lock.json | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/package-lock.json b/package-lock.json index c281a4a4..fdc6430b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -538,6 +538,12 @@ "integrity": "sha1-Lpu4n5rMOrAQjw89xNvc8v/4qZw=", "dev": true }, + "@types/emscripten": { + "version": "1.39.4", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.4.tgz", + "integrity": "sha512-k3LLVMFrdNA9UCvMDPWMbFrGPNb+GcPyw29ktJTo1RCN7RmxFG5XzPZcPKRlnLuLT/FRm8wp4ohvDwNY7GlROQ==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -625,6 +631,26 @@ "@types/node": "*" } }, + "@yarnpkg/fslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.4.0.tgz", + "integrity": "sha512-CwffYY9owtl3uImNOn1K4jl5iIb/L16a9UZ9Q3lkBARk6tlUsPrNFX00eoUlFcLn49TTfd3zdN6higloGCyncw==", + "dev": true, + "requires": { + "@yarnpkg/libzip": "^2.2.1", + "tslib": "^1.13.0" + } + }, + "@yarnpkg/libzip": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.2.1.tgz", + "integrity": "sha512-AYDJXrkzayoDd3ZlVgFJ+LyDX+Zj/cki3vxIpcYxejtgkl3aquVWOxlC0DD9WboBWsJFIP1MjrUbchLyh++/7A==", + "dev": true, + "requires": { + "@types/emscripten": "^1.38.0", + "tslib": "^1.13.0" + } + }, "acorn": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", @@ -4299,6 +4325,12 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "type-detect": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", From 5c6efa424831aa75d118ad26e8f2917f82f290eb Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 1 Mar 2021 01:42:23 -0500 Subject: [PATCH 107/297] Delete tslint.json --- tslint.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 tslint.json diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 88877985..00000000 --- a/tslint.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "tslint-config-standard" -} From 62641d94744f77067007ecea0a802bcf604fc1ed Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 2 Mar 2021 17:09:47 -0500 Subject: [PATCH 108/297] Refactor codebase into separate files, and enable `importsNotUsedAsValues: error` (#1266) --- src/bin.ts | 11 +- src/configuration.ts | 222 +++++++++++++++++++++++++ src/index.spec.ts | 2 +- src/index.ts | 348 +-------------------------------------- src/repl.ts | 2 +- src/transpilers/swc.ts | 2 +- src/transpilers/types.ts | 2 +- src/ts-compiler-types.ts | 63 +++++++ src/tsconfig-schema.ts | 2 +- src/tsconfigs.ts | 7 +- src/util.ts | 63 +++++++ tsconfig.json | 3 +- 12 files changed, 371 insertions(+), 356 deletions(-) create mode 100644 src/configuration.ts create mode 100644 src/ts-compiler-types.ts create mode 100644 src/util.ts diff --git a/src/bin.ts b/src/bin.ts index 3ed83429..934fb66a 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -4,15 +4,10 @@ import { join, resolve, dirname, parse as parsePath } from 'path'; import { inspect } from 'util'; import Module = require('module'); import arg = require('arg'); +import { parse, createRequire } from './util'; import { EVAL_FILENAME, EvalState, createRepl, ReplService } from './repl'; -import { - VERSION, - TSError, - parse, - register, - createRequire, - TSInternal, -} from './index'; +import { VERSION, TSError, register } from './index'; +import type { TSInternal } from './ts-compiler-types'; /** * Main `bin` functionality. diff --git a/src/configuration.ts b/src/configuration.ts new file mode 100644 index 00000000..986de4d5 --- /dev/null +++ b/src/configuration.ts @@ -0,0 +1,222 @@ +import { resolve, dirname } from 'path'; +import type * as _ts from 'typescript'; +import { CreateOptions, DEFAULTS, TSCommon, TsConfigOptions } from './index'; +import { getDefaultTsconfigJsonForNodeVersion } from './tsconfigs'; +import { createRequire } from './util'; + +/** + * TypeScript compiler option values required by `ts-node` which cannot be overridden. + */ +const TS_NODE_COMPILER_OPTIONS = { + sourceMap: true, + inlineSourceMap: false, + inlineSources: true, + declaration: false, + noEmit: false, + outDir: '.ts-node', +}; + +/* + * Do post-processing on config options to support `ts-node`. + */ +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; + + // Target ES5 output by default (instead of ES3). + if (config.options.target === undefined) { + 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; + } + + return config; +} + +/** + * 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. + * + * @internal + */ +export function readConfig( + cwd: string, + ts: TSCommon, + rawApiOptions: CreateOptions +): { + /** + * Path of tsconfig file if one was loaded + */ + configFilePath: string | undefined; + /** + * Parsed TypeScript configuration with compilerOptions merged from all other sources (env vars, etc) + */ + config: _ts.ParsedCommandLine; + /** + * 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, rawApiOptions.projectSearchDir ?? cwd); + + const { + fileExists = ts.sys.fileExists, + readFile = ts.sys.readFile, + skipProject = DEFAULTS.skipProject, + project = DEFAULTS.project, + } = rawApiOptions; + + // Read project configuration when available. + if (!skipProject) { + configFilePath = project + ? resolve(cwd, project) + : ts.findConfigFile(projectSearchDir, fileExists); + + if (configFilePath) { + const result = ts.readConfigFile(configFilePath, readFile); + + // Return diagnostics. + if (result.error) { + return { + configFilePath, + config: { errors: [result.error], fileNames: [], options: {} }, + tsNodeOptionsFromTsconfig: {}, + }; + } + + config = result.config; + basePath = dirname(configFilePath); + } + } + + // Fix ts-node options that come from tsconfig.json + const tsNodeOptionsFromTsconfig: TsConfigOptions = Object.assign( + {}, + filterRecognizedTsConfigTsNodeOptions(config['ts-node']) + ); + + // Remove resolution of "files". + const files = + rawApiOptions.files ?? tsNodeOptionsFromTsconfig.files ?? DEFAULTS.files; + if (!files) { + config.files = []; + config.include = []; + } + + // Only if a config file is *not* loaded, load an implicit configuration from @tsconfig/bases + const skipDefaultCompilerOptions = configFilePath != null; + const defaultCompilerOptionsForNodeVersion = skipDefaultCompilerOptions + ? undefined + : { + ...getDefaultTsconfigJsonForNodeVersion(ts).compilerOptions, + types: ['node'], + }; + + // 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, + // tsconfig.json "ts-node": "compilerOptions" + tsNodeOptionsFromTsconfig.compilerOptions, + // passed programmatically + 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 + ) + ); + + 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); + } + ); + } + + 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; + const { + 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, + }; + // 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; +} diff --git a/src/index.spec.ts b/src/index.spec.ts index 3dc32c93..9e32502a 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -28,7 +28,7 @@ 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 type * as Module from 'module'; import { PassThrough } from 'stream'; import * as getStream from 'get-stream'; import { once } from 'lodash'; diff --git a/src/index.ts b/src/index.ts index 7428d51a..550940b7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,25 +1,18 @@ 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 { Module } from 'module'; import * as util from 'util'; import { fileURLToPath } from 'url'; + +import sourceMapSupport = require('source-map-support'); +import { BaseError } from 'make-error'; 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); +import type { Transpiler, TranspilerFactory } from './transpilers/types'; +import { assign, normalizeSlashes, parse, split, yn } from './util'; +import { readConfig } from './configuration'; +import type { TSCommon, TSInternal } from './ts-compiler-types'; +export { TSCommon }; export { createRepl, CreateReplOptions, ReplService } from './repl'; /** @@ -98,14 +91,6 @@ export interface ProcessEnv { */ 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; -} - /** * Debugging `ts-node`. */ @@ -125,69 +110,6 @@ const debugFn = shouldDebug } : (_: 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[]; -} - -/** - * Compiler APIs we use that are marked internal and not included in TypeScript's public API declarations - * @internal - */ -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; -} -/** @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; - } -} - export interface TSCompilerFactory { createTypescriptCompiler(options?: any): TSCommon; } @@ -375,19 +297,6 @@ export interface TsConfigOptions | 'experimentalEsmLoader' > {} -/** - * Like `Object.assign`, but ignores `undefined` properties. - */ -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; - } - } - return initialValue; -} - /** * Information retrieved from type info check. */ @@ -422,42 +331,6 @@ export const DEFAULTS: RegisterOptions = { experimentalEsmLoader: false, }; -/** - * TypeScript compiler option values required by `ts-node` which cannot be overridden. - */ -const TS_NODE_COMPILER_OPTIONS = { - sourceMap: true, - inlineSourceMap: false, - inlineSources: true, - declaration: false, - noEmit: false, - outDir: '.ts-node', -}; - -/** - * Split a string array of values. - * @internal - */ -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; -} - -/** - * Replace backslashes with forward slashes. - * @internal - */ -export function normalizeSlashes(value: string): string { - return value.replace(/\\/g, '/'); -} - /** * TypeScript diagnostics error. */ @@ -1422,209 +1295,6 @@ function registerExtension( }; } -/** - * Do post-processing on config options to support `ts-node`. - */ -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; - - // Target ES5 output by default (instead of ES3). - if (config.options.target === undefined) { - 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; - } - - return config; -} - -/** - * 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, - rawApiOptions: CreateOptions -): { - /** - * Path of tsconfig file if one was loaded - */ - configFilePath: string | undefined; - /** - * Parsed TypeScript configuration with compilerOptions merged from all other sources (env vars, etc) - */ - config: _ts.ParsedCommandLine; - /** - * 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, rawApiOptions.projectSearchDir ?? cwd); - - const { - fileExists = ts.sys.fileExists, - readFile = ts.sys.readFile, - skipProject = DEFAULTS.skipProject, - project = DEFAULTS.project, - } = rawApiOptions; - - // Read project configuration when available. - if (!skipProject) { - configFilePath = project - ? resolve(cwd, project) - : ts.findConfigFile(projectSearchDir, fileExists); - - if (configFilePath) { - const result = ts.readConfigFile(configFilePath, readFile); - - // Return diagnostics. - if (result.error) { - return { - configFilePath, - config: { errors: [result.error], fileNames: [], options: {} }, - tsNodeOptionsFromTsconfig: {}, - }; - } - - config = result.config; - basePath = dirname(configFilePath); - } - } - - // Fix ts-node options that come from tsconfig.json - const tsNodeOptionsFromTsconfig: TsConfigOptions = Object.assign( - {}, - filterRecognizedTsConfigTsNodeOptions(config['ts-node']) - ); - - // Remove resolution of "files". - const files = - rawApiOptions.files ?? tsNodeOptionsFromTsconfig.files ?? DEFAULTS.files; - if (!files) { - config.files = []; - config.include = []; - } - - // Only if a config file is *not* loaded, load an implicit configuration from @tsconfig/bases - const skipDefaultCompilerOptions = configFilePath != null; - const defaultCompilerOptionsForNodeVersion = skipDefaultCompilerOptions - ? undefined - : { - ...getDefaultTsconfigJsonForNodeVersion(ts).compilerOptions, - types: ['node'], - }; - - // 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, - // tsconfig.json "ts-node": "compilerOptions" - tsNodeOptionsFromTsconfig.compilerOptions, - // passed programmatically - 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 - ) - ); - - 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); - } - ); - } - - 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; - const { - 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, - }; - // 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. */ diff --git a/src/repl.ts b/src/repl.ts index 2ded04cc..18acb516 100644 --- a/src/repl.ts +++ b/src/repl.ts @@ -6,7 +6,7 @@ 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 type * as tty from 'tty'; /** * Eval filename for REPL/debug. diff --git a/src/transpilers/swc.ts b/src/transpilers/swc.ts index 450e301a..88b7e865 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 { CreateTranspilerOptions, Transpiler } from './types'; export interface SwcTranspilerOptions extends CreateTranspilerOptions { /** diff --git a/src/transpilers/types.ts b/src/transpilers/types.ts index 9c1d238b..3c1e7afc 100644 --- a/src/transpilers/types.ts +++ b/src/transpilers/types.ts @@ -1,5 +1,5 @@ import type * as ts from 'typescript'; -import { Service } from '..'; +import type { Service } from '../index'; /** * Third-party transpilers are implemented as a CommonJS module with a diff --git a/src/ts-compiler-types.ts b/src/ts-compiler-types.ts new file mode 100644 index 00000000..0b2236ba --- /dev/null +++ b/src/ts-compiler-types.ts @@ -0,0 +1,63 @@ +import type * as _ts from 'typescript'; + +/** + * 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; +} + +/** + * Compiler APIs we use that are marked internal and not included in TypeScript's public API declarations + * @internal + */ +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; + libs?: string[]; +} +/** @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; + } +} diff --git a/src/tsconfig-schema.ts b/src/tsconfig-schema.ts index 5d211261..fe3a1eaa 100644 --- a/src/tsconfig-schema.ts +++ b/src/tsconfig-schema.ts @@ -1,4 +1,4 @@ -import { TsConfigOptions } from '.'; +import type { TsConfigOptions } from './index'; /* * This interface exists solely for generating a JSON schema for tsconfig.json. diff --git a/src/tsconfigs.ts b/src/tsconfigs.ts index ae8ee4ac..f984f6c1 100644 --- a/src/tsconfigs.ts +++ b/src/tsconfigs.ts @@ -1,4 +1,4 @@ -import { TSCommon } from '.'; +import type { TSCommon, TSInternal } from './ts-compiler-types'; const nodeMajor = parseInt(process.versions.node.split('.')[0], 10); /** @@ -7,6 +7,7 @@ const nodeMajor = parseInt(process.versions.node.split('.')[0], 10); * @internal */ export function getDefaultTsconfigJsonForNodeVersion(ts: TSCommon): any { + const tsInternal = (ts as any) as TSInternal; if (nodeMajor >= 14) { const config = require('@tsconfig/node14/tsconfig.json'); if (configCompatible(config)) return config; @@ -28,8 +29,8 @@ export function getDefaultTsconfigJsonForNodeVersion(ts: TSCommon): any { typeof (ts.ScriptTarget as any)[ config.compilerOptions.target.toUpperCase() ] === 'number' && - ts.libs && - config.compilerOptions.lib.every((lib) => ts.libs!.includes(lib)) + tsInternal.libs && + config.compilerOptions.lib.every((lib) => tsInternal.libs!.includes(lib)) ); } } diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 00000000..3cc703ee --- /dev/null +++ b/src/util.ts @@ -0,0 +1,63 @@ +import { + createRequire as nodeCreateRequire, + createRequireFromPath as nodeCreateRequireFromPath, +} from 'module'; +import type _createRequire from 'create-require'; +import * as ynModule from 'yn'; + +/** @internal */ +export const createRequire = + nodeCreateRequire ?? + nodeCreateRequireFromPath ?? + (require('create-require') as typeof _createRequire); + +/** + * 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. + * @internal + */ +export function yn(value: string | undefined) { + return ynModule(value) ?? undefined; +} + +/** + * Like `Object.assign`, but ignores `undefined` properties. + * + * @internal + */ +export 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; + } + } + return initialValue; +} + +/** + * Split a string array of values. + * @internal + */ +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; +} + +/** + * 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 c92bfb25..bf59b8f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "types": ["node"], "stripInternal": true, "incremental": true, - "skipLibCheck": true + "skipLibCheck": true, + "importsNotUsedAsValues": "error" }, "include": [ "src/**/*" From bf470684a3a51f3900258d29306bf8227abd715f Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Wed, 10 Mar 2021 23:04:39 -0500 Subject: [PATCH 109/297] exclude tests from npm package to shrink install size (#1273) * exclude tests from npm package to shrink install size * fix test failures --- package.json | 27 ++++++++++++++------------- src/{ => test}/index.spec.ts | 29 +++++++++++++++-------------- src/{ => test}/testlib.ts | 0 3 files changed, 29 insertions(+), 27 deletions(-) rename src/{ => test}/index.spec.ts (98%) rename src/{ => test}/testlib.ts (100%) diff --git a/package.json b/package.json index 3db9249f..a1391433 100644 --- a/package.json +++ b/package.json @@ -37,18 +37,19 @@ "ts-node-transpile-only": "dist/bin-transpile.js" }, "files": [ - "transpilers/", - "dist/", - "dist-raw/", - "register/", - "esm/", - "esm.mjs", - "LICENSE", - "tsconfig.schema.json", - "tsconfig.schemastore-schema.json", - "node10/", - "node12/", - "node14/" + "/transpilers/", + "/dist/", + "!/dist/test", + "/dist-raw/", + "/register/", + "/esm/", + "/esm.mjs", + "/LICENSE", + "/tsconfig.schema.json", + "/tsconfig.schemastore-schema.json", + "/node10/", + "/node12/", + "/node14/" ], "scripts": { "lint": "prettier --check .", @@ -101,7 +102,7 @@ "homepage": "https://github.com/TypeStrong/ts-node", "ava": { "files": [ - "dist/*.spec.js" + "dist/test/*.spec.js" ], "failWithoutAssertions": false, "timeout": "300s" diff --git a/src/index.spec.ts b/src/test/index.spec.ts similarity index 98% rename from src/index.spec.ts rename to src/test/index.spec.ts index 9e32502a..4eb6fa21 100644 --- a/src/index.spec.ts +++ b/src/test/index.spec.ts @@ -11,7 +11,7 @@ import { tmpdir } from 'os'; import semver = require('semver'); import ts = require('typescript'); import proxyquire = require('proxyquire'); -import type * as tsNodeTypes from './index'; +import type * as tsNodeTypes from '../index'; import * as fs from 'fs'; import { unlinkSync, @@ -64,8 +64,9 @@ function exec( ); } -const ROOT_DIR = resolve(__dirname, '..'); -const TEST_DIR = join(__dirname, '../tests'); +const ROOT_DIR = resolve(__dirname, '../..'); +const DIST_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'); @@ -93,7 +94,7 @@ test.suite('ts-node', (test) => { 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 @@ -900,7 +901,7 @@ test.suite('ts-node', (test) => { jsx: 'preserve', }, }), - moduleTestPath: require.resolve('../tests/module'), + moduleTestPath: require.resolve('../../tests/module'), }; }) ); @@ -973,8 +974,8 @@ test.suite('ts-node', (test) => { }); 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)); } @@ -991,13 +992,13 @@ test.suite('ts-node', (test) => { } test('should compile through js and ts', () => { - const m = require('../tests/complex'); + const m = require('../../tests/complex'); expect(m.example()).to.equal('example'); }); test('should work with proxyquire', () => { - const m = proxyquire('../tests/complex', { + const m = proxyquire('../../tests/complex', { './example': 'hello', }); @@ -1005,14 +1006,14 @@ test.suite('ts-node', (test) => { }); 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); }); test('should use source maps', async () => { try { - require('../tests/throw'); + require('../../tests/throw'); } catch (error) { expect(error.stack).to.contain( [ @@ -1047,7 +1048,7 @@ test.suite('ts-node', (test) => { 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'); } @@ -1103,13 +1104,13 @@ test.suite('ts-node', (test) => { disallowed: string[] ) { for (const ext of allowed) { - expect(ignored(join(__dirname, `index${ext}`))).equal( + expect(ignored(join(DIST_DIR, `index${ext}`))).equal( false, `should accept ${ext} files` ); } for (const ext of disallowed) { - expect(ignored(join(__dirname, `index${ext}`))).equal( + expect(ignored(join(DIST_DIR, `index${ext}`))).equal( true, `should ignore ${ext} files` ); diff --git a/src/testlib.ts b/src/test/testlib.ts similarity index 100% rename from src/testlib.ts rename to src/test/testlib.ts From da64349a230d3b9d495e54d4ab35204963515603 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 9 Apr 2021 15:29:21 -0400 Subject: [PATCH 110/297] Update package.json (#1294) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a1391433..cd8bbcaf 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "bugs": { "url": "https://github.com/TypeStrong/ts-node/issues" }, - "homepage": "https://github.com/TypeStrong/ts-node", + "homepage": "https://typestrong.org/ts-node", "ava": { "files": [ "dist/test/*.spec.js" From 0a72d2d7007dd519302ab890973cc33c894cf6a1 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 9 Apr 2021 15:35:03 -0400 Subject: [PATCH 111/297] Fix website syntax highlighting (#1295) * Attempt to fix syntax highlighting in website * Update docusaurus.config.js * Fix: json formats comments; jsonc is not supported --- website/docs/configuration.md | 9 ++++----- website/docusaurus.config.js | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/website/docs/configuration.md b/website/docs/configuration.md index 21025d95..85c1b20b 100644 --- a/website/docs/configuration.md +++ b/website/docs/configuration.md @@ -4,7 +4,7 @@ title: Configuration You can set options by passing them before the script path, via programmatic usage, via `tsconfig.json`, or via environment variables. -```sh +```shell ts-node --compiler ntypescript --project src/tsconfig.json hello-world.ts ``` @@ -15,8 +15,7 @@ ts-node --compiler ntypescript --project src/tsconfig.json hello-world.ts `ts-node` loads `tsconfig.json` automatically. Use this recommended configuration as a starting point. -```jsonc -// tsconfig.json +```json title="tsconfig.json" { "ts-node": { // Most ts-node options can be specified here using their programmatic, camel-case names. @@ -94,12 +93,12 @@ _The name of the environment variable and the option's default value are denoted We recommend using the `NODE_OPTIONS`](https://nodejs.org/api/cli.html#cli_node_options_options) environment variable to pass options to `node`. -``` +```shell 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` -``` +```shell node --trace-deprecation --abort-on-uncaught-exception -r ts-node/register ./index.ts ``` diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 3befa8c2..2e537ac8 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -71,6 +71,10 @@ module.exports = { ], // copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, }, + prism: { + // for syntax highlighting + // additionalLanguages: ['powershell'], + }, }, presets: [ [ From 03355c15210731d948713a5edc624d4f215d1113 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 13 Apr 2021 19:26:35 -0400 Subject: [PATCH 112/297] Build website from docs branch, not main --- .github/workflows/website.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index df4881aa..b80c1b80 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -3,7 +3,7 @@ on: # branches pushed by collaborators push: branches: - - main + - docs jobs: build: name: Build & Deploy From c174a7aa87466b3ca4e1de8f545e6692fbe7beec Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 15 May 2021 15:36:05 -0400 Subject: [PATCH 113/297] Add node 16 to test matrix; drop node 10 (#1312) * add node 16; remove node 15 and 10 from test matrix * bump minimum supported node version to 12 --- .github/workflows/continuous-integration.yml | 42 +++++++++----------- package.json | 2 +- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index cd0ccc3a..5c41a975 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -17,10 +17,10 @@ jobs: # checkout code - uses: actions/checkout@v2 # install node - - name: Use Node.js 14 + - name: Use Node.js 16 uses: actions/setup-node@v1 with: - node-version: 14 + node-version: 16 # lint, build, test - run: npm install - run: npm run lint @@ -40,66 +40,60 @@ 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] + flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9] include: - # Node 10 - - flavor: 1 - node: 10 - nodeFlag: 10 - 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 + - flavor: 1 node: 12.15 nodeFlag: 12_15 typescript: latest typescriptFlag: latest # Node 12 - - flavor: 3 + - flavor: 2 node: 12 nodeFlag: 12 typescript: latest typescriptFlag: latest # 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 + - flavor: 3 node: 14.13.0 nodeFlag: 14_13_0 typescript: latest typescriptFlag: latest # Node 14 - - flavor: 5 + - flavor: 4 node: 14 nodeFlag: 14 typescript: latest typescriptFlag: latest - - flavor: 6 + - flavor: 5 node: 14 nodeFlag: 14 typescript: 2.7 typescriptFlag: 2_7 - - flavor: 7 + - flavor: 6 node: 14 nodeFlag: 14 typescript: next typescriptFlag: next # Node 15 - - flavor: 8 - node: 15 - nodeFlag: 15 + - flavor: 7 + node: 16 + nodeFlag: 16 typescript: latest typescriptFlag: latest downgradeNpm: true - - flavor: 9 - node: 15 - nodeFlag: 15 + - flavor: 8 + node: 16 + nodeFlag: 16 typescript: 2.7 typescriptFlag: 2_7 downgradeNpm: true - - flavor: 10 - node: 15 - nodeFlag: 15 + - flavor: 9 + node: 16 + nodeFlag: 16 typescript: next typescriptFlag: next downgradeNpm: true diff --git a/package.json b/package.json index cd8bbcaf..b923d645 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "prepare": "npm run clean && npm run build-nopack" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" }, "repository": { "type": "git", From 6084866b8041f838b17bd86158962f2fdf63cc14 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 15 May 2021 17:53:49 -0400 Subject: [PATCH 114/297] Add @tsconfig/node16 (#1313) * Add @tsconfig/node16; remove @tsconfig/node10 * fix tests * Re-add node10 config because ts2.7 can't handle node12 config * Fix * fix packagelock --- node16/tsconfig.json | 3 +++ package-lock.json | 5 +++++ package.json | 7 +++++-- src/test/index.spec.ts | 7 +++++-- src/tsconfigs.ts | 4 ++++ tests/package.json | 4 ++-- tests/tsconfig-bases/node16/tsconfig.json | 3 +++ 7 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 node16/tsconfig.json create mode 100644 tests/tsconfig-bases/node16/tsconfig.json diff --git a/node16/tsconfig.json b/node16/tsconfig.json new file mode 100644 index 00000000..e9c0bafe --- /dev/null +++ b/node16/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@tsconfig/node16/tsconfig.json" +} diff --git a/package-lock.json b/package-lock.json index fdc6430b..02b9605b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -520,6 +520,11 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz", "integrity": "sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==" }, + "@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==" + }, "@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 b923d645..e8c5494d 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "./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" + "./node14/tsconfig.json": "./node14/tsconfig.json", + "./node16/tsconfig.json": "./node16/tsconfig.json" }, "types": "dist/index.d.ts", "bin": { @@ -49,7 +50,8 @@ "/tsconfig.schemastore-schema.json", "/node10/", "/node12/", - "/node14/" + "/node14/", + "/node16/" ], "scripts": { "lint": "prettier --check .", @@ -156,6 +158,7 @@ "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", diff --git a/src/test/index.spec.ts b/src/test/index.spec.ts index 4eb6fa21..4d66f41a 100644 --- a/src/test/index.spec.ts +++ b/src/test/index.spec.ts @@ -133,6 +133,7 @@ test.suite('ts-node', (test) => { 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/node16/tsconfig.json'); }); test.suite('cli', (test) => { @@ -683,7 +684,8 @@ test.suite('ts-node', (test) => { 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) => { + test('implicitly uses @tsconfig/node14 or @tsconfig/node16 compilerOptions when both TS and node versions support it', async (t) => { + // node14 and node16 configs are identical, hence the "or" const { context: { tempDir }, } = t; @@ -708,7 +710,7 @@ test.suite('ts-node', (test) => { 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 ({ + test('implicitly uses @tsconfig/* lower than node14 (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`, { @@ -778,6 +780,7 @@ test.suite('ts-node', (test) => { 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(`ts-node/node16/tsconfig.json`, macro, 'node16'); } ); } diff --git a/src/tsconfigs.ts b/src/tsconfigs.ts index f984f6c1..74a92744 100644 --- a/src/tsconfigs.ts +++ b/src/tsconfigs.ts @@ -8,6 +8,10 @@ const nodeMajor = parseInt(process.versions.node.split('.')[0], 10); */ export function getDefaultTsconfigJsonForNodeVersion(ts: TSCommon): any { const tsInternal = (ts as any) as TSInternal; + if (nodeMajor >= 16) { + const config = require('@tsconfig/node16/tsconfig.json'); + if (configCompatible(config)) return config; + } if (nodeMajor >= 14) { const config = require('@tsconfig/node14/tsconfig.json'); if (configCompatible(config)) return config; diff --git a/tests/package.json b/tests/package.json index 2c03119b..1b91c8b5 100644 --- a/tests/package.json +++ b/tests/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "ts-node": "file:ts-node-packed.tgz", - "@swc/core": "latest" + "@swc/core": "latest", + "ts-node": "file:ts-node-packed.tgz" } } diff --git a/tests/tsconfig-bases/node16/tsconfig.json b/tests/tsconfig-bases/node16/tsconfig.json new file mode 100644 index 00000000..96b21f73 --- /dev/null +++ b/tests/tsconfig-bases/node16/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "ts-node/node16/tsconfig.json" +} From 907f7bbe11a9aea3b8f189449d9b1c20c25b9f18 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sat, 15 May 2021 18:24:29 -0400 Subject: [PATCH 115/297] Website updates for v10 release (#1297) --- .github/ISSUE_TEMPLATE/config.yml | 4 +- CONTRIBUTING.md | 52 + package-lock.json | 734 +- package.json | 2 + src/index.ts | 12 +- website/docs/compilers.md | 22 + website/docs/configuration.md | 101 +- website/docs/errors.md | 32 - website/docs/getting-started.md | 153 - website/docs/how-it-works.md | 18 +- website/docs/imports.md | 62 +- website/docs/installation.md | 18 + website/docs/integrations.md | 62 - website/docs/options-table.md | 196 + website/docs/options.md | 56 + website/docs/overview.md | 26 + website/docs/paths.md | 26 + website/docs/performance.md | 21 + website/docs/recipes/ava.md | 42 + website/docs/recipes/gulp.md | 12 + website/docs/recipes/intellij.md | 7 + website/docs/recipes/mocha.md | 37 + website/docs/recipes/other.md | 17 + website/docs/recipes/tape.md | 7 + website/docs/recipes/visual-studio-code.md | 22 + .../docs/recipes/watching-and-restarting.md | 7 + website/docs/shebang.md | 3 - website/docs/transpilers.md | 47 + website/docs/troubleshooting.md | 84 + website/docs/types.md | 57 + website/docs/usage.md | 55 + website/docusaurus.config.js | 113 +- website/package.json | 18 +- website/readme-sources/license.md | 9 + website/readme-sources/prefix.md | 32 + website/scripts/build-readme.mjs | 156 + website/sidebars.js | 53 +- website/src/pages/index.js | 11 +- website/static/img/logo.svg | 181 +- website/static/img/opengraph.png | Bin 0 -> 29625 bytes website/static/img/screenshot.png | Bin 23 -> 92219 bytes website/yarn.lock | 6264 ++++++++--------- 42 files changed, 5302 insertions(+), 3529 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 website/docs/compilers.md delete mode 100644 website/docs/errors.md delete mode 100644 website/docs/getting-started.md create mode 100644 website/docs/installation.md delete mode 100644 website/docs/integrations.md create mode 100644 website/docs/options-table.md create mode 100644 website/docs/options.md create mode 100644 website/docs/overview.md create mode 100644 website/docs/paths.md create mode 100644 website/docs/performance.md create mode 100644 website/docs/recipes/ava.md create mode 100644 website/docs/recipes/gulp.md create mode 100644 website/docs/recipes/intellij.md create mode 100644 website/docs/recipes/mocha.md create mode 100644 website/docs/recipes/other.md create mode 100644 website/docs/recipes/tape.md create mode 100644 website/docs/recipes/visual-studio-code.md create mode 100644 website/docs/recipes/watching-and-restarting.md delete mode 100644 website/docs/shebang.md create mode 100644 website/docs/transpilers.md create mode 100644 website/docs/troubleshooting.md create mode 100644 website/docs/types.md create mode 100644 website/docs/usage.md create mode 100644 website/readme-sources/license.md create mode 100644 website/readme-sources/prefix.md create mode 100755 website/scripts/build-readme.mjs create mode 100644 website/static/img/opengraph.png mode change 120000 => 100644 website/static/img/screenshot.png diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 2d1771f6..d5649bd6 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -11,8 +11,8 @@ contact_links: - name: "Help! My Types Are Missing!" about: "This is likely a configuration problem. Check our README" - url: "https://github.com/TypeStrong/ts-node/blob/main/README.md#help-my-types-are-missing" + url: "https://typestrong.org/ts-node/docs/types" - 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" + url: "https://typestrong.org/ts-node/docs/troubleshooting" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..84b73b36 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,52 @@ +*This guide is best-effort and will be improved as necessary.* + +## Features, bugfixes, and other code + +We use npm scripts for building, testing, and linting. Read the scripts to become familiar with our build process. The big ones are: + +``` +npm install +npm run build +npm run test +npm run lint-fix +``` + +`npm prepare` is maintained so that anyone can install `ts-node` from git, which is useful for testing experimental branches and unreleased features. + +Source lives in `src` and is compiled to `dist`. Some shim files live outside of `src` so that they can be imported at +certain paths. For example, to allow users to import `ts-node/register`, we have `register/index.js` which is a shim to +compiled code in `dist`. + +`dist-raw` is for larger chunks of code which are not compiled nor linted because they have been copy-pasted from `node`'s source code. + +We publish using `np`: https://npm.im/np + +## Documentation + +Documentation is written in markdown in `website/docs` and rendered into a website by Docusaurus. + +To edit documentation, modify the markdown files in `./website/docs` and the sidebar declaration in `./website/sidebars.js` + +Docs for the latest stable release live in a `docs` branch. The "Edit this page" links on the website link to the `docs` +branch so that the website can be improved in parallel with new feature work. + +Docs changes for unreleased features are merged to `main` in the same PR which implements the feature, adds tests, etc. +When we release a new version, we merge `main` into `docs` and `docs` into `main`, unifying the two. + +```shell +cd ./website +yarn +yarn start +# Will host live website locally +``` + +This site was used to generate the favicon from a high-res PNG export of the SVG. https://realfavicongenerator.net/ + +## Release checklist + +1. Merge `docs` into `main` +2. Rebuild the README (see instructions above, necessary because npmjs.com renders the readme) +3. Publish with `np` +4. Add changelog to the Github Release; match formatting from previous releases +5. Merge `main` into `docs` (this automatically rebuilds the website) +6. If tsconfig schema has changed, send a pull request to schemastore. [Example](https://github.com/SchemaStore/schemastore/pull/1208) diff --git a/package-lock.json b/package-lock.json index 02b9605b..4f638c9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -321,6 +321,16 @@ "path-exists": "^4.0.0" } }, + "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" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -566,6 +576,11 @@ "@types/node": "*" } }, + "@types/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-4vlpCM5KPCL5CfGmTbpjwVKbISRYhduEJvvUWsH5EB7QInhEj94XPZ3ts/9FPiLZFqYO0xoW4ZL8z2AabTGgJA==" + }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -578,6 +593,14 @@ "integrity": "sha512-Zst90IcBX5wnwSu7CAS0vvJkTjTELY4ssKbHiTnGcJgi170uiS8yQDdc3v6S77bRqYQIN1App5a1Pc2lceE5/g==", "dev": true }, + "@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "requires": { + "@types/unist": "*" + } + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -636,6 +659,11 @@ "@types/node": "*" } }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + }, "@yarnpkg/fslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.4.0.tgz", @@ -1083,6 +1111,11 @@ "follow-redirects": "^1.10.0" } }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1380,6 +1413,21 @@ } } }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -1557,6 +1605,11 @@ "mimic-response": "^1.0.0" } }, + "co": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", + "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=" + }, "code-excerpt": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", @@ -1566,6 +1619,11 @@ "convert-to-spaces": "^1.0.1" } }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1727,6 +1785,21 @@ "time-zone": "^1.0.0" } }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "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==" + } + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -1957,6 +2030,11 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "fast-diff": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", @@ -1986,6 +2064,14 @@ "reusify": "^1.0.4" } }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "requires": { + "format": "^0.2.0" + } + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -2050,6 +2136,11 @@ "signal-exit": "^3.0.2" } }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" + }, "fromentries": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", @@ -2111,6 +2202,21 @@ "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true }, + "github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", + "requires": { + "emoji-regex": ">=6.0.0 <=6.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", + "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" + } + } + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -2355,6 +2461,20 @@ "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", "dev": true }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2370,6 +2490,11 @@ "binary-extensions": "^2.0.0" } }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", @@ -2400,6 +2525,11 @@ "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", "dev": true }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, "is-error": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", @@ -2427,6 +2557,11 @@ "is-extglob": "^2.1.1" } }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, "is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -2479,6 +2614,11 @@ "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", "dev": true }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -2656,20 +2796,17 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" } } }, @@ -2812,6 +2949,16 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.iteratee": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz", + "integrity": "sha1-vkF32yiajMw8CZDx2ya1si/BVUw=" + }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2905,6 +3052,68 @@ "blueimp-md5": "^2.10.0" } }, + "mdast-comment-marker": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-1.1.2.tgz", + "integrity": "sha512-vTFXtmbbF3rgnTh3Zl3irso4LtvwUq/jaDvT2D1JqTGAwaipcS7RpTxzi6KjoRqI9n2yuAhzLDAC8xVTF3XYVQ==" + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "requires": { + "micromark-extension-frontmatter": "^0.2.0" + } + }, + "mdast-util-heading-style": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-1.0.6.tgz", + "integrity": "sha512-8ZuuegRqS0KESgjAGW8zTx4tJ3VNIiIaGFNEzFpRSAQBavVc7AvOo9I4g3crcZBfYisHs4seYh0rAVimO6HyOw==" + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "mdast-util-toc": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz", + "integrity": "sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g==", + "requires": { + "@types/mdast": "^3.0.3", + "@types/unist": "^2.0.3", + "extend": "^3.0.2", + "github-slugger": "^1.2.1", + "mdast-util-to-string": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit": "^2.0.0" + } + }, "mem": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz", @@ -2935,6 +3144,23 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "requires": { + "fault": "^1.0.0" + } + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -3504,6 +3730,19 @@ } } }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "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": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -3632,6 +3871,11 @@ "irregular-plurals": "^3.2.0" } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -3840,6 +4084,296 @@ "es6-error": "^4.0.1" } }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-behead": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/remark-behead/-/remark-behead-2.3.3.tgz", + "integrity": "sha512-quY6Of8Bwj4pgrG/Qce6a/sMMzFc0XxbfeYko+mPjOScIB+TKw3T0Y2GUcIEL8+xbQgAnCylkPQNt9haCEWK9w==", + "requires": { + "unist-util-find": "^1.0.1", + "unist-util-find-all-after": "^3.0.1", + "unist-util-find-all-before": "^2.0.5", + "unist-util-find-all-between": "^2.0.0", + "unist-util-visit": "^2.0.3" + } + }, + "remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "requires": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + } + }, + "remark-lint": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-8.0.0.tgz", + "integrity": "sha512-ESI8qJQ/TIRjABDnqoFsTiZntu+FRifZ5fJ77yX63eIDijl/arvmDvT+tAf75/Nm5BFL4R2JFUtkHRGVjzYUsg==", + "requires": { + "remark-message-control": "^6.0.0" + } + }, + "remark-lint-final-newline": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/remark-lint-final-newline/-/remark-lint-final-newline-1.0.5.tgz", + "integrity": "sha512-rfLlW8+Fz2dqnaEgU4JwLA55CQF1T4mfSs/GwkkeUCGPenvEYwSkCN2KO2Gr1dy8qPoOdTFE1rSufLjmeTW5HA==", + "requires": { + "unified-lint-rule": "^1.0.0" + } + }, + "remark-lint-hard-break-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-2.0.1.tgz", + "integrity": "sha512-Qfn/BMQFamHhtbfLrL8Co/dbYJFLRL4PGVXZ5wumkUO5f9FkZC2RsV+MD9lisvGTkJK0ZEJrVVeaPbUIFM0OAw==", + "requires": { + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-list-item-bullet-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-bullet-indent/-/remark-lint-list-item-bullet-indent-3.0.0.tgz", + "integrity": "sha512-X2rleWP8XReC4LXKF7Qi5vYiPJkA4Grx5zxsjHofFrVRz6j0PYOCuz7vsO+ZzMunFMfom6FODnscSWz4zouDVw==", + "requires": { + "pluralize": "^8.0.0", + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-list-item-indent": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-2.0.1.tgz", + "integrity": "sha512-4IKbA9GA14Q9PzKSQI6KEHU/UGO36CSQEjaDIhmb9UOhyhuzz4vWhnSIsxyI73n9nl9GGRAMNUSGzr4pQUFwTA==", + "requires": { + "pluralize": "^8.0.0", + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-no-auto-link-without-protocol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-no-auto-link-without-protocol/-/remark-lint-no-auto-link-without-protocol-2.0.1.tgz", + "integrity": "sha512-TFcXxzucsfBb/5uMqGF1rQA+WJJqm1ZlYQXyvJEXigEZ8EAxsxZGPb/gOQARHl/y0vymAuYxMTaChavPKaBqpQ==", + "requires": { + "mdast-util-to-string": "^1.0.2", + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==" + } + } + }, + "remark-lint-no-blockquote-without-marker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-4.0.0.tgz", + "integrity": "sha512-Y59fMqdygRVFLk1gpx2Qhhaw5IKOR9T38Wf7pjR07bEFBGUNfcoNVIFMd1TCJfCPQxUyJzzSqfZz/KT7KdUuiQ==", + "requires": { + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0", + "vfile-location": "^3.0.0" + } + }, + "remark-lint-no-duplicate-definitions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-2.0.1.tgz", + "integrity": "sha512-XL22benJZB01m+aOse91nsu1IMFqeWJWme9QvoJuxIcBROO1BG1VoqLOkwNcawE/M/0CkvTo5rfx0eMlcnXOIw==", + "requires": { + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-stringify-position": "^2.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-no-heading-content-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-heading-content-indent/-/remark-lint-no-heading-content-indent-3.0.0.tgz", + "integrity": "sha512-yULDoVSIqKylLDfW6mVUbrHlyEWUSFtVFiKc+/BA412xDIhm8HZLUnP+FsuBC0OzbIZ+bO9Txy52WtO3LGnK1A==", + "requires": { + "mdast-util-heading-style": "^1.0.2", + "pluralize": "^8.0.0", + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-no-inline-padding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-inline-padding/-/remark-lint-no-inline-padding-3.0.0.tgz", + "integrity": "sha512-3s9uW3Yux9RFC0xV81MQX3bsYs+UY7nPnRuMxeIxgcVwxQ4E/mTJd9QjXUwBhU9kdPtJ5AalngdmOW2Tgar8Cg==", + "requires": { + "mdast-util-to-string": "^1.0.2", + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-visit": "^2.0.0" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==" + } + } + }, + "remark-lint-no-literal-urls": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-2.0.1.tgz", + "integrity": "sha512-IDdKtWOMuKVQIlb1CnsgBoyoTcXU3LppelDFAIZePbRPySVHklTtuK57kacgU5grc7gPM04bZV96eliGrRU7Iw==", + "requires": { + "mdast-util-to-string": "^1.0.2", + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==" + } + } + }, + "remark-lint-no-shortcut-reference-image": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-2.0.1.tgz", + "integrity": "sha512-2jcZBdnN6ecP7u87gkOVFrvICLXIU5OsdWbo160FvS/2v3qqqwF2e/n/e7D9Jd+KTq1mR1gEVVuTqkWWuh3cig==", + "requires": { + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-no-shortcut-reference-link": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-2.0.1.tgz", + "integrity": "sha512-pTZbslG412rrwwGQkIboA8wpBvcjmGFmvugIA+UQR+GfFysKtJ5OZMPGJ98/9CYWjw9Z5m0/EktplZ5TjFjqwA==", + "requires": { + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-no-undefined-references": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-3.0.0.tgz", + "integrity": "sha512-0hzaJS9GuzSQVOeeNdJr/s66LRQOzp618xuOQPYWHcJdd+SCaRTyWbjMrTM/cCI5L1sYjgurp410NkIBQ32Vqg==", + "requires": { + "collapse-white-space": "^1.0.4", + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.1.0", + "unist-util-visit": "^2.0.0", + "vfile-location": "^3.1.0" + } + }, + "remark-lint-no-unused-definitions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-no-unused-definitions/-/remark-lint-no-unused-definitions-2.0.1.tgz", + "integrity": "sha512-+BMc0BOjc364SvKYLkspmxDch8OaKPbnUGgQBvK0Bmlwy42baR4C9zhwAWBxm0SBy5Z4AyM4G4jKpLXPH40Oxg==", + "requires": { + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-lint-ordered-list-marker-style": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-2.0.1.tgz", + "integrity": "sha512-Cnpw1Dn9CHn+wBjlyf4qhPciiJroFOEGmyfX008sQ8uGoPZsoBVIJx76usnHklojSONbpjEDcJCjnOvfAcWW1A==", + "requires": { + "unified-lint-rule": "^1.0.0", + "unist-util-generated": "^1.1.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "remark-message-control": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-6.0.0.tgz", + "integrity": "sha512-k9bt7BYc3G7YBdmeAhvd3VavrPa/XlKWR3CyHjr4sLO9xJyly8WHHT3Sp+8HPR8lEUv+/sZaffL7IjMLV0f6BA==", + "requires": { + "mdast-comment-marker": "^1.0.0", + "unified-message-control": "^3.0.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-preset-lint-recommended": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-preset-lint-recommended/-/remark-preset-lint-recommended-5.0.0.tgz", + "integrity": "sha512-uu+Ab8JCwMMaKvvB0LOWTWtM3uAvJbKQM/oyWCEJqj7lUVNTKZS575Ro5rKM3Dx7kQjjR1iw0e99bpAYTc5xNA==", + "requires": { + "remark-lint": "^8.0.0", + "remark-lint-final-newline": "^1.0.0", + "remark-lint-hard-break-spaces": "^2.0.0", + "remark-lint-list-item-bullet-indent": "^3.0.0", + "remark-lint-list-item-indent": "^2.0.0", + "remark-lint-no-auto-link-without-protocol": "^2.0.0", + "remark-lint-no-blockquote-without-marker": "^4.0.0", + "remark-lint-no-duplicate-definitions": "^2.0.0", + "remark-lint-no-heading-content-indent": "^3.0.0", + "remark-lint-no-inline-padding": "^3.0.0", + "remark-lint-no-literal-urls": "^2.0.0", + "remark-lint-no-shortcut-reference-image": "^2.0.0", + "remark-lint-no-shortcut-reference-link": "^2.0.0", + "remark-lint-no-undefined-references": "^3.0.0", + "remark-lint-no-unused-definitions": "^2.0.0", + "remark-lint-ordered-list-marker-style": "^2.0.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, + "remark-toc": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-7.2.0.tgz", + "integrity": "sha512-ppHepvpbg7j5kPFmU5rzDC4k2GTcPDvWcxXyr/7BZzO1cBSPk0stKtEJdsgAyw2WHKPGxadcHIZRjb2/sHxjkg==", + "requires": { + "@types/unist": "^2.0.3", + "mdast-util-toc": "^5.0.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4075,6 +4609,11 @@ } } }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4330,6 +4869,11 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -4493,6 +5037,36 @@ "dev": true, "optional": true }, + "unified": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", + "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", + "requires": { + "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-lint-rule": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-1.0.6.tgz", + "integrity": "sha512-YPK15YBFwnsVorDFG/u0cVVQN5G2a3V8zv5/N6KN3TCG+ajKtaALcy7u14DCSrJI+gZeyYquFL9cioJXOGXSvg==", + "requires": { + "wrapped": "^1.0.1" + } + }, + "unified-message-control": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-3.0.3.tgz", + "integrity": "sha512-oY5z2n8ugjpNHXOmcgrw0pQeJzavHS0VjPBP21tOcm7rc2C+5Q+kW9j5+gqtf8vfW/8sabbsK5+P+9QPwwEHDA==", + "requires": { + "unist-util-visit": "^2.0.0", + "vfile-location": "^3.0.0" + } + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -4502,6 +5076,105 @@ "crypto-random-string": "^2.0.0" } }, + "unist-util-find": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find/-/unist-util-find-1.0.2.tgz", + "integrity": "sha512-ft06UDYzqi9o9RmGP0sZWI/zvLLQiBW2/MD+rW6mDqbOWDcmknGX9orQPspfuGRYWr8eSJAmfsBcvOpfGRJseA==", + "requires": { + "lodash.iteratee": "^4.5.0", + "unist-util-visit": "^1.1.0" + }, + "dependencies": { + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + } + } + }, + "unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-find-all-before": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/unist-util-find-all-before/-/unist-util-find-all-before-2.0.5.tgz", + "integrity": "sha512-lYakZyw3trON5qbsOsmtRARZTyKcQN8pkoMKLy558Nt8WhlqGAnRSD9qLrISkMKbS+0nhj8LiebgoheUtQXOZw==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-find-all-between": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-find-all-between/-/unist-util-find-all-between-2.1.0.tgz", + "integrity": "sha512-OCCUtDD8UHKeODw3TPXyFDxPCbpgBzbGTTaDpR68nvxkwiVcawBqMVrokfBMvUi7ij2F5q7S4s4Jq5dvkcBt+w==", + "requires": { + "unist-util-find": "^1.0.1", + "unist-util-is": "^4.0.2" + } + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -4648,6 +5321,31 @@ "spdx-expression-parse": "^3.0.0" } }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, "vscode-textmate": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", @@ -4769,6 +5467,15 @@ } } }, + "wrapped": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrapped/-/wrapped-1.0.1.tgz", + "integrity": "sha1-x4PZ2Aeyc+mwHoUWgKk4yHyQckI=", + "requires": { + "co": "3.1.0", + "sliced": "^1.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4809,6 +5516,11 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A=" + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" } } } diff --git a/package.json b/package.json index e8c5494d..406d2b4b 100644 --- a/package.json +++ b/package.json @@ -159,9 +159,11 @@ "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.1", + "@types/js-yaml": "^4.0.0", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", + "js-yaml": "^4.0.0", "make-error": "^1.1.1", "source-map-support": "^0.5.17", "yn": "3.1.1" diff --git a/src/index.ts b/src/index.ts index 550940b7..e8d44384 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,6 +14,14 @@ import type { TSCommon, TSInternal } from './ts-compiler-types'; export { TSCommon }; export { createRepl, CreateReplOptions, ReplService } from './repl'; +export type { + TranspilerModule, + TranspilerFactory, + CreateTranspilerOptions, + TranspileOutput, + TranspileOptions, + Transpiler, +} from './transpilers/types'; /** * Does this version of node obey the package.json "type" field @@ -110,10 +118,6 @@ const debugFn = shouldDebug } : (_: string, fn: (arg: T) => U) => fn; -export interface TSCompilerFactory { - createTypescriptCompiler(options?: any): TSCommon; -} - /** * Export the current version. */ diff --git a/website/docs/compilers.md b/website/docs/compilers.md new file mode 100644 index 00000000..6b96a621 --- /dev/null +++ b/website/docs/compilers.md @@ -0,0 +1,22 @@ +--- +title: Third-party compilers +--- + +Some projects require a patched typescript compiler which adds additional features. For example, [`ttypescript`](https://github.com/cevek/ttypescript/tree/master/packages/ttypescript) and [`ts-patch`](https://github.com/nonara/ts-patch#readme) +add the ability to configure custom transformers. These are drop-in replacements for the vanilla `typescript` module and +implement the same API. + +For example, to use `ts-patch` and `ts-transformer-keys`, add this to your `tsconfig.json`: + +```json title="tsconfig.json" +{ + "ts-node": { + "compiler": "ts-patch" + }, + "compilerOptions": { + "plugins": [ + { "transform": "ts-transformer-keys/transformer" } + ] + } +} +``` diff --git a/website/docs/configuration.md b/website/docs/configuration.md index 85c1b20b..ad999832 100644 --- a/website/docs/configuration.md +++ b/website/docs/configuration.md @@ -2,96 +2,85 @@ title: Configuration --- -You can set options by passing them before the script path, via programmatic usage, via `tsconfig.json`, or via environment variables. +`ts-node` supports a variety of options which can be specified via `tsconfig.json`, as CLI flags, as environment variables, or programmatically. + +For a complete list, see [Options](./options.md). + +## CLI flags + +`ts-node` CLI flags must come *before* the entrypoint script. For example: ```shell -ts-node --compiler ntypescript --project src/tsconfig.json hello-world.ts +$ ts-node --project tsconfig-dev.json say-hello.ts Ronald +Hello, Ronald! ``` -**Note:** [`ntypescript`](https://github.com/TypeStrong/ntypescript#readme) is an example of a TypeScript-compatible `compiler`. +## Via tsconfig.json (recommended) +`ts-node` automatically finds and loads `tsconfig.json`. Most `ts-node` options can be specified in a `"ts-node"` object using their programmatic, camelCase names. We recommend this because it works even when you cannot pass CLI flags, such as `node --require ts-node/register` and when using shebangs. -## Options via tsconfig.json (recommended) +Use `--skip-project` to skip loading the `tsconfig.json`. Use `--project` to explicitly specify the path to a `tsconfig.json`. -`ts-node` loads `tsconfig.json` automatically. Use this recommended configuration as a starting point. +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 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()`. + +You can use this sample configuration as a starting point: ```json title="tsconfig.json" { + // This is an alias to @tsconfig/node12: https://github.com/tsconfig/bases + "extends": "ts-node/node12/tsconfig.json", + + // Most ts-node options can be specified here using their programmatic names. "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 + // It is faster to skip typechecking. + // Remove if you want ts-node to do typechecking. + "transpileOnly": true, + "files": true, + "compilerOptions": { - // typescript compilerOptions specified here will override those declared below, but *only* in ts-node + // compilerOptions specified here will override those declared below, + // but *only* in ts-node. Useful if you want ts-node and tsc to use + // different options with a single tsconfig.json. } }, - "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 + // typescript options here } } ``` -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` +### @tsconfig/bases -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`. +[@tsconfig/bases](https://github.com/tsconfig/bases) maintains recommended configurations for several node versions. +As a convenience, these are bundled with `ts-node`. -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` +```json title="tsconfig.json" +{ + "extends": "ts-node/node16/tsconfig.json", -## CLI and Programmatic Options + // Or install directly with `npm i -D @tsconfig/node16` + "extends": "@tsconfig/node16/tsconfig.json", +} +``` -_The name of the environment variable and the option's default value are denoted in parentheses._ +### Default config -* `-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`) +If no `tsconfig.json` is loaded from disk, `ts-node` will use the newest recommended defaults from +[@tsconfig/bases](https://github.com/tsconfig/bases/) compatible with your `node` and `typescript` versions. +With the latest `node` and `typescript`, this is [`@tsconfig/node16`](https://github.com/tsconfig/bases/blob/master/bases/node16.json). -## Programmatic-only Options +Older versions of `typescript` are incompatible with `@tsconfig/node16`. In those cases we will use an older default configuration. -* `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 +When in doubt, `ts-node --show-config` will log the configuration being used, and `ts-node -vv` will log `node` and `typescript` versions. ## `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`. +We recommend using the [`NODE_OPTIONS`](https://nodejs.org/api/cli.html#cli_node_options_options) environment variable to pass options to `node`. ```shell NODE_OPTIONS='--trace-deprecation --abort-on-uncaught-exception' ts-node ./index.ts diff --git a/website/docs/errors.md b/website/docs/errors.md deleted file mode 100644 index 0d3b4c08..00000000 --- a/website/docs/errors.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -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 deleted file mode 100644 index 91267c60..00000000 --- a/website/docs/getting-started.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -# 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/main/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 index c6ad0337..28dec08a 100644 --- a/website/docs/how-it-works.md +++ b/website/docs/how-it-works.md @@ -2,13 +2,23 @@ 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. +`ts-node` works by registering hooks for `.ts`, `.tsx`, `.js`, and/or `.jsx` 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: +Vanilla `node` loads `.js` by reading code from disk and executing it. Our hook runs in the middle, transforming code from TypeScript to JavaScript and passing the result to `node` for execution. This transformation will respect your `tsconfig.json` as if you had compiled via `tsc`. + +`.js` and `.jsx` are only transformed when [`allowJs`](https://www.typescriptlang.org/docs/handbook/compiler-options.html#compiler-options) is enabled. + +`.tsx` and `.jsx` are only transformed when [`jsx`](https://www.typescriptlang.org/docs/handbook/jsx.html) is enabled. + +> **Warning:** if a file is ignored or its file extension is not registered, node will either fail to resolve the file or will attempt to execute it as JavaScript without any transformation. This may cause syntax errors or other failures, because node does not understand TypeScript type syntax nor bleeding-edge ECMAScript features. + +> **Warning:** When `ts-node` is used with `allowJs`, all non-ignored JavaScript files are transformed using the TypeScript compiler. + +## Skipping `node_modules` + +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 index b1a010ca..2fa3bf34 100644 --- a/website/docs/imports.md +++ b/website/docs/imports.md @@ -1,14 +1,30 @@ --- -title: "Imports: CommonJS vs native modules" +title: "CommonJS vs native ECMAScript 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. +TypeScript is almost always written using modern `import` syntax, but you can choose to either transform to CommonJS or use node's native ESM support. Configuration is different for each. -### CommonJS (recommended) +Here is a brief comparison of the two. -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"`. +| CommonJS | Native ECMAScript modules | +|---|---| +| Write native `import` syntax | Write native `import` syntax | +| Transforms `import` into `require()` | Does not transform `import` | +| Node executes scripts using the classic [CommonJS loader](https://nodejs.org/dist/latest-v16.x/docs/api/modules.html) | Node executes scripts using the new [ESM loader](https://nodejs.org/dist/latest-v16.x/docs/api/esm.html) | +| Use any of:
`ts-node` CLI
`node -r ts-node/register`
`NODE_OPTIONS="ts-node/register" node`
`require('ts-node').register({/* options */})` | Must use the ESM loader via:
`node --loader ts-node/esm`
`NODE_OPTIONS="--loader ts-node/esm" node` | +## CommonJS + +Transforming to CommonJS is typically simpler and more widely supported because it is older. You must remove or set [`"type": "commonjs"`](https://nodejs.org/api/packages.html#packages_type) in `package.json` and [`"module": "CommonJS"`](https://www.typescriptlang.org/tsconfig/#module) in `tsconfig.json`. + +```json title="package.json" +{ + // This can be omitted; commonjs is the default + "type": "commonjs" +} ``` + +```json title="tsconfig.json" { "compilerOptions": { "module": "CommonJS" @@ -16,8 +32,40 @@ We recommend compiling to CommonJS. To do this, you must set `"module": "Common } ``` -### Native ECMAScript modules +If you must keep `"module": "ESNext"` for `tsc`, webpack, or another build tool, you can set an override for `ts-node`. + +```json title="tsconfig.json" +{ + "compilerOptions": { + "module": "ESNext" + }, + "ts-node": { + "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. +[Node's ESM loader hooks](https://nodejs.org/api/esm.html#esm_experimental_loaders) are [**experimental**](https://nodejs.org/api/documentation.html#documentation_stability_index) and subject to change. `ts-node`'s ESM support is also experimental. They may have +breaking changes in minor and patch releases and are not recommended for production. -For usage, limitations, and to provide feedback, see [#1007](https://github.com/TypeStrong/ts-node/issues/1007). +For complete usage, limitations, and to provide feedback, see [#1007](https://github.com/TypeStrong/ts-node/issues/1007). + +You must set [`"type": "module"`](https://nodejs.org/api/packages.html#packages_type) in `package.json` and [`"module": "ESNext"`](https://www.typescriptlang.org/tsconfig/#module) in `tsconfig.json`. + +```json title="package.json" +{ + "type": "module" +} +``` + +```json title="tsconfig.json" +{ + "compilerOptions": { + "module": "ESNext" // or ES2015, ES2020 + } +} +``` diff --git a/website/docs/installation.md b/website/docs/installation.md new file mode 100644 index 00000000..4b22d54d --- /dev/null +++ b/website/docs/installation.md @@ -0,0 +1,18 @@ +--- +title: Installation +--- + +```shell +# 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 + +# Depending on configuration, you may also need these +npm install -D tslib @types/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. diff --git a/website/docs/integrations.md b/website/docs/integrations.md deleted file mode 100644 index 37a230c5..00000000 --- a/website/docs/integrations.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -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/options-table.md b/website/docs/options-table.md new file mode 100644 index 00000000..4be37a6e --- /dev/null +++ b/website/docs/options-table.md @@ -0,0 +1,196 @@ +--- +title: 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). + + + +The API includes [additional options](https://typestrong.org/ts-node/api/interfaces/registeroptions.html) not shown below. + +_Environment variables, where available, are in `ALL_CAPS`_ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CLITSConfigDescription
Shell
-h, --help Prints the help text
-v, --version Prints the version. -vv prints node and typescript compiler versions, too
-e, --eval Evaluate code
-p, --print Print result of --eval
-i, --interactive Opens the REPL even if stdin does not appear to be a terminal
TSConfig
-P, --project [path] Path to TypeScript JSON project file
Env: TS_NODE_PROJECT
--skip-project Skip project config resolution and loading
Default: false
Env: TS_NODE_SKIP_PROJECT
-c, --cwd-mode Resolve config relative to the current directory instead of the directory of the entrypoint script
-O, --compiler-options [opts] compilerOptions JSON object to merge with compiler options
Env: TS_NODE_COMPILER_OPTIONS
--show-config Print resolved tsconfig.json, including ts-node options, and exit
Typechecking
-T, --transpile-only transpileOnly Use TypeScript's faster transpileModule
Default: false
Env: TS_NODE_TRANSPILE_ONLY
--type-check Opposite of --transpile-only
Default: true
Env: TS_NODE_TYPE_CHECK
-H, --compiler-host compilerHost Use TypeScript's compiler host API
Default: false
Env: TS_NODE_COMPILER_HOST
--files files Load files, include and exclude from tsconfig.json on startup
Default: false
Env: TS_NODE_FILES
-D, --ignore-diagnostics [code] ignoreDiagnostics Ignore TypeScript warnings by diagnostic code
Env: TS_NODE_IGNORE_DIAGNOSTICS
Transpilation
-I, --ignore [pattern] ignore Override the path patterns to skip compilation
Default: /node_modules/
Env: TS_NODE_IGNORE
--skip-ignore skipIgnore Skip ignore checks
Default: false
Env: TS_NODE_SKIP_IGNORE
-C, --compiler [name] compiler Specify a custom TypeScript compiler
Default: typescript
Env: TS_NODE_COMPILER
--transpiler [name] transpiler Specify a third-party, non-typechecking transpiler
--prefer-ts-exts preferTsExts Re-order file extensions so that TypeScript imports are preferred
Default: false
Env: TS_NODE_PREFER_TS_EXTS
Diagnostics
--log-error logError Logs TypeScript errors to stderr instead of throwing exceptions
Default: false
Env: TS_NODE_LOG_ERROR
--pretty pretty Use pretty diagnostic formatter
Default: false
Env: TS_NODE_PRETTY
Enable debug logging
Env: TS_NODE_DEBUG
Advanced
-r, --require [path] require Require a node module before execution
--cwd Behave as if invoked in this working directory
Default: process.cwd()
Env: TS_NODE_CWD
--emit emit Emit output files into .ts-node directory
Default: false
Env: TS_NODE_EMIT
Path to history file for REPL
Default: ~/.ts_node_repl_history
Env: TS_NODE_HISTORY
diff --git a/website/docs/options.md b/website/docs/options.md new file mode 100644 index 00000000..a8e0eaee --- /dev/null +++ b/website/docs/options.md @@ -0,0 +1,56 @@ +--- +title: 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). + +_Environment variables, where available, are in `ALL_CAPS`_ + +## Shell + +- `-h, --help` Prints the help text +- `-v, --version` Prints the version. `-vv` prints node and typescript compiler versions, too +- `-e, --eval` Evaluate code +- `-p, --print` Print result of `--eval` +- `-i, --interactive` Opens the REPL even if stdin does not appear to be a terminal + +## TSConfig + +- `-P, --project [path]` Path to TypeScript JSON project file
*Environment:* `TS_NODE_PROJECT` +- `--skip-project` Skip project config resolution and loading
*Default:* `false`
*Environment:* `TS_NODE_SKIP_PROJECT` +- `-c, --cwd-mode` Resolve config relative to the current directory instead of the directory of the entrypoint script +- `-O, --compiler-options [opts]` JSON object to merge with compiler options
*Environment:* `TS_NODE_COMPILER_OPTIONS` +- `--show-config` Print resolved `tsconfig.json`, including `ts-node` options, and exit + +## Typechecking + +- `-T, --transpile-only` Use TypeScript's faster `transpileModule`
*Default:* `false`
*Environment:* `TS_NODE_TRANSPILE_ONLY` +- `--type-check` Opposite of `--transpile-only`
*Default:* `true`
*Environment:* `TS_NODE_TYPE_CHECK` +- `-H, --compiler-host` Use TypeScript's compiler host API
*Default:* `false`
*Environment:* `TS_NODE_COMPILER_HOST` +- `--files` Load `files`, `include` and `exclude` from `tsconfig.json` on startup
*Default:* `false`
*Environment:* `TS_NODE_FILES` +- `-D, --ignore-diagnostics [code]` Ignore TypeScript warnings by diagnostic code
*Environment:* `TS_NODE_IGNORE_DIAGNOSTICS` + +## Transpilation + +- `-I, --ignore [pattern]` Override the path patterns to skip compilation
*Default:* `/node_modules/`
*Environment:* `TS_NODE_IGNORE` +- `--skip-ignore` Skip ignore checks
*Default:* `false`
*Environment:* `TS_NODE_SKIP_IGNORE` +- `-C, --compiler [name]` Specify a custom TypeScript compiler
*Default:* `typescript`
*Environment:* `TS_NODE_COMPILER` +- `--transpiler [name]` Specify a third-party, non-typechecking transpiler +- `--prefer-ts-exts` Re-order file extensions so that TypeScript imports are preferred
*Default:* `false`
*Environment:* `TS_NODE_PREFER_TS_EXTS` + +## Diagnostics + +- `--log-error` Logs TypeScript errors to stderr instead of throwing exceptions
*Default:* `false`
*Environment:* `TS_NODE_LOG_ERROR` +- `--pretty` Use pretty diagnostic formatter
*Default:* `false`
*Environment:* `TS_NODE_PRETTY` +- `TS_NODE_DEBUG` Enable debug logging
+ +## Advanced + +- `-r, --require [path]` Require a node module before execution +- `--cwd` Behave as if invoked in this working directory
*Default:* `process.cwd()`
*Environment:* `TS_NODE_CWD` +- `--emit` Emit output files into `.ts-node` directory
*Default:* `false`
*Environment:* `TS_NODE_EMIT` +- `TS_NODE_HISTORY` Path to history file for REPL
*Default:* `~/.ts_node_repl_history`
+ +## API + +The API includes [additional options](https://typestrong.org/ts-node/api/interfaces/registeroptions.html) not shown here. diff --git a/website/docs/overview.md b/website/docs/overview.md new file mode 100644 index 00000000..9835306f --- /dev/null +++ b/website/docs/overview.md @@ -0,0 +1,26 @@ +--- +title: Overview +slug: / +--- + +`ts-node` is a TypeScript execution engine and REPL for Node.js. + +It JIT transforms TypeScript into JavaScript, enabling you to directly execute TypeScript on Node.js without precompiling. +This is accomplished by hooking node's module loading APIs, enabling it to be used seamlessly alongside other Node.js +tools and libraries. + +## Features + +* Automatic sourcemaps in stack traces +* Automatic `tsconfig.json` parsing +* Automatic defaults to match your node version +* Typechecking (optional) +* REPL +* Write standalone scripts +* Native ESM loader +* Use third-party transpilers +* Use custom transformers +* Integrate with test runners, debuggers, and CLI tools +* Compatible with pre-compilation for production + +![TypeScript REPL](/img/screenshot.png) diff --git a/website/docs/paths.md b/website/docs/paths.md new file mode 100644 index 00000000..6bc60fec --- /dev/null +++ b/website/docs/paths.md @@ -0,0 +1,26 @@ +--- +title: | + paths and baseUrl +--- + +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`. + +```json title="tsconfig.json" +{ + "ts-node": { + // Do not forget to `npm i -D tsconfig-paths` + "require": ["tsconfig-paths/register"] + } +} +``` + +## Why is this not built-in to `ts-node`? + +The official TypeScript Handbook explains the intended purpose for `"paths"` in ["Additional module resolution flags"](https://www.typescriptlang.org/docs/handbook/module-resolution.html#additional-module-resolution-flags). + +> The TypeScript compiler has a set of additional flags to *inform* the compiler of transformations that are expected to happen to the sources to generate the final output. +> +> It is important to note that the compiler will not perform any of these transformations; it just uses these pieces of information to guide the process of resolving a module import to its definition file. + +This means `"paths"` are intended to describe mappings that the build tool or runtime *already* performs, not to tell the build tool or +runtime how to resolve modules. In other words, they intend us to write our imports in a way `node` already understands. For this reason, `ts-node` does not modify `node`'s module resolution behavior to implement `"paths"` mappings. diff --git a/website/docs/performance.md b/website/docs/performance.md new file mode 100644 index 00000000..625e1cd9 --- /dev/null +++ b/website/docs/performance.md @@ -0,0 +1,21 @@ +--- +title: Make it fast +--- + +These tricks will make `ts-node` faster. + +## Skip typechecking + +It is often better to use `tsc --noEmit` to typecheck once before your tests run or as a lint step. In these cases, `ts-node` can skip typechecking. + +* Enable [`transpileOnly`](./options.md) to skip typechecking +* Use our [`swc` integration](./transpilers.md#bundled-swc-integration) + * This is by far the fastest option + +## With typechecking + +* Avoid dynamic `require()` which may trigger repeated typechecking; prefer `import` +* Try with and without `--files`; one may be faster depending on your project +* Check `tsc --showConfig`; make sure all executed files are included +* Enable [`skipLibCheck`](https://www.typescriptlang.org/tsconfig#skipLibCheck) +* Set a [`types`](https://www.typescriptlang.org/tsconfig#types) array to avoid loading unnecessary `@types` diff --git a/website/docs/recipes/ava.md b/website/docs/recipes/ava.md new file mode 100644 index 00000000..945008ec --- /dev/null +++ b/website/docs/recipes/ava.md @@ -0,0 +1,42 @@ +--- +title: AVA +--- + +Assuming you are configuring AVA via your `package.json`, add one of the following configurations. + +## CommonJS + +Use this configuration if your `package.json` does not have `"type": "module"`. + +```json title"package.json" +{ + "ava": { + "extensions": [ + "ts" + ], + "require": [ + "ts-node/register" + ] + } +} +``` + +## Native ECMAScript modules + +This configuration is necessary if your `package.json` has `"type": "module"`. + +```json title"package.json" +{ + "ava": { + "extensions": { + "ts": "module" + }, + "nonSemVerExperiments": { + "configurableModuleFormat": true + }, + "nodeArguments": [ + "--loader=ts-node/esm" + ] + } +} +``` diff --git a/website/docs/recipes/gulp.md b/website/docs/recipes/gulp.md new file mode 100644 index 00000000..31f1b580 --- /dev/null +++ b/website/docs/recipes/gulp.md @@ -0,0 +1,12 @@ +--- +title: Gulp +--- + +ts-node support is built-in to gulp. + +```sh +# Create a `gulpfile.ts` and run `gulp`. +gulp +``` + +See also: https://gulpjs.com/docs/en/getting-started/javascript-and-gulpfiles#transpilation diff --git a/website/docs/recipes/intellij.md b/website/docs/recipes/intellij.md new file mode 100644 index 00000000..1a8879db --- /dev/null +++ b/website/docs/recipes/intellij.md @@ -0,0 +1,7 @@ +--- +title: "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.md), and want to apply this same behavior when launching in IntelliJ, specify under "Environment Variables": `TS_NODE_PROJECT=`. diff --git a/website/docs/recipes/mocha.md b/website/docs/recipes/mocha.md new file mode 100644 index 00000000..9f9c7182 --- /dev/null +++ b/website/docs/recipes/mocha.md @@ -0,0 +1,37 @@ +--- +title: Mocha +--- + +## Mocha 7 and newer + +```shell +mocha --require ts-node/register --extensions ts,tsx --watch --watch-files src 'tests/**/*.{ts,tsx}' [...args] +``` + +Or specify options via your mocha config file. + +```json title=".mocharc.json" +{ + // Specify "require" for CommonJS + "require": "ts-node/register", + // Specify "loader" for native ESM + "loader": "ts-node/esm", + "extensions": ["ts", "tsx"], + "spec": [ + "tests/**/*.spec.*" + ], + "watch-files": [ + "src" + ] +} +``` + +See also: https://mochajs.org/#configuring-mocha-nodejs + +## Mocha <=6 + +```shell +mocha --require ts-node/register --watch-extensions ts,tsx "test/**/*.{ts,tsx}" [...args] +``` + +**Note:** `--watch-extensions` is only used in `--watch` mode. diff --git a/website/docs/recipes/other.md b/website/docs/recipes/other.md new file mode 100644 index 00000000..2f93f853 --- /dev/null +++ b/website/docs/recipes/other.md @@ -0,0 +1,17 @@ +--- +title: Other +--- + +In many cases, setting [`NODE_OPTIONS`](https://nodejs.org/api/cli.html#cli_node_options_options) will enable `ts-node` within other node tools, child processes, and worker threads. + +```shell +NODE_OPTIONS="-r ts-node/register" +``` + +Or, if you require native ESM support: + +```shell +NODE_OPTIONS="--loader ts-node/esm" +``` + +This tells any node processes which receive this environment variable to install `ts-node`'s hooks before executing other code. diff --git a/website/docs/recipes/tape.md b/website/docs/recipes/tape.md new file mode 100644 index 00000000..7280d9dc --- /dev/null +++ b/website/docs/recipes/tape.md @@ -0,0 +1,7 @@ +--- +title: Tape +--- + +```shell +ts-node node_modules/tape/bin/tape [...args] +``` diff --git a/website/docs/recipes/visual-studio-code.md b/website/docs/recipes/visual-studio-code.md new file mode 100644 index 00000000..1d8d44b7 --- /dev/null +++ b/website/docs/recipes/visual-studio-code.md @@ -0,0 +1,22 @@ +--- +title: 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.md), and want to apply this same behavior when launching in VS Code, add an "env" key into the launch configuration: `"env": { "TS_NODE_PROJECT": "" }`. diff --git a/website/docs/recipes/watching-and-restarting.md b/website/docs/recipes/watching-and-restarting.md new file mode 100644 index 00000000..82f0d909 --- /dev/null +++ b/website/docs/recipes/watching-and-restarting.md @@ -0,0 +1,7 @@ +--- +title: 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. diff --git a/website/docs/shebang.md b/website/docs/shebang.md deleted file mode 100644 index fef97202..00000000 --- a/website/docs/shebang.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Shebang ---- diff --git a/website/docs/transpilers.md b/website/docs/transpilers.md new file mode 100644 index 00000000..a3972c59 --- /dev/null +++ b/website/docs/transpilers.md @@ -0,0 +1,47 @@ +--- +title: Third-party transpilers +--- + +In transpile-only mode, we skip typechecking to speed up execution time. You can go a step further and use a +third-party transpiler to transform TypeScript into JavaScript even faster. You will still benefit from +`ts-node`'s automatic `tsconfig.json` discovery, sourcemap support, and global `ts-node` CLI. Integrations +can automatically derive an appropriate configuration from your existing `tsconfig.json` which simplifies project +boilerplate. + +> **What is the difference between a compiler and a transpiler?** +> +> For our purposes, a compiler implements TypeScript's API and can perform typechecking. +> A third-party transpiler does not. Both transform TypeScript into JavaScript. + +## Bundled `swc` integration + +We have bundled an experimental `swc` integration. + +[`swc`](https://swc.rs) is a TypeScript-compatible transpiler implemented in Rust. This makes it an order of magnitude faster +than `transpileModule`. + +To use it, first install `@swc/core` or `@swc/wasm`. If using `importHelpers`, also install `@swc/helpers`. + +```shell +npm i -D @swc/core @swc/helpers +``` + +Then add the following to your `tsconfig.json`. + +```json title="tsconfig.json" +{ + "ts-node": { + "transpileOnly": true, + "transpiler": "ts-node/transpilers/swc-experimental" + } +} +``` + +> `swc` uses `@swc/helpers` instead of `tslib`. If you have enabled `importHelpers`, you must also install `@swc/helpers`. + +## Writing your own integration + +To write your own transpiler integration, check our [API docs](https://typestrong.org/ts-node/api/interfaces/transpilermodule.html). + +Integrations are `require()`d, so they can be published to npm. The module must export a `create` function matching the +[`TranspilerModule`](https://typestrong.org/ts-node/api/interfaces/transpilermodule.html) interface. diff --git a/website/docs/troubleshooting.md b/website/docs/troubleshooting.md new file mode 100644 index 00000000..4ddac691 --- /dev/null +++ b/website/docs/troubleshooting.md @@ -0,0 +1,84 @@ +--- +title: Troubleshooting +--- + +## Understanding configuration + +`ts-node` uses sensible default configurations to reduce boilerplate while still respecting `tsconfig.json` if you +have one. If you are unsure which configuration is used, you can log it with `ts-node --show-config`. This is similar to +`tsc --showConfig` but includes `"ts-node"` options as well. + +`ts-node` also respects your locally-installed `typescript` version, but global installations fallback to the globally-installed +`typescript`. If you are unsure which versions are used, `ts-node -vv` will log them. + +```shell +$ ts-node -vv +ts-node v10.0.0 +node v16.1.0 +compiler v4.2.2 + +$ ts-node --show-config +{ + "compilerOptions": { + "target": "es6", + "lib": [ + "es6", + "dom" + ], + "rootDir": "./src", + "outDir": "./.ts-node", + "module": "commonjs", + "moduleResolution": "node", + "strict": true, + "declaration": false, + "sourceMap": true, + "inlineSources": true, + "types": [ + "node" + ], + "stripInternal": true, + "incremental": true, + "skipLibCheck": true, + "importsNotUsedAsValues": "error", + "inlineSourceMap": false, + "noEmit": false + }, + "ts-node": { + "cwd": "/d/project", + "projectSearchDir": "/d/project", + "require": [], + "project": "/d/project/tsconfig.json" + } +} +``` + +## Understanding 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/types.md b/website/docs/types.md new file mode 100644 index 00000000..168c5c6a --- /dev/null +++ b/website/docs/types.md @@ -0,0 +1,57 @@ +--- +title: "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`. diff --git a/website/docs/usage.md b/website/docs/usage.md new file mode 100644 index 00000000..76048706 --- /dev/null +++ b/website/docs/usage.md @@ -0,0 +1,55 @@ +--- +title: Usage +--- + +## Shell + +```shell +# 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 --transpile-only +ts-node-transpile-only script.ts + +# Equivalent to ts-node --cwd-mode +ts-node-cwd script.ts +``` + +## Shebang + +```typescript +#!/usr/bin/env ts-node + +console.log("Hello, world!") +``` + +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 --files +// This shebang is not portable. It only works on Mac +``` + +Instead, specify all `ts-node` options in your `tsconfig.json`. + +## 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`. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 2e537ac8..ef85c93c 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -9,6 +9,18 @@ module.exports = { organizationName: 'TypeStrong', // Usually your GitHub org/user name. projectName: 'ts-node', // Usually your repo name. themeConfig: { + image: 'img/opengraph.png', + announcementBar: { + id: 'website_wip', // Any value that will identify this message. + content: + 'This website is still under construction. It describes the latest, unreleased changes from our main branch. Until it is ready, official documentation lives in our README', + //backgroundColor: '#fafbfc', // Defaults to `#fff`. + //textColor: '#091E42', // Defaults to `#000`. + //isCloseable: false, // Defaults to `true`. + }, + colorMode: { + respectPrefersColorScheme: true + }, navbar: { title: 'ts-node', logo: { @@ -20,7 +32,7 @@ module.exports = { to: 'docs/', activeBasePath: 'docs', label: 'Docs', - position: 'left', + position: 'right', }, { href: 'https://typestrong.org/ts-node/api/', @@ -28,53 +40,83 @@ module.exports = { position: 'right', }, { - href: 'https://github.com/TypeStrong/ts-node', - label: 'GitHub', + href: 'https://github.com/TypeStrong/ts-node/releases', + label: 'Release Notes', position: 'right', }, - ], - }, - footer: { - style: 'dark', - links: [ { - title: 'Docs', - items: [ - { - label: 'Docs', - to: 'docs/', - } - ], + href: 'https://github.com/TypeStrong/ts-node/discussions', + label: 'Discuss', + position: 'right', }, { - title: 'Community', - items: [ - { - label: 'Discord', - href: 'https://discord.gg/typescript' - }, - { - label: 'Github Discussions', - href: 'https://github.com/TypeStrong/ts-node/discussions' - }, - ], + href: 'https://discord.gg/typescript', + label: 'Chat', + position: 'right', }, { - title: 'More', - items: [ - { - label: 'GitHub', - href: 'https://github.com/TypeStrong/ts-node', - }, - ], + href: 'https://github.com/TypeStrong/ts-node', + label: 'GitHub', + position: 'right', }, ], - // copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, }, + // 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.`, + // }, prism: { // for syntax highlighting // additionalLanguages: ['powershell'], }, + algolia: { + apiKey: 'c882a0a136ef4e15aa99db604280caa6', + indexName: 'ts-node', + + // Optional: see doc section below + // contextualSearch: true, + + // Optional: see doc section below + // appId: 'YOUR_APP_ID', + + // Optional: Algolia search parameters + // searchParameters: {}, + + //... other Algolia params + }, }, presets: [ [ @@ -82,9 +124,8 @@ module.exports = { { docs: { sidebarPath: require.resolve('./sidebars.js'), - // Please change this to your repo. editUrl: - 'https://github.com/TypeStrong/ts-node/edit/main/website/', + 'https://github.com/TypeStrong/ts-node/edit/docs/website/', }, // blog: { // showReadingTime: true, diff --git a/website/package.json b/website/package.json index 13401da1..2fd5884e 100644 --- a/website/package.json +++ b/website/package.json @@ -9,15 +9,25 @@ "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "serve": "docusaurus serve", - "clear": "docusaurus clear" + "clear": "docusaurus clear", + "build-readme": "./scripts/build-readme.mjs" }, "dependencies": { - "@docusaurus/core": "2.0.0-alpha.70", - "@docusaurus/preset-classic": "2.0.0-alpha.70", + "@docusaurus/core": "2.0.0-alpha.75", + "@docusaurus/preset-classic": "2.0.0-alpha.75", + "@docusaurus/theme-search-algolia": "^2.0.0-alpha.75", "@mdx-js/react": "^1.6.21", "clsx": "^1.1.1", "react": "^16.8.4", - "react-dom": "^16.8.4" + "react-dom": "^16.8.4", + "remark": "^13.0.0", + "remark-behead": "^2.3.3", + "remark-frontmatter": "^3.0.0", + "remark-preset-lint-recommended": "^5.0.0", + "remark-toc": "^7.2.0", + "remark-validate-links": "^10.0.4", + "vfile": "^4.2.1", + "vfile-reporter": "^6.0.2" }, "browserslist": { "production": [ diff --git a/website/readme-sources/license.md b/website/readme-sources/license.md new file mode 100644 index 00000000..922e4fd9 --- /dev/null +++ b/website/readme-sources/license.md @@ -0,0 +1,9 @@ +--- +title: License +--- + +[MIT](https://github.com/TypeStrong/ts-node/blob/main/LICENSE) + +ts-node includes source code from Node.js which is licensed under the MIT license. [Node.js license information](https://raw.githubusercontent.com/nodejs/node/master/LICENSE) + +ts-node includes source code from the TypeScript compiler which is licensed under the Apache License 2.0. [TypeScript license information](https://github.com/microsoft/TypeScript/blob/master/LICENSE.txt) diff --git a/website/readme-sources/prefix.md b/website/readme-sources/prefix.md new file mode 100644 index 00000000..2b5fe41a --- /dev/null +++ b/website/readme-sources/prefix.md @@ -0,0 +1,32 @@ +--- +omitHeaderOnMerge: true +--- + + + +# ![TypeScript Node](logo.svg?sanitize=true) + +[![NPM version](https://img.shields.io/npm/v/ts-node.svg?style=flat)](https://npmjs.org/package/ts-node) +[![NPM downloads](https://img.shields.io/npm/dm/ts-node.svg?style=flat)](https://npmjs.org/package/ts-node) +[![Build status](https://img.shields.io/github/workflow/status/TypeStrong/ts-node/Continuous%20Integration)](https://github.com/TypeStrong/ts-node/actions?query=workflow%3A%22Continuous+Integration%22) +[![Test coverage](https://codecov.io/gh/TypeStrong/ts-node/branch/main/graph/badge.svg)](https://codecov.io/gh/TypeStrong/ts-node) + +> TypeScript execution and REPL for node.js, with source map support. **Works with `typescript@>=2.7`**. + +The latest documentation can also be found on our website: [https://typestrong.org/ts-node](https://typestrong.org/ts-node) + +### *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). + +# Table of Contents diff --git a/website/scripts/build-readme.mjs b/website/scripts/build-readme.mjs new file mode 100755 index 00000000..b7cb22c4 --- /dev/null +++ b/website/scripts/build-readme.mjs @@ -0,0 +1,156 @@ +#!/usr/bin/env node +/* + * Render README by merging website's `.md` pages. + */ + +import fs from 'fs'; +import { fileURLToPath } from 'url'; +import Path from 'path'; + +import _ from 'lodash'; +import remark from 'remark'; +import remarkFrontmatter from 'remark-frontmatter'; +import remarkRecommended from 'remark-preset-lint-recommended'; +import remarkToc from 'remark-toc'; +import remarkBehead from 'remark-behead'; +import remarkValidateLinks from 'remark-validate-links'; +import visit from 'unist-util-visit'; +import vfile from 'vfile'; +import vfileReporter from 'vfile-reporter'; +import jsYaml from 'js-yaml'; + +const __websiteRoot = Path.resolve(fileURLToPath(import.meta.url), '../..'); +const __root = Path.resolve(__websiteRoot, '..'); +const readmePath = Path.resolve(__root, 'README.md'); +const generateReadmeHeadersForCategories = { + General: false, + Advanced: true, + Recipes: true +}; + +import sidebars from '../sidebars.js'; + +async function main() { + const readmeNodes = []; + + await appendMarkdownFileToReadmeAst({ + path: 'readme-sources/prefix.md', + headerLevel: 1 + }); + + const sidebar = sidebars.primarySidebar; + for(const category of sidebar) { + const generateReadmeHeader = generateReadmeHeadersForCategories[category.label]; + if(generateReadmeHeader) { + readmeNodes.push(headerNode(1, category.label)); + } else if(generateReadmeHeader == null) { + throw new Error(`Update ${ import.meta.url } to include all sidebar categories`); + } + for(const page of category.items) { + await appendMarkdownFileToReadmeAst({ + path: `docs/${ page }.md`, + headerLevel: 1 + !!generateReadmeHeader + }); + } + } + + appendMarkdownFileToReadmeAst({ + path: 'readme-sources/license.md', + headerLevel: 1 + }); + + async function appendMarkdownFileToReadmeAst({path, headerLevel}) { + const absPath = Path.resolve(__websiteRoot, path); + console.log(`Appending ${ path } at header level ${ headerLevel }`); + const markdownSource = fs.readFileSync(absPath, 'utf8'); + await remark() + .use(remarkFrontmatter, ['yaml']) + .use(parseFrontmatter) + .use(remarkBehead, { after: '', depth: headerLevel - 1 }) + .use(() => (ast) => { + const {frontmatter} = ast; + if(frontmatter && !frontmatter.omitHeaderOnMerge) { + readmeNodes.push(headerNode(headerLevel, frontmatter && frontmatter.title || Path.basename(absPath))); + } + readmeNodes.push(...ast.children); + }) + .process(markdownSource); + } + + const renderedReadme = await remark() + .use(() => (ast) => { + ast.children.push(...readmeNodes); + }) + .use(codeLanguageJsonToJsonc) + .use(rewritePageLinksToAnchorLinks) + .use(rewriteImgTargets) + .use(remarkToc, {tight: true}) + .process(vfile({ + path: readmePath, + contents: '' + })); + console.error(vfileReporter(renderedReadme)); + if(renderedReadme.messages.length) throw new Error('Aborting on diagnostics.'); + const lintResults = await remark() + .use(remarkValidateLinks) + .use(remarkRecommended) + .process(renderedReadme); + console.error(vfileReporter(lintResults)); + if(lintResults.messages.length) throw new Error('Aborting on diagnostics.'); + + fs.writeFileSync(readmePath, renderedReadme.contents); +} + +function parseFrontmatter() { + return (ast) => { + if(ast.children[0].type === 'yaml') { + ast.frontmatter = jsYaml.load(ast.children[0].value); + ast.children.splice(0, 1); + } + } +} + +function codeLanguageJsonToJsonc() { + return (ast) => { + visit(ast, 'code', node => { + if(node.lang === 'json') node.lang = 'jsonc'; + }) + } +} +function rewritePageLinksToAnchorLinks() { + return (ast) => { + visit(ast, 'link', node => { + if(node.url?.match?.(/^https?\:\/\//)) return; + // TODO take page title into account + node.url = node.url.replace(/^[\.\/]*(?:([^#]+)|.*#(.*))$/, '#$1$2'); + node.url = node.url.replace(/\.md$/, ''); + }); + } +} + +function rewriteImgTargets() { + return (ast) => { + visit(ast, 'image', node => { + node.url = node.url.replace(/^\//, 'website/static/'); + }); + } +} + +function headerNode(depth, value) { + return { + type: 'heading', + depth, + children: [{ + type: 'text', + value, + children: [] + }] + }; +} + +try { + await main(); +} catch(e) { + console.error(e.message); + process.exitCode = 1; +} diff --git a/website/sidebars.js b/website/sidebars.js index 3964a6ef..cda79734 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -1,13 +1,50 @@ module.exports = { - primarySidebar: { - Docs: [ - 'getting-started', - 'how-it-works', + primarySidebar: [{ + type: 'category', + label: 'General', + collapsed: false, + items: [ + 'overview', + 'installation', + 'usage', 'configuration', + 'options', 'imports', - 'integrations', - 'shebang', - 'errors', + 'troubleshooting', + 'performance', + ] + }, { + type: 'category', + label: 'Advanced', + collapsed: false, + items: [ + 'how-it-works', + 'paths', + 'types', + 'compilers', + 'transpilers' ], - }, + }, { + type: 'category', + label: 'Recipes', + collapsed: false, + items: [ + 'recipes/watching-and-restarting', + 'recipes/ava', + 'recipes/gulp', + 'recipes/intellij', + 'recipes/mocha', + 'recipes/tape', + 'recipes/visual-studio-code', + 'recipes/other' + ] + }], + hiddenSidebar: [{ + type: 'category', + label: 'Hidden pages', + collapsed: false, + items: [ + 'options-table', + ] + }], }; diff --git a/website/src/pages/index.js b/website/src/pages/index.js index d4434c13..e476dc7a 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -32,13 +32,22 @@ function Home() {

{siteConfig.tagline}

Get Started +