Add ESLint
This commit is contained in:
parent
d2cd39dd6d
commit
55fa0532a2
3639 changed files with 346484 additions and 0 deletions
16
.eslintrc.json
Normal file
16
.eslintrc.json
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"commonjs": true,
|
||||||
|
"es2021": true
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"standard"
|
||||||
|
],
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": "latest"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"indent": ["error", 4]
|
||||||
|
}
|
||||||
|
}
|
1
node_modules/.bin/acorn
generated
vendored
Symbolic link
1
node_modules/.bin/acorn
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../acorn/bin/acorn
|
1
node_modules/.bin/eslint
generated
vendored
Symbolic link
1
node_modules/.bin/eslint
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../eslint/bin/eslint.js
|
1
node_modules/.bin/js-yaml
generated
vendored
Symbolic link
1
node_modules/.bin/js-yaml
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../js-yaml/bin/js-yaml.js
|
1
node_modules/.bin/json5
generated
vendored
Symbolic link
1
node_modules/.bin/json5
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../json5/lib/cli.js
|
1
node_modules/.bin/node-which
generated
vendored
Symbolic link
1
node_modules/.bin/node-which
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../which/bin/node-which
|
1
node_modules/.bin/resolve
generated
vendored
Symbolic link
1
node_modules/.bin/resolve
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../resolve/bin/resolve
|
1
node_modules/.bin/rimraf
generated
vendored
Symbolic link
1
node_modules/.bin/rimraf
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../rimraf/bin.js
|
1
node_modules/.bin/semver
generated
vendored
Symbolic link
1
node_modules/.bin/semver
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../semver/bin/semver.js
|
1709
node_modules/.package-lock.json
generated
vendored
1709
node_modules/.package-lock.json
generated
vendored
File diff suppressed because it is too large
Load diff
19
node_modules/@eslint/eslintrc/LICENSE
generated
vendored
Normal file
19
node_modules/@eslint/eslintrc/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright OpenJS Foundation and other contributors, <www.openjsf.org>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
61
node_modules/@eslint/eslintrc/README.md
generated
vendored
Normal file
61
node_modules/@eslint/eslintrc/README.md
generated
vendored
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# ESLintRC Library
|
||||||
|
|
||||||
|
This repository contains the legacy ESLintRC configuration file format for ESLint.
|
||||||
|
|
||||||
|
**Note:** This package is not intended for use outside of the ESLint ecosystem. It is ESLint-specific and not intended for use in other programs.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can install the package as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install @eslint/eslintrc --save-dev
|
||||||
|
|
||||||
|
# or
|
||||||
|
|
||||||
|
yarn add @eslint/eslintrc -D
|
||||||
|
```
|
||||||
|
|
||||||
|
## Future Usage
|
||||||
|
|
||||||
|
**Note:** This package is not intended for public use at this time. The following is an example of how it will be used in the future.
|
||||||
|
|
||||||
|
The primary class in this package is `FlatCompat`, which is a utility to translate ESLintRC-style configs into flat configs. Here's how you use it inside of your `eslint.config.js` file:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { FlatCompat } from "@eslint/eslintrc";
|
||||||
|
|
||||||
|
const compat = new FlatCompat();
|
||||||
|
|
||||||
|
export default [
|
||||||
|
|
||||||
|
// mimic ESLintRC-style extends
|
||||||
|
compat.extends("standard", "example"),
|
||||||
|
|
||||||
|
// mimic environments
|
||||||
|
compat.env({
|
||||||
|
es2020: true,
|
||||||
|
node: true
|
||||||
|
}),
|
||||||
|
|
||||||
|
// mimic plugins
|
||||||
|
compat.plugins("airbnb", "react"),
|
||||||
|
|
||||||
|
// translate an entire config
|
||||||
|
compat.config({
|
||||||
|
plugins: ["airbnb", "react"],
|
||||||
|
extends: "standard",
|
||||||
|
env: {
|
||||||
|
es2020: true,
|
||||||
|
node: true
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
semi: "error"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT License
|
79
node_modules/@eslint/eslintrc/conf/config-schema.js
generated
vendored
Normal file
79
node_modules/@eslint/eslintrc/conf/config-schema.js
generated
vendored
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Defines a schema for configs.
|
||||||
|
* @author Sylvan Mably
|
||||||
|
*/
|
||||||
|
|
||||||
|
const baseConfigProperties = {
|
||||||
|
$schema: { type: "string" },
|
||||||
|
env: { type: "object" },
|
||||||
|
extends: { $ref: "#/definitions/stringOrStrings" },
|
||||||
|
globals: { type: "object" },
|
||||||
|
overrides: {
|
||||||
|
type: "array",
|
||||||
|
items: { $ref: "#/definitions/overrideConfig" },
|
||||||
|
additionalItems: false
|
||||||
|
},
|
||||||
|
parser: { type: ["string", "null"] },
|
||||||
|
parserOptions: { type: "object" },
|
||||||
|
plugins: { type: "array" },
|
||||||
|
processor: { type: "string" },
|
||||||
|
rules: { type: "object" },
|
||||||
|
settings: { type: "object" },
|
||||||
|
noInlineConfig: { type: "boolean" },
|
||||||
|
reportUnusedDisableDirectives: { type: "boolean" },
|
||||||
|
|
||||||
|
ecmaFeatures: { type: "object" } // deprecated; logs a warning when used
|
||||||
|
};
|
||||||
|
|
||||||
|
const configSchema = {
|
||||||
|
definitions: {
|
||||||
|
stringOrStrings: {
|
||||||
|
oneOf: [
|
||||||
|
{ type: "string" },
|
||||||
|
{
|
||||||
|
type: "array",
|
||||||
|
items: { type: "string" },
|
||||||
|
additionalItems: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
stringOrStringsRequired: {
|
||||||
|
oneOf: [
|
||||||
|
{ type: "string" },
|
||||||
|
{
|
||||||
|
type: "array",
|
||||||
|
items: { type: "string" },
|
||||||
|
additionalItems: false,
|
||||||
|
minItems: 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// Config at top-level.
|
||||||
|
objectConfig: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
root: { type: "boolean" },
|
||||||
|
ignorePatterns: { $ref: "#/definitions/stringOrStrings" },
|
||||||
|
...baseConfigProperties
|
||||||
|
},
|
||||||
|
additionalProperties: false
|
||||||
|
},
|
||||||
|
|
||||||
|
// Config in `overrides`.
|
||||||
|
overrideConfig: {
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
excludedFiles: { $ref: "#/definitions/stringOrStrings" },
|
||||||
|
files: { $ref: "#/definitions/stringOrStringsRequired" },
|
||||||
|
...baseConfigProperties
|
||||||
|
},
|
||||||
|
required: ["files"],
|
||||||
|
additionalProperties: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
$ref: "#/definitions/objectConfig"
|
||||||
|
};
|
||||||
|
|
||||||
|
export default configSchema;
|
203
node_modules/@eslint/eslintrc/conf/environments.js
generated
vendored
Normal file
203
node_modules/@eslint/eslintrc/conf/environments.js
generated
vendored
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Defines environment settings and globals.
|
||||||
|
* @author Elan Shanker
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import globals from "globals";
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the object that has difference.
|
||||||
|
* @param {Record<string,boolean>} current The newer object.
|
||||||
|
* @param {Record<string,boolean>} prev The older object.
|
||||||
|
* @returns {Record<string,boolean>} The difference object.
|
||||||
|
*/
|
||||||
|
function getDiff(current, prev) {
|
||||||
|
const retv = {};
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(current)) {
|
||||||
|
if (!Object.hasOwnProperty.call(prev, key)) {
|
||||||
|
retv[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retv;
|
||||||
|
}
|
||||||
|
|
||||||
|
const newGlobals2015 = getDiff(globals.es2015, globals.es5); // 19 variables such as Promise, Map, ...
|
||||||
|
const newGlobals2017 = {
|
||||||
|
Atomics: false,
|
||||||
|
SharedArrayBuffer: false
|
||||||
|
};
|
||||||
|
const newGlobals2020 = {
|
||||||
|
BigInt: false,
|
||||||
|
BigInt64Array: false,
|
||||||
|
BigUint64Array: false,
|
||||||
|
globalThis: false
|
||||||
|
};
|
||||||
|
|
||||||
|
const newGlobals2021 = {
|
||||||
|
AggregateError: false,
|
||||||
|
FinalizationRegistry: false,
|
||||||
|
WeakRef: false
|
||||||
|
};
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** @type {Map<string, import("../lib/shared/types").Environment>} */
|
||||||
|
export default new Map(Object.entries({
|
||||||
|
|
||||||
|
// Language
|
||||||
|
builtin: {
|
||||||
|
globals: globals.es5
|
||||||
|
},
|
||||||
|
es6: {
|
||||||
|
globals: newGlobals2015,
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2015: {
|
||||||
|
globals: newGlobals2015,
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2016: {
|
||||||
|
globals: newGlobals2015,
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 7
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2017: {
|
||||||
|
globals: { ...newGlobals2015, ...newGlobals2017 },
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 8
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2018: {
|
||||||
|
globals: { ...newGlobals2015, ...newGlobals2017 },
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 9
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2019: {
|
||||||
|
globals: { ...newGlobals2015, ...newGlobals2017 },
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 10
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2020: {
|
||||||
|
globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020 },
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 11
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2021: {
|
||||||
|
globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020, ...newGlobals2021 },
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 12
|
||||||
|
}
|
||||||
|
},
|
||||||
|
es2022: {
|
||||||
|
globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020, ...newGlobals2021 },
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: 13
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Platforms
|
||||||
|
browser: {
|
||||||
|
globals: globals.browser
|
||||||
|
},
|
||||||
|
node: {
|
||||||
|
globals: globals.node,
|
||||||
|
parserOptions: {
|
||||||
|
ecmaFeatures: {
|
||||||
|
globalReturn: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shared-node-browser": {
|
||||||
|
globals: globals["shared-node-browser"]
|
||||||
|
},
|
||||||
|
worker: {
|
||||||
|
globals: globals.worker
|
||||||
|
},
|
||||||
|
serviceworker: {
|
||||||
|
globals: globals.serviceworker
|
||||||
|
},
|
||||||
|
|
||||||
|
// Frameworks
|
||||||
|
commonjs: {
|
||||||
|
globals: globals.commonjs,
|
||||||
|
parserOptions: {
|
||||||
|
ecmaFeatures: {
|
||||||
|
globalReturn: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
amd: {
|
||||||
|
globals: globals.amd
|
||||||
|
},
|
||||||
|
mocha: {
|
||||||
|
globals: globals.mocha
|
||||||
|
},
|
||||||
|
jasmine: {
|
||||||
|
globals: globals.jasmine
|
||||||
|
},
|
||||||
|
jest: {
|
||||||
|
globals: globals.jest
|
||||||
|
},
|
||||||
|
phantomjs: {
|
||||||
|
globals: globals.phantomjs
|
||||||
|
},
|
||||||
|
jquery: {
|
||||||
|
globals: globals.jquery
|
||||||
|
},
|
||||||
|
qunit: {
|
||||||
|
globals: globals.qunit
|
||||||
|
},
|
||||||
|
prototypejs: {
|
||||||
|
globals: globals.prototypejs
|
||||||
|
},
|
||||||
|
shelljs: {
|
||||||
|
globals: globals.shelljs
|
||||||
|
},
|
||||||
|
meteor: {
|
||||||
|
globals: globals.meteor
|
||||||
|
},
|
||||||
|
mongo: {
|
||||||
|
globals: globals.mongo
|
||||||
|
},
|
||||||
|
protractor: {
|
||||||
|
globals: globals.protractor
|
||||||
|
},
|
||||||
|
applescript: {
|
||||||
|
globals: globals.applescript
|
||||||
|
},
|
||||||
|
nashorn: {
|
||||||
|
globals: globals.nashorn
|
||||||
|
},
|
||||||
|
atomtest: {
|
||||||
|
globals: globals.atomtest
|
||||||
|
},
|
||||||
|
embertest: {
|
||||||
|
globals: globals.embertest
|
||||||
|
},
|
||||||
|
webextensions: {
|
||||||
|
globals: globals.webextensions
|
||||||
|
},
|
||||||
|
greasemonkey: {
|
||||||
|
globals: globals.greasemonkey
|
||||||
|
}
|
||||||
|
}));
|
1092
node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs
generated
vendored
Normal file
1092
node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
1
node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs.map
generated
vendored
Normal file
1
node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
4295
node_modules/@eslint/eslintrc/dist/eslintrc.cjs
generated
vendored
Normal file
4295
node_modules/@eslint/eslintrc/dist/eslintrc.cjs
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
1
node_modules/@eslint/eslintrc/dist/eslintrc.cjs.map
generated
vendored
Normal file
1
node_modules/@eslint/eslintrc/dist/eslintrc.cjs.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
533
node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js
generated
vendored
Normal file
533
node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js
generated
vendored
Normal file
|
@ -0,0 +1,533 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview `CascadingConfigArrayFactory` class.
|
||||||
|
*
|
||||||
|
* `CascadingConfigArrayFactory` class has a responsibility:
|
||||||
|
*
|
||||||
|
* 1. Handles cascading of config files.
|
||||||
|
*
|
||||||
|
* It provides two methods:
|
||||||
|
*
|
||||||
|
* - `getConfigArrayForFile(filePath)`
|
||||||
|
* Get the corresponded configuration of a given file. This method doesn't
|
||||||
|
* throw even if the given file didn't exist.
|
||||||
|
* - `clearCache()`
|
||||||
|
* Clear the internal cache. You have to call this method when
|
||||||
|
* `additionalPluginPool` was updated if `baseConfig` or `cliConfig` depends
|
||||||
|
* on the additional plugins. (`CLIEngine#addPlugin()` method calls this.)
|
||||||
|
*
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import debugOrig from "debug";
|
||||||
|
import os from "os";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
import { ConfigArrayFactory } from "./config-array-factory.js";
|
||||||
|
import {
|
||||||
|
ConfigArray,
|
||||||
|
ConfigDependency,
|
||||||
|
IgnorePattern
|
||||||
|
} from "./config-array/index.js";
|
||||||
|
import ConfigValidator from "./shared/config-validator.js";
|
||||||
|
import { emitDeprecationWarning } from "./shared/deprecation-warnings.js";
|
||||||
|
|
||||||
|
const debug = debugOrig("eslintrc:cascading-config-array-factory");
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Define types for VSCode IntelliSense.
|
||||||
|
/** @typedef {import("./shared/types").ConfigData} ConfigData */
|
||||||
|
/** @typedef {import("./shared/types").Parser} Parser */
|
||||||
|
/** @typedef {import("./shared/types").Plugin} Plugin */
|
||||||
|
/** @typedef {import("./shared/types").Rule} Rule */
|
||||||
|
/** @typedef {ReturnType<ConfigArrayFactory["create"]>} ConfigArray */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} CascadingConfigArrayFactoryOptions
|
||||||
|
* @property {Map<string,Plugin>} [additionalPluginPool] The map for additional plugins.
|
||||||
|
* @property {ConfigData} [baseConfig] The config by `baseConfig` option.
|
||||||
|
* @property {ConfigData} [cliConfig] The config by CLI options (`--env`, `--global`, `--ignore-pattern`, `--parser`, `--parser-options`, `--plugin`, and `--rule`). CLI options overwrite the setting in config files.
|
||||||
|
* @property {string} [cwd] The base directory to start lookup.
|
||||||
|
* @property {string} [ignorePath] The path to the alternative file of `.eslintignore`.
|
||||||
|
* @property {string[]} [rulePaths] The value of `--rulesdir` option.
|
||||||
|
* @property {string} [specificConfigPath] The value of `--config` option.
|
||||||
|
* @property {boolean} [useEslintrc] if `false` then it doesn't load config files.
|
||||||
|
* @property {Function} loadRules The function to use to load rules.
|
||||||
|
* @property {Map<string,Rule>} builtInRules The rules that are built in to ESLint.
|
||||||
|
* @property {Object} [resolver=ModuleResolver] The module resolver object.
|
||||||
|
* @property {string} eslintAllPath The path to the definitions for eslint:all.
|
||||||
|
* @property {Function} getEslintAllConfig Returns the config data for eslint:all.
|
||||||
|
* @property {string} eslintRecommendedPath The path to the definitions for eslint:recommended.
|
||||||
|
* @property {Function} getEslintRecommendedConfig Returns the config data for eslint:recommended.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} CascadingConfigArrayFactoryInternalSlots
|
||||||
|
* @property {ConfigArray} baseConfigArray The config array of `baseConfig` option.
|
||||||
|
* @property {ConfigData} baseConfigData The config data of `baseConfig` option. This is used to reset `baseConfigArray`.
|
||||||
|
* @property {ConfigArray} cliConfigArray The config array of CLI options.
|
||||||
|
* @property {ConfigData} cliConfigData The config data of CLI options. This is used to reset `cliConfigArray`.
|
||||||
|
* @property {ConfigArrayFactory} configArrayFactory The factory for config arrays.
|
||||||
|
* @property {Map<string, ConfigArray>} configCache The cache from directory paths to config arrays.
|
||||||
|
* @property {string} cwd The base directory to start lookup.
|
||||||
|
* @property {WeakMap<ConfigArray, ConfigArray>} finalizeCache The cache from config arrays to finalized config arrays.
|
||||||
|
* @property {string} [ignorePath] The path to the alternative file of `.eslintignore`.
|
||||||
|
* @property {string[]|null} rulePaths The value of `--rulesdir` option. This is used to reset `baseConfigArray`.
|
||||||
|
* @property {string|null} specificConfigPath The value of `--config` option. This is used to reset `cliConfigArray`.
|
||||||
|
* @property {boolean} useEslintrc if `false` then it doesn't load config files.
|
||||||
|
* @property {Function} loadRules The function to use to load rules.
|
||||||
|
* @property {Map<string,Rule>} builtInRules The rules that are built in to ESLint.
|
||||||
|
* @property {Object} [resolver=ModuleResolver] The module resolver object.
|
||||||
|
* @property {string} eslintAllPath The path to the definitions for eslint:all.
|
||||||
|
* @property {Function} getEslintAllConfig Returns the config data for eslint:all.
|
||||||
|
* @property {string} eslintRecommendedPath The path to the definitions for eslint:recommended.
|
||||||
|
* @property {Function} getEslintRecommendedConfig Returns the config data for eslint:recommended.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @type {WeakMap<CascadingConfigArrayFactory, CascadingConfigArrayFactoryInternalSlots>} */
|
||||||
|
const internalSlotsMap = new WeakMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the config array from `baseConfig` and `rulePaths`.
|
||||||
|
* @param {CascadingConfigArrayFactoryInternalSlots} slots The slots.
|
||||||
|
* @returns {ConfigArray} The config array of the base configs.
|
||||||
|
*/
|
||||||
|
function createBaseConfigArray({
|
||||||
|
configArrayFactory,
|
||||||
|
baseConfigData,
|
||||||
|
rulePaths,
|
||||||
|
cwd,
|
||||||
|
loadRules
|
||||||
|
}) {
|
||||||
|
const baseConfigArray = configArrayFactory.create(
|
||||||
|
baseConfigData,
|
||||||
|
{ name: "BaseConfig" }
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the config array element for the default ignore patterns.
|
||||||
|
* This element has `ignorePattern` property that ignores the default
|
||||||
|
* patterns in the current working directory.
|
||||||
|
*/
|
||||||
|
baseConfigArray.unshift(configArrayFactory.create(
|
||||||
|
{ ignorePatterns: IgnorePattern.DefaultPatterns },
|
||||||
|
{ name: "DefaultIgnorePattern" }
|
||||||
|
)[0]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load rules `--rulesdir` option as a pseudo plugin.
|
||||||
|
* Use a pseudo plugin to define rules of `--rulesdir`, so we can validate
|
||||||
|
* the rule's options with only information in the config array.
|
||||||
|
*/
|
||||||
|
if (rulePaths && rulePaths.length > 0) {
|
||||||
|
baseConfigArray.push({
|
||||||
|
type: "config",
|
||||||
|
name: "--rulesdir",
|
||||||
|
filePath: "",
|
||||||
|
plugins: {
|
||||||
|
"": new ConfigDependency({
|
||||||
|
definition: {
|
||||||
|
rules: rulePaths.reduce(
|
||||||
|
(map, rulesPath) => Object.assign(
|
||||||
|
map,
|
||||||
|
loadRules(rulesPath, cwd)
|
||||||
|
),
|
||||||
|
{}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
filePath: "",
|
||||||
|
id: "",
|
||||||
|
importerName: "--rulesdir",
|
||||||
|
importerPath: ""
|
||||||
|
})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseConfigArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the config array from CLI options.
|
||||||
|
* @param {CascadingConfigArrayFactoryInternalSlots} slots The slots.
|
||||||
|
* @returns {ConfigArray} The config array of the base configs.
|
||||||
|
*/
|
||||||
|
function createCLIConfigArray({
|
||||||
|
cliConfigData,
|
||||||
|
configArrayFactory,
|
||||||
|
cwd,
|
||||||
|
ignorePath,
|
||||||
|
specificConfigPath
|
||||||
|
}) {
|
||||||
|
const cliConfigArray = configArrayFactory.create(
|
||||||
|
cliConfigData,
|
||||||
|
{ name: "CLIOptions" }
|
||||||
|
);
|
||||||
|
|
||||||
|
cliConfigArray.unshift(
|
||||||
|
...(ignorePath
|
||||||
|
? configArrayFactory.loadESLintIgnore(ignorePath)
|
||||||
|
: configArrayFactory.loadDefaultESLintIgnore())
|
||||||
|
);
|
||||||
|
|
||||||
|
if (specificConfigPath) {
|
||||||
|
cliConfigArray.unshift(
|
||||||
|
...configArrayFactory.loadFile(
|
||||||
|
specificConfigPath,
|
||||||
|
{ name: "--config", basePath: cwd }
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cliConfigArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error type when there are files matched by a glob, but all of them have been ignored.
|
||||||
|
*/
|
||||||
|
class ConfigurationNotFoundError extends Error {
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @param {string} directoryPath The directory path.
|
||||||
|
*/
|
||||||
|
constructor(directoryPath) {
|
||||||
|
super(`No ESLint configuration found in ${directoryPath}.`);
|
||||||
|
this.messageTemplate = "no-config-found";
|
||||||
|
this.messageData = { directoryPath };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class provides the functionality that enumerates every file which is
|
||||||
|
* matched by given glob patterns and that configuration.
|
||||||
|
*/
|
||||||
|
class CascadingConfigArrayFactory {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize this enumerator.
|
||||||
|
* @param {CascadingConfigArrayFactoryOptions} options The options.
|
||||||
|
*/
|
||||||
|
constructor({
|
||||||
|
additionalPluginPool = new Map(),
|
||||||
|
baseConfig: baseConfigData = null,
|
||||||
|
cliConfig: cliConfigData = null,
|
||||||
|
cwd = process.cwd(),
|
||||||
|
ignorePath,
|
||||||
|
resolvePluginsRelativeTo,
|
||||||
|
rulePaths = [],
|
||||||
|
specificConfigPath = null,
|
||||||
|
useEslintrc = true,
|
||||||
|
builtInRules = new Map(),
|
||||||
|
loadRules,
|
||||||
|
resolver,
|
||||||
|
eslintRecommendedPath,
|
||||||
|
getEslintRecommendedConfig,
|
||||||
|
eslintAllPath,
|
||||||
|
getEslintAllConfig
|
||||||
|
} = {}) {
|
||||||
|
const configArrayFactory = new ConfigArrayFactory({
|
||||||
|
additionalPluginPool,
|
||||||
|
cwd,
|
||||||
|
resolvePluginsRelativeTo,
|
||||||
|
builtInRules,
|
||||||
|
resolver,
|
||||||
|
eslintRecommendedPath,
|
||||||
|
getEslintRecommendedConfig,
|
||||||
|
eslintAllPath,
|
||||||
|
getEslintAllConfig
|
||||||
|
});
|
||||||
|
|
||||||
|
internalSlotsMap.set(this, {
|
||||||
|
baseConfigArray: createBaseConfigArray({
|
||||||
|
baseConfigData,
|
||||||
|
configArrayFactory,
|
||||||
|
cwd,
|
||||||
|
rulePaths,
|
||||||
|
loadRules,
|
||||||
|
resolver
|
||||||
|
}),
|
||||||
|
baseConfigData,
|
||||||
|
cliConfigArray: createCLIConfigArray({
|
||||||
|
cliConfigData,
|
||||||
|
configArrayFactory,
|
||||||
|
cwd,
|
||||||
|
ignorePath,
|
||||||
|
specificConfigPath
|
||||||
|
}),
|
||||||
|
cliConfigData,
|
||||||
|
configArrayFactory,
|
||||||
|
configCache: new Map(),
|
||||||
|
cwd,
|
||||||
|
finalizeCache: new WeakMap(),
|
||||||
|
ignorePath,
|
||||||
|
rulePaths,
|
||||||
|
specificConfigPath,
|
||||||
|
useEslintrc,
|
||||||
|
builtInRules,
|
||||||
|
loadRules
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The path to the current working directory.
|
||||||
|
* This is used by tests.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
get cwd() {
|
||||||
|
const { cwd } = internalSlotsMap.get(this);
|
||||||
|
|
||||||
|
return cwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the config array of a given file.
|
||||||
|
* If `filePath` was not given, it returns the config which contains only
|
||||||
|
* `baseConfigData` and `cliConfigData`.
|
||||||
|
* @param {string} [filePath] The file path to a file.
|
||||||
|
* @param {Object} [options] The options.
|
||||||
|
* @param {boolean} [options.ignoreNotFoundError] If `true` then it doesn't throw `ConfigurationNotFoundError`.
|
||||||
|
* @returns {ConfigArray} The config array of the file.
|
||||||
|
*/
|
||||||
|
getConfigArrayForFile(filePath, { ignoreNotFoundError = false } = {}) {
|
||||||
|
const {
|
||||||
|
baseConfigArray,
|
||||||
|
cliConfigArray,
|
||||||
|
cwd
|
||||||
|
} = internalSlotsMap.get(this);
|
||||||
|
|
||||||
|
if (!filePath) {
|
||||||
|
return new ConfigArray(...baseConfigArray, ...cliConfigArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
const directoryPath = path.dirname(path.resolve(cwd, filePath));
|
||||||
|
|
||||||
|
debug(`Load config files for ${directoryPath}.`);
|
||||||
|
|
||||||
|
return this._finalizeConfigArray(
|
||||||
|
this._loadConfigInAncestors(directoryPath),
|
||||||
|
directoryPath,
|
||||||
|
ignoreNotFoundError
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the config data to override all configs.
|
||||||
|
* Require to call `clearCache()` method after this method is called.
|
||||||
|
* @param {ConfigData} configData The config data to override all configs.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
setOverrideConfig(configData) {
|
||||||
|
const slots = internalSlotsMap.get(this);
|
||||||
|
|
||||||
|
slots.cliConfigData = configData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear config cache.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
clearCache() {
|
||||||
|
const slots = internalSlotsMap.get(this);
|
||||||
|
|
||||||
|
slots.baseConfigArray = createBaseConfigArray(slots);
|
||||||
|
slots.cliConfigArray = createCLIConfigArray(slots);
|
||||||
|
slots.configCache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load and normalize config files from the ancestor directories.
|
||||||
|
* @param {string} directoryPath The path to a leaf directory.
|
||||||
|
* @param {boolean} configsExistInSubdirs `true` if configurations exist in subdirectories.
|
||||||
|
* @returns {ConfigArray} The loaded config.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_loadConfigInAncestors(directoryPath, configsExistInSubdirs = false) {
|
||||||
|
const {
|
||||||
|
baseConfigArray,
|
||||||
|
configArrayFactory,
|
||||||
|
configCache,
|
||||||
|
cwd,
|
||||||
|
useEslintrc
|
||||||
|
} = internalSlotsMap.get(this);
|
||||||
|
|
||||||
|
if (!useEslintrc) {
|
||||||
|
return baseConfigArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
let configArray = configCache.get(directoryPath);
|
||||||
|
|
||||||
|
// Hit cache.
|
||||||
|
if (configArray) {
|
||||||
|
debug(`Cache hit: ${directoryPath}.`);
|
||||||
|
return configArray;
|
||||||
|
}
|
||||||
|
debug(`No cache found: ${directoryPath}.`);
|
||||||
|
|
||||||
|
const homePath = os.homedir();
|
||||||
|
|
||||||
|
// Consider this is root.
|
||||||
|
if (directoryPath === homePath && cwd !== homePath) {
|
||||||
|
debug("Stop traversing because of considered root.");
|
||||||
|
if (configsExistInSubdirs) {
|
||||||
|
const filePath = ConfigArrayFactory.getPathToConfigFileInDirectory(directoryPath);
|
||||||
|
|
||||||
|
if (filePath) {
|
||||||
|
emitDeprecationWarning(
|
||||||
|
filePath,
|
||||||
|
"ESLINT_PERSONAL_CONFIG_SUPPRESS"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this._cacheConfig(directoryPath, baseConfigArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the config on this directory.
|
||||||
|
try {
|
||||||
|
configArray = configArrayFactory.loadInDirectory(directoryPath);
|
||||||
|
} catch (error) {
|
||||||
|
/* istanbul ignore next */
|
||||||
|
if (error.code === "EACCES") {
|
||||||
|
debug("Stop traversing because of 'EACCES' error.");
|
||||||
|
return this._cacheConfig(directoryPath, baseConfigArray);
|
||||||
|
}
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configArray.length > 0 && configArray.isRoot()) {
|
||||||
|
debug("Stop traversing because of 'root:true'.");
|
||||||
|
configArray.unshift(...baseConfigArray);
|
||||||
|
return this._cacheConfig(directoryPath, configArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load from the ancestors and merge it.
|
||||||
|
const parentPath = path.dirname(directoryPath);
|
||||||
|
const parentConfigArray = parentPath && parentPath !== directoryPath
|
||||||
|
? this._loadConfigInAncestors(
|
||||||
|
parentPath,
|
||||||
|
configsExistInSubdirs || configArray.length > 0
|
||||||
|
)
|
||||||
|
: baseConfigArray;
|
||||||
|
|
||||||
|
if (configArray.length > 0) {
|
||||||
|
configArray.unshift(...parentConfigArray);
|
||||||
|
} else {
|
||||||
|
configArray = parentConfigArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache and return.
|
||||||
|
return this._cacheConfig(directoryPath, configArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Freeze and cache a given config.
|
||||||
|
* @param {string} directoryPath The path to a directory as a cache key.
|
||||||
|
* @param {ConfigArray} configArray The config array as a cache value.
|
||||||
|
* @returns {ConfigArray} The `configArray` (frozen).
|
||||||
|
*/
|
||||||
|
_cacheConfig(directoryPath, configArray) {
|
||||||
|
const { configCache } = internalSlotsMap.get(this);
|
||||||
|
|
||||||
|
Object.freeze(configArray);
|
||||||
|
configCache.set(directoryPath, configArray);
|
||||||
|
|
||||||
|
return configArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalize a given config array.
|
||||||
|
* Concatenate `--config` and other CLI options.
|
||||||
|
* @param {ConfigArray} configArray The parent config array.
|
||||||
|
* @param {string} directoryPath The path to the leaf directory to find config files.
|
||||||
|
* @param {boolean} ignoreNotFoundError If `true` then it doesn't throw `ConfigurationNotFoundError`.
|
||||||
|
* @returns {ConfigArray} The loaded config.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_finalizeConfigArray(configArray, directoryPath, ignoreNotFoundError) {
|
||||||
|
const {
|
||||||
|
cliConfigArray,
|
||||||
|
configArrayFactory,
|
||||||
|
finalizeCache,
|
||||||
|
useEslintrc,
|
||||||
|
builtInRules
|
||||||
|
} = internalSlotsMap.get(this);
|
||||||
|
|
||||||
|
let finalConfigArray = finalizeCache.get(configArray);
|
||||||
|
|
||||||
|
if (!finalConfigArray) {
|
||||||
|
finalConfigArray = configArray;
|
||||||
|
|
||||||
|
// Load the personal config if there are no regular config files.
|
||||||
|
if (
|
||||||
|
useEslintrc &&
|
||||||
|
configArray.every(c => !c.filePath) &&
|
||||||
|
cliConfigArray.every(c => !c.filePath) // `--config` option can be a file.
|
||||||
|
) {
|
||||||
|
const homePath = os.homedir();
|
||||||
|
|
||||||
|
debug("Loading the config file of the home directory:", homePath);
|
||||||
|
|
||||||
|
const personalConfigArray = configArrayFactory.loadInDirectory(
|
||||||
|
homePath,
|
||||||
|
{ name: "PersonalConfig" }
|
||||||
|
);
|
||||||
|
|
||||||
|
if (
|
||||||
|
personalConfigArray.length > 0 &&
|
||||||
|
!directoryPath.startsWith(homePath)
|
||||||
|
) {
|
||||||
|
const lastElement =
|
||||||
|
personalConfigArray[personalConfigArray.length - 1];
|
||||||
|
|
||||||
|
emitDeprecationWarning(
|
||||||
|
lastElement.filePath,
|
||||||
|
"ESLINT_PERSONAL_CONFIG_LOAD"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
finalConfigArray = finalConfigArray.concat(personalConfigArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply CLI options.
|
||||||
|
if (cliConfigArray.length > 0) {
|
||||||
|
finalConfigArray = finalConfigArray.concat(cliConfigArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate rule settings and environments.
|
||||||
|
const validator = new ConfigValidator({
|
||||||
|
builtInRules
|
||||||
|
});
|
||||||
|
|
||||||
|
validator.validateConfigArray(finalConfigArray);
|
||||||
|
|
||||||
|
// Cache it.
|
||||||
|
Object.freeze(finalConfigArray);
|
||||||
|
finalizeCache.set(configArray, finalConfigArray);
|
||||||
|
|
||||||
|
debug(
|
||||||
|
"Configuration was determined: %o on %s",
|
||||||
|
finalConfigArray,
|
||||||
|
directoryPath
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// At least one element (the default ignore patterns) exists.
|
||||||
|
if (!ignoreNotFoundError && useEslintrc && finalConfigArray.length <= 1) {
|
||||||
|
throw new ConfigurationNotFoundError(directoryPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalConfigArray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export { CascadingConfigArrayFactory };
|
1133
node_modules/@eslint/eslintrc/lib/config-array-factory.js
generated
vendored
Normal file
1133
node_modules/@eslint/eslintrc/lib/config-array-factory.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
523
node_modules/@eslint/eslintrc/lib/config-array/config-array.js
generated
vendored
Normal file
523
node_modules/@eslint/eslintrc/lib/config-array/config-array.js
generated
vendored
Normal file
|
@ -0,0 +1,523 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview `ConfigArray` class.
|
||||||
|
*
|
||||||
|
* `ConfigArray` class expresses the full of a configuration. It has the entry
|
||||||
|
* config file, base config files that were extended, loaded parsers, and loaded
|
||||||
|
* plugins.
|
||||||
|
*
|
||||||
|
* `ConfigArray` class provides three properties and two methods.
|
||||||
|
*
|
||||||
|
* - `pluginEnvironments`
|
||||||
|
* - `pluginProcessors`
|
||||||
|
* - `pluginRules`
|
||||||
|
* The `Map` objects that contain the members of all plugins that this
|
||||||
|
* config array contains. Those map objects don't have mutation methods.
|
||||||
|
* Those keys are the member ID such as `pluginId/memberName`.
|
||||||
|
* - `isRoot()`
|
||||||
|
* If `true` then this configuration has `root:true` property.
|
||||||
|
* - `extractConfig(filePath)`
|
||||||
|
* Extract the final configuration for a given file. This means merging
|
||||||
|
* every config array element which that `criteria` property matched. The
|
||||||
|
* `filePath` argument must be an absolute path.
|
||||||
|
*
|
||||||
|
* `ConfigArrayFactory` provides the loading logic of config files.
|
||||||
|
*
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import { ExtractedConfig } from "./extracted-config.js";
|
||||||
|
import { IgnorePattern } from "./ignore-pattern.js";
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Define types for VSCode IntelliSense.
|
||||||
|
/** @typedef {import("../../shared/types").Environment} Environment */
|
||||||
|
/** @typedef {import("../../shared/types").GlobalConf} GlobalConf */
|
||||||
|
/** @typedef {import("../../shared/types").RuleConf} RuleConf */
|
||||||
|
/** @typedef {import("../../shared/types").Rule} Rule */
|
||||||
|
/** @typedef {import("../../shared/types").Plugin} Plugin */
|
||||||
|
/** @typedef {import("../../shared/types").Processor} Processor */
|
||||||
|
/** @typedef {import("./config-dependency").DependentParser} DependentParser */
|
||||||
|
/** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */
|
||||||
|
/** @typedef {import("./override-tester")["OverrideTester"]} OverrideTester */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} ConfigArrayElement
|
||||||
|
* @property {string} name The name of this config element.
|
||||||
|
* @property {string} filePath The path to the source file of this config element.
|
||||||
|
* @property {InstanceType<OverrideTester>|null} criteria The tester for the `files` and `excludedFiles` of this config element.
|
||||||
|
* @property {Record<string, boolean>|undefined} env The environment settings.
|
||||||
|
* @property {Record<string, GlobalConf>|undefined} globals The global variable settings.
|
||||||
|
* @property {IgnorePattern|undefined} ignorePattern The ignore patterns.
|
||||||
|
* @property {boolean|undefined} noInlineConfig The flag that disables directive comments.
|
||||||
|
* @property {DependentParser|undefined} parser The parser loader.
|
||||||
|
* @property {Object|undefined} parserOptions The parser options.
|
||||||
|
* @property {Record<string, DependentPlugin>|undefined} plugins The plugin loaders.
|
||||||
|
* @property {string|undefined} processor The processor name to refer plugin's processor.
|
||||||
|
* @property {boolean|undefined} reportUnusedDisableDirectives The flag to report unused `eslint-disable` comments.
|
||||||
|
* @property {boolean|undefined} root The flag to express root.
|
||||||
|
* @property {Record<string, RuleConf>|undefined} rules The rule settings
|
||||||
|
* @property {Object|undefined} settings The shared settings.
|
||||||
|
* @property {"config" | "ignore" | "implicit-processor"} type The element type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} ConfigArrayInternalSlots
|
||||||
|
* @property {Map<string, ExtractedConfig>} cache The cache to extract configs.
|
||||||
|
* @property {ReadonlyMap<string, Environment>|null} envMap The map from environment ID to environment definition.
|
||||||
|
* @property {ReadonlyMap<string, Processor>|null} processorMap The map from processor ID to environment definition.
|
||||||
|
* @property {ReadonlyMap<string, Rule>|null} ruleMap The map from rule ID to rule definition.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @type {WeakMap<ConfigArray, ConfigArrayInternalSlots>} */
|
||||||
|
const internalSlotsMap = new class extends WeakMap {
|
||||||
|
get(key) {
|
||||||
|
let value = super.get(key);
|
||||||
|
|
||||||
|
if (!value) {
|
||||||
|
value = {
|
||||||
|
cache: new Map(),
|
||||||
|
envMap: null,
|
||||||
|
processorMap: null,
|
||||||
|
ruleMap: null
|
||||||
|
};
|
||||||
|
super.set(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the indices which are matched to a given file.
|
||||||
|
* @param {ConfigArrayElement[]} elements The elements.
|
||||||
|
* @param {string} filePath The path to a target file.
|
||||||
|
* @returns {number[]} The indices.
|
||||||
|
*/
|
||||||
|
function getMatchedIndices(elements, filePath) {
|
||||||
|
const indices = [];
|
||||||
|
|
||||||
|
for (let i = elements.length - 1; i >= 0; --i) {
|
||||||
|
const element = elements[i];
|
||||||
|
|
||||||
|
if (!element.criteria || (filePath && element.criteria.test(filePath))) {
|
||||||
|
indices.push(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return indices;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a value is a non-null object.
|
||||||
|
* @param {any} x The value to check.
|
||||||
|
* @returns {boolean} `true` if the value is a non-null object.
|
||||||
|
*/
|
||||||
|
function isNonNullObject(x) {
|
||||||
|
return typeof x === "object" && x !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge two objects.
|
||||||
|
*
|
||||||
|
* Assign every property values of `y` to `x` if `x` doesn't have the property.
|
||||||
|
* If `x`'s property value is an object, it does recursive.
|
||||||
|
* @param {Object} target The destination to merge
|
||||||
|
* @param {Object|undefined} source The source to merge.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function mergeWithoutOverwrite(target, source) {
|
||||||
|
if (!isNonNullObject(source)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of Object.keys(source)) {
|
||||||
|
if (key === "__proto__") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNonNullObject(target[key])) {
|
||||||
|
mergeWithoutOverwrite(target[key], source[key]);
|
||||||
|
} else if (target[key] === void 0) {
|
||||||
|
if (isNonNullObject(source[key])) {
|
||||||
|
target[key] = Array.isArray(source[key]) ? [] : {};
|
||||||
|
mergeWithoutOverwrite(target[key], source[key]);
|
||||||
|
} else if (source[key] !== void 0) {
|
||||||
|
target[key] = source[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error for plugin conflicts.
|
||||||
|
*/
|
||||||
|
class PluginConflictError extends Error {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize this error object.
|
||||||
|
* @param {string} pluginId The plugin ID.
|
||||||
|
* @param {{filePath:string, importerName:string}[]} plugins The resolved plugins.
|
||||||
|
*/
|
||||||
|
constructor(pluginId, plugins) {
|
||||||
|
super(`Plugin "${pluginId}" was conflicted between ${plugins.map(p => `"${p.importerName}"`).join(" and ")}.`);
|
||||||
|
this.messageTemplate = "plugin-conflict";
|
||||||
|
this.messageData = { pluginId, plugins };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge plugins.
|
||||||
|
* `target`'s definition is prior to `source`'s.
|
||||||
|
* @param {Record<string, DependentPlugin>} target The destination to merge
|
||||||
|
* @param {Record<string, DependentPlugin>|undefined} source The source to merge.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function mergePlugins(target, source) {
|
||||||
|
if (!isNonNullObject(source)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of Object.keys(source)) {
|
||||||
|
if (key === "__proto__") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const targetValue = target[key];
|
||||||
|
const sourceValue = source[key];
|
||||||
|
|
||||||
|
// Adopt the plugin which was found at first.
|
||||||
|
if (targetValue === void 0) {
|
||||||
|
if (sourceValue.error) {
|
||||||
|
throw sourceValue.error;
|
||||||
|
}
|
||||||
|
target[key] = sourceValue;
|
||||||
|
} else if (sourceValue.filePath !== targetValue.filePath) {
|
||||||
|
throw new PluginConflictError(key, [
|
||||||
|
{
|
||||||
|
filePath: targetValue.filePath,
|
||||||
|
importerName: targetValue.importerName
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filePath: sourceValue.filePath,
|
||||||
|
importerName: sourceValue.importerName
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge rule configs.
|
||||||
|
* `target`'s definition is prior to `source`'s.
|
||||||
|
* @param {Record<string, Array>} target The destination to merge
|
||||||
|
* @param {Record<string, RuleConf>|undefined} source The source to merge.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function mergeRuleConfigs(target, source) {
|
||||||
|
if (!isNonNullObject(source)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of Object.keys(source)) {
|
||||||
|
if (key === "__proto__") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const targetDef = target[key];
|
||||||
|
const sourceDef = source[key];
|
||||||
|
|
||||||
|
// Adopt the rule config which was found at first.
|
||||||
|
if (targetDef === void 0) {
|
||||||
|
if (Array.isArray(sourceDef)) {
|
||||||
|
target[key] = [...sourceDef];
|
||||||
|
} else {
|
||||||
|
target[key] = [sourceDef];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the first found rule config is severity only and the current rule
|
||||||
|
* config has options, merge the severity and the options.
|
||||||
|
*/
|
||||||
|
} else if (
|
||||||
|
targetDef.length === 1 &&
|
||||||
|
Array.isArray(sourceDef) &&
|
||||||
|
sourceDef.length >= 2
|
||||||
|
) {
|
||||||
|
targetDef.push(...sourceDef.slice(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the extracted config.
|
||||||
|
* @param {ConfigArray} instance The config elements.
|
||||||
|
* @param {number[]} indices The indices to use.
|
||||||
|
* @returns {ExtractedConfig} The extracted config.
|
||||||
|
*/
|
||||||
|
function createConfig(instance, indices) {
|
||||||
|
const config = new ExtractedConfig();
|
||||||
|
const ignorePatterns = [];
|
||||||
|
|
||||||
|
// Merge elements.
|
||||||
|
for (const index of indices) {
|
||||||
|
const element = instance[index];
|
||||||
|
|
||||||
|
// Adopt the parser which was found at first.
|
||||||
|
if (!config.parser && element.parser) {
|
||||||
|
if (element.parser.error) {
|
||||||
|
throw element.parser.error;
|
||||||
|
}
|
||||||
|
config.parser = element.parser;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adopt the processor which was found at first.
|
||||||
|
if (!config.processor && element.processor) {
|
||||||
|
config.processor = element.processor;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adopt the noInlineConfig which was found at first.
|
||||||
|
if (config.noInlineConfig === void 0 && element.noInlineConfig !== void 0) {
|
||||||
|
config.noInlineConfig = element.noInlineConfig;
|
||||||
|
config.configNameOfNoInlineConfig = element.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adopt the reportUnusedDisableDirectives which was found at first.
|
||||||
|
if (config.reportUnusedDisableDirectives === void 0 && element.reportUnusedDisableDirectives !== void 0) {
|
||||||
|
config.reportUnusedDisableDirectives = element.reportUnusedDisableDirectives;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect ignorePatterns
|
||||||
|
if (element.ignorePattern) {
|
||||||
|
ignorePatterns.push(element.ignorePattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merge others.
|
||||||
|
mergeWithoutOverwrite(config.env, element.env);
|
||||||
|
mergeWithoutOverwrite(config.globals, element.globals);
|
||||||
|
mergeWithoutOverwrite(config.parserOptions, element.parserOptions);
|
||||||
|
mergeWithoutOverwrite(config.settings, element.settings);
|
||||||
|
mergePlugins(config.plugins, element.plugins);
|
||||||
|
mergeRuleConfigs(config.rules, element.rules);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the predicate function for ignore patterns.
|
||||||
|
if (ignorePatterns.length > 0) {
|
||||||
|
config.ignores = IgnorePattern.createIgnore(ignorePatterns.reverse());
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collect definitions.
|
||||||
|
* @template T, U
|
||||||
|
* @param {string} pluginId The plugin ID for prefix.
|
||||||
|
* @param {Record<string,T>} defs The definitions to collect.
|
||||||
|
* @param {Map<string, U>} map The map to output.
|
||||||
|
* @param {function(T): U} [normalize] The normalize function for each value.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function collect(pluginId, defs, map, normalize) {
|
||||||
|
if (defs) {
|
||||||
|
const prefix = pluginId && `${pluginId}/`;
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(defs)) {
|
||||||
|
map.set(
|
||||||
|
`${prefix}${key}`,
|
||||||
|
normalize ? normalize(value) : value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize a rule definition.
|
||||||
|
* @param {Function|Rule} rule The rule definition to normalize.
|
||||||
|
* @returns {Rule} The normalized rule definition.
|
||||||
|
*/
|
||||||
|
function normalizePluginRule(rule) {
|
||||||
|
return typeof rule === "function" ? { create: rule } : rule;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete the mutation methods from a given map.
|
||||||
|
* @param {Map<any, any>} map The map object to delete.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function deleteMutationMethods(map) {
|
||||||
|
Object.defineProperties(map, {
|
||||||
|
clear: { configurable: true, value: void 0 },
|
||||||
|
delete: { configurable: true, value: void 0 },
|
||||||
|
set: { configurable: true, value: void 0 }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array.
|
||||||
|
* @param {ConfigArrayElement[]} elements The config elements.
|
||||||
|
* @param {ConfigArrayInternalSlots} slots The internal slots.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function initPluginMemberMaps(elements, slots) {
|
||||||
|
const processed = new Set();
|
||||||
|
|
||||||
|
slots.envMap = new Map();
|
||||||
|
slots.processorMap = new Map();
|
||||||
|
slots.ruleMap = new Map();
|
||||||
|
|
||||||
|
for (const element of elements) {
|
||||||
|
if (!element.plugins) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [pluginId, value] of Object.entries(element.plugins)) {
|
||||||
|
const plugin = value.definition;
|
||||||
|
|
||||||
|
if (!plugin || processed.has(pluginId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
processed.add(pluginId);
|
||||||
|
|
||||||
|
collect(pluginId, plugin.environments, slots.envMap);
|
||||||
|
collect(pluginId, plugin.processors, slots.processorMap);
|
||||||
|
collect(pluginId, plugin.rules, slots.ruleMap, normalizePluginRule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteMutationMethods(slots.envMap);
|
||||||
|
deleteMutationMethods(slots.processorMap);
|
||||||
|
deleteMutationMethods(slots.ruleMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array.
|
||||||
|
* @param {ConfigArray} instance The config elements.
|
||||||
|
* @returns {ConfigArrayInternalSlots} The extracted config.
|
||||||
|
*/
|
||||||
|
function ensurePluginMemberMaps(instance) {
|
||||||
|
const slots = internalSlotsMap.get(instance);
|
||||||
|
|
||||||
|
if (!slots.ruleMap) {
|
||||||
|
initPluginMemberMaps(instance, slots);
|
||||||
|
}
|
||||||
|
|
||||||
|
return slots;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Config Array.
|
||||||
|
*
|
||||||
|
* `ConfigArray` instance contains all settings, parsers, and plugins.
|
||||||
|
* You need to call `ConfigArray#extractConfig(filePath)` method in order to
|
||||||
|
* extract, merge and get only the config data which is related to an arbitrary
|
||||||
|
* file.
|
||||||
|
* @extends {Array<ConfigArrayElement>}
|
||||||
|
*/
|
||||||
|
class ConfigArray extends Array {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin environments.
|
||||||
|
* The returned map cannot be mutated.
|
||||||
|
* @type {ReadonlyMap<string, Environment>} The plugin environments.
|
||||||
|
*/
|
||||||
|
get pluginEnvironments() {
|
||||||
|
return ensurePluginMemberMaps(this).envMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin processors.
|
||||||
|
* The returned map cannot be mutated.
|
||||||
|
* @type {ReadonlyMap<string, Processor>} The plugin processors.
|
||||||
|
*/
|
||||||
|
get pluginProcessors() {
|
||||||
|
return ensurePluginMemberMaps(this).processorMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin rules.
|
||||||
|
* The returned map cannot be mutated.
|
||||||
|
* @returns {ReadonlyMap<string, Rule>} The plugin rules.
|
||||||
|
*/
|
||||||
|
get pluginRules() {
|
||||||
|
return ensurePluginMemberMaps(this).ruleMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this config has `root` flag.
|
||||||
|
* @returns {boolean} `true` if this config array is root.
|
||||||
|
*/
|
||||||
|
isRoot() {
|
||||||
|
for (let i = this.length - 1; i >= 0; --i) {
|
||||||
|
const root = this[i].root;
|
||||||
|
|
||||||
|
if (typeof root === "boolean") {
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the config data which is related to a given file.
|
||||||
|
* @param {string} filePath The absolute path to the target file.
|
||||||
|
* @returns {ExtractedConfig} The extracted config data.
|
||||||
|
*/
|
||||||
|
extractConfig(filePath) {
|
||||||
|
const { cache } = internalSlotsMap.get(this);
|
||||||
|
const indices = getMatchedIndices(this, filePath);
|
||||||
|
const cacheKey = indices.join(",");
|
||||||
|
|
||||||
|
if (!cache.has(cacheKey)) {
|
||||||
|
cache.set(cacheKey, createConfig(this, indices));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cache.get(cacheKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a given path is an additional lint target.
|
||||||
|
* @param {string} filePath The absolute path to the target file.
|
||||||
|
* @returns {boolean} `true` if the file is an additional lint target.
|
||||||
|
*/
|
||||||
|
isAdditionalTargetPath(filePath) {
|
||||||
|
for (const { criteria, type } of this) {
|
||||||
|
if (
|
||||||
|
type === "config" &&
|
||||||
|
criteria &&
|
||||||
|
!criteria.endsWithWildcard &&
|
||||||
|
criteria.test(filePath)
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the used extracted configs.
|
||||||
|
* CLIEngine will use this method to collect used deprecated rules.
|
||||||
|
* @param {ConfigArray} instance The config array object to get.
|
||||||
|
* @returns {ExtractedConfig[]} The used extracted configs.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function getUsedExtractedConfigs(instance) {
|
||||||
|
const { cache } = internalSlotsMap.get(instance);
|
||||||
|
|
||||||
|
return Array.from(cache.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
ConfigArray,
|
||||||
|
getUsedExtractedConfigs
|
||||||
|
};
|
115
node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
generated
vendored
Normal file
115
node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
generated
vendored
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview `ConfigDependency` class.
|
||||||
|
*
|
||||||
|
* `ConfigDependency` class expresses a loaded parser or plugin.
|
||||||
|
*
|
||||||
|
* If the parser or plugin was loaded successfully, it has `definition` property
|
||||||
|
* and `filePath` property. Otherwise, it has `error` property.
|
||||||
|
*
|
||||||
|
* When `JSON.stringify()` converted a `ConfigDependency` object to a JSON, it
|
||||||
|
* omits `definition` property.
|
||||||
|
*
|
||||||
|
* `ConfigArrayFactory` creates `ConfigDependency` objects when it loads parsers
|
||||||
|
* or plugins.
|
||||||
|
*
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
import util from "util";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class is to store parsers or plugins.
|
||||||
|
* This class hides the loaded object from `JSON.stringify()` and `console.log`.
|
||||||
|
* @template T
|
||||||
|
*/
|
||||||
|
class ConfigDependency {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize this instance.
|
||||||
|
* @param {Object} data The dependency data.
|
||||||
|
* @param {T} [data.definition] The dependency if the loading succeeded.
|
||||||
|
* @param {Error} [data.error] The error object if the loading failed.
|
||||||
|
* @param {string} [data.filePath] The actual path to the dependency if the loading succeeded.
|
||||||
|
* @param {string} data.id The ID of this dependency.
|
||||||
|
* @param {string} data.importerName The name of the config file which loads this dependency.
|
||||||
|
* @param {string} data.importerPath The path to the config file which loads this dependency.
|
||||||
|
*/
|
||||||
|
constructor({
|
||||||
|
definition = null,
|
||||||
|
error = null,
|
||||||
|
filePath = null,
|
||||||
|
id,
|
||||||
|
importerName,
|
||||||
|
importerPath
|
||||||
|
}) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The loaded dependency if the loading succeeded.
|
||||||
|
* @type {T|null}
|
||||||
|
*/
|
||||||
|
this.definition = definition;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error object if the loading failed.
|
||||||
|
* @type {Error|null}
|
||||||
|
*/
|
||||||
|
this.error = error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The loaded dependency if the loading succeeded.
|
||||||
|
* @type {string|null}
|
||||||
|
*/
|
||||||
|
this.filePath = filePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ID of this dependency.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
this.id = id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the config file which loads this dependency.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
this.importerName = importerName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The path to the config file which loads this dependency.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
this.importerPath = importerPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @returns {Object} a JSON compatible object.
|
||||||
|
*/
|
||||||
|
toJSON() {
|
||||||
|
const obj = this[util.inspect.custom]();
|
||||||
|
|
||||||
|
// Display `error.message` (`Error#message` is unenumerable).
|
||||||
|
if (obj.error instanceof Error) {
|
||||||
|
obj.error = { ...obj.error, message: obj.error.message };
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @returns {Object} an object to display by `console.log()`.
|
||||||
|
*/
|
||||||
|
[util.inspect.custom]() {
|
||||||
|
const {
|
||||||
|
definition: _ignore, // eslint-disable-line no-unused-vars
|
||||||
|
...obj
|
||||||
|
} = this;
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @typedef {ConfigDependency<import("../../shared/types").Parser>} DependentParser */
|
||||||
|
/** @typedef {ConfigDependency<import("../../shared/types").Plugin>} DependentPlugin */
|
||||||
|
|
||||||
|
export { ConfigDependency };
|
145
node_modules/@eslint/eslintrc/lib/config-array/extracted-config.js
generated
vendored
Normal file
145
node_modules/@eslint/eslintrc/lib/config-array/extracted-config.js
generated
vendored
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview `ExtractedConfig` class.
|
||||||
|
*
|
||||||
|
* `ExtractedConfig` class expresses a final configuration for a specific file.
|
||||||
|
*
|
||||||
|
* It provides one method.
|
||||||
|
*
|
||||||
|
* - `toCompatibleObjectAsConfigFileContent()`
|
||||||
|
* Convert this configuration to the compatible object as the content of
|
||||||
|
* config files. It converts the loaded parser and plugins to strings.
|
||||||
|
* `CLIEngine#getConfigForFile(filePath)` method uses this method.
|
||||||
|
*
|
||||||
|
* `ConfigArray#extractConfig(filePath)` creates a `ExtractedConfig` instance.
|
||||||
|
*
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { IgnorePattern } from "./ignore-pattern.js";
|
||||||
|
|
||||||
|
// For VSCode intellisense
|
||||||
|
/** @typedef {import("../../shared/types").ConfigData} ConfigData */
|
||||||
|
/** @typedef {import("../../shared/types").GlobalConf} GlobalConf */
|
||||||
|
/** @typedef {import("../../shared/types").SeverityConf} SeverityConf */
|
||||||
|
/** @typedef {import("./config-dependency").DependentParser} DependentParser */
|
||||||
|
/** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if `xs` starts with `ys`.
|
||||||
|
* @template T
|
||||||
|
* @param {T[]} xs The array to check.
|
||||||
|
* @param {T[]} ys The array that may be the first part of `xs`.
|
||||||
|
* @returns {boolean} `true` if `xs` starts with `ys`.
|
||||||
|
*/
|
||||||
|
function startsWith(xs, ys) {
|
||||||
|
return xs.length >= ys.length && ys.every((y, i) => y === xs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class for extracted config data.
|
||||||
|
*/
|
||||||
|
class ExtractedConfig {
|
||||||
|
constructor() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The config name what `noInlineConfig` setting came from.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
this.configNameOfNoInlineConfig = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Environments.
|
||||||
|
* @type {Record<string, boolean>}
|
||||||
|
*/
|
||||||
|
this.env = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global variables.
|
||||||
|
* @type {Record<string, GlobalConf>}
|
||||||
|
*/
|
||||||
|
this.globals = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The glob patterns that ignore to lint.
|
||||||
|
* @type {(((filePath:string, dot?:boolean) => boolean) & { basePath:string; patterns:string[] }) | undefined}
|
||||||
|
*/
|
||||||
|
this.ignores = void 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The flag that disables directive comments.
|
||||||
|
* @type {boolean|undefined}
|
||||||
|
*/
|
||||||
|
this.noInlineConfig = void 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parser definition.
|
||||||
|
* @type {DependentParser|null}
|
||||||
|
*/
|
||||||
|
this.parser = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options for the parser.
|
||||||
|
* @type {Object}
|
||||||
|
*/
|
||||||
|
this.parserOptions = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin definitions.
|
||||||
|
* @type {Record<string, DependentPlugin>}
|
||||||
|
*/
|
||||||
|
this.plugins = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processor ID.
|
||||||
|
* @type {string|null}
|
||||||
|
*/
|
||||||
|
this.processor = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The flag that reports unused `eslint-disable` directive comments.
|
||||||
|
* @type {boolean|undefined}
|
||||||
|
*/
|
||||||
|
this.reportUnusedDisableDirectives = void 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rule settings.
|
||||||
|
* @type {Record<string, [SeverityConf, ...any[]]>}
|
||||||
|
*/
|
||||||
|
this.rules = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shared settings.
|
||||||
|
* @type {Object}
|
||||||
|
*/
|
||||||
|
this.settings = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert this config to the compatible object as a config file content.
|
||||||
|
* @returns {ConfigData} The converted object.
|
||||||
|
*/
|
||||||
|
toCompatibleObjectAsConfigFileContent() {
|
||||||
|
const {
|
||||||
|
/* eslint-disable no-unused-vars */
|
||||||
|
configNameOfNoInlineConfig: _ignore1,
|
||||||
|
processor: _ignore2,
|
||||||
|
/* eslint-enable no-unused-vars */
|
||||||
|
ignores,
|
||||||
|
...config
|
||||||
|
} = this;
|
||||||
|
|
||||||
|
config.parser = config.parser && config.parser.filePath;
|
||||||
|
config.plugins = Object.keys(config.plugins).filter(Boolean).reverse();
|
||||||
|
config.ignorePatterns = ignores ? ignores.patterns : [];
|
||||||
|
|
||||||
|
// Strip the default patterns from `ignorePatterns`.
|
||||||
|
if (startsWith(config.ignorePatterns, IgnorePattern.DefaultPatterns)) {
|
||||||
|
config.ignorePatterns =
|
||||||
|
config.ignorePatterns.slice(IgnorePattern.DefaultPatterns.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { ExtractedConfig };
|
238
node_modules/@eslint/eslintrc/lib/config-array/ignore-pattern.js
generated
vendored
Normal file
238
node_modules/@eslint/eslintrc/lib/config-array/ignore-pattern.js
generated
vendored
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview `IgnorePattern` class.
|
||||||
|
*
|
||||||
|
* `IgnorePattern` class has the set of glob patterns and the base path.
|
||||||
|
*
|
||||||
|
* It provides two static methods.
|
||||||
|
*
|
||||||
|
* - `IgnorePattern.createDefaultIgnore(cwd)`
|
||||||
|
* Create the default predicate function.
|
||||||
|
* - `IgnorePattern.createIgnore(ignorePatterns)`
|
||||||
|
* Create the predicate function from multiple `IgnorePattern` objects.
|
||||||
|
*
|
||||||
|
* It provides two properties and a method.
|
||||||
|
*
|
||||||
|
* - `patterns`
|
||||||
|
* The glob patterns that ignore to lint.
|
||||||
|
* - `basePath`
|
||||||
|
* The base path of the glob patterns. If absolute paths existed in the
|
||||||
|
* glob patterns, those are handled as relative paths to the base path.
|
||||||
|
* - `getPatternsRelativeTo(basePath)`
|
||||||
|
* Get `patterns` as modified for a given base path. It modifies the
|
||||||
|
* absolute paths in the patterns as prepending the difference of two base
|
||||||
|
* paths.
|
||||||
|
*
|
||||||
|
* `ConfigArrayFactory` creates `IgnorePattern` objects when it processes
|
||||||
|
* `ignorePatterns` properties.
|
||||||
|
*
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import assert from "assert";
|
||||||
|
import path from "path";
|
||||||
|
import ignore from "ignore";
|
||||||
|
import debugOrig from "debug";
|
||||||
|
|
||||||
|
const debug = debugOrig("eslintrc:ignore-pattern");
|
||||||
|
|
||||||
|
/** @typedef {ReturnType<import("ignore").default>} Ignore */
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to the common ancestor directory of given paths.
|
||||||
|
* @param {string[]} sourcePaths The paths to calculate the common ancestor.
|
||||||
|
* @returns {string} The path to the common ancestor directory.
|
||||||
|
*/
|
||||||
|
function getCommonAncestorPath(sourcePaths) {
|
||||||
|
let result = sourcePaths[0];
|
||||||
|
|
||||||
|
for (let i = 1; i < sourcePaths.length; ++i) {
|
||||||
|
const a = result;
|
||||||
|
const b = sourcePaths[i];
|
||||||
|
|
||||||
|
// Set the shorter one (it's the common ancestor if one includes the other).
|
||||||
|
result = a.length < b.length ? a : b;
|
||||||
|
|
||||||
|
// Set the common ancestor.
|
||||||
|
for (let j = 0, lastSepPos = 0; j < a.length && j < b.length; ++j) {
|
||||||
|
if (a[j] !== b[j]) {
|
||||||
|
result = a.slice(0, lastSepPos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (a[j] === path.sep) {
|
||||||
|
lastSepPos = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let resolvedResult = result || path.sep;
|
||||||
|
|
||||||
|
// if Windows common ancestor is root of drive must have trailing slash to be absolute.
|
||||||
|
if (resolvedResult && resolvedResult.endsWith(":") && process.platform === "win32") {
|
||||||
|
resolvedResult += path.sep;
|
||||||
|
}
|
||||||
|
return resolvedResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make relative path.
|
||||||
|
* @param {string} from The source path to get relative path.
|
||||||
|
* @param {string} to The destination path to get relative path.
|
||||||
|
* @returns {string} The relative path.
|
||||||
|
*/
|
||||||
|
function relative(from, to) {
|
||||||
|
const relPath = path.relative(from, to);
|
||||||
|
|
||||||
|
if (path.sep === "/") {
|
||||||
|
return relPath;
|
||||||
|
}
|
||||||
|
return relPath.split(path.sep).join("/");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the trailing slash if existed.
|
||||||
|
* @param {string} filePath The path to check.
|
||||||
|
* @returns {string} The trailing slash if existed.
|
||||||
|
*/
|
||||||
|
function dirSuffix(filePath) {
|
||||||
|
const isDir = (
|
||||||
|
filePath.endsWith(path.sep) ||
|
||||||
|
(process.platform === "win32" && filePath.endsWith("/"))
|
||||||
|
);
|
||||||
|
|
||||||
|
return isDir ? "/" : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const DefaultPatterns = Object.freeze(["/**/node_modules/*"]);
|
||||||
|
const DotPatterns = Object.freeze([".*", "!.eslintrc.*", "!../"]);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class IgnorePattern {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default patterns.
|
||||||
|
* @type {string[]}
|
||||||
|
*/
|
||||||
|
static get DefaultPatterns() {
|
||||||
|
return DefaultPatterns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the default predicate function.
|
||||||
|
* @param {string} cwd The current working directory.
|
||||||
|
* @returns {((filePath:string, dot:boolean) => boolean) & {basePath:string; patterns:string[]}}
|
||||||
|
* The preficate function.
|
||||||
|
* The first argument is an absolute path that is checked.
|
||||||
|
* The second argument is the flag to not ignore dotfiles.
|
||||||
|
* If the predicate function returned `true`, it means the path should be ignored.
|
||||||
|
*/
|
||||||
|
static createDefaultIgnore(cwd) {
|
||||||
|
return this.createIgnore([new IgnorePattern(DefaultPatterns, cwd)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the predicate function from multiple `IgnorePattern` objects.
|
||||||
|
* @param {IgnorePattern[]} ignorePatterns The list of ignore patterns.
|
||||||
|
* @returns {((filePath:string, dot?:boolean) => boolean) & {basePath:string; patterns:string[]}}
|
||||||
|
* The preficate function.
|
||||||
|
* The first argument is an absolute path that is checked.
|
||||||
|
* The second argument is the flag to not ignore dotfiles.
|
||||||
|
* If the predicate function returned `true`, it means the path should be ignored.
|
||||||
|
*/
|
||||||
|
static createIgnore(ignorePatterns) {
|
||||||
|
debug("Create with: %o", ignorePatterns);
|
||||||
|
|
||||||
|
const basePath = getCommonAncestorPath(ignorePatterns.map(p => p.basePath));
|
||||||
|
const patterns = [].concat(
|
||||||
|
...ignorePatterns.map(p => p.getPatternsRelativeTo(basePath))
|
||||||
|
);
|
||||||
|
const ig = ignore({ allowRelativePaths: true }).add([...DotPatterns, ...patterns]);
|
||||||
|
const dotIg = ignore({ allowRelativePaths: true }).add(patterns);
|
||||||
|
|
||||||
|
debug(" processed: %o", { basePath, patterns });
|
||||||
|
|
||||||
|
return Object.assign(
|
||||||
|
(filePath, dot = false) => {
|
||||||
|
assert(path.isAbsolute(filePath), "'filePath' should be an absolute path.");
|
||||||
|
const relPathRaw = relative(basePath, filePath);
|
||||||
|
const relPath = relPathRaw && (relPathRaw + dirSuffix(filePath));
|
||||||
|
const adoptedIg = dot ? dotIg : ig;
|
||||||
|
const result = relPath !== "" && adoptedIg.ignores(relPath);
|
||||||
|
|
||||||
|
debug("Check", { filePath, dot, relativePath: relPath, result });
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
{ basePath, patterns }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize a new `IgnorePattern` instance.
|
||||||
|
* @param {string[]} patterns The glob patterns that ignore to lint.
|
||||||
|
* @param {string} basePath The base path of `patterns`.
|
||||||
|
*/
|
||||||
|
constructor(patterns, basePath) {
|
||||||
|
assert(path.isAbsolute(basePath), "'basePath' should be an absolute path.");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The glob patterns that ignore to lint.
|
||||||
|
* @type {string[]}
|
||||||
|
*/
|
||||||
|
this.patterns = patterns;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base path of `patterns`.
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
this.basePath = basePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If `true` then patterns which don't start with `/` will match the paths to the outside of `basePath`. Defaults to `false`.
|
||||||
|
*
|
||||||
|
* It's set `true` for `.eslintignore`, `package.json`, and `--ignore-path` for backward compatibility.
|
||||||
|
* It's `false` as-is for `ignorePatterns` property in config files.
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
this.loose = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get `patterns` as modified for a given base path. It modifies the
|
||||||
|
* absolute paths in the patterns as prepending the difference of two base
|
||||||
|
* paths.
|
||||||
|
* @param {string} newBasePath The base path.
|
||||||
|
* @returns {string[]} Modifired patterns.
|
||||||
|
*/
|
||||||
|
getPatternsRelativeTo(newBasePath) {
|
||||||
|
assert(path.isAbsolute(newBasePath), "'newBasePath' should be an absolute path.");
|
||||||
|
const { basePath, loose, patterns } = this;
|
||||||
|
|
||||||
|
if (newBasePath === basePath) {
|
||||||
|
return patterns;
|
||||||
|
}
|
||||||
|
const prefix = `/${relative(newBasePath, basePath)}`;
|
||||||
|
|
||||||
|
return patterns.map(pattern => {
|
||||||
|
const negative = pattern.startsWith("!");
|
||||||
|
const head = negative ? "!" : "";
|
||||||
|
const body = negative ? pattern.slice(1) : pattern;
|
||||||
|
|
||||||
|
if (body.startsWith("/") || body.startsWith("../")) {
|
||||||
|
return `${head}${prefix}${body}`;
|
||||||
|
}
|
||||||
|
return loose ? pattern : `${head}${prefix}/**/${body}`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { IgnorePattern };
|
19
node_modules/@eslint/eslintrc/lib/config-array/index.js
generated
vendored
Normal file
19
node_modules/@eslint/eslintrc/lib/config-array/index.js
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview `ConfigArray` class.
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { ConfigArray, getUsedExtractedConfigs } from "./config-array.js";
|
||||||
|
import { ConfigDependency } from "./config-dependency.js";
|
||||||
|
import { ExtractedConfig } from "./extracted-config.js";
|
||||||
|
import { IgnorePattern } from "./ignore-pattern.js";
|
||||||
|
import { OverrideTester } from "./override-tester.js";
|
||||||
|
|
||||||
|
export {
|
||||||
|
ConfigArray,
|
||||||
|
ConfigDependency,
|
||||||
|
ExtractedConfig,
|
||||||
|
IgnorePattern,
|
||||||
|
OverrideTester,
|
||||||
|
getUsedExtractedConfigs
|
||||||
|
};
|
225
node_modules/@eslint/eslintrc/lib/config-array/override-tester.js
generated
vendored
Normal file
225
node_modules/@eslint/eslintrc/lib/config-array/override-tester.js
generated
vendored
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview `OverrideTester` class.
|
||||||
|
*
|
||||||
|
* `OverrideTester` class handles `files` property and `excludedFiles` property
|
||||||
|
* of `overrides` config.
|
||||||
|
*
|
||||||
|
* It provides one method.
|
||||||
|
*
|
||||||
|
* - `test(filePath)`
|
||||||
|
* Test if a file path matches the pair of `files` property and
|
||||||
|
* `excludedFiles` property. The `filePath` argument must be an absolute
|
||||||
|
* path.
|
||||||
|
*
|
||||||
|
* `ConfigArrayFactory` creates `OverrideTester` objects when it processes
|
||||||
|
* `overrides` properties.
|
||||||
|
*
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
import assert from "assert";
|
||||||
|
import path from "path";
|
||||||
|
import util from "util";
|
||||||
|
import minimatch from "minimatch";
|
||||||
|
|
||||||
|
const { Minimatch } = minimatch;
|
||||||
|
|
||||||
|
const minimatchOpts = { dot: true, matchBase: true };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Pattern
|
||||||
|
* @property {InstanceType<Minimatch>[] | null} includes The positive matchers.
|
||||||
|
* @property {InstanceType<Minimatch>[] | null} excludes The negative matchers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize a given pattern to an array.
|
||||||
|
* @param {string|string[]|undefined} patterns A glob pattern or an array of glob patterns.
|
||||||
|
* @returns {string[]|null} Normalized patterns.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function normalizePatterns(patterns) {
|
||||||
|
if (Array.isArray(patterns)) {
|
||||||
|
return patterns.filter(Boolean);
|
||||||
|
}
|
||||||
|
if (typeof patterns === "string" && patterns) {
|
||||||
|
return [patterns];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the matchers of given patterns.
|
||||||
|
* @param {string[]} patterns The patterns.
|
||||||
|
* @returns {InstanceType<Minimatch>[] | null} The matchers.
|
||||||
|
*/
|
||||||
|
function toMatcher(patterns) {
|
||||||
|
if (patterns.length === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return patterns.map(pattern => {
|
||||||
|
if (/^\.[/\\]/u.test(pattern)) {
|
||||||
|
return new Minimatch(
|
||||||
|
pattern.slice(2),
|
||||||
|
|
||||||
|
// `./*.js` should not match with `subdir/foo.js`
|
||||||
|
{ ...minimatchOpts, matchBase: false }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return new Minimatch(pattern, minimatchOpts);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a given matcher to string.
|
||||||
|
* @param {Pattern} matchers The matchers.
|
||||||
|
* @returns {string} The string expression of the matcher.
|
||||||
|
*/
|
||||||
|
function patternToJson({ includes, excludes }) {
|
||||||
|
return {
|
||||||
|
includes: includes && includes.map(m => m.pattern),
|
||||||
|
excludes: excludes && excludes.map(m => m.pattern)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class to test given paths are matched by the patterns.
|
||||||
|
*/
|
||||||
|
class OverrideTester {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a tester with given criteria.
|
||||||
|
* If there are no criteria, returns `null`.
|
||||||
|
* @param {string|string[]} files The glob patterns for included files.
|
||||||
|
* @param {string|string[]} excludedFiles The glob patterns for excluded files.
|
||||||
|
* @param {string} basePath The path to the base directory to test paths.
|
||||||
|
* @returns {OverrideTester|null} The created instance or `null`.
|
||||||
|
*/
|
||||||
|
static create(files, excludedFiles, basePath) {
|
||||||
|
const includePatterns = normalizePatterns(files);
|
||||||
|
const excludePatterns = normalizePatterns(excludedFiles);
|
||||||
|
let endsWithWildcard = false;
|
||||||
|
|
||||||
|
if (includePatterns.length === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rejects absolute paths or relative paths to parents.
|
||||||
|
for (const pattern of includePatterns) {
|
||||||
|
if (path.isAbsolute(pattern) || pattern.includes("..")) {
|
||||||
|
throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`);
|
||||||
|
}
|
||||||
|
if (pattern.endsWith("*")) {
|
||||||
|
endsWithWildcard = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const pattern of excludePatterns) {
|
||||||
|
if (path.isAbsolute(pattern) || pattern.includes("..")) {
|
||||||
|
throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const includes = toMatcher(includePatterns);
|
||||||
|
const excludes = toMatcher(excludePatterns);
|
||||||
|
|
||||||
|
return new OverrideTester(
|
||||||
|
[{ includes, excludes }],
|
||||||
|
basePath,
|
||||||
|
endsWithWildcard
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Combine two testers by logical and.
|
||||||
|
* If either of the testers was `null`, returns the other tester.
|
||||||
|
* The `basePath` property of the two must be the same value.
|
||||||
|
* @param {OverrideTester|null} a A tester.
|
||||||
|
* @param {OverrideTester|null} b Another tester.
|
||||||
|
* @returns {OverrideTester|null} Combined tester.
|
||||||
|
*/
|
||||||
|
static and(a, b) {
|
||||||
|
if (!b) {
|
||||||
|
return a && new OverrideTester(
|
||||||
|
a.patterns,
|
||||||
|
a.basePath,
|
||||||
|
a.endsWithWildcard
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!a) {
|
||||||
|
return new OverrideTester(
|
||||||
|
b.patterns,
|
||||||
|
b.basePath,
|
||||||
|
b.endsWithWildcard
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.strictEqual(a.basePath, b.basePath);
|
||||||
|
return new OverrideTester(
|
||||||
|
a.patterns.concat(b.patterns),
|
||||||
|
a.basePath,
|
||||||
|
a.endsWithWildcard || b.endsWithWildcard
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize this instance.
|
||||||
|
* @param {Pattern[]} patterns The matchers.
|
||||||
|
* @param {string} basePath The base path.
|
||||||
|
* @param {boolean} endsWithWildcard If `true` then a pattern ends with `*`.
|
||||||
|
*/
|
||||||
|
constructor(patterns, basePath, endsWithWildcard = false) {
|
||||||
|
|
||||||
|
/** @type {Pattern[]} */
|
||||||
|
this.patterns = patterns;
|
||||||
|
|
||||||
|
/** @type {string} */
|
||||||
|
this.basePath = basePath;
|
||||||
|
|
||||||
|
/** @type {boolean} */
|
||||||
|
this.endsWithWildcard = endsWithWildcard;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if a given path is matched or not.
|
||||||
|
* @param {string} filePath The absolute path to the target file.
|
||||||
|
* @returns {boolean} `true` if the path was matched.
|
||||||
|
*/
|
||||||
|
test(filePath) {
|
||||||
|
if (typeof filePath !== "string" || !path.isAbsolute(filePath)) {
|
||||||
|
throw new Error(`'filePath' should be an absolute path, but got ${filePath}.`);
|
||||||
|
}
|
||||||
|
const relativePath = path.relative(this.basePath, filePath);
|
||||||
|
|
||||||
|
return this.patterns.every(({ includes, excludes }) => (
|
||||||
|
(!includes || includes.some(m => m.match(relativePath))) &&
|
||||||
|
(!excludes || !excludes.some(m => m.match(relativePath)))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @returns {Object} a JSON compatible object.
|
||||||
|
*/
|
||||||
|
toJSON() {
|
||||||
|
if (this.patterns.length === 1) {
|
||||||
|
return {
|
||||||
|
...patternToJson(this.patterns[0]),
|
||||||
|
basePath: this.basePath
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
AND: this.patterns.map(patternToJson),
|
||||||
|
basePath: this.basePath
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @returns {Object} an object to display by `console.log()`.
|
||||||
|
*/
|
||||||
|
[util.inspect.custom]() {
|
||||||
|
return this.toJSON();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { OverrideTester };
|
307
node_modules/@eslint/eslintrc/lib/flat-compat.js
generated
vendored
Normal file
307
node_modules/@eslint/eslintrc/lib/flat-compat.js
generated
vendored
Normal file
|
@ -0,0 +1,307 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Compatibility class for flat config.
|
||||||
|
* @author Nicholas C. Zakas
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import createDebug from "debug";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
import environments from "../conf/environments.js";
|
||||||
|
import { ConfigArrayFactory } from "./config-array-factory.js";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** @typedef {import("../../shared/types").Environment} Environment */
|
||||||
|
/** @typedef {import("../../shared/types").Processor} Processor */
|
||||||
|
|
||||||
|
const debug = createDebug("eslintrc:flat-compat");
|
||||||
|
const cafactory = Symbol("cafactory");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates an ESLintRC-style config object into a flag-config-style config
|
||||||
|
* object.
|
||||||
|
* @param {Object} eslintrcConfig An ESLintRC-style config object.
|
||||||
|
* @param {Object} options Options to help translate the config.
|
||||||
|
* @param {string} options.resolveConfigRelativeTo To the directory to resolve
|
||||||
|
* configs from.
|
||||||
|
* @param {string} options.resolvePluginsRelativeTo The directory to resolve
|
||||||
|
* plugins from.
|
||||||
|
* @param {ReadOnlyMap<string,Environment>} options.pluginEnvironments A map of plugin environment
|
||||||
|
* names to objects.
|
||||||
|
* @param {ReadOnlyMap<string,Processor>} options.pluginProcessors A map of plugin processor
|
||||||
|
* names to objects.
|
||||||
|
* @returns {Object} A flag-config-style config object.
|
||||||
|
*/
|
||||||
|
function translateESLintRC(eslintrcConfig, {
|
||||||
|
resolveConfigRelativeTo,
|
||||||
|
resolvePluginsRelativeTo,
|
||||||
|
pluginEnvironments,
|
||||||
|
pluginProcessors
|
||||||
|
}) {
|
||||||
|
|
||||||
|
const flatConfig = {};
|
||||||
|
const configs = [];
|
||||||
|
const languageOptions = {};
|
||||||
|
const linterOptions = {};
|
||||||
|
const keysToCopy = ["settings", "rules", "processor"];
|
||||||
|
const languageOptionsKeysToCopy = ["globals", "parser", "parserOptions"];
|
||||||
|
const linterOptionsKeysToCopy = ["noInlineConfig", "reportUnusedDisableDirectives"];
|
||||||
|
|
||||||
|
// check for special settings for eslint:all and eslint:recommended:
|
||||||
|
if (eslintrcConfig.settings) {
|
||||||
|
if (eslintrcConfig.settings["eslint:all"] === true) {
|
||||||
|
return ["eslint:all"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eslintrcConfig.settings["eslint:recommended"] === true) {
|
||||||
|
return ["eslint:recommended"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy over simple translations
|
||||||
|
for (const key of keysToCopy) {
|
||||||
|
if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") {
|
||||||
|
flatConfig[key] = eslintrcConfig[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy over languageOptions
|
||||||
|
for (const key of languageOptionsKeysToCopy) {
|
||||||
|
if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") {
|
||||||
|
|
||||||
|
// create the languageOptions key in the flat config
|
||||||
|
flatConfig.languageOptions = languageOptions;
|
||||||
|
|
||||||
|
if (key === "parser") {
|
||||||
|
debug(`Resolving parser '${languageOptions[key]}' relative to ${resolveConfigRelativeTo}`);
|
||||||
|
|
||||||
|
if (eslintrcConfig[key].error) {
|
||||||
|
throw eslintrcConfig[key].error;
|
||||||
|
}
|
||||||
|
|
||||||
|
languageOptions[key] = eslintrcConfig[key].definition;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clone any object values that are in the eslintrc config
|
||||||
|
if (eslintrcConfig[key] && typeof eslintrcConfig[key] === "object") {
|
||||||
|
languageOptions[key] = {
|
||||||
|
...eslintrcConfig[key]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
languageOptions[key] = eslintrcConfig[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy over linterOptions
|
||||||
|
for (const key of linterOptionsKeysToCopy) {
|
||||||
|
if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") {
|
||||||
|
flatConfig.linterOptions = linterOptions;
|
||||||
|
linterOptions[key] = eslintrcConfig[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// move ecmaVersion a level up
|
||||||
|
if (languageOptions.parserOptions) {
|
||||||
|
|
||||||
|
if ("ecmaVersion" in languageOptions.parserOptions) {
|
||||||
|
languageOptions.ecmaVersion = languageOptions.parserOptions.ecmaVersion;
|
||||||
|
delete languageOptions.parserOptions.ecmaVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("sourceType" in languageOptions.parserOptions) {
|
||||||
|
languageOptions.sourceType = languageOptions.parserOptions.sourceType;
|
||||||
|
delete languageOptions.parserOptions.sourceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check to see if we even need parserOptions anymore and remove it if not
|
||||||
|
if (Object.keys(languageOptions.parserOptions).length === 0) {
|
||||||
|
delete languageOptions.parserOptions;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// overrides
|
||||||
|
if (eslintrcConfig.criteria) {
|
||||||
|
flatConfig.files = [absoluteFilePath => eslintrcConfig.criteria.test(absoluteFilePath)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate plugins
|
||||||
|
if (eslintrcConfig.plugins && typeof eslintrcConfig.plugins === "object") {
|
||||||
|
debug(`Translating plugins: ${eslintrcConfig.plugins}`);
|
||||||
|
|
||||||
|
flatConfig.plugins = {};
|
||||||
|
|
||||||
|
for (const pluginName of Object.keys(eslintrcConfig.plugins)) {
|
||||||
|
|
||||||
|
debug(`Translating plugin: ${pluginName}`);
|
||||||
|
debug(`Resolving plugin '${pluginName} relative to ${resolvePluginsRelativeTo}`);
|
||||||
|
|
||||||
|
const { definition: plugin, error } = eslintrcConfig.plugins[pluginName];
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
flatConfig.plugins[pluginName] = plugin;
|
||||||
|
|
||||||
|
// create a config for any processors
|
||||||
|
if (plugin.processors) {
|
||||||
|
for (const processorName of Object.keys(plugin.processors)) {
|
||||||
|
if (processorName.startsWith(".")) {
|
||||||
|
debug(`Assigning processor: ${pluginName}/${processorName}`);
|
||||||
|
|
||||||
|
configs.unshift({
|
||||||
|
files: [`**/*${processorName}`],
|
||||||
|
processor: pluginProcessors.get(`${pluginName}/${processorName}`)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate env - must come after plugins
|
||||||
|
if (eslintrcConfig.env && typeof eslintrcConfig.env === "object") {
|
||||||
|
for (const envName of Object.keys(eslintrcConfig.env)) {
|
||||||
|
|
||||||
|
// only add environments that are true
|
||||||
|
if (eslintrcConfig.env[envName]) {
|
||||||
|
debug(`Translating environment: ${envName}`);
|
||||||
|
|
||||||
|
if (environments.has(envName)) {
|
||||||
|
|
||||||
|
// built-in environments should be defined first
|
||||||
|
configs.unshift(...translateESLintRC(environments.get(envName), {
|
||||||
|
resolveConfigRelativeTo,
|
||||||
|
resolvePluginsRelativeTo
|
||||||
|
}));
|
||||||
|
} else if (pluginEnvironments.has(envName)) {
|
||||||
|
|
||||||
|
// if the environment comes from a plugin, it should come after the plugin config
|
||||||
|
configs.push(...translateESLintRC(pluginEnvironments.get(envName), {
|
||||||
|
resolveConfigRelativeTo,
|
||||||
|
resolvePluginsRelativeTo
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// only add if there are actually keys in the config
|
||||||
|
if (Object.keys(flatConfig).length > 0) {
|
||||||
|
configs.push(flatConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
return configs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Exports
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A compatibility class for working with configs.
|
||||||
|
*/
|
||||||
|
class FlatCompat {
|
||||||
|
|
||||||
|
constructor({
|
||||||
|
baseDirectory = process.cwd(),
|
||||||
|
resolvePluginsRelativeTo = baseDirectory
|
||||||
|
} = {}) {
|
||||||
|
this.baseDirectory = baseDirectory;
|
||||||
|
this.resolvePluginsRelativeTo = resolvePluginsRelativeTo;
|
||||||
|
this[cafactory] = new ConfigArrayFactory({
|
||||||
|
cwd: baseDirectory,
|
||||||
|
resolvePluginsRelativeTo,
|
||||||
|
getEslintAllConfig: () => ({ settings: { "eslint:all": true } }),
|
||||||
|
getEslintRecommendedConfig: () => ({ settings: { "eslint:recommended": true } })
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates an ESLintRC-style config into a flag-config-style config.
|
||||||
|
* @param {Object} eslintrcConfig The ESLintRC-style config object.
|
||||||
|
* @returns {Object} A flag-config-style config object.
|
||||||
|
*/
|
||||||
|
config(eslintrcConfig) {
|
||||||
|
const eslintrcArray = this[cafactory].create(eslintrcConfig, {
|
||||||
|
basePath: this.baseDirectory
|
||||||
|
});
|
||||||
|
|
||||||
|
const flatArray = [];
|
||||||
|
let hasIgnorePatterns = false;
|
||||||
|
|
||||||
|
eslintrcArray.forEach(configData => {
|
||||||
|
if (configData.type === "config") {
|
||||||
|
hasIgnorePatterns = hasIgnorePatterns || configData.ignorePattern;
|
||||||
|
flatArray.push(...translateESLintRC(configData, {
|
||||||
|
resolveConfigRelativeTo: path.join(this.baseDirectory, "__placeholder.js"),
|
||||||
|
resolvePluginsRelativeTo: path.join(this.resolvePluginsRelativeTo, "__placeholder.js"),
|
||||||
|
pluginEnvironments: eslintrcArray.pluginEnvironments,
|
||||||
|
pluginProcessors: eslintrcArray.pluginProcessors
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// combine ignorePatterns to emulate ESLintRC behavior better
|
||||||
|
if (hasIgnorePatterns) {
|
||||||
|
flatArray.unshift({
|
||||||
|
ignores: [filePath => {
|
||||||
|
|
||||||
|
// Compute the final config for this file.
|
||||||
|
// This filters config array elements by `files`/`excludedFiles` then merges the elements.
|
||||||
|
const finalConfig = eslintrcArray.extractConfig(filePath);
|
||||||
|
|
||||||
|
// Test the `ignorePattern` properties of the final config.
|
||||||
|
return Boolean(finalConfig.ignores) && finalConfig.ignores(filePath);
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return flatArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates the `env` section of an ESLintRC-style config.
|
||||||
|
* @param {Object} envConfig The `env` section of an ESLintRC config.
|
||||||
|
* @returns {Object} A flag-config object representing the environments.
|
||||||
|
*/
|
||||||
|
env(envConfig) {
|
||||||
|
return this.config({
|
||||||
|
env: envConfig
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates the `extends` section of an ESLintRC-style config.
|
||||||
|
* @param {...string} configsToExtend The names of the configs to load.
|
||||||
|
* @returns {Object} A flag-config object representing the config.
|
||||||
|
*/
|
||||||
|
extends(...configsToExtend) {
|
||||||
|
return this.config({
|
||||||
|
extends: configsToExtend
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates the `plugins` section of an ESLintRC-style config.
|
||||||
|
* @param {...string} plugins The names of the plugins to load.
|
||||||
|
* @returns {Object} A flag-config object representing the plugins.
|
||||||
|
*/
|
||||||
|
plugins(...plugins) {
|
||||||
|
return this.config({
|
||||||
|
plugins
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { FlatCompat };
|
29
node_modules/@eslint/eslintrc/lib/index-universal.js
generated
vendored
Normal file
29
node_modules/@eslint/eslintrc/lib/index-universal.js
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Package exports for @eslint/eslintrc
|
||||||
|
* @author Nicholas C. Zakas
|
||||||
|
*/
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import * as ConfigOps from "./shared/config-ops.js";
|
||||||
|
import ConfigValidator from "./shared/config-validator.js";
|
||||||
|
import * as naming from "./shared/naming.js";
|
||||||
|
import environments from "../conf/environments.js";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Exports
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const Legacy = {
|
||||||
|
environments,
|
||||||
|
|
||||||
|
// shared
|
||||||
|
ConfigOps,
|
||||||
|
ConfigValidator,
|
||||||
|
naming
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
Legacy
|
||||||
|
};
|
56
node_modules/@eslint/eslintrc/lib/index.js
generated
vendored
Normal file
56
node_modules/@eslint/eslintrc/lib/index.js
generated
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Package exports for @eslint/eslintrc
|
||||||
|
* @author Nicholas C. Zakas
|
||||||
|
*/
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import {
|
||||||
|
ConfigArrayFactory,
|
||||||
|
createContext as createConfigArrayFactoryContext
|
||||||
|
} from "./config-array-factory.js";
|
||||||
|
|
||||||
|
import { CascadingConfigArrayFactory } from "./cascading-config-array-factory.js";
|
||||||
|
import * as ModuleResolver from "./shared/relative-module-resolver.js";
|
||||||
|
import { ConfigArray, getUsedExtractedConfigs } from "./config-array/index.js";
|
||||||
|
import { ConfigDependency } from "./config-array/config-dependency.js";
|
||||||
|
import { ExtractedConfig } from "./config-array/extracted-config.js";
|
||||||
|
import { IgnorePattern } from "./config-array/ignore-pattern.js";
|
||||||
|
import { OverrideTester } from "./config-array/override-tester.js";
|
||||||
|
import * as ConfigOps from "./shared/config-ops.js";
|
||||||
|
import ConfigValidator from "./shared/config-validator.js";
|
||||||
|
import * as naming from "./shared/naming.js";
|
||||||
|
import { FlatCompat } from "./flat-compat.js";
|
||||||
|
import environments from "../conf/environments.js";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Exports
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const Legacy = {
|
||||||
|
ConfigArray,
|
||||||
|
createConfigArrayFactoryContext,
|
||||||
|
CascadingConfigArrayFactory,
|
||||||
|
ConfigArrayFactory,
|
||||||
|
ConfigDependency,
|
||||||
|
ExtractedConfig,
|
||||||
|
IgnorePattern,
|
||||||
|
OverrideTester,
|
||||||
|
getUsedExtractedConfigs,
|
||||||
|
environments,
|
||||||
|
|
||||||
|
// shared
|
||||||
|
ConfigOps,
|
||||||
|
ConfigValidator,
|
||||||
|
ModuleResolver,
|
||||||
|
naming
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
|
||||||
|
Legacy,
|
||||||
|
|
||||||
|
FlatCompat
|
||||||
|
|
||||||
|
};
|
191
node_modules/@eslint/eslintrc/lib/shared/ajv.js
generated
vendored
Normal file
191
node_modules/@eslint/eslintrc/lib/shared/ajv.js
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview The instance of Ajv validator.
|
||||||
|
* @author Evgeny Poberezkin
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import Ajv from "ajv";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copied from ajv/lib/refs/json-schema-draft-04.json
|
||||||
|
* The MIT License (MIT)
|
||||||
|
* Copyright (c) 2015-2017 Evgeny Poberezkin
|
||||||
|
*/
|
||||||
|
const metaSchema = {
|
||||||
|
id: "http://json-schema.org/draft-04/schema#",
|
||||||
|
$schema: "http://json-schema.org/draft-04/schema#",
|
||||||
|
description: "Core schema meta-schema",
|
||||||
|
definitions: {
|
||||||
|
schemaArray: {
|
||||||
|
type: "array",
|
||||||
|
minItems: 1,
|
||||||
|
items: { $ref: "#" }
|
||||||
|
},
|
||||||
|
positiveInteger: {
|
||||||
|
type: "integer",
|
||||||
|
minimum: 0
|
||||||
|
},
|
||||||
|
positiveIntegerDefault0: {
|
||||||
|
allOf: [{ $ref: "#/definitions/positiveInteger" }, { default: 0 }]
|
||||||
|
},
|
||||||
|
simpleTypes: {
|
||||||
|
enum: ["array", "boolean", "integer", "null", "number", "object", "string"]
|
||||||
|
},
|
||||||
|
stringArray: {
|
||||||
|
type: "array",
|
||||||
|
items: { type: "string" },
|
||||||
|
minItems: 1,
|
||||||
|
uniqueItems: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type: "object",
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: "string"
|
||||||
|
},
|
||||||
|
$schema: {
|
||||||
|
type: "string"
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: "string"
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: "string"
|
||||||
|
},
|
||||||
|
default: { },
|
||||||
|
multipleOf: {
|
||||||
|
type: "number",
|
||||||
|
minimum: 0,
|
||||||
|
exclusiveMinimum: true
|
||||||
|
},
|
||||||
|
maximum: {
|
||||||
|
type: "number"
|
||||||
|
},
|
||||||
|
exclusiveMaximum: {
|
||||||
|
type: "boolean",
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
minimum: {
|
||||||
|
type: "number"
|
||||||
|
},
|
||||||
|
exclusiveMinimum: {
|
||||||
|
type: "boolean",
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
maxLength: { $ref: "#/definitions/positiveInteger" },
|
||||||
|
minLength: { $ref: "#/definitions/positiveIntegerDefault0" },
|
||||||
|
pattern: {
|
||||||
|
type: "string",
|
||||||
|
format: "regex"
|
||||||
|
},
|
||||||
|
additionalItems: {
|
||||||
|
anyOf: [
|
||||||
|
{ type: "boolean" },
|
||||||
|
{ $ref: "#" }
|
||||||
|
],
|
||||||
|
default: { }
|
||||||
|
},
|
||||||
|
items: {
|
||||||
|
anyOf: [
|
||||||
|
{ $ref: "#" },
|
||||||
|
{ $ref: "#/definitions/schemaArray" }
|
||||||
|
],
|
||||||
|
default: { }
|
||||||
|
},
|
||||||
|
maxItems: { $ref: "#/definitions/positiveInteger" },
|
||||||
|
minItems: { $ref: "#/definitions/positiveIntegerDefault0" },
|
||||||
|
uniqueItems: {
|
||||||
|
type: "boolean",
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
maxProperties: { $ref: "#/definitions/positiveInteger" },
|
||||||
|
minProperties: { $ref: "#/definitions/positiveIntegerDefault0" },
|
||||||
|
required: { $ref: "#/definitions/stringArray" },
|
||||||
|
additionalProperties: {
|
||||||
|
anyOf: [
|
||||||
|
{ type: "boolean" },
|
||||||
|
{ $ref: "#" }
|
||||||
|
],
|
||||||
|
default: { }
|
||||||
|
},
|
||||||
|
definitions: {
|
||||||
|
type: "object",
|
||||||
|
additionalProperties: { $ref: "#" },
|
||||||
|
default: { }
|
||||||
|
},
|
||||||
|
properties: {
|
||||||
|
type: "object",
|
||||||
|
additionalProperties: { $ref: "#" },
|
||||||
|
default: { }
|
||||||
|
},
|
||||||
|
patternProperties: {
|
||||||
|
type: "object",
|
||||||
|
additionalProperties: { $ref: "#" },
|
||||||
|
default: { }
|
||||||
|
},
|
||||||
|
dependencies: {
|
||||||
|
type: "object",
|
||||||
|
additionalProperties: {
|
||||||
|
anyOf: [
|
||||||
|
{ $ref: "#" },
|
||||||
|
{ $ref: "#/definitions/stringArray" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
enum: {
|
||||||
|
type: "array",
|
||||||
|
minItems: 1,
|
||||||
|
uniqueItems: true
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
anyOf: [
|
||||||
|
{ $ref: "#/definitions/simpleTypes" },
|
||||||
|
{
|
||||||
|
type: "array",
|
||||||
|
items: { $ref: "#/definitions/simpleTypes" },
|
||||||
|
minItems: 1,
|
||||||
|
uniqueItems: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
format: { type: "string" },
|
||||||
|
allOf: { $ref: "#/definitions/schemaArray" },
|
||||||
|
anyOf: { $ref: "#/definitions/schemaArray" },
|
||||||
|
oneOf: { $ref: "#/definitions/schemaArray" },
|
||||||
|
not: { $ref: "#" }
|
||||||
|
},
|
||||||
|
dependencies: {
|
||||||
|
exclusiveMaximum: ["maximum"],
|
||||||
|
exclusiveMinimum: ["minimum"]
|
||||||
|
},
|
||||||
|
default: { }
|
||||||
|
};
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export default (additionalOptions = {}) => {
|
||||||
|
const ajv = new Ajv({
|
||||||
|
meta: false,
|
||||||
|
useDefaults: true,
|
||||||
|
validateSchema: false,
|
||||||
|
missingRefs: "ignore",
|
||||||
|
verbose: true,
|
||||||
|
schemaId: "auto",
|
||||||
|
...additionalOptions
|
||||||
|
});
|
||||||
|
|
||||||
|
ajv.addMetaSchema(metaSchema);
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
ajv._opts.defaultMeta = metaSchema.id;
|
||||||
|
|
||||||
|
return ajv;
|
||||||
|
};
|
135
node_modules/@eslint/eslintrc/lib/shared/config-ops.js
generated
vendored
Normal file
135
node_modules/@eslint/eslintrc/lib/shared/config-ops.js
generated
vendored
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Config file operations. This file must be usable in the browser,
|
||||||
|
* so no Node-specific code can be here.
|
||||||
|
* @author Nicholas C. Zakas
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Private
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const RULE_SEVERITY_STRINGS = ["off", "warn", "error"],
|
||||||
|
RULE_SEVERITY = RULE_SEVERITY_STRINGS.reduce((map, value, index) => {
|
||||||
|
map[value] = index;
|
||||||
|
return map;
|
||||||
|
}, {}),
|
||||||
|
VALID_SEVERITIES = [0, 1, 2, "off", "warn", "error"];
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes the severity value of a rule's configuration to a number
|
||||||
|
* @param {(number|string|[number, ...*]|[string, ...*])} ruleConfig A rule's configuration value, generally
|
||||||
|
* received from the user. A valid config value is either 0, 1, 2, the string "off" (treated the same as 0),
|
||||||
|
* the string "warn" (treated the same as 1), the string "error" (treated the same as 2), or an array
|
||||||
|
* whose first element is one of the above values. Strings are matched case-insensitively.
|
||||||
|
* @returns {(0|1|2)} The numeric severity value if the config value was valid, otherwise 0.
|
||||||
|
*/
|
||||||
|
function getRuleSeverity(ruleConfig) {
|
||||||
|
const severityValue = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig;
|
||||||
|
|
||||||
|
if (severityValue === 0 || severityValue === 1 || severityValue === 2) {
|
||||||
|
return severityValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof severityValue === "string") {
|
||||||
|
return RULE_SEVERITY[severityValue.toLowerCase()] || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts old-style severity settings (0, 1, 2) into new-style
|
||||||
|
* severity settings (off, warn, error) for all rules. Assumption is that severity
|
||||||
|
* values have already been validated as correct.
|
||||||
|
* @param {Object} config The config object to normalize.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function normalizeToStrings(config) {
|
||||||
|
|
||||||
|
if (config.rules) {
|
||||||
|
Object.keys(config.rules).forEach(ruleId => {
|
||||||
|
const ruleConfig = config.rules[ruleId];
|
||||||
|
|
||||||
|
if (typeof ruleConfig === "number") {
|
||||||
|
config.rules[ruleId] = RULE_SEVERITY_STRINGS[ruleConfig] || RULE_SEVERITY_STRINGS[0];
|
||||||
|
} else if (Array.isArray(ruleConfig) && typeof ruleConfig[0] === "number") {
|
||||||
|
ruleConfig[0] = RULE_SEVERITY_STRINGS[ruleConfig[0]] || RULE_SEVERITY_STRINGS[0];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the severity for the given rule configuration represents an error.
|
||||||
|
* @param {int|string|Array} ruleConfig The configuration for an individual rule.
|
||||||
|
* @returns {boolean} True if the rule represents an error, false if not.
|
||||||
|
*/
|
||||||
|
function isErrorSeverity(ruleConfig) {
|
||||||
|
return getRuleSeverity(ruleConfig) === 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether a given config has valid severity or not.
|
||||||
|
* @param {number|string|Array} ruleConfig The configuration for an individual rule.
|
||||||
|
* @returns {boolean} `true` if the configuration has valid severity.
|
||||||
|
*/
|
||||||
|
function isValidSeverity(ruleConfig) {
|
||||||
|
let severity = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig;
|
||||||
|
|
||||||
|
if (typeof severity === "string") {
|
||||||
|
severity = severity.toLowerCase();
|
||||||
|
}
|
||||||
|
return VALID_SEVERITIES.indexOf(severity) !== -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether every rule of a given config has valid severity or not.
|
||||||
|
* @param {Object} config The configuration for rules.
|
||||||
|
* @returns {boolean} `true` if the configuration has valid severity.
|
||||||
|
*/
|
||||||
|
function isEverySeverityValid(config) {
|
||||||
|
return Object.keys(config).every(ruleId => isValidSeverity(config[ruleId]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes a value for a global in a config
|
||||||
|
* @param {(boolean|string|null)} configuredValue The value given for a global in configuration or in
|
||||||
|
* a global directive comment
|
||||||
|
* @returns {("readable"|"writeable"|"off")} The value normalized as a string
|
||||||
|
* @throws Error if global value is invalid
|
||||||
|
*/
|
||||||
|
function normalizeConfigGlobal(configuredValue) {
|
||||||
|
switch (configuredValue) {
|
||||||
|
case "off":
|
||||||
|
return "off";
|
||||||
|
|
||||||
|
case true:
|
||||||
|
case "true":
|
||||||
|
case "writeable":
|
||||||
|
case "writable":
|
||||||
|
return "writable";
|
||||||
|
|
||||||
|
case null:
|
||||||
|
case false:
|
||||||
|
case "false":
|
||||||
|
case "readable":
|
||||||
|
case "readonly":
|
||||||
|
return "readonly";
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new Error(`'${configuredValue}' is not a valid configuration for a global (use 'readonly', 'writable', or 'off')`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
getRuleSeverity,
|
||||||
|
normalizeToStrings,
|
||||||
|
isErrorSeverity,
|
||||||
|
isValidSeverity,
|
||||||
|
isEverySeverityValid,
|
||||||
|
normalizeConfigGlobal
|
||||||
|
};
|
325
node_modules/@eslint/eslintrc/lib/shared/config-validator.js
generated
vendored
Normal file
325
node_modules/@eslint/eslintrc/lib/shared/config-validator.js
generated
vendored
Normal file
|
@ -0,0 +1,325 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Validates configs.
|
||||||
|
* @author Brandon Mills
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* eslint class-methods-use-this: "off" */
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import util from "util";
|
||||||
|
import * as ConfigOps from "./config-ops.js";
|
||||||
|
import { emitDeprecationWarning } from "./deprecation-warnings.js";
|
||||||
|
import ajvOrig from "./ajv.js";
|
||||||
|
import configSchema from "../../conf/config-schema.js";
|
||||||
|
import BuiltInEnvironments from "../../conf/environments.js";
|
||||||
|
|
||||||
|
const ajv = ajvOrig();
|
||||||
|
|
||||||
|
const ruleValidators = new WeakMap();
|
||||||
|
const noop = Function.prototype;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Private
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
let validateSchema;
|
||||||
|
const severityMap = {
|
||||||
|
error: 2,
|
||||||
|
warn: 1,
|
||||||
|
off: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
const validated = new WeakSet();
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Exports
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export default class ConfigValidator {
|
||||||
|
constructor({ builtInRules = new Map() } = {}) {
|
||||||
|
this.builtInRules = builtInRules;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a complete options schema for a rule.
|
||||||
|
* @param {{create: Function, schema: (Array|null)}} rule A new-style rule object
|
||||||
|
* @returns {Object} JSON Schema for the rule's options.
|
||||||
|
*/
|
||||||
|
getRuleOptionsSchema(rule) {
|
||||||
|
if (!rule) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const schema = rule.schema || rule.meta && rule.meta.schema;
|
||||||
|
|
||||||
|
// Given a tuple of schemas, insert warning level at the beginning
|
||||||
|
if (Array.isArray(schema)) {
|
||||||
|
if (schema.length) {
|
||||||
|
return {
|
||||||
|
type: "array",
|
||||||
|
items: schema,
|
||||||
|
minItems: 0,
|
||||||
|
maxItems: schema.length
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
type: "array",
|
||||||
|
minItems: 0,
|
||||||
|
maxItems: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Given a full schema, leave it alone
|
||||||
|
return schema || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a rule's severity and returns the severity value. Throws an error if the severity is invalid.
|
||||||
|
* @param {options} options The given options for the rule.
|
||||||
|
* @returns {number|string} The rule's severity value
|
||||||
|
*/
|
||||||
|
validateRuleSeverity(options) {
|
||||||
|
const severity = Array.isArray(options) ? options[0] : options;
|
||||||
|
const normSeverity = typeof severity === "string" ? severityMap[severity.toLowerCase()] : severity;
|
||||||
|
|
||||||
|
if (normSeverity === 0 || normSeverity === 1 || normSeverity === 2) {
|
||||||
|
return normSeverity;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`\tSeverity should be one of the following: 0 = off, 1 = warn, 2 = error (you passed '${util.inspect(severity).replace(/'/gu, "\"").replace(/\n/gu, "")}').\n`);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the non-severity options passed to a rule, based on its schema.
|
||||||
|
* @param {{create: Function}} rule The rule to validate
|
||||||
|
* @param {Array} localOptions The options for the rule, excluding severity
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateRuleSchema(rule, localOptions) {
|
||||||
|
if (!ruleValidators.has(rule)) {
|
||||||
|
const schema = this.getRuleOptionsSchema(rule);
|
||||||
|
|
||||||
|
if (schema) {
|
||||||
|
ruleValidators.set(rule, ajv.compile(schema));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const validateRule = ruleValidators.get(rule);
|
||||||
|
|
||||||
|
if (validateRule) {
|
||||||
|
validateRule(localOptions);
|
||||||
|
if (validateRule.errors) {
|
||||||
|
throw new Error(validateRule.errors.map(
|
||||||
|
error => `\tValue ${JSON.stringify(error.data)} ${error.message}.\n`
|
||||||
|
).join(""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a rule's options against its schema.
|
||||||
|
* @param {{create: Function}|null} rule The rule that the config is being validated for
|
||||||
|
* @param {string} ruleId The rule's unique name.
|
||||||
|
* @param {Array|number} options The given options for the rule.
|
||||||
|
* @param {string|null} source The name of the configuration source to report in any errors. If null or undefined,
|
||||||
|
* no source is prepended to the message.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateRuleOptions(rule, ruleId, options, source = null) {
|
||||||
|
try {
|
||||||
|
const severity = this.validateRuleSeverity(options);
|
||||||
|
|
||||||
|
if (severity !== 0) {
|
||||||
|
this.validateRuleSchema(rule, Array.isArray(options) ? options.slice(1) : []);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
const enhancedMessage = `Configuration for rule "${ruleId}" is invalid:\n${err.message}`;
|
||||||
|
|
||||||
|
if (typeof source === "string") {
|
||||||
|
throw new Error(`${source}:\n\t${enhancedMessage}`);
|
||||||
|
} else {
|
||||||
|
throw new Error(enhancedMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates an environment object
|
||||||
|
* @param {Object} environment The environment config object to validate.
|
||||||
|
* @param {string} source The name of the configuration source to report in any errors.
|
||||||
|
* @param {function(envId:string): Object} [getAdditionalEnv] A map from strings to loaded environments.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateEnvironment(
|
||||||
|
environment,
|
||||||
|
source,
|
||||||
|
getAdditionalEnv = noop
|
||||||
|
) {
|
||||||
|
|
||||||
|
// not having an environment is ok
|
||||||
|
if (!environment) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.keys(environment).forEach(id => {
|
||||||
|
const env = getAdditionalEnv(id) || BuiltInEnvironments.get(id) || null;
|
||||||
|
|
||||||
|
if (!env) {
|
||||||
|
const message = `${source}:\n\tEnvironment key "${id}" is unknown\n`;
|
||||||
|
|
||||||
|
throw new Error(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a rules config object
|
||||||
|
* @param {Object} rulesConfig The rules config object to validate.
|
||||||
|
* @param {string} source The name of the configuration source to report in any errors.
|
||||||
|
* @param {function(ruleId:string): Object} getAdditionalRule A map from strings to loaded rules
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateRules(
|
||||||
|
rulesConfig,
|
||||||
|
source,
|
||||||
|
getAdditionalRule = noop
|
||||||
|
) {
|
||||||
|
if (!rulesConfig) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.keys(rulesConfig).forEach(id => {
|
||||||
|
const rule = getAdditionalRule(id) || this.builtInRules.get(id) || null;
|
||||||
|
|
||||||
|
this.validateRuleOptions(rule, id, rulesConfig[id], source);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a `globals` section of a config file
|
||||||
|
* @param {Object} globalsConfig The `globals` section
|
||||||
|
* @param {string|null} source The name of the configuration source to report in the event of an error.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateGlobals(globalsConfig, source = null) {
|
||||||
|
if (!globalsConfig) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.entries(globalsConfig)
|
||||||
|
.forEach(([configuredGlobal, configuredValue]) => {
|
||||||
|
try {
|
||||||
|
ConfigOps.normalizeConfigGlobal(configuredValue);
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(`ESLint configuration of global '${configuredGlobal}' in ${source} is invalid:\n${err.message}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate `processor` configuration.
|
||||||
|
* @param {string|undefined} processorName The processor name.
|
||||||
|
* @param {string} source The name of config file.
|
||||||
|
* @param {function(id:string): Processor} getProcessor The getter of defined processors.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateProcessor(processorName, source, getProcessor) {
|
||||||
|
if (processorName && !getProcessor(processorName)) {
|
||||||
|
throw new Error(`ESLint configuration of processor in '${source}' is invalid: '${processorName}' was not found.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats an array of schema validation errors.
|
||||||
|
* @param {Array} errors An array of error messages to format.
|
||||||
|
* @returns {string} Formatted error message
|
||||||
|
*/
|
||||||
|
formatErrors(errors) {
|
||||||
|
return errors.map(error => {
|
||||||
|
if (error.keyword === "additionalProperties") {
|
||||||
|
const formattedPropertyPath = error.dataPath.length ? `${error.dataPath.slice(1)}.${error.params.additionalProperty}` : error.params.additionalProperty;
|
||||||
|
|
||||||
|
return `Unexpected top-level property "${formattedPropertyPath}"`;
|
||||||
|
}
|
||||||
|
if (error.keyword === "type") {
|
||||||
|
const formattedField = error.dataPath.slice(1);
|
||||||
|
const formattedExpectedType = Array.isArray(error.schema) ? error.schema.join("/") : error.schema;
|
||||||
|
const formattedValue = JSON.stringify(error.data);
|
||||||
|
|
||||||
|
return `Property "${formattedField}" is the wrong type (expected ${formattedExpectedType} but got \`${formattedValue}\`)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const field = error.dataPath[0] === "." ? error.dataPath.slice(1) : error.dataPath;
|
||||||
|
|
||||||
|
return `"${field}" ${error.message}. Value: ${JSON.stringify(error.data)}`;
|
||||||
|
}).map(message => `\t- ${message}.\n`).join("");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the top level properties of the config object.
|
||||||
|
* @param {Object} config The config object to validate.
|
||||||
|
* @param {string} source The name of the configuration source to report in any errors.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateConfigSchema(config, source = null) {
|
||||||
|
validateSchema = validateSchema || ajv.compile(configSchema);
|
||||||
|
|
||||||
|
if (!validateSchema(config)) {
|
||||||
|
throw new Error(`ESLint configuration in ${source} is invalid:\n${this.formatErrors(validateSchema.errors)}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.hasOwnProperty.call(config, "ecmaFeatures")) {
|
||||||
|
emitDeprecationWarning(source, "ESLINT_LEGACY_ECMAFEATURES");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates an entire config object.
|
||||||
|
* @param {Object} config The config object to validate.
|
||||||
|
* @param {string} source The name of the configuration source to report in any errors.
|
||||||
|
* @param {function(ruleId:string): Object} [getAdditionalRule] A map from strings to loaded rules.
|
||||||
|
* @param {function(envId:string): Object} [getAdditionalEnv] A map from strings to loaded envs.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validate(config, source, getAdditionalRule, getAdditionalEnv) {
|
||||||
|
this.validateConfigSchema(config, source);
|
||||||
|
this.validateRules(config.rules, source, getAdditionalRule);
|
||||||
|
this.validateEnvironment(config.env, source, getAdditionalEnv);
|
||||||
|
this.validateGlobals(config.globals, source);
|
||||||
|
|
||||||
|
for (const override of config.overrides || []) {
|
||||||
|
this.validateRules(override.rules, source, getAdditionalRule);
|
||||||
|
this.validateEnvironment(override.env, source, getAdditionalEnv);
|
||||||
|
this.validateGlobals(config.globals, source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate config array object.
|
||||||
|
* @param {ConfigArray} configArray The config array to validate.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
validateConfigArray(configArray) {
|
||||||
|
const getPluginEnv = Map.prototype.get.bind(configArray.pluginEnvironments);
|
||||||
|
const getPluginProcessor = Map.prototype.get.bind(configArray.pluginProcessors);
|
||||||
|
const getPluginRule = Map.prototype.get.bind(configArray.pluginRules);
|
||||||
|
|
||||||
|
// Validate.
|
||||||
|
for (const element of configArray) {
|
||||||
|
if (validated.has(element)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
validated.add(element);
|
||||||
|
|
||||||
|
this.validateEnvironment(element.env, element.name, getPluginEnv);
|
||||||
|
this.validateGlobals(element.globals, element.name);
|
||||||
|
this.validateProcessor(element.processor, element.name, getPluginProcessor);
|
||||||
|
this.validateRules(element.rules, element.name, getPluginRule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
63
node_modules/@eslint/eslintrc/lib/shared/deprecation-warnings.js
generated
vendored
Normal file
63
node_modules/@eslint/eslintrc/lib/shared/deprecation-warnings.js
generated
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Provide the function that emits deprecation warnings.
|
||||||
|
* @author Toru Nagashima <http://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Private
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Defitions for deprecation warnings.
|
||||||
|
const deprecationWarningMessages = {
|
||||||
|
ESLINT_LEGACY_ECMAFEATURES:
|
||||||
|
"The 'ecmaFeatures' config file property is deprecated and has no effect.",
|
||||||
|
ESLINT_PERSONAL_CONFIG_LOAD:
|
||||||
|
"'~/.eslintrc.*' config files have been deprecated. " +
|
||||||
|
"Please use a config file per project or the '--config' option.",
|
||||||
|
ESLINT_PERSONAL_CONFIG_SUPPRESS:
|
||||||
|
"'~/.eslintrc.*' config files have been deprecated. " +
|
||||||
|
"Please remove it or add 'root:true' to the config files in your " +
|
||||||
|
"projects in order to avoid loading '~/.eslintrc.*' accidentally."
|
||||||
|
};
|
||||||
|
|
||||||
|
const sourceFileErrorCache = new Set();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emits a deprecation warning containing a given filepath. A new deprecation warning is emitted
|
||||||
|
* for each unique file path, but repeated invocations with the same file path have no effect.
|
||||||
|
* No warnings are emitted if the `--no-deprecation` or `--no-warnings` Node runtime flags are active.
|
||||||
|
* @param {string} source The name of the configuration source to report the warning for.
|
||||||
|
* @param {string} errorCode The warning message to show.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function emitDeprecationWarning(source, errorCode) {
|
||||||
|
const cacheKey = JSON.stringify({ source, errorCode });
|
||||||
|
|
||||||
|
if (sourceFileErrorCache.has(cacheKey)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sourceFileErrorCache.add(cacheKey);
|
||||||
|
|
||||||
|
const rel = path.relative(process.cwd(), source);
|
||||||
|
const message = deprecationWarningMessages[errorCode];
|
||||||
|
|
||||||
|
process.emitWarning(
|
||||||
|
`${message} (found in "${rel}")`,
|
||||||
|
"DeprecationWarning",
|
||||||
|
errorCode
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export {
|
||||||
|
emitDeprecationWarning
|
||||||
|
};
|
96
node_modules/@eslint/eslintrc/lib/shared/naming.js
generated
vendored
Normal file
96
node_modules/@eslint/eslintrc/lib/shared/naming.js
generated
vendored
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Common helpers for naming of plugins, formatters and configs
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAMESPACE_REGEX = /^@.*\//iu;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Brings package name to correct format based on prefix
|
||||||
|
* @param {string} name The name of the package.
|
||||||
|
* @param {string} prefix Can be either "eslint-plugin", "eslint-config" or "eslint-formatter"
|
||||||
|
* @returns {string} Normalized name of the package
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function normalizePackageName(name, prefix) {
|
||||||
|
let normalizedName = name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On Windows, name can come in with Windows slashes instead of Unix slashes.
|
||||||
|
* Normalize to Unix first to avoid errors later on.
|
||||||
|
* https://github.com/eslint/eslint/issues/5644
|
||||||
|
*/
|
||||||
|
if (normalizedName.includes("\\")) {
|
||||||
|
normalizedName = normalizedName.replace(/\\/gu, "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (normalizedName.charAt(0) === "@") {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* it's a scoped package
|
||||||
|
* package name is the prefix, or just a username
|
||||||
|
*/
|
||||||
|
const scopedPackageShortcutRegex = new RegExp(`^(@[^/]+)(?:/(?:${prefix})?)?$`, "u"),
|
||||||
|
scopedPackageNameRegex = new RegExp(`^${prefix}(-|$)`, "u");
|
||||||
|
|
||||||
|
if (scopedPackageShortcutRegex.test(normalizedName)) {
|
||||||
|
normalizedName = normalizedName.replace(scopedPackageShortcutRegex, `$1/${prefix}`);
|
||||||
|
} else if (!scopedPackageNameRegex.test(normalizedName.split("/")[1])) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for scoped packages, insert the prefix after the first / unless
|
||||||
|
* the path is already @scope/eslint or @scope/eslint-xxx-yyy
|
||||||
|
*/
|
||||||
|
normalizedName = normalizedName.replace(/^@([^/]+)\/(.*)$/u, `@$1/${prefix}-$2`);
|
||||||
|
}
|
||||||
|
} else if (!normalizedName.startsWith(`${prefix}-`)) {
|
||||||
|
normalizedName = `${prefix}-${normalizedName}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return normalizedName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the prefix from a fullname.
|
||||||
|
* @param {string} fullname The term which may have the prefix.
|
||||||
|
* @param {string} prefix The prefix to remove.
|
||||||
|
* @returns {string} The term without prefix.
|
||||||
|
*/
|
||||||
|
function getShorthandName(fullname, prefix) {
|
||||||
|
if (fullname[0] === "@") {
|
||||||
|
let matchResult = new RegExp(`^(@[^/]+)/${prefix}$`, "u").exec(fullname);
|
||||||
|
|
||||||
|
if (matchResult) {
|
||||||
|
return matchResult[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
matchResult = new RegExp(`^(@[^/]+)/${prefix}-(.+)$`, "u").exec(fullname);
|
||||||
|
if (matchResult) {
|
||||||
|
return `${matchResult[1]}/${matchResult[2]}`;
|
||||||
|
}
|
||||||
|
} else if (fullname.startsWith(`${prefix}-`)) {
|
||||||
|
return fullname.slice(prefix.length + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fullname;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the scope (namespace) of a term.
|
||||||
|
* @param {string} term The term which may have the namespace.
|
||||||
|
* @returns {string} The namespace of the term if it has one.
|
||||||
|
*/
|
||||||
|
function getNamespaceFromTerm(term) {
|
||||||
|
const match = term.match(NAMESPACE_REGEX);
|
||||||
|
|
||||||
|
return match ? match[0] : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export {
|
||||||
|
normalizePackageName,
|
||||||
|
getShorthandName,
|
||||||
|
getNamespaceFromTerm
|
||||||
|
};
|
42
node_modules/@eslint/eslintrc/lib/shared/relative-module-resolver.js
generated
vendored
Normal file
42
node_modules/@eslint/eslintrc/lib/shared/relative-module-resolver.js
generated
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/**
|
||||||
|
* Utility for resolving a module relative to another module
|
||||||
|
* @author Teddy Katz
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Module from "module";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* `Module.createRequire` is added in v12.2.0. It supports URL as well.
|
||||||
|
* We only support the case where the argument is a filepath, not a URL.
|
||||||
|
*/
|
||||||
|
const createRequire = Module.createRequire;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves a Node module relative to another module
|
||||||
|
* @param {string} moduleName The name of a Node module, or a path to a Node module.
|
||||||
|
* @param {string} relativeToPath An absolute path indicating the module that `moduleName` should be resolved relative to. This must be
|
||||||
|
* a file rather than a directory, but the file need not actually exist.
|
||||||
|
* @returns {string} The absolute path that would result from calling `require.resolve(moduleName)` in a file located at `relativeToPath`
|
||||||
|
*/
|
||||||
|
function resolve(moduleName, relativeToPath) {
|
||||||
|
try {
|
||||||
|
return createRequire(relativeToPath).resolve(moduleName);
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
// This `if` block is for older Node.js than 12.0.0. We can remove this block in the future.
|
||||||
|
if (
|
||||||
|
typeof error === "object" &&
|
||||||
|
error !== null &&
|
||||||
|
error.code === "MODULE_NOT_FOUND" &&
|
||||||
|
!error.requireStack &&
|
||||||
|
error.message.includes(moduleName)
|
||||||
|
) {
|
||||||
|
error.message += `\nRequire stack:\n- ${relativeToPath}`;
|
||||||
|
}
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
resolve
|
||||||
|
};
|
149
node_modules/@eslint/eslintrc/lib/shared/types.js
generated
vendored
Normal file
149
node_modules/@eslint/eslintrc/lib/shared/types.js
generated
vendored
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview Define common types for input completion.
|
||||||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @type {any} */
|
||||||
|
export default {};
|
||||||
|
|
||||||
|
/** @typedef {boolean | "off" | "readable" | "readonly" | "writable" | "writeable"} GlobalConf */
|
||||||
|
/** @typedef {0 | 1 | 2 | "off" | "warn" | "error"} SeverityConf */
|
||||||
|
/** @typedef {SeverityConf | [SeverityConf, ...any[]]} RuleConf */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} EcmaFeatures
|
||||||
|
* @property {boolean} [globalReturn] Enabling `return` statements at the top-level.
|
||||||
|
* @property {boolean} [jsx] Enabling JSX syntax.
|
||||||
|
* @property {boolean} [impliedStrict] Enabling strict mode always.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} ParserOptions
|
||||||
|
* @property {EcmaFeatures} [ecmaFeatures] The optional features.
|
||||||
|
* @property {3|5|6|7|8|9|10|11|12|2015|2016|2017|2018|2019|2020|2021} [ecmaVersion] The ECMAScript version (or revision number).
|
||||||
|
* @property {"script"|"module"} [sourceType] The source code type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} ConfigData
|
||||||
|
* @property {Record<string, boolean>} [env] The environment settings.
|
||||||
|
* @property {string | string[]} [extends] The path to other config files or the package name of shareable configs.
|
||||||
|
* @property {Record<string, GlobalConf>} [globals] The global variable settings.
|
||||||
|
* @property {string | string[]} [ignorePatterns] The glob patterns that ignore to lint.
|
||||||
|
* @property {boolean} [noInlineConfig] The flag that disables directive comments.
|
||||||
|
* @property {OverrideConfigData[]} [overrides] The override settings per kind of files.
|
||||||
|
* @property {string} [parser] The path to a parser or the package name of a parser.
|
||||||
|
* @property {ParserOptions} [parserOptions] The parser options.
|
||||||
|
* @property {string[]} [plugins] The plugin specifiers.
|
||||||
|
* @property {string} [processor] The processor specifier.
|
||||||
|
* @property {boolean} [reportUnusedDisableDirectives] The flag to report unused `eslint-disable` comments.
|
||||||
|
* @property {boolean} [root] The root flag.
|
||||||
|
* @property {Record<string, RuleConf>} [rules] The rule settings.
|
||||||
|
* @property {Object} [settings] The shared settings.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} OverrideConfigData
|
||||||
|
* @property {Record<string, boolean>} [env] The environment settings.
|
||||||
|
* @property {string | string[]} [excludedFiles] The glob pattarns for excluded files.
|
||||||
|
* @property {string | string[]} [extends] The path to other config files or the package name of shareable configs.
|
||||||
|
* @property {string | string[]} files The glob patterns for target files.
|
||||||
|
* @property {Record<string, GlobalConf>} [globals] The global variable settings.
|
||||||
|
* @property {boolean} [noInlineConfig] The flag that disables directive comments.
|
||||||
|
* @property {OverrideConfigData[]} [overrides] The override settings per kind of files.
|
||||||
|
* @property {string} [parser] The path to a parser or the package name of a parser.
|
||||||
|
* @property {ParserOptions} [parserOptions] The parser options.
|
||||||
|
* @property {string[]} [plugins] The plugin specifiers.
|
||||||
|
* @property {string} [processor] The processor specifier.
|
||||||
|
* @property {boolean} [reportUnusedDisableDirectives] The flag to report unused `eslint-disable` comments.
|
||||||
|
* @property {Record<string, RuleConf>} [rules] The rule settings.
|
||||||
|
* @property {Object} [settings] The shared settings.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} ParseResult
|
||||||
|
* @property {Object} ast The AST.
|
||||||
|
* @property {ScopeManager} [scopeManager] The scope manager of the AST.
|
||||||
|
* @property {Record<string, any>} [services] The services that the parser provides.
|
||||||
|
* @property {Record<string, string[]>} [visitorKeys] The visitor keys of the AST.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Parser
|
||||||
|
* @property {(text:string, options:ParserOptions) => Object} parse The definition of global variables.
|
||||||
|
* @property {(text:string, options:ParserOptions) => ParseResult} [parseForESLint] The parser options that will be enabled under this environment.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Environment
|
||||||
|
* @property {Record<string, GlobalConf>} [globals] The definition of global variables.
|
||||||
|
* @property {ParserOptions} [parserOptions] The parser options that will be enabled under this environment.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} LintMessage
|
||||||
|
* @property {number} column The 1-based column number.
|
||||||
|
* @property {number} [endColumn] The 1-based column number of the end location.
|
||||||
|
* @property {number} [endLine] The 1-based line number of the end location.
|
||||||
|
* @property {boolean} fatal If `true` then this is a fatal error.
|
||||||
|
* @property {{range:[number,number], text:string}} [fix] Information for autofix.
|
||||||
|
* @property {number} line The 1-based line number.
|
||||||
|
* @property {string} message The error message.
|
||||||
|
* @property {string|null} ruleId The ID of the rule which makes this message.
|
||||||
|
* @property {0|1|2} severity The severity of this message.
|
||||||
|
* @property {Array<{desc?: string, messageId?: string, fix: {range: [number, number], text: string}}>} [suggestions] Information for suggestions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} SuggestionResult
|
||||||
|
* @property {string} desc A short description.
|
||||||
|
* @property {string} [messageId] Id referencing a message for the description.
|
||||||
|
* @property {{ text: string, range: number[] }} fix fix result info
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Processor
|
||||||
|
* @property {(text:string, filename:string) => Array<string | { text:string, filename:string }>} [preprocess] The function to extract code blocks.
|
||||||
|
* @property {(messagesList:LintMessage[][], filename:string) => LintMessage[]} [postprocess] The function to merge messages.
|
||||||
|
* @property {boolean} [supportsAutofix] If `true` then it means the processor supports autofix.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} RuleMetaDocs
|
||||||
|
* @property {string} category The category of the rule.
|
||||||
|
* @property {string} description The description of the rule.
|
||||||
|
* @property {boolean} recommended If `true` then the rule is included in `eslint:recommended` preset.
|
||||||
|
* @property {string} url The URL of the rule documentation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} RuleMeta
|
||||||
|
* @property {boolean} [deprecated] If `true` then the rule has been deprecated.
|
||||||
|
* @property {RuleMetaDocs} docs The document information of the rule.
|
||||||
|
* @property {"code"|"whitespace"} [fixable] The autofix type.
|
||||||
|
* @property {Record<string,string>} [messages] The messages the rule reports.
|
||||||
|
* @property {string[]} [replacedBy] The IDs of the alternative rules.
|
||||||
|
* @property {Array|Object} schema The option schema of the rule.
|
||||||
|
* @property {"problem"|"suggestion"|"layout"} type The rule type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Rule
|
||||||
|
* @property {Function} create The factory of the rule.
|
||||||
|
* @property {RuleMeta} meta The meta data of the rule.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Plugin
|
||||||
|
* @property {Record<string, ConfigData>} [configs] The definition of plugin configs.
|
||||||
|
* @property {Record<string, Environment>} [environments] The definition of plugin environments.
|
||||||
|
* @property {Record<string, Processor>} [processors] The definition of plugin processors.
|
||||||
|
* @property {Record<string, Function | Rule>} [rules] The definition of plugin rules.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information of deprecated rules.
|
||||||
|
* @typedef {Object} DeprecatedRuleInfo
|
||||||
|
* @property {string} ruleId The rule ID.
|
||||||
|
* @property {string[]} replacedBy The rule IDs that replace this deprecated rule.
|
||||||
|
*/
|
20
node_modules/@eslint/eslintrc/node_modules/debug/LICENSE
generated
vendored
Normal file
20
node_modules/@eslint/eslintrc/node_modules/debug/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
|
||||||
|
Copyright (c) 2018-2021 Josh Junon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||||
|
and associated documentation files (the 'Software'), to deal in the Software without restriction,
|
||||||
|
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||||
|
portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||||
|
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
481
node_modules/@eslint/eslintrc/node_modules/debug/README.md
generated
vendored
Normal file
481
node_modules/@eslint/eslintrc/node_modules/debug/README.md
generated
vendored
Normal file
|
@ -0,0 +1,481 @@
|
||||||
|
# debug
|
||||||
|
[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug) [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)
|
||||||
|
[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
|
||||||
|
|
||||||
|
A tiny JavaScript debugging utility modelled after Node.js core's debugging
|
||||||
|
technique. Works in Node.js and web browsers.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm install debug
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
|
||||||
|
|
||||||
|
Example [_app.js_](./examples/node/app.js):
|
||||||
|
|
||||||
|
```js
|
||||||
|
var debug = require('debug')('http')
|
||||||
|
, http = require('http')
|
||||||
|
, name = 'My App';
|
||||||
|
|
||||||
|
// fake app
|
||||||
|
|
||||||
|
debug('booting %o', name);
|
||||||
|
|
||||||
|
http.createServer(function(req, res){
|
||||||
|
debug(req.method + ' ' + req.url);
|
||||||
|
res.end('hello\n');
|
||||||
|
}).listen(3000, function(){
|
||||||
|
debug('listening');
|
||||||
|
});
|
||||||
|
|
||||||
|
// fake worker of some kind
|
||||||
|
|
||||||
|
require('./worker');
|
||||||
|
```
|
||||||
|
|
||||||
|
Example [_worker.js_](./examples/node/worker.js):
|
||||||
|
|
||||||
|
```js
|
||||||
|
var a = require('debug')('worker:a')
|
||||||
|
, b = require('debug')('worker:b');
|
||||||
|
|
||||||
|
function work() {
|
||||||
|
a('doing lots of uninteresting work');
|
||||||
|
setTimeout(work, Math.random() * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
work();
|
||||||
|
|
||||||
|
function workb() {
|
||||||
|
b('doing some work');
|
||||||
|
setTimeout(workb, Math.random() * 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
workb();
|
||||||
|
```
|
||||||
|
|
||||||
|
The `DEBUG` environment variable is then used to enable these based on space or
|
||||||
|
comma-delimited names.
|
||||||
|
|
||||||
|
Here are some examples:
|
||||||
|
|
||||||
|
<img width="647" alt="screen shot 2017-08-08 at 12 53 04 pm" src="https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png">
|
||||||
|
<img width="647" alt="screen shot 2017-08-08 at 12 53 38 pm" src="https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png">
|
||||||
|
<img width="647" alt="screen shot 2017-08-08 at 12 53 25 pm" src="https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png">
|
||||||
|
|
||||||
|
#### Windows command prompt notes
|
||||||
|
|
||||||
|
##### CMD
|
||||||
|
|
||||||
|
On Windows the environment variable is set using the `set` command.
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
set DEBUG=*,-not_this
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
set DEBUG=* & node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
##### PowerShell (VS Code default)
|
||||||
|
|
||||||
|
PowerShell uses different syntax to set environment variables.
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
$env:DEBUG = "*,-not_this"
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
$env:DEBUG='app';node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, run the program to be debugged as usual.
|
||||||
|
|
||||||
|
npm script example:
|
||||||
|
```js
|
||||||
|
"windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js",
|
||||||
|
```
|
||||||
|
|
||||||
|
## Namespace Colors
|
||||||
|
|
||||||
|
Every debug instance has a color generated for it based on its namespace name.
|
||||||
|
This helps when visually parsing the debug output to identify which debug instance
|
||||||
|
a debug line belongs to.
|
||||||
|
|
||||||
|
#### Node.js
|
||||||
|
|
||||||
|
In Node.js, colors are enabled when stderr is a TTY. You also _should_ install
|
||||||
|
the [`supports-color`](https://npmjs.org/supports-color) module alongside debug,
|
||||||
|
otherwise debug will only use a small handful of basic colors.
|
||||||
|
|
||||||
|
<img width="521" src="https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png">
|
||||||
|
|
||||||
|
#### Web Browser
|
||||||
|
|
||||||
|
Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
|
||||||
|
option. These are WebKit web inspectors, Firefox ([since version
|
||||||
|
31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
|
||||||
|
and the Firebug plugin for Firefox (any version).
|
||||||
|
|
||||||
|
<img width="524" src="https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png">
|
||||||
|
|
||||||
|
|
||||||
|
## Millisecond diff
|
||||||
|
|
||||||
|
When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
|
||||||
|
|
||||||
|
When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.png">
|
||||||
|
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output.
|
||||||
|
|
||||||
|
## Wildcards
|
||||||
|
|
||||||
|
The `*` character may be used as a wildcard. Suppose for example your library has
|
||||||
|
debuggers named "connect:bodyParser", "connect:compress", "connect:session",
|
||||||
|
instead of listing all three with
|
||||||
|
`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do
|
||||||
|
`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
|
||||||
|
|
||||||
|
You can also exclude specific debuggers by prefixing them with a "-" character.
|
||||||
|
For example, `DEBUG=*,-connect:*` would include all debuggers except those
|
||||||
|
starting with "connect:".
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
When running through Node.js, you can set a few environment variables that will
|
||||||
|
change the behavior of the debug logging:
|
||||||
|
|
||||||
|
| Name | Purpose |
|
||||||
|
|-----------|-------------------------------------------------|
|
||||||
|
| `DEBUG` | Enables/disables specific debugging namespaces. |
|
||||||
|
| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). |
|
||||||
|
| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
|
||||||
|
| `DEBUG_DEPTH` | Object inspection depth. |
|
||||||
|
| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
|
||||||
|
|
||||||
|
|
||||||
|
__Note:__ The environment variables beginning with `DEBUG_` end up being
|
||||||
|
converted into an Options object that gets used with `%o`/`%O` formatters.
|
||||||
|
See the Node.js documentation for
|
||||||
|
[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
|
||||||
|
for the complete list.
|
||||||
|
|
||||||
|
## Formatters
|
||||||
|
|
||||||
|
Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.
|
||||||
|
Below are the officially supported formatters:
|
||||||
|
|
||||||
|
| Formatter | Representation |
|
||||||
|
|-----------|----------------|
|
||||||
|
| `%O` | Pretty-print an Object on multiple lines. |
|
||||||
|
| `%o` | Pretty-print an Object all on a single line. |
|
||||||
|
| `%s` | String. |
|
||||||
|
| `%d` | Number (both integer and float). |
|
||||||
|
| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
|
||||||
|
| `%%` | Single percent sign ('%'). This does not consume an argument. |
|
||||||
|
|
||||||
|
|
||||||
|
### Custom formatters
|
||||||
|
|
||||||
|
You can add custom formatters by extending the `debug.formatters` object.
|
||||||
|
For example, if you wanted to add support for rendering a Buffer as hex with
|
||||||
|
`%h`, you could do something like:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const createDebug = require('debug')
|
||||||
|
createDebug.formatters.h = (v) => {
|
||||||
|
return v.toString('hex')
|
||||||
|
}
|
||||||
|
|
||||||
|
// …elsewhere
|
||||||
|
const debug = createDebug('foo')
|
||||||
|
debug('this is hex: %h', new Buffer('hello world'))
|
||||||
|
// foo this is hex: 68656c6c6f20776f726c6421 +0ms
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Browser Support
|
||||||
|
|
||||||
|
You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
|
||||||
|
or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
|
||||||
|
if you don't want to build it yourself.
|
||||||
|
|
||||||
|
Debug's enable state is currently persisted by `localStorage`.
|
||||||
|
Consider the situation shown below where you have `worker:a` and `worker:b`,
|
||||||
|
and wish to debug both. You can enable this using `localStorage.debug`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
localStorage.debug = 'worker:*'
|
||||||
|
```
|
||||||
|
|
||||||
|
And then refresh the page.
|
||||||
|
|
||||||
|
```js
|
||||||
|
a = debug('worker:a');
|
||||||
|
b = debug('worker:b');
|
||||||
|
|
||||||
|
setInterval(function(){
|
||||||
|
a('doing some work');
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
setInterval(function(){
|
||||||
|
b('doing some work');
|
||||||
|
}, 1200);
|
||||||
|
```
|
||||||
|
|
||||||
|
In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_.
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/7143133/152083257-29034707-c42c-4959-8add-3cee850e6fcf.png">
|
||||||
|
|
||||||
|
## Output streams
|
||||||
|
|
||||||
|
By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
|
||||||
|
|
||||||
|
Example [_stdout.js_](./examples/node/stdout.js):
|
||||||
|
|
||||||
|
```js
|
||||||
|
var debug = require('debug');
|
||||||
|
var error = debug('app:error');
|
||||||
|
|
||||||
|
// by default stderr is used
|
||||||
|
error('goes to stderr!');
|
||||||
|
|
||||||
|
var log = debug('app:log');
|
||||||
|
// set this namespace to log via console.log
|
||||||
|
log.log = console.log.bind(console); // don't forget to bind to console!
|
||||||
|
log('goes to stdout');
|
||||||
|
error('still goes to stderr!');
|
||||||
|
|
||||||
|
// set all output to go via console.info
|
||||||
|
// overrides all per-namespace log settings
|
||||||
|
debug.log = console.info.bind(console);
|
||||||
|
error('now goes to stdout via console.info');
|
||||||
|
log('still goes to stdout, but via console.info now');
|
||||||
|
```
|
||||||
|
|
||||||
|
## Extend
|
||||||
|
You can simply extend debugger
|
||||||
|
```js
|
||||||
|
const log = require('debug')('auth');
|
||||||
|
|
||||||
|
//creates new debug instance with extended namespace
|
||||||
|
const logSign = log.extend('sign');
|
||||||
|
const logLogin = log.extend('login');
|
||||||
|
|
||||||
|
log('hello'); // auth hello
|
||||||
|
logSign('hello'); //auth:sign hello
|
||||||
|
logLogin('hello'); //auth:login hello
|
||||||
|
```
|
||||||
|
|
||||||
|
## Set dynamically
|
||||||
|
|
||||||
|
You can also enable debug dynamically by calling the `enable()` method :
|
||||||
|
|
||||||
|
```js
|
||||||
|
let debug = require('debug');
|
||||||
|
|
||||||
|
console.log(1, debug.enabled('test'));
|
||||||
|
|
||||||
|
debug.enable('test');
|
||||||
|
console.log(2, debug.enabled('test'));
|
||||||
|
|
||||||
|
debug.disable();
|
||||||
|
console.log(3, debug.enabled('test'));
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
print :
|
||||||
|
```
|
||||||
|
1 false
|
||||||
|
2 true
|
||||||
|
3 false
|
||||||
|
```
|
||||||
|
|
||||||
|
Usage :
|
||||||
|
`enable(namespaces)`
|
||||||
|
`namespaces` can include modes separated by a colon and wildcards.
|
||||||
|
|
||||||
|
Note that calling `enable()` completely overrides previously set DEBUG variable :
|
||||||
|
|
||||||
|
```
|
||||||
|
$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
|
||||||
|
=> false
|
||||||
|
```
|
||||||
|
|
||||||
|
`disable()`
|
||||||
|
|
||||||
|
Will disable all namespaces. The functions returns the namespaces currently
|
||||||
|
enabled (and skipped). This can be useful if you want to disable debugging
|
||||||
|
temporarily without knowing what was enabled to begin with.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
let debug = require('debug');
|
||||||
|
debug.enable('foo:*,-foo:bar');
|
||||||
|
let namespaces = debug.disable();
|
||||||
|
debug.enable(namespaces);
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: There is no guarantee that the string will be identical to the initial
|
||||||
|
enable string, but semantically they will be identical.
|
||||||
|
|
||||||
|
## Checking whether a debug target is enabled
|
||||||
|
|
||||||
|
After you've created a debug instance, you can determine whether or not it is
|
||||||
|
enabled by checking the `enabled` property:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const debug = require('debug')('http');
|
||||||
|
|
||||||
|
if (debug.enabled) {
|
||||||
|
// do stuff...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also manually toggle this property to force the debug instance to be
|
||||||
|
enabled or disabled.
|
||||||
|
|
||||||
|
## Usage in child processes
|
||||||
|
|
||||||
|
Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process.
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
worker = fork(WORKER_WRAP_PATH, [workerPath], {
|
||||||
|
stdio: [
|
||||||
|
/* stdin: */ 0,
|
||||||
|
/* stdout: */ 'pipe',
|
||||||
|
/* stderr: */ 'pipe',
|
||||||
|
'ipc',
|
||||||
|
],
|
||||||
|
env: Object.assign({}, process.env, {
|
||||||
|
DEBUG_COLORS: 1 // without this settings, colors won't be shown
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.stderr.pipe(process.stderr, { end: false });
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
- TJ Holowaychuk
|
||||||
|
- Nathan Rajlich
|
||||||
|
- Andrew Rhyne
|
||||||
|
- Josh Junon
|
||||||
|
|
||||||
|
## Backers
|
||||||
|
|
||||||
|
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
|
||||||
|
|
||||||
|
|
||||||
|
## Sponsors
|
||||||
|
|
||||||
|
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
|
||||||
|
Copyright (c) 2018-2021 Josh Junon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
59
node_modules/@eslint/eslintrc/node_modules/debug/package.json
generated
vendored
Normal file
59
node_modules/@eslint/eslintrc/node_modules/debug/package.json
generated
vendored
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{
|
||||||
|
"name": "debug",
|
||||||
|
"version": "4.3.4",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/debug-js/debug.git"
|
||||||
|
},
|
||||||
|
"description": "Lightweight debugging utility for Node.js and the browser",
|
||||||
|
"keywords": [
|
||||||
|
"debug",
|
||||||
|
"log",
|
||||||
|
"debugger"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"src",
|
||||||
|
"LICENSE",
|
||||||
|
"README.md"
|
||||||
|
],
|
||||||
|
"author": "Josh Junon <josh.junon@protonmail.com>",
|
||||||
|
"contributors": [
|
||||||
|
"TJ Holowaychuk <tj@vision-media.ca>",
|
||||||
|
"Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
|
||||||
|
"Andrew Rhyne <rhyneandrew@gmail.com>"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "xo",
|
||||||
|
"test": "npm run test:node && npm run test:browser && npm run lint",
|
||||||
|
"test:node": "istanbul cover _mocha -- test.js",
|
||||||
|
"test:browser": "karma start --single-run",
|
||||||
|
"test:coverage": "cat ./coverage/lcov.info | coveralls"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ms": "2.1.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"brfs": "^2.0.1",
|
||||||
|
"browserify": "^16.2.3",
|
||||||
|
"coveralls": "^3.0.2",
|
||||||
|
"istanbul": "^0.4.5",
|
||||||
|
"karma": "^3.1.4",
|
||||||
|
"karma-browserify": "^6.0.0",
|
||||||
|
"karma-chrome-launcher": "^2.2.0",
|
||||||
|
"karma-mocha": "^1.3.0",
|
||||||
|
"mocha": "^5.2.0",
|
||||||
|
"mocha-lcov-reporter": "^1.2.0",
|
||||||
|
"xo": "^0.23.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"supports-color": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"main": "./src/index.js",
|
||||||
|
"browser": "./src/browser.js",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0"
|
||||||
|
}
|
||||||
|
}
|
269
node_modules/@eslint/eslintrc/node_modules/debug/src/browser.js
generated
vendored
Normal file
269
node_modules/@eslint/eslintrc/node_modules/debug/src/browser.js
generated
vendored
Normal file
|
@ -0,0 +1,269 @@
|
||||||
|
/* eslint-env browser */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the web browser implementation of `debug()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.formatArgs = formatArgs;
|
||||||
|
exports.save = save;
|
||||||
|
exports.load = load;
|
||||||
|
exports.useColors = useColors;
|
||||||
|
exports.storage = localstorage();
|
||||||
|
exports.destroy = (() => {
|
||||||
|
let warned = false;
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
if (!warned) {
|
||||||
|
warned = true;
|
||||||
|
console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.colors = [
|
||||||
|
'#0000CC',
|
||||||
|
'#0000FF',
|
||||||
|
'#0033CC',
|
||||||
|
'#0033FF',
|
||||||
|
'#0066CC',
|
||||||
|
'#0066FF',
|
||||||
|
'#0099CC',
|
||||||
|
'#0099FF',
|
||||||
|
'#00CC00',
|
||||||
|
'#00CC33',
|
||||||
|
'#00CC66',
|
||||||
|
'#00CC99',
|
||||||
|
'#00CCCC',
|
||||||
|
'#00CCFF',
|
||||||
|
'#3300CC',
|
||||||
|
'#3300FF',
|
||||||
|
'#3333CC',
|
||||||
|
'#3333FF',
|
||||||
|
'#3366CC',
|
||||||
|
'#3366FF',
|
||||||
|
'#3399CC',
|
||||||
|
'#3399FF',
|
||||||
|
'#33CC00',
|
||||||
|
'#33CC33',
|
||||||
|
'#33CC66',
|
||||||
|
'#33CC99',
|
||||||
|
'#33CCCC',
|
||||||
|
'#33CCFF',
|
||||||
|
'#6600CC',
|
||||||
|
'#6600FF',
|
||||||
|
'#6633CC',
|
||||||
|
'#6633FF',
|
||||||
|
'#66CC00',
|
||||||
|
'#66CC33',
|
||||||
|
'#9900CC',
|
||||||
|
'#9900FF',
|
||||||
|
'#9933CC',
|
||||||
|
'#9933FF',
|
||||||
|
'#99CC00',
|
||||||
|
'#99CC33',
|
||||||
|
'#CC0000',
|
||||||
|
'#CC0033',
|
||||||
|
'#CC0066',
|
||||||
|
'#CC0099',
|
||||||
|
'#CC00CC',
|
||||||
|
'#CC00FF',
|
||||||
|
'#CC3300',
|
||||||
|
'#CC3333',
|
||||||
|
'#CC3366',
|
||||||
|
'#CC3399',
|
||||||
|
'#CC33CC',
|
||||||
|
'#CC33FF',
|
||||||
|
'#CC6600',
|
||||||
|
'#CC6633',
|
||||||
|
'#CC9900',
|
||||||
|
'#CC9933',
|
||||||
|
'#CCCC00',
|
||||||
|
'#CCCC33',
|
||||||
|
'#FF0000',
|
||||||
|
'#FF0033',
|
||||||
|
'#FF0066',
|
||||||
|
'#FF0099',
|
||||||
|
'#FF00CC',
|
||||||
|
'#FF00FF',
|
||||||
|
'#FF3300',
|
||||||
|
'#FF3333',
|
||||||
|
'#FF3366',
|
||||||
|
'#FF3399',
|
||||||
|
'#FF33CC',
|
||||||
|
'#FF33FF',
|
||||||
|
'#FF6600',
|
||||||
|
'#FF6633',
|
||||||
|
'#FF9900',
|
||||||
|
'#FF9933',
|
||||||
|
'#FFCC00',
|
||||||
|
'#FFCC33'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
|
||||||
|
* and the Firebug extension (any Firefox version) are known
|
||||||
|
* to support "%c" CSS customizations.
|
||||||
|
*
|
||||||
|
* TODO: add a `localStorage` variable to explicitly enable/disable colors
|
||||||
|
*/
|
||||||
|
|
||||||
|
// eslint-disable-next-line complexity
|
||||||
|
function useColors() {
|
||||||
|
// NB: In an Electron preload script, document will be defined but not fully
|
||||||
|
// initialized. Since we know we're in Chrome, we'll just detect this case
|
||||||
|
// explicitly
|
||||||
|
if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Internet Explorer and Edge do not support colors.
|
||||||
|
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is webkit? http://stackoverflow.com/a/16459606/376773
|
||||||
|
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
|
||||||
|
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
|
||||||
|
// Is firebug? http://stackoverflow.com/a/398120/376773
|
||||||
|
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
|
||||||
|
// Is firefox >= v31?
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
||||||
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
|
||||||
|
// Double check webkit in userAgent just in case we are in a worker
|
||||||
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colorize log arguments if enabled.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatArgs(args) {
|
||||||
|
args[0] = (this.useColors ? '%c' : '') +
|
||||||
|
this.namespace +
|
||||||
|
(this.useColors ? ' %c' : ' ') +
|
||||||
|
args[0] +
|
||||||
|
(this.useColors ? '%c ' : ' ') +
|
||||||
|
'+' + module.exports.humanize(this.diff);
|
||||||
|
|
||||||
|
if (!this.useColors) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const c = 'color: ' + this.color;
|
||||||
|
args.splice(1, 0, c, 'color: inherit');
|
||||||
|
|
||||||
|
// The final "%c" is somewhat tricky, because there could be other
|
||||||
|
// arguments passed either before or after the %c, so we need to
|
||||||
|
// figure out the correct index to insert the CSS into
|
||||||
|
let index = 0;
|
||||||
|
let lastC = 0;
|
||||||
|
args[0].replace(/%[a-zA-Z%]/g, match => {
|
||||||
|
if (match === '%%') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
if (match === '%c') {
|
||||||
|
// We only are interested in the *last* %c
|
||||||
|
// (the user may have provided their own)
|
||||||
|
lastC = index;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
args.splice(lastC, 0, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes `console.debug()` when available.
|
||||||
|
* No-op when `console.debug` is not a "function".
|
||||||
|
* If `console.debug` is not available, falls back
|
||||||
|
* to `console.log`.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
exports.log = console.debug || console.log || (() => {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save `namespaces`.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function save(namespaces) {
|
||||||
|
try {
|
||||||
|
if (namespaces) {
|
||||||
|
exports.storage.setItem('debug', namespaces);
|
||||||
|
} else {
|
||||||
|
exports.storage.removeItem('debug');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow
|
||||||
|
// XXX (@Qix-) should we be logging these?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load `namespaces`.
|
||||||
|
*
|
||||||
|
* @return {String} returns the previously persisted debug modes
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function load() {
|
||||||
|
let r;
|
||||||
|
try {
|
||||||
|
r = exports.storage.getItem('debug');
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow
|
||||||
|
// XXX (@Qix-) should we be logging these?
|
||||||
|
}
|
||||||
|
|
||||||
|
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
|
||||||
|
if (!r && typeof process !== 'undefined' && 'env' in process) {
|
||||||
|
r = process.env.DEBUG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Localstorage attempts to return the localstorage.
|
||||||
|
*
|
||||||
|
* This is necessary because safari throws
|
||||||
|
* when a user disables cookies/localstorage
|
||||||
|
* and you attempt to access it.
|
||||||
|
*
|
||||||
|
* @return {LocalStorage}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function localstorage() {
|
||||||
|
try {
|
||||||
|
// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
|
||||||
|
// The Browser also has localStorage in the global context.
|
||||||
|
return localStorage;
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow
|
||||||
|
// XXX (@Qix-) should we be logging these?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = require('./common')(exports);
|
||||||
|
|
||||||
|
const {formatters} = module.exports;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
|
||||||
|
*/
|
||||||
|
|
||||||
|
formatters.j = function (v) {
|
||||||
|
try {
|
||||||
|
return JSON.stringify(v);
|
||||||
|
} catch (error) {
|
||||||
|
return '[UnexpectedJSONParseError]: ' + error.message;
|
||||||
|
}
|
||||||
|
};
|
274
node_modules/@eslint/eslintrc/node_modules/debug/src/common.js
generated
vendored
Normal file
274
node_modules/@eslint/eslintrc/node_modules/debug/src/common.js
generated
vendored
Normal file
|
@ -0,0 +1,274 @@
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the common logic for both the Node.js and web browser
|
||||||
|
* implementations of `debug()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function setup(env) {
|
||||||
|
createDebug.debug = createDebug;
|
||||||
|
createDebug.default = createDebug;
|
||||||
|
createDebug.coerce = coerce;
|
||||||
|
createDebug.disable = disable;
|
||||||
|
createDebug.enable = enable;
|
||||||
|
createDebug.enabled = enabled;
|
||||||
|
createDebug.humanize = require('ms');
|
||||||
|
createDebug.destroy = destroy;
|
||||||
|
|
||||||
|
Object.keys(env).forEach(key => {
|
||||||
|
createDebug[key] = env[key];
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The currently active debug mode names, and names to skip.
|
||||||
|
*/
|
||||||
|
|
||||||
|
createDebug.names = [];
|
||||||
|
createDebug.skips = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of special "%n" handling functions, for the debug "format" argument.
|
||||||
|
*
|
||||||
|
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
|
||||||
|
*/
|
||||||
|
createDebug.formatters = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects a color for a debug namespace
|
||||||
|
* @param {String} namespace The namespace string for the debug instance to be colored
|
||||||
|
* @return {Number|String} An ANSI color code for the given namespace
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function selectColor(namespace) {
|
||||||
|
let hash = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < namespace.length; i++) {
|
||||||
|
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
|
||||||
|
hash |= 0; // Convert to 32bit integer
|
||||||
|
}
|
||||||
|
|
||||||
|
return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
|
||||||
|
}
|
||||||
|
createDebug.selectColor = selectColor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a debugger with the given `namespace`.
|
||||||
|
*
|
||||||
|
* @param {String} namespace
|
||||||
|
* @return {Function}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function createDebug(namespace) {
|
||||||
|
let prevTime;
|
||||||
|
let enableOverride = null;
|
||||||
|
let namespacesCache;
|
||||||
|
let enabledCache;
|
||||||
|
|
||||||
|
function debug(...args) {
|
||||||
|
// Disabled?
|
||||||
|
if (!debug.enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const self = debug;
|
||||||
|
|
||||||
|
// Set `diff` timestamp
|
||||||
|
const curr = Number(new Date());
|
||||||
|
const ms = curr - (prevTime || curr);
|
||||||
|
self.diff = ms;
|
||||||
|
self.prev = prevTime;
|
||||||
|
self.curr = curr;
|
||||||
|
prevTime = curr;
|
||||||
|
|
||||||
|
args[0] = createDebug.coerce(args[0]);
|
||||||
|
|
||||||
|
if (typeof args[0] !== 'string') {
|
||||||
|
// Anything else let's inspect with %O
|
||||||
|
args.unshift('%O');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply any `formatters` transformations
|
||||||
|
let index = 0;
|
||||||
|
args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
|
||||||
|
// If we encounter an escaped % then don't increase the array index
|
||||||
|
if (match === '%%') {
|
||||||
|
return '%';
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
const formatter = createDebug.formatters[format];
|
||||||
|
if (typeof formatter === 'function') {
|
||||||
|
const val = args[index];
|
||||||
|
match = formatter.call(self, val);
|
||||||
|
|
||||||
|
// Now we need to remove `args[index]` since it's inlined in the `format`
|
||||||
|
args.splice(index, 1);
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Apply env-specific formatting (colors, etc.)
|
||||||
|
createDebug.formatArgs.call(self, args);
|
||||||
|
|
||||||
|
const logFn = self.log || createDebug.log;
|
||||||
|
logFn.apply(self, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug.namespace = namespace;
|
||||||
|
debug.useColors = createDebug.useColors();
|
||||||
|
debug.color = createDebug.selectColor(namespace);
|
||||||
|
debug.extend = extend;
|
||||||
|
debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
|
||||||
|
|
||||||
|
Object.defineProperty(debug, 'enabled', {
|
||||||
|
enumerable: true,
|
||||||
|
configurable: false,
|
||||||
|
get: () => {
|
||||||
|
if (enableOverride !== null) {
|
||||||
|
return enableOverride;
|
||||||
|
}
|
||||||
|
if (namespacesCache !== createDebug.namespaces) {
|
||||||
|
namespacesCache = createDebug.namespaces;
|
||||||
|
enabledCache = createDebug.enabled(namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
return enabledCache;
|
||||||
|
},
|
||||||
|
set: v => {
|
||||||
|
enableOverride = v;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Env-specific initialization logic for debug instances
|
||||||
|
if (typeof createDebug.init === 'function') {
|
||||||
|
createDebug.init(debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
return debug;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extend(namespace, delimiter) {
|
||||||
|
const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
|
||||||
|
newDebug.log = this.log;
|
||||||
|
return newDebug;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables a debug mode by namespaces. This can include modes
|
||||||
|
* separated by a colon and wildcards.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function enable(namespaces) {
|
||||||
|
createDebug.save(namespaces);
|
||||||
|
createDebug.namespaces = namespaces;
|
||||||
|
|
||||||
|
createDebug.names = [];
|
||||||
|
createDebug.skips = [];
|
||||||
|
|
||||||
|
let i;
|
||||||
|
const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
|
||||||
|
const len = split.length;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
if (!split[i]) {
|
||||||
|
// ignore empty strings
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespaces = split[i].replace(/\*/g, '.*?');
|
||||||
|
|
||||||
|
if (namespaces[0] === '-') {
|
||||||
|
createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
|
||||||
|
} else {
|
||||||
|
createDebug.names.push(new RegExp('^' + namespaces + '$'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable debug output.
|
||||||
|
*
|
||||||
|
* @return {String} namespaces
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function disable() {
|
||||||
|
const namespaces = [
|
||||||
|
...createDebug.names.map(toNamespace),
|
||||||
|
...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
|
||||||
|
].join(',');
|
||||||
|
createDebug.enable('');
|
||||||
|
return namespaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the given mode name is enabled, false otherwise.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Boolean}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function enabled(name) {
|
||||||
|
if (name[name.length - 1] === '*') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let i;
|
||||||
|
let len;
|
||||||
|
|
||||||
|
for (i = 0, len = createDebug.skips.length; i < len; i++) {
|
||||||
|
if (createDebug.skips[i].test(name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0, len = createDebug.names.length; i < len; i++) {
|
||||||
|
if (createDebug.names[i].test(name)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert regexp to namespace
|
||||||
|
*
|
||||||
|
* @param {RegExp} regxep
|
||||||
|
* @return {String} namespace
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function toNamespace(regexp) {
|
||||||
|
return regexp.toString()
|
||||||
|
.substring(2, regexp.toString().length - 2)
|
||||||
|
.replace(/\.\*\?$/, '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coerce `val`.
|
||||||
|
*
|
||||||
|
* @param {Mixed} val
|
||||||
|
* @return {Mixed}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function coerce(val) {
|
||||||
|
if (val instanceof Error) {
|
||||||
|
return val.stack || val.message;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XXX DO NOT USE. This is a temporary stub function.
|
||||||
|
* XXX It WILL be removed in the next major release.
|
||||||
|
*/
|
||||||
|
function destroy() {
|
||||||
|
console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
|
||||||
|
}
|
||||||
|
|
||||||
|
createDebug.enable(createDebug.load());
|
||||||
|
|
||||||
|
return createDebug;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = setup;
|
10
node_modules/@eslint/eslintrc/node_modules/debug/src/index.js
generated
vendored
Normal file
10
node_modules/@eslint/eslintrc/node_modules/debug/src/index.js
generated
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/**
|
||||||
|
* Detect Electron renderer / nwjs process, which is node, but we should
|
||||||
|
* treat as a browser.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
|
||||||
|
module.exports = require('./browser.js');
|
||||||
|
} else {
|
||||||
|
module.exports = require('./node.js');
|
||||||
|
}
|
263
node_modules/@eslint/eslintrc/node_modules/debug/src/node.js
generated
vendored
Normal file
263
node_modules/@eslint/eslintrc/node_modules/debug/src/node.js
generated
vendored
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const tty = require('tty');
|
||||||
|
const util = require('util');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the Node.js implementation of `debug()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.init = init;
|
||||||
|
exports.log = log;
|
||||||
|
exports.formatArgs = formatArgs;
|
||||||
|
exports.save = save;
|
||||||
|
exports.load = load;
|
||||||
|
exports.useColors = useColors;
|
||||||
|
exports.destroy = util.deprecate(
|
||||||
|
() => {},
|
||||||
|
'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.colors = [6, 2, 3, 4, 5, 1];
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
|
||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||||
|
const supportsColor = require('supports-color');
|
||||||
|
|
||||||
|
if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
|
||||||
|
exports.colors = [
|
||||||
|
20,
|
||||||
|
21,
|
||||||
|
26,
|
||||||
|
27,
|
||||||
|
32,
|
||||||
|
33,
|
||||||
|
38,
|
||||||
|
39,
|
||||||
|
40,
|
||||||
|
41,
|
||||||
|
42,
|
||||||
|
43,
|
||||||
|
44,
|
||||||
|
45,
|
||||||
|
56,
|
||||||
|
57,
|
||||||
|
62,
|
||||||
|
63,
|
||||||
|
68,
|
||||||
|
69,
|
||||||
|
74,
|
||||||
|
75,
|
||||||
|
76,
|
||||||
|
77,
|
||||||
|
78,
|
||||||
|
79,
|
||||||
|
80,
|
||||||
|
81,
|
||||||
|
92,
|
||||||
|
93,
|
||||||
|
98,
|
||||||
|
99,
|
||||||
|
112,
|
||||||
|
113,
|
||||||
|
128,
|
||||||
|
129,
|
||||||
|
134,
|
||||||
|
135,
|
||||||
|
148,
|
||||||
|
149,
|
||||||
|
160,
|
||||||
|
161,
|
||||||
|
162,
|
||||||
|
163,
|
||||||
|
164,
|
||||||
|
165,
|
||||||
|
166,
|
||||||
|
167,
|
||||||
|
168,
|
||||||
|
169,
|
||||||
|
170,
|
||||||
|
171,
|
||||||
|
172,
|
||||||
|
173,
|
||||||
|
178,
|
||||||
|
179,
|
||||||
|
184,
|
||||||
|
185,
|
||||||
|
196,
|
||||||
|
197,
|
||||||
|
198,
|
||||||
|
199,
|
||||||
|
200,
|
||||||
|
201,
|
||||||
|
202,
|
||||||
|
203,
|
||||||
|
204,
|
||||||
|
205,
|
||||||
|
206,
|
||||||
|
207,
|
||||||
|
208,
|
||||||
|
209,
|
||||||
|
214,
|
||||||
|
215,
|
||||||
|
220,
|
||||||
|
221
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow - we only care if `supports-color` is available; it doesn't have to be.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build up the default `inspectOpts` object from the environment variables.
|
||||||
|
*
|
||||||
|
* $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.inspectOpts = Object.keys(process.env).filter(key => {
|
||||||
|
return /^debug_/i.test(key);
|
||||||
|
}).reduce((obj, key) => {
|
||||||
|
// Camel-case
|
||||||
|
const prop = key
|
||||||
|
.substring(6)
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/_([a-z])/g, (_, k) => {
|
||||||
|
return k.toUpperCase();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Coerce string value into JS value
|
||||||
|
let val = process.env[key];
|
||||||
|
if (/^(yes|on|true|enabled)$/i.test(val)) {
|
||||||
|
val = true;
|
||||||
|
} else if (/^(no|off|false|disabled)$/i.test(val)) {
|
||||||
|
val = false;
|
||||||
|
} else if (val === 'null') {
|
||||||
|
val = null;
|
||||||
|
} else {
|
||||||
|
val = Number(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj[prop] = val;
|
||||||
|
return obj;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is stdout a TTY? Colored output is enabled when `true`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function useColors() {
|
||||||
|
return 'colors' in exports.inspectOpts ?
|
||||||
|
Boolean(exports.inspectOpts.colors) :
|
||||||
|
tty.isatty(process.stderr.fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds ANSI color escape codes if enabled.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatArgs(args) {
|
||||||
|
const {namespace: name, useColors} = this;
|
||||||
|
|
||||||
|
if (useColors) {
|
||||||
|
const c = this.color;
|
||||||
|
const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
|
||||||
|
const prefix = ` ${colorCode};1m${name} \u001B[0m`;
|
||||||
|
|
||||||
|
args[0] = prefix + args[0].split('\n').join('\n' + prefix);
|
||||||
|
args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
|
||||||
|
} else {
|
||||||
|
args[0] = getDate() + name + ' ' + args[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDate() {
|
||||||
|
if (exports.inspectOpts.hideDate) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return new Date().toISOString() + ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes `util.format()` with the specified arguments and writes to stderr.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function log(...args) {
|
||||||
|
return process.stderr.write(util.format(...args) + '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save `namespaces`.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function save(namespaces) {
|
||||||
|
if (namespaces) {
|
||||||
|
process.env.DEBUG = namespaces;
|
||||||
|
} else {
|
||||||
|
// If you set a process.env field to null or undefined, it gets cast to the
|
||||||
|
// string 'null' or 'undefined'. Just delete instead.
|
||||||
|
delete process.env.DEBUG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load `namespaces`.
|
||||||
|
*
|
||||||
|
* @return {String} returns the previously persisted debug modes
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function load() {
|
||||||
|
return process.env.DEBUG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init logic for `debug` instances.
|
||||||
|
*
|
||||||
|
* Create a new `inspectOpts` object in case `useColors` is set
|
||||||
|
* differently for a particular `debug` instance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function init(debug) {
|
||||||
|
debug.inspectOpts = {};
|
||||||
|
|
||||||
|
const keys = Object.keys(exports.inspectOpts);
|
||||||
|
for (let i = 0; i < keys.length; i++) {
|
||||||
|
debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = require('./common')(exports);
|
||||||
|
|
||||||
|
const {formatters} = module.exports;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %o to `util.inspect()`, all on a single line.
|
||||||
|
*/
|
||||||
|
|
||||||
|
formatters.o = function (v) {
|
||||||
|
this.inspectOpts.colors = this.useColors;
|
||||||
|
return util.inspect(v, this.inspectOpts)
|
||||||
|
.split('\n')
|
||||||
|
.map(str => str.trim())
|
||||||
|
.join(' ');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %O to `util.inspect()`, allowing multiple lines if needed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
formatters.O = function (v) {
|
||||||
|
this.inspectOpts.colors = this.useColors;
|
||||||
|
return util.inspect(v, this.inspectOpts);
|
||||||
|
};
|
162
node_modules/@eslint/eslintrc/node_modules/ms/index.js
generated
vendored
Normal file
162
node_modules/@eslint/eslintrc/node_modules/ms/index.js
generated
vendored
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/**
|
||||||
|
* Helpers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var s = 1000;
|
||||||
|
var m = s * 60;
|
||||||
|
var h = m * 60;
|
||||||
|
var d = h * 24;
|
||||||
|
var w = d * 7;
|
||||||
|
var y = d * 365.25;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse or format the given `val`.
|
||||||
|
*
|
||||||
|
* Options:
|
||||||
|
*
|
||||||
|
* - `long` verbose formatting [false]
|
||||||
|
*
|
||||||
|
* @param {String|Number} val
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @throws {Error} throw an error if val is not a non-empty string or a number
|
||||||
|
* @return {String|Number}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function(val, options) {
|
||||||
|
options = options || {};
|
||||||
|
var type = typeof val;
|
||||||
|
if (type === 'string' && val.length > 0) {
|
||||||
|
return parse(val);
|
||||||
|
} else if (type === 'number' && isFinite(val)) {
|
||||||
|
return options.long ? fmtLong(val) : fmtShort(val);
|
||||||
|
}
|
||||||
|
throw new Error(
|
||||||
|
'val is not a non-empty string or a valid number. val=' +
|
||||||
|
JSON.stringify(val)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the given `str` and return milliseconds.
|
||||||
|
*
|
||||||
|
* @param {String} str
|
||||||
|
* @return {Number}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parse(str) {
|
||||||
|
str = String(str);
|
||||||
|
if (str.length > 100) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
|
||||||
|
str
|
||||||
|
);
|
||||||
|
if (!match) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var n = parseFloat(match[1]);
|
||||||
|
var type = (match[2] || 'ms').toLowerCase();
|
||||||
|
switch (type) {
|
||||||
|
case 'years':
|
||||||
|
case 'year':
|
||||||
|
case 'yrs':
|
||||||
|
case 'yr':
|
||||||
|
case 'y':
|
||||||
|
return n * y;
|
||||||
|
case 'weeks':
|
||||||
|
case 'week':
|
||||||
|
case 'w':
|
||||||
|
return n * w;
|
||||||
|
case 'days':
|
||||||
|
case 'day':
|
||||||
|
case 'd':
|
||||||
|
return n * d;
|
||||||
|
case 'hours':
|
||||||
|
case 'hour':
|
||||||
|
case 'hrs':
|
||||||
|
case 'hr':
|
||||||
|
case 'h':
|
||||||
|
return n * h;
|
||||||
|
case 'minutes':
|
||||||
|
case 'minute':
|
||||||
|
case 'mins':
|
||||||
|
case 'min':
|
||||||
|
case 'm':
|
||||||
|
return n * m;
|
||||||
|
case 'seconds':
|
||||||
|
case 'second':
|
||||||
|
case 'secs':
|
||||||
|
case 'sec':
|
||||||
|
case 's':
|
||||||
|
return n * s;
|
||||||
|
case 'milliseconds':
|
||||||
|
case 'millisecond':
|
||||||
|
case 'msecs':
|
||||||
|
case 'msec':
|
||||||
|
case 'ms':
|
||||||
|
return n;
|
||||||
|
default:
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short format for `ms`.
|
||||||
|
*
|
||||||
|
* @param {Number} ms
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fmtShort(ms) {
|
||||||
|
var msAbs = Math.abs(ms);
|
||||||
|
if (msAbs >= d) {
|
||||||
|
return Math.round(ms / d) + 'd';
|
||||||
|
}
|
||||||
|
if (msAbs >= h) {
|
||||||
|
return Math.round(ms / h) + 'h';
|
||||||
|
}
|
||||||
|
if (msAbs >= m) {
|
||||||
|
return Math.round(ms / m) + 'm';
|
||||||
|
}
|
||||||
|
if (msAbs >= s) {
|
||||||
|
return Math.round(ms / s) + 's';
|
||||||
|
}
|
||||||
|
return ms + 'ms';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Long format for `ms`.
|
||||||
|
*
|
||||||
|
* @param {Number} ms
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fmtLong(ms) {
|
||||||
|
var msAbs = Math.abs(ms);
|
||||||
|
if (msAbs >= d) {
|
||||||
|
return plural(ms, msAbs, d, 'day');
|
||||||
|
}
|
||||||
|
if (msAbs >= h) {
|
||||||
|
return plural(ms, msAbs, h, 'hour');
|
||||||
|
}
|
||||||
|
if (msAbs >= m) {
|
||||||
|
return plural(ms, msAbs, m, 'minute');
|
||||||
|
}
|
||||||
|
if (msAbs >= s) {
|
||||||
|
return plural(ms, msAbs, s, 'second');
|
||||||
|
}
|
||||||
|
return ms + ' ms';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pluralization helper.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function plural(ms, msAbs, n, name) {
|
||||||
|
var isPlural = msAbs >= n * 1.5;
|
||||||
|
return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
|
||||||
|
}
|
21
node_modules/@eslint/eslintrc/node_modules/ms/license.md
generated
vendored
Normal file
21
node_modules/@eslint/eslintrc/node_modules/ms/license.md
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Zeit, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
37
node_modules/@eslint/eslintrc/node_modules/ms/package.json
generated
vendored
Normal file
37
node_modules/@eslint/eslintrc/node_modules/ms/package.json
generated
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
"name": "ms",
|
||||||
|
"version": "2.1.2",
|
||||||
|
"description": "Tiny millisecond conversion utility",
|
||||||
|
"repository": "zeit/ms",
|
||||||
|
"main": "./index",
|
||||||
|
"files": [
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"precommit": "lint-staged",
|
||||||
|
"lint": "eslint lib/* bin/*",
|
||||||
|
"test": "mocha tests.js"
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"env": {
|
||||||
|
"node": true,
|
||||||
|
"es6": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"*.js": [
|
||||||
|
"npm run lint",
|
||||||
|
"prettier --single-quote --write",
|
||||||
|
"git add"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "4.12.1",
|
||||||
|
"expect.js": "0.3.1",
|
||||||
|
"husky": "0.14.3",
|
||||||
|
"lint-staged": "5.0.0",
|
||||||
|
"mocha": "4.0.1"
|
||||||
|
}
|
||||||
|
}
|
60
node_modules/@eslint/eslintrc/node_modules/ms/readme.md
generated
vendored
Normal file
60
node_modules/@eslint/eslintrc/node_modules/ms/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# ms
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
|
||||||
|
[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit)
|
||||||
|
|
||||||
|
Use this package to easily convert various time formats to milliseconds.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```js
|
||||||
|
ms('2 days') // 172800000
|
||||||
|
ms('1d') // 86400000
|
||||||
|
ms('10h') // 36000000
|
||||||
|
ms('2.5 hrs') // 9000000
|
||||||
|
ms('2h') // 7200000
|
||||||
|
ms('1m') // 60000
|
||||||
|
ms('5s') // 5000
|
||||||
|
ms('1y') // 31557600000
|
||||||
|
ms('100') // 100
|
||||||
|
ms('-3 days') // -259200000
|
||||||
|
ms('-1h') // -3600000
|
||||||
|
ms('-200') // -200
|
||||||
|
```
|
||||||
|
|
||||||
|
### Convert from Milliseconds
|
||||||
|
|
||||||
|
```js
|
||||||
|
ms(60000) // "1m"
|
||||||
|
ms(2 * 60000) // "2m"
|
||||||
|
ms(-3 * 60000) // "-3m"
|
||||||
|
ms(ms('10 hours')) // "10h"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Time Format Written-Out
|
||||||
|
|
||||||
|
```js
|
||||||
|
ms(60000, { long: true }) // "1 minute"
|
||||||
|
ms(2 * 60000, { long: true }) // "2 minutes"
|
||||||
|
ms(-3 * 60000, { long: true }) // "-3 minutes"
|
||||||
|
ms(ms('10 hours'), { long: true }) // "10 hours"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Works both in [Node.js](https://nodejs.org) and in the browser
|
||||||
|
- If a number is supplied to `ms`, a string with a unit is returned
|
||||||
|
- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
|
||||||
|
- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
|
||||||
|
|
||||||
|
## Related Packages
|
||||||
|
|
||||||
|
- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
|
||||||
|
|
||||||
|
## Caught a Bug?
|
||||||
|
|
||||||
|
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
|
||||||
|
2. Link the package to the global module directory: `npm link`
|
||||||
|
3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
|
||||||
|
|
||||||
|
As always, you can run the tests using: `npm test`
|
81
node_modules/@eslint/eslintrc/package.json
generated
vendored
Normal file
81
node_modules/@eslint/eslintrc/package.json
generated
vendored
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
{
|
||||||
|
"name": "@eslint/eslintrc",
|
||||||
|
"version": "1.3.0",
|
||||||
|
"description": "The legacy ESLintRC config file format for ESLint",
|
||||||
|
"type": "module",
|
||||||
|
"main": "./dist/eslintrc.cjs",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"import": "./lib/index.js",
|
||||||
|
"require": "./dist/eslintrc.cjs"
|
||||||
|
},
|
||||||
|
"./package.json": "./package.json",
|
||||||
|
"./universal": {
|
||||||
|
"import": "./lib/index-universal.js",
|
||||||
|
"require": "./dist/eslintrc-universal.cjs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"lib",
|
||||||
|
"conf",
|
||||||
|
"LICENSE",
|
||||||
|
"dist",
|
||||||
|
"universal.js"
|
||||||
|
],
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"prepare": "npm run build",
|
||||||
|
"build": "rollup -c",
|
||||||
|
"lint": "eslint . --report-unused-disable-directives",
|
||||||
|
"fix": "npm run lint -- --fix",
|
||||||
|
"test": "mocha -R progress -c 'tests/lib/*.cjs' && c8 mocha -R progress -c 'tests/lib/**/*.js'",
|
||||||
|
"generate-release": "eslint-generate-release",
|
||||||
|
"generate-alpharelease": "eslint-generate-prerelease alpha",
|
||||||
|
"generate-betarelease": "eslint-generate-prerelease beta",
|
||||||
|
"generate-rcrelease": "eslint-generate-prerelease rc",
|
||||||
|
"publish-release": "eslint-publish-release"
|
||||||
|
},
|
||||||
|
"repository": "eslint/eslintrc",
|
||||||
|
"keywords": [
|
||||||
|
"ESLint",
|
||||||
|
"ESLintRC",
|
||||||
|
"Configuration"
|
||||||
|
],
|
||||||
|
"author": "Nicholas C. Zakas",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/eslint/eslintrc/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/eslint/eslintrc#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"c8": "^7.7.3",
|
||||||
|
"chai": "^4.3.4",
|
||||||
|
"eslint": "^7.31.0",
|
||||||
|
"eslint-config-eslint": "^7.0.0",
|
||||||
|
"eslint-plugin-jsdoc": "^35.4.1",
|
||||||
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
"eslint-release": "^3.2.0",
|
||||||
|
"fs-teardown": "^0.1.3",
|
||||||
|
"mocha": "^9.0.3",
|
||||||
|
"rollup": "^2.70.1",
|
||||||
|
"shelljs": "^0.8.4",
|
||||||
|
"sinon": "^11.1.2",
|
||||||
|
"temp-dir": "^2.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ajv": "^6.12.4",
|
||||||
|
"debug": "^4.3.2",
|
||||||
|
"espree": "^9.3.2",
|
||||||
|
"globals": "^13.15.0",
|
||||||
|
"ignore": "^5.2.0",
|
||||||
|
"import-fresh": "^3.2.1",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
|
"minimatch": "^3.1.2",
|
||||||
|
"strip-json-comments": "^3.1.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
|
}
|
||||||
|
}
|
9
node_modules/@eslint/eslintrc/universal.js
generated
vendored
Normal file
9
node_modules/@eslint/eslintrc/universal.js
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
// Jest (and probably some other runtimes with custom implementations of
|
||||||
|
// `require`) doesn't support `exports` in `package.json`, so this file is here
|
||||||
|
// to help them load this module. Note that it is also `.js` and not `.cjs` for
|
||||||
|
// the same reason - `cjs` files requires to be loaded with an extension, but
|
||||||
|
// since Jest doesn't respect `module` outside of ESM mode it still works in
|
||||||
|
// this case (and the `require` in _this_ file does specify the extension).
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-undef
|
||||||
|
module.exports = require("./dist/eslintrc-universal.cjs");
|
71
node_modules/@humanwhocodes/config-array/CHANGELOG.md
generated
vendored
Normal file
71
node_modules/@humanwhocodes/config-array/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
### [0.9.5](https://www.github.com/humanwhocodes/config-array/compare/v0.9.4...v0.9.5) (2022-02-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Ensure dot directories are matched correctly ([6e8d180](https://www.github.com/humanwhocodes/config-array/commit/6e8d180f43cedf3c2072d8a1229470e9fafabf5b))
|
||||||
|
* preprocessConfig should have correct 'this' value ([9641540](https://www.github.com/humanwhocodes/config-array/commit/96415402cf0012ccf8e4af6c7b934dfc1a058986))
|
||||||
|
|
||||||
|
### [0.9.4](https://www.github.com/humanwhocodes/config-array/compare/v0.9.3...v0.9.4) (2022-01-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Negated patterns to work when files match ([398c811](https://www.github.com/humanwhocodes/config-array/commit/398c8119d359493dc7b82b40df4d92ea6528375f))
|
||||||
|
|
||||||
|
### [0.9.3](https://www.github.com/humanwhocodes/config-array/compare/v0.9.2...v0.9.3) (2022-01-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Make negated ignore patterns work like gitignore ([4ee8e99](https://www.github.com/humanwhocodes/config-array/commit/4ee8e998436e2c4538b06476e0bead8a44fe5a1b))
|
||||||
|
|
||||||
|
### [0.9.2](https://www.github.com/humanwhocodes/config-array/compare/v0.9.1...v0.9.2) (2021-11-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Object merging error by upgrading object-schema ([377d06d](https://www.github.com/humanwhocodes/config-array/commit/377d06d2a44d781b0bec70b3389c48b3d5a63f94))
|
||||||
|
|
||||||
|
### [0.9.1](https://www.github.com/humanwhocodes/config-array/compare/v0.9.0...v0.9.1) (2021-10-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Properly build package for release ([168155f](https://www.github.com/humanwhocodes/config-array/commit/168155f3fed91ab35566c452efd28debf8ec2b85))
|
||||||
|
|
||||||
|
## [0.9.0](https://www.github.com/humanwhocodes/config-array/compare/v0.8.0...v0.9.0) (2021-10-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* getConfig() now returns undefined when no configs match. ([a563b82](https://www.github.com/humanwhocodes/config-array/commit/a563b8255d4eb2bb7745314e3f00ef53792b343f))
|
||||||
|
|
||||||
|
## [0.8.0](https://www.github.com/humanwhocodes/config-array/compare/v0.7.0...v0.8.0) (2021-10-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Add isIgnored() method ([343e5a0](https://www.github.com/humanwhocodes/config-array/commit/343e5a0a9e32028bfc6c0bf1ec0c6badf74f47f9))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Ensure global ignores are honored ([343e5a0](https://www.github.com/humanwhocodes/config-array/commit/343e5a0a9e32028bfc6c0bf1ec0c6badf74f47f9))
|
||||||
|
|
||||||
|
## [0.7.0](https://www.github.com/humanwhocodes/config-array/compare/v0.6.0...v0.7.0) (2021-09-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Only object configs by default ([5645f24](https://www.github.com/humanwhocodes/config-array/commit/5645f241b2412a3263a02ef9e3a9bd19cc86035d))
|
||||||
|
|
||||||
|
## [0.6.0](https://www.github.com/humanwhocodes/config-array/compare/v0.5.0...v0.6.0) (2021-04-20)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Add the normalizeSync() method ([3e347f9](https://www.github.com/humanwhocodes/config-array/commit/3e347f9d77c5ca2b15995e75ff7bc4fb96b7d66e))
|
||||||
|
* Allow async config functions ([a9def0f](https://www.github.com/humanwhocodes/config-array/commit/a9def0faf579c223349dfe08d2486756840538c3))
|
201
node_modules/@humanwhocodes/config-array/LICENSE
generated
vendored
Normal file
201
node_modules/@humanwhocodes/config-array/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
301
node_modules/@humanwhocodes/config-array/README.md
generated
vendored
Normal file
301
node_modules/@humanwhocodes/config-array/README.md
generated
vendored
Normal file
|
@ -0,0 +1,301 @@
|
||||||
|
# Config Array
|
||||||
|
|
||||||
|
by [Nicholas C. Zakas](https://humanwhocodes.com)
|
||||||
|
|
||||||
|
If you find this useful, please consider supporting my work with a [donation](https://humanwhocodes.com/donate).
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
A config array is a way of managing configurations that are based on glob pattern matching of filenames. Each config array contains the information needed to determine the correct configuration for any file based on the filename.
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
In 2019, I submitted an [ESLint RFC](https://github.com/eslint/rfcs/pull/9) proposing a new way of configuring ESLint. The goal was to streamline what had become an increasingly complicated configuration process. Over several iterations, this proposal was eventually born.
|
||||||
|
|
||||||
|
The basic idea is that all configuration, including overrides, can be represented by a single array where each item in the array is a config object. Config objects appearing later in the array override config objects appearing earlier in the array. You can calculate a config for a given file by traversing all config objects in the array to find the ones that match the filename. Matching is done by specifying glob patterns in `files` and `ignores` properties on each config object. Here's an example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export default [
|
||||||
|
|
||||||
|
// match all JSON files
|
||||||
|
{
|
||||||
|
name: "JSON Handler",
|
||||||
|
files: ["**/*.json"],
|
||||||
|
handler: jsonHandler
|
||||||
|
},
|
||||||
|
|
||||||
|
// match only package.json
|
||||||
|
{
|
||||||
|
name: "package.json Handler",
|
||||||
|
files: ["package.json"],
|
||||||
|
handler: packageJsonHandler
|
||||||
|
}
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, there are two config objects: the first matches all JSON files in all directories and the second matches just `package.json` in the base path directory (all the globs are evaluated as relative to a base path that can be specified). When you retrieve a configuration for `foo.json`, only the first config object matches so `handler` is equal to `jsonHandler`; when you retrieve a configuration for `package.json`, `handler` is equal to `packageJsonHandler` (because both config objects match, the second one wins).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can install the package using npm or Yarn:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @humanwhocodes/config-array --save
|
||||||
|
|
||||||
|
# or
|
||||||
|
|
||||||
|
yarn add @humanwhocodes/config-array
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
First, import the `ConfigArray` constructor:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { ConfigArray } from "@humanwhocodes/config-array";
|
||||||
|
|
||||||
|
// or using CommonJS
|
||||||
|
|
||||||
|
const { ConfigArray } = require("@humanwhocodes/config-array");
|
||||||
|
```
|
||||||
|
|
||||||
|
When you create a new instance of `ConfigArray`, you must pass in two arguments: an array of configs and an options object. The array of configs is most likely read in from a configuration file, so here's a typical example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const configFilename = path.resolve(process.cwd(), "my.config.js");
|
||||||
|
const { default: rawConfigs } = await import(configFilename);
|
||||||
|
const configs = new ConfigArray(rawConfigs, {
|
||||||
|
|
||||||
|
// the path to match filenames from
|
||||||
|
basePath: process.cwd(),
|
||||||
|
|
||||||
|
// additional items in each config
|
||||||
|
schema: mySchema
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
This example reads in an object or array from `my.config.js` and passes it into the `ConfigArray` constructor as the first argument. The second argument is an object specifying the `basePath` (the directoy in which `my.config.js` is found) and a `schema` to define the additional properties of a config object beyond `files`, `ignores`, and `name`.
|
||||||
|
|
||||||
|
### Specifying a Schema
|
||||||
|
|
||||||
|
The `schema` option is required for you to use additional properties in config objects. The schema is object that follows the format of an [`ObjectSchema`](https://npmjs.com/package/@humanwhocodes/object-schema). The schema specifies both validation and merge rules that the `ConfigArray` instance needs to combine configs when there are multiple matches. Here's an example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const configFilename = path.resolve(process.cwd(), "my.config.js");
|
||||||
|
const { default: rawConfigs } = await import(configFilename);
|
||||||
|
|
||||||
|
const mySchema = {
|
||||||
|
|
||||||
|
// define the handler key in configs
|
||||||
|
handler: {
|
||||||
|
required: true,
|
||||||
|
merge(a, b) {
|
||||||
|
if (!b) return a;
|
||||||
|
if (!a) return b;
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
if (typeof value !== "function") {
|
||||||
|
throw new TypeError("Function expected.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const configs = new ConfigArray(rawConfigs, {
|
||||||
|
|
||||||
|
// the path to match filenames from
|
||||||
|
basePath: process.cwd(),
|
||||||
|
|
||||||
|
// additional item schemas in each config
|
||||||
|
schema: mySchema,
|
||||||
|
|
||||||
|
// additional config types supported (default: [])
|
||||||
|
extraConfigTypes: ["array", "function"];
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Config Arrays
|
||||||
|
|
||||||
|
Config arrays can be multidimensional, so it's possible for a config array to contain another config array when `extraConfigTypes` contains `"array"`, such as:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export default [
|
||||||
|
|
||||||
|
// JS config
|
||||||
|
{
|
||||||
|
files: ["**/*.js"],
|
||||||
|
handler: jsHandler
|
||||||
|
},
|
||||||
|
|
||||||
|
// JSON configs
|
||||||
|
[
|
||||||
|
|
||||||
|
// match all JSON files
|
||||||
|
{
|
||||||
|
name: "JSON Handler",
|
||||||
|
files: ["**/*.json"],
|
||||||
|
handler: jsonHandler
|
||||||
|
},
|
||||||
|
|
||||||
|
// match only package.json
|
||||||
|
{
|
||||||
|
name: "package.json Handler",
|
||||||
|
files: ["package.json"],
|
||||||
|
handler: packageJsonHandler
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
// filename must match function
|
||||||
|
{
|
||||||
|
files: [ filePath => filePath.endsWith(".md") ],
|
||||||
|
handler: markdownHandler
|
||||||
|
},
|
||||||
|
|
||||||
|
// filename must match all patterns in subarray
|
||||||
|
{
|
||||||
|
files: [ ["*.test.*", "*.js"] ],
|
||||||
|
handler: jsTestHandler
|
||||||
|
},
|
||||||
|
|
||||||
|
// filename must not match patterns beginning with !
|
||||||
|
{
|
||||||
|
name: "Non-JS files",
|
||||||
|
files: ["!*.js"],
|
||||||
|
settings: {
|
||||||
|
js: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, the array contains both config objects and a config array. When a config array is normalized (see details below), it is flattened so only config objects remain. However, the order of evaluation remains the same.
|
||||||
|
|
||||||
|
If the `files` array contains a function, then that function is called with the absolute path of the file and is expected to return `true` if there is a match and `false` if not. (The `ignores` array can also contain functions.)
|
||||||
|
|
||||||
|
If the `files` array contains an item that is an array of strings and functions, then all patterns must match in order for the config to match. In the preceding examples, both `*.test.*` and `*.js` must match in order for the config object to be used.
|
||||||
|
|
||||||
|
If a pattern in the files array begins with `!` then it excludes that pattern. In the preceding example, any filename that doesn't end with `.js` will automatically getting a `settings.js` property set to `false`.
|
||||||
|
|
||||||
|
You can also specify an `ignores` key that will force files matching those patterns to not be included. If the `ignores` key is in a config object without a `files` key, then those ignores will always be applied; if the `ignores` key is in a config object with a `files` key, then those ignores are only applied when `files` matches. Here's an example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export default [
|
||||||
|
|
||||||
|
// Always ignored
|
||||||
|
{
|
||||||
|
ignores: ["**/.git/**", "**/node_modules/**"]
|
||||||
|
},
|
||||||
|
|
||||||
|
// .eslintrc.js file is ignored only when .js file matches
|
||||||
|
{
|
||||||
|
files: ["**/*.js"],
|
||||||
|
ignores: [".eslintrc.js"]
|
||||||
|
handler: jsHandler
|
||||||
|
}
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
You can use negated patterns in `ignores` to exclude a file that was already ignored, such as:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export default [
|
||||||
|
|
||||||
|
// Ignore all JSON files except tsconfig.json
|
||||||
|
{
|
||||||
|
ignores: ["**/*.json", "!tsconfig.json"]
|
||||||
|
},
|
||||||
|
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
### Config Functions
|
||||||
|
|
||||||
|
Config arrays can also include config functions when `extraConfigTypes` contains `"function"`. A config function accepts a single parameter, `context` (defined by you), and must return either a config object or a config array (it cannot return another function). Config functions allow end users to execute code in the creation of appropriate config objects. Here's an example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export default [
|
||||||
|
|
||||||
|
// JS config
|
||||||
|
{
|
||||||
|
files: ["**/*.js"],
|
||||||
|
handler: jsHandler
|
||||||
|
},
|
||||||
|
|
||||||
|
// JSON configs
|
||||||
|
function (context) {
|
||||||
|
return [
|
||||||
|
|
||||||
|
// match all JSON files
|
||||||
|
{
|
||||||
|
name: context.name + " JSON Handler",
|
||||||
|
files: ["**/*.json"],
|
||||||
|
handler: jsonHandler
|
||||||
|
},
|
||||||
|
|
||||||
|
// match only package.json
|
||||||
|
{
|
||||||
|
name: context.name + " package.json Handler",
|
||||||
|
files: ["package.json"],
|
||||||
|
handler: packageJsonHandler
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
When a config array is normalized, each function is executed and replaced in the config array with the return value.
|
||||||
|
|
||||||
|
**Note:** Config functions can also be async.
|
||||||
|
|
||||||
|
### Normalizing Config Arrays
|
||||||
|
|
||||||
|
Once a config array has been created and loaded with all of the raw config data, it must be normalized before it can be used. The normalization process goes through and flattens the config array as well as executing all config functions to get their final values.
|
||||||
|
|
||||||
|
To normalize a config array, call the `normalize()` method and pass in a context object:
|
||||||
|
|
||||||
|
```js
|
||||||
|
await configs.normalize({
|
||||||
|
name: "MyApp"
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
The `normalize()` method returns a promise, so be sure to use the `await` operator. The config array instance is normalized in-place, so you don't need to create a new variable.
|
||||||
|
|
||||||
|
If you want to disallow async config functions, you can call `normalizeSync()` instead. This method is completely synchronous and does not require using the `await` operator as it does not return a promise:
|
||||||
|
|
||||||
|
```js
|
||||||
|
await configs.normalizeSync({
|
||||||
|
name: "MyApp"
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important:** Once a `ConfigArray` is normalized, it cannot be changed further. You can, however, create a new `ConfigArray` and pass in the normalized instance to create an unnormalized copy.
|
||||||
|
|
||||||
|
### Getting Config for a File
|
||||||
|
|
||||||
|
To get the config for a file, use the `getConfig()` method on a normalized config array and pass in the filename to get a config for:
|
||||||
|
|
||||||
|
```js
|
||||||
|
// pass in absolute filename
|
||||||
|
const fileConfig = configs.getConfig(path.resolve(process.cwd(), "package.json"));
|
||||||
|
```
|
||||||
|
|
||||||
|
The config array always returns an object, even if there are no configs matching the given filename. You can then inspect the returned config object to determine how to proceed.
|
||||||
|
|
||||||
|
A few things to keep in mind:
|
||||||
|
|
||||||
|
* You must pass in the absolute filename to get a config for.
|
||||||
|
* The returned config object never has `files`, `ignores`, or `name` properties; the only properties on the object will be the other configuration options specified.
|
||||||
|
* The config array caches configs, so subsequent calls to `getConfig()` with the same filename will return in a fast lookup rather than another calculation.
|
||||||
|
|
||||||
|
## Acknowledgements
|
||||||
|
|
||||||
|
The design of this project was influenced by feedback on the ESLint RFC, and incorporates ideas from:
|
||||||
|
|
||||||
|
* Teddy Katz (@not-an-aardvark)
|
||||||
|
* Toru Nagashima (@mysticatea)
|
||||||
|
* Kai Cataldo (@kaicataldo)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Apache 2.0
|
695
node_modules/@humanwhocodes/config-array/api.js
generated
vendored
Normal file
695
node_modules/@humanwhocodes/config-array/api.js
generated
vendored
Normal file
|
@ -0,0 +1,695 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
|
||||||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
||||||
|
|
||||||
|
var path = _interopDefault(require('path'));
|
||||||
|
var minimatch = _interopDefault(require('minimatch'));
|
||||||
|
var createDebug = _interopDefault(require('debug'));
|
||||||
|
var objectSchema = require('@humanwhocodes/object-schema');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fileoverview ConfigSchema
|
||||||
|
* @author Nicholas C. Zakas
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assets that a given value is an array.
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} When the value is not an array.
|
||||||
|
*/
|
||||||
|
function assertIsArray(value) {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
throw new TypeError('Expected value to be an array.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assets that a given value is an array containing only strings and functions.
|
||||||
|
* @param {*} value The value to check.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} When the value is not an array of strings and functions.
|
||||||
|
*/
|
||||||
|
function assertIsArrayOfStringsAndFunctions(value, name) {
|
||||||
|
assertIsArray(value);
|
||||||
|
|
||||||
|
if (value.some(item => typeof item !== 'string' && typeof item !== 'function')) {
|
||||||
|
throw new TypeError('Expected array to only contain strings.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Exports
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base schema that every ConfigArray uses.
|
||||||
|
* @type Object
|
||||||
|
*/
|
||||||
|
const baseSchema = Object.freeze({
|
||||||
|
name: {
|
||||||
|
required: false,
|
||||||
|
merge() {
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
if (typeof value !== 'string') {
|
||||||
|
throw new TypeError('Property must be a string.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
files: {
|
||||||
|
required: false,
|
||||||
|
merge() {
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
|
||||||
|
// first check if it's an array
|
||||||
|
assertIsArray(value);
|
||||||
|
|
||||||
|
// then check each member
|
||||||
|
value.forEach(item => {
|
||||||
|
if (Array.isArray(item)) {
|
||||||
|
assertIsArrayOfStringsAndFunctions(item);
|
||||||
|
} else if (typeof item !== 'string' && typeof item !== 'function') {
|
||||||
|
throw new TypeError('Items must be a string, a function, or an array of strings and functions.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ignores: {
|
||||||
|
required: false,
|
||||||
|
merge() {
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
validate: assertIsArrayOfStringsAndFunctions
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fileoverview ConfigArray
|
||||||
|
* @author Nicholas C. Zakas
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Helpers
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const debug = createDebug('@hwc/config-array');
|
||||||
|
|
||||||
|
const MINIMATCH_OPTIONS = {
|
||||||
|
matchBase: true,
|
||||||
|
dot: true
|
||||||
|
};
|
||||||
|
|
||||||
|
const CONFIG_TYPES = new Set(['array', 'function']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shorthand for checking if a value is a string.
|
||||||
|
* @param {any} value The value to check.
|
||||||
|
* @returns {boolean} True if a string, false if not.
|
||||||
|
*/
|
||||||
|
function isString(value) {
|
||||||
|
return typeof value === 'string';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes a `ConfigArray` by flattening it and executing any functions
|
||||||
|
* that are found inside.
|
||||||
|
* @param {Array} items The items in a `ConfigArray`.
|
||||||
|
* @param {Object} context The context object to pass into any function
|
||||||
|
* found.
|
||||||
|
* @param {Array<string>} extraConfigTypes The config types to check.
|
||||||
|
* @returns {Promise<Array>} A flattened array containing only config objects.
|
||||||
|
* @throws {TypeError} When a config function returns a function.
|
||||||
|
*/
|
||||||
|
async function normalize(items, context, extraConfigTypes) {
|
||||||
|
|
||||||
|
const allowFunctions = extraConfigTypes.includes('function');
|
||||||
|
const allowArrays = extraConfigTypes.includes('array');
|
||||||
|
|
||||||
|
async function *flatTraverse(array) {
|
||||||
|
for (let item of array) {
|
||||||
|
if (typeof item === 'function') {
|
||||||
|
if (!allowFunctions) {
|
||||||
|
throw new TypeError('Unexpected function.');
|
||||||
|
}
|
||||||
|
|
||||||
|
item = item(context);
|
||||||
|
if (item.then) {
|
||||||
|
item = await item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(item)) {
|
||||||
|
if (!allowArrays) {
|
||||||
|
throw new TypeError('Unexpected array.');
|
||||||
|
}
|
||||||
|
yield * flatTraverse(item);
|
||||||
|
} else if (typeof item === 'function') {
|
||||||
|
throw new TypeError('A config function can only return an object or array.');
|
||||||
|
} else {
|
||||||
|
yield item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Async iterables cannot be used with the spread operator, so we need to manually
|
||||||
|
* create the array to return.
|
||||||
|
*/
|
||||||
|
const asyncIterable = await flatTraverse(items);
|
||||||
|
const configs = [];
|
||||||
|
|
||||||
|
for await (const config of asyncIterable) {
|
||||||
|
configs.push(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
return configs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes a `ConfigArray` by flattening it and executing any functions
|
||||||
|
* that are found inside.
|
||||||
|
* @param {Array} items The items in a `ConfigArray`.
|
||||||
|
* @param {Object} context The context object to pass into any function
|
||||||
|
* found.
|
||||||
|
* @param {Array<string>} extraConfigTypes The config types to check.
|
||||||
|
* @returns {Array} A flattened array containing only config objects.
|
||||||
|
* @throws {TypeError} When a config function returns a function.
|
||||||
|
*/
|
||||||
|
function normalizeSync(items, context, extraConfigTypes) {
|
||||||
|
|
||||||
|
const allowFunctions = extraConfigTypes.includes('function');
|
||||||
|
const allowArrays = extraConfigTypes.includes('array');
|
||||||
|
|
||||||
|
function *flatTraverse(array) {
|
||||||
|
for (let item of array) {
|
||||||
|
if (typeof item === 'function') {
|
||||||
|
|
||||||
|
if (!allowFunctions) {
|
||||||
|
throw new TypeError('Unexpected function.');
|
||||||
|
}
|
||||||
|
|
||||||
|
item = item(context);
|
||||||
|
if (item.then) {
|
||||||
|
throw new TypeError('Async config functions are not supported.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(item)) {
|
||||||
|
|
||||||
|
if (!allowArrays) {
|
||||||
|
throw new TypeError('Unexpected array.');
|
||||||
|
}
|
||||||
|
|
||||||
|
yield * flatTraverse(item);
|
||||||
|
} else if (typeof item === 'function') {
|
||||||
|
throw new TypeError('A config function can only return an object or array.');
|
||||||
|
} else {
|
||||||
|
yield item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [...flatTraverse(items)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a given file path should be ignored based on the given
|
||||||
|
* matcher.
|
||||||
|
* @param {Array<string|() => boolean>} ignores The ignore patterns to check.
|
||||||
|
* @param {string} filePath The absolute path of the file to check.
|
||||||
|
* @param {string} relativeFilePath The relative path of the file to check.
|
||||||
|
* @returns {boolean} True if the path should be ignored and false if not.
|
||||||
|
*/
|
||||||
|
function shouldIgnoreFilePath(ignores, filePath, relativeFilePath) {
|
||||||
|
|
||||||
|
let shouldIgnore = false;
|
||||||
|
|
||||||
|
for (const matcher of ignores) {
|
||||||
|
|
||||||
|
if (typeof matcher === 'function') {
|
||||||
|
shouldIgnore = shouldIgnore || matcher(filePath);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there's a negated pattern, that means anything matching
|
||||||
|
* must NOT be ignored. To do that, we need to use the `flipNegate`
|
||||||
|
* option for minimatch to check if the filepath matches the
|
||||||
|
* pattern specified after the !, and if that result is true,
|
||||||
|
* then we return false immediately because this file should
|
||||||
|
* never be ignored.
|
||||||
|
*/
|
||||||
|
if (matcher.startsWith('!')) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The file must already be ignored in order to apply a negated
|
||||||
|
* pattern, because negated patterns simply remove files that
|
||||||
|
* would already be ignored.
|
||||||
|
*/
|
||||||
|
if (shouldIgnore &&
|
||||||
|
minimatch(relativeFilePath, matcher, {
|
||||||
|
...MINIMATCH_OPTIONS,
|
||||||
|
flipNegate: true
|
||||||
|
})) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
shouldIgnore = shouldIgnore || minimatch(relativeFilePath, matcher, MINIMATCH_OPTIONS);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return shouldIgnore;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a given file path is matched by a config. If the config
|
||||||
|
* has no `files` field, then it matches; otherwise, if a `files` field
|
||||||
|
* is present then we match the globs in `files` and exclude any globs in
|
||||||
|
* `ignores`.
|
||||||
|
* @param {string} filePath The absolute file path to check.
|
||||||
|
* @param {Object} config The config object to check.
|
||||||
|
* @returns {boolean} True if the file path is matched by the config,
|
||||||
|
* false if not.
|
||||||
|
*/
|
||||||
|
function pathMatches(filePath, basePath, config) {
|
||||||
|
|
||||||
|
// a config without `files` field always match
|
||||||
|
if (!config.files) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For both files and ignores, functions are passed the absolute
|
||||||
|
* file path while strings are compared against the relative
|
||||||
|
* file path.
|
||||||
|
*/
|
||||||
|
const relativeFilePath = path.relative(basePath, filePath);
|
||||||
|
|
||||||
|
// if files isn't an array, throw an error
|
||||||
|
if (!Array.isArray(config.files) || config.files.length === 0) {
|
||||||
|
throw new TypeError('The files key must be a non-empty array.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// match both strings and functions
|
||||||
|
const match = pattern => {
|
||||||
|
|
||||||
|
if (isString(pattern)) {
|
||||||
|
return minimatch(relativeFilePath, pattern, MINIMATCH_OPTIONS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof pattern === 'function') {
|
||||||
|
return pattern(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new TypeError(`Unexpected matcher type ${pattern}.`);
|
||||||
|
};
|
||||||
|
|
||||||
|
// check for all matches to config.files
|
||||||
|
let filePathMatchesPattern = config.files.some(pattern => {
|
||||||
|
if (Array.isArray(pattern)) {
|
||||||
|
return pattern.every(match);
|
||||||
|
}
|
||||||
|
|
||||||
|
return match(pattern);
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the file path matches the config.files patterns, then check to see
|
||||||
|
* if there are any files to ignore.
|
||||||
|
*/
|
||||||
|
if (filePathMatchesPattern && config.ignores) {
|
||||||
|
filePathMatchesPattern = !shouldIgnoreFilePath(config.ignores, filePath, relativeFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return filePathMatchesPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that a ConfigArray has been normalized.
|
||||||
|
* @param {ConfigArray} configArray The ConfigArray to check.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {Error} When the `ConfigArray` is not normalized.
|
||||||
|
*/
|
||||||
|
function assertNormalized(configArray) {
|
||||||
|
// TODO: Throw more verbose error
|
||||||
|
if (!configArray.isNormalized()) {
|
||||||
|
throw new Error('ConfigArray must be normalized to perform this operation.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that config types are valid.
|
||||||
|
* @param {Array<string>} extraConfigTypes The config types to check.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {Error} When the config types array is invalid.
|
||||||
|
*/
|
||||||
|
function assertExtraConfigTypes(extraConfigTypes) {
|
||||||
|
if (extraConfigTypes.length > 2) {
|
||||||
|
throw new TypeError('configTypes must be an array with at most two items.');
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const configType of extraConfigTypes) {
|
||||||
|
if (!CONFIG_TYPES.has(configType)) {
|
||||||
|
throw new TypeError(`Unexpected config type "${configType}" found. Expected one of: "object", "array", "function".`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Public Interface
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const ConfigArraySymbol = {
|
||||||
|
isNormalized: Symbol('isNormalized'),
|
||||||
|
configCache: Symbol('configCache'),
|
||||||
|
schema: Symbol('schema'),
|
||||||
|
finalizeConfig: Symbol('finalizeConfig'),
|
||||||
|
preprocessConfig: Symbol('preprocessConfig')
|
||||||
|
};
|
||||||
|
|
||||||
|
// used to store calculate data for faster lookup
|
||||||
|
const dataCache = new WeakMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an array of config objects and provides method for working with
|
||||||
|
* those config objects.
|
||||||
|
*/
|
||||||
|
class ConfigArray extends Array {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of ConfigArray.
|
||||||
|
* @param {Iterable|Function|Object} configs An iterable yielding config
|
||||||
|
* objects, or a config function, or a config object.
|
||||||
|
* @param {string} [options.basePath=""] The path of the config file
|
||||||
|
* @param {boolean} [options.normalized=false] Flag indicating if the
|
||||||
|
* configs have already been normalized.
|
||||||
|
* @param {Object} [options.schema] The additional schema
|
||||||
|
* definitions to use for the ConfigArray schema.
|
||||||
|
* @param {Array<string>} [options.configTypes] List of config types supported.
|
||||||
|
*/
|
||||||
|
constructor(configs,
|
||||||
|
{
|
||||||
|
basePath = '',
|
||||||
|
normalized = false,
|
||||||
|
schema: customSchema,
|
||||||
|
extraConfigTypes = []
|
||||||
|
} = {}
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tracks if the array has been normalized.
|
||||||
|
* @property isNormalized
|
||||||
|
* @type boolean
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this[ConfigArraySymbol.isNormalized] = normalized;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The schema used for validating and merging configs.
|
||||||
|
* @property schema
|
||||||
|
* @type ObjectSchema
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this[ConfigArraySymbol.schema] = new objectSchema.ObjectSchema({
|
||||||
|
...customSchema,
|
||||||
|
...baseSchema
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The path of the config file that this array was loaded from.
|
||||||
|
* This is used to calculate filename matches.
|
||||||
|
* @property basePath
|
||||||
|
* @type string
|
||||||
|
*/
|
||||||
|
this.basePath = basePath;
|
||||||
|
|
||||||
|
assertExtraConfigTypes(extraConfigTypes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The supported config types.
|
||||||
|
* @property configTypes
|
||||||
|
* @type Array<string>
|
||||||
|
*/
|
||||||
|
this.extraConfigTypes = Object.freeze([...extraConfigTypes]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cache to store calculated configs for faster repeat lookup.
|
||||||
|
* @property configCache
|
||||||
|
* @type Map
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this[ConfigArraySymbol.configCache] = new Map();
|
||||||
|
|
||||||
|
// init cache
|
||||||
|
dataCache.set(this, {});
|
||||||
|
|
||||||
|
// load the configs into this array
|
||||||
|
if (Array.isArray(configs)) {
|
||||||
|
this.push(...configs);
|
||||||
|
} else {
|
||||||
|
this.push(configs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent normal array methods from creating a new `ConfigArray` instance.
|
||||||
|
* This is to ensure that methods such as `slice()` won't try to create a
|
||||||
|
* new instance of `ConfigArray` behind the scenes as doing so may throw
|
||||||
|
* an error due to the different constructor signature.
|
||||||
|
* @returns {Function} The `Array` constructor.
|
||||||
|
*/
|
||||||
|
static get [Symbol.species]() {
|
||||||
|
return Array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the `files` globs from every config object in the array.
|
||||||
|
* This can be used to determine which files will be matched by a
|
||||||
|
* config array or to use as a glob pattern when no patterns are provided
|
||||||
|
* for a command line interface.
|
||||||
|
* @returns {Array<string|Function>} An array of matchers.
|
||||||
|
*/
|
||||||
|
get files() {
|
||||||
|
|
||||||
|
assertNormalized(this);
|
||||||
|
|
||||||
|
// if this data has been cached, retrieve it
|
||||||
|
const cache = dataCache.get(this);
|
||||||
|
|
||||||
|
if (cache.files) {
|
||||||
|
return cache.files;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise calculate it
|
||||||
|
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
for (const config of this) {
|
||||||
|
if (config.files) {
|
||||||
|
config.files.forEach(filePattern => {
|
||||||
|
result.push(filePattern);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// store result
|
||||||
|
cache.files = result;
|
||||||
|
dataCache.set(this, cache);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns ignore matchers that should always be ignored regardless of
|
||||||
|
* the matching `files` fields in any configs. This is necessary to mimic
|
||||||
|
* the behavior of things like .gitignore and .eslintignore, allowing a
|
||||||
|
* globbing operation to be faster.
|
||||||
|
* @returns {string[]} An array of string patterns and functions to be ignored.
|
||||||
|
*/
|
||||||
|
get ignores() {
|
||||||
|
|
||||||
|
assertNormalized(this);
|
||||||
|
|
||||||
|
// if this data has been cached, retrieve it
|
||||||
|
const cache = dataCache.get(this);
|
||||||
|
|
||||||
|
if (cache.ignores) {
|
||||||
|
return cache.ignores;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise calculate it
|
||||||
|
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
for (const config of this) {
|
||||||
|
if (config.ignores && !config.files) {
|
||||||
|
result.push(...config.ignores);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// store result
|
||||||
|
cache.ignores = result;
|
||||||
|
dataCache.set(this, cache);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the config array has been normalized.
|
||||||
|
* @returns {boolean} True if the config array is normalized, false if not.
|
||||||
|
*/
|
||||||
|
isNormalized() {
|
||||||
|
return this[ConfigArraySymbol.isNormalized];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes a config array by flattening embedded arrays and executing
|
||||||
|
* config functions.
|
||||||
|
* @param {ConfigContext} context The context object for config functions.
|
||||||
|
* @returns {Promise<ConfigArray>} The current ConfigArray instance.
|
||||||
|
*/
|
||||||
|
async normalize(context = {}) {
|
||||||
|
|
||||||
|
if (!this.isNormalized()) {
|
||||||
|
const normalizedConfigs = await normalize(this, context, this.extraConfigTypes);
|
||||||
|
this.length = 0;
|
||||||
|
this.push(...normalizedConfigs.map(this[ConfigArraySymbol.preprocessConfig].bind(this)));
|
||||||
|
this[ConfigArraySymbol.isNormalized] = true;
|
||||||
|
|
||||||
|
// prevent further changes
|
||||||
|
Object.freeze(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes a config array by flattening embedded arrays and executing
|
||||||
|
* config functions.
|
||||||
|
* @param {ConfigContext} context The context object for config functions.
|
||||||
|
* @returns {ConfigArray} The current ConfigArray instance.
|
||||||
|
*/
|
||||||
|
normalizeSync(context = {}) {
|
||||||
|
|
||||||
|
if (!this.isNormalized()) {
|
||||||
|
const normalizedConfigs = normalizeSync(this, context, this.extraConfigTypes);
|
||||||
|
this.length = 0;
|
||||||
|
this.push(...normalizedConfigs.map(this[ConfigArraySymbol.preprocessConfig]));
|
||||||
|
this[ConfigArraySymbol.isNormalized] = true;
|
||||||
|
|
||||||
|
// prevent further changes
|
||||||
|
Object.freeze(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalizes the state of a config before being cached and returned by
|
||||||
|
* `getConfig()`. Does nothing by default but is provided to be
|
||||||
|
* overridden by subclasses as necessary.
|
||||||
|
* @param {Object} config The config to finalize.
|
||||||
|
* @returns {Object} The finalized config.
|
||||||
|
*/
|
||||||
|
[ConfigArraySymbol.finalizeConfig](config) {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Preprocesses a config during the normalization process. This is the
|
||||||
|
* method to override if you want to convert an array item before it is
|
||||||
|
* validated for the first time. For example, if you want to replace a
|
||||||
|
* string with an object, this is the method to override.
|
||||||
|
* @param {Object} config The config to preprocess.
|
||||||
|
* @returns {Object} The config to use in place of the argument.
|
||||||
|
*/
|
||||||
|
[ConfigArraySymbol.preprocessConfig](config) {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the config object for a given file path.
|
||||||
|
* @param {string} filePath The complete path of a file to get a config for.
|
||||||
|
* @returns {Object} The config object for this file.
|
||||||
|
*/
|
||||||
|
getConfig(filePath) {
|
||||||
|
|
||||||
|
assertNormalized(this);
|
||||||
|
|
||||||
|
// first check the cache to avoid duplicate work
|
||||||
|
let finalConfig = this[ConfigArraySymbol.configCache].get(filePath);
|
||||||
|
|
||||||
|
if (finalConfig) {
|
||||||
|
return finalConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Maybe move elsewhere?
|
||||||
|
const relativeFilePath = path.relative(this.basePath, filePath);
|
||||||
|
|
||||||
|
if (shouldIgnoreFilePath(this.ignores, filePath, relativeFilePath)) {
|
||||||
|
|
||||||
|
// cache and return result - finalConfig is undefined at this point
|
||||||
|
this[ConfigArraySymbol.configCache].set(filePath, finalConfig);
|
||||||
|
return finalConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
// filePath isn't automatically ignored, so try to construct config
|
||||||
|
|
||||||
|
const matchingConfigs = [];
|
||||||
|
|
||||||
|
for (const config of this) {
|
||||||
|
if (pathMatches(filePath, this.basePath, config)) {
|
||||||
|
debug(`Matching config found for ${filePath}`);
|
||||||
|
matchingConfigs.push(config);
|
||||||
|
} else {
|
||||||
|
debug(`No matching config found for ${filePath}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if matching both files and ignores, there will be no config to create
|
||||||
|
if (matchingConfigs.length === 0) {
|
||||||
|
// cache and return result - finalConfig is undefined at this point
|
||||||
|
this[ConfigArraySymbol.configCache].set(filePath, finalConfig);
|
||||||
|
return finalConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise construct the config
|
||||||
|
|
||||||
|
finalConfig = matchingConfigs.reduce((result, config) => {
|
||||||
|
return this[ConfigArraySymbol.schema].merge(result, config);
|
||||||
|
}, {}, this);
|
||||||
|
|
||||||
|
finalConfig = this[ConfigArraySymbol.finalizeConfig](finalConfig);
|
||||||
|
|
||||||
|
this[ConfigArraySymbol.configCache].set(filePath, finalConfig);
|
||||||
|
|
||||||
|
return finalConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the given filepath is ignored based on the configs.
|
||||||
|
* @param {string} filePath The complete path of a file to check.
|
||||||
|
* @returns {boolean} True if the path is ignored, false if not.
|
||||||
|
*/
|
||||||
|
isIgnored(filePath) {
|
||||||
|
return this.getConfig(filePath) === undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.ConfigArray = ConfigArray;
|
||||||
|
exports.ConfigArraySymbol = ConfigArraySymbol;
|
20
node_modules/@humanwhocodes/config-array/node_modules/debug/LICENSE
generated
vendored
Normal file
20
node_modules/@humanwhocodes/config-array/node_modules/debug/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
|
||||||
|
Copyright (c) 2018-2021 Josh Junon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||||
|
and associated documentation files (the 'Software'), to deal in the Software without restriction,
|
||||||
|
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||||
|
portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||||
|
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
481
node_modules/@humanwhocodes/config-array/node_modules/debug/README.md
generated
vendored
Normal file
481
node_modules/@humanwhocodes/config-array/node_modules/debug/README.md
generated
vendored
Normal file
|
@ -0,0 +1,481 @@
|
||||||
|
# debug
|
||||||
|
[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug) [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)
|
||||||
|
[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
|
||||||
|
|
||||||
|
A tiny JavaScript debugging utility modelled after Node.js core's debugging
|
||||||
|
technique. Works in Node.js and web browsers.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm install debug
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
|
||||||
|
|
||||||
|
Example [_app.js_](./examples/node/app.js):
|
||||||
|
|
||||||
|
```js
|
||||||
|
var debug = require('debug')('http')
|
||||||
|
, http = require('http')
|
||||||
|
, name = 'My App';
|
||||||
|
|
||||||
|
// fake app
|
||||||
|
|
||||||
|
debug('booting %o', name);
|
||||||
|
|
||||||
|
http.createServer(function(req, res){
|
||||||
|
debug(req.method + ' ' + req.url);
|
||||||
|
res.end('hello\n');
|
||||||
|
}).listen(3000, function(){
|
||||||
|
debug('listening');
|
||||||
|
});
|
||||||
|
|
||||||
|
// fake worker of some kind
|
||||||
|
|
||||||
|
require('./worker');
|
||||||
|
```
|
||||||
|
|
||||||
|
Example [_worker.js_](./examples/node/worker.js):
|
||||||
|
|
||||||
|
```js
|
||||||
|
var a = require('debug')('worker:a')
|
||||||
|
, b = require('debug')('worker:b');
|
||||||
|
|
||||||
|
function work() {
|
||||||
|
a('doing lots of uninteresting work');
|
||||||
|
setTimeout(work, Math.random() * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
work();
|
||||||
|
|
||||||
|
function workb() {
|
||||||
|
b('doing some work');
|
||||||
|
setTimeout(workb, Math.random() * 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
workb();
|
||||||
|
```
|
||||||
|
|
||||||
|
The `DEBUG` environment variable is then used to enable these based on space or
|
||||||
|
comma-delimited names.
|
||||||
|
|
||||||
|
Here are some examples:
|
||||||
|
|
||||||
|
<img width="647" alt="screen shot 2017-08-08 at 12 53 04 pm" src="https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png">
|
||||||
|
<img width="647" alt="screen shot 2017-08-08 at 12 53 38 pm" src="https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png">
|
||||||
|
<img width="647" alt="screen shot 2017-08-08 at 12 53 25 pm" src="https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png">
|
||||||
|
|
||||||
|
#### Windows command prompt notes
|
||||||
|
|
||||||
|
##### CMD
|
||||||
|
|
||||||
|
On Windows the environment variable is set using the `set` command.
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
set DEBUG=*,-not_this
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
set DEBUG=* & node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
##### PowerShell (VS Code default)
|
||||||
|
|
||||||
|
PowerShell uses different syntax to set environment variables.
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
$env:DEBUG = "*,-not_this"
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
$env:DEBUG='app';node app.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, run the program to be debugged as usual.
|
||||||
|
|
||||||
|
npm script example:
|
||||||
|
```js
|
||||||
|
"windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js",
|
||||||
|
```
|
||||||
|
|
||||||
|
## Namespace Colors
|
||||||
|
|
||||||
|
Every debug instance has a color generated for it based on its namespace name.
|
||||||
|
This helps when visually parsing the debug output to identify which debug instance
|
||||||
|
a debug line belongs to.
|
||||||
|
|
||||||
|
#### Node.js
|
||||||
|
|
||||||
|
In Node.js, colors are enabled when stderr is a TTY. You also _should_ install
|
||||||
|
the [`supports-color`](https://npmjs.org/supports-color) module alongside debug,
|
||||||
|
otherwise debug will only use a small handful of basic colors.
|
||||||
|
|
||||||
|
<img width="521" src="https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png">
|
||||||
|
|
||||||
|
#### Web Browser
|
||||||
|
|
||||||
|
Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
|
||||||
|
option. These are WebKit web inspectors, Firefox ([since version
|
||||||
|
31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
|
||||||
|
and the Firebug plugin for Firefox (any version).
|
||||||
|
|
||||||
|
<img width="524" src="https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png">
|
||||||
|
|
||||||
|
|
||||||
|
## Millisecond diff
|
||||||
|
|
||||||
|
When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
|
||||||
|
|
||||||
|
When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.png">
|
||||||
|
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output.
|
||||||
|
|
||||||
|
## Wildcards
|
||||||
|
|
||||||
|
The `*` character may be used as a wildcard. Suppose for example your library has
|
||||||
|
debuggers named "connect:bodyParser", "connect:compress", "connect:session",
|
||||||
|
instead of listing all three with
|
||||||
|
`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do
|
||||||
|
`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
|
||||||
|
|
||||||
|
You can also exclude specific debuggers by prefixing them with a "-" character.
|
||||||
|
For example, `DEBUG=*,-connect:*` would include all debuggers except those
|
||||||
|
starting with "connect:".
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
When running through Node.js, you can set a few environment variables that will
|
||||||
|
change the behavior of the debug logging:
|
||||||
|
|
||||||
|
| Name | Purpose |
|
||||||
|
|-----------|-------------------------------------------------|
|
||||||
|
| `DEBUG` | Enables/disables specific debugging namespaces. |
|
||||||
|
| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). |
|
||||||
|
| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
|
||||||
|
| `DEBUG_DEPTH` | Object inspection depth. |
|
||||||
|
| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
|
||||||
|
|
||||||
|
|
||||||
|
__Note:__ The environment variables beginning with `DEBUG_` end up being
|
||||||
|
converted into an Options object that gets used with `%o`/`%O` formatters.
|
||||||
|
See the Node.js documentation for
|
||||||
|
[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
|
||||||
|
for the complete list.
|
||||||
|
|
||||||
|
## Formatters
|
||||||
|
|
||||||
|
Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.
|
||||||
|
Below are the officially supported formatters:
|
||||||
|
|
||||||
|
| Formatter | Representation |
|
||||||
|
|-----------|----------------|
|
||||||
|
| `%O` | Pretty-print an Object on multiple lines. |
|
||||||
|
| `%o` | Pretty-print an Object all on a single line. |
|
||||||
|
| `%s` | String. |
|
||||||
|
| `%d` | Number (both integer and float). |
|
||||||
|
| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
|
||||||
|
| `%%` | Single percent sign ('%'). This does not consume an argument. |
|
||||||
|
|
||||||
|
|
||||||
|
### Custom formatters
|
||||||
|
|
||||||
|
You can add custom formatters by extending the `debug.formatters` object.
|
||||||
|
For example, if you wanted to add support for rendering a Buffer as hex with
|
||||||
|
`%h`, you could do something like:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const createDebug = require('debug')
|
||||||
|
createDebug.formatters.h = (v) => {
|
||||||
|
return v.toString('hex')
|
||||||
|
}
|
||||||
|
|
||||||
|
// …elsewhere
|
||||||
|
const debug = createDebug('foo')
|
||||||
|
debug('this is hex: %h', new Buffer('hello world'))
|
||||||
|
// foo this is hex: 68656c6c6f20776f726c6421 +0ms
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Browser Support
|
||||||
|
|
||||||
|
You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
|
||||||
|
or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
|
||||||
|
if you don't want to build it yourself.
|
||||||
|
|
||||||
|
Debug's enable state is currently persisted by `localStorage`.
|
||||||
|
Consider the situation shown below where you have `worker:a` and `worker:b`,
|
||||||
|
and wish to debug both. You can enable this using `localStorage.debug`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
localStorage.debug = 'worker:*'
|
||||||
|
```
|
||||||
|
|
||||||
|
And then refresh the page.
|
||||||
|
|
||||||
|
```js
|
||||||
|
a = debug('worker:a');
|
||||||
|
b = debug('worker:b');
|
||||||
|
|
||||||
|
setInterval(function(){
|
||||||
|
a('doing some work');
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
setInterval(function(){
|
||||||
|
b('doing some work');
|
||||||
|
}, 1200);
|
||||||
|
```
|
||||||
|
|
||||||
|
In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_.
|
||||||
|
|
||||||
|
<img width="647" src="https://user-images.githubusercontent.com/7143133/152083257-29034707-c42c-4959-8add-3cee850e6fcf.png">
|
||||||
|
|
||||||
|
## Output streams
|
||||||
|
|
||||||
|
By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
|
||||||
|
|
||||||
|
Example [_stdout.js_](./examples/node/stdout.js):
|
||||||
|
|
||||||
|
```js
|
||||||
|
var debug = require('debug');
|
||||||
|
var error = debug('app:error');
|
||||||
|
|
||||||
|
// by default stderr is used
|
||||||
|
error('goes to stderr!');
|
||||||
|
|
||||||
|
var log = debug('app:log');
|
||||||
|
// set this namespace to log via console.log
|
||||||
|
log.log = console.log.bind(console); // don't forget to bind to console!
|
||||||
|
log('goes to stdout');
|
||||||
|
error('still goes to stderr!');
|
||||||
|
|
||||||
|
// set all output to go via console.info
|
||||||
|
// overrides all per-namespace log settings
|
||||||
|
debug.log = console.info.bind(console);
|
||||||
|
error('now goes to stdout via console.info');
|
||||||
|
log('still goes to stdout, but via console.info now');
|
||||||
|
```
|
||||||
|
|
||||||
|
## Extend
|
||||||
|
You can simply extend debugger
|
||||||
|
```js
|
||||||
|
const log = require('debug')('auth');
|
||||||
|
|
||||||
|
//creates new debug instance with extended namespace
|
||||||
|
const logSign = log.extend('sign');
|
||||||
|
const logLogin = log.extend('login');
|
||||||
|
|
||||||
|
log('hello'); // auth hello
|
||||||
|
logSign('hello'); //auth:sign hello
|
||||||
|
logLogin('hello'); //auth:login hello
|
||||||
|
```
|
||||||
|
|
||||||
|
## Set dynamically
|
||||||
|
|
||||||
|
You can also enable debug dynamically by calling the `enable()` method :
|
||||||
|
|
||||||
|
```js
|
||||||
|
let debug = require('debug');
|
||||||
|
|
||||||
|
console.log(1, debug.enabled('test'));
|
||||||
|
|
||||||
|
debug.enable('test');
|
||||||
|
console.log(2, debug.enabled('test'));
|
||||||
|
|
||||||
|
debug.disable();
|
||||||
|
console.log(3, debug.enabled('test'));
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
print :
|
||||||
|
```
|
||||||
|
1 false
|
||||||
|
2 true
|
||||||
|
3 false
|
||||||
|
```
|
||||||
|
|
||||||
|
Usage :
|
||||||
|
`enable(namespaces)`
|
||||||
|
`namespaces` can include modes separated by a colon and wildcards.
|
||||||
|
|
||||||
|
Note that calling `enable()` completely overrides previously set DEBUG variable :
|
||||||
|
|
||||||
|
```
|
||||||
|
$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
|
||||||
|
=> false
|
||||||
|
```
|
||||||
|
|
||||||
|
`disable()`
|
||||||
|
|
||||||
|
Will disable all namespaces. The functions returns the namespaces currently
|
||||||
|
enabled (and skipped). This can be useful if you want to disable debugging
|
||||||
|
temporarily without knowing what was enabled to begin with.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
let debug = require('debug');
|
||||||
|
debug.enable('foo:*,-foo:bar');
|
||||||
|
let namespaces = debug.disable();
|
||||||
|
debug.enable(namespaces);
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: There is no guarantee that the string will be identical to the initial
|
||||||
|
enable string, but semantically they will be identical.
|
||||||
|
|
||||||
|
## Checking whether a debug target is enabled
|
||||||
|
|
||||||
|
After you've created a debug instance, you can determine whether or not it is
|
||||||
|
enabled by checking the `enabled` property:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const debug = require('debug')('http');
|
||||||
|
|
||||||
|
if (debug.enabled) {
|
||||||
|
// do stuff...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also manually toggle this property to force the debug instance to be
|
||||||
|
enabled or disabled.
|
||||||
|
|
||||||
|
## Usage in child processes
|
||||||
|
|
||||||
|
Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process.
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
worker = fork(WORKER_WRAP_PATH, [workerPath], {
|
||||||
|
stdio: [
|
||||||
|
/* stdin: */ 0,
|
||||||
|
/* stdout: */ 'pipe',
|
||||||
|
/* stderr: */ 'pipe',
|
||||||
|
'ipc',
|
||||||
|
],
|
||||||
|
env: Object.assign({}, process.env, {
|
||||||
|
DEBUG_COLORS: 1 // without this settings, colors won't be shown
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
worker.stderr.pipe(process.stderr, { end: false });
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
- TJ Holowaychuk
|
||||||
|
- Nathan Rajlich
|
||||||
|
- Andrew Rhyne
|
||||||
|
- Josh Junon
|
||||||
|
|
||||||
|
## Backers
|
||||||
|
|
||||||
|
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
|
||||||
|
|
||||||
|
|
||||||
|
## Sponsors
|
||||||
|
|
||||||
|
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
|
||||||
|
Copyright (c) 2018-2021 Josh Junon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
59
node_modules/@humanwhocodes/config-array/node_modules/debug/package.json
generated
vendored
Normal file
59
node_modules/@humanwhocodes/config-array/node_modules/debug/package.json
generated
vendored
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{
|
||||||
|
"name": "debug",
|
||||||
|
"version": "4.3.4",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/debug-js/debug.git"
|
||||||
|
},
|
||||||
|
"description": "Lightweight debugging utility for Node.js and the browser",
|
||||||
|
"keywords": [
|
||||||
|
"debug",
|
||||||
|
"log",
|
||||||
|
"debugger"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"src",
|
||||||
|
"LICENSE",
|
||||||
|
"README.md"
|
||||||
|
],
|
||||||
|
"author": "Josh Junon <josh.junon@protonmail.com>",
|
||||||
|
"contributors": [
|
||||||
|
"TJ Holowaychuk <tj@vision-media.ca>",
|
||||||
|
"Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
|
||||||
|
"Andrew Rhyne <rhyneandrew@gmail.com>"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "xo",
|
||||||
|
"test": "npm run test:node && npm run test:browser && npm run lint",
|
||||||
|
"test:node": "istanbul cover _mocha -- test.js",
|
||||||
|
"test:browser": "karma start --single-run",
|
||||||
|
"test:coverage": "cat ./coverage/lcov.info | coveralls"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ms": "2.1.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"brfs": "^2.0.1",
|
||||||
|
"browserify": "^16.2.3",
|
||||||
|
"coveralls": "^3.0.2",
|
||||||
|
"istanbul": "^0.4.5",
|
||||||
|
"karma": "^3.1.4",
|
||||||
|
"karma-browserify": "^6.0.0",
|
||||||
|
"karma-chrome-launcher": "^2.2.0",
|
||||||
|
"karma-mocha": "^1.3.0",
|
||||||
|
"mocha": "^5.2.0",
|
||||||
|
"mocha-lcov-reporter": "^1.2.0",
|
||||||
|
"xo": "^0.23.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"supports-color": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"main": "./src/index.js",
|
||||||
|
"browser": "./src/browser.js",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0"
|
||||||
|
}
|
||||||
|
}
|
269
node_modules/@humanwhocodes/config-array/node_modules/debug/src/browser.js
generated
vendored
Normal file
269
node_modules/@humanwhocodes/config-array/node_modules/debug/src/browser.js
generated
vendored
Normal file
|
@ -0,0 +1,269 @@
|
||||||
|
/* eslint-env browser */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the web browser implementation of `debug()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.formatArgs = formatArgs;
|
||||||
|
exports.save = save;
|
||||||
|
exports.load = load;
|
||||||
|
exports.useColors = useColors;
|
||||||
|
exports.storage = localstorage();
|
||||||
|
exports.destroy = (() => {
|
||||||
|
let warned = false;
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
if (!warned) {
|
||||||
|
warned = true;
|
||||||
|
console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.colors = [
|
||||||
|
'#0000CC',
|
||||||
|
'#0000FF',
|
||||||
|
'#0033CC',
|
||||||
|
'#0033FF',
|
||||||
|
'#0066CC',
|
||||||
|
'#0066FF',
|
||||||
|
'#0099CC',
|
||||||
|
'#0099FF',
|
||||||
|
'#00CC00',
|
||||||
|
'#00CC33',
|
||||||
|
'#00CC66',
|
||||||
|
'#00CC99',
|
||||||
|
'#00CCCC',
|
||||||
|
'#00CCFF',
|
||||||
|
'#3300CC',
|
||||||
|
'#3300FF',
|
||||||
|
'#3333CC',
|
||||||
|
'#3333FF',
|
||||||
|
'#3366CC',
|
||||||
|
'#3366FF',
|
||||||
|
'#3399CC',
|
||||||
|
'#3399FF',
|
||||||
|
'#33CC00',
|
||||||
|
'#33CC33',
|
||||||
|
'#33CC66',
|
||||||
|
'#33CC99',
|
||||||
|
'#33CCCC',
|
||||||
|
'#33CCFF',
|
||||||
|
'#6600CC',
|
||||||
|
'#6600FF',
|
||||||
|
'#6633CC',
|
||||||
|
'#6633FF',
|
||||||
|
'#66CC00',
|
||||||
|
'#66CC33',
|
||||||
|
'#9900CC',
|
||||||
|
'#9900FF',
|
||||||
|
'#9933CC',
|
||||||
|
'#9933FF',
|
||||||
|
'#99CC00',
|
||||||
|
'#99CC33',
|
||||||
|
'#CC0000',
|
||||||
|
'#CC0033',
|
||||||
|
'#CC0066',
|
||||||
|
'#CC0099',
|
||||||
|
'#CC00CC',
|
||||||
|
'#CC00FF',
|
||||||
|
'#CC3300',
|
||||||
|
'#CC3333',
|
||||||
|
'#CC3366',
|
||||||
|
'#CC3399',
|
||||||
|
'#CC33CC',
|
||||||
|
'#CC33FF',
|
||||||
|
'#CC6600',
|
||||||
|
'#CC6633',
|
||||||
|
'#CC9900',
|
||||||
|
'#CC9933',
|
||||||
|
'#CCCC00',
|
||||||
|
'#CCCC33',
|
||||||
|
'#FF0000',
|
||||||
|
'#FF0033',
|
||||||
|
'#FF0066',
|
||||||
|
'#FF0099',
|
||||||
|
'#FF00CC',
|
||||||
|
'#FF00FF',
|
||||||
|
'#FF3300',
|
||||||
|
'#FF3333',
|
||||||
|
'#FF3366',
|
||||||
|
'#FF3399',
|
||||||
|
'#FF33CC',
|
||||||
|
'#FF33FF',
|
||||||
|
'#FF6600',
|
||||||
|
'#FF6633',
|
||||||
|
'#FF9900',
|
||||||
|
'#FF9933',
|
||||||
|
'#FFCC00',
|
||||||
|
'#FFCC33'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
|
||||||
|
* and the Firebug extension (any Firefox version) are known
|
||||||
|
* to support "%c" CSS customizations.
|
||||||
|
*
|
||||||
|
* TODO: add a `localStorage` variable to explicitly enable/disable colors
|
||||||
|
*/
|
||||||
|
|
||||||
|
// eslint-disable-next-line complexity
|
||||||
|
function useColors() {
|
||||||
|
// NB: In an Electron preload script, document will be defined but not fully
|
||||||
|
// initialized. Since we know we're in Chrome, we'll just detect this case
|
||||||
|
// explicitly
|
||||||
|
if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Internet Explorer and Edge do not support colors.
|
||||||
|
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is webkit? http://stackoverflow.com/a/16459606/376773
|
||||||
|
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
|
||||||
|
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
|
||||||
|
// Is firebug? http://stackoverflow.com/a/398120/376773
|
||||||
|
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
|
||||||
|
// Is firefox >= v31?
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
||||||
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
|
||||||
|
// Double check webkit in userAgent just in case we are in a worker
|
||||||
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colorize log arguments if enabled.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatArgs(args) {
|
||||||
|
args[0] = (this.useColors ? '%c' : '') +
|
||||||
|
this.namespace +
|
||||||
|
(this.useColors ? ' %c' : ' ') +
|
||||||
|
args[0] +
|
||||||
|
(this.useColors ? '%c ' : ' ') +
|
||||||
|
'+' + module.exports.humanize(this.diff);
|
||||||
|
|
||||||
|
if (!this.useColors) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const c = 'color: ' + this.color;
|
||||||
|
args.splice(1, 0, c, 'color: inherit');
|
||||||
|
|
||||||
|
// The final "%c" is somewhat tricky, because there could be other
|
||||||
|
// arguments passed either before or after the %c, so we need to
|
||||||
|
// figure out the correct index to insert the CSS into
|
||||||
|
let index = 0;
|
||||||
|
let lastC = 0;
|
||||||
|
args[0].replace(/%[a-zA-Z%]/g, match => {
|
||||||
|
if (match === '%%') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
if (match === '%c') {
|
||||||
|
// We only are interested in the *last* %c
|
||||||
|
// (the user may have provided their own)
|
||||||
|
lastC = index;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
args.splice(lastC, 0, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes `console.debug()` when available.
|
||||||
|
* No-op when `console.debug` is not a "function".
|
||||||
|
* If `console.debug` is not available, falls back
|
||||||
|
* to `console.log`.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
exports.log = console.debug || console.log || (() => {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save `namespaces`.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function save(namespaces) {
|
||||||
|
try {
|
||||||
|
if (namespaces) {
|
||||||
|
exports.storage.setItem('debug', namespaces);
|
||||||
|
} else {
|
||||||
|
exports.storage.removeItem('debug');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow
|
||||||
|
// XXX (@Qix-) should we be logging these?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load `namespaces`.
|
||||||
|
*
|
||||||
|
* @return {String} returns the previously persisted debug modes
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function load() {
|
||||||
|
let r;
|
||||||
|
try {
|
||||||
|
r = exports.storage.getItem('debug');
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow
|
||||||
|
// XXX (@Qix-) should we be logging these?
|
||||||
|
}
|
||||||
|
|
||||||
|
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
|
||||||
|
if (!r && typeof process !== 'undefined' && 'env' in process) {
|
||||||
|
r = process.env.DEBUG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Localstorage attempts to return the localstorage.
|
||||||
|
*
|
||||||
|
* This is necessary because safari throws
|
||||||
|
* when a user disables cookies/localstorage
|
||||||
|
* and you attempt to access it.
|
||||||
|
*
|
||||||
|
* @return {LocalStorage}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function localstorage() {
|
||||||
|
try {
|
||||||
|
// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
|
||||||
|
// The Browser also has localStorage in the global context.
|
||||||
|
return localStorage;
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow
|
||||||
|
// XXX (@Qix-) should we be logging these?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = require('./common')(exports);
|
||||||
|
|
||||||
|
const {formatters} = module.exports;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
|
||||||
|
*/
|
||||||
|
|
||||||
|
formatters.j = function (v) {
|
||||||
|
try {
|
||||||
|
return JSON.stringify(v);
|
||||||
|
} catch (error) {
|
||||||
|
return '[UnexpectedJSONParseError]: ' + error.message;
|
||||||
|
}
|
||||||
|
};
|
274
node_modules/@humanwhocodes/config-array/node_modules/debug/src/common.js
generated
vendored
Normal file
274
node_modules/@humanwhocodes/config-array/node_modules/debug/src/common.js
generated
vendored
Normal file
|
@ -0,0 +1,274 @@
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the common logic for both the Node.js and web browser
|
||||||
|
* implementations of `debug()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function setup(env) {
|
||||||
|
createDebug.debug = createDebug;
|
||||||
|
createDebug.default = createDebug;
|
||||||
|
createDebug.coerce = coerce;
|
||||||
|
createDebug.disable = disable;
|
||||||
|
createDebug.enable = enable;
|
||||||
|
createDebug.enabled = enabled;
|
||||||
|
createDebug.humanize = require('ms');
|
||||||
|
createDebug.destroy = destroy;
|
||||||
|
|
||||||
|
Object.keys(env).forEach(key => {
|
||||||
|
createDebug[key] = env[key];
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The currently active debug mode names, and names to skip.
|
||||||
|
*/
|
||||||
|
|
||||||
|
createDebug.names = [];
|
||||||
|
createDebug.skips = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of special "%n" handling functions, for the debug "format" argument.
|
||||||
|
*
|
||||||
|
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
|
||||||
|
*/
|
||||||
|
createDebug.formatters = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects a color for a debug namespace
|
||||||
|
* @param {String} namespace The namespace string for the debug instance to be colored
|
||||||
|
* @return {Number|String} An ANSI color code for the given namespace
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function selectColor(namespace) {
|
||||||
|
let hash = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < namespace.length; i++) {
|
||||||
|
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
|
||||||
|
hash |= 0; // Convert to 32bit integer
|
||||||
|
}
|
||||||
|
|
||||||
|
return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
|
||||||
|
}
|
||||||
|
createDebug.selectColor = selectColor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a debugger with the given `namespace`.
|
||||||
|
*
|
||||||
|
* @param {String} namespace
|
||||||
|
* @return {Function}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function createDebug(namespace) {
|
||||||
|
let prevTime;
|
||||||
|
let enableOverride = null;
|
||||||
|
let namespacesCache;
|
||||||
|
let enabledCache;
|
||||||
|
|
||||||
|
function debug(...args) {
|
||||||
|
// Disabled?
|
||||||
|
if (!debug.enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const self = debug;
|
||||||
|
|
||||||
|
// Set `diff` timestamp
|
||||||
|
const curr = Number(new Date());
|
||||||
|
const ms = curr - (prevTime || curr);
|
||||||
|
self.diff = ms;
|
||||||
|
self.prev = prevTime;
|
||||||
|
self.curr = curr;
|
||||||
|
prevTime = curr;
|
||||||
|
|
||||||
|
args[0] = createDebug.coerce(args[0]);
|
||||||
|
|
||||||
|
if (typeof args[0] !== 'string') {
|
||||||
|
// Anything else let's inspect with %O
|
||||||
|
args.unshift('%O');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply any `formatters` transformations
|
||||||
|
let index = 0;
|
||||||
|
args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
|
||||||
|
// If we encounter an escaped % then don't increase the array index
|
||||||
|
if (match === '%%') {
|
||||||
|
return '%';
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
const formatter = createDebug.formatters[format];
|
||||||
|
if (typeof formatter === 'function') {
|
||||||
|
const val = args[index];
|
||||||
|
match = formatter.call(self, val);
|
||||||
|
|
||||||
|
// Now we need to remove `args[index]` since it's inlined in the `format`
|
||||||
|
args.splice(index, 1);
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Apply env-specific formatting (colors, etc.)
|
||||||
|
createDebug.formatArgs.call(self, args);
|
||||||
|
|
||||||
|
const logFn = self.log || createDebug.log;
|
||||||
|
logFn.apply(self, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug.namespace = namespace;
|
||||||
|
debug.useColors = createDebug.useColors();
|
||||||
|
debug.color = createDebug.selectColor(namespace);
|
||||||
|
debug.extend = extend;
|
||||||
|
debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
|
||||||
|
|
||||||
|
Object.defineProperty(debug, 'enabled', {
|
||||||
|
enumerable: true,
|
||||||
|
configurable: false,
|
||||||
|
get: () => {
|
||||||
|
if (enableOverride !== null) {
|
||||||
|
return enableOverride;
|
||||||
|
}
|
||||||
|
if (namespacesCache !== createDebug.namespaces) {
|
||||||
|
namespacesCache = createDebug.namespaces;
|
||||||
|
enabledCache = createDebug.enabled(namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
return enabledCache;
|
||||||
|
},
|
||||||
|
set: v => {
|
||||||
|
enableOverride = v;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Env-specific initialization logic for debug instances
|
||||||
|
if (typeof createDebug.init === 'function') {
|
||||||
|
createDebug.init(debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
return debug;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extend(namespace, delimiter) {
|
||||||
|
const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
|
||||||
|
newDebug.log = this.log;
|
||||||
|
return newDebug;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables a debug mode by namespaces. This can include modes
|
||||||
|
* separated by a colon and wildcards.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function enable(namespaces) {
|
||||||
|
createDebug.save(namespaces);
|
||||||
|
createDebug.namespaces = namespaces;
|
||||||
|
|
||||||
|
createDebug.names = [];
|
||||||
|
createDebug.skips = [];
|
||||||
|
|
||||||
|
let i;
|
||||||
|
const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
|
||||||
|
const len = split.length;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
if (!split[i]) {
|
||||||
|
// ignore empty strings
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespaces = split[i].replace(/\*/g, '.*?');
|
||||||
|
|
||||||
|
if (namespaces[0] === '-') {
|
||||||
|
createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
|
||||||
|
} else {
|
||||||
|
createDebug.names.push(new RegExp('^' + namespaces + '$'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable debug output.
|
||||||
|
*
|
||||||
|
* @return {String} namespaces
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function disable() {
|
||||||
|
const namespaces = [
|
||||||
|
...createDebug.names.map(toNamespace),
|
||||||
|
...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
|
||||||
|
].join(',');
|
||||||
|
createDebug.enable('');
|
||||||
|
return namespaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the given mode name is enabled, false otherwise.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @return {Boolean}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
function enabled(name) {
|
||||||
|
if (name[name.length - 1] === '*') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let i;
|
||||||
|
let len;
|
||||||
|
|
||||||
|
for (i = 0, len = createDebug.skips.length; i < len; i++) {
|
||||||
|
if (createDebug.skips[i].test(name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0, len = createDebug.names.length; i < len; i++) {
|
||||||
|
if (createDebug.names[i].test(name)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert regexp to namespace
|
||||||
|
*
|
||||||
|
* @param {RegExp} regxep
|
||||||
|
* @return {String} namespace
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function toNamespace(regexp) {
|
||||||
|
return regexp.toString()
|
||||||
|
.substring(2, regexp.toString().length - 2)
|
||||||
|
.replace(/\.\*\?$/, '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coerce `val`.
|
||||||
|
*
|
||||||
|
* @param {Mixed} val
|
||||||
|
* @return {Mixed}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function coerce(val) {
|
||||||
|
if (val instanceof Error) {
|
||||||
|
return val.stack || val.message;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XXX DO NOT USE. This is a temporary stub function.
|
||||||
|
* XXX It WILL be removed in the next major release.
|
||||||
|
*/
|
||||||
|
function destroy() {
|
||||||
|
console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
|
||||||
|
}
|
||||||
|
|
||||||
|
createDebug.enable(createDebug.load());
|
||||||
|
|
||||||
|
return createDebug;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = setup;
|
10
node_modules/@humanwhocodes/config-array/node_modules/debug/src/index.js
generated
vendored
Normal file
10
node_modules/@humanwhocodes/config-array/node_modules/debug/src/index.js
generated
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/**
|
||||||
|
* Detect Electron renderer / nwjs process, which is node, but we should
|
||||||
|
* treat as a browser.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
|
||||||
|
module.exports = require('./browser.js');
|
||||||
|
} else {
|
||||||
|
module.exports = require('./node.js');
|
||||||
|
}
|
263
node_modules/@humanwhocodes/config-array/node_modules/debug/src/node.js
generated
vendored
Normal file
263
node_modules/@humanwhocodes/config-array/node_modules/debug/src/node.js
generated
vendored
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const tty = require('tty');
|
||||||
|
const util = require('util');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the Node.js implementation of `debug()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.init = init;
|
||||||
|
exports.log = log;
|
||||||
|
exports.formatArgs = formatArgs;
|
||||||
|
exports.save = save;
|
||||||
|
exports.load = load;
|
||||||
|
exports.useColors = useColors;
|
||||||
|
exports.destroy = util.deprecate(
|
||||||
|
() => {},
|
||||||
|
'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.colors = [6, 2, 3, 4, 5, 1];
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
|
||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||||
|
const supportsColor = require('supports-color');
|
||||||
|
|
||||||
|
if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
|
||||||
|
exports.colors = [
|
||||||
|
20,
|
||||||
|
21,
|
||||||
|
26,
|
||||||
|
27,
|
||||||
|
32,
|
||||||
|
33,
|
||||||
|
38,
|
||||||
|
39,
|
||||||
|
40,
|
||||||
|
41,
|
||||||
|
42,
|
||||||
|
43,
|
||||||
|
44,
|
||||||
|
45,
|
||||||
|
56,
|
||||||
|
57,
|
||||||
|
62,
|
||||||
|
63,
|
||||||
|
68,
|
||||||
|
69,
|
||||||
|
74,
|
||||||
|
75,
|
||||||
|
76,
|
||||||
|
77,
|
||||||
|
78,
|
||||||
|
79,
|
||||||
|
80,
|
||||||
|
81,
|
||||||
|
92,
|
||||||
|
93,
|
||||||
|
98,
|
||||||
|
99,
|
||||||
|
112,
|
||||||
|
113,
|
||||||
|
128,
|
||||||
|
129,
|
||||||
|
134,
|
||||||
|
135,
|
||||||
|
148,
|
||||||
|
149,
|
||||||
|
160,
|
||||||
|
161,
|
||||||
|
162,
|
||||||
|
163,
|
||||||
|
164,
|
||||||
|
165,
|
||||||
|
166,
|
||||||
|
167,
|
||||||
|
168,
|
||||||
|
169,
|
||||||
|
170,
|
||||||
|
171,
|
||||||
|
172,
|
||||||
|
173,
|
||||||
|
178,
|
||||||
|
179,
|
||||||
|
184,
|
||||||
|
185,
|
||||||
|
196,
|
||||||
|
197,
|
||||||
|
198,
|
||||||
|
199,
|
||||||
|
200,
|
||||||
|
201,
|
||||||
|
202,
|
||||||
|
203,
|
||||||
|
204,
|
||||||
|
205,
|
||||||
|
206,
|
||||||
|
207,
|
||||||
|
208,
|
||||||
|
209,
|
||||||
|
214,
|
||||||
|
215,
|
||||||
|
220,
|
||||||
|
221
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Swallow - we only care if `supports-color` is available; it doesn't have to be.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build up the default `inspectOpts` object from the environment variables.
|
||||||
|
*
|
||||||
|
* $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.inspectOpts = Object.keys(process.env).filter(key => {
|
||||||
|
return /^debug_/i.test(key);
|
||||||
|
}).reduce((obj, key) => {
|
||||||
|
// Camel-case
|
||||||
|
const prop = key
|
||||||
|
.substring(6)
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/_([a-z])/g, (_, k) => {
|
||||||
|
return k.toUpperCase();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Coerce string value into JS value
|
||||||
|
let val = process.env[key];
|
||||||
|
if (/^(yes|on|true|enabled)$/i.test(val)) {
|
||||||
|
val = true;
|
||||||
|
} else if (/^(no|off|false|disabled)$/i.test(val)) {
|
||||||
|
val = false;
|
||||||
|
} else if (val === 'null') {
|
||||||
|
val = null;
|
||||||
|
} else {
|
||||||
|
val = Number(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj[prop] = val;
|
||||||
|
return obj;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is stdout a TTY? Colored output is enabled when `true`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function useColors() {
|
||||||
|
return 'colors' in exports.inspectOpts ?
|
||||||
|
Boolean(exports.inspectOpts.colors) :
|
||||||
|
tty.isatty(process.stderr.fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds ANSI color escape codes if enabled.
|
||||||
|
*
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function formatArgs(args) {
|
||||||
|
const {namespace: name, useColors} = this;
|
||||||
|
|
||||||
|
if (useColors) {
|
||||||
|
const c = this.color;
|
||||||
|
const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
|
||||||
|
const prefix = ` ${colorCode};1m${name} \u001B[0m`;
|
||||||
|
|
||||||
|
args[0] = prefix + args[0].split('\n').join('\n' + prefix);
|
||||||
|
args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
|
||||||
|
} else {
|
||||||
|
args[0] = getDate() + name + ' ' + args[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDate() {
|
||||||
|
if (exports.inspectOpts.hideDate) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return new Date().toISOString() + ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes `util.format()` with the specified arguments and writes to stderr.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function log(...args) {
|
||||||
|
return process.stderr.write(util.format(...args) + '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save `namespaces`.
|
||||||
|
*
|
||||||
|
* @param {String} namespaces
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
function save(namespaces) {
|
||||||
|
if (namespaces) {
|
||||||
|
process.env.DEBUG = namespaces;
|
||||||
|
} else {
|
||||||
|
// If you set a process.env field to null or undefined, it gets cast to the
|
||||||
|
// string 'null' or 'undefined'. Just delete instead.
|
||||||
|
delete process.env.DEBUG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load `namespaces`.
|
||||||
|
*
|
||||||
|
* @return {String} returns the previously persisted debug modes
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function load() {
|
||||||
|
return process.env.DEBUG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init logic for `debug` instances.
|
||||||
|
*
|
||||||
|
* Create a new `inspectOpts` object in case `useColors` is set
|
||||||
|
* differently for a particular `debug` instance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function init(debug) {
|
||||||
|
debug.inspectOpts = {};
|
||||||
|
|
||||||
|
const keys = Object.keys(exports.inspectOpts);
|
||||||
|
for (let i = 0; i < keys.length; i++) {
|
||||||
|
debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = require('./common')(exports);
|
||||||
|
|
||||||
|
const {formatters} = module.exports;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %o to `util.inspect()`, all on a single line.
|
||||||
|
*/
|
||||||
|
|
||||||
|
formatters.o = function (v) {
|
||||||
|
this.inspectOpts.colors = this.useColors;
|
||||||
|
return util.inspect(v, this.inspectOpts)
|
||||||
|
.split('\n')
|
||||||
|
.map(str => str.trim())
|
||||||
|
.join(' ');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map %O to `util.inspect()`, allowing multiple lines if needed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
formatters.O = function (v) {
|
||||||
|
this.inspectOpts.colors = this.useColors;
|
||||||
|
return util.inspect(v, this.inspectOpts);
|
||||||
|
};
|
162
node_modules/@humanwhocodes/config-array/node_modules/ms/index.js
generated
vendored
Normal file
162
node_modules/@humanwhocodes/config-array/node_modules/ms/index.js
generated
vendored
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/**
|
||||||
|
* Helpers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var s = 1000;
|
||||||
|
var m = s * 60;
|
||||||
|
var h = m * 60;
|
||||||
|
var d = h * 24;
|
||||||
|
var w = d * 7;
|
||||||
|
var y = d * 365.25;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse or format the given `val`.
|
||||||
|
*
|
||||||
|
* Options:
|
||||||
|
*
|
||||||
|
* - `long` verbose formatting [false]
|
||||||
|
*
|
||||||
|
* @param {String|Number} val
|
||||||
|
* @param {Object} [options]
|
||||||
|
* @throws {Error} throw an error if val is not a non-empty string or a number
|
||||||
|
* @return {String|Number}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function(val, options) {
|
||||||
|
options = options || {};
|
||||||
|
var type = typeof val;
|
||||||
|
if (type === 'string' && val.length > 0) {
|
||||||
|
return parse(val);
|
||||||
|
} else if (type === 'number' && isFinite(val)) {
|
||||||
|
return options.long ? fmtLong(val) : fmtShort(val);
|
||||||
|
}
|
||||||
|
throw new Error(
|
||||||
|
'val is not a non-empty string or a valid number. val=' +
|
||||||
|
JSON.stringify(val)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the given `str` and return milliseconds.
|
||||||
|
*
|
||||||
|
* @param {String} str
|
||||||
|
* @return {Number}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function parse(str) {
|
||||||
|
str = String(str);
|
||||||
|
if (str.length > 100) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
|
||||||
|
str
|
||||||
|
);
|
||||||
|
if (!match) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var n = parseFloat(match[1]);
|
||||||
|
var type = (match[2] || 'ms').toLowerCase();
|
||||||
|
switch (type) {
|
||||||
|
case 'years':
|
||||||
|
case 'year':
|
||||||
|
case 'yrs':
|
||||||
|
case 'yr':
|
||||||
|
case 'y':
|
||||||
|
return n * y;
|
||||||
|
case 'weeks':
|
||||||
|
case 'week':
|
||||||
|
case 'w':
|
||||||
|
return n * w;
|
||||||
|
case 'days':
|
||||||
|
case 'day':
|
||||||
|
case 'd':
|
||||||
|
return n * d;
|
||||||
|
case 'hours':
|
||||||
|
case 'hour':
|
||||||
|
case 'hrs':
|
||||||
|
case 'hr':
|
||||||
|
case 'h':
|
||||||
|
return n * h;
|
||||||
|
case 'minutes':
|
||||||
|
case 'minute':
|
||||||
|
case 'mins':
|
||||||
|
case 'min':
|
||||||
|
case 'm':
|
||||||
|
return n * m;
|
||||||
|
case 'seconds':
|
||||||
|
case 'second':
|
||||||
|
case 'secs':
|
||||||
|
case 'sec':
|
||||||
|
case 's':
|
||||||
|
return n * s;
|
||||||
|
case 'milliseconds':
|
||||||
|
case 'millisecond':
|
||||||
|
case 'msecs':
|
||||||
|
case 'msec':
|
||||||
|
case 'ms':
|
||||||
|
return n;
|
||||||
|
default:
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short format for `ms`.
|
||||||
|
*
|
||||||
|
* @param {Number} ms
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fmtShort(ms) {
|
||||||
|
var msAbs = Math.abs(ms);
|
||||||
|
if (msAbs >= d) {
|
||||||
|
return Math.round(ms / d) + 'd';
|
||||||
|
}
|
||||||
|
if (msAbs >= h) {
|
||||||
|
return Math.round(ms / h) + 'h';
|
||||||
|
}
|
||||||
|
if (msAbs >= m) {
|
||||||
|
return Math.round(ms / m) + 'm';
|
||||||
|
}
|
||||||
|
if (msAbs >= s) {
|
||||||
|
return Math.round(ms / s) + 's';
|
||||||
|
}
|
||||||
|
return ms + 'ms';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Long format for `ms`.
|
||||||
|
*
|
||||||
|
* @param {Number} ms
|
||||||
|
* @return {String}
|
||||||
|
* @api private
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fmtLong(ms) {
|
||||||
|
var msAbs = Math.abs(ms);
|
||||||
|
if (msAbs >= d) {
|
||||||
|
return plural(ms, msAbs, d, 'day');
|
||||||
|
}
|
||||||
|
if (msAbs >= h) {
|
||||||
|
return plural(ms, msAbs, h, 'hour');
|
||||||
|
}
|
||||||
|
if (msAbs >= m) {
|
||||||
|
return plural(ms, msAbs, m, 'minute');
|
||||||
|
}
|
||||||
|
if (msAbs >= s) {
|
||||||
|
return plural(ms, msAbs, s, 'second');
|
||||||
|
}
|
||||||
|
return ms + ' ms';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pluralization helper.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function plural(ms, msAbs, n, name) {
|
||||||
|
var isPlural = msAbs >= n * 1.5;
|
||||||
|
return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
|
||||||
|
}
|
21
node_modules/@humanwhocodes/config-array/node_modules/ms/license.md
generated
vendored
Normal file
21
node_modules/@humanwhocodes/config-array/node_modules/ms/license.md
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 Zeit, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
37
node_modules/@humanwhocodes/config-array/node_modules/ms/package.json
generated
vendored
Normal file
37
node_modules/@humanwhocodes/config-array/node_modules/ms/package.json
generated
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
"name": "ms",
|
||||||
|
"version": "2.1.2",
|
||||||
|
"description": "Tiny millisecond conversion utility",
|
||||||
|
"repository": "zeit/ms",
|
||||||
|
"main": "./index",
|
||||||
|
"files": [
|
||||||
|
"index.js"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"precommit": "lint-staged",
|
||||||
|
"lint": "eslint lib/* bin/*",
|
||||||
|
"test": "mocha tests.js"
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"env": {
|
||||||
|
"node": true,
|
||||||
|
"es6": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"*.js": [
|
||||||
|
"npm run lint",
|
||||||
|
"prettier --single-quote --write",
|
||||||
|
"git add"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "4.12.1",
|
||||||
|
"expect.js": "0.3.1",
|
||||||
|
"husky": "0.14.3",
|
||||||
|
"lint-staged": "5.0.0",
|
||||||
|
"mocha": "4.0.1"
|
||||||
|
}
|
||||||
|
}
|
60
node_modules/@humanwhocodes/config-array/node_modules/ms/readme.md
generated
vendored
Normal file
60
node_modules/@humanwhocodes/config-array/node_modules/ms/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# ms
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
|
||||||
|
[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit)
|
||||||
|
|
||||||
|
Use this package to easily convert various time formats to milliseconds.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```js
|
||||||
|
ms('2 days') // 172800000
|
||||||
|
ms('1d') // 86400000
|
||||||
|
ms('10h') // 36000000
|
||||||
|
ms('2.5 hrs') // 9000000
|
||||||
|
ms('2h') // 7200000
|
||||||
|
ms('1m') // 60000
|
||||||
|
ms('5s') // 5000
|
||||||
|
ms('1y') // 31557600000
|
||||||
|
ms('100') // 100
|
||||||
|
ms('-3 days') // -259200000
|
||||||
|
ms('-1h') // -3600000
|
||||||
|
ms('-200') // -200
|
||||||
|
```
|
||||||
|
|
||||||
|
### Convert from Milliseconds
|
||||||
|
|
||||||
|
```js
|
||||||
|
ms(60000) // "1m"
|
||||||
|
ms(2 * 60000) // "2m"
|
||||||
|
ms(-3 * 60000) // "-3m"
|
||||||
|
ms(ms('10 hours')) // "10h"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Time Format Written-Out
|
||||||
|
|
||||||
|
```js
|
||||||
|
ms(60000, { long: true }) // "1 minute"
|
||||||
|
ms(2 * 60000, { long: true }) // "2 minutes"
|
||||||
|
ms(-3 * 60000, { long: true }) // "-3 minutes"
|
||||||
|
ms(ms('10 hours'), { long: true }) // "10 hours"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Works both in [Node.js](https://nodejs.org) and in the browser
|
||||||
|
- If a number is supplied to `ms`, a string with a unit is returned
|
||||||
|
- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
|
||||||
|
- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
|
||||||
|
|
||||||
|
## Related Packages
|
||||||
|
|
||||||
|
- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
|
||||||
|
|
||||||
|
## Caught a Bug?
|
||||||
|
|
||||||
|
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
|
||||||
|
2. Link the package to the global module directory: `npm link`
|
||||||
|
3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
|
||||||
|
|
||||||
|
As always, you can run the tests using: `npm test`
|
61
node_modules/@humanwhocodes/config-array/package.json
generated
vendored
Normal file
61
node_modules/@humanwhocodes/config-array/package.json
generated
vendored
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
"name": "@humanwhocodes/config-array",
|
||||||
|
"version": "0.9.5",
|
||||||
|
"description": "Glob-based configuration matching.",
|
||||||
|
"author": "Nicholas C. Zakas",
|
||||||
|
"main": "api.js",
|
||||||
|
"files": [
|
||||||
|
"api.js"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/humanwhocodes/config-array.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/humanwhocodes/config-array/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/humanwhocodes/config-array#readme",
|
||||||
|
"scripts": {
|
||||||
|
"build": "rollup -c",
|
||||||
|
"format": "nitpik",
|
||||||
|
"lint": "eslint *.config.js src/*.js tests/*.js",
|
||||||
|
"prepublish": "npm run build",
|
||||||
|
"test:coverage": "nyc --include src/*.js npm run test",
|
||||||
|
"test": "mocha -r esm tests/ --recursive"
|
||||||
|
},
|
||||||
|
"gitHooks": {
|
||||||
|
"pre-commit": "lint-staged"
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"*.js": [
|
||||||
|
"nitpik",
|
||||||
|
"eslint --fix --ignore-pattern '!.eslintrc.js'"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"configuration",
|
||||||
|
"configarray",
|
||||||
|
"config file"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.10.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@humanwhocodes/object-schema": "^1.2.1",
|
||||||
|
"debug": "^4.1.1",
|
||||||
|
"minimatch": "^3.0.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@nitpik/javascript": "^0.3.3",
|
||||||
|
"@nitpik/node": "0.0.5",
|
||||||
|
"chai": "^4.2.0",
|
||||||
|
"eslint": "^6.7.1",
|
||||||
|
"esm": "^3.2.25",
|
||||||
|
"lint-staged": "^10.2.8",
|
||||||
|
"mocha": "^6.2.3",
|
||||||
|
"nyc": "^14.1.1",
|
||||||
|
"rollup": "^1.12.3",
|
||||||
|
"yorkie": "^2.0.0"
|
||||||
|
}
|
||||||
|
}
|
29
node_modules/@humanwhocodes/object-schema/.eslintrc.js
generated
vendored
Normal file
29
node_modules/@humanwhocodes/object-schema/.eslintrc.js
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
module.exports = {
|
||||||
|
"env": {
|
||||||
|
"commonjs": true,
|
||||||
|
"es6": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 2018
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"indent": [
|
||||||
|
"error",
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"linebreak-style": [
|
||||||
|
"error",
|
||||||
|
"unix"
|
||||||
|
],
|
||||||
|
"quotes": [
|
||||||
|
"error",
|
||||||
|
"double"
|
||||||
|
],
|
||||||
|
"semi": [
|
||||||
|
"error",
|
||||||
|
"always"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
27
node_modules/@humanwhocodes/object-schema/.github/workflows/nodejs-test.yml
generated
vendored
Normal file
27
node_modules/@humanwhocodes/object-schema/.github/workflows/nodejs-test.yml
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
name: Node CI
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [windows-latest, macOS-latest, ubuntu-latest]
|
||||||
|
node: [8.x, 10.x, 12.x, 14.x]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
- name: npm install, build, and test
|
||||||
|
run: |
|
||||||
|
npm install
|
||||||
|
npm run build --if-present
|
||||||
|
npm test
|
||||||
|
env:
|
||||||
|
CI: true
|
39
node_modules/@humanwhocodes/object-schema/.github/workflows/release-please.yml
generated
vendored
Normal file
39
node_modules/@humanwhocodes/object-schema/.github/workflows/release-please.yml
generated
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
name: release-please
|
||||||
|
jobs:
|
||||||
|
release-please:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: GoogleCloudPlatform/release-please-action@v2
|
||||||
|
id: release
|
||||||
|
with:
|
||||||
|
release-type: node
|
||||||
|
package-name: test-release-please
|
||||||
|
# The logic below handles the npm publication:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
# these if statements ensure that a publication only occurs when
|
||||||
|
# a new release is created:
|
||||||
|
if: ${{ steps.release.outputs.release_created }}
|
||||||
|
- uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 12
|
||||||
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
if: ${{ steps.release.outputs.release_created }}
|
||||||
|
- run: npm ci
|
||||||
|
if: ${{ steps.release.outputs.release_created }}
|
||||||
|
- run: npm publish
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
||||||
|
if: ${{ steps.release.outputs.release_created }}
|
||||||
|
|
||||||
|
# Tweets out release announcement
|
||||||
|
- run: 'npx @humanwhocodes/tweet "Object Schema v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }} has been released!\n\n${{ github.event.release.html_url }}"'
|
||||||
|
if: ${{ steps.release.outputs.release_created }}
|
||||||
|
env:
|
||||||
|
TWITTER_CONSUMER_KEY: ${{ secrets.TWITTER_CONSUMER_KEY }}
|
||||||
|
TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_SECRET }}
|
||||||
|
TWITTER_ACCESS_TOKEN_KEY: ${{ secrets.TWITTER_ACCESS_TOKEN_KEY }}
|
||||||
|
TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
|
8
node_modules/@humanwhocodes/object-schema/CHANGELOG.md
generated
vendored
Normal file
8
node_modules/@humanwhocodes/object-schema/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
### [1.2.1](https://www.github.com/humanwhocodes/object-schema/compare/v1.2.0...v1.2.1) (2021-11-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Never return original object from individual config ([5463c5c](https://www.github.com/humanwhocodes/object-schema/commit/5463c5c6d2cb35a7b7948dffc37c899a41d1775f))
|
29
node_modules/@humanwhocodes/object-schema/LICENSE
generated
vendored
Normal file
29
node_modules/@humanwhocodes/object-schema/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
BSD 3-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2019, Human Who Codes
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* Neither the name of the copyright holder nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
234
node_modules/@humanwhocodes/object-schema/README.md
generated
vendored
Normal file
234
node_modules/@humanwhocodes/object-schema/README.md
generated
vendored
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
# JavaScript ObjectSchema Package
|
||||||
|
|
||||||
|
by [Nicholas C. Zakas](https://humanwhocodes.com)
|
||||||
|
|
||||||
|
If you find this useful, please consider supporting my work with a [donation](https://humanwhocodes.com/donate).
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
A JavaScript object merge/validation utility where you can define a different merge and validation strategy for each key. This is helpful when you need to validate complex data structures and then merge them in a way that is more complex than `Object.assign()`.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can install using either npm:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install @humanwhocodes/object-schema
|
||||||
|
```
|
||||||
|
|
||||||
|
Or Yarn:
|
||||||
|
|
||||||
|
```
|
||||||
|
yarn add @humanwhocodes/object-schema
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Use CommonJS to get access to the `ObjectSchema` constructor:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { ObjectSchema } = require("@humanwhocodes/object-schema");
|
||||||
|
|
||||||
|
const schema = new ObjectSchema({
|
||||||
|
|
||||||
|
// define a definition for the "downloads" key
|
||||||
|
downloads: {
|
||||||
|
required: true,
|
||||||
|
merge(value1, value2) {
|
||||||
|
return value1 + value2;
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
if (typeof value !== "number") {
|
||||||
|
throw new Error("Expected downloads to be a number.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// define a strategy for the "versions" key
|
||||||
|
version: {
|
||||||
|
required: true,
|
||||||
|
merge(value1, value2) {
|
||||||
|
return value1.concat(value2);
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
throw new Error("Expected versions to be an array.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const record1 = {
|
||||||
|
downloads: 25,
|
||||||
|
versions: [
|
||||||
|
"v1.0.0",
|
||||||
|
"v1.1.0",
|
||||||
|
"v1.2.0"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
const record2 = {
|
||||||
|
downloads: 125,
|
||||||
|
versions: [
|
||||||
|
"v2.0.0",
|
||||||
|
"v2.1.0",
|
||||||
|
"v3.0.0"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
// make sure the records are valid
|
||||||
|
schema.validate(record1);
|
||||||
|
schema.validate(record2);
|
||||||
|
|
||||||
|
// merge together (schema.merge() accepts any number of objects)
|
||||||
|
const result = schema.merge(record1, record2);
|
||||||
|
|
||||||
|
// result looks like this:
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
downloads: 75,
|
||||||
|
versions: [
|
||||||
|
"v1.0.0",
|
||||||
|
"v1.1.0",
|
||||||
|
"v1.2.0",
|
||||||
|
"v2.0.0",
|
||||||
|
"v2.1.0",
|
||||||
|
"v3.0.0"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tips and Tricks
|
||||||
|
|
||||||
|
### Named merge strategies
|
||||||
|
|
||||||
|
Instead of specifying a `merge()` method, you can specify one of the following strings to use a default merge strategy:
|
||||||
|
|
||||||
|
* `"assign"` - use `Object.assign()` to merge the two values into one object.
|
||||||
|
* `"overwrite"` - the second value always replaces the first.
|
||||||
|
* `"replace"` - the second value replaces the first if the second is not `undefined`.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const schema = new ObjectSchema({
|
||||||
|
name: {
|
||||||
|
merge: "replace",
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Named validation strategies
|
||||||
|
|
||||||
|
Instead of specifying a `validate()` method, you can specify one of the following strings to use a default validation strategy:
|
||||||
|
|
||||||
|
* `"array"` - value must be an array.
|
||||||
|
* `"boolean"` - value must be a boolean.
|
||||||
|
* `"number"` - value must be a number.
|
||||||
|
* `"object"` - value must be an object.
|
||||||
|
* `"object?"` - value must be an object or null.
|
||||||
|
* `"string"` - value must be a string.
|
||||||
|
* `"string!"` - value must be a non-empty string.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const schema = new ObjectSchema({
|
||||||
|
name: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Subschemas
|
||||||
|
|
||||||
|
If you are defining a key that is, itself, an object, you can simplify the process by using a subschema. Instead of defining `merge()` and `validate()`, assign a `schema` key that contains a schema definition, like this:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const schema = new ObjectSchema({
|
||||||
|
name: {
|
||||||
|
schema: {
|
||||||
|
first: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
},
|
||||||
|
last: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
schema.validate({
|
||||||
|
name: {
|
||||||
|
first: "n",
|
||||||
|
last: "z"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Remove Keys During Merge
|
||||||
|
|
||||||
|
If the merge strategy for a key returns `undefined`, then the key will not appear in the final object. For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const schema = new ObjectSchema({
|
||||||
|
date: {
|
||||||
|
merge() {
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
Date.parse(value); // throws an error when invalid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const object1 = { date: "5/5/2005" };
|
||||||
|
const object2 = { date: "6/6/2006" };
|
||||||
|
|
||||||
|
const result = schema.merge(object1, object2);
|
||||||
|
|
||||||
|
console.log("date" in result); // false
|
||||||
|
```
|
||||||
|
|
||||||
|
### Requiring Another Key Be Present
|
||||||
|
|
||||||
|
If you'd like the presence of one key to require the presence of another key, you can use the `requires` property to specify an array of other properties that any key requires. For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const schema = new ObjectSchema();
|
||||||
|
|
||||||
|
const schema = new ObjectSchema({
|
||||||
|
date: {
|
||||||
|
merge() {
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
Date.parse(value); // throws an error when invalid
|
||||||
|
}
|
||||||
|
},
|
||||||
|
time: {
|
||||||
|
requires: ["date"],
|
||||||
|
merge(first, second) {
|
||||||
|
return second;
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// throws error: Key "time" requires keys "date"
|
||||||
|
schema.validate({
|
||||||
|
time: "13:45"
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, even though `date` is an optional key, it is required to be present whenever `time` is present.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
BSD 3-Clause
|
33
node_modules/@humanwhocodes/object-schema/package.json
generated
vendored
Normal file
33
node_modules/@humanwhocodes/object-schema/package.json
generated
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"name": "@humanwhocodes/object-schema",
|
||||||
|
"version": "1.2.1",
|
||||||
|
"description": "An object schema merger/validator",
|
||||||
|
"main": "src/index.js",
|
||||||
|
"directories": {
|
||||||
|
"test": "tests"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "mocha tests/"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/humanwhocodes/object-schema.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"object",
|
||||||
|
"validation",
|
||||||
|
"schema",
|
||||||
|
"merge"
|
||||||
|
],
|
||||||
|
"author": "Nicholas C. Zakas",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/humanwhocodes/object-schema/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/humanwhocodes/object-schema#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"chai": "^4.2.0",
|
||||||
|
"eslint": "^5.13.0",
|
||||||
|
"mocha": "^5.2.0"
|
||||||
|
}
|
||||||
|
}
|
7
node_modules/@humanwhocodes/object-schema/src/index.js
generated
vendored
Normal file
7
node_modules/@humanwhocodes/object-schema/src/index.js
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/**
|
||||||
|
* @filedescription Object Schema Package
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.ObjectSchema = require("./object-schema").ObjectSchema;
|
||||||
|
exports.MergeStrategy = require("./merge-strategy").MergeStrategy;
|
||||||
|
exports.ValidationStrategy = require("./validation-strategy").ValidationStrategy;
|
53
node_modules/@humanwhocodes/object-schema/src/merge-strategy.js
generated
vendored
Normal file
53
node_modules/@humanwhocodes/object-schema/src/merge-strategy.js
generated
vendored
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/**
|
||||||
|
* @filedescription Merge Strategy
|
||||||
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Class
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container class for several different merge strategies.
|
||||||
|
*/
|
||||||
|
class MergeStrategy {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merges two keys by overwriting the first with the second.
|
||||||
|
* @param {*} value1 The value from the first object key.
|
||||||
|
* @param {*} value2 The value from the second object key.
|
||||||
|
* @returns {*} The second value.
|
||||||
|
*/
|
||||||
|
static overwrite(value1, value2) {
|
||||||
|
return value2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merges two keys by replacing the first with the second only if the
|
||||||
|
* second is defined.
|
||||||
|
* @param {*} value1 The value from the first object key.
|
||||||
|
* @param {*} value2 The value from the second object key.
|
||||||
|
* @returns {*} The second value if it is defined.
|
||||||
|
*/
|
||||||
|
static replace(value1, value2) {
|
||||||
|
if (typeof value2 !== "undefined") {
|
||||||
|
return value2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merges two properties by assigning properties from the second to the first.
|
||||||
|
* @param {*} value1 The value from the first object key.
|
||||||
|
* @param {*} value2 The value from the second object key.
|
||||||
|
* @returns {*} A new object containing properties from both value1 and
|
||||||
|
* value2.
|
||||||
|
*/
|
||||||
|
static assign(value1, value2) {
|
||||||
|
return Object.assign({}, value1, value2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.MergeStrategy = MergeStrategy;
|
235
node_modules/@humanwhocodes/object-schema/src/object-schema.js
generated
vendored
Normal file
235
node_modules/@humanwhocodes/object-schema/src/object-schema.js
generated
vendored
Normal file
|
@ -0,0 +1,235 @@
|
||||||
|
/**
|
||||||
|
* @filedescription Object Schema
|
||||||
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const { MergeStrategy } = require("./merge-strategy");
|
||||||
|
const { ValidationStrategy } = require("./validation-strategy");
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Private
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const strategies = Symbol("strategies");
|
||||||
|
const requiredKeys = Symbol("requiredKeys");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates a schema strategy.
|
||||||
|
* @param {string} name The name of the key this strategy is for.
|
||||||
|
* @param {Object} strategy The strategy for the object key.
|
||||||
|
* @param {boolean} [strategy.required=true] Whether the key is required.
|
||||||
|
* @param {string[]} [strategy.requires] Other keys that are required when
|
||||||
|
* this key is present.
|
||||||
|
* @param {Function} strategy.merge A method to call when merging two objects
|
||||||
|
* with the same key.
|
||||||
|
* @param {Function} strategy.validate A method to call when validating an
|
||||||
|
* object with the key.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {Error} When the strategy is missing a name.
|
||||||
|
* @throws {Error} When the strategy is missing a merge() method.
|
||||||
|
* @throws {Error} When the strategy is missing a validate() method.
|
||||||
|
*/
|
||||||
|
function validateDefinition(name, strategy) {
|
||||||
|
|
||||||
|
let hasSchema = false;
|
||||||
|
if (strategy.schema) {
|
||||||
|
if (typeof strategy.schema === "object") {
|
||||||
|
hasSchema = true;
|
||||||
|
} else {
|
||||||
|
throw new TypeError("Schema must be an object.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof strategy.merge === "string") {
|
||||||
|
if (!(strategy.merge in MergeStrategy)) {
|
||||||
|
throw new TypeError(`Definition for key "${name}" missing valid merge strategy.`);
|
||||||
|
}
|
||||||
|
} else if (!hasSchema && typeof strategy.merge !== "function") {
|
||||||
|
throw new TypeError(`Definition for key "${name}" must have a merge property.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof strategy.validate === "string") {
|
||||||
|
if (!(strategy.validate in ValidationStrategy)) {
|
||||||
|
throw new TypeError(`Definition for key "${name}" missing valid validation strategy.`);
|
||||||
|
}
|
||||||
|
} else if (!hasSchema && typeof strategy.validate !== "function") {
|
||||||
|
throw new TypeError(`Definition for key "${name}" must have a validate() method.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Class
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an object validation/merging schema.
|
||||||
|
*/
|
||||||
|
class ObjectSchema {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*/
|
||||||
|
constructor(definitions) {
|
||||||
|
|
||||||
|
if (!definitions) {
|
||||||
|
throw new Error("Schema definitions missing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Track all strategies in the schema by key.
|
||||||
|
* @type {Map}
|
||||||
|
* @property strategies
|
||||||
|
*/
|
||||||
|
this[strategies] = new Map();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Separately track any keys that are required for faster validation.
|
||||||
|
* @type {Map}
|
||||||
|
* @property requiredKeys
|
||||||
|
*/
|
||||||
|
this[requiredKeys] = new Map();
|
||||||
|
|
||||||
|
// add in all strategies
|
||||||
|
for (const key of Object.keys(definitions)) {
|
||||||
|
validateDefinition(key, definitions[key]);
|
||||||
|
|
||||||
|
// normalize merge and validate methods if subschema is present
|
||||||
|
if (typeof definitions[key].schema === "object") {
|
||||||
|
const schema = new ObjectSchema(definitions[key].schema);
|
||||||
|
definitions[key] = {
|
||||||
|
...definitions[key],
|
||||||
|
merge(first = {}, second = {}) {
|
||||||
|
return schema.merge(first, second);
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
ValidationStrategy.object(value);
|
||||||
|
schema.validate(value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalize the merge method in case there's a string
|
||||||
|
if (typeof definitions[key].merge === "string") {
|
||||||
|
definitions[key] = {
|
||||||
|
...definitions[key],
|
||||||
|
merge: MergeStrategy[definitions[key].merge]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// normalize the validate method in case there's a string
|
||||||
|
if (typeof definitions[key].validate === "string") {
|
||||||
|
definitions[key] = {
|
||||||
|
...definitions[key],
|
||||||
|
validate: ValidationStrategy[definitions[key].validate]
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
this[strategies].set(key, definitions[key]);
|
||||||
|
|
||||||
|
if (definitions[key].required) {
|
||||||
|
this[requiredKeys].set(key, definitions[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a strategy has been registered for the given object key.
|
||||||
|
* @param {string} key The object key to find a strategy for.
|
||||||
|
* @returns {boolean} True if the key has a strategy registered, false if not.
|
||||||
|
*/
|
||||||
|
hasKey(key) {
|
||||||
|
return this[strategies].has(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merges objects together to create a new object comprised of the keys
|
||||||
|
* of the all objects. Keys are merged based on the each key's merge
|
||||||
|
* strategy.
|
||||||
|
* @param {...Object} objects The objects to merge.
|
||||||
|
* @returns {Object} A new object with a mix of all objects' keys.
|
||||||
|
* @throws {Error} If any object is invalid.
|
||||||
|
*/
|
||||||
|
merge(...objects) {
|
||||||
|
|
||||||
|
// double check arguments
|
||||||
|
if (objects.length < 2) {
|
||||||
|
throw new Error("merge() requires at least two arguments.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objects.some(object => (object == null || typeof object !== "object"))) {
|
||||||
|
throw new Error("All arguments must be objects.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return objects.reduce((result, object) => {
|
||||||
|
|
||||||
|
this.validate(object);
|
||||||
|
|
||||||
|
for (const [key, strategy] of this[strategies]) {
|
||||||
|
try {
|
||||||
|
if (key in result || key in object) {
|
||||||
|
const value = strategy.merge.call(this, result[key], object[key]);
|
||||||
|
if (value !== undefined) {
|
||||||
|
result[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (ex) {
|
||||||
|
ex.message = `Key "${key}": ` + ex.message;
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates an object's keys based on the validate strategy for each key.
|
||||||
|
* @param {Object} object The object to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {Error} When the object is invalid.
|
||||||
|
*/
|
||||||
|
validate(object) {
|
||||||
|
|
||||||
|
// check existing keys first
|
||||||
|
for (const key of Object.keys(object)) {
|
||||||
|
|
||||||
|
// check to see if the key is defined
|
||||||
|
if (!this.hasKey(key)) {
|
||||||
|
throw new Error(`Unexpected key "${key}" found.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate existing keys
|
||||||
|
const strategy = this[strategies].get(key);
|
||||||
|
|
||||||
|
// first check to see if any other keys are required
|
||||||
|
if (Array.isArray(strategy.requires)) {
|
||||||
|
if (!strategy.requires.every(otherKey => otherKey in object)) {
|
||||||
|
throw new Error(`Key "${key}" requires keys "${strategy.requires.join("\", \"")}".`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now apply remaining validation strategy
|
||||||
|
try {
|
||||||
|
strategy.validate.call(strategy, object[key]);
|
||||||
|
} catch (ex) {
|
||||||
|
ex.message = `Key "${key}": ` + ex.message;
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure required keys aren't missing
|
||||||
|
for (const [key] of this[requiredKeys]) {
|
||||||
|
if (!(key in object)) {
|
||||||
|
throw new Error(`Missing required key "${key}".`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.ObjectSchema = ObjectSchema;
|
102
node_modules/@humanwhocodes/object-schema/src/validation-strategy.js
generated
vendored
Normal file
102
node_modules/@humanwhocodes/object-schema/src/validation-strategy.js
generated
vendored
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/**
|
||||||
|
* @filedescription Validation Strategy
|
||||||
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Class
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container class for several different validation strategies.
|
||||||
|
*/
|
||||||
|
class ValidationStrategy {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a value is an array.
|
||||||
|
* @param {*} value The value to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} If the value is invalid.
|
||||||
|
*/
|
||||||
|
static array(value) {
|
||||||
|
if (!Array.isArray(value)) {
|
||||||
|
throw new TypeError("Expected an array.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a value is a boolean.
|
||||||
|
* @param {*} value The value to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} If the value is invalid.
|
||||||
|
*/
|
||||||
|
static boolean(value) {
|
||||||
|
if (typeof value !== "boolean") {
|
||||||
|
throw new TypeError("Expected a Boolean.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a value is a number.
|
||||||
|
* @param {*} value The value to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} If the value is invalid.
|
||||||
|
*/
|
||||||
|
static number(value) {
|
||||||
|
if (typeof value !== "number") {
|
||||||
|
throw new TypeError("Expected a number.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a value is a object.
|
||||||
|
* @param {*} value The value to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} If the value is invalid.
|
||||||
|
*/
|
||||||
|
static object(value) {
|
||||||
|
if (!value || typeof value !== "object") {
|
||||||
|
throw new TypeError("Expected an object.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a value is a object or null.
|
||||||
|
* @param {*} value The value to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} If the value is invalid.
|
||||||
|
*/
|
||||||
|
static "object?"(value) {
|
||||||
|
if (typeof value !== "object") {
|
||||||
|
throw new TypeError("Expected an object or null.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a value is a string.
|
||||||
|
* @param {*} value The value to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} If the value is invalid.
|
||||||
|
*/
|
||||||
|
static string(value) {
|
||||||
|
if (typeof value !== "string") {
|
||||||
|
throw new TypeError("Expected a string.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that a value is a non-empty string.
|
||||||
|
* @param {*} value The value to validate.
|
||||||
|
* @returns {void}
|
||||||
|
* @throws {TypeError} If the value is invalid.
|
||||||
|
*/
|
||||||
|
static "string!"(value) {
|
||||||
|
if (typeof value !== "string" || value.length === 0) {
|
||||||
|
throw new TypeError("Expected a non-empty string.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.ValidationStrategy = ValidationStrategy;
|
66
node_modules/@humanwhocodes/object-schema/tests/merge-strategy.js
generated
vendored
Normal file
66
node_modules/@humanwhocodes/object-schema/tests/merge-strategy.js
generated
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/**
|
||||||
|
* @filedescription Merge Strategy Tests
|
||||||
|
*/
|
||||||
|
/* global it, describe, beforeEach */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const assert = require("chai").assert;
|
||||||
|
const { MergeStrategy } = require("../src/");
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Class
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
describe("MergeStrategy", () => {
|
||||||
|
|
||||||
|
|
||||||
|
describe("overwrite()", () => {
|
||||||
|
|
||||||
|
it("should overwrite the first value with the second when the second is defined", () => {
|
||||||
|
const result = MergeStrategy.overwrite(1, 2);
|
||||||
|
assert.strictEqual(result, 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should overwrite the first value with the second when the second is undefined", () => {
|
||||||
|
const result = MergeStrategy.overwrite(1, undefined);
|
||||||
|
assert.strictEqual(result, undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("replace()", () => {
|
||||||
|
|
||||||
|
it("should overwrite the first value with the second when the second is defined", () => {
|
||||||
|
const result = MergeStrategy.replace(1, 2);
|
||||||
|
assert.strictEqual(result, 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should return the first value when the second is undefined", () => {
|
||||||
|
const result = MergeStrategy.replace(1, undefined);
|
||||||
|
assert.strictEqual(result, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("assign()", () => {
|
||||||
|
|
||||||
|
it("should merge properties from two objects when called", () => {
|
||||||
|
|
||||||
|
const object1 = { foo: 1, bar: 3 };
|
||||||
|
const object2 = { foo: 2 };
|
||||||
|
|
||||||
|
const result = MergeStrategy.assign(object1, object2);
|
||||||
|
assert.deepStrictEqual(result, {
|
||||||
|
foo: 2,
|
||||||
|
bar: 3
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
611
node_modules/@humanwhocodes/object-schema/tests/object-schema.js
generated
vendored
Normal file
611
node_modules/@humanwhocodes/object-schema/tests/object-schema.js
generated
vendored
Normal file
|
@ -0,0 +1,611 @@
|
||||||
|
/**
|
||||||
|
* @filedescription Object Schema Tests
|
||||||
|
*/
|
||||||
|
/* global it, describe, beforeEach */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const assert = require("chai").assert;
|
||||||
|
const { ObjectSchema } = require("../src/");
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Class
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
describe("ObjectSchema", () => {
|
||||||
|
|
||||||
|
let schema;
|
||||||
|
|
||||||
|
describe("new ObjectSchema()", () => {
|
||||||
|
|
||||||
|
it("should add a new key when a strategy is passed", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.isTrue(schema.hasKey("foo"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when a strategy is missing a merge() method", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, /Definition for key "foo" must have a merge property/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when a strategy is missing a merge() method", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
schema = new ObjectSchema();
|
||||||
|
}, /Schema definitions missing/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when a strategy is missing a validate() method", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() { },
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, /Definition for key "foo" must have a validate\(\) method/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when merge is an invalid string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge: "bar",
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, /key "foo" missing valid merge strategy/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when validate is an invalid string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge: "assign",
|
||||||
|
validate: "s"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, /key "foo" missing valid validation strategy/);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe("merge()", () => {
|
||||||
|
|
||||||
|
it("should throw an error when an unexpected key is found", () => {
|
||||||
|
let schema = new ObjectSchema({});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.merge({ foo: true }, { foo: true });
|
||||||
|
}, /Unexpected key "foo"/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when merge() throws an error", () => {
|
||||||
|
let schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
throw new Error("Boom!");
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.merge({ foo: true }, { foo: true });
|
||||||
|
}, /Key "foo": Boom!/);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should call the merge() strategy for one key when called", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge({ foo: true }, { foo: false });
|
||||||
|
assert.propertyVal(result, "foo", "bar");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not call the merge() strategy when both objects don't contain the key", () => {
|
||||||
|
|
||||||
|
let called = false;
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
called = true;
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
schema.merge({}, {});
|
||||||
|
assert.isFalse(called, "The merge() strategy should not have been called.");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should omit returning the key when the merge() strategy returns undefined", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return undefined;
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge({ foo: true }, { foo: false });
|
||||||
|
assert.notProperty(result, "foo");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should call the merge() strategy for two keys when called", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
},
|
||||||
|
bar: {
|
||||||
|
merge() {
|
||||||
|
return "baz";
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge({ foo: true, bar: 1 }, { foo: true, bar: 2 });
|
||||||
|
assert.propertyVal(result, "foo", "bar");
|
||||||
|
assert.propertyVal(result, "bar", "baz");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should call the merge() strategy for two keys when called on three objects", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
},
|
||||||
|
bar: {
|
||||||
|
merge() {
|
||||||
|
return "baz";
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge(
|
||||||
|
{ foo: true, bar: 1 },
|
||||||
|
{ foo: true, bar: 3 },
|
||||||
|
{ foo: false, bar: 2 }
|
||||||
|
);
|
||||||
|
assert.propertyVal(result, "foo", "bar");
|
||||||
|
assert.propertyVal(result, "bar", "baz");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should call the merge() strategy when defined as 'overwrite'", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge: "overwrite",
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge(
|
||||||
|
{ foo: true },
|
||||||
|
{ foo: false }
|
||||||
|
);
|
||||||
|
assert.propertyVal(result, "foo", false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should call the merge() strategy when defined as 'assign'", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge: "assign",
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge(
|
||||||
|
{ foo: { bar: true } },
|
||||||
|
{ foo: { baz: false } }
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.strictEqual(result.foo.bar, true);
|
||||||
|
assert.strictEqual(result.foo.baz, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should call the merge strategy when there's a subschema", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
name: {
|
||||||
|
schema: {
|
||||||
|
first: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
},
|
||||||
|
last: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge({
|
||||||
|
name: {
|
||||||
|
first: "n",
|
||||||
|
last: "z"
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: {
|
||||||
|
first: "g"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(result.name.first, "g");
|
||||||
|
assert.strictEqual(result.name.last, "z");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should return separate objects when using subschema", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
age: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "number"
|
||||||
|
},
|
||||||
|
address: {
|
||||||
|
schema: {
|
||||||
|
street: {
|
||||||
|
schema: {
|
||||||
|
number: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "number"
|
||||||
|
},
|
||||||
|
streetName: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const baseObject = {
|
||||||
|
address: {
|
||||||
|
street: {
|
||||||
|
number: 100,
|
||||||
|
streetName: "Foo St"
|
||||||
|
},
|
||||||
|
state: "HA"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = schema.merge(baseObject, {
|
||||||
|
age: 29
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.notStrictEqual(result.address.street, baseObject.address.street);
|
||||||
|
assert.deepStrictEqual(result.address, baseObject.address);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not error when calling the merge strategy when there's a subschema and no matching key in second object", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
name: {
|
||||||
|
schema: {
|
||||||
|
first: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
},
|
||||||
|
last: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge({
|
||||||
|
name: {
|
||||||
|
first: "n",
|
||||||
|
last: "z"
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(result.name.first, "n");
|
||||||
|
assert.strictEqual(result.name.last, "z");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not error when calling the merge strategy when there's multiple subschemas and no matching key in second object", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
user: {
|
||||||
|
schema: {
|
||||||
|
name: {
|
||||||
|
schema: {
|
||||||
|
first: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
},
|
||||||
|
last: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = schema.merge({
|
||||||
|
user: {
|
||||||
|
name: {
|
||||||
|
first: "n",
|
||||||
|
last: "z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(result.user.name.first, "n");
|
||||||
|
assert.strictEqual(result.user.name.last, "z");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("validate()", () => {
|
||||||
|
|
||||||
|
it("should throw an error when an unexpected key is found", () => {
|
||||||
|
let schema = new ObjectSchema({});
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.validate({ foo: true });
|
||||||
|
}, /Unexpected key "foo"/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not throw an error when an expected key is found", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
schema.validate({ foo: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should pass the property value into validate() when key is found", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate(value) {
|
||||||
|
assert.isTrue(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
schema.validate({ foo: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not throw an error when expected keys are found", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
},
|
||||||
|
bar: {
|
||||||
|
merge() {
|
||||||
|
return "baz";
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
schema.validate({ foo: true, bar: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not throw an error when expected keys are found with required keys", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
},
|
||||||
|
bar: {
|
||||||
|
requires: ["foo"],
|
||||||
|
merge() {
|
||||||
|
return "baz";
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
schema.validate({ foo: true, bar: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when expected keys are found without required keys", () => {
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
},
|
||||||
|
baz: {
|
||||||
|
merge() {
|
||||||
|
return "baz";
|
||||||
|
},
|
||||||
|
validate() { }
|
||||||
|
},
|
||||||
|
bar: {
|
||||||
|
name: "bar",
|
||||||
|
requires: ["foo", "baz"],
|
||||||
|
merge() { },
|
||||||
|
validate() { }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.validate({ bar: true });
|
||||||
|
}, /Key "bar" requires keys "foo", "baz"./);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("should throw an error when an expected key is found but is invalid", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() {
|
||||||
|
throw new Error("Invalid key.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.validate({ foo: true });
|
||||||
|
}, /Key "foo": Invalid key/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when an expected key is found but is invalid with a string validator", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.validate({ foo: true });
|
||||||
|
}, /Key "foo": Expected a string/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when an expected key is found but is invalid with a number validator", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate: "number"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.validate({ foo: true });
|
||||||
|
}, /Key "foo": Expected a number/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when a required key is missing", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
foo: {
|
||||||
|
required: true,
|
||||||
|
merge() {
|
||||||
|
return "bar";
|
||||||
|
},
|
||||||
|
validate() {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.validate({});
|
||||||
|
}, /Missing required key "foo"/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when a subschema is provided and the value doesn't validate", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
name: {
|
||||||
|
schema: {
|
||||||
|
first: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
},
|
||||||
|
last: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
schema.validate({
|
||||||
|
name: {
|
||||||
|
first: 123,
|
||||||
|
last: "z"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}, /Key "name": Key "first": Expected a string/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not throw an error when a subschema is provided and the value validates", () => {
|
||||||
|
|
||||||
|
schema = new ObjectSchema({
|
||||||
|
name: {
|
||||||
|
schema: {
|
||||||
|
first: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
},
|
||||||
|
last: {
|
||||||
|
merge: "replace",
|
||||||
|
validate: "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
schema.validate({
|
||||||
|
name: {
|
||||||
|
first: "n",
|
||||||
|
last: "z"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
186
node_modules/@humanwhocodes/object-schema/tests/validation-strategy.js
generated
vendored
Normal file
186
node_modules/@humanwhocodes/object-schema/tests/validation-strategy.js
generated
vendored
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
/**
|
||||||
|
* @filedescription Merge Strategy Tests
|
||||||
|
*/
|
||||||
|
/* global it, describe, beforeEach */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Requirements
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const assert = require("chai").assert;
|
||||||
|
const { ValidationStrategy } = require("../src/");
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Class
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
describe("ValidationStrategy", () => {
|
||||||
|
|
||||||
|
describe("boolean", () => {
|
||||||
|
it("should not throw an error when the value is a boolean", () => {
|
||||||
|
ValidationStrategy.boolean(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is null", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.boolean(null);
|
||||||
|
}, /Expected a Boolean/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is a string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.boolean("foo");
|
||||||
|
}, /Expected a Boolean/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is a number", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.boolean(123);
|
||||||
|
}, /Expected a Boolean/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is an object", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.boolean({});
|
||||||
|
}, /Expected a Boolean/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("number", () => {
|
||||||
|
it("should not throw an error when the value is a number", () => {
|
||||||
|
ValidationStrategy.number(25);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is null", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.number(null);
|
||||||
|
}, /Expected a number/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is a string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.number("foo");
|
||||||
|
}, /Expected a number/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is a boolean", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.number(true);
|
||||||
|
}, /Expected a number/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is an object", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.number({});
|
||||||
|
}, /Expected a number/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("object", () => {
|
||||||
|
it("should not throw an error when the value is an object", () => {
|
||||||
|
ValidationStrategy.object({});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is null", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.object(null);
|
||||||
|
}, /Expected an object/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is a string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.object("");
|
||||||
|
}, /Expected an object/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("array", () => {
|
||||||
|
it("should not throw an error when the value is an array", () => {
|
||||||
|
ValidationStrategy.array([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is null", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.array(null);
|
||||||
|
}, /Expected an array/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is a string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.array("");
|
||||||
|
}, /Expected an array/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is an object", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.array({});
|
||||||
|
}, /Expected an array/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("object?", () => {
|
||||||
|
it("should not throw an error when the value is an object", () => {
|
||||||
|
ValidationStrategy["object?"]({});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not throw an error when the value is null", () => {
|
||||||
|
ValidationStrategy["object?"](null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is a string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy["object?"]("");
|
||||||
|
}, /Expected an object/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("string", () => {
|
||||||
|
it("should not throw an error when the value is a string", () => {
|
||||||
|
ValidationStrategy.string("foo");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not throw an error when the value is an empty string", () => {
|
||||||
|
ValidationStrategy.string("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is null", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.string(null);
|
||||||
|
}, /Expected a string/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is an object", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy.string({});
|
||||||
|
}, /Expected a string/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("string!", () => {
|
||||||
|
it("should not throw an error when the value is an string", () => {
|
||||||
|
ValidationStrategy["string!"]("foo");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is an empty string", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy["string!"]("");
|
||||||
|
}, /Expected a non-empty string/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is null", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy["string!"](null);
|
||||||
|
}, /Expected a non-empty string/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw an error when the value is an object", () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
ValidationStrategy["string!"]({});
|
||||||
|
}, /Expected a non-empty string/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
18
node_modules/@types/json5/README.md
generated
vendored
Normal file
18
node_modules/@types/json5/README.md
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Installation
|
||||||
|
> `npm install --save @types/json5`
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
This package contains type definitions for JSON5 (http://json5.org/).
|
||||||
|
|
||||||
|
# Details
|
||||||
|
Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/types-2.0/json5
|
||||||
|
|
||||||
|
Additional Details
|
||||||
|
* Last updated: Mon, 19 Sep 2016 17:28:59 GMT
|
||||||
|
* File structure: ProperModule
|
||||||
|
* Library Dependencies: none
|
||||||
|
* Module Dependencies: none
|
||||||
|
* Global values: json5
|
||||||
|
|
||||||
|
# Credits
|
||||||
|
These definitions were written by Jason Swearingen <https://jasonswearingen.github.io>.
|
44
node_modules/@types/json5/index.d.ts
generated
vendored
Normal file
44
node_modules/@types/json5/index.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
// Type definitions for JSON5
|
||||||
|
// Project: http://json5.org/
|
||||||
|
// Definitions by: Jason Swearingen <https://jasonswearingen.github.io>
|
||||||
|
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||||
|
|
||||||
|
|
||||||
|
//commonjs loader
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following is the exact list of additions to JSON's syntax introduced by JSON5. All of these are optional, and all of these come from ES5.
|
||||||
|
|
||||||
|
Objects
|
||||||
|
|
||||||
|
Object keys can be unquoted if they're valid identifiers. Yes, even reserved keywords (like default) are valid unquoted keys in ES5 [§11.1.5, §7.6]. (More info)
|
||||||
|
|
||||||
|
(TODO: Unicode characters and escape sequences aren’t yet supported in this implementation.)
|
||||||
|
|
||||||
|
Objects can have trailing commas.
|
||||||
|
|
||||||
|
Arrays
|
||||||
|
|
||||||
|
Arrays can have trailing commas.
|
||||||
|
Strings
|
||||||
|
|
||||||
|
Strings can be single-quoted.
|
||||||
|
|
||||||
|
Strings can be split across multiple lines; just prefix each newline with a backslash. [ES5 §7.8.4]
|
||||||
|
|
||||||
|
Numbers
|
||||||
|
|
||||||
|
Numbers can be hexadecimal (base 16).
|
||||||
|
|
||||||
|
Numbers can begin or end with a (leading or trailing) decimal point.
|
||||||
|
|
||||||
|
Numbers can include Infinity, -Infinity, NaN, and -NaN.
|
||||||
|
|
||||||
|
Numbers can begin with an explicit plus sign.
|
||||||
|
|
||||||
|
Comments
|
||||||
|
|
||||||
|
Both inline (single-line) and block (multi-line) comments are allowed.
|
||||||
|
*/
|
||||||
|
declare var json5: JSON;
|
||||||
|
export = json5;
|
16
node_modules/@types/json5/package.json
generated
vendored
Normal file
16
node_modules/@types/json5/package.json
generated
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "@types/json5",
|
||||||
|
"version": "0.0.29",
|
||||||
|
"description": "TypeScript definitions for JSON5",
|
||||||
|
"license": "MIT",
|
||||||
|
"author": "Jason Swearingen <https://jasonswearingen.github.io>",
|
||||||
|
"main": "",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
|
||||||
|
},
|
||||||
|
"scripts": {},
|
||||||
|
"dependencies": {},
|
||||||
|
"typings": "index.d.ts",
|
||||||
|
"typesPublisherContentHash": "1ed77f2bfd59d290798abf89db281c36565f4a78d97d4e9caab25319d54c6331"
|
||||||
|
}
|
25
node_modules/@types/json5/types-metadata.json
generated
vendored
Normal file
25
node_modules/@types/json5/types-metadata.json
generated
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"authors": "Jason Swearingen <https://jasonswearingen.github.io>",
|
||||||
|
"definitionFilename": "index.d.ts",
|
||||||
|
"libraryDependencies": [],
|
||||||
|
"moduleDependencies": [],
|
||||||
|
"libraryMajorVersion": "0",
|
||||||
|
"libraryMinorVersion": "0",
|
||||||
|
"libraryName": "JSON5",
|
||||||
|
"typingsPackageName": "json5",
|
||||||
|
"projectName": "http://json5.org/",
|
||||||
|
"sourceRepoURL": "https://www.github.com/DefinitelyTyped/DefinitelyTyped",
|
||||||
|
"sourceBranch": "types-2.0",
|
||||||
|
"kind": "ProperModule",
|
||||||
|
"globals": [
|
||||||
|
"json5"
|
||||||
|
],
|
||||||
|
"declaredModules": [
|
||||||
|
"json5"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"index.d.ts"
|
||||||
|
],
|
||||||
|
"hasPackageJson": false,
|
||||||
|
"contentHash": "1ed77f2bfd59d290798abf89db281c36565f4a78d97d4e9caab25319d54c6331"
|
||||||
|
}
|
19
node_modules/acorn-jsx/LICENSE
generated
vendored
Normal file
19
node_modules/acorn-jsx/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (C) 2012-2017 by Ingvar Stepanyan
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
40
node_modules/acorn-jsx/README.md
generated
vendored
Normal file
40
node_modules/acorn-jsx/README.md
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# Acorn-JSX
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/acornjs/acorn-jsx.svg?branch=master)](https://travis-ci.org/acornjs/acorn-jsx)
|
||||||
|
[![NPM version](https://img.shields.io/npm/v/acorn-jsx.svg)](https://www.npmjs.org/package/acorn-jsx)
|
||||||
|
|
||||||
|
This is plugin for [Acorn](http://marijnhaverbeke.nl/acorn/) - a tiny, fast JavaScript parser, written completely in JavaScript.
|
||||||
|
|
||||||
|
It was created as an experimental alternative, faster [React.js JSX](http://facebook.github.io/react/docs/jsx-in-depth.html) parser. Later, it replaced the [official parser](https://github.com/facebookarchive/esprima) and these days is used by many prominent development tools.
|
||||||
|
|
||||||
|
## Transpiler
|
||||||
|
|
||||||
|
Please note that this tool only parses source code to JSX AST, which is useful for various language tools and services. If you want to transpile your code to regular ES5-compliant JavaScript with source map, check out [Babel](https://babeljs.io/) and [Buble](https://buble.surge.sh/) transpilers which use `acorn-jsx` under the hood.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Requiring this module provides you with an Acorn plugin that you can use like this:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var acorn = require("acorn");
|
||||||
|
var jsx = require("acorn-jsx");
|
||||||
|
acorn.Parser.extend(jsx()).parse("my(<jsx/>, 'code');");
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that official spec doesn't support mix of XML namespaces and object-style access in tag names (#27) like in `<namespace:Object.Property />`, so it was deprecated in `acorn-jsx@3.0`. If you still want to opt-in to support of such constructions, you can pass the following option:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
acorn.Parser.extend(jsx({ allowNamespacedObjects: true }))
|
||||||
|
```
|
||||||
|
|
||||||
|
Also, since most apps use pure React transformer, a new option was introduced that allows to prohibit namespaces completely:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
acorn.Parser.extend(jsx({ allowNamespaces: false }))
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that by default `allowNamespaces` is enabled for spec compliancy.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This plugin is issued under the [MIT license](./LICENSE).
|
12
node_modules/acorn-jsx/index.d.ts
generated
vendored
Normal file
12
node_modules/acorn-jsx/index.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import { Parser } from 'acorn'
|
||||||
|
|
||||||
|
declare const jsx: (options?: jsx.Options) => (BaseParser: typeof Parser) => typeof Parser;
|
||||||
|
|
||||||
|
declare namespace jsx {
|
||||||
|
interface Options {
|
||||||
|
allowNamespacedObjects?: boolean;
|
||||||
|
allowNamespaces?: boolean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export = jsx;
|
488
node_modules/acorn-jsx/index.js
generated
vendored
Normal file
488
node_modules/acorn-jsx/index.js
generated
vendored
Normal file
|
@ -0,0 +1,488 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const XHTMLEntities = require('./xhtml');
|
||||||
|
|
||||||
|
const hexNumber = /^[\da-fA-F]+$/;
|
||||||
|
const decimalNumber = /^\d+$/;
|
||||||
|
|
||||||
|
// The map to `acorn-jsx` tokens from `acorn` namespace objects.
|
||||||
|
const acornJsxMap = new WeakMap();
|
||||||
|
|
||||||
|
// Get the original tokens for the given `acorn` namespace object.
|
||||||
|
function getJsxTokens(acorn) {
|
||||||
|
acorn = acorn.Parser.acorn || acorn;
|
||||||
|
let acornJsx = acornJsxMap.get(acorn);
|
||||||
|
if (!acornJsx) {
|
||||||
|
const tt = acorn.tokTypes;
|
||||||
|
const TokContext = acorn.TokContext;
|
||||||
|
const TokenType = acorn.TokenType;
|
||||||
|
const tc_oTag = new TokContext('<tag', false);
|
||||||
|
const tc_cTag = new TokContext('</tag', false);
|
||||||
|
const tc_expr = new TokContext('<tag>...</tag>', true, true);
|
||||||
|
const tokContexts = {
|
||||||
|
tc_oTag: tc_oTag,
|
||||||
|
tc_cTag: tc_cTag,
|
||||||
|
tc_expr: tc_expr
|
||||||
|
};
|
||||||
|
const tokTypes = {
|
||||||
|
jsxName: new TokenType('jsxName'),
|
||||||
|
jsxText: new TokenType('jsxText', {beforeExpr: true}),
|
||||||
|
jsxTagStart: new TokenType('jsxTagStart', {startsExpr: true}),
|
||||||
|
jsxTagEnd: new TokenType('jsxTagEnd')
|
||||||
|
};
|
||||||
|
|
||||||
|
tokTypes.jsxTagStart.updateContext = function() {
|
||||||
|
this.context.push(tc_expr); // treat as beginning of JSX expression
|
||||||
|
this.context.push(tc_oTag); // start opening tag context
|
||||||
|
this.exprAllowed = false;
|
||||||
|
};
|
||||||
|
tokTypes.jsxTagEnd.updateContext = function(prevType) {
|
||||||
|
let out = this.context.pop();
|
||||||
|
if (out === tc_oTag && prevType === tt.slash || out === tc_cTag) {
|
||||||
|
this.context.pop();
|
||||||
|
this.exprAllowed = this.curContext() === tc_expr;
|
||||||
|
} else {
|
||||||
|
this.exprAllowed = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
acornJsx = { tokContexts: tokContexts, tokTypes: tokTypes };
|
||||||
|
acornJsxMap.set(acorn, acornJsx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return acornJsx;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms JSX element name to string.
|
||||||
|
|
||||||
|
function getQualifiedJSXName(object) {
|
||||||
|
if (!object)
|
||||||
|
return object;
|
||||||
|
|
||||||
|
if (object.type === 'JSXIdentifier')
|
||||||
|
return object.name;
|
||||||
|
|
||||||
|
if (object.type === 'JSXNamespacedName')
|
||||||
|
return object.namespace.name + ':' + object.name.name;
|
||||||
|
|
||||||
|
if (object.type === 'JSXMemberExpression')
|
||||||
|
return getQualifiedJSXName(object.object) + '.' +
|
||||||
|
getQualifiedJSXName(object.property);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function(options) {
|
||||||
|
options = options || {};
|
||||||
|
return function(Parser) {
|
||||||
|
return plugin({
|
||||||
|
allowNamespaces: options.allowNamespaces !== false,
|
||||||
|
allowNamespacedObjects: !!options.allowNamespacedObjects
|
||||||
|
}, Parser);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is `tokTypes` of the peer dep.
|
||||||
|
// This can be different instances from the actual `tokTypes` this plugin uses.
|
||||||
|
Object.defineProperty(module.exports, "tokTypes", {
|
||||||
|
get: function get_tokTypes() {
|
||||||
|
return getJsxTokens(require("acorn")).tokTypes;
|
||||||
|
},
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
|
||||||
|
function plugin(options, Parser) {
|
||||||
|
const acorn = Parser.acorn || require("acorn");
|
||||||
|
const acornJsx = getJsxTokens(acorn);
|
||||||
|
const tt = acorn.tokTypes;
|
||||||
|
const tok = acornJsx.tokTypes;
|
||||||
|
const tokContexts = acorn.tokContexts;
|
||||||
|
const tc_oTag = acornJsx.tokContexts.tc_oTag;
|
||||||
|
const tc_cTag = acornJsx.tokContexts.tc_cTag;
|
||||||
|
const tc_expr = acornJsx.tokContexts.tc_expr;
|
||||||
|
const isNewLine = acorn.isNewLine;
|
||||||
|
const isIdentifierStart = acorn.isIdentifierStart;
|
||||||
|
const isIdentifierChar = acorn.isIdentifierChar;
|
||||||
|
|
||||||
|
return class extends Parser {
|
||||||
|
// Expose actual `tokTypes` and `tokContexts` to other plugins.
|
||||||
|
static get acornJsx() {
|
||||||
|
return acornJsx;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads inline JSX contents token.
|
||||||
|
jsx_readToken() {
|
||||||
|
let out = '', chunkStart = this.pos;
|
||||||
|
for (;;) {
|
||||||
|
if (this.pos >= this.input.length)
|
||||||
|
this.raise(this.start, 'Unterminated JSX contents');
|
||||||
|
let ch = this.input.charCodeAt(this.pos);
|
||||||
|
|
||||||
|
switch (ch) {
|
||||||
|
case 60: // '<'
|
||||||
|
case 123: // '{'
|
||||||
|
if (this.pos === this.start) {
|
||||||
|
if (ch === 60 && this.exprAllowed) {
|
||||||
|
++this.pos;
|
||||||
|
return this.finishToken(tok.jsxTagStart);
|
||||||
|
}
|
||||||
|
return this.getTokenFromCode(ch);
|
||||||
|
}
|
||||||
|
out += this.input.slice(chunkStart, this.pos);
|
||||||
|
return this.finishToken(tok.jsxText, out);
|
||||||
|
|
||||||
|
case 38: // '&'
|
||||||
|
out += this.input.slice(chunkStart, this.pos);
|
||||||
|
out += this.jsx_readEntity();
|
||||||
|
chunkStart = this.pos;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 62: // '>'
|
||||||
|
case 125: // '}'
|
||||||
|
this.raise(
|
||||||
|
this.pos,
|
||||||
|
"Unexpected token `" + this.input[this.pos] + "`. Did you mean `" +
|
||||||
|
(ch === 62 ? ">" : "}") + "` or " + "`{\"" + this.input[this.pos] + "\"}" + "`?"
|
||||||
|
);
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (isNewLine(ch)) {
|
||||||
|
out += this.input.slice(chunkStart, this.pos);
|
||||||
|
out += this.jsx_readNewLine(true);
|
||||||
|
chunkStart = this.pos;
|
||||||
|
} else {
|
||||||
|
++this.pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jsx_readNewLine(normalizeCRLF) {
|
||||||
|
let ch = this.input.charCodeAt(this.pos);
|
||||||
|
let out;
|
||||||
|
++this.pos;
|
||||||
|
if (ch === 13 && this.input.charCodeAt(this.pos) === 10) {
|
||||||
|
++this.pos;
|
||||||
|
out = normalizeCRLF ? '\n' : '\r\n';
|
||||||
|
} else {
|
||||||
|
out = String.fromCharCode(ch);
|
||||||
|
}
|
||||||
|
if (this.options.locations) {
|
||||||
|
++this.curLine;
|
||||||
|
this.lineStart = this.pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
jsx_readString(quote) {
|
||||||
|
let out = '', chunkStart = ++this.pos;
|
||||||
|
for (;;) {
|
||||||
|
if (this.pos >= this.input.length)
|
||||||
|
this.raise(this.start, 'Unterminated string constant');
|
||||||
|
let ch = this.input.charCodeAt(this.pos);
|
||||||
|
if (ch === quote) break;
|
||||||
|
if (ch === 38) { // '&'
|
||||||
|
out += this.input.slice(chunkStart, this.pos);
|
||||||
|
out += this.jsx_readEntity();
|
||||||
|
chunkStart = this.pos;
|
||||||
|
} else if (isNewLine(ch)) {
|
||||||
|
out += this.input.slice(chunkStart, this.pos);
|
||||||
|
out += this.jsx_readNewLine(false);
|
||||||
|
chunkStart = this.pos;
|
||||||
|
} else {
|
||||||
|
++this.pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out += this.input.slice(chunkStart, this.pos++);
|
||||||
|
return this.finishToken(tt.string, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
jsx_readEntity() {
|
||||||
|
let str = '', count = 0, entity;
|
||||||
|
let ch = this.input[this.pos];
|
||||||
|
if (ch !== '&')
|
||||||
|
this.raise(this.pos, 'Entity must start with an ampersand');
|
||||||
|
let startPos = ++this.pos;
|
||||||
|
while (this.pos < this.input.length && count++ < 10) {
|
||||||
|
ch = this.input[this.pos++];
|
||||||
|
if (ch === ';') {
|
||||||
|
if (str[0] === '#') {
|
||||||
|
if (str[1] === 'x') {
|
||||||
|
str = str.substr(2);
|
||||||
|
if (hexNumber.test(str))
|
||||||
|
entity = String.fromCharCode(parseInt(str, 16));
|
||||||
|
} else {
|
||||||
|
str = str.substr(1);
|
||||||
|
if (decimalNumber.test(str))
|
||||||
|
entity = String.fromCharCode(parseInt(str, 10));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
entity = XHTMLEntities[str];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
str += ch;
|
||||||
|
}
|
||||||
|
if (!entity) {
|
||||||
|
this.pos = startPos;
|
||||||
|
return '&';
|
||||||
|
}
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read a JSX identifier (valid tag or attribute name).
|
||||||
|
//
|
||||||
|
// Optimized version since JSX identifiers can't contain
|
||||||
|
// escape characters and so can be read as single slice.
|
||||||
|
// Also assumes that first character was already checked
|
||||||
|
// by isIdentifierStart in readToken.
|
||||||
|
|
||||||
|
jsx_readWord() {
|
||||||
|
let ch, start = this.pos;
|
||||||
|
do {
|
||||||
|
ch = this.input.charCodeAt(++this.pos);
|
||||||
|
} while (isIdentifierChar(ch) || ch === 45); // '-'
|
||||||
|
return this.finishToken(tok.jsxName, this.input.slice(start, this.pos));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse next token as JSX identifier
|
||||||
|
|
||||||
|
jsx_parseIdentifier() {
|
||||||
|
let node = this.startNode();
|
||||||
|
if (this.type === tok.jsxName)
|
||||||
|
node.name = this.value;
|
||||||
|
else if (this.type.keyword)
|
||||||
|
node.name = this.type.keyword;
|
||||||
|
else
|
||||||
|
this.unexpected();
|
||||||
|
this.next();
|
||||||
|
return this.finishNode(node, 'JSXIdentifier');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse namespaced identifier.
|
||||||
|
|
||||||
|
jsx_parseNamespacedName() {
|
||||||
|
let startPos = this.start, startLoc = this.startLoc;
|
||||||
|
let name = this.jsx_parseIdentifier();
|
||||||
|
if (!options.allowNamespaces || !this.eat(tt.colon)) return name;
|
||||||
|
var node = this.startNodeAt(startPos, startLoc);
|
||||||
|
node.namespace = name;
|
||||||
|
node.name = this.jsx_parseIdentifier();
|
||||||
|
return this.finishNode(node, 'JSXNamespacedName');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses element name in any form - namespaced, member
|
||||||
|
// or single identifier.
|
||||||
|
|
||||||
|
jsx_parseElementName() {
|
||||||
|
if (this.type === tok.jsxTagEnd) return '';
|
||||||
|
let startPos = this.start, startLoc = this.startLoc;
|
||||||
|
let node = this.jsx_parseNamespacedName();
|
||||||
|
if (this.type === tt.dot && node.type === 'JSXNamespacedName' && !options.allowNamespacedObjects) {
|
||||||
|
this.unexpected();
|
||||||
|
}
|
||||||
|
while (this.eat(tt.dot)) {
|
||||||
|
let newNode = this.startNodeAt(startPos, startLoc);
|
||||||
|
newNode.object = node;
|
||||||
|
newNode.property = this.jsx_parseIdentifier();
|
||||||
|
node = this.finishNode(newNode, 'JSXMemberExpression');
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses any type of JSX attribute value.
|
||||||
|
|
||||||
|
jsx_parseAttributeValue() {
|
||||||
|
switch (this.type) {
|
||||||
|
case tt.braceL:
|
||||||
|
let node = this.jsx_parseExpressionContainer();
|
||||||
|
if (node.expression.type === 'JSXEmptyExpression')
|
||||||
|
this.raise(node.start, 'JSX attributes must only be assigned a non-empty expression');
|
||||||
|
return node;
|
||||||
|
|
||||||
|
case tok.jsxTagStart:
|
||||||
|
case tt.string:
|
||||||
|
return this.parseExprAtom();
|
||||||
|
|
||||||
|
default:
|
||||||
|
this.raise(this.start, 'JSX value should be either an expression or a quoted JSX text');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSXEmptyExpression is unique type since it doesn't actually parse anything,
|
||||||
|
// and so it should start at the end of last read token (left brace) and finish
|
||||||
|
// at the beginning of the next one (right brace).
|
||||||
|
|
||||||
|
jsx_parseEmptyExpression() {
|
||||||
|
let node = this.startNodeAt(this.lastTokEnd, this.lastTokEndLoc);
|
||||||
|
return this.finishNodeAt(node, 'JSXEmptyExpression', this.start, this.startLoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses JSX expression enclosed into curly brackets.
|
||||||
|
|
||||||
|
jsx_parseExpressionContainer() {
|
||||||
|
let node = this.startNode();
|
||||||
|
this.next();
|
||||||
|
node.expression = this.type === tt.braceR
|
||||||
|
? this.jsx_parseEmptyExpression()
|
||||||
|
: this.parseExpression();
|
||||||
|
this.expect(tt.braceR);
|
||||||
|
return this.finishNode(node, 'JSXExpressionContainer');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses following JSX attribute name-value pair.
|
||||||
|
|
||||||
|
jsx_parseAttribute() {
|
||||||
|
let node = this.startNode();
|
||||||
|
if (this.eat(tt.braceL)) {
|
||||||
|
this.expect(tt.ellipsis);
|
||||||
|
node.argument = this.parseMaybeAssign();
|
||||||
|
this.expect(tt.braceR);
|
||||||
|
return this.finishNode(node, 'JSXSpreadAttribute');
|
||||||
|
}
|
||||||
|
node.name = this.jsx_parseNamespacedName();
|
||||||
|
node.value = this.eat(tt.eq) ? this.jsx_parseAttributeValue() : null;
|
||||||
|
return this.finishNode(node, 'JSXAttribute');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses JSX opening tag starting after '<'.
|
||||||
|
|
||||||
|
jsx_parseOpeningElementAt(startPos, startLoc) {
|
||||||
|
let node = this.startNodeAt(startPos, startLoc);
|
||||||
|
node.attributes = [];
|
||||||
|
let nodeName = this.jsx_parseElementName();
|
||||||
|
if (nodeName) node.name = nodeName;
|
||||||
|
while (this.type !== tt.slash && this.type !== tok.jsxTagEnd)
|
||||||
|
node.attributes.push(this.jsx_parseAttribute());
|
||||||
|
node.selfClosing = this.eat(tt.slash);
|
||||||
|
this.expect(tok.jsxTagEnd);
|
||||||
|
return this.finishNode(node, nodeName ? 'JSXOpeningElement' : 'JSXOpeningFragment');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses JSX closing tag starting after '</'.
|
||||||
|
|
||||||
|
jsx_parseClosingElementAt(startPos, startLoc) {
|
||||||
|
let node = this.startNodeAt(startPos, startLoc);
|
||||||
|
let nodeName = this.jsx_parseElementName();
|
||||||
|
if (nodeName) node.name = nodeName;
|
||||||
|
this.expect(tok.jsxTagEnd);
|
||||||
|
return this.finishNode(node, nodeName ? 'JSXClosingElement' : 'JSXClosingFragment');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses entire JSX element, including it's opening tag
|
||||||
|
// (starting after '<'), attributes, contents and closing tag.
|
||||||
|
|
||||||
|
jsx_parseElementAt(startPos, startLoc) {
|
||||||
|
let node = this.startNodeAt(startPos, startLoc);
|
||||||
|
let children = [];
|
||||||
|
let openingElement = this.jsx_parseOpeningElementAt(startPos, startLoc);
|
||||||
|
let closingElement = null;
|
||||||
|
|
||||||
|
if (!openingElement.selfClosing) {
|
||||||
|
contents: for (;;) {
|
||||||
|
switch (this.type) {
|
||||||
|
case tok.jsxTagStart:
|
||||||
|
startPos = this.start; startLoc = this.startLoc;
|
||||||
|
this.next();
|
||||||
|
if (this.eat(tt.slash)) {
|
||||||
|
closingElement = this.jsx_parseClosingElementAt(startPos, startLoc);
|
||||||
|
break contents;
|
||||||
|
}
|
||||||
|
children.push(this.jsx_parseElementAt(startPos, startLoc));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case tok.jsxText:
|
||||||
|
children.push(this.parseExprAtom());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case tt.braceL:
|
||||||
|
children.push(this.jsx_parseExpressionContainer());
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
this.unexpected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) {
|
||||||
|
this.raise(
|
||||||
|
closingElement.start,
|
||||||
|
'Expected corresponding JSX closing tag for <' + getQualifiedJSXName(openingElement.name) + '>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let fragmentOrElement = openingElement.name ? 'Element' : 'Fragment';
|
||||||
|
|
||||||
|
node['opening' + fragmentOrElement] = openingElement;
|
||||||
|
node['closing' + fragmentOrElement] = closingElement;
|
||||||
|
node.children = children;
|
||||||
|
if (this.type === tt.relational && this.value === "<") {
|
||||||
|
this.raise(this.start, "Adjacent JSX elements must be wrapped in an enclosing tag");
|
||||||
|
}
|
||||||
|
return this.finishNode(node, 'JSX' + fragmentOrElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse JSX text
|
||||||
|
|
||||||
|
jsx_parseText() {
|
||||||
|
let node = this.parseLiteral(this.value);
|
||||||
|
node.type = "JSXText";
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses entire JSX element from current position.
|
||||||
|
|
||||||
|
jsx_parseElement() {
|
||||||
|
let startPos = this.start, startLoc = this.startLoc;
|
||||||
|
this.next();
|
||||||
|
return this.jsx_parseElementAt(startPos, startLoc);
|
||||||
|
}
|
||||||
|
|
||||||
|
parseExprAtom(refShortHandDefaultPos) {
|
||||||
|
if (this.type === tok.jsxText)
|
||||||
|
return this.jsx_parseText();
|
||||||
|
else if (this.type === tok.jsxTagStart)
|
||||||
|
return this.jsx_parseElement();
|
||||||
|
else
|
||||||
|
return super.parseExprAtom(refShortHandDefaultPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
readToken(code) {
|
||||||
|
let context = this.curContext();
|
||||||
|
|
||||||
|
if (context === tc_expr) return this.jsx_readToken();
|
||||||
|
|
||||||
|
if (context === tc_oTag || context === tc_cTag) {
|
||||||
|
if (isIdentifierStart(code)) return this.jsx_readWord();
|
||||||
|
|
||||||
|
if (code == 62) {
|
||||||
|
++this.pos;
|
||||||
|
return this.finishToken(tok.jsxTagEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((code === 34 || code === 39) && context == tc_oTag)
|
||||||
|
return this.jsx_readString(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (code === 60 && this.exprAllowed && this.input.charCodeAt(this.pos + 1) !== 33) {
|
||||||
|
++this.pos;
|
||||||
|
return this.finishToken(tok.jsxTagStart);
|
||||||
|
}
|
||||||
|
return super.readToken(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateContext(prevType) {
|
||||||
|
if (this.type == tt.braceL) {
|
||||||
|
var curContext = this.curContext();
|
||||||
|
if (curContext == tc_oTag) this.context.push(tokContexts.b_expr);
|
||||||
|
else if (curContext == tc_expr) this.context.push(tokContexts.b_tmpl);
|
||||||
|
else super.updateContext(prevType);
|
||||||
|
this.exprAllowed = true;
|
||||||
|
} else if (this.type === tt.slash && prevType === tok.jsxTagStart) {
|
||||||
|
this.context.length -= 2; // do not consider JSX expr -> JSX open tag -> ... anymore
|
||||||
|
this.context.push(tc_cTag); // reconsider as closing tag context
|
||||||
|
this.exprAllowed = false;
|
||||||
|
} else {
|
||||||
|
return super.updateContext(prevType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
27
node_modules/acorn-jsx/package.json
generated
vendored
Normal file
27
node_modules/acorn-jsx/package.json
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"name": "acorn-jsx",
|
||||||
|
"description": "Modern, fast React.js JSX parser",
|
||||||
|
"homepage": "https://github.com/acornjs/acorn-jsx",
|
||||||
|
"version": "5.3.2",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "Ingvar Stepanyan",
|
||||||
|
"email": "me@rreverser.com",
|
||||||
|
"web": "http://rreverser.com/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/acornjs/acorn-jsx"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"test": "node test/run.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"acorn": "^8.0.1"
|
||||||
|
}
|
||||||
|
}
|
255
node_modules/acorn-jsx/xhtml.js
generated
vendored
Normal file
255
node_modules/acorn-jsx/xhtml.js
generated
vendored
Normal file
|
@ -0,0 +1,255 @@
|
||||||
|
module.exports = {
|
||||||
|
quot: '\u0022',
|
||||||
|
amp: '&',
|
||||||
|
apos: '\u0027',
|
||||||
|
lt: '<',
|
||||||
|
gt: '>',
|
||||||
|
nbsp: '\u00A0',
|
||||||
|
iexcl: '\u00A1',
|
||||||
|
cent: '\u00A2',
|
||||||
|
pound: '\u00A3',
|
||||||
|
curren: '\u00A4',
|
||||||
|
yen: '\u00A5',
|
||||||
|
brvbar: '\u00A6',
|
||||||
|
sect: '\u00A7',
|
||||||
|
uml: '\u00A8',
|
||||||
|
copy: '\u00A9',
|
||||||
|
ordf: '\u00AA',
|
||||||
|
laquo: '\u00AB',
|
||||||
|
not: '\u00AC',
|
||||||
|
shy: '\u00AD',
|
||||||
|
reg: '\u00AE',
|
||||||
|
macr: '\u00AF',
|
||||||
|
deg: '\u00B0',
|
||||||
|
plusmn: '\u00B1',
|
||||||
|
sup2: '\u00B2',
|
||||||
|
sup3: '\u00B3',
|
||||||
|
acute: '\u00B4',
|
||||||
|
micro: '\u00B5',
|
||||||
|
para: '\u00B6',
|
||||||
|
middot: '\u00B7',
|
||||||
|
cedil: '\u00B8',
|
||||||
|
sup1: '\u00B9',
|
||||||
|
ordm: '\u00BA',
|
||||||
|
raquo: '\u00BB',
|
||||||
|
frac14: '\u00BC',
|
||||||
|
frac12: '\u00BD',
|
||||||
|
frac34: '\u00BE',
|
||||||
|
iquest: '\u00BF',
|
||||||
|
Agrave: '\u00C0',
|
||||||
|
Aacute: '\u00C1',
|
||||||
|
Acirc: '\u00C2',
|
||||||
|
Atilde: '\u00C3',
|
||||||
|
Auml: '\u00C4',
|
||||||
|
Aring: '\u00C5',
|
||||||
|
AElig: '\u00C6',
|
||||||
|
Ccedil: '\u00C7',
|
||||||
|
Egrave: '\u00C8',
|
||||||
|
Eacute: '\u00C9',
|
||||||
|
Ecirc: '\u00CA',
|
||||||
|
Euml: '\u00CB',
|
||||||
|
Igrave: '\u00CC',
|
||||||
|
Iacute: '\u00CD',
|
||||||
|
Icirc: '\u00CE',
|
||||||
|
Iuml: '\u00CF',
|
||||||
|
ETH: '\u00D0',
|
||||||
|
Ntilde: '\u00D1',
|
||||||
|
Ograve: '\u00D2',
|
||||||
|
Oacute: '\u00D3',
|
||||||
|
Ocirc: '\u00D4',
|
||||||
|
Otilde: '\u00D5',
|
||||||
|
Ouml: '\u00D6',
|
||||||
|
times: '\u00D7',
|
||||||
|
Oslash: '\u00D8',
|
||||||
|
Ugrave: '\u00D9',
|
||||||
|
Uacute: '\u00DA',
|
||||||
|
Ucirc: '\u00DB',
|
||||||
|
Uuml: '\u00DC',
|
||||||
|
Yacute: '\u00DD',
|
||||||
|
THORN: '\u00DE',
|
||||||
|
szlig: '\u00DF',
|
||||||
|
agrave: '\u00E0',
|
||||||
|
aacute: '\u00E1',
|
||||||
|
acirc: '\u00E2',
|
||||||
|
atilde: '\u00E3',
|
||||||
|
auml: '\u00E4',
|
||||||
|
aring: '\u00E5',
|
||||||
|
aelig: '\u00E6',
|
||||||
|
ccedil: '\u00E7',
|
||||||
|
egrave: '\u00E8',
|
||||||
|
eacute: '\u00E9',
|
||||||
|
ecirc: '\u00EA',
|
||||||
|
euml: '\u00EB',
|
||||||
|
igrave: '\u00EC',
|
||||||
|
iacute: '\u00ED',
|
||||||
|
icirc: '\u00EE',
|
||||||
|
iuml: '\u00EF',
|
||||||
|
eth: '\u00F0',
|
||||||
|
ntilde: '\u00F1',
|
||||||
|
ograve: '\u00F2',
|
||||||
|
oacute: '\u00F3',
|
||||||
|
ocirc: '\u00F4',
|
||||||
|
otilde: '\u00F5',
|
||||||
|
ouml: '\u00F6',
|
||||||
|
divide: '\u00F7',
|
||||||
|
oslash: '\u00F8',
|
||||||
|
ugrave: '\u00F9',
|
||||||
|
uacute: '\u00FA',
|
||||||
|
ucirc: '\u00FB',
|
||||||
|
uuml: '\u00FC',
|
||||||
|
yacute: '\u00FD',
|
||||||
|
thorn: '\u00FE',
|
||||||
|
yuml: '\u00FF',
|
||||||
|
OElig: '\u0152',
|
||||||
|
oelig: '\u0153',
|
||||||
|
Scaron: '\u0160',
|
||||||
|
scaron: '\u0161',
|
||||||
|
Yuml: '\u0178',
|
||||||
|
fnof: '\u0192',
|
||||||
|
circ: '\u02C6',
|
||||||
|
tilde: '\u02DC',
|
||||||
|
Alpha: '\u0391',
|
||||||
|
Beta: '\u0392',
|
||||||
|
Gamma: '\u0393',
|
||||||
|
Delta: '\u0394',
|
||||||
|
Epsilon: '\u0395',
|
||||||
|
Zeta: '\u0396',
|
||||||
|
Eta: '\u0397',
|
||||||
|
Theta: '\u0398',
|
||||||
|
Iota: '\u0399',
|
||||||
|
Kappa: '\u039A',
|
||||||
|
Lambda: '\u039B',
|
||||||
|
Mu: '\u039C',
|
||||||
|
Nu: '\u039D',
|
||||||
|
Xi: '\u039E',
|
||||||
|
Omicron: '\u039F',
|
||||||
|
Pi: '\u03A0',
|
||||||
|
Rho: '\u03A1',
|
||||||
|
Sigma: '\u03A3',
|
||||||
|
Tau: '\u03A4',
|
||||||
|
Upsilon: '\u03A5',
|
||||||
|
Phi: '\u03A6',
|
||||||
|
Chi: '\u03A7',
|
||||||
|
Psi: '\u03A8',
|
||||||
|
Omega: '\u03A9',
|
||||||
|
alpha: '\u03B1',
|
||||||
|
beta: '\u03B2',
|
||||||
|
gamma: '\u03B3',
|
||||||
|
delta: '\u03B4',
|
||||||
|
epsilon: '\u03B5',
|
||||||
|
zeta: '\u03B6',
|
||||||
|
eta: '\u03B7',
|
||||||
|
theta: '\u03B8',
|
||||||
|
iota: '\u03B9',
|
||||||
|
kappa: '\u03BA',
|
||||||
|
lambda: '\u03BB',
|
||||||
|
mu: '\u03BC',
|
||||||
|
nu: '\u03BD',
|
||||||
|
xi: '\u03BE',
|
||||||
|
omicron: '\u03BF',
|
||||||
|
pi: '\u03C0',
|
||||||
|
rho: '\u03C1',
|
||||||
|
sigmaf: '\u03C2',
|
||||||
|
sigma: '\u03C3',
|
||||||
|
tau: '\u03C4',
|
||||||
|
upsilon: '\u03C5',
|
||||||
|
phi: '\u03C6',
|
||||||
|
chi: '\u03C7',
|
||||||
|
psi: '\u03C8',
|
||||||
|
omega: '\u03C9',
|
||||||
|
thetasym: '\u03D1',
|
||||||
|
upsih: '\u03D2',
|
||||||
|
piv: '\u03D6',
|
||||||
|
ensp: '\u2002',
|
||||||
|
emsp: '\u2003',
|
||||||
|
thinsp: '\u2009',
|
||||||
|
zwnj: '\u200C',
|
||||||
|
zwj: '\u200D',
|
||||||
|
lrm: '\u200E',
|
||||||
|
rlm: '\u200F',
|
||||||
|
ndash: '\u2013',
|
||||||
|
mdash: '\u2014',
|
||||||
|
lsquo: '\u2018',
|
||||||
|
rsquo: '\u2019',
|
||||||
|
sbquo: '\u201A',
|
||||||
|
ldquo: '\u201C',
|
||||||
|
rdquo: '\u201D',
|
||||||
|
bdquo: '\u201E',
|
||||||
|
dagger: '\u2020',
|
||||||
|
Dagger: '\u2021',
|
||||||
|
bull: '\u2022',
|
||||||
|
hellip: '\u2026',
|
||||||
|
permil: '\u2030',
|
||||||
|
prime: '\u2032',
|
||||||
|
Prime: '\u2033',
|
||||||
|
lsaquo: '\u2039',
|
||||||
|
rsaquo: '\u203A',
|
||||||
|
oline: '\u203E',
|
||||||
|
frasl: '\u2044',
|
||||||
|
euro: '\u20AC',
|
||||||
|
image: '\u2111',
|
||||||
|
weierp: '\u2118',
|
||||||
|
real: '\u211C',
|
||||||
|
trade: '\u2122',
|
||||||
|
alefsym: '\u2135',
|
||||||
|
larr: '\u2190',
|
||||||
|
uarr: '\u2191',
|
||||||
|
rarr: '\u2192',
|
||||||
|
darr: '\u2193',
|
||||||
|
harr: '\u2194',
|
||||||
|
crarr: '\u21B5',
|
||||||
|
lArr: '\u21D0',
|
||||||
|
uArr: '\u21D1',
|
||||||
|
rArr: '\u21D2',
|
||||||
|
dArr: '\u21D3',
|
||||||
|
hArr: '\u21D4',
|
||||||
|
forall: '\u2200',
|
||||||
|
part: '\u2202',
|
||||||
|
exist: '\u2203',
|
||||||
|
empty: '\u2205',
|
||||||
|
nabla: '\u2207',
|
||||||
|
isin: '\u2208',
|
||||||
|
notin: '\u2209',
|
||||||
|
ni: '\u220B',
|
||||||
|
prod: '\u220F',
|
||||||
|
sum: '\u2211',
|
||||||
|
minus: '\u2212',
|
||||||
|
lowast: '\u2217',
|
||||||
|
radic: '\u221A',
|
||||||
|
prop: '\u221D',
|
||||||
|
infin: '\u221E',
|
||||||
|
ang: '\u2220',
|
||||||
|
and: '\u2227',
|
||||||
|
or: '\u2228',
|
||||||
|
cap: '\u2229',
|
||||||
|
cup: '\u222A',
|
||||||
|
'int': '\u222B',
|
||||||
|
there4: '\u2234',
|
||||||
|
sim: '\u223C',
|
||||||
|
cong: '\u2245',
|
||||||
|
asymp: '\u2248',
|
||||||
|
ne: '\u2260',
|
||||||
|
equiv: '\u2261',
|
||||||
|
le: '\u2264',
|
||||||
|
ge: '\u2265',
|
||||||
|
sub: '\u2282',
|
||||||
|
sup: '\u2283',
|
||||||
|
nsub: '\u2284',
|
||||||
|
sube: '\u2286',
|
||||||
|
supe: '\u2287',
|
||||||
|
oplus: '\u2295',
|
||||||
|
otimes: '\u2297',
|
||||||
|
perp: '\u22A5',
|
||||||
|
sdot: '\u22C5',
|
||||||
|
lceil: '\u2308',
|
||||||
|
rceil: '\u2309',
|
||||||
|
lfloor: '\u230A',
|
||||||
|
rfloor: '\u230B',
|
||||||
|
lang: '\u2329',
|
||||||
|
rang: '\u232A',
|
||||||
|
loz: '\u25CA',
|
||||||
|
spades: '\u2660',
|
||||||
|
clubs: '\u2663',
|
||||||
|
hearts: '\u2665',
|
||||||
|
diams: '\u2666'
|
||||||
|
};
|
798
node_modules/acorn/CHANGELOG.md
generated
vendored
Normal file
798
node_modules/acorn/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,798 @@
|
||||||
|
## 8.7.1 (2021-04-26)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Stop handling `"use strict"` directives in ECMAScript versions before 5.
|
||||||
|
|
||||||
|
Fix an issue where duplicate quoted export names in `export *` syntax were incorrectly checked.
|
||||||
|
|
||||||
|
Add missing type for `tokTypes`.
|
||||||
|
|
||||||
|
## 8.7.0 (2021-12-27)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Support quoted export names.
|
||||||
|
|
||||||
|
Upgrade to Unicode 14.
|
||||||
|
|
||||||
|
Add support for Unicode 13 properties in regular expressions.
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Use a loop to find line breaks, because the existing regexp search would overrun the end of the searched range and waste a lot of time in minified code.
|
||||||
|
|
||||||
|
## 8.6.0 (2021-11-18)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a bug where an object literal with multiple `__proto__` properties would incorrectly be accepted if a later property value held an assigment.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Support class private fields with the `in` operator.
|
||||||
|
|
||||||
|
## 8.5.0 (2021-09-06)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Improve context-dependent tokenization in a number of corner cases.
|
||||||
|
|
||||||
|
Fix location tracking after a 0x2028 or 0x2029 character in a string literal (which before did not increase the line number).
|
||||||
|
|
||||||
|
Fix an issue where arrow function bodies in for loop context would inappropriately consume `in` operators.
|
||||||
|
|
||||||
|
Fix wrong end locations stored on SequenceExpression nodes.
|
||||||
|
|
||||||
|
Implement restriction that `for`/`of` loop LHS can't start with `let`.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Add support for ES2022 class static blocks.
|
||||||
|
|
||||||
|
Allow multiple input files to be passed to the CLI tool.
|
||||||
|
|
||||||
|
## 8.4.1 (2021-06-24)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a bug where `allowAwaitOutsideFunction` would allow `await` in class field initializers, and setting `ecmaVersion` to 13 or higher would allow top-level await in non-module sources.
|
||||||
|
|
||||||
|
## 8.4.0 (2021-06-11)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
A new option, `allowSuperOutsideMethod`, can be used to suppress the error when `super` is used in the wrong context.
|
||||||
|
|
||||||
|
## 8.3.0 (2021-05-31)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Default `allowAwaitOutsideFunction` to true for ECMAScript 2022 an higher.
|
||||||
|
|
||||||
|
Add support for the `d` ([indices](https://github.com/tc39/proposal-regexp-match-indices)) regexp flag.
|
||||||
|
|
||||||
|
## 8.2.4 (2021-05-04)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix spec conformity in corner case 'for await (async of ...)'.
|
||||||
|
|
||||||
|
## 8.2.3 (2021-05-04)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix an issue where the library couldn't parse 'for (async of ...)'.
|
||||||
|
|
||||||
|
Fix a bug in UTF-16 decoding that would read characters incorrectly in some circumstances.
|
||||||
|
|
||||||
|
## 8.2.2 (2021-04-29)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a bug where a class field initialized to an async arrow function wouldn't allow await inside it. Same issue existed for generator arrow functions with yield.
|
||||||
|
|
||||||
|
## 8.2.1 (2021-04-24)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a regression introduced in 8.2.0 where static or async class methods with keyword names fail to parse.
|
||||||
|
|
||||||
|
## 8.2.0 (2021-04-24)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Add support for ES2022 class fields and private methods.
|
||||||
|
|
||||||
|
## 8.1.1 (2021-04-12)
|
||||||
|
|
||||||
|
### Various
|
||||||
|
|
||||||
|
Stop shipping source maps in the NPM package.
|
||||||
|
|
||||||
|
## 8.1.0 (2021-03-09)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a spurious error in nested destructuring arrays.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Expose `allowAwaitOutsideFunction` in CLI interface.
|
||||||
|
|
||||||
|
Make `allowImportExportAnywhere` also apply to `import.meta`.
|
||||||
|
|
||||||
|
## 8.0.5 (2021-01-25)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Adjust package.json to work with Node 12.16.0 and 13.0-13.6.
|
||||||
|
|
||||||
|
## 8.0.4 (2020-10-05)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Make `await x ** y` an error, following the spec.
|
||||||
|
|
||||||
|
Fix potentially exponential regular expression.
|
||||||
|
|
||||||
|
## 8.0.3 (2020-10-02)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a wasteful loop during `Parser` creation when setting `ecmaVersion` to `"latest"`.
|
||||||
|
|
||||||
|
## 8.0.2 (2020-09-30)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Make the TypeScript types reflect the current allowed values for `ecmaVersion`.
|
||||||
|
|
||||||
|
Fix another regexp/division tokenizer issue.
|
||||||
|
|
||||||
|
## 8.0.1 (2020-08-12)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Provide the correct value in the `version` export.
|
||||||
|
|
||||||
|
## 8.0.0 (2020-08-12)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Disallow expressions like `(a = b) = c`.
|
||||||
|
|
||||||
|
Make non-octal escape sequences a syntax error in strict mode.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
The package can now be loaded directly as an ECMAScript module in node 13+.
|
||||||
|
|
||||||
|
Update to the set of Unicode properties from ES2021.
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
The `ecmaVersion` option is now required. For the moment, omitting it will still work with a warning, but that will change in a future release.
|
||||||
|
|
||||||
|
Some changes to method signatures that may be used by plugins.
|
||||||
|
|
||||||
|
## 7.4.0 (2020-08-03)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Add support for logical assignment operators.
|
||||||
|
|
||||||
|
Add support for numeric separators.
|
||||||
|
|
||||||
|
## 7.3.1 (2020-06-11)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Make the string in the `version` export match the actual library version.
|
||||||
|
|
||||||
|
## 7.3.0 (2020-06-11)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a bug that caused parsing of object patterns with a property named `set` that had a default value to fail.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Add support for optional chaining (`?.`).
|
||||||
|
|
||||||
|
## 7.2.0 (2020-05-09)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix precedence issue in parsing of async arrow functions.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Add support for nullish coalescing.
|
||||||
|
|
||||||
|
Add support for `import.meta`.
|
||||||
|
|
||||||
|
Support `export * as ...` syntax.
|
||||||
|
|
||||||
|
Upgrade to Unicode 13.
|
||||||
|
|
||||||
|
## 6.4.1 (2020-03-09)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
More carefully check for valid UTF16 surrogate pairs in regexp validator.
|
||||||
|
|
||||||
|
## 7.1.1 (2020-03-01)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Treat `\8` and `\9` as invalid escapes in template strings.
|
||||||
|
|
||||||
|
Allow unicode escapes in property names that are keywords.
|
||||||
|
|
||||||
|
Don't error on an exponential operator expression as argument to `await`.
|
||||||
|
|
||||||
|
More carefully check for valid UTF16 surrogate pairs in regexp validator.
|
||||||
|
|
||||||
|
## 7.1.0 (2019-09-24)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Disallow trailing object literal commas when ecmaVersion is less than 5.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Add a static `acorn` property to the `Parser` class that contains the entire module interface, to allow plugins to access the instance of the library that they are acting on.
|
||||||
|
|
||||||
|
## 7.0.0 (2019-08-13)
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
Changes the node format for dynamic imports to use the `ImportExpression` node type, as defined in [ESTree](https://github.com/estree/estree/blob/master/es2020.md#importexpression).
|
||||||
|
|
||||||
|
Makes 10 (ES2019) the default value for the `ecmaVersion` option.
|
||||||
|
|
||||||
|
## 6.3.0 (2019-08-12)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
`sourceType: "module"` can now be used even when `ecmaVersion` is less than 6, to parse module-style code that otherwise conforms to an older standard.
|
||||||
|
|
||||||
|
## 6.2.1 (2019-07-21)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix bug causing Acorn to treat some characters as identifier characters that shouldn't be treated as such.
|
||||||
|
|
||||||
|
Fix issue where setting the `allowReserved` option to `"never"` allowed reserved words in some circumstances.
|
||||||
|
|
||||||
|
## 6.2.0 (2019-07-04)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Improve valid assignment checking in `for`/`in` and `for`/`of` loops.
|
||||||
|
|
||||||
|
Disallow binding `let` in patterns.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Support bigint syntax with `ecmaVersion` >= 11.
|
||||||
|
|
||||||
|
Support dynamic `import` syntax with `ecmaVersion` >= 11.
|
||||||
|
|
||||||
|
Upgrade to Unicode version 12.
|
||||||
|
|
||||||
|
## 6.1.1 (2019-02-27)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix bug that caused parsing default exports of with names to fail.
|
||||||
|
|
||||||
|
## 6.1.0 (2019-02-08)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix scope checking when redefining a `var` as a lexical binding.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Split up `parseSubscripts` to use an internal `parseSubscript` method to make it easier to extend with plugins.
|
||||||
|
|
||||||
|
## 6.0.7 (2019-02-04)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Check that exported bindings are defined.
|
||||||
|
|
||||||
|
Don't treat `\u180e` as a whitespace character.
|
||||||
|
|
||||||
|
Check for duplicate parameter names in methods.
|
||||||
|
|
||||||
|
Don't allow shorthand properties when they are generators or async methods.
|
||||||
|
|
||||||
|
Forbid binding `await` in async arrow function's parameter list.
|
||||||
|
|
||||||
|
## 6.0.6 (2019-01-30)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
The content of class declarations and expressions is now always parsed in strict mode.
|
||||||
|
|
||||||
|
Don't allow `let` or `const` to bind the variable name `let`.
|
||||||
|
|
||||||
|
Treat class declarations as lexical.
|
||||||
|
|
||||||
|
Don't allow a generator function declaration as the sole body of an `if` or `else`.
|
||||||
|
|
||||||
|
Ignore `"use strict"` when after an empty statement.
|
||||||
|
|
||||||
|
Allow string line continuations with special line terminator characters.
|
||||||
|
|
||||||
|
Treat `for` bodies as part of the `for` scope when checking for conflicting bindings.
|
||||||
|
|
||||||
|
Fix bug with parsing `yield` in a `for` loop initializer.
|
||||||
|
|
||||||
|
Implement special cases around scope checking for functions.
|
||||||
|
|
||||||
|
## 6.0.5 (2019-01-02)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix TypeScript type for `Parser.extend` and add `allowAwaitOutsideFunction` to options type.
|
||||||
|
|
||||||
|
Don't treat `let` as a keyword when the next token is `{` on the next line.
|
||||||
|
|
||||||
|
Fix bug that broke checking for parentheses around an object pattern in a destructuring assignment when `preserveParens` was on.
|
||||||
|
|
||||||
|
## 6.0.4 (2018-11-05)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Further improvements to tokenizing regular expressions in corner cases.
|
||||||
|
|
||||||
|
## 6.0.3 (2018-11-04)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix bug in tokenizing an expression-less return followed by a function followed by a regular expression.
|
||||||
|
|
||||||
|
Remove stray symlink in the package tarball.
|
||||||
|
|
||||||
|
## 6.0.2 (2018-09-26)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix bug where default expressions could fail to parse inside an object destructuring assignment expression.
|
||||||
|
|
||||||
|
## 6.0.1 (2018-09-14)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix wrong value in `version` export.
|
||||||
|
|
||||||
|
## 6.0.0 (2018-09-14)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Better handle variable-redefinition checks for catch bindings and functions directly under if statements.
|
||||||
|
|
||||||
|
Forbid `new.target` in top-level arrow functions.
|
||||||
|
|
||||||
|
Fix issue with parsing a regexp after `yield` in some contexts.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
The package now comes with TypeScript definitions.
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
The default value of the `ecmaVersion` option is now 9 (2018).
|
||||||
|
|
||||||
|
Plugins work differently, and will have to be rewritten to work with this version.
|
||||||
|
|
||||||
|
The loose parser and walker have been moved into separate packages (`acorn-loose` and `acorn-walk`).
|
||||||
|
|
||||||
|
## 5.7.3 (2018-09-10)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix failure to tokenize regexps after expressions like `x.of`.
|
||||||
|
|
||||||
|
Better error message for unterminated template literals.
|
||||||
|
|
||||||
|
## 5.7.2 (2018-08-24)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Properly handle `allowAwaitOutsideFunction` in for statements.
|
||||||
|
|
||||||
|
Treat function declarations at the top level of modules like let bindings.
|
||||||
|
|
||||||
|
Don't allow async function declarations as the only statement under a label.
|
||||||
|
|
||||||
|
## 5.7.0 (2018-06-15)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Upgraded to Unicode 11.
|
||||||
|
|
||||||
|
## 5.6.0 (2018-05-31)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Allow U+2028 and U+2029 in string when ECMAVersion >= 10.
|
||||||
|
|
||||||
|
Allow binding-less catch statements when ECMAVersion >= 10.
|
||||||
|
|
||||||
|
Add `allowAwaitOutsideFunction` option for parsing top-level `await`.
|
||||||
|
|
||||||
|
## 5.5.3 (2018-03-08)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
A _second_ republish of the code in 5.5.1, this time with yarn, to hopefully get valid timestamps.
|
||||||
|
|
||||||
|
## 5.5.2 (2018-03-08)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
A republish of the code in 5.5.1 in an attempt to solve an issue with the file timestamps in the npm package being 0.
|
||||||
|
|
||||||
|
## 5.5.1 (2018-03-06)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix misleading error message for octal escapes in template strings.
|
||||||
|
|
||||||
|
## 5.5.0 (2018-02-27)
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
The identifier character categorization is now based on Unicode version 10.
|
||||||
|
|
||||||
|
Acorn will now validate the content of regular expressions, including new ES9 features.
|
||||||
|
|
||||||
|
## 5.4.0 (2018-02-01)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Disallow duplicate or escaped flags on regular expressions.
|
||||||
|
|
||||||
|
Disallow octal escapes in strings in strict mode.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Add support for async iteration.
|
||||||
|
|
||||||
|
Add support for object spread and rest.
|
||||||
|
|
||||||
|
## 5.3.0 (2017-12-28)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix parsing of floating point literals with leading zeroes in loose mode.
|
||||||
|
|
||||||
|
Allow duplicate property names in object patterns.
|
||||||
|
|
||||||
|
Don't allow static class methods named `prototype`.
|
||||||
|
|
||||||
|
Disallow async functions directly under `if` or `else`.
|
||||||
|
|
||||||
|
Parse right-hand-side of `for`/`of` as an assignment expression.
|
||||||
|
|
||||||
|
Stricter parsing of `for`/`in`.
|
||||||
|
|
||||||
|
Don't allow unicode escapes in contextual keywords.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Parsing class members was factored into smaller methods to allow plugins to hook into it.
|
||||||
|
|
||||||
|
## 5.2.1 (2017-10-30)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix a token context corruption bug.
|
||||||
|
|
||||||
|
## 5.2.0 (2017-10-30)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix token context tracking for `class` and `function` in property-name position.
|
||||||
|
|
||||||
|
Make sure `%*` isn't parsed as a valid operator.
|
||||||
|
|
||||||
|
Allow shorthand properties `get` and `set` to be followed by default values.
|
||||||
|
|
||||||
|
Disallow `super` when not in callee or object position.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Support [`directive` property](https://github.com/estree/estree/compare/b3de58c9997504d6fba04b72f76e6dd1619ee4eb...1da8e603237144f44710360f8feb7a9977e905e0) on directive expression statements.
|
||||||
|
|
||||||
|
## 5.1.2 (2017-09-04)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Disable parsing of legacy HTML-style comments in modules.
|
||||||
|
|
||||||
|
Fix parsing of async methods whose names are keywords.
|
||||||
|
|
||||||
|
## 5.1.1 (2017-07-06)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix problem with disambiguating regexp and division after a class.
|
||||||
|
|
||||||
|
## 5.1.0 (2017-07-05)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix tokenizing of regexps in an object-desctructuring `for`/`of` loop and after `yield`.
|
||||||
|
|
||||||
|
Parse zero-prefixed numbers with non-octal digits as decimal.
|
||||||
|
|
||||||
|
Allow object/array patterns in rest parameters.
|
||||||
|
|
||||||
|
Don't error when `yield` is used as a property name.
|
||||||
|
|
||||||
|
Allow `async` as a shorthand object property.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Implement the [template literal revision proposal](https://github.com/tc39/proposal-template-literal-revision) for ES9.
|
||||||
|
|
||||||
|
## 5.0.3 (2017-04-01)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix spurious duplicate variable definition errors for named functions.
|
||||||
|
|
||||||
|
## 5.0.2 (2017-03-30)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
A binary operator after a parenthesized arrow expression is no longer incorrectly treated as an error.
|
||||||
|
|
||||||
|
## 5.0.0 (2017-03-28)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Raise an error for duplicated lexical bindings.
|
||||||
|
|
||||||
|
Fix spurious error when an assignement expression occurred after a spread expression.
|
||||||
|
|
||||||
|
Accept regular expressions after `of` (in `for`/`of`), `yield` (in a generator), and braced arrow functions.
|
||||||
|
|
||||||
|
Allow labels in front or `var` declarations, even in strict mode.
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
Parse declarations following `export default` as declaration nodes, not expressions. This means that class and function declarations nodes can now have `null` as their `id`.
|
||||||
|
|
||||||
|
## 4.0.11 (2017-02-07)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Allow all forms of member expressions to be parenthesized as lvalue.
|
||||||
|
|
||||||
|
## 4.0.10 (2017-02-07)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Don't expect semicolons after default-exported functions or classes, even when they are expressions.
|
||||||
|
|
||||||
|
Check for use of `'use strict'` directives in non-simple parameter functions, even when already in strict mode.
|
||||||
|
|
||||||
|
## 4.0.9 (2017-02-06)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix incorrect error raised for parenthesized simple assignment targets, so that `(x) = 1` parses again.
|
||||||
|
|
||||||
|
## 4.0.8 (2017-02-03)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Solve spurious parenthesized pattern errors by temporarily erring on the side of accepting programs that our delayed errors don't handle correctly yet.
|
||||||
|
|
||||||
|
## 4.0.7 (2017-02-02)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Accept invalidly rejected code like `(x).y = 2` again.
|
||||||
|
|
||||||
|
Don't raise an error when a function _inside_ strict code has a non-simple parameter list.
|
||||||
|
|
||||||
|
## 4.0.6 (2017-02-02)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix exponential behavior (manifesting itself as a complete hang for even relatively small source files) introduced by the new 'use strict' check.
|
||||||
|
|
||||||
|
## 4.0.5 (2017-02-02)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Disallow parenthesized pattern expressions.
|
||||||
|
|
||||||
|
Allow keywords as export names.
|
||||||
|
|
||||||
|
Don't allow the `async` keyword to be parenthesized.
|
||||||
|
|
||||||
|
Properly raise an error when a keyword contains a character escape.
|
||||||
|
|
||||||
|
Allow `"use strict"` to appear after other string literal expressions.
|
||||||
|
|
||||||
|
Disallow labeled declarations.
|
||||||
|
|
||||||
|
## 4.0.4 (2016-12-19)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix crash when `export` was followed by a keyword that can't be
|
||||||
|
exported.
|
||||||
|
|
||||||
|
## 4.0.3 (2016-08-16)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Allow regular function declarations inside single-statement `if` branches in loose mode. Forbid them entirely in strict mode.
|
||||||
|
|
||||||
|
Properly parse properties named `async` in ES2017 mode.
|
||||||
|
|
||||||
|
Fix bug where reserved words were broken in ES2017 mode.
|
||||||
|
|
||||||
|
## 4.0.2 (2016-08-11)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Don't ignore period or 'e' characters after octal numbers.
|
||||||
|
|
||||||
|
Fix broken parsing for call expressions in default parameter values of arrow functions.
|
||||||
|
|
||||||
|
## 4.0.1 (2016-08-08)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix false positives in duplicated export name errors.
|
||||||
|
|
||||||
|
## 4.0.0 (2016-08-07)
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
The default `ecmaVersion` option value is now 7.
|
||||||
|
|
||||||
|
A number of internal method signatures changed, so plugins might need to be updated.
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
The parser now raises errors on duplicated export names.
|
||||||
|
|
||||||
|
`arguments` and `eval` can now be used in shorthand properties.
|
||||||
|
|
||||||
|
Duplicate parameter names in non-simple argument lists now always produce an error.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
The `ecmaVersion` option now also accepts year-style version numbers
|
||||||
|
(2015, etc).
|
||||||
|
|
||||||
|
Support for `async`/`await` syntax when `ecmaVersion` is >= 8.
|
||||||
|
|
||||||
|
Support for trailing commas in call expressions when `ecmaVersion` is >= 8.
|
||||||
|
|
||||||
|
## 3.3.0 (2016-07-25)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Fix bug in tokenizing of regexp operator after a function declaration.
|
||||||
|
|
||||||
|
Fix parser crash when parsing an array pattern with a hole.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Implement check against complex argument lists in functions that enable strict mode in ES7.
|
||||||
|
|
||||||
|
## 3.2.0 (2016-06-07)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Improve handling of lack of unicode regexp support in host
|
||||||
|
environment.
|
||||||
|
|
||||||
|
Properly reject shorthand properties whose name is a keyword.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Visitors created with `visit.make` now have their base as _prototype_, rather than copying properties into a fresh object.
|
||||||
|
|
||||||
|
## 3.1.0 (2016-04-18)
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
Properly tokenize the division operator directly after a function expression.
|
||||||
|
|
||||||
|
Allow trailing comma in destructuring arrays.
|
||||||
|
|
||||||
|
## 3.0.4 (2016-02-25)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
Allow update expressions as left-hand-side of the ES7 exponential operator.
|
||||||
|
|
||||||
|
## 3.0.2 (2016-02-10)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
Fix bug that accidentally made `undefined` a reserved word when parsing ES7.
|
||||||
|
|
||||||
|
## 3.0.0 (2016-02-10)
|
||||||
|
|
||||||
|
### Breaking changes
|
||||||
|
|
||||||
|
The default value of the `ecmaVersion` option is now 6 (used to be 5).
|
||||||
|
|
||||||
|
Support for comprehension syntax (which was dropped from the draft spec) has been removed.
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
`let` and `yield` are now “contextual keywords”, meaning you can mostly use them as identifiers in ES5 non-strict code.
|
||||||
|
|
||||||
|
A parenthesized class or function expression after `export default` is now parsed correctly.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
When `ecmaVersion` is set to 7, Acorn will parse the exponentiation operator (`**`).
|
||||||
|
|
||||||
|
The identifier character ranges are now based on Unicode 8.0.0.
|
||||||
|
|
||||||
|
Plugins can now override the `raiseRecoverable` method to override the way non-critical errors are handled.
|
||||||
|
|
||||||
|
## 2.7.0 (2016-01-04)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
Stop allowing rest parameters in setters.
|
||||||
|
|
||||||
|
Disallow `y` rexexp flag in ES5.
|
||||||
|
|
||||||
|
Disallow `\00` and `\000` escapes in strict mode.
|
||||||
|
|
||||||
|
Raise an error when an import name is a reserved word.
|
||||||
|
|
||||||
|
## 2.6.2 (2015-11-10)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
Don't crash when no options object is passed.
|
||||||
|
|
||||||
|
## 2.6.0 (2015-11-09)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
Add `await` as a reserved word in module sources.
|
||||||
|
|
||||||
|
Disallow `yield` in a parameter default value for a generator.
|
||||||
|
|
||||||
|
Forbid using a comma after a rest pattern in an array destructuring.
|
||||||
|
|
||||||
|
### New features
|
||||||
|
|
||||||
|
Support parsing stdin in command-line tool.
|
||||||
|
|
||||||
|
## 2.5.0 (2015-10-27)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
Fix tokenizer support in the command-line tool.
|
||||||
|
|
||||||
|
Stop allowing `new.target` outside of functions.
|
||||||
|
|
||||||
|
Remove legacy `guard` and `guardedHandler` properties from try nodes.
|
||||||
|
|
||||||
|
Stop allowing multiple `__proto__` properties on an object literal in strict mode.
|
||||||
|
|
||||||
|
Don't allow rest parameters to be non-identifier patterns.
|
||||||
|
|
||||||
|
Check for duplicate paramter names in arrow functions.
|
21
node_modules/acorn/LICENSE
generated
vendored
Normal file
21
node_modules/acorn/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (C) 2012-2022 by various contributors (see AUTHORS)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
273
node_modules/acorn/README.md
generated
vendored
Normal file
273
node_modules/acorn/README.md
generated
vendored
Normal file
|
@ -0,0 +1,273 @@
|
||||||
|
# Acorn
|
||||||
|
|
||||||
|
A tiny, fast JavaScript parser written in JavaScript.
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
Acorn is open source software released under an
|
||||||
|
[MIT license](https://github.com/acornjs/acorn/blob/master/acorn/LICENSE).
|
||||||
|
|
||||||
|
You are welcome to
|
||||||
|
[report bugs](https://github.com/acornjs/acorn/issues) or create pull
|
||||||
|
requests on [github](https://github.com/acornjs/acorn). For questions
|
||||||
|
and discussion, please use the
|
||||||
|
[Tern discussion forum](https://discuss.ternjs.net).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
The easiest way to install acorn is from [`npm`](https://www.npmjs.com/):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install acorn
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternately, you can download the source and build acorn yourself:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/acornjs/acorn.git
|
||||||
|
cd acorn
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Interface
|
||||||
|
|
||||||
|
**parse**`(input, options)` is the main interface to the library. The
|
||||||
|
`input` parameter is a string, `options` must be an object setting
|
||||||
|
some of the options listed below. The return value will be an abstract
|
||||||
|
syntax tree object as specified by the [ESTree
|
||||||
|
spec](https://github.com/estree/estree).
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
let acorn = require("acorn");
|
||||||
|
console.log(acorn.parse("1 + 1", {ecmaVersion: 2020}));
|
||||||
|
```
|
||||||
|
|
||||||
|
When encountering a syntax error, the parser will raise a
|
||||||
|
`SyntaxError` object with a meaningful message. The error object will
|
||||||
|
have a `pos` property that indicates the string offset at which the
|
||||||
|
error occurred, and a `loc` object that contains a `{line, column}`
|
||||||
|
object referring to that same position.
|
||||||
|
|
||||||
|
Options are provided by in a second argument, which should be an
|
||||||
|
object containing any of these fields (only `ecmaVersion` is
|
||||||
|
required):
|
||||||
|
|
||||||
|
- **ecmaVersion**: Indicates the ECMAScript version to parse. Must be
|
||||||
|
either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 (2019),
|
||||||
|
11 (2020), 12 (2021), 13 (2022, partial support)
|
||||||
|
or `"latest"` (the latest the library supports). This influences
|
||||||
|
support for strict mode, the set of reserved words, and support
|
||||||
|
for new syntax features.
|
||||||
|
|
||||||
|
**NOTE**: Only 'stage 4' (finalized) ECMAScript features are being
|
||||||
|
implemented by Acorn. Other proposed new features must be
|
||||||
|
implemented through plugins.
|
||||||
|
|
||||||
|
- **sourceType**: Indicate the mode the code should be parsed in. Can be
|
||||||
|
either `"script"` or `"module"`. This influences global strict mode
|
||||||
|
and parsing of `import` and `export` declarations.
|
||||||
|
|
||||||
|
**NOTE**: If set to `"module"`, then static `import` / `export` syntax
|
||||||
|
will be valid, even if `ecmaVersion` is less than 6.
|
||||||
|
|
||||||
|
- **onInsertedSemicolon**: If given a callback, that callback will be
|
||||||
|
called whenever a missing semicolon is inserted by the parser. The
|
||||||
|
callback will be given the character offset of the point where the
|
||||||
|
semicolon is inserted as argument, and if `locations` is on, also a
|
||||||
|
`{line, column}` object representing this position.
|
||||||
|
|
||||||
|
- **onTrailingComma**: Like `onInsertedSemicolon`, but for trailing
|
||||||
|
commas.
|
||||||
|
|
||||||
|
- **allowReserved**: If `false`, using a reserved word will generate
|
||||||
|
an error. Defaults to `true` for `ecmaVersion` 3, `false` for higher
|
||||||
|
versions. When given the value `"never"`, reserved words and
|
||||||
|
keywords can also not be used as property names (as in Internet
|
||||||
|
Explorer's old parser).
|
||||||
|
|
||||||
|
- **allowReturnOutsideFunction**: By default, a return statement at
|
||||||
|
the top level raises an error. Set this to `true` to accept such
|
||||||
|
code.
|
||||||
|
|
||||||
|
- **allowImportExportEverywhere**: By default, `import` and `export`
|
||||||
|
declarations can only appear at a program's top level. Setting this
|
||||||
|
option to `true` allows them anywhere where a statement is allowed,
|
||||||
|
and also allows `import.meta` expressions to appear in scripts
|
||||||
|
(when `sourceType` is not `"module"`).
|
||||||
|
|
||||||
|
- **allowAwaitOutsideFunction**: If `false`, `await` expressions can
|
||||||
|
only appear inside `async` functions. Defaults to `true` for
|
||||||
|
`ecmaVersion` 2022 and later, `false` for lower versions. Setting this option to
|
||||||
|
`true` allows to have top-level `await` expressions. They are
|
||||||
|
still not allowed in non-`async` functions, though.
|
||||||
|
|
||||||
|
- **allowSuperOutsideMethod**: By default, `super` outside a method
|
||||||
|
raises an error. Set this to `true` to accept such code.
|
||||||
|
|
||||||
|
- **allowHashBang**: When this is enabled (off by default), if the
|
||||||
|
code starts with the characters `#!` (as in a shellscript), the
|
||||||
|
first line will be treated as a comment.
|
||||||
|
|
||||||
|
- **locations**: When `true`, each node has a `loc` object attached
|
||||||
|
with `start` and `end` subobjects, each of which contains the
|
||||||
|
one-based line and zero-based column numbers in `{line, column}`
|
||||||
|
form. Default is `false`.
|
||||||
|
|
||||||
|
- **onToken**: If a function is passed for this option, each found
|
||||||
|
token will be passed in same format as tokens returned from
|
||||||
|
`tokenizer().getToken()`.
|
||||||
|
|
||||||
|
If array is passed, each found token is pushed to it.
|
||||||
|
|
||||||
|
Note that you are not allowed to call the parser from the
|
||||||
|
callback—that will corrupt its internal state.
|
||||||
|
|
||||||
|
- **onComment**: If a function is passed for this option, whenever a
|
||||||
|
comment is encountered the function will be called with the
|
||||||
|
following parameters:
|
||||||
|
|
||||||
|
- `block`: `true` if the comment is a block comment, false if it
|
||||||
|
is a line comment.
|
||||||
|
- `text`: The content of the comment.
|
||||||
|
- `start`: Character offset of the start of the comment.
|
||||||
|
- `end`: Character offset of the end of the comment.
|
||||||
|
|
||||||
|
When the `locations` options is on, the `{line, column}` locations
|
||||||
|
of the comment’s start and end are passed as two additional
|
||||||
|
parameters.
|
||||||
|
|
||||||
|
If array is passed for this option, each found comment is pushed
|
||||||
|
to it as object in Esprima format:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
"type": "Line" | "Block",
|
||||||
|
"value": "comment text",
|
||||||
|
"start": Number,
|
||||||
|
"end": Number,
|
||||||
|
// If `locations` option is on:
|
||||||
|
"loc": {
|
||||||
|
"start": {line: Number, column: Number}
|
||||||
|
"end": {line: Number, column: Number}
|
||||||
|
},
|
||||||
|
// If `ranges` option is on:
|
||||||
|
"range": [Number, Number]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that you are not allowed to call the parser from the
|
||||||
|
callback—that will corrupt its internal state.
|
||||||
|
|
||||||
|
- **ranges**: Nodes have their start and end characters offsets
|
||||||
|
recorded in `start` and `end` properties (directly on the node,
|
||||||
|
rather than the `loc` object, which holds line/column data. To also
|
||||||
|
add a
|
||||||
|
[semi-standardized](https://bugzilla.mozilla.org/show_bug.cgi?id=745678)
|
||||||
|
`range` property holding a `[start, end]` array with the same
|
||||||
|
numbers, set the `ranges` option to `true`.
|
||||||
|
|
||||||
|
- **program**: It is possible to parse multiple files into a single
|
||||||
|
AST by passing the tree produced by parsing the first file as the
|
||||||
|
`program` option in subsequent parses. This will add the toplevel
|
||||||
|
forms of the parsed file to the "Program" (top) node of an existing
|
||||||
|
parse tree.
|
||||||
|
|
||||||
|
- **sourceFile**: When the `locations` option is `true`, you can pass
|
||||||
|
this option to add a `source` attribute in every node’s `loc`
|
||||||
|
object. Note that the contents of this option are not examined or
|
||||||
|
processed in any way; you are free to use whatever format you
|
||||||
|
choose.
|
||||||
|
|
||||||
|
- **directSourceFile**: Like `sourceFile`, but a `sourceFile` property
|
||||||
|
will be added (regardless of the `location` option) directly to the
|
||||||
|
nodes, rather than the `loc` object.
|
||||||
|
|
||||||
|
- **preserveParens**: If this option is `true`, parenthesized expressions
|
||||||
|
are represented by (non-standard) `ParenthesizedExpression` nodes
|
||||||
|
that have a single `expression` property containing the expression
|
||||||
|
inside parentheses.
|
||||||
|
|
||||||
|
**parseExpressionAt**`(input, offset, options)` will parse a single
|
||||||
|
expression in a string, and return its AST. It will not complain if
|
||||||
|
there is more of the string left after the expression.
|
||||||
|
|
||||||
|
**tokenizer**`(input, options)` returns an object with a `getToken`
|
||||||
|
method that can be called repeatedly to get the next token, a `{start,
|
||||||
|
end, type, value}` object (with added `loc` property when the
|
||||||
|
`locations` option is enabled and `range` property when the `ranges`
|
||||||
|
option is enabled). When the token's type is `tokTypes.eof`, you
|
||||||
|
should stop calling the method, since it will keep returning that same
|
||||||
|
token forever.
|
||||||
|
|
||||||
|
In ES6 environment, returned result can be used as any other
|
||||||
|
protocol-compliant iterable:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
for (let token of acorn.tokenizer(str)) {
|
||||||
|
// iterate over the tokens
|
||||||
|
}
|
||||||
|
|
||||||
|
// transform code to array of tokens:
|
||||||
|
var tokens = [...acorn.tokenizer(str)];
|
||||||
|
```
|
||||||
|
|
||||||
|
**tokTypes** holds an object mapping names to the token type objects
|
||||||
|
that end up in the `type` properties of tokens.
|
||||||
|
|
||||||
|
**getLineInfo**`(input, offset)` can be used to get a `{line,
|
||||||
|
column}` object for a given program string and offset.
|
||||||
|
|
||||||
|
### The `Parser` class
|
||||||
|
|
||||||
|
Instances of the **`Parser`** class contain all the state and logic
|
||||||
|
that drives a parse. It has static methods `parse`,
|
||||||
|
`parseExpressionAt`, and `tokenizer` that match the top-level
|
||||||
|
functions by the same name.
|
||||||
|
|
||||||
|
When extending the parser with plugins, you need to call these methods
|
||||||
|
on the extended version of the class. To extend a parser with plugins,
|
||||||
|
you can use its static `extend` method.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var acorn = require("acorn");
|
||||||
|
var jsx = require("acorn-jsx");
|
||||||
|
var JSXParser = acorn.Parser.extend(jsx());
|
||||||
|
JSXParser.parse("foo(<bar/>)", {ecmaVersion: 2020});
|
||||||
|
```
|
||||||
|
|
||||||
|
The `extend` method takes any number of plugin values, and returns a
|
||||||
|
new `Parser` class that includes the extra parser logic provided by
|
||||||
|
the plugins.
|
||||||
|
|
||||||
|
## Command line interface
|
||||||
|
|
||||||
|
The `bin/acorn` utility can be used to parse a file from the command
|
||||||
|
line. It accepts as arguments its input file and the following
|
||||||
|
options:
|
||||||
|
|
||||||
|
- `--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|--ecma10`: Sets the ECMAScript version
|
||||||
|
to parse. Default is version 9.
|
||||||
|
|
||||||
|
- `--module`: Sets the parsing mode to `"module"`. Is set to `"script"` otherwise.
|
||||||
|
|
||||||
|
- `--locations`: Attaches a "loc" object to each node with "start" and
|
||||||
|
"end" subobjects, each of which contains the one-based line and
|
||||||
|
zero-based column numbers in `{line, column}` form.
|
||||||
|
|
||||||
|
- `--allow-hash-bang`: If the code starts with the characters #! (as
|
||||||
|
in a shellscript), the first line will be treated as a comment.
|
||||||
|
|
||||||
|
- `--allow-await-outside-function`: Allows top-level `await` expressions.
|
||||||
|
See the `allowAwaitOutsideFunction` option for more information.
|
||||||
|
|
||||||
|
- `--compact`: No whitespace is used in the AST output.
|
||||||
|
|
||||||
|
- `--silent`: Do not output the AST, just return the exit status.
|
||||||
|
|
||||||
|
- `--help`: Print the usage information and quit.
|
||||||
|
|
||||||
|
The utility spits out the syntax tree as JSON data.
|
||||||
|
|
||||||
|
## Existing plugins
|
||||||
|
|
||||||
|
- [`acorn-jsx`](https://github.com/RReverser/acorn-jsx): Parse [Facebook JSX syntax extensions](https://github.com/facebook/jsx)
|
4
node_modules/acorn/bin/acorn
generated
vendored
Executable file
4
node_modules/acorn/bin/acorn
generated
vendored
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
"use strict"
|
||||||
|
|
||||||
|
require("../dist/bin.js")
|
252
node_modules/acorn/dist/acorn.d.ts
generated
vendored
Normal file
252
node_modules/acorn/dist/acorn.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,252 @@
|
||||||
|
export as namespace acorn
|
||||||
|
export = acorn
|
||||||
|
|
||||||
|
declare namespace acorn {
|
||||||
|
function parse(input: string, options: Options): Node
|
||||||
|
|
||||||
|
function parseExpressionAt(input: string, pos: number, options: Options): Node
|
||||||
|
|
||||||
|
function tokenizer(input: string, options: Options): {
|
||||||
|
getToken(): Token
|
||||||
|
[Symbol.iterator](): Iterator<Token>
|
||||||
|
}
|
||||||
|
|
||||||
|
type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 'latest'
|
||||||
|
|
||||||
|
interface Options {
|
||||||
|
ecmaVersion: ecmaVersion
|
||||||
|
sourceType?: 'script' | 'module'
|
||||||
|
onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
|
||||||
|
onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
|
||||||
|
allowReserved?: boolean | 'never'
|
||||||
|
allowReturnOutsideFunction?: boolean
|
||||||
|
allowImportExportEverywhere?: boolean
|
||||||
|
allowAwaitOutsideFunction?: boolean
|
||||||
|
allowSuperOutsideMethod?: boolean
|
||||||
|
allowHashBang?: boolean
|
||||||
|
locations?: boolean
|
||||||
|
onToken?: ((token: Token) => any) | Token[]
|
||||||
|
onComment?: ((
|
||||||
|
isBlock: boolean, text: string, start: number, end: number, startLoc?: Position,
|
||||||
|
endLoc?: Position
|
||||||
|
) => void) | Comment[]
|
||||||
|
ranges?: boolean
|
||||||
|
program?: Node
|
||||||
|
sourceFile?: string
|
||||||
|
directSourceFile?: string
|
||||||
|
preserveParens?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
class Parser {
|
||||||
|
// state.js
|
||||||
|
lineStart: number;
|
||||||
|
options: Options;
|
||||||
|
curLine: number;
|
||||||
|
start: number;
|
||||||
|
end: number;
|
||||||
|
input: string;
|
||||||
|
type: TokenType;
|
||||||
|
|
||||||
|
// state.js
|
||||||
|
constructor(options: Options, input: string, startPos?: number)
|
||||||
|
parse(this: Parser): Node
|
||||||
|
|
||||||
|
// tokenize.js
|
||||||
|
next(): void;
|
||||||
|
nextToken(): void;
|
||||||
|
|
||||||
|
// statement.js
|
||||||
|
parseTopLevel(node: Node): Node;
|
||||||
|
|
||||||
|
// node.js
|
||||||
|
finishNode(node: Node, type: string): Node;
|
||||||
|
finishNodeAt(node: Node, type: string, pos: number, loc: Position): Node;
|
||||||
|
|
||||||
|
// location.js
|
||||||
|
raise(pos: number, message: string) : void;
|
||||||
|
raiseRecoverable?(pos: number, message: string) : void;
|
||||||
|
|
||||||
|
// parseutils.js
|
||||||
|
unexpected(pos: number) : void;
|
||||||
|
|
||||||
|
// index.js
|
||||||
|
static acorn: typeof acorn;
|
||||||
|
|
||||||
|
// state.js
|
||||||
|
static parse(this: typeof Parser, input: string, options: Options): Node
|
||||||
|
static parseExpressionAt(this: typeof Parser, input: string, pos: number, options: Options): Node
|
||||||
|
static tokenizer(this: typeof Parser, input: string, options: Options): {
|
||||||
|
getToken(): Token
|
||||||
|
[Symbol.iterator](): Iterator<Token>
|
||||||
|
}
|
||||||
|
static extend(this: typeof Parser, ...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Position { line: number; column: number; offset: number }
|
||||||
|
|
||||||
|
const defaultOptions: Options
|
||||||
|
|
||||||
|
function getLineInfo(input: string, offset: number): Position
|
||||||
|
|
||||||
|
class SourceLocation {
|
||||||
|
start: Position
|
||||||
|
end: Position
|
||||||
|
source?: string | null
|
||||||
|
constructor(p: Parser, start: Position, end: Position)
|
||||||
|
}
|
||||||
|
|
||||||
|
class Node {
|
||||||
|
type: string
|
||||||
|
start: number
|
||||||
|
end: number
|
||||||
|
loc?: SourceLocation
|
||||||
|
sourceFile?: string
|
||||||
|
range?: [number, number]
|
||||||
|
constructor(parser: Parser, pos: number, loc?: SourceLocation)
|
||||||
|
}
|
||||||
|
|
||||||
|
class TokenType {
|
||||||
|
label: string
|
||||||
|
keyword: string
|
||||||
|
beforeExpr: boolean
|
||||||
|
startsExpr: boolean
|
||||||
|
isLoop: boolean
|
||||||
|
isAssign: boolean
|
||||||
|
prefix: boolean
|
||||||
|
postfix: boolean
|
||||||
|
binop: number
|
||||||
|
updateContext?: (prevType: TokenType) => void
|
||||||
|
constructor(label: string, conf?: any)
|
||||||
|
}
|
||||||
|
|
||||||
|
const tokTypes: {
|
||||||
|
num: TokenType
|
||||||
|
regexp: TokenType
|
||||||
|
string: TokenType
|
||||||
|
name: TokenType
|
||||||
|
privateId: TokenType
|
||||||
|
eof: TokenType
|
||||||
|
bracketL: TokenType
|
||||||
|
bracketR: TokenType
|
||||||
|
braceL: TokenType
|
||||||
|
braceR: TokenType
|
||||||
|
parenL: TokenType
|
||||||
|
parenR: TokenType
|
||||||
|
comma: TokenType
|
||||||
|
semi: TokenType
|
||||||
|
colon: TokenType
|
||||||
|
dot: TokenType
|
||||||
|
question: TokenType
|
||||||
|
questionDot: TokenType
|
||||||
|
arrow: TokenType
|
||||||
|
template: TokenType
|
||||||
|
invalidTemplate: TokenType
|
||||||
|
ellipsis: TokenType
|
||||||
|
backQuote: TokenType
|
||||||
|
dollarBraceL: TokenType
|
||||||
|
eq: TokenType
|
||||||
|
assign: TokenType
|
||||||
|
incDec: TokenType
|
||||||
|
prefix: TokenType
|
||||||
|
logicalOR: TokenType
|
||||||
|
logicalAND: TokenType
|
||||||
|
bitwiseOR: TokenType
|
||||||
|
bitwiseXOR: TokenType
|
||||||
|
bitwiseAND: TokenType
|
||||||
|
equality: TokenType
|
||||||
|
relational: TokenType
|
||||||
|
bitShift: TokenType
|
||||||
|
plusMin: TokenType
|
||||||
|
modulo: TokenType
|
||||||
|
star: TokenType
|
||||||
|
slash: TokenType
|
||||||
|
starstar: TokenType
|
||||||
|
coalesce: TokenType
|
||||||
|
_break: TokenType
|
||||||
|
_case: TokenType
|
||||||
|
_catch: TokenType
|
||||||
|
_continue: TokenType
|
||||||
|
_debugger: TokenType
|
||||||
|
_default: TokenType
|
||||||
|
_do: TokenType
|
||||||
|
_else: TokenType
|
||||||
|
_finally: TokenType
|
||||||
|
_for: TokenType
|
||||||
|
_function: TokenType
|
||||||
|
_if: TokenType
|
||||||
|
_return: TokenType
|
||||||
|
_switch: TokenType
|
||||||
|
_throw: TokenType
|
||||||
|
_try: TokenType
|
||||||
|
_var: TokenType
|
||||||
|
_const: TokenType
|
||||||
|
_while: TokenType
|
||||||
|
_with: TokenType
|
||||||
|
_new: TokenType
|
||||||
|
_this: TokenType
|
||||||
|
_super: TokenType
|
||||||
|
_class: TokenType
|
||||||
|
_extends: TokenType
|
||||||
|
_export: TokenType
|
||||||
|
_import: TokenType
|
||||||
|
_null: TokenType
|
||||||
|
_true: TokenType
|
||||||
|
_false: TokenType
|
||||||
|
_in: TokenType
|
||||||
|
_instanceof: TokenType
|
||||||
|
_typeof: TokenType
|
||||||
|
_void: TokenType
|
||||||
|
_delete: TokenType
|
||||||
|
}
|
||||||
|
|
||||||
|
class TokContext {
|
||||||
|
constructor(token: string, isExpr: boolean, preserveSpace: boolean, override?: (p: Parser) => void)
|
||||||
|
}
|
||||||
|
|
||||||
|
const tokContexts: {
|
||||||
|
b_stat: TokContext
|
||||||
|
b_expr: TokContext
|
||||||
|
b_tmpl: TokContext
|
||||||
|
p_stat: TokContext
|
||||||
|
p_expr: TokContext
|
||||||
|
q_tmpl: TokContext
|
||||||
|
f_expr: TokContext
|
||||||
|
f_stat: TokContext
|
||||||
|
f_expr_gen: TokContext
|
||||||
|
f_gen: TokContext
|
||||||
|
}
|
||||||
|
|
||||||
|
function isIdentifierStart(code: number, astral?: boolean): boolean
|
||||||
|
|
||||||
|
function isIdentifierChar(code: number, astral?: boolean): boolean
|
||||||
|
|
||||||
|
interface AbstractToken {
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Comment extends AbstractToken {
|
||||||
|
type: string
|
||||||
|
value: string
|
||||||
|
start: number
|
||||||
|
end: number
|
||||||
|
loc?: SourceLocation
|
||||||
|
range?: [number, number]
|
||||||
|
}
|
||||||
|
|
||||||
|
class Token {
|
||||||
|
type: TokenType
|
||||||
|
value: any
|
||||||
|
start: number
|
||||||
|
end: number
|
||||||
|
loc?: SourceLocation
|
||||||
|
range?: [number, number]
|
||||||
|
constructor(p: Parser)
|
||||||
|
}
|
||||||
|
|
||||||
|
function isNewLine(code: number): boolean
|
||||||
|
|
||||||
|
const lineBreak: RegExp
|
||||||
|
|
||||||
|
const lineBreakG: RegExp
|
||||||
|
|
||||||
|
const version: string
|
||||||
|
}
|
5608
node_modules/acorn/dist/acorn.js
generated
vendored
Normal file
5608
node_modules/acorn/dist/acorn.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
5577
node_modules/acorn/dist/acorn.mjs
generated
vendored
Normal file
5577
node_modules/acorn/dist/acorn.mjs
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
2
node_modules/acorn/dist/acorn.mjs.d.ts
generated
vendored
Normal file
2
node_modules/acorn/dist/acorn.mjs.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
import * as acorn from "./acorn";
|
||||||
|
export = acorn;
|
91
node_modules/acorn/dist/bin.js
generated
vendored
Normal file
91
node_modules/acorn/dist/bin.js
generated
vendored
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
var acorn = require('./acorn.js');
|
||||||
|
|
||||||
|
function _interopNamespace(e) {
|
||||||
|
if (e && e.__esModule) return e;
|
||||||
|
var n = Object.create(null);
|
||||||
|
if (e) {
|
||||||
|
Object.keys(e).forEach(function (k) {
|
||||||
|
if (k !== 'default') {
|
||||||
|
var d = Object.getOwnPropertyDescriptor(e, k);
|
||||||
|
Object.defineProperty(n, k, d.get ? d : {
|
||||||
|
enumerable: true,
|
||||||
|
get: function () { return e[k]; }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
n["default"] = e;
|
||||||
|
return Object.freeze(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
var acorn__namespace = /*#__PURE__*/_interopNamespace(acorn);
|
||||||
|
|
||||||
|
var inputFilePaths = [], forceFileName = false, fileMode = false, silent = false, compact = false, tokenize = false;
|
||||||
|
var options = {};
|
||||||
|
|
||||||
|
function help(status) {
|
||||||
|
var print = (status === 0) ? console.log : console.error;
|
||||||
|
print("usage: " + path.basename(process.argv[1]) + " [--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|...|--ecma2015|--ecma2016|--ecma2017|--ecma2018|...]");
|
||||||
|
print(" [--tokenize] [--locations] [--allow-hash-bang] [--allow-await-outside-function] [--compact] [--silent] [--module] [--help] [--] [<infile>...]");
|
||||||
|
process.exit(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 2; i < process.argv.length; ++i) {
|
||||||
|
var arg = process.argv[i];
|
||||||
|
if (arg[0] !== "-" || arg === "-") { inputFilePaths.push(arg); }
|
||||||
|
else if (arg === "--") {
|
||||||
|
inputFilePaths.push.apply(inputFilePaths, process.argv.slice(i + 1));
|
||||||
|
forceFileName = true;
|
||||||
|
break
|
||||||
|
} else if (arg === "--locations") { options.locations = true; }
|
||||||
|
else if (arg === "--allow-hash-bang") { options.allowHashBang = true; }
|
||||||
|
else if (arg === "--allow-await-outside-function") { options.allowAwaitOutsideFunction = true; }
|
||||||
|
else if (arg === "--silent") { silent = true; }
|
||||||
|
else if (arg === "--compact") { compact = true; }
|
||||||
|
else if (arg === "--help") { help(0); }
|
||||||
|
else if (arg === "--tokenize") { tokenize = true; }
|
||||||
|
else if (arg === "--module") { options.sourceType = "module"; }
|
||||||
|
else {
|
||||||
|
var match = arg.match(/^--ecma(\d+)$/);
|
||||||
|
if (match)
|
||||||
|
{ options.ecmaVersion = +match[1]; }
|
||||||
|
else
|
||||||
|
{ help(1); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function run(codeList) {
|
||||||
|
var result = [], fileIdx = 0;
|
||||||
|
try {
|
||||||
|
codeList.forEach(function (code, idx) {
|
||||||
|
fileIdx = idx;
|
||||||
|
if (!tokenize) {
|
||||||
|
result = acorn__namespace.parse(code, options);
|
||||||
|
options.program = result;
|
||||||
|
} else {
|
||||||
|
var tokenizer = acorn__namespace.tokenizer(code, options), token;
|
||||||
|
do {
|
||||||
|
token = tokenizer.getToken();
|
||||||
|
result.push(token);
|
||||||
|
} while (token.type !== acorn__namespace.tokTypes.eof)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(fileMode ? e.message.replace(/\(\d+:\d+\)$/, function (m) { return m.slice(0, 1) + inputFilePaths[fileIdx] + " " + m.slice(1); }) : e.message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
if (!silent) { console.log(JSON.stringify(result, null, compact ? null : 2)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileMode = inputFilePaths.length && (forceFileName || !inputFilePaths.includes("-") || inputFilePaths.length !== 1)) {
|
||||||
|
run(inputFilePaths.map(function (path) { return fs.readFileSync(path, "utf8"); }));
|
||||||
|
} else {
|
||||||
|
var code = "";
|
||||||
|
process.stdin.resume();
|
||||||
|
process.stdin.on("data", function (chunk) { return code += chunk; });
|
||||||
|
process.stdin.on("end", function () { return run([code]); });
|
||||||
|
}
|
50
node_modules/acorn/package.json
generated
vendored
Normal file
50
node_modules/acorn/package.json
generated
vendored
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{
|
||||||
|
"name": "acorn",
|
||||||
|
"description": "ECMAScript parser",
|
||||||
|
"homepage": "https://github.com/acornjs/acorn",
|
||||||
|
"main": "dist/acorn.js",
|
||||||
|
"types": "dist/acorn.d.ts",
|
||||||
|
"module": "dist/acorn.mjs",
|
||||||
|
"exports": {
|
||||||
|
".": [
|
||||||
|
{
|
||||||
|
"import": "./dist/acorn.mjs",
|
||||||
|
"require": "./dist/acorn.js",
|
||||||
|
"default": "./dist/acorn.js"
|
||||||
|
},
|
||||||
|
"./dist/acorn.js"
|
||||||
|
],
|
||||||
|
"./package.json": "./package.json"
|
||||||
|
},
|
||||||
|
"version": "8.7.1",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
},
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "Marijn Haverbeke",
|
||||||
|
"email": "marijnh@gmail.com",
|
||||||
|
"web": "https://marijnhaverbeke.nl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ingvar Stepanyan",
|
||||||
|
"email": "me@rreverser.com",
|
||||||
|
"web": "https://rreverser.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Adrian Heine",
|
||||||
|
"web": "http://adrianheine.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/acornjs/acorn.git"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"prepare": "cd ..; npm run build:main"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"acorn": "./bin/acorn"
|
||||||
|
}
|
||||||
|
}
|
20
node_modules/ajv/.tonic_example.js
generated
vendored
Normal file
20
node_modules/ajv/.tonic_example.js
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
var Ajv = require('ajv');
|
||||||
|
var ajv = new Ajv({allErrors: true});
|
||||||
|
|
||||||
|
var schema = {
|
||||||
|
"properties": {
|
||||||
|
"foo": { "type": "string" },
|
||||||
|
"bar": { "type": "number", "maximum": 3 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var validate = ajv.compile(schema);
|
||||||
|
|
||||||
|
test({"foo": "abc", "bar": 2});
|
||||||
|
test({"foo": 2, "bar": 4});
|
||||||
|
|
||||||
|
function test(data) {
|
||||||
|
var valid = validate(data);
|
||||||
|
if (valid) console.log('Valid!');
|
||||||
|
else console.log('Invalid: ' + ajv.errorsText(validate.errors));
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue