mirror of
https://github.com/idanoo/GoScrobble
synced 2025-07-01 13:42:20 +00:00
0.2.0 - Mid migration
This commit is contained in:
parent
139e6a915e
commit
7e38fdbd7d
42393 changed files with 5358157 additions and 62 deletions
156
web/node_modules/react-dev-utils/FileSizeReporter.js
generated
vendored
Normal file
156
web/node_modules/react-dev-utils/FileSizeReporter.js
generated
vendored
Normal file
|
@ -0,0 +1,156 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var chalk = require('chalk');
|
||||
var filesize = require('filesize');
|
||||
var recursive = require('recursive-readdir');
|
||||
var stripAnsi = require('strip-ansi');
|
||||
var gzipSize = require('gzip-size').sync;
|
||||
|
||||
function canReadAsset(asset) {
|
||||
return (
|
||||
/\.(js|css)$/.test(asset) &&
|
||||
!/service-worker\.js/.test(asset) &&
|
||||
!/precache-manifest\.[0-9a-f]+\.js/.test(asset)
|
||||
);
|
||||
}
|
||||
|
||||
// Prints a detailed summary of build files.
|
||||
function printFileSizesAfterBuild(
|
||||
webpackStats,
|
||||
previousSizeMap,
|
||||
buildFolder,
|
||||
maxBundleGzipSize,
|
||||
maxChunkGzipSize
|
||||
) {
|
||||
var root = previousSizeMap.root;
|
||||
var sizes = previousSizeMap.sizes;
|
||||
var assets = (webpackStats.stats || [webpackStats])
|
||||
.map(stats =>
|
||||
stats
|
||||
.toJson({ all: false, assets: true })
|
||||
.assets.filter(asset => canReadAsset(asset.name))
|
||||
.map(asset => {
|
||||
var fileContents = fs.readFileSync(path.join(root, asset.name));
|
||||
var size = gzipSize(fileContents);
|
||||
var previousSize = sizes[removeFileNameHash(root, asset.name)];
|
||||
var difference = getDifferenceLabel(size, previousSize);
|
||||
return {
|
||||
folder: path.join(
|
||||
path.basename(buildFolder),
|
||||
path.dirname(asset.name)
|
||||
),
|
||||
name: path.basename(asset.name),
|
||||
size: size,
|
||||
sizeLabel:
|
||||
filesize(size) + (difference ? ' (' + difference + ')' : ''),
|
||||
};
|
||||
})
|
||||
)
|
||||
.reduce((single, all) => all.concat(single), []);
|
||||
assets.sort((a, b) => b.size - a.size);
|
||||
var longestSizeLabelLength = Math.max.apply(
|
||||
null,
|
||||
assets.map(a => stripAnsi(a.sizeLabel).length)
|
||||
);
|
||||
var suggestBundleSplitting = false;
|
||||
assets.forEach(asset => {
|
||||
var sizeLabel = asset.sizeLabel;
|
||||
var sizeLength = stripAnsi(sizeLabel).length;
|
||||
if (sizeLength < longestSizeLabelLength) {
|
||||
var rightPadding = ' '.repeat(longestSizeLabelLength - sizeLength);
|
||||
sizeLabel += rightPadding;
|
||||
}
|
||||
var isMainBundle = asset.name.indexOf('main.') === 0;
|
||||
var maxRecommendedSize = isMainBundle
|
||||
? maxBundleGzipSize
|
||||
: maxChunkGzipSize;
|
||||
var isLarge = maxRecommendedSize && asset.size > maxRecommendedSize;
|
||||
if (isLarge && path.extname(asset.name) === '.js') {
|
||||
suggestBundleSplitting = true;
|
||||
}
|
||||
console.log(
|
||||
' ' +
|
||||
(isLarge ? chalk.yellow(sizeLabel) : sizeLabel) +
|
||||
' ' +
|
||||
chalk.dim(asset.folder + path.sep) +
|
||||
chalk.cyan(asset.name)
|
||||
);
|
||||
});
|
||||
if (suggestBundleSplitting) {
|
||||
console.log();
|
||||
console.log(
|
||||
chalk.yellow('The bundle size is significantly larger than recommended.')
|
||||
);
|
||||
console.log(
|
||||
chalk.yellow(
|
||||
'Consider reducing it with code splitting: https://goo.gl/9VhYWB'
|
||||
)
|
||||
);
|
||||
console.log(
|
||||
chalk.yellow(
|
||||
'You can also analyze the project dependencies: https://goo.gl/LeUzfb'
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function removeFileNameHash(buildFolder, fileName) {
|
||||
return fileName
|
||||
.replace(buildFolder, '')
|
||||
.replace(/\\/g, '/')
|
||||
.replace(
|
||||
/\/?(.*)(\.[0-9a-f]+)(\.chunk)?(\.js|\.css)/,
|
||||
(match, p1, p2, p3, p4) => p1 + p4
|
||||
);
|
||||
}
|
||||
|
||||
// Input: 1024, 2048
|
||||
// Output: "(+1 KB)"
|
||||
function getDifferenceLabel(currentSize, previousSize) {
|
||||
var FIFTY_KILOBYTES = 1024 * 50;
|
||||
var difference = currentSize - previousSize;
|
||||
var fileSize = !Number.isNaN(difference) ? filesize(difference) : 0;
|
||||
if (difference >= FIFTY_KILOBYTES) {
|
||||
return chalk.red('+' + fileSize);
|
||||
} else if (difference < FIFTY_KILOBYTES && difference > 0) {
|
||||
return chalk.yellow('+' + fileSize);
|
||||
} else if (difference < 0) {
|
||||
return chalk.green(fileSize);
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function measureFileSizesBeforeBuild(buildFolder) {
|
||||
return new Promise(resolve => {
|
||||
recursive(buildFolder, (err, fileNames) => {
|
||||
var sizes;
|
||||
if (!err && fileNames) {
|
||||
sizes = fileNames.filter(canReadAsset).reduce((memo, fileName) => {
|
||||
var contents = fs.readFileSync(fileName);
|
||||
var key = removeFileNameHash(buildFolder, fileName);
|
||||
memo[key] = gzipSize(contents);
|
||||
return memo;
|
||||
}, {});
|
||||
}
|
||||
resolve({
|
||||
root: buildFolder,
|
||||
sizes: sizes || {},
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
measureFileSizesBeforeBuild: measureFileSizesBeforeBuild,
|
||||
printFileSizesAfterBuild: printFileSizesAfterBuild,
|
||||
};
|
12
web/node_modules/react-dev-utils/ForkTsCheckerWebpackPlugin.js
generated
vendored
Normal file
12
web/node_modules/react-dev-utils/ForkTsCheckerWebpackPlugin.js
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
|
||||
|
||||
module.exports = ForkTsCheckerWebpackPlugin;
|
62
web/node_modules/react-dev-utils/InlineChunkHtmlPlugin.js
generated
vendored
Normal file
62
web/node_modules/react-dev-utils/InlineChunkHtmlPlugin.js
generated
vendored
Normal file
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
class InlineChunkHtmlPlugin {
|
||||
constructor(htmlWebpackPlugin, tests) {
|
||||
this.htmlWebpackPlugin = htmlWebpackPlugin;
|
||||
this.tests = tests;
|
||||
}
|
||||
|
||||
getInlinedTag(publicPath, assets, tag) {
|
||||
if (tag.tagName !== 'script' || !(tag.attributes && tag.attributes.src)) {
|
||||
return tag;
|
||||
}
|
||||
const scriptName = publicPath
|
||||
? tag.attributes.src.replace(publicPath, '')
|
||||
: tag.attributes.src;
|
||||
if (!this.tests.some(test => scriptName.match(test))) {
|
||||
return tag;
|
||||
}
|
||||
const asset = assets[scriptName];
|
||||
if (asset == null) {
|
||||
return tag;
|
||||
}
|
||||
return { tagName: 'script', innerHTML: asset.source(), closeTag: true };
|
||||
}
|
||||
|
||||
apply(compiler) {
|
||||
let publicPath = compiler.options.output.publicPath || '';
|
||||
if (publicPath && !publicPath.endsWith('/')) {
|
||||
publicPath += '/';
|
||||
}
|
||||
|
||||
compiler.hooks.compilation.tap('InlineChunkHtmlPlugin', compilation => {
|
||||
const tagFunction = tag =>
|
||||
this.getInlinedTag(publicPath, compilation.assets, tag);
|
||||
|
||||
const hooks = this.htmlWebpackPlugin.getHooks(compilation);
|
||||
hooks.alterAssetTagGroups.tap('InlineChunkHtmlPlugin', assets => {
|
||||
assets.headTags = assets.headTags.map(tagFunction);
|
||||
assets.bodyTags = assets.bodyTags.map(tagFunction);
|
||||
});
|
||||
|
||||
// Still emit the runtime chunk for users who do not use our generated
|
||||
// index.html file.
|
||||
// hooks.afterEmit.tap('InlineChunkHtmlPlugin', () => {
|
||||
// Object.keys(compilation.assets).forEach(assetName => {
|
||||
// if (this.tests.some(test => assetName.match(test))) {
|
||||
// delete compilation.assets[assetName];
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = InlineChunkHtmlPlugin;
|
43
web/node_modules/react-dev-utils/InterpolateHtmlPlugin.js
generated
vendored
Normal file
43
web/node_modules/react-dev-utils/InterpolateHtmlPlugin.js
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
// This webpack plugin lets us interpolate custom variables into `index.html`.
|
||||
// Usage: `new InterpolateHtmlPlugin(HtmlWebpackPlugin, { 'MY_VARIABLE': 42 })`
|
||||
// Then, you can use %MY_VARIABLE% in your `index.html`.
|
||||
|
||||
// It works in tandem with HtmlWebpackPlugin.
|
||||
// Learn more about creating plugins like this:
|
||||
// https://github.com/ampedandwired/html-webpack-plugin#events
|
||||
|
||||
'use strict';
|
||||
const escapeStringRegexp = require('escape-string-regexp');
|
||||
|
||||
class InterpolateHtmlPlugin {
|
||||
constructor(htmlWebpackPlugin, replacements) {
|
||||
this.htmlWebpackPlugin = htmlWebpackPlugin;
|
||||
this.replacements = replacements;
|
||||
}
|
||||
|
||||
apply(compiler) {
|
||||
compiler.hooks.compilation.tap('InterpolateHtmlPlugin', compilation => {
|
||||
this.htmlWebpackPlugin
|
||||
.getHooks(compilation)
|
||||
.afterTemplateExecution.tap('InterpolateHtmlPlugin', data => {
|
||||
// Run HTML through a series of user-specified string replacements.
|
||||
Object.keys(this.replacements).forEach(key => {
|
||||
const value = this.replacements[key];
|
||||
data.html = data.html.replace(
|
||||
new RegExp('%' + escapeStringRegexp(key) + '%', 'g'),
|
||||
value
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = InterpolateHtmlPlugin;
|
21
web/node_modules/react-dev-utils/LICENSE
generated
vendored
Normal file
21
web/node_modules/react-dev-utils/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2013-present, Facebook, 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.
|
146
web/node_modules/react-dev-utils/ModuleNotFoundPlugin.js
generated
vendored
Normal file
146
web/node_modules/react-dev-utils/ModuleNotFoundPlugin.js
generated
vendored
Normal file
|
@ -0,0 +1,146 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const chalk = require('chalk');
|
||||
const findUp = require('find-up');
|
||||
const path = require('path');
|
||||
|
||||
class ModuleNotFoundPlugin {
|
||||
constructor(appPath, yarnLockFile) {
|
||||
this.appPath = appPath;
|
||||
this.yarnLockFile = yarnLockFile;
|
||||
|
||||
this.useYarnCommand = this.useYarnCommand.bind(this);
|
||||
this.getRelativePath = this.getRelativePath.bind(this);
|
||||
this.prettierError = this.prettierError.bind(this);
|
||||
}
|
||||
|
||||
useYarnCommand() {
|
||||
try {
|
||||
return findUp.sync('yarn.lock', { cwd: this.appPath }) != null;
|
||||
} catch (_) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
getRelativePath(_file) {
|
||||
let file = path.relative(this.appPath, _file);
|
||||
if (file.startsWith('..')) {
|
||||
file = _file;
|
||||
} else if (!file.startsWith('.')) {
|
||||
file = '.' + path.sep + file;
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
prettierError(err) {
|
||||
let { details: _details = '', origin } = err;
|
||||
|
||||
if (origin == null) {
|
||||
const caseSensitivity =
|
||||
err.message &&
|
||||
/\[CaseSensitivePathsPlugin\] `(.*?)` .* `(.*?)`/.exec(err.message);
|
||||
if (caseSensitivity) {
|
||||
const [, incorrectPath, actualName] = caseSensitivity;
|
||||
const actualFile = this.getRelativePath(
|
||||
path.join(path.dirname(incorrectPath), actualName)
|
||||
);
|
||||
const incorrectName = path.basename(incorrectPath);
|
||||
err.message = `Cannot find file: '${incorrectName}' does not match the corresponding name on disk: '${actualFile}'.`;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
const file = this.getRelativePath(origin.resource);
|
||||
let details = _details.split('\n');
|
||||
|
||||
const request = /resolve '(.*?)' in '(.*?)'/.exec(details);
|
||||
if (request) {
|
||||
const isModule = details[1] && details[1].includes('module');
|
||||
const isFile = details[1] && details[1].includes('file');
|
||||
|
||||
let [, target, context] = request;
|
||||
context = this.getRelativePath(context);
|
||||
if (isModule) {
|
||||
const isYarn = this.useYarnCommand();
|
||||
details = [
|
||||
`Cannot find module: '${target}'. Make sure this package is installed.`,
|
||||
'',
|
||||
'You can install this package by running: ' +
|
||||
(isYarn
|
||||
? chalk.bold(`yarn add ${target}`)
|
||||
: chalk.bold(`npm install ${target}`)) +
|
||||
'.',
|
||||
];
|
||||
} else if (isFile) {
|
||||
details = [`Cannot find file '${target}' in '${context}'.`];
|
||||
} else {
|
||||
details = [err.message];
|
||||
}
|
||||
} else {
|
||||
details = [err.message];
|
||||
}
|
||||
err.message = [file, ...details].join('\n').replace('Error: ', '');
|
||||
|
||||
const isModuleScopePluginError =
|
||||
err.error && err.error.__module_scope_plugin;
|
||||
if (isModuleScopePluginError) {
|
||||
err.message = err.message.replace('Module not found: ', '');
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
apply(compiler) {
|
||||
const { prettierError } = this;
|
||||
compiler.hooks.make.intercept({
|
||||
register(tap) {
|
||||
if (
|
||||
!(tap.name === 'MultiEntryPlugin' || tap.name === 'SingleEntryPlugin')
|
||||
) {
|
||||
return tap;
|
||||
}
|
||||
return Object.assign({}, tap, {
|
||||
fn: (compilation, callback) => {
|
||||
tap.fn(compilation, (err, ...args) => {
|
||||
if (err && err.name === 'ModuleNotFoundError') {
|
||||
err = prettierError(err);
|
||||
}
|
||||
callback(err, ...args);
|
||||
});
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
compiler.hooks.normalModuleFactory.tap('ModuleNotFoundPlugin', nmf => {
|
||||
nmf.hooks.afterResolve.intercept({
|
||||
register(tap) {
|
||||
if (tap.name !== 'CaseSensitivePathsPlugin') {
|
||||
return tap;
|
||||
}
|
||||
return Object.assign({}, tap, {
|
||||
fn: (compilation, callback) => {
|
||||
tap.fn(compilation, (err, ...args) => {
|
||||
if (
|
||||
err &&
|
||||
err.message &&
|
||||
err.message.includes('CaseSensitivePathsPlugin')
|
||||
) {
|
||||
err = prettierError(err);
|
||||
}
|
||||
callback(err, ...args);
|
||||
});
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ModuleNotFoundPlugin;
|
97
web/node_modules/react-dev-utils/ModuleScopePlugin.js
generated
vendored
Normal file
97
web/node_modules/react-dev-utils/ModuleScopePlugin.js
generated
vendored
Normal file
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const chalk = require('chalk');
|
||||
const path = require('path');
|
||||
const os = require('os');
|
||||
|
||||
class ModuleScopePlugin {
|
||||
constructor(appSrc, allowedFiles = []) {
|
||||
this.appSrcs = Array.isArray(appSrc) ? appSrc : [appSrc];
|
||||
this.allowedFiles = new Set(allowedFiles);
|
||||
}
|
||||
|
||||
apply(resolver) {
|
||||
const { appSrcs } = this;
|
||||
resolver.hooks.file.tapAsync(
|
||||
'ModuleScopePlugin',
|
||||
(request, contextResolver, callback) => {
|
||||
// Unknown issuer, probably webpack internals
|
||||
if (!request.context.issuer) {
|
||||
return callback();
|
||||
}
|
||||
if (
|
||||
// If this resolves to a node_module, we don't care what happens next
|
||||
request.descriptionFileRoot.indexOf('/node_modules/') !== -1 ||
|
||||
request.descriptionFileRoot.indexOf('\\node_modules\\') !== -1 ||
|
||||
// Make sure this request was manual
|
||||
!request.__innerRequest_request
|
||||
) {
|
||||
return callback();
|
||||
}
|
||||
// Resolve the issuer from our appSrc and make sure it's one of our files
|
||||
// Maybe an indexOf === 0 would be better?
|
||||
if (
|
||||
appSrcs.every(appSrc => {
|
||||
const relative = path.relative(appSrc, request.context.issuer);
|
||||
// If it's not in one of our app src or a subdirectory, not our request!
|
||||
return relative.startsWith('../') || relative.startsWith('..\\');
|
||||
})
|
||||
) {
|
||||
return callback();
|
||||
}
|
||||
const requestFullPath = path.resolve(
|
||||
path.dirname(request.context.issuer),
|
||||
request.__innerRequest_request
|
||||
);
|
||||
if (this.allowedFiles.has(requestFullPath)) {
|
||||
return callback();
|
||||
}
|
||||
// Find path from src to the requested file
|
||||
// Error if in a parent directory of all given appSrcs
|
||||
if (
|
||||
appSrcs.every(appSrc => {
|
||||
const requestRelative = path.relative(appSrc, requestFullPath);
|
||||
return (
|
||||
requestRelative.startsWith('../') ||
|
||||
requestRelative.startsWith('..\\')
|
||||
);
|
||||
})
|
||||
) {
|
||||
const scopeError = new Error(
|
||||
`You attempted to import ${chalk.cyan(
|
||||
request.__innerRequest_request
|
||||
)} which falls outside of the project ${chalk.cyan(
|
||||
'src/'
|
||||
)} directory. ` +
|
||||
`Relative imports outside of ${chalk.cyan(
|
||||
'src/'
|
||||
)} are not supported.` +
|
||||
os.EOL +
|
||||
`You can either move it inside ${chalk.cyan(
|
||||
'src/'
|
||||
)}, or add a symlink to it from project's ${chalk.cyan(
|
||||
'node_modules/'
|
||||
)}.`
|
||||
);
|
||||
Object.defineProperty(scopeError, '__module_scope_plugin', {
|
||||
value: true,
|
||||
writable: false,
|
||||
enumerable: false,
|
||||
});
|
||||
callback(scopeError, request);
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ModuleScopePlugin;
|
423
web/node_modules/react-dev-utils/README.md
generated
vendored
Normal file
423
web/node_modules/react-dev-utils/README.md
generated
vendored
Normal file
|
@ -0,0 +1,423 @@
|
|||
# react-dev-utils
|
||||
|
||||
This package includes some utilities used by [Create React App](https://github.com/facebook/create-react-app).<br>
|
||||
Please refer to its documentation:
|
||||
|
||||
- [Getting Started](https://facebook.github.io/create-react-app/docs/getting-started) – How to create a new app.
|
||||
- [User Guide](https://facebook.github.io/create-react-app/) – How to develop apps bootstrapped with Create React App.
|
||||
|
||||
## Usage in Create React App Projects
|
||||
|
||||
These utilities come by default with [Create React App](https://github.com/facebook/create-react-app). **You don’t need to install it separately in Create React App projects.**
|
||||
|
||||
## Usage Outside of Create React App
|
||||
|
||||
If you don’t use Create React App, or if you [ejected](https://facebook.github.io/create-react-app/docs/available-scripts#npm-run-eject), you may keep using these utilities. Their development will be aligned with Create React App, so major versions of these utilities may come out relatively often. Feel free to fork or copy and paste them into your projects if you’d like to have more control over them, or feel free to use the old versions. Not all of them are React-specific, but we might make some of them more React-specific in the future.
|
||||
|
||||
### Entry Points
|
||||
|
||||
There is no single entry point. You can only import individual top-level modules.
|
||||
|
||||
#### `new InterpolateHtmlPlugin(htmlWebpackPlugin: HtmlWebpackPlugin, replacements: {[key:string]: string})`
|
||||
|
||||
This webpack plugin lets us interpolate custom variables into `index.html`.<br>
|
||||
It works in tandem with [HtmlWebpackPlugin](https://github.com/ampedandwired/html-webpack-plugin) 2.x via its [events](https://github.com/ampedandwired/html-webpack-plugin#events).
|
||||
|
||||
```js
|
||||
var path = require('path');
|
||||
var HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
var InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
|
||||
|
||||
// webpack config
|
||||
var publicUrl = '/my-custom-url';
|
||||
|
||||
module.exports = {
|
||||
output: {
|
||||
// ...
|
||||
publicPath: publicUrl + '/',
|
||||
},
|
||||
// ...
|
||||
plugins: [
|
||||
// Generates an `index.html` file with the <script> injected.
|
||||
new HtmlWebpackPlugin({
|
||||
inject: true,
|
||||
template: path.resolve('public/index.html'),
|
||||
}),
|
||||
// Makes the public URL available as %PUBLIC_URL% in index.html, e.g.:
|
||||
// <link rel="icon" href="%PUBLIC_URL%/favicon.ico">
|
||||
new InterpolateHtmlPlugin(HtmlWebpackPlugin, {
|
||||
PUBLIC_URL: publicUrl,
|
||||
// You can pass any key-value pairs, this was just an example.
|
||||
// WHATEVER: 42 will replace %WHATEVER% with 42 in index.html.
|
||||
}),
|
||||
// ...
|
||||
],
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
#### `new InlineChunkHtmlPlugin(htmlWebpackPlugin: HtmlWebpackPlugin, tests: Regex[])`
|
||||
|
||||
This webpack plugin inlines script chunks into `index.html`.<br>
|
||||
It works in tandem with [HtmlWebpackPlugin](https://github.com/ampedandwired/html-webpack-plugin) 4.x.
|
||||
|
||||
```js
|
||||
var path = require('path');
|
||||
var HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
var InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin');
|
||||
|
||||
// webpack config
|
||||
var publicUrl = '/my-custom-url';
|
||||
|
||||
module.exports = {
|
||||
output: {
|
||||
// ...
|
||||
publicPath: publicUrl + '/',
|
||||
},
|
||||
// ...
|
||||
plugins: [
|
||||
// Generates an `index.html` file with the <script> injected.
|
||||
new HtmlWebpackPlugin({
|
||||
inject: true,
|
||||
template: path.resolve('public/index.html'),
|
||||
}),
|
||||
// Inlines chunks with `runtime` in the name
|
||||
new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime/]),
|
||||
// ...
|
||||
],
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
#### `new ModuleScopePlugin(appSrc: string | string[], allowedFiles?: string[])`
|
||||
|
||||
This webpack plugin ensures that relative imports from app's source directories don't reach outside of it.
|
||||
|
||||
```js
|
||||
var path = require('path');
|
||||
var ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
|
||||
|
||||
module.exports = {
|
||||
// ...
|
||||
resolve: {
|
||||
// ...
|
||||
plugins: [
|
||||
new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),
|
||||
// ...
|
||||
],
|
||||
// ...
|
||||
},
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
#### `new WatchMissingNodeModulesPlugin(nodeModulesPath: string)`
|
||||
|
||||
This webpack plugin ensures `npm install <library>` forces a project rebuild.<br>
|
||||
We’re not sure why this isn't webpack's default behavior.<br>
|
||||
See [#186](https://github.com/facebook/create-react-app/issues/186) for details.
|
||||
|
||||
```js
|
||||
var path = require('path');
|
||||
var WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
|
||||
|
||||
// webpack config
|
||||
module.exports = {
|
||||
// ...
|
||||
plugins: [
|
||||
// ...
|
||||
// If you require a missing module and then `npm install` it, you still have
|
||||
// to restart the development server for webpack to discover it. This plugin
|
||||
// makes the discovery automatic so you don't have to restart.
|
||||
// See https://github.com/facebook/create-react-app/issues/186
|
||||
new WatchMissingNodeModulesPlugin(path.resolve('node_modules')),
|
||||
],
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
#### `checkRequiredFiles(files: Array<string>): boolean`
|
||||
|
||||
Makes sure that all passed files exist.<br>
|
||||
Filenames are expected to be absolute.<br>
|
||||
If a file is not found, prints a warning message and returns `false`.
|
||||
|
||||
```js
|
||||
var path = require('path');
|
||||
var checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
|
||||
|
||||
if (
|
||||
!checkRequiredFiles([
|
||||
path.resolve('public/index.html'),
|
||||
path.resolve('src/index.js'),
|
||||
])
|
||||
) {
|
||||
process.exit(1);
|
||||
}
|
||||
```
|
||||
|
||||
#### `clearConsole(): void`
|
||||
|
||||
Clears the console, hopefully in a cross-platform way.
|
||||
|
||||
```js
|
||||
var clearConsole = require('react-dev-utils/clearConsole');
|
||||
|
||||
clearConsole();
|
||||
console.log('Just cleared the screen!');
|
||||
```
|
||||
|
||||
#### `eslintFormatter(results: Object): string`
|
||||
|
||||
This is our custom ESLint formatter that integrates well with Create React App console output.<br>
|
||||
You can use the default one instead if you prefer so.
|
||||
|
||||
```js
|
||||
const eslintFormatter = require('react-dev-utils/eslintFormatter');
|
||||
|
||||
// In your webpack config:
|
||||
// ...
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(js|jsx)$/,
|
||||
include: paths.appSrc,
|
||||
enforce: 'pre',
|
||||
use: [
|
||||
{
|
||||
loader: 'eslint-loader',
|
||||
options: {
|
||||
// Pass the formatter:
|
||||
formatter: eslintFormatter,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
#### `FileSizeReporter`
|
||||
|
||||
##### `measureFileSizesBeforeBuild(buildFolder: string): Promise<OpaqueFileSizes>`
|
||||
|
||||
Captures JS and CSS asset sizes inside the passed `buildFolder`. Save the result value to compare it after the build.
|
||||
|
||||
##### `printFileSizesAfterBuild(webpackStats: WebpackStats, previousFileSizes: OpaqueFileSizes, buildFolder: string, maxBundleGzipSize?: number, maxChunkGzipSize?: number)`
|
||||
|
||||
Prints the JS and CSS asset sizes after the build, and includes a size comparison with `previousFileSizes` that were captured earlier using `measureFileSizesBeforeBuild()`. `maxBundleGzipSize` and `maxChunkGzipSizemay` may optionally be specified to display a warning when the main bundle or a chunk exceeds the specified size (in bytes).
|
||||
|
||||
```js
|
||||
var {
|
||||
measureFileSizesBeforeBuild,
|
||||
printFileSizesAfterBuild,
|
||||
} = require('react-dev-utils/FileSizeReporter');
|
||||
|
||||
measureFileSizesBeforeBuild(buildFolder).then(previousFileSizes => {
|
||||
return cleanAndRebuild().then(webpackStats => {
|
||||
printFileSizesAfterBuild(webpackStats, previousFileSizes, buildFolder);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
#### `formatWebpackMessages({errors: Array<string>, warnings: Array<string>}): {errors: Array<string>, warnings: Array<string>}`
|
||||
|
||||
Extracts and prettifies warning and error messages from webpack [stats](https://github.com/webpack/docs/wiki/node.js-api#stats) object.
|
||||
|
||||
```js
|
||||
var webpack = require('webpack');
|
||||
var config = require('../config/webpack.config.dev');
|
||||
var formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
|
||||
|
||||
var compiler = webpack(config);
|
||||
|
||||
compiler.hooks.invalid.tap('invalid', function() {
|
||||
console.log('Compiling...');
|
||||
});
|
||||
|
||||
compiler.hooks.done.tap('done', function(stats) {
|
||||
var rawMessages = stats.toJson({}, true);
|
||||
var messages = formatWebpackMessages(rawMessages);
|
||||
if (!messages.errors.length && !messages.warnings.length) {
|
||||
console.log('Compiled successfully!');
|
||||
}
|
||||
if (messages.errors.length) {
|
||||
console.log('Failed to compile.');
|
||||
messages.errors.forEach(e => console.log(e));
|
||||
return;
|
||||
}
|
||||
if (messages.warnings.length) {
|
||||
console.log('Compiled with warnings.');
|
||||
messages.warnings.forEach(w => console.log(w));
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### `printBuildError(error: Object): void`
|
||||
|
||||
Prettify some known build errors.
|
||||
Pass an Error object to log a prettified error message in the console.
|
||||
|
||||
```
|
||||
const printBuildError = require('react-dev-utils/printBuildError')
|
||||
try {
|
||||
build()
|
||||
} catch(e) {
|
||||
printBuildError(e) // logs prettified message
|
||||
}
|
||||
```
|
||||
|
||||
#### `getProcessForPort(port: number): string`
|
||||
|
||||
Finds the currently running process on `port`.
|
||||
Returns a string containing the name and directory, e.g.,
|
||||
|
||||
```
|
||||
create-react-app
|
||||
in /Users/developer/create-react-app
|
||||
```
|
||||
|
||||
```js
|
||||
var getProcessForPort = require('react-dev-utils/getProcessForPort');
|
||||
|
||||
getProcessForPort(3000);
|
||||
```
|
||||
|
||||
#### `launchEditor(fileName: string, lineNumber: number): void`
|
||||
|
||||
On macOS, tries to find a known running editor process and opens the file in it. It can also be explicitly configured by `REACT_EDITOR`, `VISUAL`, or `EDITOR` environment variables. For example, you can put `REACT_EDITOR=atom` in your `.env.local` file, and Create React App will respect that.
|
||||
|
||||
#### `noopServiceWorkerMiddleware(servedPath: string): ExpressMiddleware`
|
||||
|
||||
Returns Express middleware that serves a `${servedPath}/service-worker.js` that resets any previously set service worker configuration. Useful for development.
|
||||
|
||||
#### `redirectServedPathMiddleware(servedPath: string): ExpressMiddleware`
|
||||
|
||||
Returns Express middleware that redirects to `${servedPath}/${req.path}`, if `req.url`
|
||||
does not start with `servedPath`. Useful for development.
|
||||
|
||||
#### `openBrowser(url: string): boolean`
|
||||
|
||||
Attempts to open the browser with a given URL.<br>
|
||||
On Mac OS X, attempts to reuse an existing Chrome tab via AppleScript.<br>
|
||||
Otherwise, falls back to [opn](https://github.com/sindresorhus/opn) behavior.
|
||||
|
||||
```js
|
||||
var path = require('path');
|
||||
var openBrowser = require('react-dev-utils/openBrowser');
|
||||
|
||||
if (openBrowser('http://localhost:3000')) {
|
||||
console.log('The browser tab has been opened!');
|
||||
}
|
||||
```
|
||||
|
||||
#### `printHostingInstructions(appPackage: Object, publicUrl: string, publicPath: string, buildFolder: string, useYarn: boolean): void`
|
||||
|
||||
Prints hosting instructions after the project is built.
|
||||
|
||||
Pass your parsed `package.json` object as `appPackage`, your URL where you plan to host the app as `publicUrl`, `output.publicPath` from your webpack configuration as `publicPath`, the `buildFolder` name, and whether to `useYarn` in instructions.
|
||||
|
||||
```js
|
||||
const appPackage = require(paths.appPackageJson);
|
||||
const publicUrl = paths.publicUrlOrPath;
|
||||
const publicPath = config.output.publicPath;
|
||||
printHostingInstructions(appPackage, publicUrl, publicPath, 'build', true);
|
||||
```
|
||||
|
||||
#### `WebpackDevServerUtils`
|
||||
|
||||
##### `choosePort(host: string, defaultPort: number): Promise<number | null>`
|
||||
|
||||
Returns a Promise resolving to either `defaultPort` or next available port if the user confirms it is okay to do. If the port is taken and the user has refused to use another port, or if the terminal is not interactive and can’t present user with the choice, resolves to `null`.
|
||||
|
||||
##### `createCompiler(args: Object): WebpackCompiler`
|
||||
|
||||
Creates a webpack compiler instance for WebpackDevServer with built-in helpful messages.
|
||||
|
||||
The `args` object accepts a number of properties:
|
||||
|
||||
- **appName** `string`: The name that will be printed to the terminal.
|
||||
- **config** `Object`: The webpack configuration options to be provided to the webpack constructor.
|
||||
- **devSocket** `Object`: Required if `useTypeScript` is `true`. This object should include `errors` and `warnings` which are functions accepting an array of errors or warnings emitted by the type checking. This is useful when running `fork-ts-checker-webpack-plugin` with `async: true` to report errors that are emitted after the webpack build is complete.
|
||||
- **urls** `Object`: To provide the `urls` argument, use `prepareUrls()` described below.
|
||||
- **useYarn** `boolean`: If `true`, yarn instructions will be emitted in the terminal instead of npm.
|
||||
- **useTypeScript** `boolean`: If `true`, TypeScript type checking will be enabled. Be sure to provide the `devSocket` argument above if this is set to `true`.
|
||||
- **tscCompileOnError** `boolean`: If `true`, errors in TypeScript type checking will not prevent start script from running app, and will not cause build script to exit unsuccessfully. Also downgrades all TypeScript type checking error messages to warning messages.
|
||||
- **webpack** `function`: A reference to the webpack constructor.
|
||||
|
||||
##### `prepareProxy(proxySetting: string, appPublicFolder: string, servedPathname: string): Object`
|
||||
|
||||
Creates a WebpackDevServer `proxy` configuration object from the `proxy` setting in `package.json`.
|
||||
|
||||
##### `prepareUrls(protocol: string, host: string, port: number, pathname: string = '/'): Object`
|
||||
|
||||
Returns an object with local and remote URLs for the development server. Pass this object to `createCompiler()` described above.
|
||||
|
||||
#### `webpackHotDevClient`
|
||||
|
||||
This is an alternative client for [WebpackDevServer](https://github.com/webpack/webpack-dev-server) that shows a syntax error overlay.
|
||||
|
||||
It currently supports only webpack 3.x.
|
||||
|
||||
```js
|
||||
// webpack development config
|
||||
module.exports = {
|
||||
// ...
|
||||
entry: [
|
||||
// You can replace the line below with these two lines if you prefer the
|
||||
// stock client:
|
||||
// require.resolve('webpack-dev-server/client') + '?/',
|
||||
// require.resolve('webpack/hot/dev-server'),
|
||||
'react-dev-utils/webpackHotDevClient',
|
||||
'src/index',
|
||||
],
|
||||
// ...
|
||||
};
|
||||
```
|
||||
|
||||
#### `getCSSModuleLocalIdent(context: Object, localIdentName: String, localName: String, options: Object): string`
|
||||
|
||||
Creates a class name for CSS Modules that uses either the filename or folder name if named `index.module.css`.
|
||||
|
||||
For `MyFolder/MyComponent.module.css` and class `MyClass` the output will be `MyComponent.module_MyClass__[hash]`
|
||||
For `MyFolder/index.module.css` and class `MyClass` the output will be `MyFolder_MyClass__[hash]`
|
||||
|
||||
```js
|
||||
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');
|
||||
|
||||
// In your webpack config:
|
||||
// ...
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.module\.css$/,
|
||||
use: [
|
||||
require.resolve('style-loader'),
|
||||
{
|
||||
loader: require.resolve('css-loader'),
|
||||
options: {
|
||||
importLoaders: 1,
|
||||
modules: {
|
||||
getLocalIdent: getCSSModuleLocalIdent,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
loader: require.resolve('postcss-loader'),
|
||||
options: postCSSLoaderOptions,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
#### `getCacheIdentifier(environment: string, packages: string[]): string`
|
||||
|
||||
Returns a cache identifier (string) consisting of the specified environment and related package versions, e.g.,
|
||||
|
||||
```js
|
||||
var getCacheIdentifier = require('react-dev-utils/getCacheIdentifier');
|
||||
|
||||
getCacheIdentifier('prod', ['react-dev-utils', 'chalk']); // # => 'prod:react-dev-utils@5.0.0:chalk@3.0.0'
|
||||
```
|
33
web/node_modules/react-dev-utils/WatchMissingNodeModulesPlugin.js
generated
vendored
Normal file
33
web/node_modules/react-dev-utils/WatchMissingNodeModulesPlugin.js
generated
vendored
Normal file
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
// This webpack plugin ensures `npm install <library>` forces a project rebuild.
|
||||
// We’re not sure why this isn't webpack's default behavior.
|
||||
// See https://github.com/facebook/create-react-app/issues/186.
|
||||
|
||||
'use strict';
|
||||
|
||||
class WatchMissingNodeModulesPlugin {
|
||||
constructor(nodeModulesPath) {
|
||||
this.nodeModulesPath = nodeModulesPath;
|
||||
}
|
||||
|
||||
apply(compiler) {
|
||||
compiler.hooks.emit.tap('WatchMissingNodeModulesPlugin', compilation => {
|
||||
var missingDeps = Array.from(compilation.missingDependencies);
|
||||
var nodeModulesPath = this.nodeModulesPath;
|
||||
|
||||
// If any missing files are expected to appear in node_modules...
|
||||
if (missingDeps.some(file => file.includes(nodeModulesPath))) {
|
||||
// ...tell webpack to watch node_modules recursively until they appear.
|
||||
compilation.contextDependencies.add(nodeModulesPath);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = WatchMissingNodeModulesPlugin;
|
500
web/node_modules/react-dev-utils/WebpackDevServerUtils.js
generated
vendored
Normal file
500
web/node_modules/react-dev-utils/WebpackDevServerUtils.js
generated
vendored
Normal file
|
@ -0,0 +1,500 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const address = require('address');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const url = require('url');
|
||||
const chalk = require('chalk');
|
||||
const detect = require('detect-port-alt');
|
||||
const isRoot = require('is-root');
|
||||
const prompts = require('prompts');
|
||||
const clearConsole = require('./clearConsole');
|
||||
const formatWebpackMessages = require('./formatWebpackMessages');
|
||||
const getProcessForPort = require('./getProcessForPort');
|
||||
const typescriptFormatter = require('./typescriptFormatter');
|
||||
const forkTsCheckerWebpackPlugin = require('./ForkTsCheckerWebpackPlugin');
|
||||
|
||||
const isInteractive = process.stdout.isTTY;
|
||||
|
||||
function prepareUrls(protocol, host, port, pathname = '/') {
|
||||
const formatUrl = hostname =>
|
||||
url.format({
|
||||
protocol,
|
||||
hostname,
|
||||
port,
|
||||
pathname,
|
||||
});
|
||||
const prettyPrintUrl = hostname =>
|
||||
url.format({
|
||||
protocol,
|
||||
hostname,
|
||||
port: chalk.bold(port),
|
||||
pathname,
|
||||
});
|
||||
|
||||
const isUnspecifiedHost = host === '0.0.0.0' || host === '::';
|
||||
let prettyHost, lanUrlForConfig, lanUrlForTerminal;
|
||||
if (isUnspecifiedHost) {
|
||||
prettyHost = 'localhost';
|
||||
try {
|
||||
// This can only return an IPv4 address
|
||||
lanUrlForConfig = address.ip();
|
||||
if (lanUrlForConfig) {
|
||||
// Check if the address is a private ip
|
||||
// https://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces
|
||||
if (
|
||||
/^10[.]|^172[.](1[6-9]|2[0-9]|3[0-1])[.]|^192[.]168[.]/.test(
|
||||
lanUrlForConfig
|
||||
)
|
||||
) {
|
||||
// Address is private, format it for later use
|
||||
lanUrlForTerminal = prettyPrintUrl(lanUrlForConfig);
|
||||
} else {
|
||||
// Address is not private, so we will discard it
|
||||
lanUrlForConfig = undefined;
|
||||
}
|
||||
}
|
||||
} catch (_e) {
|
||||
// ignored
|
||||
}
|
||||
} else {
|
||||
prettyHost = host;
|
||||
}
|
||||
const localUrlForTerminal = prettyPrintUrl(prettyHost);
|
||||
const localUrlForBrowser = formatUrl(prettyHost);
|
||||
return {
|
||||
lanUrlForConfig,
|
||||
lanUrlForTerminal,
|
||||
localUrlForTerminal,
|
||||
localUrlForBrowser,
|
||||
};
|
||||
}
|
||||
|
||||
function printInstructions(appName, urls, useYarn) {
|
||||
console.log();
|
||||
console.log(`You can now view ${chalk.bold(appName)} in the browser.`);
|
||||
console.log();
|
||||
|
||||
if (urls.lanUrlForTerminal) {
|
||||
console.log(
|
||||
` ${chalk.bold('Local:')} ${urls.localUrlForTerminal}`
|
||||
);
|
||||
console.log(
|
||||
` ${chalk.bold('On Your Network:')} ${urls.lanUrlForTerminal}`
|
||||
);
|
||||
} else {
|
||||
console.log(` ${urls.localUrlForTerminal}`);
|
||||
}
|
||||
|
||||
console.log();
|
||||
console.log('Note that the development build is not optimized.');
|
||||
console.log(
|
||||
`To create a production build, use ` +
|
||||
`${chalk.cyan(`${useYarn ? 'yarn' : 'npm run'} build`)}.`
|
||||
);
|
||||
console.log();
|
||||
}
|
||||
|
||||
function createCompiler({
|
||||
appName,
|
||||
config,
|
||||
devSocket,
|
||||
urls,
|
||||
useYarn,
|
||||
useTypeScript,
|
||||
tscCompileOnError,
|
||||
webpack,
|
||||
}) {
|
||||
// "Compiler" is a low-level interface to webpack.
|
||||
// It lets us listen to some events and provide our own custom messages.
|
||||
let compiler;
|
||||
try {
|
||||
compiler = webpack(config);
|
||||
} catch (err) {
|
||||
console.log(chalk.red('Failed to compile.'));
|
||||
console.log();
|
||||
console.log(err.message || err);
|
||||
console.log();
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// "invalid" event fires when you have changed a file, and webpack is
|
||||
// recompiling a bundle. WebpackDevServer takes care to pause serving the
|
||||
// bundle, so if you refresh, it'll wait instead of serving the old one.
|
||||
// "invalid" is short for "bundle invalidated", it doesn't imply any errors.
|
||||
compiler.hooks.invalid.tap('invalid', () => {
|
||||
if (isInteractive) {
|
||||
clearConsole();
|
||||
}
|
||||
console.log('Compiling...');
|
||||
});
|
||||
|
||||
let isFirstCompile = true;
|
||||
let tsMessagesPromise;
|
||||
let tsMessagesResolver;
|
||||
|
||||
if (useTypeScript) {
|
||||
compiler.hooks.beforeCompile.tap('beforeCompile', () => {
|
||||
tsMessagesPromise = new Promise(resolve => {
|
||||
tsMessagesResolver = msgs => resolve(msgs);
|
||||
});
|
||||
});
|
||||
|
||||
forkTsCheckerWebpackPlugin
|
||||
.getCompilerHooks(compiler)
|
||||
.receive.tap('afterTypeScriptCheck', (diagnostics, lints) => {
|
||||
const allMsgs = [...diagnostics, ...lints];
|
||||
const format = message =>
|
||||
`${message.file}\n${typescriptFormatter(message, true)}`;
|
||||
|
||||
tsMessagesResolver({
|
||||
errors: allMsgs.filter(msg => msg.severity === 'error').map(format),
|
||||
warnings: allMsgs
|
||||
.filter(msg => msg.severity === 'warning')
|
||||
.map(format),
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// "done" event fires when webpack has finished recompiling the bundle.
|
||||
// Whether or not you have warnings or errors, you will get this event.
|
||||
compiler.hooks.done.tap('done', async stats => {
|
||||
if (isInteractive) {
|
||||
clearConsole();
|
||||
}
|
||||
|
||||
// We have switched off the default webpack output in WebpackDevServer
|
||||
// options so we are going to "massage" the warnings and errors and present
|
||||
// them in a readable focused way.
|
||||
// We only construct the warnings and errors for speed:
|
||||
// https://github.com/facebook/create-react-app/issues/4492#issuecomment-421959548
|
||||
const statsData = stats.toJson({
|
||||
all: false,
|
||||
warnings: true,
|
||||
errors: true,
|
||||
});
|
||||
|
||||
if (useTypeScript && statsData.errors.length === 0) {
|
||||
const delayedMsg = setTimeout(() => {
|
||||
console.log(
|
||||
chalk.yellow(
|
||||
'Files successfully emitted, waiting for typecheck results...'
|
||||
)
|
||||
);
|
||||
}, 100);
|
||||
|
||||
const messages = await tsMessagesPromise;
|
||||
clearTimeout(delayedMsg);
|
||||
if (tscCompileOnError) {
|
||||
statsData.warnings.push(...messages.errors);
|
||||
} else {
|
||||
statsData.errors.push(...messages.errors);
|
||||
}
|
||||
statsData.warnings.push(...messages.warnings);
|
||||
|
||||
// Push errors and warnings into compilation result
|
||||
// to show them after page refresh triggered by user.
|
||||
if (tscCompileOnError) {
|
||||
stats.compilation.warnings.push(...messages.errors);
|
||||
} else {
|
||||
stats.compilation.errors.push(...messages.errors);
|
||||
}
|
||||
stats.compilation.warnings.push(...messages.warnings);
|
||||
|
||||
if (messages.errors.length > 0) {
|
||||
if (tscCompileOnError) {
|
||||
devSocket.warnings(messages.errors);
|
||||
} else {
|
||||
devSocket.errors(messages.errors);
|
||||
}
|
||||
} else if (messages.warnings.length > 0) {
|
||||
devSocket.warnings(messages.warnings);
|
||||
}
|
||||
|
||||
if (isInteractive) {
|
||||
clearConsole();
|
||||
}
|
||||
}
|
||||
|
||||
const messages = formatWebpackMessages(statsData);
|
||||
const isSuccessful = !messages.errors.length && !messages.warnings.length;
|
||||
if (isSuccessful) {
|
||||
console.log(chalk.green('Compiled successfully!'));
|
||||
}
|
||||
if (isSuccessful && (isInteractive || isFirstCompile)) {
|
||||
printInstructions(appName, urls, useYarn);
|
||||
}
|
||||
isFirstCompile = false;
|
||||
|
||||
// If errors exist, only show errors.
|
||||
if (messages.errors.length) {
|
||||
// Only keep the first error. Others are often indicative
|
||||
// of the same problem, but confuse the reader with noise.
|
||||
if (messages.errors.length > 1) {
|
||||
messages.errors.length = 1;
|
||||
}
|
||||
console.log(chalk.red('Failed to compile.\n'));
|
||||
console.log(messages.errors.join('\n\n'));
|
||||
return;
|
||||
}
|
||||
|
||||
// Show warnings if no errors were found.
|
||||
if (messages.warnings.length) {
|
||||
console.log(chalk.yellow('Compiled with warnings.\n'));
|
||||
console.log(messages.warnings.join('\n\n'));
|
||||
|
||||
// Teach some ESLint tricks.
|
||||
console.log(
|
||||
'\nSearch for the ' +
|
||||
chalk.underline(chalk.yellow('keywords')) +
|
||||
' to learn more about each warning.'
|
||||
);
|
||||
console.log(
|
||||
'To ignore, add ' +
|
||||
chalk.cyan('// eslint-disable-next-line') +
|
||||
' to the line before.\n'
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
// You can safely remove this after ejecting.
|
||||
// We only use this block for testing of Create React App itself:
|
||||
const isSmokeTest = process.argv.some(
|
||||
arg => arg.indexOf('--smoke-test') > -1
|
||||
);
|
||||
if (isSmokeTest) {
|
||||
compiler.hooks.failed.tap('smokeTest', async () => {
|
||||
await tsMessagesPromise;
|
||||
process.exit(1);
|
||||
});
|
||||
compiler.hooks.done.tap('smokeTest', async stats => {
|
||||
await tsMessagesPromise;
|
||||
if (stats.hasErrors() || stats.hasWarnings()) {
|
||||
process.exit(1);
|
||||
} else {
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return compiler;
|
||||
}
|
||||
|
||||
function resolveLoopback(proxy) {
|
||||
const o = url.parse(proxy);
|
||||
o.host = undefined;
|
||||
if (o.hostname !== 'localhost') {
|
||||
return proxy;
|
||||
}
|
||||
// Unfortunately, many languages (unlike node) do not yet support IPv6.
|
||||
// This means even though localhost resolves to ::1, the application
|
||||
// must fall back to IPv4 (on 127.0.0.1).
|
||||
// We can re-enable this in a few years.
|
||||
/*try {
|
||||
o.hostname = address.ipv6() ? '::1' : '127.0.0.1';
|
||||
} catch (_ignored) {
|
||||
o.hostname = '127.0.0.1';
|
||||
}*/
|
||||
|
||||
try {
|
||||
// Check if we're on a network; if we are, chances are we can resolve
|
||||
// localhost. Otherwise, we can just be safe and assume localhost is
|
||||
// IPv4 for maximum compatibility.
|
||||
if (!address.ip()) {
|
||||
o.hostname = '127.0.0.1';
|
||||
}
|
||||
} catch (_ignored) {
|
||||
o.hostname = '127.0.0.1';
|
||||
}
|
||||
return url.format(o);
|
||||
}
|
||||
|
||||
// We need to provide a custom onError function for httpProxyMiddleware.
|
||||
// It allows us to log custom error messages on the console.
|
||||
function onProxyError(proxy) {
|
||||
return (err, req, res) => {
|
||||
const host = req.headers && req.headers.host;
|
||||
console.log(
|
||||
chalk.red('Proxy error:') +
|
||||
' Could not proxy request ' +
|
||||
chalk.cyan(req.url) +
|
||||
' from ' +
|
||||
chalk.cyan(host) +
|
||||
' to ' +
|
||||
chalk.cyan(proxy) +
|
||||
'.'
|
||||
);
|
||||
console.log(
|
||||
'See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (' +
|
||||
chalk.cyan(err.code) +
|
||||
').'
|
||||
);
|
||||
console.log();
|
||||
|
||||
// And immediately send the proper error response to the client.
|
||||
// Otherwise, the request will eventually timeout with ERR_EMPTY_RESPONSE on the client side.
|
||||
if (res.writeHead && !res.headersSent) {
|
||||
res.writeHead(500);
|
||||
}
|
||||
res.end(
|
||||
'Proxy error: Could not proxy request ' +
|
||||
req.url +
|
||||
' from ' +
|
||||
host +
|
||||
' to ' +
|
||||
proxy +
|
||||
' (' +
|
||||
err.code +
|
||||
').'
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
function prepareProxy(proxy, appPublicFolder, servedPathname) {
|
||||
// `proxy` lets you specify alternate servers for specific requests.
|
||||
if (!proxy) {
|
||||
return undefined;
|
||||
}
|
||||
if (typeof proxy !== 'string') {
|
||||
console.log(
|
||||
chalk.red('When specified, "proxy" in package.json must be a string.')
|
||||
);
|
||||
console.log(
|
||||
chalk.red('Instead, the type of "proxy" was "' + typeof proxy + '".')
|
||||
);
|
||||
console.log(
|
||||
chalk.red('Either remove "proxy" from package.json, or make it a string.')
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// If proxy is specified, let it handle any request except for
|
||||
// files in the public folder and requests to the WebpackDevServer socket endpoint.
|
||||
// https://github.com/facebook/create-react-app/issues/6720
|
||||
const sockPath = process.env.WDS_SOCKET_PATH || '/sockjs-node';
|
||||
const isDefaultSockHost = !process.env.WDS_SOCKET_HOST;
|
||||
function mayProxy(pathname) {
|
||||
const maybePublicPath = path.resolve(
|
||||
appPublicFolder,
|
||||
pathname.replace(new RegExp('^' + servedPathname), '')
|
||||
);
|
||||
const isPublicFileRequest = fs.existsSync(maybePublicPath);
|
||||
// used by webpackHotDevClient
|
||||
const isWdsEndpointRequest =
|
||||
isDefaultSockHost && pathname.startsWith(sockPath);
|
||||
return !(isPublicFileRequest || isWdsEndpointRequest);
|
||||
}
|
||||
|
||||
if (!/^http(s)?:\/\//.test(proxy)) {
|
||||
console.log(
|
||||
chalk.red(
|
||||
'When "proxy" is specified in package.json it must start with either http:// or https://'
|
||||
)
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let target;
|
||||
if (process.platform === 'win32') {
|
||||
target = resolveLoopback(proxy);
|
||||
} else {
|
||||
target = proxy;
|
||||
}
|
||||
return [
|
||||
{
|
||||
target,
|
||||
logLevel: 'silent',
|
||||
// For single page apps, we generally want to fallback to /index.html.
|
||||
// However we also want to respect `proxy` for API calls.
|
||||
// So if `proxy` is specified as a string, we need to decide which fallback to use.
|
||||
// We use a heuristic: We want to proxy all the requests that are not meant
|
||||
// for static assets and as all the requests for static assets will be using
|
||||
// `GET` method, we can proxy all non-`GET` requests.
|
||||
// For `GET` requests, if request `accept`s text/html, we pick /index.html.
|
||||
// Modern browsers include text/html into `accept` header when navigating.
|
||||
// However API calls like `fetch()` won’t generally accept text/html.
|
||||
// If this heuristic doesn’t work well for you, use `src/setupProxy.js`.
|
||||
context: function (pathname, req) {
|
||||
return (
|
||||
req.method !== 'GET' ||
|
||||
(mayProxy(pathname) &&
|
||||
req.headers.accept &&
|
||||
req.headers.accept.indexOf('text/html') === -1)
|
||||
);
|
||||
},
|
||||
onProxyReq: proxyReq => {
|
||||
// Browsers may send Origin headers even with same-origin
|
||||
// requests. To prevent CORS issues, we have to change
|
||||
// the Origin to match the target URL.
|
||||
if (proxyReq.getHeader('origin')) {
|
||||
proxyReq.setHeader('origin', target);
|
||||
}
|
||||
},
|
||||
onError: onProxyError(target),
|
||||
secure: false,
|
||||
changeOrigin: true,
|
||||
ws: true,
|
||||
xfwd: true,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
function choosePort(host, defaultPort) {
|
||||
return detect(defaultPort, host).then(
|
||||
port =>
|
||||
new Promise(resolve => {
|
||||
if (port === defaultPort) {
|
||||
return resolve(port);
|
||||
}
|
||||
const message =
|
||||
process.platform !== 'win32' && defaultPort < 1024 && !isRoot()
|
||||
? `Admin permissions are required to run a server on a port below 1024.`
|
||||
: `Something is already running on port ${defaultPort}.`;
|
||||
if (isInteractive) {
|
||||
clearConsole();
|
||||
const existingProcess = getProcessForPort(defaultPort);
|
||||
const question = {
|
||||
type: 'confirm',
|
||||
name: 'shouldChangePort',
|
||||
message:
|
||||
chalk.yellow(
|
||||
message +
|
||||
`${existingProcess ? ` Probably:\n ${existingProcess}` : ''}`
|
||||
) + '\n\nWould you like to run the app on another port instead?',
|
||||
initial: true,
|
||||
};
|
||||
prompts(question).then(answer => {
|
||||
if (answer.shouldChangePort) {
|
||||
resolve(port);
|
||||
} else {
|
||||
resolve(null);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log(chalk.red(message));
|
||||
resolve(null);
|
||||
}
|
||||
}),
|
||||
err => {
|
||||
throw new Error(
|
||||
chalk.red(`Could not find an open port at ${chalk.bold(host)}.`) +
|
||||
'\n' +
|
||||
('Network error message: ' + err.message || err) +
|
||||
'\n'
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
choosePort,
|
||||
createCompiler,
|
||||
prepareProxy,
|
||||
prepareUrls,
|
||||
};
|
95
web/node_modules/react-dev-utils/browsersHelper.js
generated
vendored
Normal file
95
web/node_modules/react-dev-utils/browsersHelper.js
generated
vendored
Normal file
|
@ -0,0 +1,95 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const browserslist = require('browserslist');
|
||||
const chalk = require('chalk');
|
||||
const os = require('os');
|
||||
const prompts = require('prompts');
|
||||
const pkgUp = require('pkg-up');
|
||||
const fs = require('fs');
|
||||
|
||||
const defaultBrowsers = {
|
||||
production: ['>0.2%', 'not dead', 'not op_mini all'],
|
||||
development: [
|
||||
'last 1 chrome version',
|
||||
'last 1 firefox version',
|
||||
'last 1 safari version',
|
||||
],
|
||||
};
|
||||
|
||||
function shouldSetBrowsers(isInteractive) {
|
||||
if (!isInteractive) {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
const question = {
|
||||
type: 'confirm',
|
||||
name: 'shouldSetBrowsers',
|
||||
message:
|
||||
chalk.yellow("We're unable to detect target browsers.") +
|
||||
`\n\nWould you like to add the defaults to your ${chalk.bold(
|
||||
'package.json'
|
||||
)}?`,
|
||||
initial: true,
|
||||
};
|
||||
|
||||
return prompts(question).then(answer => answer.shouldSetBrowsers);
|
||||
}
|
||||
|
||||
function checkBrowsers(dir, isInteractive, retry = true) {
|
||||
const current = browserslist.loadConfig({ path: dir });
|
||||
if (current != null) {
|
||||
return Promise.resolve(current);
|
||||
}
|
||||
|
||||
if (!retry) {
|
||||
return Promise.reject(
|
||||
new Error(
|
||||
chalk.red(
|
||||
'As of react-scripts >=2 you must specify targeted browsers.'
|
||||
) +
|
||||
os.EOL +
|
||||
`Please add a ${chalk.underline(
|
||||
'browserslist'
|
||||
)} key to your ${chalk.bold('package.json')}.`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return shouldSetBrowsers(isInteractive).then(shouldSetBrowsers => {
|
||||
if (!shouldSetBrowsers) {
|
||||
return checkBrowsers(dir, isInteractive, false);
|
||||
}
|
||||
|
||||
return (
|
||||
pkgUp({ cwd: dir })
|
||||
.then(filePath => {
|
||||
if (filePath == null) {
|
||||
return Promise.reject();
|
||||
}
|
||||
const pkg = JSON.parse(fs.readFileSync(filePath));
|
||||
pkg['browserslist'] = defaultBrowsers;
|
||||
fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + os.EOL);
|
||||
|
||||
browserslist.clearCaches();
|
||||
console.log();
|
||||
console.log(
|
||||
`${chalk.green('Set target browsers:')} ${chalk.cyan(
|
||||
defaultBrowsers.join(', ')
|
||||
)}`
|
||||
);
|
||||
console.log();
|
||||
})
|
||||
// Swallow any error
|
||||
.catch(() => {})
|
||||
.then(() => checkBrowsers(dir, isInteractive, false))
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = { defaultBrowsers, checkBrowsers };
|
12
web/node_modules/react-dev-utils/chalk.js
generated
vendored
Normal file
12
web/node_modules/react-dev-utils/chalk.js
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var chalk = require('chalk');
|
||||
|
||||
module.exports = chalk;
|
32
web/node_modules/react-dev-utils/checkRequiredFiles.js
generated
vendored
Normal file
32
web/node_modules/react-dev-utils/checkRequiredFiles.js
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var chalk = require('chalk');
|
||||
|
||||
function checkRequiredFiles(files) {
|
||||
var currentFilePath;
|
||||
try {
|
||||
files.forEach(filePath => {
|
||||
currentFilePath = filePath;
|
||||
fs.accessSync(filePath, fs.F_OK);
|
||||
});
|
||||
return true;
|
||||
} catch (err) {
|
||||
var dirName = path.dirname(currentFilePath);
|
||||
var fileName = path.basename(currentFilePath);
|
||||
console.log(chalk.red('Could not find a required file.'));
|
||||
console.log(chalk.red(' Name: ') + chalk.cyan(fileName));
|
||||
console.log(chalk.red(' Searched in: ') + chalk.cyan(dirName));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = checkRequiredFiles;
|
16
web/node_modules/react-dev-utils/clearConsole.js
generated
vendored
Normal file
16
web/node_modules/react-dev-utils/clearConsole.js
generated
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
function clearConsole() {
|
||||
process.stdout.write(
|
||||
process.platform === 'win32' ? '\x1B[2J\x1B[0f' : '\x1B[2J\x1B[3J\x1B[H'
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = clearConsole;
|
12
web/node_modules/react-dev-utils/crossSpawn.js
generated
vendored
Normal file
12
web/node_modules/react-dev-utils/crossSpawn.js
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var crossSpawn = require('cross-spawn');
|
||||
|
||||
module.exports = crossSpawn;
|
23
web/node_modules/react-dev-utils/errorOverlayMiddleware.js
generated
vendored
Normal file
23
web/node_modules/react-dev-utils/errorOverlayMiddleware.js
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const launchEditor = require('./launchEditor');
|
||||
const launchEditorEndpoint = require('./launchEditorEndpoint');
|
||||
|
||||
module.exports = function createLaunchEditorMiddleware() {
|
||||
return function launchEditorMiddleware(req, res, next) {
|
||||
if (req.url.startsWith(launchEditorEndpoint)) {
|
||||
const lineNumber = parseInt(req.query.lineNumber, 10) || 1;
|
||||
const colNumber = parseInt(req.query.colNumber, 10) || 1;
|
||||
launchEditor(req.query.fileName, lineNumber, colNumber);
|
||||
res.end();
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
};
|
||||
};
|
111
web/node_modules/react-dev-utils/eslintFormatter.js
generated
vendored
Normal file
111
web/node_modules/react-dev-utils/eslintFormatter.js
generated
vendored
Normal file
|
@ -0,0 +1,111 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const chalk = require('chalk');
|
||||
const stripAnsi = require('strip-ansi');
|
||||
const table = require('text-table');
|
||||
|
||||
const cwd = process.cwd();
|
||||
|
||||
const emitErrorsAsWarnings =
|
||||
process.env.NODE_ENV === 'development' &&
|
||||
process.env.ESLINT_NO_DEV_ERRORS === 'true';
|
||||
|
||||
function isError(message) {
|
||||
if (message.fatal || message.severity === 2) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getRelativePath(filePath) {
|
||||
return path.relative(cwd, filePath);
|
||||
}
|
||||
|
||||
function formatter(results) {
|
||||
let output = '\n';
|
||||
let hasErrors = false;
|
||||
let reportContainsErrorRuleIDs = false;
|
||||
|
||||
results.forEach(result => {
|
||||
let messages = result.messages;
|
||||
if (messages.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
messages = messages.map(message => {
|
||||
let messageType;
|
||||
if (isError(message) && !emitErrorsAsWarnings) {
|
||||
messageType = 'error';
|
||||
hasErrors = true;
|
||||
if (message.ruleId) {
|
||||
reportContainsErrorRuleIDs = true;
|
||||
}
|
||||
} else {
|
||||
messageType = 'warn';
|
||||
}
|
||||
|
||||
let line = message.line || 0;
|
||||
if (message.column) {
|
||||
line += ':' + message.column;
|
||||
}
|
||||
let position = chalk.bold('Line ' + line + ':');
|
||||
return [
|
||||
'',
|
||||
position,
|
||||
messageType,
|
||||
message.message.replace(/\.$/, ''),
|
||||
chalk.underline(message.ruleId || ''),
|
||||
];
|
||||
});
|
||||
|
||||
// if there are error messages, we want to show only errors
|
||||
if (hasErrors) {
|
||||
messages = messages.filter(m => m[2] === 'error');
|
||||
}
|
||||
|
||||
// add color to rule keywords
|
||||
messages.forEach(m => {
|
||||
m[4] = m[2] === 'error' ? chalk.red(m[4]) : chalk.yellow(m[4]);
|
||||
m.splice(2, 1);
|
||||
});
|
||||
|
||||
let outputTable = table(messages, {
|
||||
align: ['l', 'l', 'l'],
|
||||
stringLength(str) {
|
||||
return stripAnsi(str).length;
|
||||
},
|
||||
});
|
||||
|
||||
// print the filename and relative path
|
||||
output += `${getRelativePath(result.filePath)}\n`;
|
||||
|
||||
// print the errors
|
||||
output += `${outputTable}\n\n`;
|
||||
});
|
||||
|
||||
if (reportContainsErrorRuleIDs) {
|
||||
// Unlike with warnings, we have to do it here.
|
||||
// We have similar code in react-scripts for warnings,
|
||||
// but warnings can appear in multiple files so we only
|
||||
// print it once at the end. For errors, however, we print
|
||||
// it here because we always show at most one error, and
|
||||
// we can only be sure it's an ESLint error before exiting
|
||||
// this function.
|
||||
output +=
|
||||
'Search for the ' +
|
||||
chalk.underline(chalk.red('keywords')) +
|
||||
' to learn more about each error.';
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
module.exports = formatter;
|
45
web/node_modules/react-dev-utils/evalSourceMapMiddleware.js
generated
vendored
Normal file
45
web/node_modules/react-dev-utils/evalSourceMapMiddleware.js
generated
vendored
Normal file
|
@ -0,0 +1,45 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
function base64SourceMap(source) {
|
||||
const base64 = Buffer.from(JSON.stringify(source.map()), 'utf8').toString(
|
||||
'base64'
|
||||
);
|
||||
return `data:application/json;charset=utf-8;base64,${base64}`;
|
||||
}
|
||||
|
||||
function getSourceById(server, id) {
|
||||
const module = server._stats.compilation.modules.find(m => m.id == id);
|
||||
return module.originalSource();
|
||||
}
|
||||
|
||||
/*
|
||||
* Middleware responsible for retrieving a generated source
|
||||
* Receives a webpack internal url: "webpack-internal:///<module-id>"
|
||||
* Returns a generated source: "<source-text><sourceMappingURL><sourceURL>"
|
||||
*
|
||||
* Based on EvalSourceMapDevToolModuleTemplatePlugin.js
|
||||
*/
|
||||
module.exports = function createEvalSourceMapMiddleware(server) {
|
||||
return function handleWebpackInternalMiddleware(req, res, next) {
|
||||
if (req.url.startsWith('/__get-internal-source')) {
|
||||
const fileName = req.query.fileName;
|
||||
const id = fileName.match(/webpack-internal:\/\/\/(.+)/)[1];
|
||||
if (!id || !server._stats) {
|
||||
next();
|
||||
}
|
||||
|
||||
const source = getSourceById(server, id);
|
||||
const sourceMapURL = `//# sourceMappingURL=${base64SourceMap(source)}`;
|
||||
const sourceURL = `//# sourceURL=webpack-internal:///${module.id}`;
|
||||
res.end(`${source.source()}\n${sourceMapURL}\n${sourceURL}`);
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
};
|
||||
};
|
116
web/node_modules/react-dev-utils/formatWebpackMessages.js
generated
vendored
Normal file
116
web/node_modules/react-dev-utils/formatWebpackMessages.js
generated
vendored
Normal file
|
@ -0,0 +1,116 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const friendlySyntaxErrorLabel = 'Syntax error:';
|
||||
|
||||
function isLikelyASyntaxError(message) {
|
||||
return message.indexOf(friendlySyntaxErrorLabel) !== -1;
|
||||
}
|
||||
|
||||
// Cleans up webpack error messages.
|
||||
function formatMessage(message) {
|
||||
let lines = message.split('\n');
|
||||
|
||||
// Strip webpack-added headers off errors/warnings
|
||||
// https://github.com/webpack/webpack/blob/master/lib/ModuleError.js
|
||||
lines = lines.filter(line => !/Module [A-z ]+\(from/.test(line));
|
||||
|
||||
// Transform parsing error into syntax error
|
||||
// TODO: move this to our ESLint formatter?
|
||||
lines = lines.map(line => {
|
||||
const parsingError = /Line (\d+):(?:(\d+):)?\s*Parsing error: (.+)$/.exec(
|
||||
line
|
||||
);
|
||||
if (!parsingError) {
|
||||
return line;
|
||||
}
|
||||
const [, errorLine, errorColumn, errorMessage] = parsingError;
|
||||
return `${friendlySyntaxErrorLabel} ${errorMessage} (${errorLine}:${errorColumn})`;
|
||||
});
|
||||
|
||||
message = lines.join('\n');
|
||||
// Smoosh syntax errors (commonly found in CSS)
|
||||
message = message.replace(
|
||||
/SyntaxError\s+\((\d+):(\d+)\)\s*(.+?)\n/g,
|
||||
`${friendlySyntaxErrorLabel} $3 ($1:$2)\n`
|
||||
);
|
||||
// Clean up export errors
|
||||
message = message.replace(
|
||||
/^.*export '(.+?)' was not found in '(.+?)'.*$/gm,
|
||||
`Attempted import error: '$1' is not exported from '$2'.`
|
||||
);
|
||||
message = message.replace(
|
||||
/^.*export 'default' \(imported as '(.+?)'\) was not found in '(.+?)'.*$/gm,
|
||||
`Attempted import error: '$2' does not contain a default export (imported as '$1').`
|
||||
);
|
||||
message = message.replace(
|
||||
/^.*export '(.+?)' \(imported as '(.+?)'\) was not found in '(.+?)'.*$/gm,
|
||||
`Attempted import error: '$1' is not exported from '$3' (imported as '$2').`
|
||||
);
|
||||
lines = message.split('\n');
|
||||
|
||||
// Remove leading newline
|
||||
if (lines.length > 2 && lines[1].trim() === '') {
|
||||
lines.splice(1, 1);
|
||||
}
|
||||
// Clean up file name
|
||||
lines[0] = lines[0].replace(/^(.*) \d+:\d+-\d+$/, '$1');
|
||||
|
||||
// Cleans up verbose "module not found" messages for files and packages.
|
||||
if (lines[1] && lines[1].indexOf('Module not found: ') === 0) {
|
||||
lines = [
|
||||
lines[0],
|
||||
lines[1]
|
||||
.replace('Error: ', '')
|
||||
.replace('Module not found: Cannot find file:', 'Cannot find file:'),
|
||||
];
|
||||
}
|
||||
|
||||
// Add helpful message for users trying to use Sass for the first time
|
||||
if (lines[1] && lines[1].match(/Cannot find module.+node-sass/)) {
|
||||
lines[1] = 'To import Sass files, you first need to install node-sass.\n';
|
||||
lines[1] +=
|
||||
'Run `npm install node-sass` or `yarn add node-sass` inside your workspace.';
|
||||
}
|
||||
|
||||
message = lines.join('\n');
|
||||
// Internal stacks are generally useless so we strip them... with the
|
||||
// exception of stacks containing `webpack:` because they're normally
|
||||
// from user code generated by webpack. For more information see
|
||||
// https://github.com/facebook/create-react-app/pull/1050
|
||||
message = message.replace(
|
||||
/^\s*at\s((?!webpack:).)*:\d+:\d+[\s)]*(\n|$)/gm,
|
||||
''
|
||||
); // at ... ...:x:y
|
||||
message = message.replace(/^\s*at\s<anonymous>(\n|$)/gm, ''); // at <anonymous>
|
||||
lines = message.split('\n');
|
||||
|
||||
// Remove duplicated newlines
|
||||
lines = lines.filter(
|
||||
(line, index, arr) =>
|
||||
index === 0 || line.trim() !== '' || line.trim() !== arr[index - 1].trim()
|
||||
);
|
||||
|
||||
// Reassemble the message
|
||||
message = lines.join('\n');
|
||||
return message.trim();
|
||||
}
|
||||
|
||||
function formatWebpackMessages(json) {
|
||||
const formattedErrors = json.errors.map(formatMessage);
|
||||
const formattedWarnings = json.warnings.map(formatMessage);
|
||||
const result = { errors: formattedErrors, warnings: formattedWarnings };
|
||||
if (result.errors.some(isLikelyASyntaxError)) {
|
||||
// If there are any syntax errors, show just them.
|
||||
result.errors = result.errors.filter(isLikelyASyntaxError);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
module.exports = formatWebpackMessages;
|
40
web/node_modules/react-dev-utils/getCSSModuleLocalIdent.js
generated
vendored
Normal file
40
web/node_modules/react-dev-utils/getCSSModuleLocalIdent.js
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const loaderUtils = require('loader-utils');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = function getLocalIdent(
|
||||
context,
|
||||
localIdentName,
|
||||
localName,
|
||||
options
|
||||
) {
|
||||
// Use the filename or folder name, based on some uses the index.js / index.module.(css|scss|sass) project style
|
||||
const fileNameOrFolder = context.resourcePath.match(
|
||||
/index\.module\.(css|scss|sass)$/
|
||||
)
|
||||
? '[folder]'
|
||||
: '[name]';
|
||||
// Create a hash based on a the file location and class name. Will be unique across a project, and close to globally unique.
|
||||
const hash = loaderUtils.getHashDigest(
|
||||
path.posix.relative(context.rootContext, context.resourcePath) + localName,
|
||||
'md5',
|
||||
'base64',
|
||||
5
|
||||
);
|
||||
// Use loaderUtils to find the file or folder name
|
||||
const className = loaderUtils.interpolateName(
|
||||
context,
|
||||
fileNameOrFolder + '_' + localName + '__' + hash,
|
||||
options
|
||||
);
|
||||
// Remove the .module that appears in every classname when based on the file and replace all "." with "_".
|
||||
return className.replace('.module_', '_').replace(/\./g, '_');
|
||||
};
|
21
web/node_modules/react-dev-utils/getCacheIdentifier.js
generated
vendored
Normal file
21
web/node_modules/react-dev-utils/getCacheIdentifier.js
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function getCacheIdentifier(environment, packages) {
|
||||
let cacheIdentifier = environment == null ? '' : environment.toString();
|
||||
for (const packageName of packages) {
|
||||
cacheIdentifier += `:${packageName}@`;
|
||||
try {
|
||||
cacheIdentifier += require(`${packageName}/package.json`).version;
|
||||
} catch (_) {
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
return cacheIdentifier;
|
||||
};
|
85
web/node_modules/react-dev-utils/getProcessForPort.js
generated
vendored
Normal file
85
web/node_modules/react-dev-utils/getProcessForPort.js
generated
vendored
Normal file
|
@ -0,0 +1,85 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var chalk = require('chalk');
|
||||
var execSync = require('child_process').execSync;
|
||||
var execFileSync = require('child_process').execFileSync;
|
||||
var path = require('path');
|
||||
|
||||
var execOptions = {
|
||||
encoding: 'utf8',
|
||||
stdio: [
|
||||
'pipe', // stdin (default)
|
||||
'pipe', // stdout (default)
|
||||
'ignore', //stderr
|
||||
],
|
||||
};
|
||||
|
||||
function isProcessAReactApp(processCommand) {
|
||||
return /^node .*react-scripts\/scripts\/start\.js\s?$/.test(processCommand);
|
||||
}
|
||||
|
||||
function getProcessIdOnPort(port) {
|
||||
return execFileSync('lsof', ['-i:' + port, '-P', '-t', '-sTCP:LISTEN'], execOptions)
|
||||
.split('\n')[0]
|
||||
.trim();
|
||||
}
|
||||
|
||||
function getPackageNameInDirectory(directory) {
|
||||
var packagePath = path.join(directory.trim(), 'package.json');
|
||||
|
||||
try {
|
||||
return require(packagePath).name;
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function getProcessCommand(processId, processDirectory) {
|
||||
var command = execSync(
|
||||
'ps -o command -p ' + processId + ' | sed -n 2p',
|
||||
execOptions
|
||||
);
|
||||
|
||||
command = command.replace(/\n$/, '');
|
||||
|
||||
if (isProcessAReactApp(command)) {
|
||||
const packageName = getPackageNameInDirectory(processDirectory);
|
||||
return packageName ? packageName : command;
|
||||
} else {
|
||||
return command;
|
||||
}
|
||||
}
|
||||
|
||||
function getDirectoryOfProcessById(processId) {
|
||||
return execSync(
|
||||
'lsof -p ' +
|
||||
processId +
|
||||
' | awk \'$4=="cwd" {for (i=9; i<=NF; i++) printf "%s ", $i}\'',
|
||||
execOptions
|
||||
).trim();
|
||||
}
|
||||
|
||||
function getProcessForPort(port) {
|
||||
try {
|
||||
var processId = getProcessIdOnPort(port);
|
||||
var directory = getDirectoryOfProcessById(processId);
|
||||
var command = getProcessCommand(processId, directory);
|
||||
return (
|
||||
chalk.cyan(command) +
|
||||
chalk.grey(' (pid ' + processId + ')\n') +
|
||||
chalk.blue(' in ') +
|
||||
chalk.cyan(directory)
|
||||
);
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = getProcessForPort;
|
65
web/node_modules/react-dev-utils/getPublicUrlOrPath.js
generated
vendored
Normal file
65
web/node_modules/react-dev-utils/getPublicUrlOrPath.js
generated
vendored
Normal file
|
@ -0,0 +1,65 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const { URL } = require('url');
|
||||
|
||||
module.exports = getPublicUrlOrPath;
|
||||
|
||||
/**
|
||||
* Returns a URL or a path with slash at the end
|
||||
* In production can be URL, abolute path, relative path
|
||||
* In development always will be an absolute path
|
||||
* In development can use `path` module functions for operations
|
||||
*
|
||||
* @param {boolean} isEnvDevelopment
|
||||
* @param {(string|undefined)} homepage a valid url or pathname
|
||||
* @param {(string|undefined)} envPublicUrl a valid url or pathname
|
||||
* @returns {string}
|
||||
*/
|
||||
function getPublicUrlOrPath(isEnvDevelopment, homepage, envPublicUrl) {
|
||||
const stubDomain = 'https://create-react-app.dev';
|
||||
|
||||
if (envPublicUrl) {
|
||||
// ensure last slash exists
|
||||
envPublicUrl = envPublicUrl.endsWith('/')
|
||||
? envPublicUrl
|
||||
: envPublicUrl + '/';
|
||||
|
||||
// validate if `envPublicUrl` is a URL or path like
|
||||
// `stubDomain` is ignored if `envPublicUrl` contains a domain
|
||||
const validPublicUrl = new URL(envPublicUrl, stubDomain);
|
||||
|
||||
return isEnvDevelopment
|
||||
? envPublicUrl.startsWith('.')
|
||||
? '/'
|
||||
: validPublicUrl.pathname
|
||||
: // Some apps do not use client-side routing with pushState.
|
||||
// For these, "homepage" can be set to "." to enable relative asset paths.
|
||||
envPublicUrl;
|
||||
}
|
||||
|
||||
if (homepage) {
|
||||
// strip last slash if exists
|
||||
homepage = homepage.endsWith('/') ? homepage : homepage + '/';
|
||||
|
||||
// validate if `homepage` is a URL or path like and use just pathname
|
||||
const validHomepagePathname = new URL(homepage, stubDomain).pathname;
|
||||
return isEnvDevelopment
|
||||
? homepage.startsWith('.')
|
||||
? '/'
|
||||
: validHomepagePathname
|
||||
: // Some apps do not use client-side routing with pushState.
|
||||
// For these, "homepage" can be set to "." to enable relative asset paths.
|
||||
homepage.startsWith('.')
|
||||
? homepage
|
||||
: validHomepagePathname;
|
||||
}
|
||||
|
||||
return '/';
|
||||
}
|
12
web/node_modules/react-dev-utils/globby.js
generated
vendored
Normal file
12
web/node_modules/react-dev-utils/globby.js
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var globby = require('globby');
|
||||
|
||||
module.exports = globby;
|
20
web/node_modules/react-dev-utils/ignoredFiles.js
generated
vendored
Normal file
20
web/node_modules/react-dev-utils/ignoredFiles.js
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const escape = require('escape-string-regexp');
|
||||
|
||||
module.exports = function ignoredFiles(appSrc) {
|
||||
return new RegExp(
|
||||
`^(?!${escape(
|
||||
path.normalize(appSrc + '/').replace(/[\\]+/g, '/')
|
||||
)}).+/node_modules/`,
|
||||
'g'
|
||||
);
|
||||
};
|
12
web/node_modules/react-dev-utils/immer.js
generated
vendored
Normal file
12
web/node_modules/react-dev-utils/immer.js
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var immer = require('immer');
|
||||
|
||||
module.exports = immer;
|
399
web/node_modules/react-dev-utils/launchEditor.js
generated
vendored
Normal file
399
web/node_modules/react-dev-utils/launchEditor.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
10
web/node_modules/react-dev-utils/launchEditorEndpoint.js
generated
vendored
Normal file
10
web/node_modules/react-dev-utils/launchEditorEndpoint.js
generated
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
// TODO: we might want to make this injectable to support DEV-time non-root URLs.
|
||||
module.exports = '/__open-stack-frame-in-editor';
|
1
web/node_modules/react-dev-utils/node_modules/.bin/browserslist
generated
vendored
Symbolic link
1
web/node_modules/react-dev-utils/node_modules/.bin/browserslist
generated
vendored
Symbolic link
|
@ -0,0 +1 @@
|
|||
../browserslist/cli.js
|
22
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/LICENSE
generated
vendored
Normal file
22
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
||||
|
||||
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.
|
19
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/README.md
generated
vendored
Normal file
19
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/README.md
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
# @babel/code-frame
|
||||
|
||||
> Generate errors that contain a code frame that point to source locations.
|
||||
|
||||
See our website [@babel/code-frame](https://babeljs.io/docs/en/next/babel-code-frame.html) for more information.
|
||||
|
||||
## Install
|
||||
|
||||
Using npm:
|
||||
|
||||
```sh
|
||||
npm install --save-dev @babel/code-frame
|
||||
```
|
||||
|
||||
or using yarn:
|
||||
|
||||
```sh
|
||||
yarn add @babel/code-frame --dev
|
||||
```
|
167
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/lib/index.js
generated
vendored
Normal file
167
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/lib/index.js
generated
vendored
Normal file
|
@ -0,0 +1,167 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.codeFrameColumns = codeFrameColumns;
|
||||
exports.default = _default;
|
||||
|
||||
var _highlight = _interopRequireWildcard(require("@babel/highlight"));
|
||||
|
||||
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||||
|
||||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||||
|
||||
let deprecationWarningShown = false;
|
||||
|
||||
function getDefs(chalk) {
|
||||
return {
|
||||
gutter: chalk.grey,
|
||||
marker: chalk.red.bold,
|
||||
message: chalk.red.bold
|
||||
};
|
||||
}
|
||||
|
||||
const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
|
||||
|
||||
function getMarkerLines(loc, source, opts) {
|
||||
const startLoc = Object.assign({
|
||||
column: 0,
|
||||
line: -1
|
||||
}, loc.start);
|
||||
const endLoc = Object.assign({}, startLoc, loc.end);
|
||||
const {
|
||||
linesAbove = 2,
|
||||
linesBelow = 3
|
||||
} = opts || {};
|
||||
const startLine = startLoc.line;
|
||||
const startColumn = startLoc.column;
|
||||
const endLine = endLoc.line;
|
||||
const endColumn = endLoc.column;
|
||||
let start = Math.max(startLine - (linesAbove + 1), 0);
|
||||
let end = Math.min(source.length, endLine + linesBelow);
|
||||
|
||||
if (startLine === -1) {
|
||||
start = 0;
|
||||
}
|
||||
|
||||
if (endLine === -1) {
|
||||
end = source.length;
|
||||
}
|
||||
|
||||
const lineDiff = endLine - startLine;
|
||||
const markerLines = {};
|
||||
|
||||
if (lineDiff) {
|
||||
for (let i = 0; i <= lineDiff; i++) {
|
||||
const lineNumber = i + startLine;
|
||||
|
||||
if (!startColumn) {
|
||||
markerLines[lineNumber] = true;
|
||||
} else if (i === 0) {
|
||||
const sourceLength = source[lineNumber - 1].length;
|
||||
markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];
|
||||
} else if (i === lineDiff) {
|
||||
markerLines[lineNumber] = [0, endColumn];
|
||||
} else {
|
||||
const sourceLength = source[lineNumber - i].length;
|
||||
markerLines[lineNumber] = [0, sourceLength];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (startColumn === endColumn) {
|
||||
if (startColumn) {
|
||||
markerLines[startLine] = [startColumn, 0];
|
||||
} else {
|
||||
markerLines[startLine] = true;
|
||||
}
|
||||
} else {
|
||||
markerLines[startLine] = [startColumn, endColumn - startColumn];
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
start,
|
||||
end,
|
||||
markerLines
|
||||
};
|
||||
}
|
||||
|
||||
function codeFrameColumns(rawLines, loc, opts = {}) {
|
||||
const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts);
|
||||
const chalk = (0, _highlight.getChalk)(opts);
|
||||
const defs = getDefs(chalk);
|
||||
|
||||
const maybeHighlight = (chalkFn, string) => {
|
||||
return highlighted ? chalkFn(string) : string;
|
||||
};
|
||||
|
||||
const lines = rawLines.split(NEWLINE);
|
||||
const {
|
||||
start,
|
||||
end,
|
||||
markerLines
|
||||
} = getMarkerLines(loc, lines, opts);
|
||||
const hasColumns = loc.start && typeof loc.start.column === "number";
|
||||
const numberMaxWidth = String(end).length;
|
||||
const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines;
|
||||
let frame = highlightedLines.split(NEWLINE).slice(start, end).map((line, index) => {
|
||||
const number = start + 1 + index;
|
||||
const paddedNumber = ` ${number}`.slice(-numberMaxWidth);
|
||||
const gutter = ` ${paddedNumber} | `;
|
||||
const hasMarker = markerLines[number];
|
||||
const lastMarkerLine = !markerLines[number + 1];
|
||||
|
||||
if (hasMarker) {
|
||||
let markerLine = "";
|
||||
|
||||
if (Array.isArray(hasMarker)) {
|
||||
const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
|
||||
const numberOfMarkers = hasMarker[1] || 1;
|
||||
markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join("");
|
||||
|
||||
if (lastMarkerLine && opts.message) {
|
||||
markerLine += " " + maybeHighlight(defs.message, opts.message);
|
||||
}
|
||||
}
|
||||
|
||||
return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join("");
|
||||
} else {
|
||||
return ` ${maybeHighlight(defs.gutter, gutter)}${line}`;
|
||||
}
|
||||
}).join("\n");
|
||||
|
||||
if (opts.message && !hasColumns) {
|
||||
frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`;
|
||||
}
|
||||
|
||||
if (highlighted) {
|
||||
return chalk.reset(frame);
|
||||
} else {
|
||||
return frame;
|
||||
}
|
||||
}
|
||||
|
||||
function _default(rawLines, lineNumber, colNumber, opts = {}) {
|
||||
if (!deprecationWarningShown) {
|
||||
deprecationWarningShown = true;
|
||||
const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.";
|
||||
|
||||
if (process.emitWarning) {
|
||||
process.emitWarning(message, "DeprecationWarning");
|
||||
} else {
|
||||
const deprecationError = new Error(message);
|
||||
deprecationError.name = "DeprecationWarning";
|
||||
console.warn(new Error(message));
|
||||
}
|
||||
}
|
||||
|
||||
colNumber = Math.max(colNumber, 0);
|
||||
const location = {
|
||||
start: {
|
||||
column: colNumber,
|
||||
line: lineNumber
|
||||
}
|
||||
};
|
||||
return codeFrameColumns(rawLines, location, opts);
|
||||
}
|
25
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/package.json
generated
vendored
Normal file
25
web/node_modules/react-dev-utils/node_modules/@babel/code-frame/package.json
generated
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "@babel/code-frame",
|
||||
"version": "7.10.4",
|
||||
"description": "Generate errors that contain a code frame that point to source locations.",
|
||||
"author": "Sebastian McKenzie <sebmck@gmail.com>",
|
||||
"homepage": "https://babeljs.io/",
|
||||
"license": "MIT",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/babel/babel.git",
|
||||
"directory": "packages/babel-code-frame"
|
||||
},
|
||||
"main": "lib/index.js",
|
||||
"dependencies": {
|
||||
"@babel/highlight": "^7.10.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"chalk": "^2.0.0",
|
||||
"strip-ansi": "^4.0.0"
|
||||
},
|
||||
"gitHead": "7fd40d86a0d03ff0e9c3ea16b29689945433d4df"
|
||||
}
|
165
web/node_modules/react-dev-utils/node_modules/ansi-styles/index.js
generated
vendored
Normal file
165
web/node_modules/react-dev-utils/node_modules/ansi-styles/index.js
generated
vendored
Normal file
|
@ -0,0 +1,165 @@
|
|||
'use strict';
|
||||
const colorConvert = require('color-convert');
|
||||
|
||||
const wrapAnsi16 = (fn, offset) => function () {
|
||||
const code = fn.apply(colorConvert, arguments);
|
||||
return `\u001B[${code + offset}m`;
|
||||
};
|
||||
|
||||
const wrapAnsi256 = (fn, offset) => function () {
|
||||
const code = fn.apply(colorConvert, arguments);
|
||||
return `\u001B[${38 + offset};5;${code}m`;
|
||||
};
|
||||
|
||||
const wrapAnsi16m = (fn, offset) => function () {
|
||||
const rgb = fn.apply(colorConvert, arguments);
|
||||
return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
|
||||
};
|
||||
|
||||
function assembleStyles() {
|
||||
const codes = new Map();
|
||||
const styles = {
|
||||
modifier: {
|
||||
reset: [0, 0],
|
||||
// 21 isn't widely supported and 22 does the same thing
|
||||
bold: [1, 22],
|
||||
dim: [2, 22],
|
||||
italic: [3, 23],
|
||||
underline: [4, 24],
|
||||
inverse: [7, 27],
|
||||
hidden: [8, 28],
|
||||
strikethrough: [9, 29]
|
||||
},
|
||||
color: {
|
||||
black: [30, 39],
|
||||
red: [31, 39],
|
||||
green: [32, 39],
|
||||
yellow: [33, 39],
|
||||
blue: [34, 39],
|
||||
magenta: [35, 39],
|
||||
cyan: [36, 39],
|
||||
white: [37, 39],
|
||||
gray: [90, 39],
|
||||
|
||||
// Bright color
|
||||
redBright: [91, 39],
|
||||
greenBright: [92, 39],
|
||||
yellowBright: [93, 39],
|
||||
blueBright: [94, 39],
|
||||
magentaBright: [95, 39],
|
||||
cyanBright: [96, 39],
|
||||
whiteBright: [97, 39]
|
||||
},
|
||||
bgColor: {
|
||||
bgBlack: [40, 49],
|
||||
bgRed: [41, 49],
|
||||
bgGreen: [42, 49],
|
||||
bgYellow: [43, 49],
|
||||
bgBlue: [44, 49],
|
||||
bgMagenta: [45, 49],
|
||||
bgCyan: [46, 49],
|
||||
bgWhite: [47, 49],
|
||||
|
||||
// Bright color
|
||||
bgBlackBright: [100, 49],
|
||||
bgRedBright: [101, 49],
|
||||
bgGreenBright: [102, 49],
|
||||
bgYellowBright: [103, 49],
|
||||
bgBlueBright: [104, 49],
|
||||
bgMagentaBright: [105, 49],
|
||||
bgCyanBright: [106, 49],
|
||||
bgWhiteBright: [107, 49]
|
||||
}
|
||||
};
|
||||
|
||||
// Fix humans
|
||||
styles.color.grey = styles.color.gray;
|
||||
|
||||
for (const groupName of Object.keys(styles)) {
|
||||
const group = styles[groupName];
|
||||
|
||||
for (const styleName of Object.keys(group)) {
|
||||
const style = group[styleName];
|
||||
|
||||
styles[styleName] = {
|
||||
open: `\u001B[${style[0]}m`,
|
||||
close: `\u001B[${style[1]}m`
|
||||
};
|
||||
|
||||
group[styleName] = styles[styleName];
|
||||
|
||||
codes.set(style[0], style[1]);
|
||||
}
|
||||
|
||||
Object.defineProperty(styles, groupName, {
|
||||
value: group,
|
||||
enumerable: false
|
||||
});
|
||||
|
||||
Object.defineProperty(styles, 'codes', {
|
||||
value: codes,
|
||||
enumerable: false
|
||||
});
|
||||
}
|
||||
|
||||
const ansi2ansi = n => n;
|
||||
const rgb2rgb = (r, g, b) => [r, g, b];
|
||||
|
||||
styles.color.close = '\u001B[39m';
|
||||
styles.bgColor.close = '\u001B[49m';
|
||||
|
||||
styles.color.ansi = {
|
||||
ansi: wrapAnsi16(ansi2ansi, 0)
|
||||
};
|
||||
styles.color.ansi256 = {
|
||||
ansi256: wrapAnsi256(ansi2ansi, 0)
|
||||
};
|
||||
styles.color.ansi16m = {
|
||||
rgb: wrapAnsi16m(rgb2rgb, 0)
|
||||
};
|
||||
|
||||
styles.bgColor.ansi = {
|
||||
ansi: wrapAnsi16(ansi2ansi, 10)
|
||||
};
|
||||
styles.bgColor.ansi256 = {
|
||||
ansi256: wrapAnsi256(ansi2ansi, 10)
|
||||
};
|
||||
styles.bgColor.ansi16m = {
|
||||
rgb: wrapAnsi16m(rgb2rgb, 10)
|
||||
};
|
||||
|
||||
for (let key of Object.keys(colorConvert)) {
|
||||
if (typeof colorConvert[key] !== 'object') {
|
||||
continue;
|
||||
}
|
||||
|
||||
const suite = colorConvert[key];
|
||||
|
||||
if (key === 'ansi16') {
|
||||
key = 'ansi';
|
||||
}
|
||||
|
||||
if ('ansi16' in suite) {
|
||||
styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
|
||||
styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
|
||||
}
|
||||
|
||||
if ('ansi256' in suite) {
|
||||
styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
|
||||
styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
|
||||
}
|
||||
|
||||
if ('rgb' in suite) {
|
||||
styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
|
||||
styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
|
||||
}
|
||||
}
|
||||
|
||||
return styles;
|
||||
}
|
||||
|
||||
// Make the export immutable
|
||||
Object.defineProperty(module, 'exports', {
|
||||
enumerable: true,
|
||||
get: assembleStyles
|
||||
});
|
9
web/node_modules/react-dev-utils/node_modules/ansi-styles/license
generated
vendored
Normal file
9
web/node_modules/react-dev-utils/node_modules/ansi-styles/license
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
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.
|
56
web/node_modules/react-dev-utils/node_modules/ansi-styles/package.json
generated
vendored
Normal file
56
web/node_modules/react-dev-utils/node_modules/ansi-styles/package.json
generated
vendored
Normal file
|
@ -0,0 +1,56 @@
|
|||
{
|
||||
"name": "ansi-styles",
|
||||
"version": "3.2.1",
|
||||
"description": "ANSI escape codes for styling strings in the terminal",
|
||||
"license": "MIT",
|
||||
"repository": "chalk/ansi-styles",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava",
|
||||
"screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"keywords": [
|
||||
"ansi",
|
||||
"styles",
|
||||
"color",
|
||||
"colour",
|
||||
"colors",
|
||||
"terminal",
|
||||
"console",
|
||||
"cli",
|
||||
"string",
|
||||
"tty",
|
||||
"escape",
|
||||
"formatting",
|
||||
"rgb",
|
||||
"256",
|
||||
"shell",
|
||||
"xterm",
|
||||
"log",
|
||||
"logging",
|
||||
"command-line",
|
||||
"text"
|
||||
],
|
||||
"dependencies": {
|
||||
"color-convert": "^1.9.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ava": "*",
|
||||
"babel-polyfill": "^6.23.0",
|
||||
"svg-term-cli": "^2.1.1",
|
||||
"xo": "*"
|
||||
},
|
||||
"ava": {
|
||||
"require": "babel-polyfill"
|
||||
}
|
||||
}
|
147
web/node_modules/react-dev-utils/node_modules/ansi-styles/readme.md
generated
vendored
Normal file
147
web/node_modules/react-dev-utils/node_modules/ansi-styles/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,147 @@
|
|||
# ansi-styles [](https://travis-ci.org/chalk/ansi-styles)
|
||||
|
||||
> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
|
||||
|
||||
You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
|
||||
|
||||
<img src="https://cdn.rawgit.com/chalk/ansi-styles/8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" width="900">
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install ansi-styles
|
||||
```
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const style = require('ansi-styles');
|
||||
|
||||
console.log(`${style.green.open}Hello world!${style.green.close}`);
|
||||
|
||||
|
||||
// Color conversion between 16/256/truecolor
|
||||
// NOTE: If conversion goes to 16 colors or 256 colors, the original color
|
||||
// may be degraded to fit that color palette. This means terminals
|
||||
// that do not support 16 million colors will best-match the
|
||||
// original color.
|
||||
console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close);
|
||||
console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close);
|
||||
console.log(style.color.ansi16m.hex('#ABCDEF') + 'Hello world!' + style.color.close);
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
Each style has an `open` and `close` property.
|
||||
|
||||
|
||||
## Styles
|
||||
|
||||
### Modifiers
|
||||
|
||||
- `reset`
|
||||
- `bold`
|
||||
- `dim`
|
||||
- `italic` *(Not widely supported)*
|
||||
- `underline`
|
||||
- `inverse`
|
||||
- `hidden`
|
||||
- `strikethrough` *(Not widely supported)*
|
||||
|
||||
### Colors
|
||||
|
||||
- `black`
|
||||
- `red`
|
||||
- `green`
|
||||
- `yellow`
|
||||
- `blue`
|
||||
- `magenta`
|
||||
- `cyan`
|
||||
- `white`
|
||||
- `gray` ("bright black")
|
||||
- `redBright`
|
||||
- `greenBright`
|
||||
- `yellowBright`
|
||||
- `blueBright`
|
||||
- `magentaBright`
|
||||
- `cyanBright`
|
||||
- `whiteBright`
|
||||
|
||||
### Background colors
|
||||
|
||||
- `bgBlack`
|
||||
- `bgRed`
|
||||
- `bgGreen`
|
||||
- `bgYellow`
|
||||
- `bgBlue`
|
||||
- `bgMagenta`
|
||||
- `bgCyan`
|
||||
- `bgWhite`
|
||||
- `bgBlackBright`
|
||||
- `bgRedBright`
|
||||
- `bgGreenBright`
|
||||
- `bgYellowBright`
|
||||
- `bgBlueBright`
|
||||
- `bgMagentaBright`
|
||||
- `bgCyanBright`
|
||||
- `bgWhiteBright`
|
||||
|
||||
|
||||
## Advanced usage
|
||||
|
||||
By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
|
||||
|
||||
- `style.modifier`
|
||||
- `style.color`
|
||||
- `style.bgColor`
|
||||
|
||||
###### Example
|
||||
|
||||
```js
|
||||
console.log(style.color.green.open);
|
||||
```
|
||||
|
||||
Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values.
|
||||
|
||||
###### Example
|
||||
|
||||
```js
|
||||
console.log(style.codes.get(36));
|
||||
//=> 39
|
||||
```
|
||||
|
||||
|
||||
## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728)
|
||||
|
||||
`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors.
|
||||
|
||||
To use these, call the associated conversion function with the intended output, for example:
|
||||
|
||||
```js
|
||||
style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code
|
||||
style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code
|
||||
|
||||
style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
|
||||
style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
|
||||
|
||||
style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code
|
||||
style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code
|
||||
```
|
||||
|
||||
|
||||
## Related
|
||||
|
||||
- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal
|
||||
|
||||
|
||||
## Maintainers
|
||||
|
||||
- [Sindre Sorhus](https://github.com/sindresorhus)
|
||||
- [Josh Junon](https://github.com/qix-)
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
480
web/node_modules/react-dev-utils/node_modules/browserslist/CHANGELOG.md
generated
vendored
Normal file
480
web/node_modules/react-dev-utils/node_modules/browserslist/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,480 @@
|
|||
# Change Log
|
||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## 4.14.2
|
||||
* Fixed `--update-db` on Windows (by James Ross).
|
||||
* Improved `--update-db` output.
|
||||
|
||||
## 4.14.1
|
||||
* Added `--update-db` explanation (by Justin Zelinsky).
|
||||
|
||||
## 4.14
|
||||
* Add `BROWSERSLIST_DANGEROUS_EXTEND` support (by Timo Mayer).
|
||||
|
||||
## 4.13
|
||||
* Added `supports` query to select browsers (by Jesús Leganés-Combarro).
|
||||
|
||||
## 4.12.2
|
||||
* Update Firefox ESR.
|
||||
|
||||
## 4.12.1
|
||||
* Update `package.json` scanning tool for `--update-db` (by Luke Edwards).
|
||||
* Improve docs (by Mukundan Senthil).
|
||||
* Drop Node.js 13.0-13.6 support because of ES modules bug in that versions.
|
||||
|
||||
## 4.12
|
||||
* Add environments to shared configs (by Yevgeny Petukhov).
|
||||
* Fix docs (by Dmitry Statsenko and Thomas Pozzo di Borgo).
|
||||
|
||||
## 4.11.1
|
||||
* Fix Node.js 6 support.
|
||||
|
||||
## 4.11
|
||||
* Add `npx browserslist --mobile-to-desktop` (by James Ross).
|
||||
|
||||
## 4.10
|
||||
* Add `npx browserslist --update-db` (by Ivan Solovev).
|
||||
|
||||
## 4.9.1
|
||||
* Normalize incorrect Can I Use regional data (by Huáng Jùnliàng).
|
||||
|
||||
## 4.9
|
||||
* Add `node X-Y` query support (by Yuping Zuo).
|
||||
|
||||
## 4.8.7
|
||||
* Fix `last N major versions` (by Valeriy Trubachev).
|
||||
|
||||
## 4.8.6
|
||||
* Fix `Unknown version 10 of op_mob` error in `mobileToDesktop` option.
|
||||
|
||||
## 4.8.5
|
||||
* Fix `last N browsers` again after new `caniuse-db` API changes.
|
||||
|
||||
## 4.8.4
|
||||
* Fix released versions detection for queries like `last N browsers`.
|
||||
* Add IE 11 Mobile to `dead` browsers.
|
||||
|
||||
## 4.8.3
|
||||
* Fix warning message (by Anton Ivanov).
|
||||
|
||||
## 4.8.2
|
||||
* Fix `Cannot convert undefined or null to object` (by Antoine Clausse).
|
||||
* Fix `mobileToDesktop` in `defaults` (by Huáng Jùnliàng).
|
||||
|
||||
## 4.8.1
|
||||
* Fix Chrome and `mobileToDesktop` (by Huáng Jùnliàng).
|
||||
|
||||
## 4.8
|
||||
* Add `> 5% in browserslist-config-my stats` query (by Andrew Leedham).
|
||||
* Improve docs (by Danny van Kooten).
|
||||
|
||||
## 4.7.3
|
||||
* Add funding link for `npm fund`.
|
||||
|
||||
## 4.7.2
|
||||
* Add cache for query parsing.
|
||||
* Improve config caching (by Kārlis Gaņģis).
|
||||
* Update Firefox ESR.
|
||||
|
||||
## 4.7.1
|
||||
* Improve caching.
|
||||
|
||||
## 4.7
|
||||
* Add PhantomJS queries.
|
||||
* Improve docs (by Dorian Koehring).
|
||||
|
||||
## 4.6.6
|
||||
* Remove Safari from `dead` query.
|
||||
|
||||
## 4.6.5
|
||||
* Add Samsung 4 browser to `dead` query.
|
||||
* Remove dirty fix for `android all` error.
|
||||
|
||||
## 4.6.4
|
||||
* Add Firefox 68 to `Firefox ESR` query.
|
||||
|
||||
## 4.6.3
|
||||
* Dirty fix for `android all` error.
|
||||
|
||||
## 4.6.2
|
||||
* Fix `last x version` and similar queries for Android (by Tony Ross).
|
||||
|
||||
## 4.6.1
|
||||
* Fix patch version support for Electron (by Kilian Valkhof).
|
||||
|
||||
## 4.6
|
||||
* Add `mobileToDesktop` option (by Nicolò Ribaudo).
|
||||
|
||||
## 4.5.6
|
||||
* Make `Node > 5` and `node > 5` queries case insensitive.
|
||||
|
||||
## 4.5.5
|
||||
* Fix CLI help (by Marcel Gerber).
|
||||
* Add KaiOS browser to docs.
|
||||
|
||||
## 4.5.4
|
||||
* Update docs (by Andrew Leedham and Dan Onoshko).
|
||||
|
||||
## 4.5.3
|
||||
* Fix splitting string to queries.
|
||||
|
||||
## 4.5.2
|
||||
* Show default browsers in CLI on project without config.
|
||||
|
||||
## 4.5.1
|
||||
* Improve text for the warning about outdated `caniuse-lite`.
|
||||
|
||||
## 4.5
|
||||
* Add `>=`, `>`, and `<=` support for Node.js version (by Mathspy Terabithian).
|
||||
|
||||
## 4.4.2
|
||||
* Allow to have string in `package.json` (by @dmarkhas).
|
||||
|
||||
## 4.4.1
|
||||
* Allow to use `.` in scope name of shareable config (by Gustav Nikolaj).
|
||||
|
||||
## 4.4
|
||||
* Added `and` and `or` keywords to combine queries (by Jon Ege Ronnenberg).
|
||||
|
||||
## 4.3.7
|
||||
* Fix fraction years support in `last 1.5 years` (by Clément P).
|
||||
* Fix version-less browser support.
|
||||
|
||||
## 4.3.6
|
||||
* Fix version-less browser support in custom statistics (by Alex Walter).
|
||||
|
||||
## 4.3.5
|
||||
* Fix `not` query for wrong Can I Use data.
|
||||
|
||||
## 4.3.4
|
||||
* Allow to update `node-releases` without new Browserslist releases.
|
||||
|
||||
## 4.3.3
|
||||
* Fix Node.js 11 support.
|
||||
|
||||
## 4.3.2
|
||||
* Fix `Unknown version 11 of Node.js` error (by Dan Onoshko).
|
||||
|
||||
## 4.3.1
|
||||
* Fix conflict between `caniuse-lite` and custom browsers statistics.
|
||||
|
||||
## 4.3
|
||||
* Allow to use `extends browserslist-config-a/file` (by @Schweinepriester).
|
||||
|
||||
## 4.2.1
|
||||
* Use new `node-releases` support (by Sergey Rubanov).
|
||||
|
||||
## 4.2
|
||||
* Add `--json` argument for CLI.
|
||||
* Allow to pass multiple areas in CLI by `--coverage=US,alt-AS,global`.
|
||||
|
||||
## 4.1.2
|
||||
* Better `unknow query` error message.
|
||||
* Use latest `node-releases`.
|
||||
|
||||
## 4.1.1
|
||||
* Update Firefox ESR versions.
|
||||
|
||||
## 4.1
|
||||
* Add `current node` query.
|
||||
* Add contributors widget to docs (by Sergey Surkov).
|
||||
|
||||
## 4.0.2
|
||||
* Fix new `node-releases` support (by Sergey Rubanov).
|
||||
* Fix error text (by Josh Smith).
|
||||
|
||||
## 4.0.1
|
||||
* Reduce npm package size.
|
||||
* Fix docs.
|
||||
|
||||
## 4.0.0 “Erinaceus amurensis”
|
||||
* Add `node X` and `maintained node versions` queries (by Pavel Vostrikov).
|
||||
* Remove Node.js 4 support.
|
||||
* Show warning if `caniuse-lite` is old (by Anton Tuzhik).
|
||||
* Add comma support in config file.
|
||||
|
||||
## 3.2.8
|
||||
* Add IE 9-5.5 to dead browsers.
|
||||
* Remove development configs from npm package.
|
||||
|
||||
## 3.2.7
|
||||
* Add Firefox 60 as Firefox ESR.
|
||||
|
||||
## 3.2.6
|
||||
* Add Opera Mini 12 to dead browsers.
|
||||
* Update docs (by Jamie Kyle).
|
||||
|
||||
## 3.2.5
|
||||
* Fix excluding Opera Mini and other browsers with `all` version.
|
||||
|
||||
## 3.2.4
|
||||
* Resolve shareable config from current working directory.
|
||||
|
||||
## 3.2.3
|
||||
* Fix `package.json` config validation for single string case.
|
||||
* Fix CLI error reporting.
|
||||
|
||||
## 3.2.2
|
||||
* Add `package.json` config validation.
|
||||
* Move project to `browserlist` GitHub organization.
|
||||
|
||||
## 3.2.1
|
||||
* Fix error text (by Steve Schrab).
|
||||
|
||||
## 3.2
|
||||
* Add `cover 99%` query (by Vasily Fedoseyev).
|
||||
* Add `cover 99% in US` query (by Vasily Fedoseyev).
|
||||
* Add `cover 99% in my stats` query (by Vasily Fedoseyev).
|
||||
* Add `"my stats"` support to `browserlist.coverage()` (by Vasily Fedoseyev).
|
||||
|
||||
## 3.1.2
|
||||
* Add more clear error on missed browser version.
|
||||
|
||||
## 3.1.1
|
||||
* Fix JSDoc (by Sylvain Pollet-Villard).
|
||||
|
||||
## 3.1
|
||||
* Add `ignoreUnknownVersions` option.
|
||||
* Fix docs (by Pascal Duez).
|
||||
|
||||
## 3.0 “Atelerix sclateri”
|
||||
* Remove country statistics from client-side build of Browserslist.
|
||||
* Change `> 1%` to `> 0.5%` in default query.
|
||||
* Add `not dead` to default query.
|
||||
* Change default environment to `production` (by Marco Fugaro).
|
||||
* Add `dead` query support with IE 10 and BlackBerry browser.
|
||||
* Add multiple environments in one section support (by Evilebot Tnawi).
|
||||
* Add custom statistics support to `browserlist.coverage()`.
|
||||
* Fix `path` option check.
|
||||
|
||||
## 2.11.3
|
||||
* Fix for `path: undefined` option.
|
||||
|
||||
## 2.11.2
|
||||
* Remove Node.js specific code from webpack build.
|
||||
|
||||
## 2.11.1
|
||||
* Fix using Browserslist in browser with `path` but without `fs`.
|
||||
|
||||
## 2.11
|
||||
* Add `last 2 years` query support (by James Harris).
|
||||
|
||||
## 2.10.2
|
||||
* Fix Browserify support.
|
||||
|
||||
## 2.10.1
|
||||
* Fix using Browserslist without `process` (by Andrew Patton).
|
||||
|
||||
## 2.10
|
||||
* Add `< 1%` and `<= 1%` queries support (by August Kaiser).
|
||||
|
||||
## 2.9.1
|
||||
* Fix unknown query on trailing spaces in query.
|
||||
|
||||
## 2.9
|
||||
* Add `last Electron versions` and `last Electron major versions` queries
|
||||
(by Louis Mouhat).
|
||||
|
||||
## 2.8
|
||||
* Add `since 2016-03` and `since 2016-03-20` queries support (by Andrew Blick).
|
||||
|
||||
## 2.7
|
||||
* Add `since 2016` queries support (by Igor Deryabin).
|
||||
|
||||
## 2.6.1
|
||||
* Fix `Path must be a string` error.
|
||||
|
||||
## 2.6
|
||||
* By default load config from current directory in CLI tool.
|
||||
|
||||
## 2.5.1
|
||||
* Allow `@scope/browserlist-config` config name (by Jamie Connolly).
|
||||
|
||||
## 2.5
|
||||
* Add `extends` query (by YellowKirby).
|
||||
|
||||
## 2.4.1
|
||||
* Throw error if `package.json` contain `browserlist` instead of `browserslist`.
|
||||
|
||||
## 2.4
|
||||
* Add `last n major versions` query (by John Sanders).
|
||||
|
||||
## 2.3.3
|
||||
* Fix browsers support.
|
||||
|
||||
## 2.3.2
|
||||
* Fix `> 0` query for browsers with one version (by Nikolay Solovyov).
|
||||
|
||||
## 2.3.1
|
||||
* Reduce library size.
|
||||
|
||||
## 2.3
|
||||
* Add `unreleased versions` and `unreleased Chrome versions` queries.
|
||||
|
||||
## 2.2.2
|
||||
* Fix `Path must be a string` error (by Pieter Beulque).
|
||||
|
||||
## 2.2.1
|
||||
* Fix security issue with regions dynamic `require`.
|
||||
|
||||
## 2.2
|
||||
* Add region usage statistics support (by Clément P).
|
||||
|
||||
## 2.1.5
|
||||
* Remove Firefox 45 from Firefox ESR.
|
||||
|
||||
## 2.1.4
|
||||
* Use both ESR versions when they actual.
|
||||
|
||||
## 2.1.3
|
||||
* Add warning on first exclude query.
|
||||
|
||||
## 2.1.2
|
||||
* Fix non-Node.js environments support.
|
||||
|
||||
## 2.1.1
|
||||
* Fix CLI arguments parsing.
|
||||
|
||||
## 2.1
|
||||
* Add `>= 5%`, `>= 5% in US` and `>= 5% in my stats` queries.
|
||||
|
||||
## 2.0 “Atelerix frontalis”
|
||||
* `last n versions` returns versions for all browsers, not only main browsers.
|
||||
* Cache file system operations (by Aarni Koskela).
|
||||
* Use `caniuse-lite` 1 MB instead of `caniuse-db` 7 MB (by Ben Briggs).
|
||||
* Add `.browserslistrc` config support.
|
||||
* Add QQ Browser for Android support.
|
||||
* Add tests for CLI (by Zhulduz Zhankenova).
|
||||
|
||||
## 1.7.7
|
||||
* Update Firefox ESR.
|
||||
|
||||
## 1.7.6
|
||||
* Fix Android Chrome selection.
|
||||
|
||||
## 1.7.5
|
||||
* Fix combining `not` query with country based statistics.
|
||||
* Fix `--env` argument in CLI (by Tuure Savuoja).
|
||||
|
||||
## 1.7.4
|
||||
* Speed up browser sorting (by Aarni Koskela).
|
||||
|
||||
## 1.7.3
|
||||
* Fix config finding when directory was passed to `path` (by Aarni Koskela).
|
||||
|
||||
## 1.7.2
|
||||
* Fix config finding algorithm (by Aarni Koskela).
|
||||
|
||||
## 1.7.1
|
||||
* Fix unreleased browsers version detection.
|
||||
|
||||
## 1.7
|
||||
* Add `--config` and `--env` arguments to CLI (by Jarek Rencz).
|
||||
|
||||
## 1.6
|
||||
* Convert Electron version to Chrome (by Kilian Valkhof).
|
||||
* Fix `0` version mistake in Can I Use data.
|
||||
|
||||
## 1.5.2
|
||||
* Fix browser versions ordering (by Marco Massarotto).
|
||||
|
||||
## 1.5.1
|
||||
* Fix error on `package.json` and `browserslist` in same directory.
|
||||
|
||||
## 1.5
|
||||
* Add `package.json` support (by Stepan Kuzmin).
|
||||
* Add environments support (by Maksim Semenov and openlibser).
|
||||
* Add `browserslist-stats.json` file support (by Oleh Aloshkin).
|
||||
* Add `config` option to CLI (by Evilebot Tnawi).
|
||||
* Add JSDoc.
|
||||
* Fix tests on Windows (by Anna Stoliar).
|
||||
* Don’t set custom usage statistics globally.
|
||||
|
||||
## 1.4
|
||||
* Add `defaults` keyword.
|
||||
|
||||
## 1.3.6
|
||||
* Add `UCAndroid` alias to `and_uc` (by Evilebot Tnawi).
|
||||
|
||||
## 1.3.5
|
||||
* Fix Opera Mini support. Use `op_mini all`.
|
||||
|
||||
## 1.3.4
|
||||
* Add space-less `>1%` and `>.5%` syntax support (by Andreas Lind).
|
||||
|
||||
## 1.3.3
|
||||
* Clean `0` versions in some country-based requests.
|
||||
|
||||
## 1.3.2
|
||||
* Update Firefox ESR.
|
||||
|
||||
## 1.3.1
|
||||
* Add Safari TP support.
|
||||
|
||||
## 1.3
|
||||
* Add coverage for specific country (by Joshua Wise).
|
||||
|
||||
## 1.2
|
||||
* Add `browserslist.coverage()` method.
|
||||
* Add `--coverage` and `-c` argument to CLI.
|
||||
* Add `-v` argument support to CLI.
|
||||
* Better error handling in CLI.
|
||||
|
||||
## 1.1.3
|
||||
* Fix jspm support (by Sean Anderson).
|
||||
|
||||
## 1.1.2
|
||||
* Fix jspm support (by Sean Anderson).
|
||||
|
||||
## 1.1.1
|
||||
* Fix space-less `>10%` and `>10% in my stats` queries.
|
||||
* Normalize error messages.
|
||||
* Remove development files from npm package.
|
||||
|
||||
## 1.1
|
||||
* Added query against custom browser usage data (by Daniel Rey).
|
||||
|
||||
## 1.0.1
|
||||
* Update Firefox ESR (by Rouven Weßling).
|
||||
|
||||
## 1.0 “Atelerix algirus”
|
||||
* Remove Opera 12.1 from default query.
|
||||
* Add `not` keyword and exclude browsers by query.
|
||||
* Add Microsoft Edge support (by Andrey Polischuk).
|
||||
* Add CLI for debug and non-JS usage (by Luke Horvat).
|
||||
* Use own class in Browserslist errors.
|
||||
|
||||
## 0.5
|
||||
* Add version ranges `IE 6-9` (by Ben Briggs).
|
||||
|
||||
## 0.4
|
||||
* Add `config` option and `BROWSERSLIST_CONFIG` environment variable support.
|
||||
* Add symlink config support.
|
||||
|
||||
## 0.3.3
|
||||
* Fix DynJS compatibility (by Nick Howes).
|
||||
|
||||
## 0.3.2
|
||||
* Fix joined versions on versions query (by Vincent De Oliveira).
|
||||
|
||||
## 0.3.1
|
||||
* Fix global variable leak (by Peter Müller).
|
||||
|
||||
## 0.3
|
||||
* Takes queries from `BROWSERSLIST` environment variable.
|
||||
|
||||
## 0.2
|
||||
* Return Can I Use joined versions as `ios_saf 7.0-7.1`.
|
||||
|
||||
## 0.1.3
|
||||
* Better work with Can I Use joined versions like `ios_saf 7.0-7.1`.
|
||||
* Browserslist now understands `ios_saf 7.0` or `ios_saf 7`.
|
||||
|
||||
## 0.1.2
|
||||
* Do not create global `browserslist` var (by Maxime Thirouin).
|
||||
|
||||
## 0.1.1
|
||||
* Sort browsers by name and version.
|
||||
|
||||
## 0.1 “Atelerix albiventris”
|
||||
* Initial release.
|
20
web/node_modules/react-dev-utils/node_modules/browserslist/LICENSE
generated
vendored
Normal file
20
web/node_modules/react-dev-utils/node_modules/browserslist/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright 2014 Andrey Sitnik <andrey@sitnik.ru> and other contributors
|
||||
|
||||
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.
|
694
web/node_modules/react-dev-utils/node_modules/browserslist/README.md
generated
vendored
Normal file
694
web/node_modules/react-dev-utils/node_modules/browserslist/README.md
generated
vendored
Normal file
|
@ -0,0 +1,694 @@
|
|||
# Browserslist [![Cult Of Martians][cult-img]][cult]
|
||||
|
||||
<img width="120" height="120" alt="Browserslist logo by Anton Lovchikov"
|
||||
src="https://browserslist.github.io/browserslist/logo.svg" align="right">
|
||||
|
||||
The config to share target browsers and Node.js versions between different
|
||||
front-end tools. It is used in:
|
||||
|
||||
* [Autoprefixer]
|
||||
* [Babel]
|
||||
* [postcss-preset-env]
|
||||
* [eslint-plugin-compat]
|
||||
* [stylelint-no-unsupported-browser-features]
|
||||
* [postcss-normalize]
|
||||
* [obsolete-webpack-plugin]
|
||||
|
||||
All tools will find target browsers automatically,
|
||||
when you add the following to `package.json`:
|
||||
|
||||
```json
|
||||
"browserslist": [
|
||||
"defaults",
|
||||
"not IE 11",
|
||||
"not IE_Mob 11",
|
||||
"maintained node versions"
|
||||
]
|
||||
```
|
||||
|
||||
Or in `.browserslistrc` config:
|
||||
|
||||
```yaml
|
||||
# Browsers that we support
|
||||
|
||||
defaults
|
||||
not IE 11
|
||||
not IE_Mob 11
|
||||
maintained node versions
|
||||
```
|
||||
|
||||
Developers set their version lists using queries like `last 2 versions`
|
||||
to be free from updating versions manually.
|
||||
Browserslist will use [`caniuse-lite`] with [Can I Use] data for this queries.
|
||||
|
||||
Browserslist will take queries from tool option,
|
||||
`browserslist` config, `.browserslistrc` config,
|
||||
`browserslist` section in `package.json` or environment variables.
|
||||
|
||||
[Browserslist Example] shows how every tool uses Browserslist.
|
||||
|
||||
[cult-img]: https://cultofmartians.com/assets/badges/badge.svg
|
||||
[cult]: https://cultofmartians.com/done.html
|
||||
|
||||
<a href="https://evilmartians.com/?utm_source=browserslist">
|
||||
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg"
|
||||
alt="Sponsored by Evil Martians" width="236" height="54">
|
||||
</a>
|
||||
|
||||
[stylelint-no-unsupported-browser-features]: https://github.com/ismay/stylelint-no-unsupported-browser-features
|
||||
[eslint-plugin-compat]: https://github.com/amilajack/eslint-plugin-compat
|
||||
[Browserslist Example]: https://github.com/browserslist/browserslist-example
|
||||
[postcss-preset-env]: https://github.com/jonathantneal/postcss-preset-env
|
||||
[postcss-normalize]: https://github.com/jonathantneal/postcss-normalize
|
||||
[`caniuse-lite`]: https://github.com/ben-eb/caniuse-lite
|
||||
[Autoprefixer]: https://github.com/postcss/autoprefixer
|
||||
[Can I Use]: https://caniuse.com/
|
||||
[Babel]: https://github.com/babel/babel/tree/master/packages/babel-preset-env
|
||||
[obsolete-webpack-plugin]: https://github.com/ElemeFE/obsolete-webpack-plugin
|
||||
|
||||
## Table of Contents
|
||||
|
||||
* [Tools](#tools)
|
||||
* [Best Practices](#best-practices)
|
||||
* [Browsers Data Updating](#browsers-data-updating)
|
||||
* [Queries](#queries)
|
||||
* [Query Composition](#query-composition)
|
||||
* [Full List](#full-list)
|
||||
* [Debug](#debug)
|
||||
* [Browsers](#browsers)
|
||||
* [Config File](#config-file)
|
||||
* [`package.json`](#packagejson)
|
||||
* [`.browserslistrc`](#browserslistrc)
|
||||
* [Shareable Configs](#shareable-configs)
|
||||
* [Configuring for Different Environments](#configuring-for-different-environments)
|
||||
* [Custom Usage Data](#custom-usage-data)
|
||||
* [JS API](#js-api)
|
||||
* [Environment Variables](#environment-variables)
|
||||
* [Cache](#cache)
|
||||
* [Security Contact](#security-contact)
|
||||
* [For Enterprise](#for-enterprise)
|
||||
|
||||
## Tools
|
||||
|
||||
* [`browserl.ist`](https://browserl.ist/) is an online tool to check
|
||||
what browsers will be selected by some query.
|
||||
* [`browserslist-ga`] and [`browserslist-ga-export`] download your website
|
||||
browsers statistics to use it in `> 0.5% in my stats` query.
|
||||
* [`browserslist-useragent-regexp`] compiles Browserslist query to a RegExp
|
||||
to test browser useragent.
|
||||
* [`browserslist-useragent-ruby`] is a Ruby library to checks browser
|
||||
by user agent string to match Browserslist.
|
||||
* [`browserslist-browserstack`] runs BrowserStack tests for all browsers
|
||||
in Browserslist config.
|
||||
* [`browserslist-adobe-analytics`] use Adobe Analytics data to target browsers.
|
||||
* [`caniuse-api`] returns browsers which support some specific feature.
|
||||
* Run `npx browserslist` in your project directory to see project’s
|
||||
target browsers. This CLI tool is built-in and available in any project
|
||||
with Autoprefixer.
|
||||
|
||||
[`browserslist-useragent-regexp`]: https://github.com/browserslist/browserslist-useragent-regexp
|
||||
[`browserslist-adobe-analytics`]: https://github.com/xeroxinteractive/browserslist-adobe-analytics
|
||||
[`browserslist-useragent-ruby`]: https://github.com/browserslist/browserslist-useragent-ruby
|
||||
[`browserslist-browserstack`]: https://github.com/xeroxinteractive/browserslist-browserstack
|
||||
[`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export
|
||||
[`browserslist-useragent`]: https://github.com/pastelsky/browserslist-useragent
|
||||
[`browserslist-ga`]: https://github.com/browserslist/browserslist-ga
|
||||
[`caniuse-api`]: https://github.com/Nyalab/caniuse-api
|
||||
|
||||
|
||||
## Best Practices
|
||||
|
||||
* There is a `defaults` query, which gives a reasonable configuration
|
||||
for most users:
|
||||
|
||||
```json
|
||||
"browserslist": [
|
||||
"defaults"
|
||||
]
|
||||
```
|
||||
|
||||
* If you want to change the default set of browsers, we recommend combining
|
||||
`last 2 versions`, `not dead` with a usage number like `> 0.2%`. This is
|
||||
because `last n versions` on its own does not add popular old versions, while
|
||||
only using a percentage above `0.2%` will in the long run make popular
|
||||
browsers even more popular. We might run into a monopoly and stagnation
|
||||
situation, as we had with Internet Explorer 6. Please use this setting
|
||||
with caution.
|
||||
* Select browsers directly (`last 2 Chrome versions`) only if you are making
|
||||
a web app for a kiosk with one browser. There are a lot of browsers
|
||||
on the market. If you are making general web app you should respect
|
||||
browsers diversity.
|
||||
* Don’t remove browsers just because you don’t know them. Opera Mini has
|
||||
100 million users in Africa and it is more popular in the global market
|
||||
than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox
|
||||
and desktop Safari combined.
|
||||
|
||||
|
||||
## Browsers Data Updating
|
||||
|
||||
`npx browserslist@latest --update-db` updates `caniuse-lite` version
|
||||
in your npm, yarn or pnpm lock file.
|
||||
|
||||
You need to do it regularly for two reasons:
|
||||
|
||||
1. To use the latest browser’s versions and statistics in queries like
|
||||
`last 2 versions` or `>1%`. For example, if you created your project
|
||||
2 years ago and did not update your dependencies, `last 1 version`
|
||||
will return 2 year old browsers.
|
||||
2. `caiuse-lite` deduplication: to synchronize version in different tools.
|
||||
|
||||
> What is deduplication?
|
||||
|
||||
Due to how npm architecture is setup, you may have a situation
|
||||
where you have multiple versions of a single dependency required.
|
||||
|
||||
Imagine you begin a project, and you add `autoprefixer` as a dependency.
|
||||
npm looks for the latest `caniuse-lite` version (1.0.30000700) and adds it to
|
||||
`package-lock.json` under `autoprefixer` dependencies.
|
||||
|
||||
A year later, you decide to add Babel. At this moment, we have a
|
||||
new version of `canuse-lite` (1.0.30000900). npm took the latest version
|
||||
and added it to your lock file under `@babel/preset-env` dependencies.
|
||||
|
||||
Now your lock file looks like this:
|
||||
|
||||
```ocaml
|
||||
autoprefixer 7.1.4
|
||||
browserslist 3.1.1
|
||||
caniuse-lite 1.0.30000700
|
||||
@babel/preset-env 7.10.0
|
||||
browserslist 4.13.0
|
||||
caniuse-lite 1.0.30000900
|
||||
```
|
||||
|
||||
As you can see, we now have two versions of `caniuse-lite` installed.
|
||||
|
||||
|
||||
## Queries
|
||||
|
||||
Browserslist will use browsers and Node.js versions query
|
||||
from one of these sources:
|
||||
|
||||
1. `browserslist` key in `package.json` file in current or parent directories.
|
||||
**We recommend this way.**
|
||||
2. `.browserslistrc` config file in current or parent directories.
|
||||
3. `browserslist` config file in current or parent directories.
|
||||
4. `BROWSERSLIST` environment variable.
|
||||
5. If the above methods did not produce a valid result
|
||||
Browserslist will use defaults:
|
||||
`> 0.5%, last 2 versions, Firefox ESR, not dead`.
|
||||
|
||||
|
||||
### Query Composition
|
||||
|
||||
An `or` combiner can use the keyword `or` as well as `,`.
|
||||
`last 1 version or > 1%` is equal to `last 1 version, > 1%`.
|
||||
|
||||
`and` query combinations are also supported to perform an
|
||||
intersection of all the previous queries:
|
||||
`last 1 version or chrome > 75 and > 1%` will select
|
||||
(`browser last version` or `Chrome since 76`) and `more than 1% marketshare`.
|
||||
|
||||
There is 3 different ways to combine queries as depicted below. First you start
|
||||
with a single query and then we combine the queries to get our final list.
|
||||
|
||||
Obviously you can *not* start with a `not` combiner, since there is no left-hand
|
||||
side query to combine it with. The left-hand is always resolved as `and`
|
||||
combiner even if `or` is used (this is an API implementation specificity).
|
||||
|
||||
| Query combiner type | Illustration | Example |
|
||||
| ------------------- | :----------: | ------- |
|
||||
|`or`/`,` combiner <br> (union) |  | `> .5% or last 2 versions` <br> `> .5%, last 2 versions` |
|
||||
| `and` combiner <br> (intersection) |  | `> .5% and last 2 versions` |
|
||||
| `not` combiner <br> (relative complement) |  | All those three are equivalent to the first one <br> `> .5% and not last 2 versions` <br> `> .5% or not last 2 versions` <br> `> .5%, not last 2 versions` |
|
||||
|
||||
_A quick way to test your query is to do `npx browserslist '> 0.5%, not IE 11'`
|
||||
in your terminal._
|
||||
|
||||
### Full List
|
||||
|
||||
You can specify the browser and Node.js versions by queries (case insensitive):
|
||||
|
||||
* `defaults`: Browserslist’s default browsers
|
||||
(`> 0.5%, last 2 versions, Firefox ESR, not dead`).
|
||||
* `> 5%`: browsers versions selected by global usage statistics.
|
||||
`>=`, `<` and `<=` work too.
|
||||
* `> 5% in US`: uses USA usage statistics.
|
||||
It accepts [two-letter country code].
|
||||
* `> 5% in alt-AS`: uses Asia region usage statistics.
|
||||
List of all region codes can be found at [`caniuse-lite/data/regions`].
|
||||
* `> 5% in my stats`: uses [custom usage data].
|
||||
* `> 5% in browserslist-config-mycompany stats`: uses [custom usage data]
|
||||
from `browserslist-config-mycompany/browserslist-stats.json`.
|
||||
* `cover 99.5%`: most popular browsers that provide coverage.
|
||||
* `cover 99.5% in US`: same as above, with [two-letter country code].
|
||||
* `cover 99.5% in my stats`: uses [custom usage data].
|
||||
* `dead`: browsers without official support or updates for 24 months.
|
||||
Right now it is `IE 10`, `IE_Mob 11`, `BlackBerry 10`, `BlackBerry 7`,
|
||||
`Samsung 4` and `OperaMobile 12.1`.
|
||||
* `last 2 versions`: the last 2 versions for *each* browser.
|
||||
* `last 2 Chrome versions`: the last 2 versions of Chrome browser.
|
||||
* `last 2 major versions` or `last 2 iOS major versions`:
|
||||
all minor/patch releases of last 2 major versions.
|
||||
* `node 10` and `node 10.4`: selects latest Node.js `10.x.x`
|
||||
or `10.4.x` release.
|
||||
* `current node`: Node.js version used by Browserslist right now.
|
||||
* `maintained node versions`: all Node.js versions, which are [still maintained]
|
||||
by Node.js Foundation.
|
||||
* `iOS 7`: the iOS browser version 7 directly.
|
||||
* `Firefox > 20`: versions of Firefox newer than 20.
|
||||
`>=`, `<` and `<=` work too. It also works with Node.js.
|
||||
* `ie 6-8`: selects an inclusive range of versions.
|
||||
* `Firefox ESR`: the latest [Firefox ESR] version.
|
||||
* `PhantomJS 2.1` and `PhantomJS 1.9`: selects Safari versions similar
|
||||
to PhantomJS runtime.
|
||||
* `extends browserslist-config-mycompany`: take queries from
|
||||
`browserslist-config-mycompany` npm package.
|
||||
* `supports es6-module`: browsers with support for specific features.
|
||||
`es6-module` here is the `feat` parameter at the URL of the [Can I Use]
|
||||
page. A list of all available features can be found at
|
||||
[`caniuse-lite/data/features`].
|
||||
* `since 2015` or `last 2 years`: all versions released since year 2015
|
||||
(also `since 2015-03` and `since 2015-03-10`).
|
||||
* `unreleased versions` or `unreleased Chrome versions`:
|
||||
alpha and beta versions.
|
||||
* `not ie <= 8`: exclude browsers selected by previous queries.
|
||||
|
||||
You can add `not ` to any query.
|
||||
|
||||
[`caniuse-lite/data/regions`]: https://github.com/ben-eb/caniuse-lite/tree/master/data/regions
|
||||
[`caniuse-lite/data/features`]: https://github.com/ben-eb/caniuse-lite/tree/master/data/features
|
||||
[two-letter country code]: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements
|
||||
[custom usage data]: #custom-usage-data
|
||||
[still maintained]: https://github.com/nodejs/Release
|
||||
[Can I Use]: https://caniuse.com/
|
||||
|
||||
|
||||
### Debug
|
||||
|
||||
Run `npx browserslist` in project directory to see what browsers was selected
|
||||
by your queries.
|
||||
|
||||
```sh
|
||||
$ npx browserslist
|
||||
and_chr 61
|
||||
and_ff 56
|
||||
and_qq 1.2
|
||||
and_uc 11.4
|
||||
android 56
|
||||
baidu 7.12
|
||||
bb 10
|
||||
chrome 62
|
||||
edge 16
|
||||
firefox 56
|
||||
ios_saf 11
|
||||
opera 48
|
||||
safari 11
|
||||
samsung 5
|
||||
```
|
||||
|
||||
|
||||
### Browsers
|
||||
|
||||
Names are case insensitive:
|
||||
|
||||
* `Android` for Android WebView.
|
||||
* `Baidu` for Baidu Browser.
|
||||
* `BlackBerry` or `bb` for Blackberry browser.
|
||||
* `Chrome` for Google Chrome.
|
||||
* `ChromeAndroid` or `and_chr` for Chrome for Android
|
||||
* `Edge` for Microsoft Edge.
|
||||
* `Electron` for Electron framework. It will be converted to Chrome version.
|
||||
* `Explorer` or `ie` for Internet Explorer.
|
||||
* `ExplorerMobile` or `ie_mob` for Internet Explorer Mobile.
|
||||
* `Firefox` or `ff` for Mozilla Firefox.
|
||||
* `FirefoxAndroid` or `and_ff` for Firefox for Android.
|
||||
* `iOS` or `ios_saf` for iOS Safari.
|
||||
* `Node` for Node.js.
|
||||
* `Opera` for Opera.
|
||||
* `OperaMini` or `op_mini` for Opera Mini.
|
||||
* `OperaMobile` or `op_mob` for Opera Mobile.
|
||||
* `QQAndroid` or `and_qq` for QQ Browser for Android.
|
||||
* `Safari` for desktop Safari.
|
||||
* `Samsung` for Samsung Internet.
|
||||
* `UCAndroid` or `and_uc` for UC Browser for Android.
|
||||
* `kaios` for KaiOS Browser.
|
||||
|
||||
|
||||
## Config File
|
||||
|
||||
### `package.json`
|
||||
|
||||
If you want to reduce config files in project root, you can specify
|
||||
browsers in `package.json` with `browserslist` key:
|
||||
|
||||
```json
|
||||
{
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"autoprefixer": "^6.5.4"
|
||||
},
|
||||
"browserslist": [
|
||||
"last 1 version",
|
||||
"> 1%",
|
||||
"IE 10"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### `.browserslistrc`
|
||||
|
||||
Separated Browserslist config should be named `.browserslistrc`
|
||||
and have browsers queries split by a new line.
|
||||
Each line is combined with the `or` combiner. Comments starts with `#` symbol:
|
||||
|
||||
```yaml
|
||||
# Browsers that we support
|
||||
|
||||
last 1 version
|
||||
> 1%
|
||||
IE 10 # sorry
|
||||
```
|
||||
|
||||
Browserslist will check config in every directory in `path`.
|
||||
So, if tool process `app/styles/main.css`, you can put config to root,
|
||||
`app/` or `app/styles`.
|
||||
|
||||
You can specify direct path in `BROWSERSLIST_CONFIG` environment variables.
|
||||
|
||||
|
||||
## Shareable Configs
|
||||
|
||||
You can use the following query to reference an exported Browserslist config
|
||||
from another package:
|
||||
|
||||
```json
|
||||
"browserslist": [
|
||||
"extends browserslist-config-mycompany"
|
||||
]
|
||||
```
|
||||
|
||||
For security reasons, external configuration only supports packages that have
|
||||
the `browserslist-config-` prefix. npm scoped packages are also supported, by
|
||||
naming or prefixing the module with `@scope/browserslist-config`, such as
|
||||
`@scope/browserslist-config` or `@scope/browserslist-config-mycompany`.
|
||||
|
||||
If you don’t accept Browserslist queries from users, you can disable the
|
||||
validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable
|
||||
or `dangerousExtend` option.
|
||||
|
||||
```sh
|
||||
BROWSERSLIST_DANGEROUS_EXTEND=1 npx webpack
|
||||
```
|
||||
|
||||
Because this uses `npm`'s resolution, you can also reference specific files
|
||||
in a package:
|
||||
|
||||
```json
|
||||
"browserslist": [
|
||||
"extends browserslist-config-mycompany/desktop",
|
||||
"extends browserslist-config-mycompany/mobile"
|
||||
]
|
||||
```
|
||||
|
||||
When writing a shared Browserslist package, just export an array.
|
||||
`browserslist-config-mycompany/index.js`:
|
||||
|
||||
```js
|
||||
module.exports = [
|
||||
'last 1 version',
|
||||
'> 1%',
|
||||
'ie 10'
|
||||
]
|
||||
```
|
||||
|
||||
You can also include a `browserslist-stats.json` file as part of your shareable
|
||||
config at the root and query it using
|
||||
`> 5% in browserslist-config-mycompany stats`. It uses the same format
|
||||
as `extends` and the `dangerousExtend` property as above.
|
||||
|
||||
You can export configs for different environments and select environment
|
||||
by `BROWSERSLIST_ENV` or `env` option in your tool:
|
||||
|
||||
```js
|
||||
module.exports = {
|
||||
development: [
|
||||
'last 1 version'
|
||||
],
|
||||
production: [
|
||||
'last 1 version',
|
||||
'> 1%',
|
||||
'ie 10'
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Configuring for Different Environments
|
||||
|
||||
You can also specify different browser queries for various environments.
|
||||
Browserslist will choose query according to `BROWSERSLIST_ENV` or `NODE_ENV`
|
||||
variables. If none of them is declared, Browserslist will firstly look
|
||||
for `production` queries and then use defaults.
|
||||
|
||||
In `package.json`:
|
||||
|
||||
```js
|
||||
"browserslist": {
|
||||
"production": [
|
||||
"> 1%",
|
||||
"ie 10"
|
||||
],
|
||||
"modern": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version"
|
||||
],
|
||||
"ssr": [
|
||||
"node 12"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
In `.browserslistrc` config:
|
||||
|
||||
```ini
|
||||
[production]
|
||||
> 1%
|
||||
ie 10
|
||||
|
||||
[modern]
|
||||
last 1 chrome version
|
||||
last 1 firefox version
|
||||
|
||||
[ssr]
|
||||
node 12
|
||||
```
|
||||
|
||||
|
||||
## Custom Usage Data
|
||||
|
||||
If you have a website, you can query against the usage statistics of your site.
|
||||
[`browserslist-ga`] will ask access to Google Analytics and then generate
|
||||
`browserslist-stats.json`:
|
||||
|
||||
```
|
||||
npx browserslist-ga
|
||||
```
|
||||
|
||||
Or you can use [`browserslist-ga-export`] to convert Google Analytics data without giving a password for Google account.
|
||||
|
||||
You can generate usage statistics file by any other method. File format should
|
||||
be like:
|
||||
|
||||
```js
|
||||
{
|
||||
"ie": {
|
||||
"6": 0.01,
|
||||
"7": 0.4,
|
||||
"8": 1.5
|
||||
},
|
||||
"chrome": {
|
||||
…
|
||||
},
|
||||
…
|
||||
}
|
||||
```
|
||||
|
||||
Note that you can query against your custom usage data while also querying
|
||||
against global or regional data. For example, the query
|
||||
`> 1% in my stats, > 5% in US, 10%` is permitted.
|
||||
|
||||
[`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export
|
||||
[`browserslist-ga`]: https://github.com/browserslist/browserslist-ga
|
||||
[Can I Use]: https://caniuse.com/
|
||||
|
||||
|
||||
## JS API
|
||||
|
||||
```js
|
||||
const browserslist = require('browserslist')
|
||||
|
||||
// Your CSS/JS build tool code
|
||||
function process (source, opts) {
|
||||
const browsers = browserslist(opts.overrideBrowserslist, {
|
||||
stats: opts.stats,
|
||||
path: opts.file,
|
||||
env: opts.env
|
||||
})
|
||||
// Your code to add features for selected browsers
|
||||
}
|
||||
```
|
||||
|
||||
Queries can be a string `"> 1%, IE 10"`
|
||||
or an array `['> 1%', 'IE 10']`.
|
||||
|
||||
If a query is missing, Browserslist will look for a config file.
|
||||
You can provide a `path` option (that can be a file) to find the config file
|
||||
relatively to it.
|
||||
|
||||
Options:
|
||||
|
||||
* `path`: file or a directory path to look for config file. Default is `.`.
|
||||
* `env`: what environment section use from config. Default is `production`.
|
||||
* `stats`: custom usage statistics data.
|
||||
* `config`: path to config if you want to set it manually.
|
||||
* `ignoreUnknownVersions`: do not throw on direct query (like `ie 12`).
|
||||
Default is `false.`
|
||||
* `dangerousExtend`: Disable security checks for `extend` query.
|
||||
Default is `false.`
|
||||
* `mobileToDesktop`: Use desktop browsers if Can I Use doesn’t have data
|
||||
about this mobile version. For instance, Browserslist will return
|
||||
`chrome 20` on `and_chr 20` query (Can I Use has only data only about
|
||||
latest versions of mobile browsers). Default is `false`.
|
||||
|
||||
For non-JS environment and debug purpose you can use CLI tool:
|
||||
|
||||
```sh
|
||||
browserslist "> 1%, IE 10"
|
||||
```
|
||||
|
||||
You can get total users coverage for selected browsers by JS API:
|
||||
|
||||
```js
|
||||
browserslist.coverage(browserslist('> 1%'))
|
||||
//=> 81.4
|
||||
```
|
||||
|
||||
```js
|
||||
browserslist.coverage(browserslist('> 1% in US'), 'US')
|
||||
//=> 83.1
|
||||
```
|
||||
|
||||
```js
|
||||
browserslist.coverage(browserslist('> 1% in my stats'), 'my stats')
|
||||
//=> 83.1
|
||||
```
|
||||
|
||||
```js
|
||||
browserslist.coverage(browserslist('> 1% in my stats', { stats }), stats)
|
||||
//=> 82.2
|
||||
```
|
||||
|
||||
Or by CLI:
|
||||
|
||||
```sh
|
||||
$ browserslist --coverage "> 1%"
|
||||
These browsers account for 81.4% of all users globally
|
||||
```
|
||||
|
||||
```sh
|
||||
$ browserslist --coverage=US "> 1% in US"
|
||||
These browsers account for 83.1% of all users in the US
|
||||
```
|
||||
|
||||
```sh
|
||||
$ browserslist --coverage "> 1% in my stats"
|
||||
These browsers account for 83.1% of all users in custom statistics
|
||||
```
|
||||
|
||||
```sh
|
||||
$ browserslist --coverage "> 1% in my stats" --stats=./stats.json
|
||||
These browsers account for 83.1% of all users in custom statistics
|
||||
```
|
||||
|
||||
|
||||
## Environment Variables
|
||||
|
||||
If a tool uses Browserslist inside, you can change the Browserslist settings
|
||||
with [environment variables]:
|
||||
|
||||
* `BROWSERSLIST` with browsers queries.
|
||||
|
||||
```sh
|
||||
BROWSERSLIST="> 5%" npx webpack
|
||||
```
|
||||
|
||||
* `BROWSERSLIST_CONFIG` with path to config file.
|
||||
|
||||
```sh
|
||||
BROWSERSLIST_CONFIG=./config/browserslist npx webpack
|
||||
```
|
||||
|
||||
* `BROWSERSLIST_ENV` with environments string.
|
||||
|
||||
```sh
|
||||
BROWSERSLIST_ENV="development" npx webpack
|
||||
```
|
||||
|
||||
* `BROWSERSLIST_STATS` with path to the custom usage data
|
||||
for `> 1% in my stats` query.
|
||||
|
||||
```sh
|
||||
BROWSERSLIST_STATS=./config/usage_data.json npx webpack
|
||||
```
|
||||
|
||||
* `BROWSERSLIST_DISABLE_CACHE` if you want to disable config reading cache.
|
||||
|
||||
```sh
|
||||
BROWSERSLIST_DISABLE_CACHE=1 npx webpack
|
||||
```
|
||||
|
||||
* `BROWSERSLIST_DANGEROUS_EXTEND` to disable security shareable config
|
||||
name check.
|
||||
|
||||
```sh
|
||||
BROWSERSLIST_DANGEROUS_EXTEND=1 npx webpack
|
||||
```
|
||||
|
||||
[environment variables]: https://en.wikipedia.org/wiki/Environment_variable
|
||||
|
||||
|
||||
## Cache
|
||||
|
||||
Browserslist caches the configuration it reads from `package.json` and
|
||||
`browserslist` files, as well as knowledge about the existence of files,
|
||||
for the duration of the hosting process.
|
||||
|
||||
To clear these caches, use:
|
||||
|
||||
```js
|
||||
browserslist.clearCaches()
|
||||
```
|
||||
|
||||
To disable the caching altogether, set the `BROWSERSLIST_DISABLE_CACHE`
|
||||
environment variable.
|
||||
|
||||
|
||||
## Security Contact
|
||||
|
||||
To report a security vulnerability, please use the [Tidelift security contact].
|
||||
Tidelift will coordinate the fix and disclosure.
|
||||
|
||||
[Tidelift security contact]: https://tidelift.com/security
|
||||
|
||||
|
||||
## For Enterprise
|
||||
|
||||
Available as part of the Tidelift Subscription.
|
||||
|
||||
The maintainers of `browserslist` and thousands of other packages are working
|
||||
with Tidelift to deliver commercial support and maintenance for the open source
|
||||
dependencies you use to build your applications. Save time, reduce risk,
|
||||
and improve code health, while paying the maintainers of the exact dependencies
|
||||
you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-browserslist?utm_source=npm-browserslist&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
|
46
web/node_modules/react-dev-utils/node_modules/browserslist/browser.js
generated
vendored
Normal file
46
web/node_modules/react-dev-utils/node_modules/browserslist/browser.js
generated
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
var BrowserslistError = require('./error')
|
||||
|
||||
function noop () { }
|
||||
|
||||
module.exports = {
|
||||
loadQueries: function loadQueries () {
|
||||
throw new BrowserslistError(
|
||||
'Sharable configs are not supported in client-side build of Browserslist')
|
||||
},
|
||||
|
||||
getStat: function getStat (opts) {
|
||||
return opts.stats
|
||||
},
|
||||
|
||||
loadConfig: function loadConfig (opts) {
|
||||
if (opts.config) {
|
||||
throw new BrowserslistError(
|
||||
'Browserslist config are not supported in client-side build')
|
||||
}
|
||||
},
|
||||
|
||||
loadCountry: function loadCountry () {
|
||||
throw new BrowserslistError(
|
||||
'Country statistics are not supported ' +
|
||||
'in client-side build of Browserslist')
|
||||
},
|
||||
|
||||
loadFeature: function loadFeature () {
|
||||
throw new BrowserslistError(
|
||||
'Supports queries are not available in client-side build of Browserslist')
|
||||
},
|
||||
|
||||
currentNode: function currentNode (resolve, context) {
|
||||
return resolve(['maintained node versions'], context)[0]
|
||||
},
|
||||
|
||||
parseConfig: noop,
|
||||
|
||||
readConfig: noop,
|
||||
|
||||
findConfig: noop,
|
||||
|
||||
clearCaches: noop,
|
||||
|
||||
oldDataWarning: noop
|
||||
}
|
145
web/node_modules/react-dev-utils/node_modules/browserslist/cli.js
generated
vendored
Executable file
145
web/node_modules/react-dev-utils/node_modules/browserslist/cli.js
generated
vendored
Executable file
|
@ -0,0 +1,145 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
var fs = require('fs')
|
||||
|
||||
var browserslist = require('./')
|
||||
var updateDb = require('./update-db')
|
||||
var pkg = require('./package.json')
|
||||
|
||||
var args = process.argv.slice(2)
|
||||
|
||||
var USAGE = 'Usage:\n' +
|
||||
' npx browserslist\n' +
|
||||
' npx browserslist "QUERIES"\n' +
|
||||
' npx browserslist --json "QUERIES"\n' +
|
||||
' npx browserslist --config="path/to/browserlist/file"\n' +
|
||||
' npx browserslist --coverage "QUERIES"\n' +
|
||||
' npx browserslist --coverage=US "QUERIES"\n' +
|
||||
' npx browserslist --coverage=US,RU,global "QUERIES"\n' +
|
||||
' npx browserslist --env="environment name defined in config"\n' +
|
||||
' npx browserslist --stats="path/to/browserlist/stats/file"\n' +
|
||||
' npx browserslist --mobile-to-desktop\n' +
|
||||
' npx browserslist --update-db'
|
||||
|
||||
function isArg (arg) {
|
||||
return args.some(function (str) {
|
||||
return str === arg || str.indexOf(arg + '=') === 0
|
||||
})
|
||||
}
|
||||
|
||||
function error (msg) {
|
||||
process.stderr.write('browserslist: ' + msg + '\n')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
if (isArg('--help') || isArg('-h')) {
|
||||
process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n')
|
||||
} else if (isArg('--version') || isArg('-v')) {
|
||||
process.stdout.write('browserslist ' + pkg.version + '\n')
|
||||
} else if (isArg('--update-db')) {
|
||||
updateDb(function (str) {
|
||||
process.stdout.write(str)
|
||||
})
|
||||
} else {
|
||||
var mode = 'browsers'
|
||||
var opts = { }
|
||||
var queries
|
||||
var areas
|
||||
|
||||
for (var i = 0; i < args.length; i++) {
|
||||
if (args[i][0] !== '-') {
|
||||
queries = args[i].replace(/^["']|["']$/g, '')
|
||||
continue
|
||||
}
|
||||
|
||||
var arg = args[i].split('=')
|
||||
var name = arg[0]
|
||||
var value = arg[1]
|
||||
|
||||
if (value) value = value.replace(/^["']|["']$/g, '')
|
||||
|
||||
if (name === '--config' || name === '-b') {
|
||||
opts.config = value
|
||||
} else if (name === '--env' || name === '-e') {
|
||||
opts.env = value
|
||||
} else if (name === '--stats' || name === '-s') {
|
||||
opts.stats = value
|
||||
} else if (name === '--coverage' || name === '-c') {
|
||||
if (mode !== 'json') mode = 'coverage'
|
||||
if (value) {
|
||||
areas = value.split(',')
|
||||
} else {
|
||||
areas = ['global']
|
||||
}
|
||||
} else if (name === '--json') {
|
||||
mode = 'json'
|
||||
} else if (name === '--mobile-to-desktop') {
|
||||
opts.mobileToDesktop = true
|
||||
} else {
|
||||
error('Unknown arguments ' + args[i] + '.\n\n' + USAGE)
|
||||
}
|
||||
}
|
||||
|
||||
var browsers
|
||||
try {
|
||||
browsers = browserslist(queries, opts)
|
||||
} catch (e) {
|
||||
if (e.name === 'BrowserslistError') {
|
||||
error(e.message)
|
||||
} else {
|
||||
throw e
|
||||
}
|
||||
}
|
||||
|
||||
var coverage
|
||||
if (mode === 'browsers') {
|
||||
browsers.forEach(function (browser) {
|
||||
process.stdout.write(browser + '\n')
|
||||
})
|
||||
} else if (areas) {
|
||||
coverage = areas.map(function (area) {
|
||||
var stats
|
||||
if (area !== 'global') {
|
||||
stats = area
|
||||
} else if (opts.stats) {
|
||||
stats = JSON.parse(fs.readFileSync(opts.stats))
|
||||
}
|
||||
var result = browserslist.coverage(browsers, stats)
|
||||
var round = Math.round(result * 100) / 100.0
|
||||
|
||||
return [area, round]
|
||||
})
|
||||
|
||||
if (mode === 'coverage') {
|
||||
var prefix = 'These browsers account for '
|
||||
process.stdout.write(prefix)
|
||||
coverage.forEach(function (data, index) {
|
||||
var area = data[0]
|
||||
var round = data[1]
|
||||
var end = 'globally'
|
||||
if (area && area !== 'global') {
|
||||
end = 'in the ' + area.toUpperCase()
|
||||
} else if (opts.stats) {
|
||||
end = 'in custom statistics'
|
||||
}
|
||||
|
||||
if (index !== 0) {
|
||||
process.stdout.write(prefix.replace(/./g, ' '))
|
||||
}
|
||||
|
||||
process.stdout.write(round + '% of all users ' + end + '\n')
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if (mode === 'json') {
|
||||
var data = { browsers: browsers }
|
||||
if (coverage) {
|
||||
data.coverage = coverage.reduce(function (object, j) {
|
||||
object[j[0]] = j[1]
|
||||
return object
|
||||
}, { })
|
||||
}
|
||||
process.stdout.write(JSON.stringify(data, null, ' ') + '\n')
|
||||
}
|
||||
}
|
12
web/node_modules/react-dev-utils/node_modules/browserslist/error.js
generated
vendored
Normal file
12
web/node_modules/react-dev-utils/node_modules/browserslist/error.js
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
function BrowserslistError (message) {
|
||||
this.name = 'BrowserslistError'
|
||||
this.message = message
|
||||
this.browserslist = true
|
||||
if (Error.captureStackTrace) {
|
||||
Error.captureStackTrace(this, BrowserslistError)
|
||||
}
|
||||
}
|
||||
|
||||
BrowserslistError.prototype = Error.prototype
|
||||
|
||||
module.exports = BrowserslistError
|
1174
web/node_modules/react-dev-utils/node_modules/browserslist/index.js
generated
vendored
Normal file
1174
web/node_modules/react-dev-utils/node_modules/browserslist/index.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
386
web/node_modules/react-dev-utils/node_modules/browserslist/node.js
generated
vendored
Normal file
386
web/node_modules/react-dev-utils/node_modules/browserslist/node.js
generated
vendored
Normal file
|
@ -0,0 +1,386 @@
|
|||
var feature = require('caniuse-lite/dist/unpacker/feature').default
|
||||
var region = require('caniuse-lite/dist/unpacker/region').default
|
||||
var path = require('path')
|
||||
var fs = require('fs')
|
||||
|
||||
var BrowserslistError = require('./error')
|
||||
|
||||
var IS_SECTION = /^\s*\[(.+)]\s*$/
|
||||
var CONFIG_PATTERN = /^browserslist-config-/
|
||||
var SCOPED_CONFIG__PATTERN = /@[^/]+\/browserslist-config(-|$|\/)/
|
||||
var TIME_TO_UPDATE_CANIUSE = 6 * 30 * 24 * 60 * 60 * 1000
|
||||
var FORMAT = 'Browserslist config should be a string or an array ' +
|
||||
'of strings with browser queries'
|
||||
|
||||
var dataTimeChecked = false
|
||||
var filenessCache = { }
|
||||
var configCache = { }
|
||||
function checkExtend (name) {
|
||||
var use = ' Use `dangerousExtend` option to disable.'
|
||||
if (!CONFIG_PATTERN.test(name) && !SCOPED_CONFIG__PATTERN.test(name)) {
|
||||
throw new BrowserslistError(
|
||||
'Browserslist config needs `browserslist-config-` prefix. ' + use)
|
||||
}
|
||||
if (name.replace(/^@[^/]+\//, '').indexOf('.') !== -1) {
|
||||
throw new BrowserslistError(
|
||||
'`.` not allowed in Browserslist config name. ' + use)
|
||||
}
|
||||
if (name.indexOf('node_modules') !== -1) {
|
||||
throw new BrowserslistError(
|
||||
'`node_modules` not allowed in Browserslist config.' + use)
|
||||
}
|
||||
}
|
||||
|
||||
function isFile (file) {
|
||||
if (file in filenessCache) {
|
||||
return filenessCache[file]
|
||||
}
|
||||
var result = fs.existsSync(file) && fs.statSync(file).isFile()
|
||||
if (!process.env.BROWSERSLIST_DISABLE_CACHE) {
|
||||
filenessCache[file] = result
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function eachParent (file, callback) {
|
||||
var dir = isFile(file) ? path.dirname(file) : file
|
||||
var loc = path.resolve(dir)
|
||||
do {
|
||||
var result = callback(loc)
|
||||
if (typeof result !== 'undefined') return result
|
||||
} while (loc !== (loc = path.dirname(loc)))
|
||||
return undefined
|
||||
}
|
||||
|
||||
function check (section) {
|
||||
if (Array.isArray(section)) {
|
||||
for (var i = 0; i < section.length; i++) {
|
||||
if (typeof section[i] !== 'string') {
|
||||
throw new BrowserslistError(FORMAT)
|
||||
}
|
||||
}
|
||||
} else if (typeof section !== 'string') {
|
||||
throw new BrowserslistError(FORMAT)
|
||||
}
|
||||
}
|
||||
|
||||
function pickEnv (config, opts) {
|
||||
if (typeof config !== 'object') return config
|
||||
|
||||
var name
|
||||
if (typeof opts.env === 'string') {
|
||||
name = opts.env
|
||||
} else if (process.env.BROWSERSLIST_ENV) {
|
||||
name = process.env.BROWSERSLIST_ENV
|
||||
} else if (process.env.NODE_ENV) {
|
||||
name = process.env.NODE_ENV
|
||||
} else {
|
||||
name = 'production'
|
||||
}
|
||||
|
||||
return config[name] || config.defaults
|
||||
}
|
||||
|
||||
function parsePackage (file) {
|
||||
var config = JSON.parse(fs.readFileSync(file))
|
||||
if (config.browserlist && !config.browserslist) {
|
||||
throw new BrowserslistError(
|
||||
'`browserlist` key instead of `browserslist` in ' + file
|
||||
)
|
||||
}
|
||||
var list = config.browserslist
|
||||
if (Array.isArray(list) || typeof list === 'string') {
|
||||
list = { defaults: list }
|
||||
}
|
||||
for (var i in list) {
|
||||
check(list[i])
|
||||
}
|
||||
|
||||
return list
|
||||
}
|
||||
|
||||
function latestReleaseTime (agents) {
|
||||
var latest = 0
|
||||
for (var name in agents) {
|
||||
var dates = agents[name].releaseDate || { }
|
||||
for (var key in dates) {
|
||||
if (latest < dates[key]) {
|
||||
latest = dates[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
return latest * 1000
|
||||
}
|
||||
|
||||
function normalizeStats (data, stats) {
|
||||
if (stats && 'dataByBrowser' in stats) {
|
||||
stats = stats.dataByBrowser
|
||||
}
|
||||
|
||||
if (typeof stats !== 'object') return undefined
|
||||
|
||||
var normalized = { }
|
||||
for (var i in stats) {
|
||||
var versions = Object.keys(stats[i])
|
||||
if (
|
||||
versions.length === 1 &&
|
||||
data[i] &&
|
||||
data[i].versions.length === 1
|
||||
) {
|
||||
var normal = Object.keys(data[i].versions)[0]
|
||||
normalized[i] = { }
|
||||
normalized[i][normal] = stats[i][versions[0]]
|
||||
} else {
|
||||
normalized[i] = stats[i]
|
||||
}
|
||||
}
|
||||
|
||||
return normalized
|
||||
}
|
||||
|
||||
function normalizeUsageData (usageData, data) {
|
||||
for (var browser in usageData) {
|
||||
var browserUsage = usageData[browser]
|
||||
// eslint-disable-next-line max-len
|
||||
// https://github.com/browserslist/browserslist/issues/431#issuecomment-565230615
|
||||
// caniuse-db returns { 0: "percentage" } for `and_*` regional stats
|
||||
if ('0' in browserUsage) {
|
||||
var versions = data[browser].versions
|
||||
browserUsage[versions[versions.length - 1]] = browserUsage[0]
|
||||
delete browserUsage[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
loadQueries: function loadQueries (ctx, name) {
|
||||
if (!ctx.dangerousExtend && !process.env.BROWSERSLIST_DANGEROUS_EXTEND) {
|
||||
checkExtend(name)
|
||||
}
|
||||
// eslint-disable-next-line security/detect-non-literal-require
|
||||
var queries = require(require.resolve(name, { paths: ['.'] }))
|
||||
if (queries) {
|
||||
if (Array.isArray(queries)) {
|
||||
return queries
|
||||
} else if (typeof queries === 'object') {
|
||||
if (!queries.defaults) queries.defaults = []
|
||||
return pickEnv(queries, ctx, name)
|
||||
}
|
||||
}
|
||||
throw new BrowserslistError(
|
||||
'`' + name + '` config exports not an array of queries' +
|
||||
' or an object of envs'
|
||||
)
|
||||
},
|
||||
|
||||
loadStat: function loadStat (ctx, name, data) {
|
||||
if (!ctx.dangerousExtend && !process.env.BROWSERSLIST_DANGEROUS_EXTEND) {
|
||||
checkExtend(name)
|
||||
}
|
||||
// eslint-disable-next-line security/detect-non-literal-require
|
||||
var stats = require(
|
||||
require.resolve(
|
||||
path.join(name, 'browserslist-stats.json'),
|
||||
{ paths: ['.'] }
|
||||
)
|
||||
)
|
||||
return normalizeStats(data, stats)
|
||||
},
|
||||
|
||||
getStat: function getStat (opts, data) {
|
||||
var stats
|
||||
if (opts.stats) {
|
||||
stats = opts.stats
|
||||
} else if (process.env.BROWSERSLIST_STATS) {
|
||||
stats = process.env.BROWSERSLIST_STATS
|
||||
} else if (opts.path && path.resolve && fs.existsSync) {
|
||||
stats = eachParent(opts.path, function (dir) {
|
||||
var file = path.join(dir, 'browserslist-stats.json')
|
||||
return isFile(file) ? file : undefined
|
||||
})
|
||||
}
|
||||
if (typeof stats === 'string') {
|
||||
try {
|
||||
stats = JSON.parse(fs.readFileSync(stats))
|
||||
} catch (e) {
|
||||
throw new BrowserslistError('Can\'t read ' + stats)
|
||||
}
|
||||
}
|
||||
return normalizeStats(data, stats)
|
||||
},
|
||||
|
||||
loadConfig: function loadConfig (opts) {
|
||||
if (process.env.BROWSERSLIST) {
|
||||
return process.env.BROWSERSLIST
|
||||
} else if (opts.config || process.env.BROWSERSLIST_CONFIG) {
|
||||
var file = opts.config || process.env.BROWSERSLIST_CONFIG
|
||||
if (path.basename(file) === 'package.json') {
|
||||
return pickEnv(parsePackage(file), opts)
|
||||
} else {
|
||||
return pickEnv(module.exports.readConfig(file), opts)
|
||||
}
|
||||
} else if (opts.path) {
|
||||
return pickEnv(module.exports.findConfig(opts.path), opts)
|
||||
} else {
|
||||
return undefined
|
||||
}
|
||||
},
|
||||
|
||||
loadCountry: function loadCountry (usage, country, data) {
|
||||
var code = country.replace(/[^\w-]/g, '')
|
||||
if (!usage[code]) {
|
||||
// eslint-disable-next-line security/detect-non-literal-require
|
||||
var compressed = require('caniuse-lite/data/regions/' + code + '.js')
|
||||
var usageData = region(compressed)
|
||||
normalizeUsageData(usageData, data)
|
||||
usage[country] = { }
|
||||
for (var i in usageData) {
|
||||
for (var j in usageData[i]) {
|
||||
usage[country][i + ' ' + j] = usageData[i][j]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
loadFeature: function loadFeature (features, name) {
|
||||
name = name.replace(/[^\w-]/g, '')
|
||||
if (features[name]) return
|
||||
|
||||
// eslint-disable-next-line security/detect-non-literal-require
|
||||
var compressed = require('caniuse-lite/data/features/' + name + '.js')
|
||||
var stats = feature(compressed).stats
|
||||
features[name] = { }
|
||||
for (var i in stats) {
|
||||
for (var j in stats[i]) {
|
||||
features[name][i + ' ' + j] = stats[i][j]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
parseConfig: function parseConfig (string) {
|
||||
var result = { defaults: [] }
|
||||
var sections = ['defaults']
|
||||
|
||||
string.toString()
|
||||
.replace(/#[^\n]*/g, '')
|
||||
.split(/\n|,/)
|
||||
.map(function (line) {
|
||||
return line.trim()
|
||||
})
|
||||
.filter(function (line) {
|
||||
return line !== ''
|
||||
})
|
||||
.forEach(function (line) {
|
||||
if (IS_SECTION.test(line)) {
|
||||
sections = line.match(IS_SECTION)[1].trim().split(' ')
|
||||
sections.forEach(function (section) {
|
||||
if (result[section]) {
|
||||
throw new BrowserslistError(
|
||||
'Duplicate section ' + section + ' in Browserslist config'
|
||||
)
|
||||
}
|
||||
result[section] = []
|
||||
})
|
||||
} else {
|
||||
sections.forEach(function (section) {
|
||||
result[section].push(line)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
return result
|
||||
},
|
||||
|
||||
readConfig: function readConfig (file) {
|
||||
if (!isFile(file)) {
|
||||
throw new BrowserslistError('Can\'t read ' + file + ' config')
|
||||
}
|
||||
return module.exports.parseConfig(fs.readFileSync(file))
|
||||
},
|
||||
|
||||
findConfig: function findConfig (from) {
|
||||
from = path.resolve(from)
|
||||
|
||||
var passed = []
|
||||
var resolved = eachParent(from, function (dir) {
|
||||
if (dir in configCache) {
|
||||
return configCache[dir]
|
||||
}
|
||||
|
||||
passed.push(dir)
|
||||
|
||||
var config = path.join(dir, 'browserslist')
|
||||
var pkg = path.join(dir, 'package.json')
|
||||
var rc = path.join(dir, '.browserslistrc')
|
||||
|
||||
var pkgBrowserslist
|
||||
if (isFile(pkg)) {
|
||||
try {
|
||||
pkgBrowserslist = parsePackage(pkg)
|
||||
} catch (e) {
|
||||
if (e.name === 'BrowserslistError') throw e
|
||||
console.warn(
|
||||
'[Browserslist] Could not parse ' + pkg + '. Ignoring it.'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (isFile(config) && pkgBrowserslist) {
|
||||
throw new BrowserslistError(
|
||||
dir + ' contains both browserslist and package.json with browsers'
|
||||
)
|
||||
} else if (isFile(rc) && pkgBrowserslist) {
|
||||
throw new BrowserslistError(
|
||||
dir + ' contains both .browserslistrc and package.json with browsers'
|
||||
)
|
||||
} else if (isFile(config) && isFile(rc)) {
|
||||
throw new BrowserslistError(
|
||||
dir + ' contains both .browserslistrc and browserslist'
|
||||
)
|
||||
} else if (isFile(config)) {
|
||||
return module.exports.readConfig(config)
|
||||
} else if (isFile(rc)) {
|
||||
return module.exports.readConfig(rc)
|
||||
} else {
|
||||
return pkgBrowserslist
|
||||
}
|
||||
})
|
||||
if (!process.env.BROWSERSLIST_DISABLE_CACHE) {
|
||||
passed.forEach(function (dir) {
|
||||
configCache[dir] = resolved
|
||||
})
|
||||
}
|
||||
return resolved
|
||||
},
|
||||
|
||||
clearCaches: function clearCaches () {
|
||||
dataTimeChecked = false
|
||||
filenessCache = { }
|
||||
configCache = { }
|
||||
|
||||
this.cache = { }
|
||||
},
|
||||
|
||||
oldDataWarning: function oldDataWarning (agentsObj) {
|
||||
if (dataTimeChecked) return
|
||||
dataTimeChecked = true
|
||||
if (process.env.BROWSERSLIST_IGNORE_OLD_DATA) return
|
||||
|
||||
var latest = latestReleaseTime(agentsObj)
|
||||
var halfYearAgo = Date.now() - TIME_TO_UPDATE_CANIUSE
|
||||
|
||||
if (latest !== 0 && latest < halfYearAgo) {
|
||||
console.warn(
|
||||
'Browserslist: caniuse-lite is outdated. Please run:\n' +
|
||||
'npx browserslist@latest --update-db\n' +
|
||||
'\n' +
|
||||
'Why you should do it regularly:\n' +
|
||||
'https://github.com/browserslist/browserslist#browsers-data-updating'
|
||||
)
|
||||
}
|
||||
},
|
||||
|
||||
currentNode: function currentNode () {
|
||||
return 'node ' + process.versions.node
|
||||
}
|
||||
}
|
31
web/node_modules/react-dev-utils/node_modules/browserslist/package.json
generated
vendored
Normal file
31
web/node_modules/react-dev-utils/node_modules/browserslist/package.json
generated
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"name": "browserslist",
|
||||
"version": "4.14.2",
|
||||
"description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset",
|
||||
"keywords": [
|
||||
"caniuse",
|
||||
"browsers",
|
||||
"target"
|
||||
],
|
||||
"funding": {
|
||||
"type": "tidelift",
|
||||
"url": "https://tidelift.com/funding/github/npm/browserslist"
|
||||
},
|
||||
"author": "Andrey Sitnik <andrey@sitnik.ru>",
|
||||
"license": "MIT",
|
||||
"repository": "browserslist/browserslist",
|
||||
"dependencies": {
|
||||
"caniuse-lite": "^1.0.30001125",
|
||||
"electron-to-chromium": "^1.3.564",
|
||||
"escalade": "^3.0.2",
|
||||
"node-releases": "^1.1.61"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
|
||||
},
|
||||
"bin": "./cli.js",
|
||||
"browser": {
|
||||
"./node.js": "./browser.js",
|
||||
"path": false
|
||||
}
|
||||
}
|
147
web/node_modules/react-dev-utils/node_modules/browserslist/update-db.js
generated
vendored
Normal file
147
web/node_modules/react-dev-utils/node_modules/browserslist/update-db.js
generated
vendored
Normal file
|
@ -0,0 +1,147 @@
|
|||
var childProcess = require('child_process')
|
||||
var escalade = require('escalade/sync')
|
||||
var path = require('path')
|
||||
var fs = require('fs')
|
||||
|
||||
var BrowserslistError = require('./error')
|
||||
|
||||
function detectLockfile () {
|
||||
var packageDir = escalade('.', function (dir, names) {
|
||||
return names.indexOf('package.json') !== -1 ? dir : ''
|
||||
})
|
||||
|
||||
if (!packageDir) {
|
||||
throw new BrowserslistError(
|
||||
'Cannot find package.json. ' +
|
||||
'Is it a right project to run npx browserslist --update-db?'
|
||||
)
|
||||
}
|
||||
|
||||
var lockfileNpm = path.join(packageDir, 'package-lock.json')
|
||||
var lockfileYarn = path.join(packageDir, 'yarn.lock')
|
||||
var lockfilePnpm = path.join(packageDir, 'pnpm-lock.yaml')
|
||||
|
||||
/* istanbul ignore next */
|
||||
if (fs.existsSync(lockfilePnpm)) {
|
||||
return { mode: 'pnpm', file: lockfilePnpm }
|
||||
} else if (fs.existsSync(lockfileNpm)) {
|
||||
return { mode: 'npm', file: lockfileNpm }
|
||||
} else if (fs.existsSync(lockfileYarn)) {
|
||||
return { mode: 'yarn', file: lockfileYarn }
|
||||
} else {
|
||||
throw new BrowserslistError(
|
||||
'No lockfile found. Run "npm install", "yarn install" or "pnpm install"'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
function getCurrentVersion (lock) {
|
||||
var match
|
||||
/* istanbul ignore if */
|
||||
if (lock.mode === 'pnpm') {
|
||||
match = /\/caniuse-lite\/([^:]+):/.exec(lock.content)
|
||||
if (match[1]) return match[1]
|
||||
} else if (lock.mode === 'npm') {
|
||||
var dependencies = JSON.parse(lock.content).dependencies
|
||||
if (dependencies && dependencies['caniuse-lite']) {
|
||||
return dependencies['caniuse-lite'].version
|
||||
}
|
||||
} else if (lock.mode === 'yarn') {
|
||||
match = /caniuse-lite@[^:]+:\r?\n\s+version\s+"([^"]+)"/.exec(lock.content)
|
||||
if (match[1]) return match[1]
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function getLatestInfo () {
|
||||
return JSON.parse(
|
||||
childProcess.execSync('npm show caniuse-lite --json').toString()
|
||||
)
|
||||
}
|
||||
|
||||
function updateLockfile (lock, latest) {
|
||||
if (lock.mode === 'npm') {
|
||||
var fixed = deletePackage(JSON.parse(lock.content))
|
||||
return JSON.stringify(fixed, null, ' ')
|
||||
} else {
|
||||
var lines = lock.content.split('\n')
|
||||
var i
|
||||
/* istanbul ignore if */
|
||||
if (lock.mode === 'pnpm') {
|
||||
for (i = 0; i < lines.length; i++) {
|
||||
if (lines[i].indexOf('caniuse-lite:') >= 0) {
|
||||
lines[i] = lines[i].replace(/: .*$/, ': ' + latest.version)
|
||||
} else if (lines[i].indexOf('/caniuse-lite') >= 0) {
|
||||
lines[i] = lines[i].replace(/\/[^/:]+:/, '/' + latest.version + ':')
|
||||
for (i = i + 1; i < lines.length; i++) {
|
||||
if (lines[i].indexOf('integrity: ') !== -1) {
|
||||
lines[i] = lines[i].replace(
|
||||
/integrity: .+/, 'integrity: ' + latest.dist.integrity
|
||||
)
|
||||
} else if (lines[i].indexOf(' /') !== -1) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (lock.mode === 'yarn') {
|
||||
for (i = 0; i < lines.length; i++) {
|
||||
if (lines[i].indexOf('caniuse-lite@') !== -1) {
|
||||
lines[i + 1] = lines[i + 1].replace(
|
||||
/version "[^"]+"/, 'version "' + latest.version + '"'
|
||||
)
|
||||
lines[i + 2] = lines[i + 2].replace(
|
||||
/resolved "[^"]+"/, 'resolved "' + latest.dist.tarball + '"'
|
||||
)
|
||||
lines[i + 3] = lines[i + 3].replace(
|
||||
/integrity .+/, 'integrity ' + latest.dist.integrity
|
||||
)
|
||||
i += 4
|
||||
}
|
||||
}
|
||||
}
|
||||
return lines.join('\n')
|
||||
}
|
||||
}
|
||||
|
||||
function deletePackage (node) {
|
||||
if (node.dependencies) {
|
||||
delete node.dependencies['caniuse-lite']
|
||||
for (var i in node.dependencies) {
|
||||
node.dependencies[i] = deletePackage(node.dependencies[i])
|
||||
}
|
||||
}
|
||||
return node
|
||||
}
|
||||
|
||||
module.exports = function updateDB (print) {
|
||||
var lock = detectLockfile()
|
||||
lock.content = fs.readFileSync(lock.file).toString()
|
||||
|
||||
var current = getCurrentVersion(lock)
|
||||
var latest = getLatestInfo()
|
||||
|
||||
if (typeof current === 'string') {
|
||||
print('Current version: ' + current + '\n')
|
||||
}
|
||||
print(
|
||||
'New version: ' + latest.version + '\n' +
|
||||
'Removing old caniuse-lite from lock file…\n'
|
||||
)
|
||||
|
||||
fs.writeFileSync(lock.file, updateLockfile(lock, latest))
|
||||
|
||||
print(
|
||||
'Installing new caniuse-lite version…\n' +
|
||||
'$ ' + lock.mode + ' install\n'
|
||||
)
|
||||
try {
|
||||
childProcess.execSync(lock.mode + ' install')
|
||||
} catch (e) /* istanbul ignore next */ {
|
||||
print(e.stack)
|
||||
print('\nProblem with `' + lock.mode + ' install` call. Run it manually.\n')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
print('caniuse-lite has been successfully updated\n')
|
||||
}
|
228
web/node_modules/react-dev-utils/node_modules/chalk/index.js
generated
vendored
Normal file
228
web/node_modules/react-dev-utils/node_modules/chalk/index.js
generated
vendored
Normal file
|
@ -0,0 +1,228 @@
|
|||
'use strict';
|
||||
const escapeStringRegexp = require('escape-string-regexp');
|
||||
const ansiStyles = require('ansi-styles');
|
||||
const stdoutColor = require('supports-color').stdout;
|
||||
|
||||
const template = require('./templates.js');
|
||||
|
||||
const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');
|
||||
|
||||
// `supportsColor.level` → `ansiStyles.color[name]` mapping
|
||||
const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];
|
||||
|
||||
// `color-convert` models to exclude from the Chalk API due to conflicts and such
|
||||
const skipModels = new Set(['gray']);
|
||||
|
||||
const styles = Object.create(null);
|
||||
|
||||
function applyOptions(obj, options) {
|
||||
options = options || {};
|
||||
|
||||
// Detect level if not set manually
|
||||
const scLevel = stdoutColor ? stdoutColor.level : 0;
|
||||
obj.level = options.level === undefined ? scLevel : options.level;
|
||||
obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
|
||||
}
|
||||
|
||||
function Chalk(options) {
|
||||
// We check for this.template here since calling `chalk.constructor()`
|
||||
// by itself will have a `this` of a previously constructed chalk object
|
||||
if (!this || !(this instanceof Chalk) || this.template) {
|
||||
const chalk = {};
|
||||
applyOptions(chalk, options);
|
||||
|
||||
chalk.template = function () {
|
||||
const args = [].slice.call(arguments);
|
||||
return chalkTag.apply(null, [chalk.template].concat(args));
|
||||
};
|
||||
|
||||
Object.setPrototypeOf(chalk, Chalk.prototype);
|
||||
Object.setPrototypeOf(chalk.template, chalk);
|
||||
|
||||
chalk.template.constructor = Chalk;
|
||||
|
||||
return chalk.template;
|
||||
}
|
||||
|
||||
applyOptions(this, options);
|
||||
}
|
||||
|
||||
// Use bright blue on Windows as the normal blue color is illegible
|
||||
if (isSimpleWindowsTerm) {
|
||||
ansiStyles.blue.open = '\u001B[94m';
|
||||
}
|
||||
|
||||
for (const key of Object.keys(ansiStyles)) {
|
||||
ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
|
||||
|
||||
styles[key] = {
|
||||
get() {
|
||||
const codes = ansiStyles[key];
|
||||
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
styles.visible = {
|
||||
get() {
|
||||
return build.call(this, this._styles || [], true, 'visible');
|
||||
}
|
||||
};
|
||||
|
||||
ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');
|
||||
for (const model of Object.keys(ansiStyles.color.ansi)) {
|
||||
if (skipModels.has(model)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
styles[model] = {
|
||||
get() {
|
||||
const level = this.level;
|
||||
return function () {
|
||||
const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);
|
||||
const codes = {
|
||||
open,
|
||||
close: ansiStyles.color.close,
|
||||
closeRe: ansiStyles.color.closeRe
|
||||
};
|
||||
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');
|
||||
for (const model of Object.keys(ansiStyles.bgColor.ansi)) {
|
||||
if (skipModels.has(model)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
|
||||
styles[bgModel] = {
|
||||
get() {
|
||||
const level = this.level;
|
||||
return function () {
|
||||
const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);
|
||||
const codes = {
|
||||
open,
|
||||
close: ansiStyles.bgColor.close,
|
||||
closeRe: ansiStyles.bgColor.closeRe
|
||||
};
|
||||
return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
const proto = Object.defineProperties(() => {}, styles);
|
||||
|
||||
function build(_styles, _empty, key) {
|
||||
const builder = function () {
|
||||
return applyStyle.apply(builder, arguments);
|
||||
};
|
||||
|
||||
builder._styles = _styles;
|
||||
builder._empty = _empty;
|
||||
|
||||
const self = this;
|
||||
|
||||
Object.defineProperty(builder, 'level', {
|
||||
enumerable: true,
|
||||
get() {
|
||||
return self.level;
|
||||
},
|
||||
set(level) {
|
||||
self.level = level;
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(builder, 'enabled', {
|
||||
enumerable: true,
|
||||
get() {
|
||||
return self.enabled;
|
||||
},
|
||||
set(enabled) {
|
||||
self.enabled = enabled;
|
||||
}
|
||||
});
|
||||
|
||||
// See below for fix regarding invisible grey/dim combination on Windows
|
||||
builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';
|
||||
|
||||
// `__proto__` is used because we must return a function, but there is
|
||||
// no way to create a function with a different prototype
|
||||
builder.__proto__ = proto; // eslint-disable-line no-proto
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
function applyStyle() {
|
||||
// Support varags, but simply cast to string in case there's only one arg
|
||||
const args = arguments;
|
||||
const argsLen = args.length;
|
||||
let str = String(arguments[0]);
|
||||
|
||||
if (argsLen === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (argsLen > 1) {
|
||||
// Don't slice `arguments`, it prevents V8 optimizations
|
||||
for (let a = 1; a < argsLen; a++) {
|
||||
str += ' ' + args[a];
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.enabled || this.level <= 0 || !str) {
|
||||
return this._empty ? '' : str;
|
||||
}
|
||||
|
||||
// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
|
||||
// see https://github.com/chalk/chalk/issues/58
|
||||
// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
|
||||
const originalDim = ansiStyles.dim.open;
|
||||
if (isSimpleWindowsTerm && this.hasGrey) {
|
||||
ansiStyles.dim.open = '';
|
||||
}
|
||||
|
||||
for (const code of this._styles.slice().reverse()) {
|
||||
// Replace any instances already present with a re-opening code
|
||||
// otherwise only the part of the string until said closing code
|
||||
// will be colored, and the rest will simply be 'plain'.
|
||||
str = code.open + str.replace(code.closeRe, code.open) + code.close;
|
||||
|
||||
// Close the styling before a linebreak and reopen
|
||||
// after next line to fix a bleed issue on macOS
|
||||
// https://github.com/chalk/chalk/pull/92
|
||||
str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`);
|
||||
}
|
||||
|
||||
// Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
|
||||
ansiStyles.dim.open = originalDim;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
function chalkTag(chalk, strings) {
|
||||
if (!Array.isArray(strings)) {
|
||||
// If chalk() was called by itself or with a string,
|
||||
// return the string itself as a string.
|
||||
return [].slice.call(arguments, 1).join(' ');
|
||||
}
|
||||
|
||||
const args = [].slice.call(arguments, 2);
|
||||
const parts = [strings.raw[0]];
|
||||
|
||||
for (let i = 1; i < strings.length; i++) {
|
||||
parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
|
||||
parts.push(String(strings.raw[i]));
|
||||
}
|
||||
|
||||
return template(chalk, parts.join(''));
|
||||
}
|
||||
|
||||
Object.defineProperties(Chalk.prototype, styles);
|
||||
|
||||
module.exports = Chalk(); // eslint-disable-line new-cap
|
||||
module.exports.supportsColor = stdoutColor;
|
||||
module.exports.default = module.exports; // For TypeScript
|
93
web/node_modules/react-dev-utils/node_modules/chalk/index.js.flow
generated
vendored
Normal file
93
web/node_modules/react-dev-utils/node_modules/chalk/index.js.flow
generated
vendored
Normal file
|
@ -0,0 +1,93 @@
|
|||
// @flow strict
|
||||
|
||||
type TemplateStringsArray = $ReadOnlyArray<string>;
|
||||
|
||||
export type Level = $Values<{
|
||||
None: 0,
|
||||
Basic: 1,
|
||||
Ansi256: 2,
|
||||
TrueColor: 3
|
||||
}>;
|
||||
|
||||
export type ChalkOptions = {|
|
||||
enabled?: boolean,
|
||||
level?: Level
|
||||
|};
|
||||
|
||||
export type ColorSupport = {|
|
||||
level: Level,
|
||||
hasBasic: boolean,
|
||||
has256: boolean,
|
||||
has16m: boolean
|
||||
|};
|
||||
|
||||
export interface Chalk {
|
||||
(...text: string[]): string,
|
||||
(text: TemplateStringsArray, ...placeholders: string[]): string,
|
||||
constructor(options?: ChalkOptions): Chalk,
|
||||
enabled: boolean,
|
||||
level: Level,
|
||||
rgb(r: number, g: number, b: number): Chalk,
|
||||
hsl(h: number, s: number, l: number): Chalk,
|
||||
hsv(h: number, s: number, v: number): Chalk,
|
||||
hwb(h: number, w: number, b: number): Chalk,
|
||||
bgHex(color: string): Chalk,
|
||||
bgKeyword(color: string): Chalk,
|
||||
bgRgb(r: number, g: number, b: number): Chalk,
|
||||
bgHsl(h: number, s: number, l: number): Chalk,
|
||||
bgHsv(h: number, s: number, v: number): Chalk,
|
||||
bgHwb(h: number, w: number, b: number): Chalk,
|
||||
hex(color: string): Chalk,
|
||||
keyword(color: string): Chalk,
|
||||
|
||||
+reset: Chalk,
|
||||
+bold: Chalk,
|
||||
+dim: Chalk,
|
||||
+italic: Chalk,
|
||||
+underline: Chalk,
|
||||
+inverse: Chalk,
|
||||
+hidden: Chalk,
|
||||
+strikethrough: Chalk,
|
||||
|
||||
+visible: Chalk,
|
||||
|
||||
+black: Chalk,
|
||||
+red: Chalk,
|
||||
+green: Chalk,
|
||||
+yellow: Chalk,
|
||||
+blue: Chalk,
|
||||
+magenta: Chalk,
|
||||
+cyan: Chalk,
|
||||
+white: Chalk,
|
||||
+gray: Chalk,
|
||||
+grey: Chalk,
|
||||
+blackBright: Chalk,
|
||||
+redBright: Chalk,
|
||||
+greenBright: Chalk,
|
||||
+yellowBright: Chalk,
|
||||
+blueBright: Chalk,
|
||||
+magentaBright: Chalk,
|
||||
+cyanBright: Chalk,
|
||||
+whiteBright: Chalk,
|
||||
|
||||
+bgBlack: Chalk,
|
||||
+bgRed: Chalk,
|
||||
+bgGreen: Chalk,
|
||||
+bgYellow: Chalk,
|
||||
+bgBlue: Chalk,
|
||||
+bgMagenta: Chalk,
|
||||
+bgCyan: Chalk,
|
||||
+bgWhite: Chalk,
|
||||
+bgBlackBright: Chalk,
|
||||
+bgRedBright: Chalk,
|
||||
+bgGreenBright: Chalk,
|
||||
+bgYellowBright: Chalk,
|
||||
+bgBlueBright: Chalk,
|
||||
+bgMagentaBright: Chalk,
|
||||
+bgCyanBright: Chalk,
|
||||
+bgWhiteBrigh: Chalk,
|
||||
|
||||
supportsColor: ColorSupport
|
||||
};
|
||||
|
||||
declare module.exports: Chalk;
|
9
web/node_modules/react-dev-utils/node_modules/chalk/license
generated
vendored
Normal file
9
web/node_modules/react-dev-utils/node_modules/chalk/license
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
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.
|
11
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/index.js
generated
vendored
Normal file
11
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/index.js
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
|
||||
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
|
||||
|
||||
module.exports = function (str) {
|
||||
if (typeof str !== 'string') {
|
||||
throw new TypeError('Expected a string');
|
||||
}
|
||||
|
||||
return str.replace(matchOperatorsRe, '\\$&');
|
||||
};
|
21
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/license
generated
vendored
Normal file
21
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/license
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
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.
|
41
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/package.json
generated
vendored
Normal file
41
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/package.json
generated
vendored
Normal file
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"name": "escape-string-regexp",
|
||||
"version": "1.0.5",
|
||||
"description": "Escape RegExp special characters",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/escape-string-regexp",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"maintainers": [
|
||||
"Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)",
|
||||
"Joshua Boy Nicolai Appelman <joshua@jbna.nl> (jbna.nl)"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"keywords": [
|
||||
"escape",
|
||||
"regex",
|
||||
"regexp",
|
||||
"re",
|
||||
"regular",
|
||||
"expression",
|
||||
"string",
|
||||
"str",
|
||||
"special",
|
||||
"characters"
|
||||
],
|
||||
"devDependencies": {
|
||||
"ava": "*",
|
||||
"xo": "*"
|
||||
}
|
||||
}
|
27
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/readme.md
generated
vendored
Normal file
27
web/node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
|||
# escape-string-regexp [](https://travis-ci.org/sindresorhus/escape-string-regexp)
|
||||
|
||||
> Escape RegExp special characters
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install --save escape-string-regexp
|
||||
```
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const escapeStringRegexp = require('escape-string-regexp');
|
||||
|
||||
const escapedString = escapeStringRegexp('how much $ for a unicorn?');
|
||||
//=> 'how much \$ for a unicorn\?'
|
||||
|
||||
new RegExp(escapedString);
|
||||
```
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT © [Sindre Sorhus](http://sindresorhus.com)
|
71
web/node_modules/react-dev-utils/node_modules/chalk/package.json
generated
vendored
Normal file
71
web/node_modules/react-dev-utils/node_modules/chalk/package.json
generated
vendored
Normal file
|
@ -0,0 +1,71 @@
|
|||
{
|
||||
"name": "chalk",
|
||||
"version": "2.4.2",
|
||||
"description": "Terminal string styling done right",
|
||||
"license": "MIT",
|
||||
"repository": "chalk/chalk",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && tsc --project types && flow --max-warnings=0 && nyc ava",
|
||||
"bench": "matcha benchmark.js",
|
||||
"coveralls": "nyc report --reporter=text-lcov | coveralls"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"templates.js",
|
||||
"types/index.d.ts",
|
||||
"index.js.flow"
|
||||
],
|
||||
"keywords": [
|
||||
"color",
|
||||
"colour",
|
||||
"colors",
|
||||
"terminal",
|
||||
"console",
|
||||
"cli",
|
||||
"string",
|
||||
"str",
|
||||
"ansi",
|
||||
"style",
|
||||
"styles",
|
||||
"tty",
|
||||
"formatting",
|
||||
"rgb",
|
||||
"256",
|
||||
"shell",
|
||||
"xterm",
|
||||
"log",
|
||||
"logging",
|
||||
"command-line",
|
||||
"text"
|
||||
],
|
||||
"dependencies": {
|
||||
"ansi-styles": "^3.2.1",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
"supports-color": "^5.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ava": "*",
|
||||
"coveralls": "^3.0.0",
|
||||
"execa": "^0.9.0",
|
||||
"flow-bin": "^0.68.0",
|
||||
"import-fresh": "^2.0.0",
|
||||
"matcha": "^0.7.0",
|
||||
"nyc": "^11.0.2",
|
||||
"resolve-from": "^4.0.0",
|
||||
"typescript": "^2.5.3",
|
||||
"xo": "*"
|
||||
},
|
||||
"types": "types/index.d.ts",
|
||||
"xo": {
|
||||
"envs": [
|
||||
"node",
|
||||
"mocha"
|
||||
],
|
||||
"ignores": [
|
||||
"test/_flow.js"
|
||||
]
|
||||
}
|
||||
}
|
314
web/node_modules/react-dev-utils/node_modules/chalk/readme.md
generated
vendored
Normal file
314
web/node_modules/react-dev-utils/node_modules/chalk/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,314 @@
|
|||
<h1 align="center">
|
||||
<br>
|
||||
<br>
|
||||
<img width="320" src="media/logo.svg" alt="Chalk">
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
> Terminal string styling done right
|
||||
|
||||
[](https://travis-ci.org/chalk/chalk) [](https://coveralls.io/github/chalk/chalk?branch=master) [](https://www.youtube.com/watch?v=9auOCbH5Ns4) [](https://github.com/xojs/xo) [](https://github.com/sindresorhus/awesome-nodejs)
|
||||
|
||||
### [See what's new in Chalk 2](https://github.com/chalk/chalk/releases/tag/v2.0.0)
|
||||
|
||||
<img src="https://cdn.rawgit.com/chalk/ansi-styles/8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" alt="" width="900">
|
||||
|
||||
|
||||
## Highlights
|
||||
|
||||
- Expressive API
|
||||
- Highly performant
|
||||
- Ability to nest styles
|
||||
- [256/Truecolor color support](#256-and-truecolor-color-support)
|
||||
- Auto-detects color support
|
||||
- Doesn't extend `String.prototype`
|
||||
- Clean and focused
|
||||
- Actively maintained
|
||||
- [Used by ~23,000 packages](https://www.npmjs.com/browse/depended/chalk) as of December 31, 2017
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```console
|
||||
$ npm install chalk
|
||||
```
|
||||
|
||||
<a href="https://www.patreon.com/sindresorhus">
|
||||
<img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" width="160">
|
||||
</a>
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const chalk = require('chalk');
|
||||
|
||||
console.log(chalk.blue('Hello world!'));
|
||||
```
|
||||
|
||||
Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
|
||||
|
||||
```js
|
||||
const chalk = require('chalk');
|
||||
const log = console.log;
|
||||
|
||||
// Combine styled and normal strings
|
||||
log(chalk.blue('Hello') + ' World' + chalk.red('!'));
|
||||
|
||||
// Compose multiple styles using the chainable API
|
||||
log(chalk.blue.bgRed.bold('Hello world!'));
|
||||
|
||||
// Pass in multiple arguments
|
||||
log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
|
||||
|
||||
// Nest styles
|
||||
log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));
|
||||
|
||||
// Nest styles of the same type even (color, underline, background)
|
||||
log(chalk.green(
|
||||
'I am a green line ' +
|
||||
chalk.blue.underline.bold('with a blue substring') +
|
||||
' that becomes green again!'
|
||||
));
|
||||
|
||||
// ES2015 template literal
|
||||
log(`
|
||||
CPU: ${chalk.red('90%')}
|
||||
RAM: ${chalk.green('40%')}
|
||||
DISK: ${chalk.yellow('70%')}
|
||||
`);
|
||||
|
||||
// ES2015 tagged template literal
|
||||
log(chalk`
|
||||
CPU: {red ${cpu.totalPercent}%}
|
||||
RAM: {green ${ram.used / ram.total * 100}%}
|
||||
DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
|
||||
`);
|
||||
|
||||
// Use RGB colors in terminal emulators that support it.
|
||||
log(chalk.keyword('orange')('Yay for orange colored text!'));
|
||||
log(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));
|
||||
log(chalk.hex('#DEADED').bold('Bold gray!'));
|
||||
```
|
||||
|
||||
Easily define your own themes:
|
||||
|
||||
```js
|
||||
const chalk = require('chalk');
|
||||
|
||||
const error = chalk.bold.red;
|
||||
const warning = chalk.keyword('orange');
|
||||
|
||||
console.log(error('Error!'));
|
||||
console.log(warning('Warning!'));
|
||||
```
|
||||
|
||||
Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):
|
||||
|
||||
```js
|
||||
const name = 'Sindre';
|
||||
console.log(chalk.green('Hello %s'), name);
|
||||
//=> 'Hello Sindre'
|
||||
```
|
||||
|
||||
|
||||
## API
|
||||
|
||||
### chalk.`<style>[.<style>...](string, [string...])`
|
||||
|
||||
Example: `chalk.red.bold.underline('Hello', 'world');`
|
||||
|
||||
Chain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
|
||||
|
||||
Multiple arguments will be separated by space.
|
||||
|
||||
### chalk.enabled
|
||||
|
||||
Color support is automatically detected, as is the level (see `chalk.level`). However, if you'd like to simply enable/disable Chalk, you can do so via the `.enabled` property.
|
||||
|
||||
Chalk is enabled by default unless explicitly disabled via the constructor or `chalk.level` is `0`.
|
||||
|
||||
If you need to change this in a reusable module, create a new instance:
|
||||
|
||||
```js
|
||||
const ctx = new chalk.constructor({enabled: false});
|
||||
```
|
||||
|
||||
### chalk.level
|
||||
|
||||
Color support is automatically detected, but you can override it by setting the `level` property. You should however only do this in your own code as it applies globally to all Chalk consumers.
|
||||
|
||||
If you need to change this in a reusable module, create a new instance:
|
||||
|
||||
```js
|
||||
const ctx = new chalk.constructor({level: 0});
|
||||
```
|
||||
|
||||
Levels are as follows:
|
||||
|
||||
0. All colors disabled
|
||||
1. Basic color support (16 colors)
|
||||
2. 256 color support
|
||||
3. Truecolor support (16 million colors)
|
||||
|
||||
### chalk.supportsColor
|
||||
|
||||
Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.
|
||||
|
||||
Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.
|
||||
|
||||
Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.
|
||||
|
||||
|
||||
## Styles
|
||||
|
||||
### Modifiers
|
||||
|
||||
- `reset`
|
||||
- `bold`
|
||||
- `dim`
|
||||
- `italic` *(Not widely supported)*
|
||||
- `underline`
|
||||
- `inverse`
|
||||
- `hidden`
|
||||
- `strikethrough` *(Not widely supported)*
|
||||
- `visible` (Text is emitted only if enabled)
|
||||
|
||||
### Colors
|
||||
|
||||
- `black`
|
||||
- `red`
|
||||
- `green`
|
||||
- `yellow`
|
||||
- `blue` *(On Windows the bright version is used since normal blue is illegible)*
|
||||
- `magenta`
|
||||
- `cyan`
|
||||
- `white`
|
||||
- `gray` ("bright black")
|
||||
- `redBright`
|
||||
- `greenBright`
|
||||
- `yellowBright`
|
||||
- `blueBright`
|
||||
- `magentaBright`
|
||||
- `cyanBright`
|
||||
- `whiteBright`
|
||||
|
||||
### Background colors
|
||||
|
||||
- `bgBlack`
|
||||
- `bgRed`
|
||||
- `bgGreen`
|
||||
- `bgYellow`
|
||||
- `bgBlue`
|
||||
- `bgMagenta`
|
||||
- `bgCyan`
|
||||
- `bgWhite`
|
||||
- `bgBlackBright`
|
||||
- `bgRedBright`
|
||||
- `bgGreenBright`
|
||||
- `bgYellowBright`
|
||||
- `bgBlueBright`
|
||||
- `bgMagentaBright`
|
||||
- `bgCyanBright`
|
||||
- `bgWhiteBright`
|
||||
|
||||
|
||||
## Tagged template literal
|
||||
|
||||
Chalk can be used as a [tagged template literal](http://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals).
|
||||
|
||||
```js
|
||||
const chalk = require('chalk');
|
||||
|
||||
const miles = 18;
|
||||
const calculateFeet = miles => miles * 5280;
|
||||
|
||||
console.log(chalk`
|
||||
There are {bold 5280 feet} in a mile.
|
||||
In {bold ${miles} miles}, there are {green.bold ${calculateFeet(miles)} feet}.
|
||||
`);
|
||||
```
|
||||
|
||||
Blocks are delimited by an opening curly brace (`{`), a style, some content, and a closing curly brace (`}`).
|
||||
|
||||
Template styles are chained exactly like normal Chalk styles. The following two statements are equivalent:
|
||||
|
||||
```js
|
||||
console.log(chalk.bold.rgb(10, 100, 200)('Hello!'));
|
||||
console.log(chalk`{bold.rgb(10,100,200) Hello!}`);
|
||||
```
|
||||
|
||||
Note that function styles (`rgb()`, `hsl()`, `keyword()`, etc.) may not contain spaces between parameters.
|
||||
|
||||
All interpolated values (`` chalk`${foo}` ``) are converted to strings via the `.toString()` method. All curly braces (`{` and `}`) in interpolated value strings are escaped.
|
||||
|
||||
|
||||
## 256 and Truecolor color support
|
||||
|
||||
Chalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps.
|
||||
|
||||
Colors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying `{level: n}` as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).
|
||||
|
||||
Examples:
|
||||
|
||||
- `chalk.hex('#DEADED').underline('Hello, world!')`
|
||||
- `chalk.keyword('orange')('Some orange text')`
|
||||
- `chalk.rgb(15, 100, 204).inverse('Hello!')`
|
||||
|
||||
Background versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `keyword` for foreground colors and `bgKeyword` for background colors).
|
||||
|
||||
- `chalk.bgHex('#DEADED').underline('Hello, world!')`
|
||||
- `chalk.bgKeyword('orange')('Some orange text')`
|
||||
- `chalk.bgRgb(15, 100, 204).inverse('Hello!')`
|
||||
|
||||
The following color models can be used:
|
||||
|
||||
- [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')`
|
||||
- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')`
|
||||
- [`keyword`](https://www.w3.org/wiki/CSS/Properties/color/keywords) (CSS keywords) - Example: `chalk.keyword('orange').bold('Orange!')`
|
||||
- [`hsl`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsl(32, 100, 50).bold('Orange!')`
|
||||
- [`hsv`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsv(32, 100, 100).bold('Orange!')`
|
||||
- [`hwb`](https://en.wikipedia.org/wiki/HWB_color_model) - Example: `chalk.hwb(32, 0, 50).bold('Orange!')`
|
||||
- `ansi16`
|
||||
- `ansi256`
|
||||
|
||||
|
||||
## Windows
|
||||
|
||||
If you're on Windows, do yourself a favor and use [`cmder`](http://cmder.net/) instead of `cmd.exe`.
|
||||
|
||||
|
||||
## Origin story
|
||||
|
||||
[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative.
|
||||
|
||||
|
||||
## Related
|
||||
|
||||
- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module
|
||||
- [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal
|
||||
- [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color
|
||||
- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes
|
||||
- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Strip ANSI escape codes from a stream
|
||||
- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
|
||||
- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
|
||||
- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes
|
||||
- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes
|
||||
- [color-convert](https://github.com/qix-/color-convert) - Converts colors between different models
|
||||
- [chalk-animation](https://github.com/bokub/chalk-animation) - Animate strings in the terminal
|
||||
- [gradient-string](https://github.com/bokub/gradient-string) - Apply color gradients to strings
|
||||
- [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings
|
||||
- [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal
|
||||
|
||||
|
||||
## Maintainers
|
||||
|
||||
- [Sindre Sorhus](https://github.com/sindresorhus)
|
||||
- [Josh Junon](https://github.com/qix-)
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
128
web/node_modules/react-dev-utils/node_modules/chalk/templates.js
generated
vendored
Normal file
128
web/node_modules/react-dev-utils/node_modules/chalk/templates.js
generated
vendored
Normal file
|
@ -0,0 +1,128 @@
|
|||
'use strict';
|
||||
const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
|
||||
const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
|
||||
const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
|
||||
const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;
|
||||
|
||||
const ESCAPES = new Map([
|
||||
['n', '\n'],
|
||||
['r', '\r'],
|
||||
['t', '\t'],
|
||||
['b', '\b'],
|
||||
['f', '\f'],
|
||||
['v', '\v'],
|
||||
['0', '\0'],
|
||||
['\\', '\\'],
|
||||
['e', '\u001B'],
|
||||
['a', '\u0007']
|
||||
]);
|
||||
|
||||
function unescape(c) {
|
||||
if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
|
||||
return String.fromCharCode(parseInt(c.slice(1), 16));
|
||||
}
|
||||
|
||||
return ESCAPES.get(c) || c;
|
||||
}
|
||||
|
||||
function parseArguments(name, args) {
|
||||
const results = [];
|
||||
const chunks = args.trim().split(/\s*,\s*/g);
|
||||
let matches;
|
||||
|
||||
for (const chunk of chunks) {
|
||||
if (!isNaN(chunk)) {
|
||||
results.push(Number(chunk));
|
||||
} else if ((matches = chunk.match(STRING_REGEX))) {
|
||||
results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));
|
||||
} else {
|
||||
throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
function parseStyle(style) {
|
||||
STYLE_REGEX.lastIndex = 0;
|
||||
|
||||
const results = [];
|
||||
let matches;
|
||||
|
||||
while ((matches = STYLE_REGEX.exec(style)) !== null) {
|
||||
const name = matches[1];
|
||||
|
||||
if (matches[2]) {
|
||||
const args = parseArguments(name, matches[2]);
|
||||
results.push([name].concat(args));
|
||||
} else {
|
||||
results.push([name]);
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
function buildStyle(chalk, styles) {
|
||||
const enabled = {};
|
||||
|
||||
for (const layer of styles) {
|
||||
for (const style of layer.styles) {
|
||||
enabled[style[0]] = layer.inverse ? null : style.slice(1);
|
||||
}
|
||||
}
|
||||
|
||||
let current = chalk;
|
||||
for (const styleName of Object.keys(enabled)) {
|
||||
if (Array.isArray(enabled[styleName])) {
|
||||
if (!(styleName in current)) {
|
||||
throw new Error(`Unknown Chalk style: ${styleName}`);
|
||||
}
|
||||
|
||||
if (enabled[styleName].length > 0) {
|
||||
current = current[styleName].apply(current, enabled[styleName]);
|
||||
} else {
|
||||
current = current[styleName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return current;
|
||||
}
|
||||
|
||||
module.exports = (chalk, tmp) => {
|
||||
const styles = [];
|
||||
const chunks = [];
|
||||
let chunk = [];
|
||||
|
||||
// eslint-disable-next-line max-params
|
||||
tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {
|
||||
if (escapeChar) {
|
||||
chunk.push(unescape(escapeChar));
|
||||
} else if (style) {
|
||||
const str = chunk.join('');
|
||||
chunk = [];
|
||||
chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));
|
||||
styles.push({inverse, styles: parseStyle(style)});
|
||||
} else if (close) {
|
||||
if (styles.length === 0) {
|
||||
throw new Error('Found extraneous } in Chalk template literal');
|
||||
}
|
||||
|
||||
chunks.push(buildStyle(chalk, styles)(chunk.join('')));
|
||||
chunk = [];
|
||||
styles.pop();
|
||||
} else {
|
||||
chunk.push(chr);
|
||||
}
|
||||
});
|
||||
|
||||
chunks.push(chunk.join(''));
|
||||
|
||||
if (styles.length > 0) {
|
||||
const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
|
||||
throw new Error(errMsg);
|
||||
}
|
||||
|
||||
return chunks.join('');
|
||||
};
|
97
web/node_modules/react-dev-utils/node_modules/chalk/types/index.d.ts
generated
vendored
Normal file
97
web/node_modules/react-dev-utils/node_modules/chalk/types/index.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,97 @@
|
|||
// Type definitions for Chalk
|
||||
// Definitions by: Thomas Sauer <https://github.com/t-sauer>
|
||||
|
||||
export const enum Level {
|
||||
None = 0,
|
||||
Basic = 1,
|
||||
Ansi256 = 2,
|
||||
TrueColor = 3
|
||||
}
|
||||
|
||||
export interface ChalkOptions {
|
||||
enabled?: boolean;
|
||||
level?: Level;
|
||||
}
|
||||
|
||||
export interface ChalkConstructor {
|
||||
new (options?: ChalkOptions): Chalk;
|
||||
(options?: ChalkOptions): Chalk;
|
||||
}
|
||||
|
||||
export interface ColorSupport {
|
||||
level: Level;
|
||||
hasBasic: boolean;
|
||||
has256: boolean;
|
||||
has16m: boolean;
|
||||
}
|
||||
|
||||
export interface Chalk {
|
||||
(...text: string[]): string;
|
||||
(text: TemplateStringsArray, ...placeholders: string[]): string;
|
||||
constructor: ChalkConstructor;
|
||||
enabled: boolean;
|
||||
level: Level;
|
||||
rgb(r: number, g: number, b: number): this;
|
||||
hsl(h: number, s: number, l: number): this;
|
||||
hsv(h: number, s: number, v: number): this;
|
||||
hwb(h: number, w: number, b: number): this;
|
||||
bgHex(color: string): this;
|
||||
bgKeyword(color: string): this;
|
||||
bgRgb(r: number, g: number, b: number): this;
|
||||
bgHsl(h: number, s: number, l: number): this;
|
||||
bgHsv(h: number, s: number, v: number): this;
|
||||
bgHwb(h: number, w: number, b: number): this;
|
||||
hex(color: string): this;
|
||||
keyword(color: string): this;
|
||||
|
||||
readonly reset: this;
|
||||
readonly bold: this;
|
||||
readonly dim: this;
|
||||
readonly italic: this;
|
||||
readonly underline: this;
|
||||
readonly inverse: this;
|
||||
readonly hidden: this;
|
||||
readonly strikethrough: this;
|
||||
|
||||
readonly visible: this;
|
||||
|
||||
readonly black: this;
|
||||
readonly red: this;
|
||||
readonly green: this;
|
||||
readonly yellow: this;
|
||||
readonly blue: this;
|
||||
readonly magenta: this;
|
||||
readonly cyan: this;
|
||||
readonly white: this;
|
||||
readonly gray: this;
|
||||
readonly grey: this;
|
||||
readonly blackBright: this;
|
||||
readonly redBright: this;
|
||||
readonly greenBright: this;
|
||||
readonly yellowBright: this;
|
||||
readonly blueBright: this;
|
||||
readonly magentaBright: this;
|
||||
readonly cyanBright: this;
|
||||
readonly whiteBright: this;
|
||||
|
||||
readonly bgBlack: this;
|
||||
readonly bgRed: this;
|
||||
readonly bgGreen: this;
|
||||
readonly bgYellow: this;
|
||||
readonly bgBlue: this;
|
||||
readonly bgMagenta: this;
|
||||
readonly bgCyan: this;
|
||||
readonly bgWhite: this;
|
||||
readonly bgBlackBright: this;
|
||||
readonly bgRedBright: this;
|
||||
readonly bgGreenBright: this;
|
||||
readonly bgYellowBright: this;
|
||||
readonly bgBlueBright: this;
|
||||
readonly bgMagentaBright: this;
|
||||
readonly bgCyanBright: this;
|
||||
readonly bgWhiteBright: this;
|
||||
}
|
||||
|
||||
declare const chalk: Chalk & { supportsColor: ColorSupport };
|
||||
|
||||
export default chalk
|
54
web/node_modules/react-dev-utils/node_modules/color-convert/CHANGELOG.md
generated
vendored
Normal file
54
web/node_modules/react-dev-utils/node_modules/color-convert/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
# 1.0.0 - 2016-01-07
|
||||
|
||||
- Removed: unused speed test
|
||||
- Added: Automatic routing between previously unsupported conversions
|
||||
([#27](https://github.com/Qix-/color-convert/pull/27))
|
||||
- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions
|
||||
([#27](https://github.com/Qix-/color-convert/pull/27))
|
||||
- Removed: `convert()` class
|
||||
([#27](https://github.com/Qix-/color-convert/pull/27))
|
||||
- Changed: all functions to lookup dictionary
|
||||
([#27](https://github.com/Qix-/color-convert/pull/27))
|
||||
- Changed: `ansi` to `ansi256`
|
||||
([#27](https://github.com/Qix-/color-convert/pull/27))
|
||||
- Fixed: argument grouping for functions requiring only one argument
|
||||
([#27](https://github.com/Qix-/color-convert/pull/27))
|
||||
|
||||
# 0.6.0 - 2015-07-23
|
||||
|
||||
- Added: methods to handle
|
||||
[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors:
|
||||
- rgb2ansi16
|
||||
- rgb2ansi
|
||||
- hsl2ansi16
|
||||
- hsl2ansi
|
||||
- hsv2ansi16
|
||||
- hsv2ansi
|
||||
- hwb2ansi16
|
||||
- hwb2ansi
|
||||
- cmyk2ansi16
|
||||
- cmyk2ansi
|
||||
- keyword2ansi16
|
||||
- keyword2ansi
|
||||
- ansi162rgb
|
||||
- ansi162hsl
|
||||
- ansi162hsv
|
||||
- ansi162hwb
|
||||
- ansi162cmyk
|
||||
- ansi162keyword
|
||||
- ansi2rgb
|
||||
- ansi2hsl
|
||||
- ansi2hsv
|
||||
- ansi2hwb
|
||||
- ansi2cmyk
|
||||
- ansi2keyword
|
||||
([#18](https://github.com/harthur/color-convert/pull/18))
|
||||
|
||||
# 0.5.3 - 2015-06-02
|
||||
|
||||
- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`
|
||||
([#15](https://github.com/harthur/color-convert/issues/15))
|
||||
|
||||
---
|
||||
|
||||
Check out commit logs for older releases
|
21
web/node_modules/react-dev-utils/node_modules/color-convert/LICENSE
generated
vendored
Normal file
21
web/node_modules/react-dev-utils/node_modules/color-convert/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>
|
||||
|
||||
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.
|
||||
|
68
web/node_modules/react-dev-utils/node_modules/color-convert/README.md
generated
vendored
Normal file
68
web/node_modules/react-dev-utils/node_modules/color-convert/README.md
generated
vendored
Normal file
|
@ -0,0 +1,68 @@
|
|||
# color-convert
|
||||
|
||||
[](https://travis-ci.org/Qix-/color-convert)
|
||||
|
||||
Color-convert is a color conversion library for JavaScript and node.
|
||||
It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):
|
||||
|
||||
```js
|
||||
var convert = require('color-convert');
|
||||
|
||||
convert.rgb.hsl(140, 200, 100); // [96, 48, 59]
|
||||
convert.keyword.rgb('blue'); // [0, 0, 255]
|
||||
|
||||
var rgbChannels = convert.rgb.channels; // 3
|
||||
var cmykChannels = convert.cmyk.channels; // 4
|
||||
var ansiChannels = convert.ansi16.channels; // 1
|
||||
```
|
||||
|
||||
# Install
|
||||
|
||||
```console
|
||||
$ npm install color-convert
|
||||
```
|
||||
|
||||
# API
|
||||
|
||||
Simply get the property of the _from_ and _to_ conversion that you're looking for.
|
||||
|
||||
All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.
|
||||
|
||||
All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).
|
||||
|
||||
```js
|
||||
var convert = require('color-convert');
|
||||
|
||||
// Hex to LAB
|
||||
convert.hex.lab('DEADBF'); // [ 76, 21, -2 ]
|
||||
convert.hex.lab.raw('DEADBF'); // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]
|
||||
|
||||
// RGB to CMYK
|
||||
convert.rgb.cmyk(167, 255, 4); // [ 35, 0, 98, 0 ]
|
||||
convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]
|
||||
```
|
||||
|
||||
### Arrays
|
||||
All functions that accept multiple arguments also support passing an array.
|
||||
|
||||
Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)
|
||||
|
||||
```js
|
||||
var convert = require('color-convert');
|
||||
|
||||
convert.rgb.hex(123, 45, 67); // '7B2D43'
|
||||
convert.rgb.hex([123, 45, 67]); // '7B2D43'
|
||||
```
|
||||
|
||||
## Routing
|
||||
|
||||
Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).
|
||||
|
||||
Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js).
|
||||
|
||||
# Contribute
|
||||
|
||||
If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.
|
||||
|
||||
# License
|
||||
Copyright © 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).
|
868
web/node_modules/react-dev-utils/node_modules/color-convert/conversions.js
generated
vendored
Normal file
868
web/node_modules/react-dev-utils/node_modules/color-convert/conversions.js
generated
vendored
Normal file
|
@ -0,0 +1,868 @@
|
|||
/* MIT license */
|
||||
var cssKeywords = require('color-name');
|
||||
|
||||
// NOTE: conversions should only return primitive values (i.e. arrays, or
|
||||
// values that give correct `typeof` results).
|
||||
// do not use box values types (i.e. Number(), String(), etc.)
|
||||
|
||||
var reverseKeywords = {};
|
||||
for (var key in cssKeywords) {
|
||||
if (cssKeywords.hasOwnProperty(key)) {
|
||||
reverseKeywords[cssKeywords[key]] = key;
|
||||
}
|
||||
}
|
||||
|
||||
var convert = module.exports = {
|
||||
rgb: {channels: 3, labels: 'rgb'},
|
||||
hsl: {channels: 3, labels: 'hsl'},
|
||||
hsv: {channels: 3, labels: 'hsv'},
|
||||
hwb: {channels: 3, labels: 'hwb'},
|
||||
cmyk: {channels: 4, labels: 'cmyk'},
|
||||
xyz: {channels: 3, labels: 'xyz'},
|
||||
lab: {channels: 3, labels: 'lab'},
|
||||
lch: {channels: 3, labels: 'lch'},
|
||||
hex: {channels: 1, labels: ['hex']},
|
||||
keyword: {channels: 1, labels: ['keyword']},
|
||||
ansi16: {channels: 1, labels: ['ansi16']},
|
||||
ansi256: {channels: 1, labels: ['ansi256']},
|
||||
hcg: {channels: 3, labels: ['h', 'c', 'g']},
|
||||
apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
|
||||
gray: {channels: 1, labels: ['gray']}
|
||||
};
|
||||
|
||||
// hide .channels and .labels properties
|
||||
for (var model in convert) {
|
||||
if (convert.hasOwnProperty(model)) {
|
||||
if (!('channels' in convert[model])) {
|
||||
throw new Error('missing channels property: ' + model);
|
||||
}
|
||||
|
||||
if (!('labels' in convert[model])) {
|
||||
throw new Error('missing channel labels property: ' + model);
|
||||
}
|
||||
|
||||
if (convert[model].labels.length !== convert[model].channels) {
|
||||
throw new Error('channel and label counts mismatch: ' + model);
|
||||
}
|
||||
|
||||
var channels = convert[model].channels;
|
||||
var labels = convert[model].labels;
|
||||
delete convert[model].channels;
|
||||
delete convert[model].labels;
|
||||
Object.defineProperty(convert[model], 'channels', {value: channels});
|
||||
Object.defineProperty(convert[model], 'labels', {value: labels});
|
||||
}
|
||||
}
|
||||
|
||||
convert.rgb.hsl = function (rgb) {
|
||||
var r = rgb[0] / 255;
|
||||
var g = rgb[1] / 255;
|
||||
var b = rgb[2] / 255;
|
||||
var min = Math.min(r, g, b);
|
||||
var max = Math.max(r, g, b);
|
||||
var delta = max - min;
|
||||
var h;
|
||||
var s;
|
||||
var l;
|
||||
|
||||
if (max === min) {
|
||||
h = 0;
|
||||
} else if (r === max) {
|
||||
h = (g - b) / delta;
|
||||
} else if (g === max) {
|
||||
h = 2 + (b - r) / delta;
|
||||
} else if (b === max) {
|
||||
h = 4 + (r - g) / delta;
|
||||
}
|
||||
|
||||
h = Math.min(h * 60, 360);
|
||||
|
||||
if (h < 0) {
|
||||
h += 360;
|
||||
}
|
||||
|
||||
l = (min + max) / 2;
|
||||
|
||||
if (max === min) {
|
||||
s = 0;
|
||||
} else if (l <= 0.5) {
|
||||
s = delta / (max + min);
|
||||
} else {
|
||||
s = delta / (2 - max - min);
|
||||
}
|
||||
|
||||
return [h, s * 100, l * 100];
|
||||
};
|
||||
|
||||
convert.rgb.hsv = function (rgb) {
|
||||
var rdif;
|
||||
var gdif;
|
||||
var bdif;
|
||||
var h;
|
||||
var s;
|
||||
|
||||
var r = rgb[0] / 255;
|
||||
var g = rgb[1] / 255;
|
||||
var b = rgb[2] / 255;
|
||||
var v = Math.max(r, g, b);
|
||||
var diff = v - Math.min(r, g, b);
|
||||
var diffc = function (c) {
|
||||
return (v - c) / 6 / diff + 1 / 2;
|
||||
};
|
||||
|
||||
if (diff === 0) {
|
||||
h = s = 0;
|
||||
} else {
|
||||
s = diff / v;
|
||||
rdif = diffc(r);
|
||||
gdif = diffc(g);
|
||||
bdif = diffc(b);
|
||||
|
||||
if (r === v) {
|
||||
h = bdif - gdif;
|
||||
} else if (g === v) {
|
||||
h = (1 / 3) + rdif - bdif;
|
||||
} else if (b === v) {
|
||||
h = (2 / 3) + gdif - rdif;
|
||||
}
|
||||
if (h < 0) {
|
||||
h += 1;
|
||||
} else if (h > 1) {
|
||||
h -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
h * 360,
|
||||
s * 100,
|
||||
v * 100
|
||||
];
|
||||
};
|
||||
|
||||
convert.rgb.hwb = function (rgb) {
|
||||
var r = rgb[0];
|
||||
var g = rgb[1];
|
||||
var b = rgb[2];
|
||||
var h = convert.rgb.hsl(rgb)[0];
|
||||
var w = 1 / 255 * Math.min(r, Math.min(g, b));
|
||||
|
||||
b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
|
||||
|
||||
return [h, w * 100, b * 100];
|
||||
};
|
||||
|
||||
convert.rgb.cmyk = function (rgb) {
|
||||
var r = rgb[0] / 255;
|
||||
var g = rgb[1] / 255;
|
||||
var b = rgb[2] / 255;
|
||||
var c;
|
||||
var m;
|
||||
var y;
|
||||
var k;
|
||||
|
||||
k = Math.min(1 - r, 1 - g, 1 - b);
|
||||
c = (1 - r - k) / (1 - k) || 0;
|
||||
m = (1 - g - k) / (1 - k) || 0;
|
||||
y = (1 - b - k) / (1 - k) || 0;
|
||||
|
||||
return [c * 100, m * 100, y * 100, k * 100];
|
||||
};
|
||||
|
||||
/**
|
||||
* See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
|
||||
* */
|
||||
function comparativeDistance(x, y) {
|
||||
return (
|
||||
Math.pow(x[0] - y[0], 2) +
|
||||
Math.pow(x[1] - y[1], 2) +
|
||||
Math.pow(x[2] - y[2], 2)
|
||||
);
|
||||
}
|
||||
|
||||
convert.rgb.keyword = function (rgb) {
|
||||
var reversed = reverseKeywords[rgb];
|
||||
if (reversed) {
|
||||
return reversed;
|
||||
}
|
||||
|
||||
var currentClosestDistance = Infinity;
|
||||
var currentClosestKeyword;
|
||||
|
||||
for (var keyword in cssKeywords) {
|
||||
if (cssKeywords.hasOwnProperty(keyword)) {
|
||||
var value = cssKeywords[keyword];
|
||||
|
||||
// Compute comparative distance
|
||||
var distance = comparativeDistance(rgb, value);
|
||||
|
||||
// Check if its less, if so set as closest
|
||||
if (distance < currentClosestDistance) {
|
||||
currentClosestDistance = distance;
|
||||
currentClosestKeyword = keyword;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return currentClosestKeyword;
|
||||
};
|
||||
|
||||
convert.keyword.rgb = function (keyword) {
|
||||
return cssKeywords[keyword];
|
||||
};
|
||||
|
||||
convert.rgb.xyz = function (rgb) {
|
||||
var r = rgb[0] / 255;
|
||||
var g = rgb[1] / 255;
|
||||
var b = rgb[2] / 255;
|
||||
|
||||
// assume sRGB
|
||||
r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
|
||||
g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
|
||||
b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
|
||||
|
||||
var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
|
||||
var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
|
||||
var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
|
||||
|
||||
return [x * 100, y * 100, z * 100];
|
||||
};
|
||||
|
||||
convert.rgb.lab = function (rgb) {
|
||||
var xyz = convert.rgb.xyz(rgb);
|
||||
var x = xyz[0];
|
||||
var y = xyz[1];
|
||||
var z = xyz[2];
|
||||
var l;
|
||||
var a;
|
||||
var b;
|
||||
|
||||
x /= 95.047;
|
||||
y /= 100;
|
||||
z /= 108.883;
|
||||
|
||||
x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
|
||||
y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
|
||||
z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
|
||||
|
||||
l = (116 * y) - 16;
|
||||
a = 500 * (x - y);
|
||||
b = 200 * (y - z);
|
||||
|
||||
return [l, a, b];
|
||||
};
|
||||
|
||||
convert.hsl.rgb = function (hsl) {
|
||||
var h = hsl[0] / 360;
|
||||
var s = hsl[1] / 100;
|
||||
var l = hsl[2] / 100;
|
||||
var t1;
|
||||
var t2;
|
||||
var t3;
|
||||
var rgb;
|
||||
var val;
|
||||
|
||||
if (s === 0) {
|
||||
val = l * 255;
|
||||
return [val, val, val];
|
||||
}
|
||||
|
||||
if (l < 0.5) {
|
||||
t2 = l * (1 + s);
|
||||
} else {
|
||||
t2 = l + s - l * s;
|
||||
}
|
||||
|
||||
t1 = 2 * l - t2;
|
||||
|
||||
rgb = [0, 0, 0];
|
||||
for (var i = 0; i < 3; i++) {
|
||||
t3 = h + 1 / 3 * -(i - 1);
|
||||
if (t3 < 0) {
|
||||
t3++;
|
||||
}
|
||||
if (t3 > 1) {
|
||||
t3--;
|
||||
}
|
||||
|
||||
if (6 * t3 < 1) {
|
||||
val = t1 + (t2 - t1) * 6 * t3;
|
||||
} else if (2 * t3 < 1) {
|
||||
val = t2;
|
||||
} else if (3 * t3 < 2) {
|
||||
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
|
||||
} else {
|
||||
val = t1;
|
||||
}
|
||||
|
||||
rgb[i] = val * 255;
|
||||
}
|
||||
|
||||
return rgb;
|
||||
};
|
||||
|
||||
convert.hsl.hsv = function (hsl) {
|
||||
var h = hsl[0];
|
||||
var s = hsl[1] / 100;
|
||||
var l = hsl[2] / 100;
|
||||
var smin = s;
|
||||
var lmin = Math.max(l, 0.01);
|
||||
var sv;
|
||||
var v;
|
||||
|
||||
l *= 2;
|
||||
s *= (l <= 1) ? l : 2 - l;
|
||||
smin *= lmin <= 1 ? lmin : 2 - lmin;
|
||||
v = (l + s) / 2;
|
||||
sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
|
||||
|
||||
return [h, sv * 100, v * 100];
|
||||
};
|
||||
|
||||
convert.hsv.rgb = function (hsv) {
|
||||
var h = hsv[0] / 60;
|
||||
var s = hsv[1] / 100;
|
||||
var v = hsv[2] / 100;
|
||||
var hi = Math.floor(h) % 6;
|
||||
|
||||
var f = h - Math.floor(h);
|
||||
var p = 255 * v * (1 - s);
|
||||
var q = 255 * v * (1 - (s * f));
|
||||
var t = 255 * v * (1 - (s * (1 - f)));
|
||||
v *= 255;
|
||||
|
||||
switch (hi) {
|
||||
case 0:
|
||||
return [v, t, p];
|
||||
case 1:
|
||||
return [q, v, p];
|
||||
case 2:
|
||||
return [p, v, t];
|
||||
case 3:
|
||||
return [p, q, v];
|
||||
case 4:
|
||||
return [t, p, v];
|
||||
case 5:
|
||||
return [v, p, q];
|
||||
}
|
||||
};
|
||||
|
||||
convert.hsv.hsl = function (hsv) {
|
||||
var h = hsv[0];
|
||||
var s = hsv[1] / 100;
|
||||
var v = hsv[2] / 100;
|
||||
var vmin = Math.max(v, 0.01);
|
||||
var lmin;
|
||||
var sl;
|
||||
var l;
|
||||
|
||||
l = (2 - s) * v;
|
||||
lmin = (2 - s) * vmin;
|
||||
sl = s * vmin;
|
||||
sl /= (lmin <= 1) ? lmin : 2 - lmin;
|
||||
sl = sl || 0;
|
||||
l /= 2;
|
||||
|
||||
return [h, sl * 100, l * 100];
|
||||
};
|
||||
|
||||
// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
|
||||
convert.hwb.rgb = function (hwb) {
|
||||
var h = hwb[0] / 360;
|
||||
var wh = hwb[1] / 100;
|
||||
var bl = hwb[2] / 100;
|
||||
var ratio = wh + bl;
|
||||
var i;
|
||||
var v;
|
||||
var f;
|
||||
var n;
|
||||
|
||||
// wh + bl cant be > 1
|
||||
if (ratio > 1) {
|
||||
wh /= ratio;
|
||||
bl /= ratio;
|
||||
}
|
||||
|
||||
i = Math.floor(6 * h);
|
||||
v = 1 - bl;
|
||||
f = 6 * h - i;
|
||||
|
||||
if ((i & 0x01) !== 0) {
|
||||
f = 1 - f;
|
||||
}
|
||||
|
||||
n = wh + f * (v - wh); // linear interpolation
|
||||
|
||||
var r;
|
||||
var g;
|
||||
var b;
|
||||
switch (i) {
|
||||
default:
|
||||
case 6:
|
||||
case 0: r = v; g = n; b = wh; break;
|
||||
case 1: r = n; g = v; b = wh; break;
|
||||
case 2: r = wh; g = v; b = n; break;
|
||||
case 3: r = wh; g = n; b = v; break;
|
||||
case 4: r = n; g = wh; b = v; break;
|
||||
case 5: r = v; g = wh; b = n; break;
|
||||
}
|
||||
|
||||
return [r * 255, g * 255, b * 255];
|
||||
};
|
||||
|
||||
convert.cmyk.rgb = function (cmyk) {
|
||||
var c = cmyk[0] / 100;
|
||||
var m = cmyk[1] / 100;
|
||||
var y = cmyk[2] / 100;
|
||||
var k = cmyk[3] / 100;
|
||||
var r;
|
||||
var g;
|
||||
var b;
|
||||
|
||||
r = 1 - Math.min(1, c * (1 - k) + k);
|
||||
g = 1 - Math.min(1, m * (1 - k) + k);
|
||||
b = 1 - Math.min(1, y * (1 - k) + k);
|
||||
|
||||
return [r * 255, g * 255, b * 255];
|
||||
};
|
||||
|
||||
convert.xyz.rgb = function (xyz) {
|
||||
var x = xyz[0] / 100;
|
||||
var y = xyz[1] / 100;
|
||||
var z = xyz[2] / 100;
|
||||
var r;
|
||||
var g;
|
||||
var b;
|
||||
|
||||
r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
|
||||
g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
|
||||
b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
|
||||
|
||||
// assume sRGB
|
||||
r = r > 0.0031308
|
||||
? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
|
||||
: r * 12.92;
|
||||
|
||||
g = g > 0.0031308
|
||||
? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
|
||||
: g * 12.92;
|
||||
|
||||
b = b > 0.0031308
|
||||
? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
|
||||
: b * 12.92;
|
||||
|
||||
r = Math.min(Math.max(0, r), 1);
|
||||
g = Math.min(Math.max(0, g), 1);
|
||||
b = Math.min(Math.max(0, b), 1);
|
||||
|
||||
return [r * 255, g * 255, b * 255];
|
||||
};
|
||||
|
||||
convert.xyz.lab = function (xyz) {
|
||||
var x = xyz[0];
|
||||
var y = xyz[1];
|
||||
var z = xyz[2];
|
||||
var l;
|
||||
var a;
|
||||
var b;
|
||||
|
||||
x /= 95.047;
|
||||
y /= 100;
|
||||
z /= 108.883;
|
||||
|
||||
x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
|
||||
y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
|
||||
z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
|
||||
|
||||
l = (116 * y) - 16;
|
||||
a = 500 * (x - y);
|
||||
b = 200 * (y - z);
|
||||
|
||||
return [l, a, b];
|
||||
};
|
||||
|
||||
convert.lab.xyz = function (lab) {
|
||||
var l = lab[0];
|
||||
var a = lab[1];
|
||||
var b = lab[2];
|
||||
var x;
|
||||
var y;
|
||||
var z;
|
||||
|
||||
y = (l + 16) / 116;
|
||||
x = a / 500 + y;
|
||||
z = y - b / 200;
|
||||
|
||||
var y2 = Math.pow(y, 3);
|
||||
var x2 = Math.pow(x, 3);
|
||||
var z2 = Math.pow(z, 3);
|
||||
y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
|
||||
x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
|
||||
z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
|
||||
|
||||
x *= 95.047;
|
||||
y *= 100;
|
||||
z *= 108.883;
|
||||
|
||||
return [x, y, z];
|
||||
};
|
||||
|
||||
convert.lab.lch = function (lab) {
|
||||
var l = lab[0];
|
||||
var a = lab[1];
|
||||
var b = lab[2];
|
||||
var hr;
|
||||
var h;
|
||||
var c;
|
||||
|
||||
hr = Math.atan2(b, a);
|
||||
h = hr * 360 / 2 / Math.PI;
|
||||
|
||||
if (h < 0) {
|
||||
h += 360;
|
||||
}
|
||||
|
||||
c = Math.sqrt(a * a + b * b);
|
||||
|
||||
return [l, c, h];
|
||||
};
|
||||
|
||||
convert.lch.lab = function (lch) {
|
||||
var l = lch[0];
|
||||
var c = lch[1];
|
||||
var h = lch[2];
|
||||
var a;
|
||||
var b;
|
||||
var hr;
|
||||
|
||||
hr = h / 360 * 2 * Math.PI;
|
||||
a = c * Math.cos(hr);
|
||||
b = c * Math.sin(hr);
|
||||
|
||||
return [l, a, b];
|
||||
};
|
||||
|
||||
convert.rgb.ansi16 = function (args) {
|
||||
var r = args[0];
|
||||
var g = args[1];
|
||||
var b = args[2];
|
||||
var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
|
||||
|
||||
value = Math.round(value / 50);
|
||||
|
||||
if (value === 0) {
|
||||
return 30;
|
||||
}
|
||||
|
||||
var ansi = 30
|
||||
+ ((Math.round(b / 255) << 2)
|
||||
| (Math.round(g / 255) << 1)
|
||||
| Math.round(r / 255));
|
||||
|
||||
if (value === 2) {
|
||||
ansi += 60;
|
||||
}
|
||||
|
||||
return ansi;
|
||||
};
|
||||
|
||||
convert.hsv.ansi16 = function (args) {
|
||||
// optimization here; we already know the value and don't need to get
|
||||
// it converted for us.
|
||||
return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
|
||||
};
|
||||
|
||||
convert.rgb.ansi256 = function (args) {
|
||||
var r = args[0];
|
||||
var g = args[1];
|
||||
var b = args[2];
|
||||
|
||||
// we use the extended greyscale palette here, with the exception of
|
||||
// black and white. normal palette only has 4 greyscale shades.
|
||||
if (r === g && g === b) {
|
||||
if (r < 8) {
|
||||
return 16;
|
||||
}
|
||||
|
||||
if (r > 248) {
|
||||
return 231;
|
||||
}
|
||||
|
||||
return Math.round(((r - 8) / 247) * 24) + 232;
|
||||
}
|
||||
|
||||
var ansi = 16
|
||||
+ (36 * Math.round(r / 255 * 5))
|
||||
+ (6 * Math.round(g / 255 * 5))
|
||||
+ Math.round(b / 255 * 5);
|
||||
|
||||
return ansi;
|
||||
};
|
||||
|
||||
convert.ansi16.rgb = function (args) {
|
||||
var color = args % 10;
|
||||
|
||||
// handle greyscale
|
||||
if (color === 0 || color === 7) {
|
||||
if (args > 50) {
|
||||
color += 3.5;
|
||||
}
|
||||
|
||||
color = color / 10.5 * 255;
|
||||
|
||||
return [color, color, color];
|
||||
}
|
||||
|
||||
var mult = (~~(args > 50) + 1) * 0.5;
|
||||
var r = ((color & 1) * mult) * 255;
|
||||
var g = (((color >> 1) & 1) * mult) * 255;
|
||||
var b = (((color >> 2) & 1) * mult) * 255;
|
||||
|
||||
return [r, g, b];
|
||||
};
|
||||
|
||||
convert.ansi256.rgb = function (args) {
|
||||
// handle greyscale
|
||||
if (args >= 232) {
|
||||
var c = (args - 232) * 10 + 8;
|
||||
return [c, c, c];
|
||||
}
|
||||
|
||||
args -= 16;
|
||||
|
||||
var rem;
|
||||
var r = Math.floor(args / 36) / 5 * 255;
|
||||
var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
|
||||
var b = (rem % 6) / 5 * 255;
|
||||
|
||||
return [r, g, b];
|
||||
};
|
||||
|
||||
convert.rgb.hex = function (args) {
|
||||
var integer = ((Math.round(args[0]) & 0xFF) << 16)
|
||||
+ ((Math.round(args[1]) & 0xFF) << 8)
|
||||
+ (Math.round(args[2]) & 0xFF);
|
||||
|
||||
var string = integer.toString(16).toUpperCase();
|
||||
return '000000'.substring(string.length) + string;
|
||||
};
|
||||
|
||||
convert.hex.rgb = function (args) {
|
||||
var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
|
||||
if (!match) {
|
||||
return [0, 0, 0];
|
||||
}
|
||||
|
||||
var colorString = match[0];
|
||||
|
||||
if (match[0].length === 3) {
|
||||
colorString = colorString.split('').map(function (char) {
|
||||
return char + char;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
var integer = parseInt(colorString, 16);
|
||||
var r = (integer >> 16) & 0xFF;
|
||||
var g = (integer >> 8) & 0xFF;
|
||||
var b = integer & 0xFF;
|
||||
|
||||
return [r, g, b];
|
||||
};
|
||||
|
||||
convert.rgb.hcg = function (rgb) {
|
||||
var r = rgb[0] / 255;
|
||||
var g = rgb[1] / 255;
|
||||
var b = rgb[2] / 255;
|
||||
var max = Math.max(Math.max(r, g), b);
|
||||
var min = Math.min(Math.min(r, g), b);
|
||||
var chroma = (max - min);
|
||||
var grayscale;
|
||||
var hue;
|
||||
|
||||
if (chroma < 1) {
|
||||
grayscale = min / (1 - chroma);
|
||||
} else {
|
||||
grayscale = 0;
|
||||
}
|
||||
|
||||
if (chroma <= 0) {
|
||||
hue = 0;
|
||||
} else
|
||||
if (max === r) {
|
||||
hue = ((g - b) / chroma) % 6;
|
||||
} else
|
||||
if (max === g) {
|
||||
hue = 2 + (b - r) / chroma;
|
||||
} else {
|
||||
hue = 4 + (r - g) / chroma + 4;
|
||||
}
|
||||
|
||||
hue /= 6;
|
||||
hue %= 1;
|
||||
|
||||
return [hue * 360, chroma * 100, grayscale * 100];
|
||||
};
|
||||
|
||||
convert.hsl.hcg = function (hsl) {
|
||||
var s = hsl[1] / 100;
|
||||
var l = hsl[2] / 100;
|
||||
var c = 1;
|
||||
var f = 0;
|
||||
|
||||
if (l < 0.5) {
|
||||
c = 2.0 * s * l;
|
||||
} else {
|
||||
c = 2.0 * s * (1.0 - l);
|
||||
}
|
||||
|
||||
if (c < 1.0) {
|
||||
f = (l - 0.5 * c) / (1.0 - c);
|
||||
}
|
||||
|
||||
return [hsl[0], c * 100, f * 100];
|
||||
};
|
||||
|
||||
convert.hsv.hcg = function (hsv) {
|
||||
var s = hsv[1] / 100;
|
||||
var v = hsv[2] / 100;
|
||||
|
||||
var c = s * v;
|
||||
var f = 0;
|
||||
|
||||
if (c < 1.0) {
|
||||
f = (v - c) / (1 - c);
|
||||
}
|
||||
|
||||
return [hsv[0], c * 100, f * 100];
|
||||
};
|
||||
|
||||
convert.hcg.rgb = function (hcg) {
|
||||
var h = hcg[0] / 360;
|
||||
var c = hcg[1] / 100;
|
||||
var g = hcg[2] / 100;
|
||||
|
||||
if (c === 0.0) {
|
||||
return [g * 255, g * 255, g * 255];
|
||||
}
|
||||
|
||||
var pure = [0, 0, 0];
|
||||
var hi = (h % 1) * 6;
|
||||
var v = hi % 1;
|
||||
var w = 1 - v;
|
||||
var mg = 0;
|
||||
|
||||
switch (Math.floor(hi)) {
|
||||
case 0:
|
||||
pure[0] = 1; pure[1] = v; pure[2] = 0; break;
|
||||
case 1:
|
||||
pure[0] = w; pure[1] = 1; pure[2] = 0; break;
|
||||
case 2:
|
||||
pure[0] = 0; pure[1] = 1; pure[2] = v; break;
|
||||
case 3:
|
||||
pure[0] = 0; pure[1] = w; pure[2] = 1; break;
|
||||
case 4:
|
||||
pure[0] = v; pure[1] = 0; pure[2] = 1; break;
|
||||
default:
|
||||
pure[0] = 1; pure[1] = 0; pure[2] = w;
|
||||
}
|
||||
|
||||
mg = (1.0 - c) * g;
|
||||
|
||||
return [
|
||||
(c * pure[0] + mg) * 255,
|
||||
(c * pure[1] + mg) * 255,
|
||||
(c * pure[2] + mg) * 255
|
||||
];
|
||||
};
|
||||
|
||||
convert.hcg.hsv = function (hcg) {
|
||||
var c = hcg[1] / 100;
|
||||
var g = hcg[2] / 100;
|
||||
|
||||
var v = c + g * (1.0 - c);
|
||||
var f = 0;
|
||||
|
||||
if (v > 0.0) {
|
||||
f = c / v;
|
||||
}
|
||||
|
||||
return [hcg[0], f * 100, v * 100];
|
||||
};
|
||||
|
||||
convert.hcg.hsl = function (hcg) {
|
||||
var c = hcg[1] / 100;
|
||||
var g = hcg[2] / 100;
|
||||
|
||||
var l = g * (1.0 - c) + 0.5 * c;
|
||||
var s = 0;
|
||||
|
||||
if (l > 0.0 && l < 0.5) {
|
||||
s = c / (2 * l);
|
||||
} else
|
||||
if (l >= 0.5 && l < 1.0) {
|
||||
s = c / (2 * (1 - l));
|
||||
}
|
||||
|
||||
return [hcg[0], s * 100, l * 100];
|
||||
};
|
||||
|
||||
convert.hcg.hwb = function (hcg) {
|
||||
var c = hcg[1] / 100;
|
||||
var g = hcg[2] / 100;
|
||||
var v = c + g * (1.0 - c);
|
||||
return [hcg[0], (v - c) * 100, (1 - v) * 100];
|
||||
};
|
||||
|
||||
convert.hwb.hcg = function (hwb) {
|
||||
var w = hwb[1] / 100;
|
||||
var b = hwb[2] / 100;
|
||||
var v = 1 - b;
|
||||
var c = v - w;
|
||||
var g = 0;
|
||||
|
||||
if (c < 1) {
|
||||
g = (v - c) / (1 - c);
|
||||
}
|
||||
|
||||
return [hwb[0], c * 100, g * 100];
|
||||
};
|
||||
|
||||
convert.apple.rgb = function (apple) {
|
||||
return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
|
||||
};
|
||||
|
||||
convert.rgb.apple = function (rgb) {
|
||||
return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
|
||||
};
|
||||
|
||||
convert.gray.rgb = function (args) {
|
||||
return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
|
||||
};
|
||||
|
||||
convert.gray.hsl = convert.gray.hsv = function (args) {
|
||||
return [0, 0, args[0]];
|
||||
};
|
||||
|
||||
convert.gray.hwb = function (gray) {
|
||||
return [0, 100, gray[0]];
|
||||
};
|
||||
|
||||
convert.gray.cmyk = function (gray) {
|
||||
return [0, 0, 0, gray[0]];
|
||||
};
|
||||
|
||||
convert.gray.lab = function (gray) {
|
||||
return [gray[0], 0, 0];
|
||||
};
|
||||
|
||||
convert.gray.hex = function (gray) {
|
||||
var val = Math.round(gray[0] / 100 * 255) & 0xFF;
|
||||
var integer = (val << 16) + (val << 8) + val;
|
||||
|
||||
var string = integer.toString(16).toUpperCase();
|
||||
return '000000'.substring(string.length) + string;
|
||||
};
|
||||
|
||||
convert.rgb.gray = function (rgb) {
|
||||
var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
|
||||
return [val / 255 * 100];
|
||||
};
|
78
web/node_modules/react-dev-utils/node_modules/color-convert/index.js
generated
vendored
Normal file
78
web/node_modules/react-dev-utils/node_modules/color-convert/index.js
generated
vendored
Normal file
|
@ -0,0 +1,78 @@
|
|||
var conversions = require('./conversions');
|
||||
var route = require('./route');
|
||||
|
||||
var convert = {};
|
||||
|
||||
var models = Object.keys(conversions);
|
||||
|
||||
function wrapRaw(fn) {
|
||||
var wrappedFn = function (args) {
|
||||
if (args === undefined || args === null) {
|
||||
return args;
|
||||
}
|
||||
|
||||
if (arguments.length > 1) {
|
||||
args = Array.prototype.slice.call(arguments);
|
||||
}
|
||||
|
||||
return fn(args);
|
||||
};
|
||||
|
||||
// preserve .conversion property if there is one
|
||||
if ('conversion' in fn) {
|
||||
wrappedFn.conversion = fn.conversion;
|
||||
}
|
||||
|
||||
return wrappedFn;
|
||||
}
|
||||
|
||||
function wrapRounded(fn) {
|
||||
var wrappedFn = function (args) {
|
||||
if (args === undefined || args === null) {
|
||||
return args;
|
||||
}
|
||||
|
||||
if (arguments.length > 1) {
|
||||
args = Array.prototype.slice.call(arguments);
|
||||
}
|
||||
|
||||
var result = fn(args);
|
||||
|
||||
// we're assuming the result is an array here.
|
||||
// see notice in conversions.js; don't use box types
|
||||
// in conversion functions.
|
||||
if (typeof result === 'object') {
|
||||
for (var len = result.length, i = 0; i < len; i++) {
|
||||
result[i] = Math.round(result[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
// preserve .conversion property if there is one
|
||||
if ('conversion' in fn) {
|
||||
wrappedFn.conversion = fn.conversion;
|
||||
}
|
||||
|
||||
return wrappedFn;
|
||||
}
|
||||
|
||||
models.forEach(function (fromModel) {
|
||||
convert[fromModel] = {};
|
||||
|
||||
Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
|
||||
Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
|
||||
|
||||
var routes = route(fromModel);
|
||||
var routeModels = Object.keys(routes);
|
||||
|
||||
routeModels.forEach(function (toModel) {
|
||||
var fn = routes[toModel];
|
||||
|
||||
convert[fromModel][toModel] = wrapRounded(fn);
|
||||
convert[fromModel][toModel].raw = wrapRaw(fn);
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = convert;
|
46
web/node_modules/react-dev-utils/node_modules/color-convert/package.json
generated
vendored
Normal file
46
web/node_modules/react-dev-utils/node_modules/color-convert/package.json
generated
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
"name": "color-convert",
|
||||
"description": "Plain color conversion functions",
|
||||
"version": "1.9.3",
|
||||
"author": "Heather Arthur <fayearthur@gmail.com>",
|
||||
"license": "MIT",
|
||||
"repository": "Qix-/color-convert",
|
||||
"scripts": {
|
||||
"pretest": "xo",
|
||||
"test": "node test/basic.js"
|
||||
},
|
||||
"keywords": [
|
||||
"color",
|
||||
"colour",
|
||||
"convert",
|
||||
"converter",
|
||||
"conversion",
|
||||
"rgb",
|
||||
"hsl",
|
||||
"hsv",
|
||||
"hwb",
|
||||
"cmyk",
|
||||
"ansi",
|
||||
"ansi16"
|
||||
],
|
||||
"files": [
|
||||
"index.js",
|
||||
"conversions.js",
|
||||
"css-keywords.js",
|
||||
"route.js"
|
||||
],
|
||||
"xo": {
|
||||
"rules": {
|
||||
"default-case": 0,
|
||||
"no-inline-comments": 0,
|
||||
"operator-linebreak": 0
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"chalk": "1.1.1",
|
||||
"xo": "0.11.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"color-name": "1.1.3"
|
||||
}
|
||||
}
|
97
web/node_modules/react-dev-utils/node_modules/color-convert/route.js
generated
vendored
Normal file
97
web/node_modules/react-dev-utils/node_modules/color-convert/route.js
generated
vendored
Normal file
|
@ -0,0 +1,97 @@
|
|||
var conversions = require('./conversions');
|
||||
|
||||
/*
|
||||
this function routes a model to all other models.
|
||||
|
||||
all functions that are routed have a property `.conversion` attached
|
||||
to the returned synthetic function. This property is an array
|
||||
of strings, each with the steps in between the 'from' and 'to'
|
||||
color models (inclusive).
|
||||
|
||||
conversions that are not possible simply are not included.
|
||||
*/
|
||||
|
||||
function buildGraph() {
|
||||
var graph = {};
|
||||
// https://jsperf.com/object-keys-vs-for-in-with-closure/3
|
||||
var models = Object.keys(conversions);
|
||||
|
||||
for (var len = models.length, i = 0; i < len; i++) {
|
||||
graph[models[i]] = {
|
||||
// http://jsperf.com/1-vs-infinity
|
||||
// micro-opt, but this is simple.
|
||||
distance: -1,
|
||||
parent: null
|
||||
};
|
||||
}
|
||||
|
||||
return graph;
|
||||
}
|
||||
|
||||
// https://en.wikipedia.org/wiki/Breadth-first_search
|
||||
function deriveBFS(fromModel) {
|
||||
var graph = buildGraph();
|
||||
var queue = [fromModel]; // unshift -> queue -> pop
|
||||
|
||||
graph[fromModel].distance = 0;
|
||||
|
||||
while (queue.length) {
|
||||
var current = queue.pop();
|
||||
var adjacents = Object.keys(conversions[current]);
|
||||
|
||||
for (var len = adjacents.length, i = 0; i < len; i++) {
|
||||
var adjacent = adjacents[i];
|
||||
var node = graph[adjacent];
|
||||
|
||||
if (node.distance === -1) {
|
||||
node.distance = graph[current].distance + 1;
|
||||
node.parent = current;
|
||||
queue.unshift(adjacent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return graph;
|
||||
}
|
||||
|
||||
function link(from, to) {
|
||||
return function (args) {
|
||||
return to(from(args));
|
||||
};
|
||||
}
|
||||
|
||||
function wrapConversion(toModel, graph) {
|
||||
var path = [graph[toModel].parent, toModel];
|
||||
var fn = conversions[graph[toModel].parent][toModel];
|
||||
|
||||
var cur = graph[toModel].parent;
|
||||
while (graph[cur].parent) {
|
||||
path.unshift(graph[cur].parent);
|
||||
fn = link(conversions[graph[cur].parent][cur], fn);
|
||||
cur = graph[cur].parent;
|
||||
}
|
||||
|
||||
fn.conversion = path;
|
||||
return fn;
|
||||
}
|
||||
|
||||
module.exports = function (fromModel) {
|
||||
var graph = deriveBFS(fromModel);
|
||||
var conversion = {};
|
||||
|
||||
var models = Object.keys(graph);
|
||||
for (var len = models.length, i = 0; i < len; i++) {
|
||||
var toModel = models[i];
|
||||
var node = graph[toModel];
|
||||
|
||||
if (node.parent === null) {
|
||||
// no possible conversion, or this node is the source model.
|
||||
continue;
|
||||
}
|
||||
|
||||
conversion[toModel] = wrapConversion(toModel, graph);
|
||||
}
|
||||
|
||||
return conversion;
|
||||
};
|
||||
|
43
web/node_modules/react-dev-utils/node_modules/color-name/.eslintrc.json
generated
vendored
Normal file
43
web/node_modules/react-dev-utils/node_modules/color-name/.eslintrc.json
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"node": true,
|
||||
"commonjs": true,
|
||||
"es6": true
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"rules": {
|
||||
"strict": 2,
|
||||
"indent": 0,
|
||||
"linebreak-style": 0,
|
||||
"quotes": 0,
|
||||
"semi": 0,
|
||||
"no-cond-assign": 1,
|
||||
"no-constant-condition": 1,
|
||||
"no-duplicate-case": 1,
|
||||
"no-empty": 1,
|
||||
"no-ex-assign": 1,
|
||||
"no-extra-boolean-cast": 1,
|
||||
"no-extra-semi": 1,
|
||||
"no-fallthrough": 1,
|
||||
"no-func-assign": 1,
|
||||
"no-global-assign": 1,
|
||||
"no-implicit-globals": 2,
|
||||
"no-inner-declarations": ["error", "functions"],
|
||||
"no-irregular-whitespace": 2,
|
||||
"no-loop-func": 1,
|
||||
"no-multi-str": 1,
|
||||
"no-mixed-spaces-and-tabs": 1,
|
||||
"no-proto": 1,
|
||||
"no-sequences": 1,
|
||||
"no-throw-literal": 1,
|
||||
"no-unmodified-loop-condition": 1,
|
||||
"no-useless-call": 1,
|
||||
"no-void": 1,
|
||||
"no-with": 2,
|
||||
"wrap-iife": 1,
|
||||
"no-redeclare": 1,
|
||||
"no-unused-vars": ["error", { "vars": "all", "args": "none" }],
|
||||
"no-sparse-arrays": 1
|
||||
}
|
||||
}
|
107
web/node_modules/react-dev-utils/node_modules/color-name/.npmignore
generated
vendored
Normal file
107
web/node_modules/react-dev-utils/node_modules/color-name/.npmignore
generated
vendored
Normal file
|
@ -0,0 +1,107 @@
|
|||
//this will affect all the git repos
|
||||
git config --global core.excludesfile ~/.gitignore
|
||||
|
||||
|
||||
//update files since .ignore won't if already tracked
|
||||
git rm --cached <file>
|
||||
|
||||
# Compiled source #
|
||||
###################
|
||||
*.com
|
||||
*.class
|
||||
*.dll
|
||||
*.exe
|
||||
*.o
|
||||
*.so
|
||||
|
||||
# Packages #
|
||||
############
|
||||
# it's better to unpack these files and commit the raw source
|
||||
# git has its own built in compression methods
|
||||
*.7z
|
||||
*.dmg
|
||||
*.gz
|
||||
*.iso
|
||||
*.jar
|
||||
*.rar
|
||||
*.tar
|
||||
*.zip
|
||||
|
||||
# Logs and databases #
|
||||
######################
|
||||
*.log
|
||||
*.sql
|
||||
*.sqlite
|
||||
|
||||
# OS generated files #
|
||||
######################
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
# Icon?
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
.cache
|
||||
.project
|
||||
.settings
|
||||
.tmproj
|
||||
*.esproj
|
||||
nbproject
|
||||
|
||||
# Numerous always-ignore extensions #
|
||||
#####################################
|
||||
*.diff
|
||||
*.err
|
||||
*.orig
|
||||
*.rej
|
||||
*.swn
|
||||
*.swo
|
||||
*.swp
|
||||
*.vi
|
||||
*~
|
||||
*.sass-cache
|
||||
*.grunt
|
||||
*.tmp
|
||||
|
||||
# Dreamweaver added files #
|
||||
###########################
|
||||
_notes
|
||||
dwsync.xml
|
||||
|
||||
# Komodo #
|
||||
###########################
|
||||
*.komodoproject
|
||||
.komodotools
|
||||
|
||||
# Node #
|
||||
#####################
|
||||
node_modules
|
||||
|
||||
# Bower #
|
||||
#####################
|
||||
bower_components
|
||||
|
||||
# Folders to ignore #
|
||||
#####################
|
||||
.hg
|
||||
.svn
|
||||
.CVS
|
||||
intermediate
|
||||
publish
|
||||
.idea
|
||||
.graphics
|
||||
_test
|
||||
_archive
|
||||
uploads
|
||||
tmp
|
||||
|
||||
# Vim files to ignore #
|
||||
#######################
|
||||
.VimballRecord
|
||||
.netrwhist
|
||||
|
||||
bundle.*
|
||||
|
||||
_demo
|
8
web/node_modules/react-dev-utils/node_modules/color-name/LICENSE
generated
vendored
Normal file
8
web/node_modules/react-dev-utils/node_modules/color-name/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
The MIT License (MIT)
|
||||
Copyright (c) 2015 Dmitry Ivanov
|
||||
|
||||
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.
|
11
web/node_modules/react-dev-utils/node_modules/color-name/README.md
generated
vendored
Normal file
11
web/node_modules/react-dev-utils/node_modules/color-name/README.md
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.
|
||||
|
||||
[](https://nodei.co/npm/color-name/)
|
||||
|
||||
|
||||
```js
|
||||
var colors = require('color-name');
|
||||
colors.red //[255,0,0]
|
||||
```
|
||||
|
||||
<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>
|
152
web/node_modules/react-dev-utils/node_modules/color-name/index.js
generated
vendored
Normal file
152
web/node_modules/react-dev-utils/node_modules/color-name/index.js
generated
vendored
Normal file
|
@ -0,0 +1,152 @@
|
|||
'use strict'
|
||||
|
||||
module.exports = {
|
||||
"aliceblue": [240, 248, 255],
|
||||
"antiquewhite": [250, 235, 215],
|
||||
"aqua": [0, 255, 255],
|
||||
"aquamarine": [127, 255, 212],
|
||||
"azure": [240, 255, 255],
|
||||
"beige": [245, 245, 220],
|
||||
"bisque": [255, 228, 196],
|
||||
"black": [0, 0, 0],
|
||||
"blanchedalmond": [255, 235, 205],
|
||||
"blue": [0, 0, 255],
|
||||
"blueviolet": [138, 43, 226],
|
||||
"brown": [165, 42, 42],
|
||||
"burlywood": [222, 184, 135],
|
||||
"cadetblue": [95, 158, 160],
|
||||
"chartreuse": [127, 255, 0],
|
||||
"chocolate": [210, 105, 30],
|
||||
"coral": [255, 127, 80],
|
||||
"cornflowerblue": [100, 149, 237],
|
||||
"cornsilk": [255, 248, 220],
|
||||
"crimson": [220, 20, 60],
|
||||
"cyan": [0, 255, 255],
|
||||
"darkblue": [0, 0, 139],
|
||||
"darkcyan": [0, 139, 139],
|
||||
"darkgoldenrod": [184, 134, 11],
|
||||
"darkgray": [169, 169, 169],
|
||||
"darkgreen": [0, 100, 0],
|
||||
"darkgrey": [169, 169, 169],
|
||||
"darkkhaki": [189, 183, 107],
|
||||
"darkmagenta": [139, 0, 139],
|
||||
"darkolivegreen": [85, 107, 47],
|
||||
"darkorange": [255, 140, 0],
|
||||
"darkorchid": [153, 50, 204],
|
||||
"darkred": [139, 0, 0],
|
||||
"darksalmon": [233, 150, 122],
|
||||
"darkseagreen": [143, 188, 143],
|
||||
"darkslateblue": [72, 61, 139],
|
||||
"darkslategray": [47, 79, 79],
|
||||
"darkslategrey": [47, 79, 79],
|
||||
"darkturquoise": [0, 206, 209],
|
||||
"darkviolet": [148, 0, 211],
|
||||
"deeppink": [255, 20, 147],
|
||||
"deepskyblue": [0, 191, 255],
|
||||
"dimgray": [105, 105, 105],
|
||||
"dimgrey": [105, 105, 105],
|
||||
"dodgerblue": [30, 144, 255],
|
||||
"firebrick": [178, 34, 34],
|
||||
"floralwhite": [255, 250, 240],
|
||||
"forestgreen": [34, 139, 34],
|
||||
"fuchsia": [255, 0, 255],
|
||||
"gainsboro": [220, 220, 220],
|
||||
"ghostwhite": [248, 248, 255],
|
||||
"gold": [255, 215, 0],
|
||||
"goldenrod": [218, 165, 32],
|
||||
"gray": [128, 128, 128],
|
||||
"green": [0, 128, 0],
|
||||
"greenyellow": [173, 255, 47],
|
||||
"grey": [128, 128, 128],
|
||||
"honeydew": [240, 255, 240],
|
||||
"hotpink": [255, 105, 180],
|
||||
"indianred": [205, 92, 92],
|
||||
"indigo": [75, 0, 130],
|
||||
"ivory": [255, 255, 240],
|
||||
"khaki": [240, 230, 140],
|
||||
"lavender": [230, 230, 250],
|
||||
"lavenderblush": [255, 240, 245],
|
||||
"lawngreen": [124, 252, 0],
|
||||
"lemonchiffon": [255, 250, 205],
|
||||
"lightblue": [173, 216, 230],
|
||||
"lightcoral": [240, 128, 128],
|
||||
"lightcyan": [224, 255, 255],
|
||||
"lightgoldenrodyellow": [250, 250, 210],
|
||||
"lightgray": [211, 211, 211],
|
||||
"lightgreen": [144, 238, 144],
|
||||
"lightgrey": [211, 211, 211],
|
||||
"lightpink": [255, 182, 193],
|
||||
"lightsalmon": [255, 160, 122],
|
||||
"lightseagreen": [32, 178, 170],
|
||||
"lightskyblue": [135, 206, 250],
|
||||
"lightslategray": [119, 136, 153],
|
||||
"lightslategrey": [119, 136, 153],
|
||||
"lightsteelblue": [176, 196, 222],
|
||||
"lightyellow": [255, 255, 224],
|
||||
"lime": [0, 255, 0],
|
||||
"limegreen": [50, 205, 50],
|
||||
"linen": [250, 240, 230],
|
||||
"magenta": [255, 0, 255],
|
||||
"maroon": [128, 0, 0],
|
||||
"mediumaquamarine": [102, 205, 170],
|
||||
"mediumblue": [0, 0, 205],
|
||||
"mediumorchid": [186, 85, 211],
|
||||
"mediumpurple": [147, 112, 219],
|
||||
"mediumseagreen": [60, 179, 113],
|
||||
"mediumslateblue": [123, 104, 238],
|
||||
"mediumspringgreen": [0, 250, 154],
|
||||
"mediumturquoise": [72, 209, 204],
|
||||
"mediumvioletred": [199, 21, 133],
|
||||
"midnightblue": [25, 25, 112],
|
||||
"mintcream": [245, 255, 250],
|
||||
"mistyrose": [255, 228, 225],
|
||||
"moccasin": [255, 228, 181],
|
||||
"navajowhite": [255, 222, 173],
|
||||
"navy": [0, 0, 128],
|
||||
"oldlace": [253, 245, 230],
|
||||
"olive": [128, 128, 0],
|
||||
"olivedrab": [107, 142, 35],
|
||||
"orange": [255, 165, 0],
|
||||
"orangered": [255, 69, 0],
|
||||
"orchid": [218, 112, 214],
|
||||
"palegoldenrod": [238, 232, 170],
|
||||
"palegreen": [152, 251, 152],
|
||||
"paleturquoise": [175, 238, 238],
|
||||
"palevioletred": [219, 112, 147],
|
||||
"papayawhip": [255, 239, 213],
|
||||
"peachpuff": [255, 218, 185],
|
||||
"peru": [205, 133, 63],
|
||||
"pink": [255, 192, 203],
|
||||
"plum": [221, 160, 221],
|
||||
"powderblue": [176, 224, 230],
|
||||
"purple": [128, 0, 128],
|
||||
"rebeccapurple": [102, 51, 153],
|
||||
"red": [255, 0, 0],
|
||||
"rosybrown": [188, 143, 143],
|
||||
"royalblue": [65, 105, 225],
|
||||
"saddlebrown": [139, 69, 19],
|
||||
"salmon": [250, 128, 114],
|
||||
"sandybrown": [244, 164, 96],
|
||||
"seagreen": [46, 139, 87],
|
||||
"seashell": [255, 245, 238],
|
||||
"sienna": [160, 82, 45],
|
||||
"silver": [192, 192, 192],
|
||||
"skyblue": [135, 206, 235],
|
||||
"slateblue": [106, 90, 205],
|
||||
"slategray": [112, 128, 144],
|
||||
"slategrey": [112, 128, 144],
|
||||
"snow": [255, 250, 250],
|
||||
"springgreen": [0, 255, 127],
|
||||
"steelblue": [70, 130, 180],
|
||||
"tan": [210, 180, 140],
|
||||
"teal": [0, 128, 128],
|
||||
"thistle": [216, 191, 216],
|
||||
"tomato": [255, 99, 71],
|
||||
"turquoise": [64, 224, 208],
|
||||
"violet": [238, 130, 238],
|
||||
"wheat": [245, 222, 179],
|
||||
"white": [255, 255, 255],
|
||||
"whitesmoke": [245, 245, 245],
|
||||
"yellow": [255, 255, 0],
|
||||
"yellowgreen": [154, 205, 50]
|
||||
};
|
25
web/node_modules/react-dev-utils/node_modules/color-name/package.json
generated
vendored
Normal file
25
web/node_modules/react-dev-utils/node_modules/color-name/package.json
generated
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "color-name",
|
||||
"version": "1.1.3",
|
||||
"description": "A list of color names and its values",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "node test.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:dfcreative/color-name.git"
|
||||
},
|
||||
"keywords": [
|
||||
"color-name",
|
||||
"color",
|
||||
"color-keyword",
|
||||
"keyword"
|
||||
],
|
||||
"author": "DY <dfcreative@gmail.com>",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/dfcreative/color-name/issues"
|
||||
},
|
||||
"homepage": "https://github.com/dfcreative/color-name"
|
||||
}
|
7
web/node_modules/react-dev-utils/node_modules/color-name/test.js
generated
vendored
Normal file
7
web/node_modules/react-dev-utils/node_modules/color-name/test.js
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
'use strict'
|
||||
|
||||
var names = require('./');
|
||||
var assert = require('assert');
|
||||
|
||||
assert.deepEqual(names.red, [255,0,0]);
|
||||
assert.deepEqual(names.aliceblue, [240,248,255]);
|
18
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/index.d.ts
generated
vendored
Normal file
18
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/index.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
|||
/**
|
||||
Escape RegExp special characters.
|
||||
|
||||
You can also use this to escape a string that is inserted into the middle of a regex, for example, into a character class.
|
||||
|
||||
@example
|
||||
```
|
||||
import escapeStringRegexp = require('escape-string-regexp');
|
||||
|
||||
const escapedString = escapeStringRegexp('How much $ for a 🦄?');
|
||||
//=> 'How much \\$ for a 🦄\\?'
|
||||
|
||||
new RegExp(escapedString);
|
||||
```
|
||||
*/
|
||||
declare const escapeStringRegexp: (string: string) => string;
|
||||
|
||||
export = escapeStringRegexp;
|
11
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/index.js
generated
vendored
Normal file
11
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/index.js
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
'use strict';
|
||||
|
||||
const matchOperatorsRegex = /[|\\{}()[\]^$+*?.-]/g;
|
||||
|
||||
module.exports = string => {
|
||||
if (typeof string !== 'string') {
|
||||
throw new TypeError('Expected a string');
|
||||
}
|
||||
|
||||
return string.replace(matchOperatorsRegex, '\\$&');
|
||||
};
|
9
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/license
generated
vendored
Normal file
9
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/license
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
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.
|
43
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/package.json
generated
vendored
Normal file
43
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/package.json
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"name": "escape-string-regexp",
|
||||
"version": "2.0.0",
|
||||
"description": "Escape RegExp special characters",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/escape-string-regexp",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"maintainers": [
|
||||
"Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)",
|
||||
"Joshua Boy Nicolai Appelman <joshua@jbna.nl> (jbna.nl)"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts"
|
||||
],
|
||||
"keywords": [
|
||||
"escape",
|
||||
"regex",
|
||||
"regexp",
|
||||
"re",
|
||||
"regular",
|
||||
"expression",
|
||||
"string",
|
||||
"str",
|
||||
"special",
|
||||
"characters"
|
||||
],
|
||||
"devDependencies": {
|
||||
"ava": "^1.4.1",
|
||||
"tsd": "^0.7.2",
|
||||
"xo": "^0.24.0"
|
||||
}
|
||||
}
|
29
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/readme.md
generated
vendored
Normal file
29
web/node_modules/react-dev-utils/node_modules/escape-string-regexp/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
|||
# escape-string-regexp [](https://travis-ci.org/sindresorhus/escape-string-regexp)
|
||||
|
||||
> Escape RegExp special characters
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install escape-string-regexp
|
||||
```
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const escapeStringRegexp = require('escape-string-regexp');
|
||||
|
||||
const escapedString = escapeStringRegexp('How much $ for a 🦄?');
|
||||
//=> 'How much \\$ for a 🦄\\?'
|
||||
|
||||
new RegExp(escapedString);
|
||||
```
|
||||
|
||||
You can also use this to escape a string that is inserted into the middle of a regex, for example, into a character class.
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT © [Sindre Sorhus](https://sindresorhus.com)
|
118
web/node_modules/react-dev-utils/node_modules/globby/gitignore.js
generated
vendored
Normal file
118
web/node_modules/react-dev-utils/node_modules/globby/gitignore.js
generated
vendored
Normal file
|
@ -0,0 +1,118 @@
|
|||
'use strict';
|
||||
const {promisify} = require('util');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const fastGlob = require('fast-glob');
|
||||
const gitIgnore = require('ignore');
|
||||
const slash = require('slash');
|
||||
|
||||
const DEFAULT_IGNORE = [
|
||||
'**/node_modules/**',
|
||||
'**/flow-typed/**',
|
||||
'**/coverage/**',
|
||||
'**/.git'
|
||||
];
|
||||
|
||||
const readFileP = promisify(fs.readFile);
|
||||
|
||||
const mapGitIgnorePatternTo = base => ignore => {
|
||||
if (ignore.startsWith('!')) {
|
||||
return '!' + path.posix.join(base, ignore.slice(1));
|
||||
}
|
||||
|
||||
return path.posix.join(base, ignore);
|
||||
};
|
||||
|
||||
const parseGitIgnore = (content, options) => {
|
||||
const base = slash(path.relative(options.cwd, path.dirname(options.fileName)));
|
||||
|
||||
return content
|
||||
.split(/\r?\n/)
|
||||
.filter(Boolean)
|
||||
.filter(line => !line.startsWith('#'))
|
||||
.map(mapGitIgnorePatternTo(base));
|
||||
};
|
||||
|
||||
const reduceIgnore = files => {
|
||||
return files.reduce((ignores, file) => {
|
||||
ignores.add(parseGitIgnore(file.content, {
|
||||
cwd: file.cwd,
|
||||
fileName: file.filePath
|
||||
}));
|
||||
return ignores;
|
||||
}, gitIgnore());
|
||||
};
|
||||
|
||||
const ensureAbsolutePathForCwd = (cwd, p) => {
|
||||
cwd = slash(cwd);
|
||||
if (path.isAbsolute(p)) {
|
||||
if (p.startsWith(cwd)) {
|
||||
return p;
|
||||
}
|
||||
|
||||
throw new Error(`Path ${p} is not in cwd ${cwd}`);
|
||||
}
|
||||
|
||||
return path.join(cwd, p);
|
||||
};
|
||||
|
||||
const getIsIgnoredPredecate = (ignores, cwd) => {
|
||||
return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p))));
|
||||
};
|
||||
|
||||
const getFile = async (file, cwd) => {
|
||||
const filePath = path.join(cwd, file);
|
||||
const content = await readFileP(filePath, 'utf8');
|
||||
|
||||
return {
|
||||
cwd,
|
||||
filePath,
|
||||
content
|
||||
};
|
||||
};
|
||||
|
||||
const getFileSync = (file, cwd) => {
|
||||
const filePath = path.join(cwd, file);
|
||||
const content = fs.readFileSync(filePath, 'utf8');
|
||||
|
||||
return {
|
||||
cwd,
|
||||
filePath,
|
||||
content
|
||||
};
|
||||
};
|
||||
|
||||
const normalizeOptions = ({
|
||||
ignore = [],
|
||||
cwd = slash(process.cwd())
|
||||
} = {}) => {
|
||||
return {ignore, cwd};
|
||||
};
|
||||
|
||||
module.exports = async options => {
|
||||
options = normalizeOptions(options);
|
||||
|
||||
const paths = await fastGlob('**/.gitignore', {
|
||||
ignore: DEFAULT_IGNORE.concat(options.ignore),
|
||||
cwd: options.cwd
|
||||
});
|
||||
|
||||
const files = await Promise.all(paths.map(file => getFile(file, options.cwd)));
|
||||
const ignores = reduceIgnore(files);
|
||||
|
||||
return getIsIgnoredPredecate(ignores, options.cwd);
|
||||
};
|
||||
|
||||
module.exports.sync = options => {
|
||||
options = normalizeOptions(options);
|
||||
|
||||
const paths = fastGlob.sync('**/.gitignore', {
|
||||
ignore: DEFAULT_IGNORE.concat(options.ignore),
|
||||
cwd: options.cwd
|
||||
});
|
||||
|
||||
const files = paths.map(file => getFileSync(file, options.cwd));
|
||||
const ignores = reduceIgnore(files);
|
||||
|
||||
return getIsIgnoredPredecate(ignores, options.cwd);
|
||||
};
|
176
web/node_modules/react-dev-utils/node_modules/globby/index.d.ts
generated
vendored
Normal file
176
web/node_modules/react-dev-utils/node_modules/globby/index.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,176 @@
|
|||
import {Options as FastGlobOptions} from 'fast-glob';
|
||||
|
||||
declare namespace globby {
|
||||
type ExpandDirectoriesOption =
|
||||
| boolean
|
||||
| readonly string[]
|
||||
| {files?: readonly string[]; extensions?: readonly string[]};
|
||||
|
||||
interface GlobbyOptions extends FastGlobOptions {
|
||||
/**
|
||||
If set to `true`, `globby` will automatically glob directories for you. If you define an `Array` it will only glob files that matches the patterns inside the `Array`. You can also define an `Object` with `files` and `extensions` like in the example below.
|
||||
|
||||
Note that if you set this option to `false`, you won't get back matched directories unless you set `onlyFiles: false`.
|
||||
|
||||
@default true
|
||||
|
||||
@example
|
||||
```
|
||||
import globby = require('globby');
|
||||
|
||||
(async () => {
|
||||
const paths = await globby('images', {
|
||||
expandDirectories: {
|
||||
files: ['cat', 'unicorn', '*.jpg'],
|
||||
extensions: ['png']
|
||||
}
|
||||
});
|
||||
|
||||
console.log(paths);
|
||||
//=> ['cat.png', 'unicorn.png', 'cow.jpg', 'rainbow.jpg']
|
||||
})();
|
||||
```
|
||||
*/
|
||||
readonly expandDirectories?: ExpandDirectoriesOption;
|
||||
|
||||
/**
|
||||
Respect ignore patterns in `.gitignore` files that apply to the globbed files.
|
||||
|
||||
@default false
|
||||
*/
|
||||
readonly gitignore?: boolean;
|
||||
}
|
||||
|
||||
interface GlobTask {
|
||||
readonly pattern: string;
|
||||
readonly options: globby.GlobbyOptions;
|
||||
}
|
||||
|
||||
interface GitignoreOptions {
|
||||
readonly cwd?: string;
|
||||
readonly ignore?: readonly string[];
|
||||
}
|
||||
|
||||
type FilterFunction = (path: string) => boolean;
|
||||
}
|
||||
|
||||
interface Gitignore {
|
||||
/**
|
||||
`.gitignore` files matched by the ignore config are not used for the resulting filter function.
|
||||
|
||||
@returns A filter function indicating whether a given path is ignored via a `.gitignore` file.
|
||||
|
||||
@example
|
||||
```
|
||||
import {gitignore} from 'globby';
|
||||
|
||||
(async () => {
|
||||
const isIgnored = await gitignore();
|
||||
console.log(isIgnored('some/file'));
|
||||
})();
|
||||
```
|
||||
*/
|
||||
(options?: globby.GitignoreOptions): Promise<globby.FilterFunction>;
|
||||
|
||||
/**
|
||||
@returns A filter function indicating whether a given path is ignored via a `.gitignore` file.
|
||||
*/
|
||||
sync(options?: globby.GitignoreOptions): globby.FilterFunction;
|
||||
}
|
||||
|
||||
declare const globby: {
|
||||
/**
|
||||
Find files and directories using glob patterns.
|
||||
|
||||
Note that glob patterns can only contain forward-slashes, not backward-slashes, so if you want to construct a glob pattern from path components, you need to use `path.posix.join()` instead of `path.join()`.
|
||||
|
||||
@param patterns - See the supported [glob patterns](https://github.com/sindresorhus/globby#globbing-patterns).
|
||||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-3) in addition to the ones in this package.
|
||||
@returns The matching paths.
|
||||
|
||||
@example
|
||||
```
|
||||
import globby = require('globby');
|
||||
|
||||
(async () => {
|
||||
const paths = await globby(['*', '!cake']);
|
||||
|
||||
console.log(paths);
|
||||
//=> ['unicorn', 'rainbow']
|
||||
})();
|
||||
```
|
||||
*/
|
||||
(
|
||||
patterns: string | readonly string[],
|
||||
options?: globby.GlobbyOptions
|
||||
): Promise<string[]>;
|
||||
|
||||
/**
|
||||
Find files and directories using glob patterns.
|
||||
|
||||
Note that glob patterns can only contain forward-slashes, not backward-slashes, so if you want to construct a glob pattern from path components, you need to use `path.posix.join()` instead of `path.join()`.
|
||||
|
||||
@param patterns - See the supported [glob patterns](https://github.com/sindresorhus/globby#globbing-patterns).
|
||||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-3) in addition to the ones in this package.
|
||||
@returns The matching paths.
|
||||
*/
|
||||
sync(
|
||||
patterns: string | readonly string[],
|
||||
options?: globby.GlobbyOptions
|
||||
): string[];
|
||||
|
||||
/**
|
||||
Find files and directories using glob patterns.
|
||||
|
||||
Note that glob patterns can only contain forward-slashes, not backward-slashes, so if you want to construct a glob pattern from path components, you need to use `path.posix.join()` instead of `path.join()`.
|
||||
|
||||
@param patterns - See the supported [glob patterns](https://github.com/sindresorhus/globby#globbing-patterns).
|
||||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-3) in addition to the ones in this package.
|
||||
@returns The stream of matching paths.
|
||||
|
||||
@example
|
||||
```
|
||||
import globby = require('globby');
|
||||
|
||||
(async () => {
|
||||
for await (const path of globby.stream('*.tmp')) {
|
||||
console.log(path);
|
||||
}
|
||||
})();
|
||||
```
|
||||
*/
|
||||
stream(
|
||||
patterns: string | readonly string[],
|
||||
options?: globby.GlobbyOptions
|
||||
): NodeJS.ReadableStream;
|
||||
|
||||
/**
|
||||
Note that you should avoid running the same tasks multiple times as they contain a file system cache. Instead, run this method each time to ensure file system changes are taken into consideration.
|
||||
|
||||
@param patterns - See the supported [glob patterns](https://github.com/sindresorhus/globby#globbing-patterns).
|
||||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-3) in addition to the ones in this package.
|
||||
@returns An object in the format `{pattern: string, options: object}`, which can be passed as arguments to [`fast-glob`](https://github.com/mrmlnc/fast-glob). This is useful for other globbing-related packages.
|
||||
*/
|
||||
generateGlobTasks(
|
||||
patterns: string | readonly string[],
|
||||
options?: globby.GlobbyOptions
|
||||
): globby.GlobTask[];
|
||||
|
||||
/**
|
||||
Note that the options affect the results.
|
||||
|
||||
This function is backed by [`fast-glob`](https://github.com/mrmlnc/fast-glob#isdynamicpatternpattern-options).
|
||||
|
||||
@param patterns - See the supported [glob patterns](https://github.com/sindresorhus/globby#globbing-patterns).
|
||||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-3).
|
||||
@returns Whether there are any special glob characters in the `patterns`.
|
||||
*/
|
||||
hasMagic(
|
||||
patterns: string | readonly string[],
|
||||
options?: FastGlobOptions
|
||||
): boolean;
|
||||
|
||||
readonly gitignore: Gitignore;
|
||||
};
|
||||
|
||||
export = globby;
|
177
web/node_modules/react-dev-utils/node_modules/globby/index.js
generated
vendored
Normal file
177
web/node_modules/react-dev-utils/node_modules/globby/index.js
generated
vendored
Normal file
|
@ -0,0 +1,177 @@
|
|||
'use strict';
|
||||
const fs = require('fs');
|
||||
const arrayUnion = require('array-union');
|
||||
const merge2 = require('merge2');
|
||||
const fastGlob = require('fast-glob');
|
||||
const dirGlob = require('dir-glob');
|
||||
const gitignore = require('./gitignore');
|
||||
const {FilterStream, UniqueStream} = require('./stream-utils');
|
||||
|
||||
const DEFAULT_FILTER = () => false;
|
||||
|
||||
const isNegative = pattern => pattern[0] === '!';
|
||||
|
||||
const assertPatternsInput = patterns => {
|
||||
if (!patterns.every(pattern => typeof pattern === 'string')) {
|
||||
throw new TypeError('Patterns must be a string or an array of strings');
|
||||
}
|
||||
};
|
||||
|
||||
const checkCwdOption = (options = {}) => {
|
||||
if (!options.cwd) {
|
||||
return;
|
||||
}
|
||||
|
||||
let stat;
|
||||
try {
|
||||
stat = fs.statSync(options.cwd);
|
||||
} catch (_) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!stat.isDirectory()) {
|
||||
throw new Error('The `cwd` option must be a path to a directory');
|
||||
}
|
||||
};
|
||||
|
||||
const getPathString = p => p.stats instanceof fs.Stats ? p.path : p;
|
||||
|
||||
const generateGlobTasks = (patterns, taskOptions) => {
|
||||
patterns = arrayUnion([].concat(patterns));
|
||||
assertPatternsInput(patterns);
|
||||
checkCwdOption(taskOptions);
|
||||
|
||||
const globTasks = [];
|
||||
|
||||
taskOptions = {
|
||||
ignore: [],
|
||||
expandDirectories: true,
|
||||
...taskOptions
|
||||
};
|
||||
|
||||
for (const [index, pattern] of patterns.entries()) {
|
||||
if (isNegative(pattern)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const ignore = patterns
|
||||
.slice(index)
|
||||
.filter(isNegative)
|
||||
.map(pattern => pattern.slice(1));
|
||||
|
||||
const options = {
|
||||
...taskOptions,
|
||||
ignore: taskOptions.ignore.concat(ignore)
|
||||
};
|
||||
|
||||
globTasks.push({pattern, options});
|
||||
}
|
||||
|
||||
return globTasks;
|
||||
};
|
||||
|
||||
const globDirs = (task, fn) => {
|
||||
let options = {};
|
||||
if (task.options.cwd) {
|
||||
options.cwd = task.options.cwd;
|
||||
}
|
||||
|
||||
if (Array.isArray(task.options.expandDirectories)) {
|
||||
options = {
|
||||
...options,
|
||||
files: task.options.expandDirectories
|
||||
};
|
||||
} else if (typeof task.options.expandDirectories === 'object') {
|
||||
options = {
|
||||
...options,
|
||||
...task.options.expandDirectories
|
||||
};
|
||||
}
|
||||
|
||||
return fn(task.pattern, options);
|
||||
};
|
||||
|
||||
const getPattern = (task, fn) => task.options.expandDirectories ? globDirs(task, fn) : [task.pattern];
|
||||
|
||||
const getFilterSync = options => {
|
||||
return options && options.gitignore ?
|
||||
gitignore.sync({cwd: options.cwd, ignore: options.ignore}) :
|
||||
DEFAULT_FILTER;
|
||||
};
|
||||
|
||||
const globToTask = task => glob => {
|
||||
const {options} = task;
|
||||
if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) {
|
||||
options.ignore = dirGlob.sync(options.ignore);
|
||||
}
|
||||
|
||||
return {
|
||||
pattern: glob,
|
||||
options
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = async (patterns, options) => {
|
||||
const globTasks = generateGlobTasks(patterns, options);
|
||||
|
||||
const getFilter = async () => {
|
||||
return options && options.gitignore ?
|
||||
gitignore({cwd: options.cwd, ignore: options.ignore}) :
|
||||
DEFAULT_FILTER;
|
||||
};
|
||||
|
||||
const getTasks = async () => {
|
||||
const tasks = await Promise.all(globTasks.map(async task => {
|
||||
const globs = await getPattern(task, dirGlob);
|
||||
return Promise.all(globs.map(globToTask(task)));
|
||||
}));
|
||||
|
||||
return arrayUnion(...tasks);
|
||||
};
|
||||
|
||||
const [filter, tasks] = await Promise.all([getFilter(), getTasks()]);
|
||||
const paths = await Promise.all(tasks.map(task => fastGlob(task.pattern, task.options)));
|
||||
|
||||
return arrayUnion(...paths).filter(path_ => !filter(getPathString(path_)));
|
||||
};
|
||||
|
||||
module.exports.sync = (patterns, options) => {
|
||||
const globTasks = generateGlobTasks(patterns, options);
|
||||
|
||||
const tasks = globTasks.reduce((tasks, task) => {
|
||||
const newTask = getPattern(task, dirGlob.sync).map(globToTask(task));
|
||||
return tasks.concat(newTask);
|
||||
}, []);
|
||||
|
||||
const filter = getFilterSync(options);
|
||||
|
||||
return tasks.reduce(
|
||||
(matches, task) => arrayUnion(matches, fastGlob.sync(task.pattern, task.options)),
|
||||
[]
|
||||
).filter(path_ => !filter(path_));
|
||||
};
|
||||
|
||||
module.exports.stream = (patterns, options) => {
|
||||
const globTasks = generateGlobTasks(patterns, options);
|
||||
|
||||
const tasks = globTasks.reduce((tasks, task) => {
|
||||
const newTask = getPattern(task, dirGlob.sync).map(globToTask(task));
|
||||
return tasks.concat(newTask);
|
||||
}, []);
|
||||
|
||||
const filter = getFilterSync(options);
|
||||
const filterStream = new FilterStream(p => !filter(p));
|
||||
const uniqueStream = new UniqueStream();
|
||||
|
||||
return merge2(tasks.map(task => fastGlob.stream(task.pattern, task.options)))
|
||||
.pipe(filterStream)
|
||||
.pipe(uniqueStream);
|
||||
};
|
||||
|
||||
module.exports.generateGlobTasks = generateGlobTasks;
|
||||
|
||||
module.exports.hasMagic = (patterns, options) => []
|
||||
.concat(patterns)
|
||||
.some(pattern => fastGlob.isDynamicPattern(pattern, options));
|
||||
|
||||
module.exports.gitignore = gitignore;
|
9
web/node_modules/react-dev-utils/node_modules/globby/license
generated
vendored
Normal file
9
web/node_modules/react-dev-utils/node_modules/globby/license
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
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.
|
82
web/node_modules/react-dev-utils/node_modules/globby/package.json
generated
vendored
Normal file
82
web/node_modules/react-dev-utils/node_modules/globby/package.json
generated
vendored
Normal file
|
@ -0,0 +1,82 @@
|
|||
{
|
||||
"name": "globby",
|
||||
"version": "11.0.1",
|
||||
"description": "User-friendly glob matching",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/globby",
|
||||
"funding": "https://github.com/sponsors/sindresorhus",
|
||||
"author": {
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"name": "Sindre Sorhus",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"scripts": {
|
||||
"bench": "npm update glob-stream fast-glob && matcha bench.js",
|
||||
"test": "xo && ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts",
|
||||
"gitignore.js",
|
||||
"stream-utils.js"
|
||||
],
|
||||
"keywords": [
|
||||
"all",
|
||||
"array",
|
||||
"directories",
|
||||
"expand",
|
||||
"files",
|
||||
"filesystem",
|
||||
"filter",
|
||||
"find",
|
||||
"fnmatch",
|
||||
"folders",
|
||||
"fs",
|
||||
"glob",
|
||||
"globbing",
|
||||
"globs",
|
||||
"gulpfriendly",
|
||||
"match",
|
||||
"matcher",
|
||||
"minimatch",
|
||||
"multi",
|
||||
"multiple",
|
||||
"paths",
|
||||
"pattern",
|
||||
"patterns",
|
||||
"traverse",
|
||||
"util",
|
||||
"utility",
|
||||
"wildcard",
|
||||
"wildcards",
|
||||
"promise",
|
||||
"gitignore",
|
||||
"git"
|
||||
],
|
||||
"dependencies": {
|
||||
"array-union": "^2.1.0",
|
||||
"dir-glob": "^3.0.1",
|
||||
"fast-glob": "^3.1.1",
|
||||
"ignore": "^5.1.4",
|
||||
"merge2": "^1.3.0",
|
||||
"slash": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ava": "^2.1.0",
|
||||
"get-stream": "^5.1.0",
|
||||
"glob-stream": "^6.1.0",
|
||||
"globby": "sindresorhus/globby#master",
|
||||
"matcha": "^0.7.0",
|
||||
"rimraf": "^3.0.0",
|
||||
"tsd": "^0.11.0",
|
||||
"xo": "^0.25.3"
|
||||
},
|
||||
"xo": {
|
||||
"ignores": [
|
||||
"fixtures"
|
||||
]
|
||||
}
|
||||
}
|
170
web/node_modules/react-dev-utils/node_modules/globby/readme.md
generated
vendored
Normal file
170
web/node_modules/react-dev-utils/node_modules/globby/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,170 @@
|
|||
# globby [](https://travis-ci.org/sindresorhus/globby)
|
||||
|
||||
> User-friendly glob matching
|
||||
|
||||
Based on [`fast-glob`](https://github.com/mrmlnc/fast-glob) but adds a bunch of useful features.
|
||||
|
||||
## Features
|
||||
|
||||
- Promise API
|
||||
- Multiple patterns
|
||||
- Negated patterns: `['foo*', '!foobar']`
|
||||
- Expands directories: `foo` → `foo/**/*`
|
||||
- Supports `.gitignore`
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install globby
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
├── unicorn
|
||||
├── cake
|
||||
└── rainbow
|
||||
```
|
||||
|
||||
```js
|
||||
const globby = require('globby');
|
||||
|
||||
(async () => {
|
||||
const paths = await globby(['*', '!cake']);
|
||||
|
||||
console.log(paths);
|
||||
//=> ['unicorn', 'rainbow']
|
||||
})();
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
Note that glob patterns can only contain forward-slashes, not backward-slashes, so if you want to construct a glob pattern from path components, you need to use `path.posix.join()` instead of `path.join()`.
|
||||
|
||||
### globby(patterns, options?)
|
||||
|
||||
Returns a `Promise<string[]>` of matching paths.
|
||||
|
||||
#### patterns
|
||||
|
||||
Type: `string | string[]`
|
||||
|
||||
See supported `minimatch` [patterns](https://github.com/isaacs/minimatch#usage).
|
||||
|
||||
#### options
|
||||
|
||||
Type: `object`
|
||||
|
||||
See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-3) in addition to the ones below.
|
||||
|
||||
##### expandDirectories
|
||||
|
||||
Type: `boolean | string[] | object`\
|
||||
Default: `true`
|
||||
|
||||
If set to `true`, `globby` will automatically glob directories for you. If you define an `Array` it will only glob files that matches the patterns inside the `Array`. You can also define an `object` with `files` and `extensions` like below:
|
||||
|
||||
```js
|
||||
const globby = require('globby');
|
||||
|
||||
(async () => {
|
||||
const paths = await globby('images', {
|
||||
expandDirectories: {
|
||||
files: ['cat', 'unicorn', '*.jpg'],
|
||||
extensions: ['png']
|
||||
}
|
||||
});
|
||||
|
||||
console.log(paths);
|
||||
//=> ['cat.png', 'unicorn.png', 'cow.jpg', 'rainbow.jpg']
|
||||
})();
|
||||
```
|
||||
|
||||
Note that if you set this option to `false`, you won't get back matched directories unless you set `onlyFiles: false`.
|
||||
|
||||
##### gitignore
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `false`
|
||||
|
||||
Respect ignore patterns in `.gitignore` files that apply to the globbed files.
|
||||
|
||||
### globby.sync(patterns, options?)
|
||||
|
||||
Returns `string[]` of matching paths.
|
||||
|
||||
### globby.stream(patterns, options?)
|
||||
|
||||
Returns a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_readable_streams) of matching paths.
|
||||
|
||||
Since Node.js 10, [readable streams are iterable](https://nodejs.org/api/stream.html#stream_readable_symbol_asynciterator), so you can loop over glob matches in a [`for await...of` loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of) like this:
|
||||
|
||||
```js
|
||||
const globby = require('globby');
|
||||
|
||||
(async () => {
|
||||
for await (const path of globby.stream('*.tmp')) {
|
||||
console.log(path);
|
||||
}
|
||||
})();
|
||||
```
|
||||
|
||||
### globby.generateGlobTasks(patterns, options?)
|
||||
|
||||
Returns an `object[]` in the format `{pattern: string, options: Object}`, which can be passed as arguments to [`fast-glob`](https://github.com/mrmlnc/fast-glob). This is useful for other globbing-related packages.
|
||||
|
||||
Note that you should avoid running the same tasks multiple times as they contain a file system cache. Instead, run this method each time to ensure file system changes are taken into consideration.
|
||||
|
||||
### globby.hasMagic(patterns, options?)
|
||||
|
||||
Returns a `boolean` of whether there are any special glob characters in the `patterns`.
|
||||
|
||||
Note that the options affect the results.
|
||||
|
||||
This function is backed by [`fast-glob`](https://github.com/mrmlnc/fast-glob#isdynamicpatternpattern-options).
|
||||
|
||||
### globby.gitignore(options?)
|
||||
|
||||
Returns a `Promise<(path: string) => boolean>` indicating whether a given path is ignored via a `.gitignore` file.
|
||||
|
||||
Takes `cwd?: string` and `ignore?: string[]` as options. `.gitignore` files matched by the ignore config are not used for the resulting filter function.
|
||||
|
||||
```js
|
||||
const {gitignore} = require('globby');
|
||||
|
||||
(async () => {
|
||||
const isIgnored = await gitignore();
|
||||
console.log(isIgnored('some/file'));
|
||||
})();
|
||||
```
|
||||
|
||||
### globby.gitignore.sync(options?)
|
||||
|
||||
Returns a `(path: string) => boolean` indicating whether a given path is ignored via a `.gitignore` file.
|
||||
|
||||
Takes the same options as `globby.gitignore`.
|
||||
|
||||
## Globbing patterns
|
||||
|
||||
Just a quick overview.
|
||||
|
||||
- `*` matches any number of characters, but not `/`
|
||||
- `?` matches a single character, but not `/`
|
||||
- `**` matches any number of characters, including `/`, as long as it's the only thing in a path part
|
||||
- `{}` allows for a comma-separated list of "or" expressions
|
||||
- `!` at the beginning of a pattern will negate the match
|
||||
|
||||
[Various patterns and expected matches.](https://github.com/sindresorhus/multimatch/blob/master/test/test.js)
|
||||
|
||||
## globby for enterprise
|
||||
|
||||
Available as part of the Tidelift Subscription.
|
||||
|
||||
The maintainers of globby and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-globby?utm_source=npm-globby&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
|
||||
|
||||
## Related
|
||||
|
||||
- [multimatch](https://github.com/sindresorhus/multimatch) - Match against a list instead of the filesystem
|
||||
- [matcher](https://github.com/sindresorhus/matcher) - Simple wildcard matching
|
||||
- [del](https://github.com/sindresorhus/del) - Delete files and directories
|
||||
- [make-dir](https://github.com/sindresorhus/make-dir) - Make a directory and its parents if needed
|
46
web/node_modules/react-dev-utils/node_modules/globby/stream-utils.js
generated
vendored
Normal file
46
web/node_modules/react-dev-utils/node_modules/globby/stream-utils.js
generated
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
'use strict';
|
||||
const {Transform} = require('stream');
|
||||
|
||||
class ObjectTransform extends Transform {
|
||||
constructor() {
|
||||
super({
|
||||
objectMode: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class FilterStream extends ObjectTransform {
|
||||
constructor(filter) {
|
||||
super();
|
||||
this._filter = filter;
|
||||
}
|
||||
|
||||
_transform(data, encoding, callback) {
|
||||
if (this._filter(data)) {
|
||||
this.push(data);
|
||||
}
|
||||
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
class UniqueStream extends ObjectTransform {
|
||||
constructor() {
|
||||
super();
|
||||
this._pushed = new Set();
|
||||
}
|
||||
|
||||
_transform(data, encoding, callback) {
|
||||
if (!this._pushed.has(data)) {
|
||||
this.push(data);
|
||||
this._pushed.add(data);
|
||||
}
|
||||
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
FilterStream,
|
||||
UniqueStream
|
||||
};
|
8
web/node_modules/react-dev-utils/node_modules/has-flag/index.js
generated
vendored
Normal file
8
web/node_modules/react-dev-utils/node_modules/has-flag/index.js
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
'use strict';
|
||||
module.exports = (flag, argv) => {
|
||||
argv = argv || process.argv;
|
||||
const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
|
||||
const pos = argv.indexOf(prefix + flag);
|
||||
const terminatorPos = argv.indexOf('--');
|
||||
return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
|
||||
};
|
9
web/node_modules/react-dev-utils/node_modules/has-flag/license
generated
vendored
Normal file
9
web/node_modules/react-dev-utils/node_modules/has-flag/license
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
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.
|
44
web/node_modules/react-dev-utils/node_modules/has-flag/package.json
generated
vendored
Normal file
44
web/node_modules/react-dev-utils/node_modules/has-flag/package.json
generated
vendored
Normal file
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"name": "has-flag",
|
||||
"version": "3.0.0",
|
||||
"description": "Check if argv has a specific flag",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/has-flag",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"keywords": [
|
||||
"has",
|
||||
"check",
|
||||
"detect",
|
||||
"contains",
|
||||
"find",
|
||||
"flag",
|
||||
"cli",
|
||||
"command-line",
|
||||
"argv",
|
||||
"process",
|
||||
"arg",
|
||||
"args",
|
||||
"argument",
|
||||
"arguments",
|
||||
"getopt",
|
||||
"minimist",
|
||||
"optimist"
|
||||
],
|
||||
"devDependencies": {
|
||||
"ava": "*",
|
||||
"xo": "*"
|
||||
}
|
||||
}
|
70
web/node_modules/react-dev-utils/node_modules/has-flag/readme.md
generated
vendored
Normal file
70
web/node_modules/react-dev-utils/node_modules/has-flag/readme.md
generated
vendored
Normal file
|
@ -0,0 +1,70 @@
|
|||
# has-flag [](https://travis-ci.org/sindresorhus/has-flag)
|
||||
|
||||
> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag
|
||||
|
||||
Correctly stops looking after an `--` argument terminator.
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install has-flag
|
||||
```
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
// foo.js
|
||||
const hasFlag = require('has-flag');
|
||||
|
||||
hasFlag('unicorn');
|
||||
//=> true
|
||||
|
||||
hasFlag('--unicorn');
|
||||
//=> true
|
||||
|
||||
hasFlag('f');
|
||||
//=> true
|
||||
|
||||
hasFlag('-f');
|
||||
//=> true
|
||||
|
||||
hasFlag('foo=bar');
|
||||
//=> true
|
||||
|
||||
hasFlag('foo');
|
||||
//=> false
|
||||
|
||||
hasFlag('rainbow');
|
||||
//=> false
|
||||
```
|
||||
|
||||
```
|
||||
$ node foo.js -f --unicorn --foo=bar -- --rainbow
|
||||
```
|
||||
|
||||
|
||||
## API
|
||||
|
||||
### hasFlag(flag, [argv])
|
||||
|
||||
Returns a boolean for whether the flag exists.
|
||||
|
||||
#### flag
|
||||
|
||||
Type: `string`
|
||||
|
||||
CLI flag to look for. The `--` prefix is optional.
|
||||
|
||||
#### argv
|
||||
|
||||
Type: `string[]`<br>
|
||||
Default: `process.argv`
|
||||
|
||||
CLI arguments.
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT © [Sindre Sorhus](https://sindresorhus.com)
|
32
web/node_modules/react-dev-utils/node_modules/ignore/CHANGELOG.md
generated
vendored
Normal file
32
web/node_modules/react-dev-utils/node_modules/ignore/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
|||
# `node-ignore` 5 ChangeLog
|
||||
|
||||
# 5.x
|
||||
|
||||
## 2018-08-14, Version 5.0.1
|
||||
|
||||
- **PATCH**: fixes for windows.
|
||||
- **PATCH**: improves tests for typescript and windows.
|
||||
|
||||
## 2018-08-13, Version 5.0.0
|
||||
|
||||
- **SEMVER-MAJOR**: [#20](https://github.com/kaelzhang/node-ignore/issues/20): it will throw if an invalid pathname passes into `.ignores(pathname)`, see [Upgrade 4.x -> 5.x](https://github.com/kaelzhang/node-ignore#upgrade-4x---5x).
|
||||
- **FEATURE**: [#31](https://github.com/kaelzhang/node-ignore/issues/31): adds a new method [`.test(pathname)`](https://github.com/kaelzhang/node-ignore#testpathname-pathname-since-500).
|
||||
- **BENCHMARK**: improves performance by 26%.
|
||||
|
||||
# 4.x
|
||||
|
||||
## 2018-08-12, Version 4.0.6
|
||||
|
||||
- **PATCH**: `Object.prototype` methods will not ruin the result any more.
|
||||
|
||||
## ~ 2018-08-09, Version 4.0.1 - 4.0.5
|
||||
|
||||
- **PATCH**: updates README.md about frequent asked quesions from github issues.
|
||||
|
||||
## 2018-06-22, Version 4.0.0
|
||||
|
||||
- **SEMVER-MAJOR**: Drop support for node < 6 by default.
|
||||
- **FEATURE**: supports the missing character ranges and sets, such as `*.[a-z]` and `*.[jJ][pP][gG]`
|
||||
- **FEATURE**: new option: `ignorecase` to make `ignore` case insensitive.
|
||||
- **FEATURE**: supports question mark which matches a single character.
|
||||
- **PATCH**: fixes typescript declaration.
|
21
web/node_modules/react-dev-utils/node_modules/ignore/LICENSE-MIT
generated
vendored
Normal file
21
web/node_modules/react-dev-utils/node_modules/ignore/LICENSE-MIT
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
Copyright (c) 2013 Kael Zhang <i@kael.me>, contributors
|
||||
http://kael.me/
|
||||
|
||||
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.
|
392
web/node_modules/react-dev-utils/node_modules/ignore/README.md
generated
vendored
Normal file
392
web/node_modules/react-dev-utils/node_modules/ignore/README.md
generated
vendored
Normal file
|
@ -0,0 +1,392 @@
|
|||
<table><thead>
|
||||
<tr>
|
||||
<th>Linux</th>
|
||||
<th>OS X</th>
|
||||
<th>Windows</th>
|
||||
<th>Coverage</th>
|
||||
<th>Downloads</th>
|
||||
</tr>
|
||||
</thead><tbody><tr>
|
||||
<td colspan="2" align="center">
|
||||
<a href="https://travis-ci.org/kaelzhang/node-ignore">
|
||||
<img
|
||||
src="https://travis-ci.org/kaelzhang/node-ignore.svg?branch=master"
|
||||
alt="Build Status" /></a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://ci.appveyor.com/project/kaelzhang/node-ignore">
|
||||
<img
|
||||
src="https://ci.appveyor.com/api/projects/status/github/kaelzhang/node-ignore?branch=master&svg=true"
|
||||
alt="Windows Build Status" /></a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://codecov.io/gh/kaelzhang/node-ignore">
|
||||
<img
|
||||
src="https://codecov.io/gh/kaelzhang/node-ignore/branch/master/graph/badge.svg"
|
||||
alt="Coverage Status" /></a>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://www.npmjs.org/package/ignore">
|
||||
<img
|
||||
src="http://img.shields.io/npm/dm/ignore.svg"
|
||||
alt="npm module downloads per month" /></a>
|
||||
</td>
|
||||
</tr></tbody></table>
|
||||
|
||||
# ignore
|
||||
|
||||
`ignore` is a manager, filter and parser which implemented in pure JavaScript according to the [.gitignore spec 2.22.1](http://git-scm.com/docs/gitignore).
|
||||
|
||||
`ignore` is used by eslint, gitbook and [many others](https://www.npmjs.com/browse/depended/ignore).
|
||||
|
||||
Pay **ATTENTION** that [`minimatch`](https://www.npmjs.org/package/minimatch) (which used by `fstream-ignore`) does not follow the gitignore spec.
|
||||
|
||||
To filter filenames according to a .gitignore file, I recommend this npm package, `ignore`.
|
||||
|
||||
To parse an `.npmignore` file, you should use `minimatch`, because an `.npmignore` file is parsed by npm using `minimatch` and it does not work in the .gitignore way.
|
||||
|
||||
### Tested on
|
||||
|
||||
`ignore` is fully tested, and has more than **five hundreds** of unit tests.
|
||||
|
||||
- Linux + Node: `0.8` - `7.x`
|
||||
- Windows + Node: `0.10` - `7.x`, node < `0.10` is not tested due to the lack of support of appveyor.
|
||||
|
||||
Actually, `ignore` does not rely on any versions of node specially.
|
||||
|
||||
Since `4.0.0`, ignore will no longer support `node < 6` by default, to use in node < 6, `require('ignore/legacy')`. For details, see [CHANGELOG](https://github.com/kaelzhang/node-ignore/blob/master/CHANGELOG.md).
|
||||
|
||||
## Table Of Main Contents
|
||||
|
||||
- [Usage](#usage)
|
||||
- [`Pathname` Conventions](#pathname-conventions)
|
||||
- See Also:
|
||||
- [`glob-gitignore`](https://www.npmjs.com/package/glob-gitignore) matches files using patterns and filters them according to gitignore rules.
|
||||
- [Upgrade Guide](#upgrade-guide)
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
npm i ignore
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
import ignore from 'ignore'
|
||||
const ig = ignore().add(['.abc/*', '!.abc/d/'])
|
||||
```
|
||||
|
||||
### Filter the given paths
|
||||
|
||||
```js
|
||||
const paths = [
|
||||
'.abc/a.js', // filtered out
|
||||
'.abc/d/e.js' // included
|
||||
]
|
||||
|
||||
ig.filter(paths) // ['.abc/d/e.js']
|
||||
ig.ignores('.abc/a.js') // true
|
||||
```
|
||||
|
||||
### As the filter function
|
||||
|
||||
```js
|
||||
paths.filter(ig.createFilter()); // ['.abc/d/e.js']
|
||||
```
|
||||
|
||||
### Win32 paths will be handled
|
||||
|
||||
```js
|
||||
ig.filter(['.abc\\a.js', '.abc\\d\\e.js'])
|
||||
// if the code above runs on windows, the result will be
|
||||
// ['.abc\\d\\e.js']
|
||||
```
|
||||
|
||||
## Why another ignore?
|
||||
|
||||
- `ignore` is a standalone module, and is much simpler so that it could easy work with other programs, unlike [isaacs](https://npmjs.org/~isaacs)'s [fstream-ignore](https://npmjs.org/package/fstream-ignore) which must work with the modules of the fstream family.
|
||||
|
||||
- `ignore` only contains utility methods to filter paths according to the specified ignore rules, so
|
||||
- `ignore` never try to find out ignore rules by traversing directories or fetching from git configurations.
|
||||
- `ignore` don't cares about sub-modules of git projects.
|
||||
|
||||
- Exactly according to [gitignore man page](http://git-scm.com/docs/gitignore), fixes some known matching issues of fstream-ignore, such as:
|
||||
- '`/*.js`' should only match '`a.js`', but not '`abc/a.js`'.
|
||||
- '`**/foo`' should match '`foo`' anywhere.
|
||||
- Prevent re-including a file if a parent directory of that file is excluded.
|
||||
- Handle trailing whitespaces:
|
||||
- `'a '`(one space) should not match `'a '`(two spaces).
|
||||
- `'a \ '` matches `'a '`
|
||||
- All test cases are verified with the result of `git check-ignore`.
|
||||
|
||||
# Methods
|
||||
|
||||
## .add(pattern: string | Ignore): this
|
||||
## .add(patterns: Array<string | Ignore>): this
|
||||
|
||||
- **pattern** `String | Ignore` An ignore pattern string, or the `Ignore` instance
|
||||
- **patterns** `Array<String | Ignore>` Array of ignore patterns.
|
||||
|
||||
Adds a rule or several rules to the current manager.
|
||||
|
||||
Returns `this`
|
||||
|
||||
Notice that a line starting with `'#'`(hash) is treated as a comment. Put a backslash (`'\'`) in front of the first hash for patterns that begin with a hash, if you want to ignore a file with a hash at the beginning of the filename.
|
||||
|
||||
```js
|
||||
ignore().add('#abc').ignores('#abc') // false
|
||||
ignore().add('\#abc').ignores('#abc') // true
|
||||
```
|
||||
|
||||
`pattern` could either be a line of ignore pattern or a string of multiple ignore patterns, which means we could just `ignore().add()` the content of a ignore file:
|
||||
|
||||
```js
|
||||
ignore()
|
||||
.add(fs.readFileSync(filenameOfGitignore).toString())
|
||||
.filter(filenames)
|
||||
```
|
||||
|
||||
`pattern` could also be an `ignore` instance, so that we could easily inherit the rules of another `Ignore` instance.
|
||||
|
||||
## <strike>.addIgnoreFile(path)</strike>
|
||||
|
||||
REMOVED in `3.x` for now.
|
||||
|
||||
To upgrade `ignore@2.x` up to `3.x`, use
|
||||
|
||||
```js
|
||||
import fs from 'fs'
|
||||
|
||||
if (fs.existsSync(filename)) {
|
||||
ignore().add(fs.readFileSync(filename).toString())
|
||||
}
|
||||
```
|
||||
|
||||
instead.
|
||||
|
||||
## .filter(paths: Array<Pathname>): Array<Pathname>
|
||||
|
||||
```ts
|
||||
type Pathname = string
|
||||
```
|
||||
|
||||
Filters the given array of pathnames, and returns the filtered array.
|
||||
|
||||
- **paths** `Array.<Pathname>` The array of `pathname`s to be filtered.
|
||||
|
||||
### `Pathname` Conventions:
|
||||
|
||||
#### 1. `Pathname` should be a `path.relative()`d pathname
|
||||
|
||||
`Pathname` should be a string that have been `path.join()`ed, or the return value of `path.relative()` to the current directory,
|
||||
|
||||
```js
|
||||
// WRONG, an error will be thrown
|
||||
ig.ignores('./abc')
|
||||
|
||||
// WRONG, for it will never happen, and an error will be thrown
|
||||
// If the gitignore rule locates at the root directory,
|
||||
// `'/abc'` should be changed to `'abc'`.
|
||||
// ```
|
||||
// path.relative('/', '/abc') -> 'abc'
|
||||
// ```
|
||||
ig.ignores('/abc')
|
||||
|
||||
// WRONG, that it is an absolute path on Windows, an error will be thrown
|
||||
ig.ignores('C:\\abc')
|
||||
|
||||
// Right
|
||||
ig.ignores('abc')
|
||||
|
||||
// Right
|
||||
ig.ignores(path.join('./abc')) // path.join('./abc') -> 'abc'
|
||||
```
|
||||
|
||||
In other words, each `Pathname` here should be a relative path to the directory of the gitignore rules.
|
||||
|
||||
Suppose the dir structure is:
|
||||
|
||||
```
|
||||
/path/to/your/repo
|
||||
|-- a
|
||||
| |-- a.js
|
||||
|
|
||||
|-- .b
|
||||
|
|
||||
|-- .c
|
||||
|-- .DS_store
|
||||
```
|
||||
|
||||
Then the `paths` might be like this:
|
||||
|
||||
```js
|
||||
[
|
||||
'a/a.js'
|
||||
'.b',
|
||||
'.c/.DS_store'
|
||||
]
|
||||
```
|
||||
|
||||
#### 2. filenames and dirnames
|
||||
|
||||
`node-ignore` does NO `fs.stat` during path matching, so for the example below:
|
||||
|
||||
```js
|
||||
// First, we add a ignore pattern to ignore a directory
|
||||
ig.add('config/')
|
||||
|
||||
// `ig` does NOT know if 'config', in the real world,
|
||||
// is a normal file, directory or something.
|
||||
|
||||
ig.ignores('config')
|
||||
// `ig` treats `config` as a file, so it returns `false`
|
||||
|
||||
ig.ignores('config/')
|
||||
// returns `true`
|
||||
```
|
||||
|
||||
Specially for people who develop some library based on `node-ignore`, it is important to understand that.
|
||||
|
||||
Usually, you could use [`glob`](http://npmjs.org/package/glob) with `option.mark = true` to fetch the structure of the current directory:
|
||||
|
||||
```js
|
||||
import glob from 'glob'
|
||||
|
||||
glob('**', {
|
||||
// Adds a / character to directory matches.
|
||||
mark: true
|
||||
}, (err, files) => {
|
||||
if (err) {
|
||||
return console.error(err)
|
||||
}
|
||||
|
||||
let filtered = ignore().add(patterns).filter(files)
|
||||
console.log(filtered)
|
||||
})
|
||||
```
|
||||
|
||||
## .ignores(pathname: Pathname): boolean
|
||||
|
||||
> new in 3.2.0
|
||||
|
||||
Returns `Boolean` whether `pathname` should be ignored.
|
||||
|
||||
```js
|
||||
ig.ignores('.abc/a.js') // true
|
||||
```
|
||||
|
||||
## .createFilter()
|
||||
|
||||
Creates a filter function which could filter an array of paths with `Array.prototype.filter`.
|
||||
|
||||
Returns `function(path)` the filter function.
|
||||
|
||||
## .test(pathname: Pathname) since 5.0.0
|
||||
|
||||
Returns `TestResult`
|
||||
|
||||
```ts
|
||||
interface TestResult {
|
||||
ignored: boolean
|
||||
// true if the `pathname` is finally unignored by some negative pattern
|
||||
unignored: boolean
|
||||
}
|
||||
```
|
||||
|
||||
- `{ignored: true, unignored: false}`: the `pathname` is ignored
|
||||
- `{ignored: false, unignored: true}`: the `pathname` is unignored
|
||||
- `{ignored: false, unignored: false}`: the `pathname` is never matched by any ignore rules.
|
||||
|
||||
## `options.ignorecase` since 4.0.0
|
||||
|
||||
Similar as the `core.ignorecase` option of [git-config](https://git-scm.com/docs/git-config), `node-ignore` will be case insensitive if `options.ignorecase` is set to `true` (the default value), otherwise case sensitive.
|
||||
|
||||
```js
|
||||
const ig = ignore({
|
||||
ignorecase: false
|
||||
})
|
||||
|
||||
ig.add('*.png')
|
||||
|
||||
ig.ignores('*.PNG') // false
|
||||
```
|
||||
|
||||
## static `ignore.isPathValid(pathname): boolean` since 5.0.0
|
||||
|
||||
Check whether the `pathname` is an valid `path.relative()`d path according to the [convention](#1-pathname-should-be-a-pathrelatived-pathname).
|
||||
|
||||
This method is **NOT** used to check if an ignore pattern is valid.
|
||||
|
||||
```js
|
||||
ignore.isPathValid('./foo') // false
|
||||
```
|
||||
|
||||
****
|
||||
|
||||
# Upgrade Guide
|
||||
|
||||
## Upgrade 4.x -> 5.x
|
||||
|
||||
Since `5.0.0`, if an invalid `Pathname` passed into `ig.ignores()`, an error will be thrown, while `ignore < 5.0.0` did not make sure what the return value was, as well as
|
||||
|
||||
```ts
|
||||
.ignores(pathname: Pathname): boolean
|
||||
|
||||
.filter(pathnames: Array<Pathname>): Array<Pathname>
|
||||
|
||||
.createFilter(): (pathname: Pathname) => boolean
|
||||
|
||||
.test(pathname: Pathname): {ignored: boolean, unignored: boolean}
|
||||
```
|
||||
|
||||
See the convention [here](#1-pathname-should-be-a-pathrelatived-pathname) for details.
|
||||
|
||||
If there are invalid pathnames, the conversion and filtration should be done by users.
|
||||
|
||||
```js
|
||||
import {isPathValid} from 'ignore' // introduced in 5.0.0
|
||||
|
||||
const paths = [
|
||||
// invalid
|
||||
//////////////////
|
||||
'',
|
||||
false,
|
||||
'../foo',
|
||||
'.',
|
||||
//////////////////
|
||||
|
||||
// valid
|
||||
'foo'
|
||||
]
|
||||
.filter(isValidPath)
|
||||
|
||||
ig.filter(paths)
|
||||
```
|
||||
|
||||
## Upgrade 3.x -> 4.x
|
||||
|
||||
Since `4.0.0`, `ignore` will no longer support node < 6, to use `ignore` in node < 6:
|
||||
|
||||
```js
|
||||
var ignore = require('ignore/legacy')
|
||||
```
|
||||
|
||||
## Upgrade 2.x -> 3.x
|
||||
|
||||
- All `options` of 2.x are unnecessary and removed, so just remove them.
|
||||
- `ignore()` instance is no longer an [`EventEmitter`](nodejs.org/api/events.html), and all events are unnecessary and removed.
|
||||
- `.addIgnoreFile()` is removed, see the [.addIgnoreFile](#addignorefilepath) section for details.
|
||||
|
||||
****
|
||||
|
||||
# Collaborators
|
||||
|
||||
- [@whitecolor](https://github.com/whitecolor) *Alex*
|
||||
- [@SamyPesse](https://github.com/SamyPesse) *Samy Pessé*
|
||||
- [@azproduction](https://github.com/azproduction) *Mikhail Davydov*
|
||||
- [@TrySound](https://github.com/TrySound) *Bogdan Chadkin*
|
||||
- [@JanMattner](https://github.com/JanMattner) *Jan Mattner*
|
||||
- [@ntwb](https://github.com/ntwb) *Stephen Edgar*
|
||||
- [@kasperisager](https://github.com/kasperisager) *Kasper Isager*
|
||||
- [@sandersn](https://github.com/sandersn) *Nathan Shively-Sanders*
|
63
web/node_modules/react-dev-utils/node_modules/ignore/index.d.ts
generated
vendored
Normal file
63
web/node_modules/react-dev-utils/node_modules/ignore/index.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,63 @@
|
|||
type Pathname = string
|
||||
|
||||
interface TestResult {
|
||||
ignored: boolean
|
||||
unignored: boolean
|
||||
}
|
||||
|
||||
export interface Ignore {
|
||||
/**
|
||||
* Adds a rule rules to the current manager.
|
||||
* @param {string | Ignore} pattern
|
||||
* @returns IgnoreBase
|
||||
*/
|
||||
add(pattern: string | Ignore): this
|
||||
/**
|
||||
* Adds several rules to the current manager.
|
||||
* @param {string[]} patterns
|
||||
* @returns IgnoreBase
|
||||
*/
|
||||
add(patterns: (string | Ignore)[]): this
|
||||
|
||||
/**
|
||||
* Filters the given array of pathnames, and returns the filtered array.
|
||||
* NOTICE that each path here should be a relative path to the root of your repository.
|
||||
* @param paths the array of paths to be filtered.
|
||||
* @returns The filtered array of paths
|
||||
*/
|
||||
filter(pathnames: Pathname[]): Pathname[]
|
||||
/**
|
||||
* Creates a filter function which could filter
|
||||
* an array of paths with Array.prototype.filter.
|
||||
*/
|
||||
createFilter(): (pathname: Pathname) => boolean
|
||||
|
||||
/**
|
||||
* Returns Boolean whether pathname should be ignored.
|
||||
* @param {string} pathname a path to check
|
||||
* @returns boolean
|
||||
*/
|
||||
ignores(pathname: Pathname): boolean
|
||||
|
||||
/**
|
||||
* Returns whether pathname should be ignored or unignored
|
||||
* @param {string} pathname a path to check
|
||||
* @returns TestResult
|
||||
*/
|
||||
test(pathname: Pathname): TestResult
|
||||
}
|
||||
|
||||
interface Options {
|
||||
ignorecase?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new ignore manager.
|
||||
*/
|
||||
declare function ignore(options?: Options): Ignore
|
||||
|
||||
declare namespace ignore {
|
||||
export function isPathValid (pathname: string): boolean
|
||||
}
|
||||
|
||||
export default ignore
|
597
web/node_modules/react-dev-utils/node_modules/ignore/index.js
generated
vendored
Normal file
597
web/node_modules/react-dev-utils/node_modules/ignore/index.js
generated
vendored
Normal file
|
@ -0,0 +1,597 @@
|
|||
// A simple implementation of make-array
|
||||
function makeArray (subject) {
|
||||
return Array.isArray(subject)
|
||||
? subject
|
||||
: [subject]
|
||||
}
|
||||
|
||||
const EMPTY = ''
|
||||
const SPACE = ' '
|
||||
const ESCAPE = '\\'
|
||||
const REGEX_TEST_BLANK_LINE = /^\s+$/
|
||||
const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/
|
||||
const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/
|
||||
const REGEX_SPLITALL_CRLF = /\r?\n/g
|
||||
// /foo,
|
||||
// ./foo,
|
||||
// ../foo,
|
||||
// .
|
||||
// ..
|
||||
const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/
|
||||
|
||||
const SLASH = '/'
|
||||
const KEY_IGNORE = typeof Symbol !== 'undefined'
|
||||
? Symbol.for('node-ignore')
|
||||
/* istanbul ignore next */
|
||||
: 'node-ignore'
|
||||
|
||||
const define = (object, key, value) =>
|
||||
Object.defineProperty(object, key, {value})
|
||||
|
||||
const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g
|
||||
|
||||
// Sanitize the range of a regular expression
|
||||
// The cases are complicated, see test cases for details
|
||||
const sanitizeRange = range => range.replace(
|
||||
REGEX_REGEXP_RANGE,
|
||||
(match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0)
|
||||
? match
|
||||
// Invalid range (out of order) which is ok for gitignore rules but
|
||||
// fatal for JavaScript regular expression, so eliminate it.
|
||||
: EMPTY
|
||||
)
|
||||
|
||||
// See fixtures #59
|
||||
const cleanRangeBackSlash = slashes => {
|
||||
const {length} = slashes
|
||||
return slashes.slice(0, length - length % 2)
|
||||
}
|
||||
|
||||
// > If the pattern ends with a slash,
|
||||
// > it is removed for the purpose of the following description,
|
||||
// > but it would only find a match with a directory.
|
||||
// > In other words, foo/ will match a directory foo and paths underneath it,
|
||||
// > but will not match a regular file or a symbolic link foo
|
||||
// > (this is consistent with the way how pathspec works in general in Git).
|
||||
// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'
|
||||
// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call
|
||||
// you could use option `mark: true` with `glob`
|
||||
|
||||
// '`foo/`' should not continue with the '`..`'
|
||||
const REPLACERS = [
|
||||
|
||||
// > Trailing spaces are ignored unless they are quoted with backslash ("\")
|
||||
[
|
||||
// (a\ ) -> (a )
|
||||
// (a ) -> (a)
|
||||
// (a \ ) -> (a )
|
||||
/\\?\s+$/,
|
||||
match => match.indexOf('\\') === 0
|
||||
? SPACE
|
||||
: EMPTY
|
||||
],
|
||||
|
||||
// replace (\ ) with ' '
|
||||
[
|
||||
/\\\s/g,
|
||||
() => SPACE
|
||||
],
|
||||
|
||||
// Escape metacharacters
|
||||
// which is written down by users but means special for regular expressions.
|
||||
|
||||
// > There are 12 characters with special meanings:
|
||||
// > - the backslash \,
|
||||
// > - the caret ^,
|
||||
// > - the dollar sign $,
|
||||
// > - the period or dot .,
|
||||
// > - the vertical bar or pipe symbol |,
|
||||
// > - the question mark ?,
|
||||
// > - the asterisk or star *,
|
||||
// > - the plus sign +,
|
||||
// > - the opening parenthesis (,
|
||||
// > - the closing parenthesis ),
|
||||
// > - and the opening square bracket [,
|
||||
// > - the opening curly brace {,
|
||||
// > These special characters are often called "metacharacters".
|
||||
[
|
||||
/[\\$.|*+(){^]/g,
|
||||
match => `\\${match}`
|
||||
],
|
||||
|
||||
[
|
||||
// > a question mark (?) matches a single character
|
||||
/(?!\\)\?/g,
|
||||
() => '[^/]'
|
||||
],
|
||||
|
||||
// leading slash
|
||||
[
|
||||
|
||||
// > A leading slash matches the beginning of the pathname.
|
||||
// > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c".
|
||||
// A leading slash matches the beginning of the pathname
|
||||
/^\//,
|
||||
() => '^'
|
||||
],
|
||||
|
||||
// replace special metacharacter slash after the leading slash
|
||||
[
|
||||
/\//g,
|
||||
() => '\\/'
|
||||
],
|
||||
|
||||
[
|
||||
// > A leading "**" followed by a slash means match in all directories.
|
||||
// > For example, "**/foo" matches file or directory "foo" anywhere,
|
||||
// > the same as pattern "foo".
|
||||
// > "**/foo/bar" matches file or directory "bar" anywhere that is directly
|
||||
// > under directory "foo".
|
||||
// Notice that the '*'s have been replaced as '\\*'
|
||||
/^\^*\\\*\\\*\\\//,
|
||||
|
||||
// '**/foo' <-> 'foo'
|
||||
() => '^(?:.*\\/)?'
|
||||
],
|
||||
|
||||
// starting
|
||||
[
|
||||
// there will be no leading '/'
|
||||
// (which has been replaced by section "leading slash")
|
||||
// If starts with '**', adding a '^' to the regular expression also works
|
||||
/^(?=[^^])/,
|
||||
function startingReplacer () {
|
||||
// If has a slash `/` at the beginning or middle
|
||||
return !/\/(?!$)/.test(this)
|
||||
// > Prior to 2.22.1
|
||||
// > If the pattern does not contain a slash /,
|
||||
// > Git treats it as a shell glob pattern
|
||||
// Actually, if there is only a trailing slash,
|
||||
// git also treats it as a shell glob pattern
|
||||
|
||||
// After 2.22.1 (compatible but clearer)
|
||||
// > If there is a separator at the beginning or middle (or both)
|
||||
// > of the pattern, then the pattern is relative to the directory
|
||||
// > level of the particular .gitignore file itself.
|
||||
// > Otherwise the pattern may also match at any level below
|
||||
// > the .gitignore level.
|
||||
? '(?:^|\\/)'
|
||||
|
||||
// > Otherwise, Git treats the pattern as a shell glob suitable for
|
||||
// > consumption by fnmatch(3)
|
||||
: '^'
|
||||
}
|
||||
],
|
||||
|
||||
// two globstars
|
||||
[
|
||||
// Use lookahead assertions so that we could match more than one `'/**'`
|
||||
/\\\/\\\*\\\*(?=\\\/|$)/g,
|
||||
|
||||
// Zero, one or several directories
|
||||
// should not use '*', or it will be replaced by the next replacer
|
||||
|
||||
// Check if it is not the last `'/**'`
|
||||
(_, index, str) => index + 6 < str.length
|
||||
|
||||
// case: /**/
|
||||
// > A slash followed by two consecutive asterisks then a slash matches
|
||||
// > zero or more directories.
|
||||
// > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on.
|
||||
// '/**/'
|
||||
? '(?:\\/[^\\/]+)*'
|
||||
|
||||
// case: /**
|
||||
// > A trailing `"/**"` matches everything inside.
|
||||
|
||||
// #21: everything inside but it should not include the current folder
|
||||
: '\\/.+'
|
||||
],
|
||||
|
||||
// intermediate wildcards
|
||||
[
|
||||
// Never replace escaped '*'
|
||||
// ignore rule '\*' will match the path '*'
|
||||
|
||||
// 'abc.*/' -> go
|
||||
// 'abc.*' -> skip this rule
|
||||
/(^|[^\\]+)\\\*(?=.+)/g,
|
||||
|
||||
// '*.js' matches '.js'
|
||||
// '*.js' doesn't match 'abc'
|
||||
(_, p1) => `${p1}[^\\/]*`
|
||||
],
|
||||
|
||||
[
|
||||
// unescape, revert step 3 except for back slash
|
||||
// For example, if a user escape a '\\*',
|
||||
// after step 3, the result will be '\\\\\\*'
|
||||
/\\\\\\(?=[$.|*+(){^])/g,
|
||||
() => ESCAPE
|
||||
],
|
||||
|
||||
[
|
||||
// '\\\\' -> '\\'
|
||||
/\\\\/g,
|
||||
() => ESCAPE
|
||||
],
|
||||
|
||||
[
|
||||
// > The range notation, e.g. [a-zA-Z],
|
||||
// > can be used to match one of the characters in a range.
|
||||
|
||||
// `\` is escaped by step 3
|
||||
/(\\)?\[([^\]/]*?)(\\*)($|\])/g,
|
||||
(match, leadEscape, range, endEscape, close) => leadEscape === ESCAPE
|
||||
// '\\[bar]' -> '\\\\[bar\\]'
|
||||
? `\\[${range}${cleanRangeBackSlash(endEscape)}${close}`
|
||||
: close === ']'
|
||||
? endEscape.length % 2 === 0
|
||||
// A normal case, and it is a range notation
|
||||
// '[bar]'
|
||||
// '[bar\\\\]'
|
||||
? `[${sanitizeRange(range)}${endEscape}]`
|
||||
// Invalid range notaton
|
||||
// '[bar\\]' -> '[bar\\\\]'
|
||||
: '[]'
|
||||
: '[]'
|
||||
],
|
||||
|
||||
// ending
|
||||
[
|
||||
// 'js' will not match 'js.'
|
||||
// 'ab' will not match 'abc'
|
||||
/(?:[^*])$/,
|
||||
|
||||
// WTF!
|
||||
// https://git-scm.com/docs/gitignore
|
||||
// changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1)
|
||||
// which re-fixes #24, #38
|
||||
|
||||
// > If there is a separator at the end of the pattern then the pattern
|
||||
// > will only match directories, otherwise the pattern can match both
|
||||
// > files and directories.
|
||||
|
||||
// 'js*' will not match 'a.js'
|
||||
// 'js/' will not match 'a.js'
|
||||
// 'js' will match 'a.js' and 'a.js/'
|
||||
match => /\/$/.test(match)
|
||||
// foo/ will not match 'foo'
|
||||
? `${match}$`
|
||||
// foo matches 'foo' and 'foo/'
|
||||
: `${match}(?=$|\\/$)`
|
||||
],
|
||||
|
||||
// trailing wildcard
|
||||
[
|
||||
/(\^|\\\/)?\\\*$/,
|
||||
(_, p1) => {
|
||||
const prefix = p1
|
||||
// '\^':
|
||||
// '/*' does not match EMPTY
|
||||
// '/*' does not match everything
|
||||
|
||||
// '\\\/':
|
||||
// 'abc/*' does not match 'abc/'
|
||||
? `${p1}[^/]+`
|
||||
|
||||
// 'a*' matches 'a'
|
||||
// 'a*' matches 'aa'
|
||||
: '[^/]*'
|
||||
|
||||
return `${prefix}(?=$|\\/$)`
|
||||
}
|
||||
],
|
||||
]
|
||||
|
||||
// A simple cache, because an ignore rule only has only one certain meaning
|
||||
const regexCache = Object.create(null)
|
||||
|
||||
// @param {pattern}
|
||||
const makeRegex = (pattern, negative, ignorecase) => {
|
||||
const r = regexCache[pattern]
|
||||
if (r) {
|
||||
return r
|
||||
}
|
||||
|
||||
// const replacers = negative
|
||||
// ? NEGATIVE_REPLACERS
|
||||
// : POSITIVE_REPLACERS
|
||||
|
||||
const source = REPLACERS.reduce(
|
||||
(prev, current) => prev.replace(current[0], current[1].bind(pattern)),
|
||||
pattern
|
||||
)
|
||||
|
||||
return regexCache[pattern] = ignorecase
|
||||
? new RegExp(source, 'i')
|
||||
: new RegExp(source)
|
||||
}
|
||||
|
||||
const isString = subject => typeof subject === 'string'
|
||||
|
||||
// > A blank line matches no files, so it can serve as a separator for readability.
|
||||
const checkPattern = pattern => pattern
|
||||
&& isString(pattern)
|
||||
&& !REGEX_TEST_BLANK_LINE.test(pattern)
|
||||
|
||||
// > A line starting with # serves as a comment.
|
||||
&& pattern.indexOf('#') !== 0
|
||||
|
||||
const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF)
|
||||
|
||||
class IgnoreRule {
|
||||
constructor (
|
||||
origin,
|
||||
pattern,
|
||||
negative,
|
||||
regex
|
||||
) {
|
||||
this.origin = origin
|
||||
this.pattern = pattern
|
||||
this.negative = negative
|
||||
this.regex = regex
|
||||
}
|
||||
}
|
||||
|
||||
const createRule = (pattern, ignorecase) => {
|
||||
const origin = pattern
|
||||
let negative = false
|
||||
|
||||
// > An optional prefix "!" which negates the pattern;
|
||||
if (pattern.indexOf('!') === 0) {
|
||||
negative = true
|
||||
pattern = pattern.substr(1)
|
||||
}
|
||||
|
||||
pattern = pattern
|
||||
// > Put a backslash ("\") in front of the first "!" for patterns that
|
||||
// > begin with a literal "!", for example, `"\!important!.txt"`.
|
||||
.replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!')
|
||||
// > Put a backslash ("\") in front of the first hash for patterns that
|
||||
// > begin with a hash.
|
||||
.replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#')
|
||||
|
||||
const regex = makeRegex(pattern, negative, ignorecase)
|
||||
|
||||
return new IgnoreRule(
|
||||
origin,
|
||||
pattern,
|
||||
negative,
|
||||
regex
|
||||
)
|
||||
}
|
||||
|
||||
const throwError = (message, Ctor) => {
|
||||
throw new Ctor(message)
|
||||
}
|
||||
|
||||
const checkPath = (path, originalPath, doThrow) => {
|
||||
if (!isString(path)) {
|
||||
return doThrow(
|
||||
`path must be a string, but got \`${originalPath}\``,
|
||||
TypeError
|
||||
)
|
||||
}
|
||||
|
||||
// We don't know if we should ignore EMPTY, so throw
|
||||
if (!path) {
|
||||
return doThrow(`path must not be empty`, TypeError)
|
||||
}
|
||||
|
||||
// Check if it is a relative path
|
||||
if (checkPath.isNotRelative(path)) {
|
||||
const r = '`path.relative()`d'
|
||||
return doThrow(
|
||||
`path should be a ${r} string, but got "${originalPath}"`,
|
||||
RangeError
|
||||
)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path)
|
||||
|
||||
checkPath.isNotRelative = isNotRelative
|
||||
checkPath.convert = p => p
|
||||
|
||||
class Ignore {
|
||||
constructor ({
|
||||
ignorecase = true
|
||||
} = {}) {
|
||||
this._rules = []
|
||||
this._ignorecase = ignorecase
|
||||
define(this, KEY_IGNORE, true)
|
||||
this._initCache()
|
||||
}
|
||||
|
||||
_initCache () {
|
||||
this._ignoreCache = Object.create(null)
|
||||
this._testCache = Object.create(null)
|
||||
}
|
||||
|
||||
_addPattern (pattern) {
|
||||
// #32
|
||||
if (pattern && pattern[KEY_IGNORE]) {
|
||||
this._rules = this._rules.concat(pattern._rules)
|
||||
this._added = true
|
||||
return
|
||||
}
|
||||
|
||||
if (checkPattern(pattern)) {
|
||||
const rule = createRule(pattern, this._ignorecase)
|
||||
this._added = true
|
||||
this._rules.push(rule)
|
||||
}
|
||||
}
|
||||
|
||||
// @param {Array<string> | string | Ignore} pattern
|
||||
add (pattern) {
|
||||
this._added = false
|
||||
|
||||
makeArray(
|
||||
isString(pattern)
|
||||
? splitPattern(pattern)
|
||||
: pattern
|
||||
).forEach(this._addPattern, this)
|
||||
|
||||
// Some rules have just added to the ignore,
|
||||
// making the behavior changed.
|
||||
if (this._added) {
|
||||
this._initCache()
|
||||
}
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
// legacy
|
||||
addPattern (pattern) {
|
||||
return this.add(pattern)
|
||||
}
|
||||
|
||||
// | ignored : unignored
|
||||
// negative | 0:0 | 0:1 | 1:0 | 1:1
|
||||
// -------- | ------- | ------- | ------- | --------
|
||||
// 0 | TEST | TEST | SKIP | X
|
||||
// 1 | TESTIF | SKIP | TEST | X
|
||||
|
||||
// - SKIP: always skip
|
||||
// - TEST: always test
|
||||
// - TESTIF: only test if checkUnignored
|
||||
// - X: that never happen
|
||||
|
||||
// @param {boolean} whether should check if the path is unignored,
|
||||
// setting `checkUnignored` to `false` could reduce additional
|
||||
// path matching.
|
||||
|
||||
// @returns {TestResult} true if a file is ignored
|
||||
_testOne (path, checkUnignored) {
|
||||
let ignored = false
|
||||
let unignored = false
|
||||
|
||||
this._rules.forEach(rule => {
|
||||
const {negative} = rule
|
||||
if (
|
||||
unignored === negative && ignored !== unignored
|
||||
|| negative && !ignored && !unignored && !checkUnignored
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
const matched = rule.regex.test(path)
|
||||
|
||||
if (matched) {
|
||||
ignored = !negative
|
||||
unignored = negative
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
ignored,
|
||||
unignored
|
||||
}
|
||||
}
|
||||
|
||||
// @returns {TestResult}
|
||||
_test (originalPath, cache, checkUnignored, slices) {
|
||||
const path = originalPath
|
||||
// Supports nullable path
|
||||
&& checkPath.convert(originalPath)
|
||||
|
||||
checkPath(path, originalPath, throwError)
|
||||
|
||||
return this._t(path, cache, checkUnignored, slices)
|
||||
}
|
||||
|
||||
_t (path, cache, checkUnignored, slices) {
|
||||
if (path in cache) {
|
||||
return cache[path]
|
||||
}
|
||||
|
||||
if (!slices) {
|
||||
// path/to/a.js
|
||||
// ['path', 'to', 'a.js']
|
||||
slices = path.split(SLASH)
|
||||
}
|
||||
|
||||
slices.pop()
|
||||
|
||||
// If the path has no parent directory, just test it
|
||||
if (!slices.length) {
|
||||
return cache[path] = this._testOne(path, checkUnignored)
|
||||
}
|
||||
|
||||
const parent = this._t(
|
||||
slices.join(SLASH) + SLASH,
|
||||
cache,
|
||||
checkUnignored,
|
||||
slices
|
||||
)
|
||||
|
||||
// If the path contains a parent directory, check the parent first
|
||||
return cache[path] = parent.ignored
|
||||
// > It is not possible to re-include a file if a parent directory of
|
||||
// > that file is excluded.
|
||||
? parent
|
||||
: this._testOne(path, checkUnignored)
|
||||
}
|
||||
|
||||
ignores (path) {
|
||||
return this._test(path, this._ignoreCache, false).ignored
|
||||
}
|
||||
|
||||
createFilter () {
|
||||
return path => !this.ignores(path)
|
||||
}
|
||||
|
||||
filter (paths) {
|
||||
return makeArray(paths).filter(this.createFilter())
|
||||
}
|
||||
|
||||
// @returns {TestResult}
|
||||
test (path) {
|
||||
return this._test(path, this._testCache, true)
|
||||
}
|
||||
}
|
||||
|
||||
const factory = options => new Ignore(options)
|
||||
|
||||
const returnFalse = () => false
|
||||
|
||||
const isPathValid = path =>
|
||||
checkPath(path && checkPath.convert(path), path, returnFalse)
|
||||
|
||||
factory.isPathValid = isPathValid
|
||||
|
||||
// Fixes typescript
|
||||
factory.default = factory
|
||||
|
||||
module.exports = factory
|
||||
|
||||
// Windows
|
||||
// --------------------------------------------------------------
|
||||
/* istanbul ignore if */
|
||||
if (
|
||||
// Detect `process` so that it can run in browsers.
|
||||
typeof process !== 'undefined'
|
||||
&& (
|
||||
process.env && process.env.IGNORE_TEST_WIN32
|
||||
|| process.platform === 'win32'
|
||||
)
|
||||
) {
|
||||
/* eslint no-control-regex: "off" */
|
||||
const makePosix = str => /^\\\\\?\\/.test(str)
|
||||
|| /["<>|\u0000-\u001F]+/u.test(str)
|
||||
? str
|
||||
: str.replace(/\\/g, '/')
|
||||
|
||||
checkPath.convert = makePosix
|
||||
|
||||
// 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/'
|
||||
// 'd:\\foo'
|
||||
const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i
|
||||
checkPath.isNotRelative = path =>
|
||||
REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path)
|
||||
|| isNotRelative(path)
|
||||
}
|
495
web/node_modules/react-dev-utils/node_modules/ignore/legacy.js
generated
vendored
Normal file
495
web/node_modules/react-dev-utils/node_modules/ignore/legacy.js
generated
vendored
Normal file
|
@ -0,0 +1,495 @@
|
|||
"use strict";
|
||||
|
||||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
||||
|
||||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
||||
|
||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
// A simple implementation of make-array
|
||||
function makeArray(subject) {
|
||||
return Array.isArray(subject) ? subject : [subject];
|
||||
}
|
||||
|
||||
var EMPTY = '';
|
||||
var SPACE = ' ';
|
||||
var ESCAPE = '\\';
|
||||
var REGEX_TEST_BLANK_LINE = /^\s+$/;
|
||||
var REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/;
|
||||
var REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/;
|
||||
var REGEX_SPLITALL_CRLF = /\r?\n/g; // /foo,
|
||||
// ./foo,
|
||||
// ../foo,
|
||||
// .
|
||||
// ..
|
||||
|
||||
var REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/;
|
||||
var SLASH = '/';
|
||||
var KEY_IGNORE = typeof Symbol !== 'undefined' ? Symbol["for"]('node-ignore')
|
||||
/* istanbul ignore next */
|
||||
: 'node-ignore';
|
||||
|
||||
var define = function define(object, key, value) {
|
||||
return Object.defineProperty(object, key, {
|
||||
value: value
|
||||
});
|
||||
};
|
||||
|
||||
var REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g; // Sanitize the range of a regular expression
|
||||
// The cases are complicated, see test cases for details
|
||||
|
||||
var sanitizeRange = function sanitizeRange(range) {
|
||||
return range.replace(REGEX_REGEXP_RANGE, function (match, from, to) {
|
||||
return from.charCodeAt(0) <= to.charCodeAt(0) ? match // Invalid range (out of order) which is ok for gitignore rules but
|
||||
// fatal for JavaScript regular expression, so eliminate it.
|
||||
: EMPTY;
|
||||
});
|
||||
}; // See fixtures #59
|
||||
|
||||
|
||||
var cleanRangeBackSlash = function cleanRangeBackSlash(slashes) {
|
||||
var length = slashes.length;
|
||||
return slashes.slice(0, length - length % 2);
|
||||
}; // > If the pattern ends with a slash,
|
||||
// > it is removed for the purpose of the following description,
|
||||
// > but it would only find a match with a directory.
|
||||
// > In other words, foo/ will match a directory foo and paths underneath it,
|
||||
// > but will not match a regular file or a symbolic link foo
|
||||
// > (this is consistent with the way how pathspec works in general in Git).
|
||||
// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'
|
||||
// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call
|
||||
// you could use option `mark: true` with `glob`
|
||||
// '`foo/`' should not continue with the '`..`'
|
||||
|
||||
|
||||
var REPLACERS = [// > Trailing spaces are ignored unless they are quoted with backslash ("\")
|
||||
[// (a\ ) -> (a )
|
||||
// (a ) -> (a)
|
||||
// (a \ ) -> (a )
|
||||
/\\?\s+$/, function (match) {
|
||||
return match.indexOf('\\') === 0 ? SPACE : EMPTY;
|
||||
}], // replace (\ ) with ' '
|
||||
[/\\\s/g, function () {
|
||||
return SPACE;
|
||||
}], // Escape metacharacters
|
||||
// which is written down by users but means special for regular expressions.
|
||||
// > There are 12 characters with special meanings:
|
||||
// > - the backslash \,
|
||||
// > - the caret ^,
|
||||
// > - the dollar sign $,
|
||||
// > - the period or dot .,
|
||||
// > - the vertical bar or pipe symbol |,
|
||||
// > - the question mark ?,
|
||||
// > - the asterisk or star *,
|
||||
// > - the plus sign +,
|
||||
// > - the opening parenthesis (,
|
||||
// > - the closing parenthesis ),
|
||||
// > - and the opening square bracket [,
|
||||
// > - the opening curly brace {,
|
||||
// > These special characters are often called "metacharacters".
|
||||
[/[\\$.|*+(){^]/g, function (match) {
|
||||
return "\\".concat(match);
|
||||
}], [// > a question mark (?) matches a single character
|
||||
/(?!\\)\?/g, function () {
|
||||
return '[^/]';
|
||||
}], // leading slash
|
||||
[// > A leading slash matches the beginning of the pathname.
|
||||
// > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c".
|
||||
// A leading slash matches the beginning of the pathname
|
||||
/^\//, function () {
|
||||
return '^';
|
||||
}], // replace special metacharacter slash after the leading slash
|
||||
[/\//g, function () {
|
||||
return '\\/';
|
||||
}], [// > A leading "**" followed by a slash means match in all directories.
|
||||
// > For example, "**/foo" matches file or directory "foo" anywhere,
|
||||
// > the same as pattern "foo".
|
||||
// > "**/foo/bar" matches file or directory "bar" anywhere that is directly
|
||||
// > under directory "foo".
|
||||
// Notice that the '*'s have been replaced as '\\*'
|
||||
/^\^*\\\*\\\*\\\//, // '**/foo' <-> 'foo'
|
||||
function () {
|
||||
return '^(?:.*\\/)?';
|
||||
}], // starting
|
||||
[// there will be no leading '/'
|
||||
// (which has been replaced by section "leading slash")
|
||||
// If starts with '**', adding a '^' to the regular expression also works
|
||||
/^(?=[^^])/, function startingReplacer() {
|
||||
// If has a slash `/` at the beginning or middle
|
||||
return !/\/(?!$)/.test(this) // > Prior to 2.22.1
|
||||
// > If the pattern does not contain a slash /,
|
||||
// > Git treats it as a shell glob pattern
|
||||
// Actually, if there is only a trailing slash,
|
||||
// git also treats it as a shell glob pattern
|
||||
// After 2.22.1 (compatible but clearer)
|
||||
// > If there is a separator at the beginning or middle (or both)
|
||||
// > of the pattern, then the pattern is relative to the directory
|
||||
// > level of the particular .gitignore file itself.
|
||||
// > Otherwise the pattern may also match at any level below
|
||||
// > the .gitignore level.
|
||||
? '(?:^|\\/)' // > Otherwise, Git treats the pattern as a shell glob suitable for
|
||||
// > consumption by fnmatch(3)
|
||||
: '^';
|
||||
}], // two globstars
|
||||
[// Use lookahead assertions so that we could match more than one `'/**'`
|
||||
/\\\/\\\*\\\*(?=\\\/|$)/g, // Zero, one or several directories
|
||||
// should not use '*', or it will be replaced by the next replacer
|
||||
// Check if it is not the last `'/**'`
|
||||
function (_, index, str) {
|
||||
return index + 6 < str.length // case: /**/
|
||||
// > A slash followed by two consecutive asterisks then a slash matches
|
||||
// > zero or more directories.
|
||||
// > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on.
|
||||
// '/**/'
|
||||
? '(?:\\/[^\\/]+)*' // case: /**
|
||||
// > A trailing `"/**"` matches everything inside.
|
||||
// #21: everything inside but it should not include the current folder
|
||||
: '\\/.+';
|
||||
}], // intermediate wildcards
|
||||
[// Never replace escaped '*'
|
||||
// ignore rule '\*' will match the path '*'
|
||||
// 'abc.*/' -> go
|
||||
// 'abc.*' -> skip this rule
|
||||
/(^|[^\\]+)\\\*(?=.+)/g, // '*.js' matches '.js'
|
||||
// '*.js' doesn't match 'abc'
|
||||
function (_, p1) {
|
||||
return "".concat(p1, "[^\\/]*");
|
||||
}], [// unescape, revert step 3 except for back slash
|
||||
// For example, if a user escape a '\\*',
|
||||
// after step 3, the result will be '\\\\\\*'
|
||||
/\\\\\\(?=[$.|*+(){^])/g, function () {
|
||||
return ESCAPE;
|
||||
}], [// '\\\\' -> '\\'
|
||||
/\\\\/g, function () {
|
||||
return ESCAPE;
|
||||
}], [// > The range notation, e.g. [a-zA-Z],
|
||||
// > can be used to match one of the characters in a range.
|
||||
// `\` is escaped by step 3
|
||||
/(\\)?\[([^\]/]*?)(\\*)($|\])/g, function (match, leadEscape, range, endEscape, close) {
|
||||
return leadEscape === ESCAPE // '\\[bar]' -> '\\\\[bar\\]'
|
||||
? "\\[".concat(range).concat(cleanRangeBackSlash(endEscape)).concat(close) : close === ']' ? endEscape.length % 2 === 0 // A normal case, and it is a range notation
|
||||
// '[bar]'
|
||||
// '[bar\\\\]'
|
||||
? "[".concat(sanitizeRange(range)).concat(endEscape, "]") // Invalid range notaton
|
||||
// '[bar\\]' -> '[bar\\\\]'
|
||||
: '[]' : '[]';
|
||||
}], // ending
|
||||
[// 'js' will not match 'js.'
|
||||
// 'ab' will not match 'abc'
|
||||
/(?:[^*])$/, // WTF!
|
||||
// https://git-scm.com/docs/gitignore
|
||||
// changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1)
|
||||
// which re-fixes #24, #38
|
||||
// > If there is a separator at the end of the pattern then the pattern
|
||||
// > will only match directories, otherwise the pattern can match both
|
||||
// > files and directories.
|
||||
// 'js*' will not match 'a.js'
|
||||
// 'js/' will not match 'a.js'
|
||||
// 'js' will match 'a.js' and 'a.js/'
|
||||
function (match) {
|
||||
return /\/$/.test(match) // foo/ will not match 'foo'
|
||||
? "".concat(match, "$") // foo matches 'foo' and 'foo/'
|
||||
: "".concat(match, "(?=$|\\/$)");
|
||||
}], // trailing wildcard
|
||||
[/(\^|\\\/)?\\\*$/, function (_, p1) {
|
||||
var prefix = p1 // '\^':
|
||||
// '/*' does not match EMPTY
|
||||
// '/*' does not match everything
|
||||
// '\\\/':
|
||||
// 'abc/*' does not match 'abc/'
|
||||
? "".concat(p1, "[^/]+") // 'a*' matches 'a'
|
||||
// 'a*' matches 'aa'
|
||||
: '[^/]*';
|
||||
return "".concat(prefix, "(?=$|\\/$)");
|
||||
}]]; // A simple cache, because an ignore rule only has only one certain meaning
|
||||
|
||||
var regexCache = Object.create(null); // @param {pattern}
|
||||
|
||||
var makeRegex = function makeRegex(pattern, negative, ignorecase) {
|
||||
var r = regexCache[pattern];
|
||||
|
||||
if (r) {
|
||||
return r;
|
||||
} // const replacers = negative
|
||||
// ? NEGATIVE_REPLACERS
|
||||
// : POSITIVE_REPLACERS
|
||||
|
||||
|
||||
var source = REPLACERS.reduce(function (prev, current) {
|
||||
return prev.replace(current[0], current[1].bind(pattern));
|
||||
}, pattern);
|
||||
return regexCache[pattern] = ignorecase ? new RegExp(source, 'i') : new RegExp(source);
|
||||
};
|
||||
|
||||
var isString = function isString(subject) {
|
||||
return typeof subject === 'string';
|
||||
}; // > A blank line matches no files, so it can serve as a separator for readability.
|
||||
|
||||
|
||||
var checkPattern = function checkPattern(pattern) {
|
||||
return pattern && isString(pattern) && !REGEX_TEST_BLANK_LINE.test(pattern) // > A line starting with # serves as a comment.
|
||||
&& pattern.indexOf('#') !== 0;
|
||||
};
|
||||
|
||||
var splitPattern = function splitPattern(pattern) {
|
||||
return pattern.split(REGEX_SPLITALL_CRLF);
|
||||
};
|
||||
|
||||
var IgnoreRule = function IgnoreRule(origin, pattern, negative, regex) {
|
||||
_classCallCheck(this, IgnoreRule);
|
||||
|
||||
this.origin = origin;
|
||||
this.pattern = pattern;
|
||||
this.negative = negative;
|
||||
this.regex = regex;
|
||||
};
|
||||
|
||||
var createRule = function createRule(pattern, ignorecase) {
|
||||
var origin = pattern;
|
||||
var negative = false; // > An optional prefix "!" which negates the pattern;
|
||||
|
||||
if (pattern.indexOf('!') === 0) {
|
||||
negative = true;
|
||||
pattern = pattern.substr(1);
|
||||
}
|
||||
|
||||
pattern = pattern // > Put a backslash ("\") in front of the first "!" for patterns that
|
||||
// > begin with a literal "!", for example, `"\!important!.txt"`.
|
||||
.replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') // > Put a backslash ("\") in front of the first hash for patterns that
|
||||
// > begin with a hash.
|
||||
.replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#');
|
||||
var regex = makeRegex(pattern, negative, ignorecase);
|
||||
return new IgnoreRule(origin, pattern, negative, regex);
|
||||
};
|
||||
|
||||
var throwError = function throwError(message, Ctor) {
|
||||
throw new Ctor(message);
|
||||
};
|
||||
|
||||
var checkPath = function checkPath(path, originalPath, doThrow) {
|
||||
if (!isString(path)) {
|
||||
return doThrow("path must be a string, but got `".concat(originalPath, "`"), TypeError);
|
||||
} // We don't know if we should ignore EMPTY, so throw
|
||||
|
||||
|
||||
if (!path) {
|
||||
return doThrow("path must not be empty", TypeError);
|
||||
} // Check if it is a relative path
|
||||
|
||||
|
||||
if (checkPath.isNotRelative(path)) {
|
||||
var r = '`path.relative()`d';
|
||||
return doThrow("path should be a ".concat(r, " string, but got \"").concat(originalPath, "\""), RangeError);
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
var isNotRelative = function isNotRelative(path) {
|
||||
return REGEX_TEST_INVALID_PATH.test(path);
|
||||
};
|
||||
|
||||
checkPath.isNotRelative = isNotRelative;
|
||||
|
||||
checkPath.convert = function (p) {
|
||||
return p;
|
||||
};
|
||||
|
||||
var Ignore = /*#__PURE__*/function () {
|
||||
function Ignore() {
|
||||
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
||||
_ref$ignorecase = _ref.ignorecase,
|
||||
ignorecase = _ref$ignorecase === void 0 ? true : _ref$ignorecase;
|
||||
|
||||
_classCallCheck(this, Ignore);
|
||||
|
||||
this._rules = [];
|
||||
this._ignorecase = ignorecase;
|
||||
define(this, KEY_IGNORE, true);
|
||||
|
||||
this._initCache();
|
||||
}
|
||||
|
||||
_createClass(Ignore, [{
|
||||
key: "_initCache",
|
||||
value: function _initCache() {
|
||||
this._ignoreCache = Object.create(null);
|
||||
this._testCache = Object.create(null);
|
||||
}
|
||||
}, {
|
||||
key: "_addPattern",
|
||||
value: function _addPattern(pattern) {
|
||||
// #32
|
||||
if (pattern && pattern[KEY_IGNORE]) {
|
||||
this._rules = this._rules.concat(pattern._rules);
|
||||
this._added = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (checkPattern(pattern)) {
|
||||
var rule = createRule(pattern, this._ignorecase);
|
||||
this._added = true;
|
||||
|
||||
this._rules.push(rule);
|
||||
}
|
||||
} // @param {Array<string> | string | Ignore} pattern
|
||||
|
||||
}, {
|
||||
key: "add",
|
||||
value: function add(pattern) {
|
||||
this._added = false;
|
||||
makeArray(isString(pattern) ? splitPattern(pattern) : pattern).forEach(this._addPattern, this); // Some rules have just added to the ignore,
|
||||
// making the behavior changed.
|
||||
|
||||
if (this._added) {
|
||||
this._initCache();
|
||||
}
|
||||
|
||||
return this;
|
||||
} // legacy
|
||||
|
||||
}, {
|
||||
key: "addPattern",
|
||||
value: function addPattern(pattern) {
|
||||
return this.add(pattern);
|
||||
} // | ignored : unignored
|
||||
// negative | 0:0 | 0:1 | 1:0 | 1:1
|
||||
// -------- | ------- | ------- | ------- | --------
|
||||
// 0 | TEST | TEST | SKIP | X
|
||||
// 1 | TESTIF | SKIP | TEST | X
|
||||
// - SKIP: always skip
|
||||
// - TEST: always test
|
||||
// - TESTIF: only test if checkUnignored
|
||||
// - X: that never happen
|
||||
// @param {boolean} whether should check if the path is unignored,
|
||||
// setting `checkUnignored` to `false` could reduce additional
|
||||
// path matching.
|
||||
// @returns {TestResult} true if a file is ignored
|
||||
|
||||
}, {
|
||||
key: "_testOne",
|
||||
value: function _testOne(path, checkUnignored) {
|
||||
var ignored = false;
|
||||
var unignored = false;
|
||||
|
||||
this._rules.forEach(function (rule) {
|
||||
var negative = rule.negative;
|
||||
|
||||
if (unignored === negative && ignored !== unignored || negative && !ignored && !unignored && !checkUnignored) {
|
||||
return;
|
||||
}
|
||||
|
||||
var matched = rule.regex.test(path);
|
||||
|
||||
if (matched) {
|
||||
ignored = !negative;
|
||||
unignored = negative;
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
ignored: ignored,
|
||||
unignored: unignored
|
||||
};
|
||||
} // @returns {TestResult}
|
||||
|
||||
}, {
|
||||
key: "_test",
|
||||
value: function _test(originalPath, cache, checkUnignored, slices) {
|
||||
var path = originalPath // Supports nullable path
|
||||
&& checkPath.convert(originalPath);
|
||||
checkPath(path, originalPath, throwError);
|
||||
return this._t(path, cache, checkUnignored, slices);
|
||||
}
|
||||
}, {
|
||||
key: "_t",
|
||||
value: function _t(path, cache, checkUnignored, slices) {
|
||||
if (path in cache) {
|
||||
return cache[path];
|
||||
}
|
||||
|
||||
if (!slices) {
|
||||
// path/to/a.js
|
||||
// ['path', 'to', 'a.js']
|
||||
slices = path.split(SLASH);
|
||||
}
|
||||
|
||||
slices.pop(); // If the path has no parent directory, just test it
|
||||
|
||||
if (!slices.length) {
|
||||
return cache[path] = this._testOne(path, checkUnignored);
|
||||
}
|
||||
|
||||
var parent = this._t(slices.join(SLASH) + SLASH, cache, checkUnignored, slices); // If the path contains a parent directory, check the parent first
|
||||
|
||||
|
||||
return cache[path] = parent.ignored // > It is not possible to re-include a file if a parent directory of
|
||||
// > that file is excluded.
|
||||
? parent : this._testOne(path, checkUnignored);
|
||||
}
|
||||
}, {
|
||||
key: "ignores",
|
||||
value: function ignores(path) {
|
||||
return this._test(path, this._ignoreCache, false).ignored;
|
||||
}
|
||||
}, {
|
||||
key: "createFilter",
|
||||
value: function createFilter() {
|
||||
var _this = this;
|
||||
|
||||
return function (path) {
|
||||
return !_this.ignores(path);
|
||||
};
|
||||
}
|
||||
}, {
|
||||
key: "filter",
|
||||
value: function filter(paths) {
|
||||
return makeArray(paths).filter(this.createFilter());
|
||||
} // @returns {TestResult}
|
||||
|
||||
}, {
|
||||
key: "test",
|
||||
value: function test(path) {
|
||||
return this._test(path, this._testCache, true);
|
||||
}
|
||||
}]);
|
||||
|
||||
return Ignore;
|
||||
}();
|
||||
|
||||
var factory = function factory(options) {
|
||||
return new Ignore(options);
|
||||
};
|
||||
|
||||
var returnFalse = function returnFalse() {
|
||||
return false;
|
||||
};
|
||||
|
||||
var isPathValid = function isPathValid(path) {
|
||||
return checkPath(path && checkPath.convert(path), path, returnFalse);
|
||||
};
|
||||
|
||||
factory.isPathValid = isPathValid; // Fixes typescript
|
||||
|
||||
factory["default"] = factory;
|
||||
module.exports = factory; // Windows
|
||||
// --------------------------------------------------------------
|
||||
|
||||
/* istanbul ignore if */
|
||||
|
||||
if ( // Detect `process` so that it can run in browsers.
|
||||
typeof process !== 'undefined' && (process.env && process.env.IGNORE_TEST_WIN32 || process.platform === 'win32')) {
|
||||
/* eslint no-control-regex: "off" */
|
||||
var makePosix = function makePosix(str) {
|
||||
return /^\\\\\?\\/.test(str) || /[\0-\x1F"<>\|]+/.test(str) ? str : str.replace(/\\/g, '/');
|
||||
};
|
||||
|
||||
checkPath.convert = makePosix; // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/'
|
||||
// 'd:\\foo'
|
||||
|
||||
var REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i;
|
||||
|
||||
checkPath.isNotRelative = function (path) {
|
||||
return REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) || isNotRelative(path);
|
||||
};
|
||||
}
|
70
web/node_modules/react-dev-utils/node_modules/ignore/package.json
generated
vendored
Normal file
70
web/node_modules/react-dev-utils/node_modules/ignore/package.json
generated
vendored
Normal file
|
@ -0,0 +1,70 @@
|
|||
{
|
||||
"name": "ignore",
|
||||
"version": "5.1.8",
|
||||
"description": "Ignore is a manager and filter for .gitignore rules, the one used by eslint, gitbook and many others.",
|
||||
"files": [
|
||||
"legacy.js",
|
||||
"index.js",
|
||||
"index.d.ts",
|
||||
"LICENSE-MIT"
|
||||
],
|
||||
"scripts": {
|
||||
"prepublishOnly": "npm run build",
|
||||
"build": "babel -o legacy.js index.js",
|
||||
"test:lint": "eslint .",
|
||||
"test:tsc": "tsc ./test/ts/simple.ts --lib ES6",
|
||||
"test:ts": "node ./test/ts/simple.js",
|
||||
"test:git": "tap test/git-check-ignore.js",
|
||||
"test:ignore": "tap test/ignore.js",
|
||||
"test:others": "tap test/others.js",
|
||||
"test:cases": "tap test/*.js --coverage",
|
||||
"test:only": "npm run test:lint && npm run test:tsc && npm run test:ts && npm run test:cases",
|
||||
"test": "npm run test:only",
|
||||
"test:win32": "IGNORE_TEST_WIN32=1 npm run test",
|
||||
"posttest": "tap --coverage-report=html && codecov"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:kaelzhang/node-ignore.git"
|
||||
},
|
||||
"keywords": [
|
||||
"ignore",
|
||||
".gitignore",
|
||||
"gitignore",
|
||||
"npmignore",
|
||||
"rules",
|
||||
"manager",
|
||||
"filter",
|
||||
"regexp",
|
||||
"regex",
|
||||
"fnmatch",
|
||||
"glob",
|
||||
"asterisks",
|
||||
"regular-expression"
|
||||
],
|
||||
"author": "kael",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/kaelzhang/node-ignore/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.8.4",
|
||||
"@babel/core": "^7.9.6",
|
||||
"@babel/preset-env": "^7.9.6",
|
||||
"codecov": "^3.7.0",
|
||||
"debug": "^4.1.1",
|
||||
"eslint": "^7.0.0",
|
||||
"eslint-config-ostai": "^3.0.0",
|
||||
"eslint-plugin-import": "^2.20.2",
|
||||
"mkdirp": "^1.0.4",
|
||||
"pre-suf": "^1.1.1",
|
||||
"rimraf": "^3.0.2",
|
||||
"spawn-sync": "^2.0.0",
|
||||
"tap": "^14.10.7",
|
||||
"tmp": "0.2.1",
|
||||
"typescript": "^3.9.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 4"
|
||||
}
|
||||
}
|
21
web/node_modules/react-dev-utils/node_modules/immer/LICENSE
generated
vendored
Normal file
21
web/node_modules/react-dev-utils/node_modules/immer/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2017 Michel Weststrate
|
||||
|
||||
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.
|
315
web/node_modules/react-dev-utils/node_modules/immer/compat/pre-3.7/dist/immer.d.ts
generated
vendored
Normal file
315
web/node_modules/react-dev-utils/node_modules/immer/compat/pre-3.7/dist/immer.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,315 @@
|
|||
type Tail<T extends any[]> = ((...t: T) => any) extends (
|
||||
_: any,
|
||||
...tail: infer TT
|
||||
) => any
|
||||
? TT
|
||||
: []
|
||||
|
||||
/** Object types that should never be mapped */
|
||||
type AtomicObject =
|
||||
| Function
|
||||
| WeakMap<any, any>
|
||||
| WeakSet<any>
|
||||
| Promise<any>
|
||||
| Date
|
||||
| RegExp
|
||||
| Boolean
|
||||
| Number
|
||||
| String
|
||||
|
||||
export type Draft<T> = T extends AtomicObject
|
||||
? T
|
||||
: T extends Map<infer K, infer V>
|
||||
? DraftMap<K, V>
|
||||
: T extends Set<infer V>
|
||||
? DraftSet<V>
|
||||
: T extends object
|
||||
? {-readonly [K in keyof T]: Draft<T[K]>}
|
||||
: T
|
||||
|
||||
// Inline these in ts 3.7
|
||||
interface DraftMap<K, V> extends Map<Draft<K>, Draft<V>> {}
|
||||
|
||||
// Inline these in ts 3.7
|
||||
interface DraftSet<V> extends Set<Draft<V>> {}
|
||||
|
||||
/** Convert a mutable type into a readonly type */
|
||||
export type Immutable<T> = T extends AtomicObject
|
||||
? T
|
||||
: T extends Map<infer K, infer V> // Ideally, but wait for TS 3.7: ? Omit<ImmutableMap<K, V>, "set" | "delete" | "clear">
|
||||
? ImmutableMap<K, V>
|
||||
: T extends Set<infer V> // Ideally, but wait for TS 3.7: ? Omit<ImmutableSet<V>, "add" | "delete" | "clear">
|
||||
? ImmutableSet<V>
|
||||
: T extends object
|
||||
? {readonly [K in keyof T]: Immutable<T[K]>}
|
||||
: T
|
||||
|
||||
interface ImmutableMap<K, V> extends Map<Immutable<K>, Immutable<V>> {}
|
||||
|
||||
interface ImmutableSet<V> extends Set<Immutable<V>> {}
|
||||
|
||||
export interface Patch {
|
||||
op: "replace" | "remove" | "add"
|
||||
path: (string | number)[]
|
||||
value?: any
|
||||
}
|
||||
|
||||
export type PatchListener = (patches: Patch[], inversePatches: Patch[]) => void
|
||||
|
||||
/** Converts `nothing` into `undefined` */
|
||||
type FromNothing<T> = T extends Nothing ? undefined : T
|
||||
|
||||
/** The inferred return type of `produce` */
|
||||
export type Produced<Base, Return> = Return extends void
|
||||
? Base
|
||||
: Return extends Promise<infer Result>
|
||||
? Promise<Result extends void ? Base : FromNothing<Result>>
|
||||
: FromNothing<Return>
|
||||
|
||||
/**
|
||||
* The `produce` function takes a value and a "recipe function" (whose
|
||||
* return value often depends on the base state). The recipe function is
|
||||
* free to mutate its first argument however it wants. All mutations are
|
||||
* only ever applied to a __copy__ of the base state.
|
||||
*
|
||||
* Pass only a function to create a "curried producer" which relieves you
|
||||
* from passing the recipe function every time.
|
||||
*
|
||||
* Only plain objects and arrays are made mutable. All other objects are
|
||||
* considered uncopyable.
|
||||
*
|
||||
* Note: This function is __bound__ to its `Immer` instance.
|
||||
*
|
||||
* @param {any} base - the initial state
|
||||
* @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified
|
||||
* @param {Function} patchListener - optional function that will be called with all the patches produced here
|
||||
* @returns {any} a new state, or the initial state if nothing was modified
|
||||
*/
|
||||
export interface IProduce {
|
||||
/** Curried producer */
|
||||
<
|
||||
Recipe extends (...args: any[]) => any,
|
||||
Params extends any[] = Parameters<Recipe>,
|
||||
T = Params[0]
|
||||
>(
|
||||
recipe: Recipe
|
||||
): <Base extends Immutable<T>>(
|
||||
base: Base,
|
||||
...rest: Tail<Params>
|
||||
) => Produced<Base, ReturnType<Recipe>>
|
||||
// ^ by making the returned type generic, the actual type of the passed in object is preferred
|
||||
// over the type used in the recipe. However, it does have to satisfy the immutable version used in the recipe
|
||||
// Note: the type of S is the widened version of T, so it can have more props than T, but that is technically actually correct!
|
||||
|
||||
/** Curried producer with initial state */
|
||||
<
|
||||
Recipe extends (...args: any[]) => any,
|
||||
Params extends any[] = Parameters<Recipe>,
|
||||
T = Params[0]
|
||||
>(
|
||||
recipe: Recipe,
|
||||
initialState: Immutable<T>
|
||||
): <Base extends Immutable<T>>(
|
||||
base?: Base,
|
||||
...rest: Tail<Params>
|
||||
) => Produced<Base, ReturnType<Recipe>>
|
||||
|
||||
/** Normal producer */
|
||||
<Base, D = Draft<Base>, Return = void>(
|
||||
base: Base,
|
||||
recipe: (draft: D) => Return,
|
||||
listener?: PatchListener
|
||||
): Produced<Base, Return>
|
||||
}
|
||||
|
||||
export const produce: IProduce
|
||||
export default produce
|
||||
|
||||
/**
|
||||
* Like `produce`, but instead of just returning the new state,
|
||||
* a tuple is returned with [nextState, patches, inversePatches]
|
||||
*
|
||||
* Like produce, this function supports currying
|
||||
*/
|
||||
export interface IProduceWithPatches {
|
||||
/** Curried producer */
|
||||
<
|
||||
Recipe extends (...args: any[]) => any,
|
||||
Params extends any[] = Parameters<Recipe>,
|
||||
T = Params[0]
|
||||
>(
|
||||
recipe: Recipe
|
||||
): <Base extends Immutable<T>>(
|
||||
base: Base,
|
||||
...rest: Tail<Params>
|
||||
) => [Produced<Base, ReturnType<Recipe>>, Patch[], Patch[]]
|
||||
// ^ by making the returned type generic, the actual type of the passed in object is preferred
|
||||
// over the type used in the recipe. However, it does have to satisfy the immutable version used in the recipe
|
||||
// Note: the type of S is the widened version of T, so it can have more props than T, but that is technically actually correct!
|
||||
|
||||
/** Curried producer with initial state */
|
||||
<
|
||||
Recipe extends (...args: any[]) => any,
|
||||
Params extends any[] = Parameters<Recipe>,
|
||||
T = Params[0]
|
||||
>(
|
||||
recipe: Recipe,
|
||||
initialState: Immutable<T>
|
||||
): <Base extends Immutable<T>>(
|
||||
base?: Base,
|
||||
...rest: Tail<Params>
|
||||
) => [Produced<Base, ReturnType<Recipe>>, Patch[], Patch[]]
|
||||
|
||||
/** Normal producer */
|
||||
<Base, D = Draft<Base>, Return = void>(
|
||||
base: Base,
|
||||
recipe: (draft: D) => Return
|
||||
): [Produced<Base, Return>, Patch[], Patch[]]
|
||||
}
|
||||
export const produceWithPatches: IProduceWithPatches
|
||||
|
||||
/** Use a class type for `nothing` so its type is unique */
|
||||
declare class Nothing {
|
||||
// This lets us do `Exclude<T, Nothing>`
|
||||
private _: any
|
||||
}
|
||||
|
||||
/**
|
||||
* The sentinel value returned by producers to replace the draft with undefined.
|
||||
*/
|
||||
export const nothing: Nothing
|
||||
|
||||
/**
|
||||
* To let Immer treat your class instances as plain immutable objects
|
||||
* (albeit with a custom prototype), you must define either an instance property
|
||||
* or a static property on each of your custom classes.
|
||||
*
|
||||
* Otherwise, your class instance will never be drafted, which means it won't be
|
||||
* safe to mutate in a produce callback.
|
||||
*/
|
||||
export const immerable: unique symbol
|
||||
|
||||
/**
|
||||
* Pass true to automatically freeze all copies created by Immer.
|
||||
*
|
||||
* By default, auto-freezing is disabled in production.
|
||||
*/
|
||||
export function setAutoFreeze(autoFreeze: boolean): void
|
||||
|
||||
/**
|
||||
* Pass true to use the ES2015 `Proxy` class when creating drafts, which is
|
||||
* always faster than using ES5 proxies.
|
||||
*
|
||||
* By default, feature detection is used, so calling this is rarely necessary.
|
||||
*/
|
||||
export function setUseProxies(useProxies: boolean): void
|
||||
|
||||
/**
|
||||
* Apply an array of Immer patches to the first argument.
|
||||
*
|
||||
* This function is a producer, which means copy-on-write is in effect.
|
||||
*/
|
||||
export function applyPatches<S>(base: S, patches: Patch[]): S
|
||||
|
||||
/**
|
||||
* Create an Immer draft from the given base state, which may be a draft itself.
|
||||
* The draft can be modified until you finalize it with the `finishDraft` function.
|
||||
*/
|
||||
export function createDraft<T>(base: T): Draft<T>
|
||||
|
||||
/**
|
||||
* Finalize an Immer draft from a `createDraft` call, returning the base state
|
||||
* (if no changes were made) or a modified copy. The draft must *not* be
|
||||
* mutated afterwards.
|
||||
*
|
||||
* Pass a function as the 2nd argument to generate Immer patches based on the
|
||||
* changes that were made.
|
||||
*/
|
||||
export function finishDraft<T>(draft: T, listener?: PatchListener): Immutable<T>
|
||||
|
||||
/** Get the underlying object that is represented by the given draft */
|
||||
export function original<T>(value: T): T | void
|
||||
|
||||
/** Takes a snapshot of the current state of a draft and finalizes it (but without freezing). This is a great utility to print the current state during debugging (no Proxies in the way). The output of current can also be safely leaked outside the producer. */
|
||||
export function current<T>(value: T): T
|
||||
|
||||
/** Returns true if the given value is an Immer draft */
|
||||
export function isDraft(value: any): boolean
|
||||
|
||||
/** Returns true if the given value can be drafted by Immer */
|
||||
export function isDraftable(value: any): boolean
|
||||
|
||||
export class Immer {
|
||||
constructor(config: {
|
||||
useProxies?: boolean
|
||||
autoFreeze?: boolean
|
||||
onAssign?: (
|
||||
state: ImmerState,
|
||||
prop: string | number,
|
||||
value: unknown
|
||||
) => void
|
||||
onDelete?: (state: ImmerState, prop: string | number) => void
|
||||
onCopy?: (state: ImmerState) => void
|
||||
})
|
||||
/**
|
||||
* The `produce` function takes a value and a "recipe function" (whose
|
||||
* return value often depends on the base state). The recipe function is
|
||||
* free to mutate its first argument however it wants. All mutations are
|
||||
* only ever applied to a __copy__ of the base state.
|
||||
*
|
||||
* Pass only a function to create a "curried producer" which relieves you
|
||||
* from passing the recipe function every time.
|
||||
*
|
||||
* Only plain objects and arrays are made mutable. All other objects are
|
||||
* considered uncopyable.
|
||||
*
|
||||
* Note: This function is __bound__ to its `Immer` instance.
|
||||
*
|
||||
* @param {any} base - the initial state
|
||||
* @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified
|
||||
* @param {Function} patchListener - optional function that will be called with all the patches produced here
|
||||
* @returns {any} a new state, or the initial state if nothing was modified
|
||||
*/
|
||||
produce: IProduce
|
||||
/**
|
||||
* When true, `produce` will freeze the copies it creates.
|
||||
*/
|
||||
readonly autoFreeze: boolean
|
||||
/**
|
||||
* When true, drafts are ES2015 proxies.
|
||||
*/
|
||||
readonly useProxies: boolean
|
||||
/**
|
||||
* Pass true to automatically freeze all copies created by Immer.
|
||||
*
|
||||
* By default, auto-freezing is disabled in production.
|
||||
*/
|
||||
setAutoFreeze(autoFreeze: boolean): void
|
||||
/**
|
||||
* Pass true to use the ES2015 `Proxy` class when creating drafts, which is
|
||||
* always faster than using ES5 proxies.
|
||||
*
|
||||
* By default, feature detection is used, so calling this is rarely necessary.
|
||||
*/
|
||||
setUseProxies(useProxies: boolean): void
|
||||
}
|
||||
|
||||
export interface ImmerState<T = any> {
|
||||
parent?: ImmerState
|
||||
base: T
|
||||
copy: T
|
||||
assigned: {[prop: string]: boolean; [index: number]: boolean}
|
||||
}
|
||||
|
||||
// Backward compatibility with --target es5
|
||||
declare global {
|
||||
interface Set<T> {}
|
||||
interface Map<K, V> {}
|
||||
interface WeakSet<T> {}
|
||||
interface WeakMap<K extends object, V> {}
|
||||
}
|
||||
|
||||
export declare function enableAllPlugins(): void
|
||||
export declare function enableES5(): void
|
||||
export declare function enableMapSet(): void
|
||||
export declare function enablePatches(): void
|
3
web/node_modules/react-dev-utils/node_modules/immer/dist/core/current.d.ts
generated
vendored
Normal file
3
web/node_modules/react-dev-utils/node_modules/immer/dist/core/current.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
/** Takes a snapshot of the current state of a draft and finalizes it (but without freezing). This is a great utility to print the current state during debugging (no Proxies in the way). The output of current can also be safely leaked outside the producer. */
|
||||
export declare function current<T>(value: T): T;
|
||||
//# sourceMappingURL=current.d.ts.map
|
1
web/node_modules/react-dev-utils/node_modules/immer/dist/core/current.d.ts.map
generated
vendored
Normal file
1
web/node_modules/react-dev-utils/node_modules/immer/dist/core/current.d.ts.map
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../src/core/current.ts"],"names":[],"mappings":"AAgBA,mQAAmQ;AACnQ,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA"}
|
3
web/node_modules/react-dev-utils/node_modules/immer/dist/core/finalize.d.ts
generated
vendored
Normal file
3
web/node_modules/react-dev-utils/node_modules/immer/dist/core/finalize.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
import { ImmerScope } from "../internal";
|
||||
export declare function processResult(result: any, scope: ImmerScope): any;
|
||||
//# sourceMappingURL=finalize.d.ts.map
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue