Re-add EditorConfig support (undo #3213) (#3255)

* Revert "Revert "Respect EditorConfig settings" (#3213)"

This reverts commit d2241fc0d5.

* Comment out EditorConfig docs

See https://github.com/prettier/prettier/pull/3213#issuecomment-343009769

* editorconfig: Support `indent_size = 0`

See https://github.com/prettier/prettier/pull/2760#discussion_r137447715
and c38b84c42a

* Revert "Comment out EditorConfig docs"

This reverts commit ddfa529c55cac4853a1e76e00c8b5e3ef158c01f.

* Mark EditorConfig functionality as v1.9.0+

See https://github.com/prettier/prettier/pull/3255#discussion_r150432508

* editorconfig: Upgrade editorconfig-to-prettier to 0.0.4

* editorconfig: Only enable for CLI, by default

https://github.com/prettier/prettier/pull/3255#issuecomment-348420546

* editorconfig: Add tests confirming that editorconfig is ignored by default in the API

https://github.com/prettier/prettier/pull/3255#issuecomment-348420546

* editorconfig: Add/fix CLI option parsing

* editorconfig: Move docs from configuration.md to options.md

* editorconfig: Add `oppositeDescription` to show docs for `--no-editorconfig`

Addresses https://github.com/prettier/prettier/pull/3255#discussion_r154542792

* editorconfig: Update test snapshots

* editorconfig: Remove unnecessary options parsing code

Addresses https://github.com/prettier/prettier/pull/3255#discussion_r154544560

* editorconfig: Move docs from options.md to api.md and cli.md

Addresses https://github.com/prettier/prettier/pull/3255#discussion_r154545979

* resolveConfig: return null if both .prettierrc and .editorconfig are missing

Addresses https://github.com/prettier/prettier/pull/3255#discussion_r154574613

* Don't add now-failing tests

The way these tests work, both `tests_integration/cli/config/.prettierrc`
and `.prettierrc` apply to `tests_integration/cli/config/editorconfig/file.shouldnotexist`,
so the test wouldn't work even on master. Here's a way to confirm that:

```js
const path = require('path')
const assert = require('assert')
const prettier = require('./')

const file = './tests_integration/cli/config/editorconfig/file.shouldnotexist'
console.log(prettier.resolveConfig.sync(file))
assert(prettier.resolveConfig.sync(file) === null)
```
master
Joseph Frazier 2017-12-04 17:28:27 -05:00 committed by Lucas Azzola
parent 1122701053
commit cecf0657a5
19 changed files with 365 additions and 19 deletions

View File

@ -49,6 +49,12 @@ prettier.resolveConfig(filePath).then(options => {
}); });
``` ```
If `options.editorconfig` is `true` and an [`.editorconfig` file](http://editorconfig.org/) is in your project, Prettier will parse it and convert its properties to the corresponding prettier configuration. This configuration will be overridden by `.prettierrc`, etc. Currently, the following EditorConfig properties are supported:
* `indent_style`
* `indent_size`/`tab_width`
* `max_line_length`
Use `prettier.resolveConfig.sync(filePath [, options])` if you'd like to use sync version. Use `prettier.resolveConfig.sync(filePath [, options])` if you'd like to use sync version.
## `prettier.clearConfigCache()` ## `prettier.clearConfigCache()`

View File

@ -94,6 +94,10 @@ If a config file is found will evaluate it and ignore other CLI options. If no c
This option adds support to editor integrations where users define their default configuration but want to respect project specific configuration. This option adds support to editor integrations where users define their default configuration but want to respect project specific configuration.
## `--no-editorconfig`
Don't take .editorconfig into account when parsing configuration. See the [`prettier.resolveConfig` docs](./api.md) for details.
## `--with-node-modules` ## `--with-node-modules`
Prettier CLI will ignore files located in `node_modules` directory. To opt-out from this behavior use `--with-node-modules` flag. Prettier CLI will ignore files located in `node_modules` directory. To opt-out from this behavior use `--with-node-modules` flag.

View File

@ -22,6 +22,8 @@
"cosmiconfig": "3.1.0", "cosmiconfig": "3.1.0",
"dashify": "0.2.2", "dashify": "0.2.2",
"diff": "3.2.0", "diff": "3.2.0",
"editorconfig": "0.14.2",
"editorconfig-to-prettier": "0.0.4",
"emoji-regex": "6.5.1", "emoji-regex": "6.5.1",
"escape-string-regexp": "1.0.5", "escape-string-regexp": "1.0.5",
"esutils": "2.0.2", "esutils": "2.0.2",
@ -37,6 +39,7 @@
"minimatch": "3.0.4", "minimatch": "3.0.4",
"minimist": "1.2.0", "minimist": "1.2.0",
"parse5": "3.0.3", "parse5": "3.0.3",
"path-root": "0.1.1",
"postcss-less": "1.1.3", "postcss-less": "1.1.3",
"postcss-media-query-parser": "0.2.3", "postcss-media-query-parser": "0.2.3",
"postcss-scss": "1.0.2", "postcss-scss": "1.0.2",

View File

@ -158,6 +158,14 @@ const detailedOptions = normalizeDetailedOptions({
"debug-print-doc": { "debug-print-doc": {
type: "boolean" type: "boolean"
}, },
editorconfig: {
type: "boolean",
category: CATEGORY_CONFIG,
description: "Take .editorconfig into account when parsing configuration.",
oppositeDescription:
"Don't take .editorconfig into account when parsing configuration.",
default: true
},
"find-config-path": { "find-config-path": {
type: "path", type: "path",
category: CATEGORY_CONFIG, category: CATEGORY_CONFIG,

View File

@ -159,6 +159,7 @@ function getOptionsOrDie(argv, filePath) {
: `resolve config from '${filePath}'` : `resolve config from '${filePath}'`
); );
const options = resolver.resolveConfig.sync(filePath, { const options = resolver.resolveConfig.sync(filePath, {
editorconfig: argv.editorconfig,
config: argv["config"] config: argv["config"]
}); });

View File

@ -0,0 +1,47 @@
"use strict";
const editorconfig = require("editorconfig");
const mem = require("mem");
const pathRoot = require("path-root");
const editorConfigToPrettier = require("editorconfig-to-prettier");
const maybeParse = (filePath, config, parse) => {
const root = filePath && pathRoot(filePath);
return filePath && !config && parse(filePath, { root });
};
const editorconfigAsyncNoCache = (filePath, config) => {
return Promise.resolve(maybeParse(filePath, config, editorconfig.parse)).then(
editorConfigToPrettier
);
};
const editorconfigAsyncWithCache = mem(editorconfigAsyncNoCache);
const editorconfigSyncNoCache = (filePath, config) => {
return editorConfigToPrettier(
maybeParse(filePath, config, editorconfig.parseSync)
);
};
const editorconfigSyncWithCache = mem(editorconfigSyncNoCache);
function getLoadFunction(opts) {
if (!opts.editorconfig) {
return () => null;
}
if (opts.sync) {
return opts.cache ? editorconfigSyncWithCache : editorconfigSyncNoCache;
}
return opts.cache ? editorconfigAsyncWithCache : editorconfigAsyncNoCache;
}
function clearCache() {
mem.clear(editorconfigSyncWithCache);
mem.clear(editorconfigAsyncWithCache);
}
module.exports = {
getLoadFunction,
clearCache
};

View File

@ -5,6 +5,8 @@ const minimatch = require("minimatch");
const path = require("path"); const path = require("path");
const mem = require("mem"); const mem = require("mem");
const resolveEditorConfig = require("./resolve-config-editorconfig");
const getExplorerMemoized = mem(opts => const getExplorerMemoized = mem(opts =>
thirdParty.cosmiconfig("prettier", { thirdParty.cosmiconfig("prettier", {
sync: opts.sync, sync: opts.sync,
@ -26,23 +28,47 @@ function getLoadFunction(opts) {
return getExplorerMemoized(opts).load; return getExplorerMemoized(opts).load;
} }
function resolveConfig(filePath, opts) { function _resolveConfig(filePath, opts, sync) {
opts = Object.assign({ useCache: true }, opts); opts = Object.assign({ useCache: true }, opts);
const load = getLoadFunction({ cache: !!opts.useCache, sync: false }); const loadOpts = {
return load(filePath, opts.config).then(result => { cache: !!opts.useCache,
return !result ? null : mergeOverrides(result, filePath); sync: !!sync,
}); editorconfig: !!opts.editorconfig
};
const load = getLoadFunction(loadOpts);
const loadEditorConfig = resolveEditorConfig.getLoadFunction(loadOpts);
const arr = [load, loadEditorConfig].map(l => l(filePath, opts.config));
const unwrapAndMerge = arr => {
const result = arr[0];
const editorConfigured = arr[1];
const merged = Object.assign(
{},
editorConfigured,
mergeOverrides(Object.assign({}, result), filePath)
);
if (!result && !editorConfigured) {
return null;
}
return merged;
};
if (loadOpts.sync) {
return unwrapAndMerge(arr);
}
return Promise.all(arr).then(unwrapAndMerge);
} }
resolveConfig.sync = (filePath, opts) => { const resolveConfig = (filePath, opts) => _resolveConfig(filePath, opts, false);
opts = Object.assign({ useCache: true }, opts);
const load = getLoadFunction({ cache: !!opts.useCache, sync: true }); resolveConfig.sync = (filePath, opts) => _resolveConfig(filePath, opts, true);
const result = load(filePath, opts.config);
return !result ? null : mergeOverrides(result, filePath);
};
function clearCache() { function clearCache() {
mem.clear(getExplorerMemoized); mem.clear(getExplorerMemoized);
resolveEditorConfig.clearCache();
} }
function resolveConfigFile(filePath) { function resolveConfigFile(filePath) {

View File

@ -3,7 +3,22 @@
exports[`CLI overrides take precedence (stderr) 1`] = `""`; exports[`CLI overrides take precedence (stderr) 1`] = `""`;
exports[`CLI overrides take precedence (stdout) 1`] = ` exports[`CLI overrides take precedence (stdout) 1`] = `
"console.log( "function f() {
console.log(
\\"should have tab width 8\\"
)
}
function f() {
console.log(
\\"should have space width 2\\"
)
}
function f() {
console.log(
\\"should have space width 8\\"
)
}
console.log(
\\"jest/__best-tests__/file.js should have semi\\" \\"jest/__best-tests__/file.js should have semi\\"
); );
console.log( console.log(
@ -84,7 +99,16 @@ exports[`resolves configuration file with --find-config-path file (write) 1`] =
exports[`resolves configuration from external files (stderr) 1`] = `""`; exports[`resolves configuration from external files (stderr) 1`] = `""`;
exports[`resolves configuration from external files (stdout) 1`] = ` exports[`resolves configuration from external files (stdout) 1`] = `
"console.log(\\"jest/__best-tests__/file.js should have semi\\"); "function f() {
console.log(\\"should have tab width 8\\")
}
function f() {
console.log(\\"should have space width 2\\")
}
function f() {
console.log(\\"should have space width 8\\")
}
console.log(\\"jest/__best-tests__/file.js should have semi\\");
console.log(\\"jest/Component.js should not have semi\\") console.log(\\"jest/Component.js should not have semi\\")
console.log(\\"jest/Component.test.js should have semi\\"); console.log(\\"jest/Component.test.js should have semi\\");
function js() { function js() {

View File

@ -89,6 +89,19 @@ Default: -1
exports[`show detailed usage with --help cursor-offset (write) 1`] = `Array []`; exports[`show detailed usage with --help cursor-offset (write) 1`] = `Array []`;
exports[`show detailed usage with --help editorconfig (stderr) 1`] = `""`;
exports[`show detailed usage with --help editorconfig (stdout) 1`] = `
"--editorconfig
Take .editorconfig into account when parsing configuration.
Default: true
"
`;
exports[`show detailed usage with --help editorconfig (write) 1`] = `Array []`;
exports[`show detailed usage with --help find-config-path (stderr) 1`] = `""`; exports[`show detailed usage with --help find-config-path (stderr) 1`] = `""`;
exports[`show detailed usage with --help find-config-path (stdout) 1`] = ` exports[`show detailed usage with --help find-config-path (stdout) 1`] = `
@ -226,6 +239,17 @@ exports[`show detailed usage with --help no-config (stdout) 1`] = `
exports[`show detailed usage with --help no-config (write) 1`] = `Array []`; exports[`show detailed usage with --help no-config (write) 1`] = `Array []`;
exports[`show detailed usage with --help no-editorconfig (stderr) 1`] = `""`;
exports[`show detailed usage with --help no-editorconfig (stdout) 1`] = `
"--no-editorconfig
Don't take .editorconfig into account when parsing configuration.
"
`;
exports[`show detailed usage with --help no-editorconfig (write) 1`] = `Array []`;
exports[`show detailed usage with --help no-semi (stderr) 1`] = `""`; exports[`show detailed usage with --help no-semi (stderr) 1`] = `""`;
exports[`show detailed usage with --help no-semi (stdout) 1`] = ` exports[`show detailed usage with --help no-semi (stdout) 1`] = `
@ -522,6 +546,7 @@ Config options:
--config-precedence <cli-override|file-override|prefer-file> --config-precedence <cli-override|file-override|prefer-file>
Define in which order config files and CLI options should be evaluated. Define in which order config files and CLI options should be evaluated.
Defaults to cli-override. Defaults to cli-override.
--no-editorconfig Don't take .editorconfig into account when parsing configuration.
--find-config-path <path> --find-config-path <path>
Find and print the path to a configuration file for the given input file. Find and print the path to a configuration file for the given input file.
--ignore-path <path> Path to a file with patterns describing files to ignore. --ignore-path <path> Path to a file with patterns describing files to ignore.
@ -660,6 +685,7 @@ Config options:
--config-precedence <cli-override|file-override|prefer-file> --config-precedence <cli-override|file-override|prefer-file>
Define in which order config files and CLI options should be evaluated. Define in which order config files and CLI options should be evaluated.
Defaults to cli-override. Defaults to cli-override.
--no-editorconfig Don't take .editorconfig into account when parsing configuration.
--find-config-path <path> --find-config-path <path>
Find and print the path to a configuration file for the given input file. Find and print the path to a configuration file for the given input file.
--ignore-path <path> Path to a file with patterns describing files to ignore. --ignore-path <path> Path to a file with patterns describing files to ignore.

View File

@ -80,7 +80,22 @@ exports[`CLI overrides take lower precedence with --config-precedence file-overr
exports[`CLI overrides take precedence with --config-precedence cli-override (stderr) 1`] = `""`; exports[`CLI overrides take precedence with --config-precedence cli-override (stderr) 1`] = `""`;
exports[`CLI overrides take precedence with --config-precedence cli-override (stdout) 1`] = ` exports[`CLI overrides take precedence with --config-precedence cli-override (stdout) 1`] = `
"console.log( "function f() {
console.log(
\\"should have tab width 8\\"
)
}
function f() {
console.log(
\\"should have space width 2\\"
)
}
function f() {
console.log(
\\"should have space width 8\\"
)
}
console.log(
\\"jest/__best-tests__/file.js should have semi\\" \\"jest/__best-tests__/file.js should have semi\\"
); );
console.log( console.log(
@ -137,7 +152,22 @@ exports[`CLI overrides take precedence with --config-precedence cli-override (wr
exports[`CLI overrides take precedence without --config-precedence (stderr) 1`] = `""`; exports[`CLI overrides take precedence without --config-precedence (stderr) 1`] = `""`;
exports[`CLI overrides take precedence without --config-precedence (stdout) 1`] = ` exports[`CLI overrides take precedence without --config-precedence (stdout) 1`] = `
"console.log( "function f() {
console.log(
\\"should have tab width 8\\"
)
}
function f() {
console.log(
\\"should have space width 2\\"
)
}
function f() {
console.log(
\\"should have space width 8\\"
)
}
console.log(
\\"jest/__best-tests__/file.js should have semi\\" \\"jest/__best-tests__/file.js should have semi\\"
); );
console.log( console.log(

View File

@ -102,6 +102,103 @@ test("API resolveConfig.sync with file arg and extension override", () => {
}); });
}); });
test("API resolveConfig with file arg and .editorconfig", () => {
const file = path.resolve(
path.join(__dirname, "../cli/config/editorconfig/file.js")
);
return prettier.resolveConfig(file, { editorconfig: true }).then(result => {
expect(result).toMatchObject({
useTabs: true,
tabWidth: 8,
printWidth: 100
});
});
});
test("API resolveConfig.sync with file arg and .editorconfig", () => {
const file = path.resolve(
path.join(__dirname, "../cli/config/editorconfig/file.js")
);
expect(prettier.resolveConfig.sync(file)).toMatchObject({
semi: false
});
expect(
prettier.resolveConfig.sync(file, { editorconfig: true })
).toMatchObject({
useTabs: true,
tabWidth: 8,
printWidth: 100
});
});
test("API resolveConfig with nested file arg and .editorconfig", () => {
const file = path.resolve(
path.join(__dirname, "../cli/config/editorconfig/lib/file.js")
);
return prettier.resolveConfig(file, { editorconfig: true }).then(result => {
expect(result).toMatchObject({
useTabs: false,
tabWidth: 2,
printWidth: 100
});
});
});
test("API resolveConfig.sync with nested file arg and .editorconfig", () => {
const file = path.resolve(
path.join(__dirname, "../cli/config/editorconfig/lib/file.js")
);
expect(prettier.resolveConfig.sync(file)).toMatchObject({
semi: false
});
expect(
prettier.resolveConfig.sync(file, { editorconfig: true })
).toMatchObject({
useTabs: false,
tabWidth: 2,
printWidth: 100
});
});
test("API resolveConfig with nested file arg and .editorconfig and indent_size = tab", () => {
const file = path.resolve(
path.join(__dirname, "../cli/config/editorconfig/lib/indent_size=tab.js")
);
return prettier.resolveConfig(file, { editorconfig: true }).then(result => {
expect(result).toMatchObject({
useTabs: false,
tabWidth: 8,
printWidth: 100
});
});
});
test("API resolveConfig.sync with nested file arg and .editorconfig and indent_size = tab", () => {
const file = path.resolve(
path.join(__dirname, "../cli/config/editorconfig/lib/indent_size=tab.js")
);
expect(prettier.resolveConfig.sync(file)).toMatchObject({
semi: false
});
expect(
prettier.resolveConfig.sync(file, { editorconfig: true })
).toMatchObject({
useTabs: false,
tabWidth: 8,
printWidth: 100
});
});
test("API clearConfigCache", () => {
expect(() => prettier.clearConfigCache()).not.toThrowError();
});
test("API resolveConfig.sync overrides work with absolute paths", () => { test("API resolveConfig.sync overrides work with absolute paths", () => {
// Absolute path // Absolute path
const file = path.join(__dirname, "../cli/config/filepath/subfolder/file.js"); const file = path.join(__dirname, "../cli/config/filepath/subfolder/file.js");

View File

@ -1,6 +1,7 @@
semi: false
overrides: overrides:
- files: "*.js"
options:
semi: false
- files: "*.ts" - files: "*.ts"
options: options:
semi: true semi: true

View File

@ -0,0 +1,15 @@
root = true
[*.js]
indent_style = tab
tab_width = 8
indent_size = 2 # overridden by tab_width since indent_style = tab
max_line_length = 100
# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2
[lib/indent_size=tab.js]
indent_size = tab

View File

@ -0,0 +1,3 @@
function f() {
console.log("should have tab width 8");
}

View File

@ -0,0 +1,3 @@
function f() {
console.log("should have space width 2");
}

View File

@ -0,0 +1,3 @@
function f() {
console.log("should have space width 8");
}

View File

@ -0,0 +1,4 @@
# This file should be overridden by prettier.config.js
[*]
tab_width = 1

View File

@ -0,0 +1,7 @@
# This file should be overridden by package.json
[*]
tab_width = 1
[*.ts]
tab_width = 1

View File

@ -827,6 +827,10 @@ block-stream@*:
dependencies: dependencies:
inherits "~2.0.0" inherits "~2.0.0"
bluebird@^3.0.5:
version "3.5.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
version "4.11.6" version "4.11.6"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
@ -1391,6 +1395,20 @@ ecc-jsbn@~0.1.1:
dependencies: dependencies:
jsbn "~0.1.0" jsbn "~0.1.0"
editorconfig-to-prettier@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/editorconfig-to-prettier/-/editorconfig-to-prettier-0.0.4.tgz#762f569ea26d890ebbe83f2bae231d28c489a66a"
editorconfig@0.14.2:
version "0.14.2"
resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.14.2.tgz#60fe3336878f38d6e19e0b16cf1f41903f57e6f4"
dependencies:
bluebird "^3.0.5"
commander "^2.9.0"
lru-cache "^3.2.0"
semver "^5.1.0"
sigmund "^1.0.1"
elliptic@^6.0.0: elliptic@^6.0.0:
version "6.4.0" version "6.4.0"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
@ -2878,6 +2896,12 @@ loud-rejection@^1.0.0:
currently-unhandled "^0.4.1" currently-unhandled "^0.4.1"
signal-exit "^3.0.0" signal-exit "^3.0.0"
lru-cache@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
dependencies:
pseudomap "^1.0.1"
lru-cache@^4.0.1: lru-cache@^4.0.1:
version "4.1.1" version "4.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
@ -3331,6 +3355,16 @@ path-parse@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
path-root-regex@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
path-root@0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
dependencies:
path-root-regex "^0.1.0"
path-to-regexp@^1.0.1: path-to-regexp@^1.0.1:
version "1.7.0" version "1.7.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
@ -3510,7 +3544,7 @@ prr@~0.0.0:
version "0.0.0" version "0.0.0"
resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
pseudomap@^1.0.2: pseudomap@^1.0.1, pseudomap@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@ -3958,7 +3992,7 @@ sax@^1.2.1:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.3.0: "semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.1.0, semver@^5.3.0:
version "5.4.1" version "5.4.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
@ -4006,6 +4040,10 @@ shellwords@^0.1.0:
version "0.1.0" version "0.1.0"
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14"
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
signal-exit@^3.0.0, signal-exit@^3.0.2: signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"