From cecf0657a521fa265b713274ed67ca39be4142cf Mon Sep 17 00:00:00 2001 From: Joseph Frazier <1212jtraceur@gmail.com> Date: Mon, 4 Dec 2017 17:28:27 -0500 Subject: [PATCH] Re-add EditorConfig support (undo #3213) (#3255) * Revert "Revert "Respect EditorConfig settings" (#3213)" This reverts commit d2241fc0d52d807701d9a5ac580bc01010e7a93b. * 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 https://github.com/josephfrazier/editorconfig-to-prettier/commit/c38b84c42a2e022067c104c494298a8c9533e7a7 * 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) ``` --- docs/api.md | 6 ++ docs/cli.md | 4 + package.json | 3 + src/cli-constant.js | 8 ++ src/cli-util.js | 1 + src/resolve-config-editorconfig.js | 47 +++++++++ src/resolve-config.js | 48 ++++++--- .../__snapshots__/config-resolution.js.snap | 28 +++++- .../__snapshots__/early-exit.js.snap | 26 +++++ .../with-config-precedence.js.snap | 34 ++++++- .../__tests__/config-resolution.js | 97 +++++++++++++++++++ tests_integration/cli/config/.prettierrc | 5 +- .../cli/config/editorconfig/.editorconfig | 15 +++ .../cli/config/editorconfig/file.js | 3 + .../cli/config/editorconfig/lib/file.js | 3 + .../editorconfig/lib/indent_size=tab.js | 3 + tests_integration/cli/config/js/.editorconfig | 4 + .../cli/config/package/.editorconfig | 7 ++ yarn.lock | 42 +++++++- 19 files changed, 365 insertions(+), 19 deletions(-) create mode 100644 src/resolve-config-editorconfig.js create mode 100644 tests_integration/cli/config/editorconfig/.editorconfig create mode 100644 tests_integration/cli/config/editorconfig/file.js create mode 100644 tests_integration/cli/config/editorconfig/lib/file.js create mode 100644 tests_integration/cli/config/editorconfig/lib/indent_size=tab.js create mode 100644 tests_integration/cli/config/js/.editorconfig create mode 100644 tests_integration/cli/config/package/.editorconfig diff --git a/docs/api.md b/docs/api.md index 38bd252f..c25763e1 100644 --- a/docs/api.md +++ b/docs/api.md @@ -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. ## `prettier.clearConfigCache()` diff --git a/docs/cli.md b/docs/cli.md index ed184ba3..59fa7215 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -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. +## `--no-editorconfig` + +Don't take .editorconfig into account when parsing configuration. See the [`prettier.resolveConfig` docs](./api.md) for details. + ## `--with-node-modules` Prettier CLI will ignore files located in `node_modules` directory. To opt-out from this behavior use `--with-node-modules` flag. diff --git a/package.json b/package.json index c899ab98..68a64c23 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,8 @@ "cosmiconfig": "3.1.0", "dashify": "0.2.2", "diff": "3.2.0", + "editorconfig": "0.14.2", + "editorconfig-to-prettier": "0.0.4", "emoji-regex": "6.5.1", "escape-string-regexp": "1.0.5", "esutils": "2.0.2", @@ -37,6 +39,7 @@ "minimatch": "3.0.4", "minimist": "1.2.0", "parse5": "3.0.3", + "path-root": "0.1.1", "postcss-less": "1.1.3", "postcss-media-query-parser": "0.2.3", "postcss-scss": "1.0.2", diff --git a/src/cli-constant.js b/src/cli-constant.js index 829d1dd0..fb1bd52b 100644 --- a/src/cli-constant.js +++ b/src/cli-constant.js @@ -158,6 +158,14 @@ const detailedOptions = normalizeDetailedOptions({ "debug-print-doc": { 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": { type: "path", category: CATEGORY_CONFIG, diff --git a/src/cli-util.js b/src/cli-util.js index 8a79e108..d363a640 100644 --- a/src/cli-util.js +++ b/src/cli-util.js @@ -159,6 +159,7 @@ function getOptionsOrDie(argv, filePath) { : `resolve config from '${filePath}'` ); const options = resolver.resolveConfig.sync(filePath, { + editorconfig: argv.editorconfig, config: argv["config"] }); diff --git a/src/resolve-config-editorconfig.js b/src/resolve-config-editorconfig.js new file mode 100644 index 00000000..26f28aeb --- /dev/null +++ b/src/resolve-config-editorconfig.js @@ -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 +}; diff --git a/src/resolve-config.js b/src/resolve-config.js index f3ee01fa..56270016 100644 --- a/src/resolve-config.js +++ b/src/resolve-config.js @@ -5,6 +5,8 @@ const minimatch = require("minimatch"); const path = require("path"); const mem = require("mem"); +const resolveEditorConfig = require("./resolve-config-editorconfig"); + const getExplorerMemoized = mem(opts => thirdParty.cosmiconfig("prettier", { sync: opts.sync, @@ -26,23 +28,47 @@ function getLoadFunction(opts) { return getExplorerMemoized(opts).load; } -function resolveConfig(filePath, opts) { +function _resolveConfig(filePath, opts, sync) { opts = Object.assign({ useCache: true }, opts); - const load = getLoadFunction({ cache: !!opts.useCache, sync: false }); - return load(filePath, opts.config).then(result => { - return !result ? null : mergeOverrides(result, filePath); - }); + const loadOpts = { + cache: !!opts.useCache, + 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) => { - opts = Object.assign({ useCache: true }, opts); - const load = getLoadFunction({ cache: !!opts.useCache, sync: true }); - const result = load(filePath, opts.config); - return !result ? null : mergeOverrides(result, filePath); -}; +const resolveConfig = (filePath, opts) => _resolveConfig(filePath, opts, false); + +resolveConfig.sync = (filePath, opts) => _resolveConfig(filePath, opts, true); function clearCache() { mem.clear(getExplorerMemoized); + resolveEditorConfig.clearCache(); } function resolveConfigFile(filePath) { diff --git a/tests_integration/__tests__/__snapshots__/config-resolution.js.snap b/tests_integration/__tests__/__snapshots__/config-resolution.js.snap index e4ff66ca..7f05743b 100644 --- a/tests_integration/__tests__/__snapshots__/config-resolution.js.snap +++ b/tests_integration/__tests__/__snapshots__/config-resolution.js.snap @@ -3,7 +3,22 @@ exports[`CLI overrides take precedence (stderr) 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\\" ); 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 (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.test.js should have semi\\"); function js() { diff --git a/tests_integration/__tests__/__snapshots__/early-exit.js.snap b/tests_integration/__tests__/__snapshots__/early-exit.js.snap index bfde0835..5eef52cd 100644 --- a/tests_integration/__tests__/__snapshots__/early-exit.js.snap +++ b/tests_integration/__tests__/__snapshots__/early-exit.js.snap @@ -89,6 +89,19 @@ Default: -1 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 (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-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 (stdout) 1`] = ` @@ -522,6 +546,7 @@ Config options: --config-precedence Define in which order config files and CLI options should be evaluated. Defaults to cli-override. + --no-editorconfig Don't take .editorconfig into account when parsing configuration. --find-config-path Find and print the path to a configuration file for the given input file. --ignore-path Path to a file with patterns describing files to ignore. @@ -660,6 +685,7 @@ Config options: --config-precedence Define in which order config files and CLI options should be evaluated. Defaults to cli-override. + --no-editorconfig Don't take .editorconfig into account when parsing configuration. --find-config-path Find and print the path to a configuration file for the given input file. --ignore-path Path to a file with patterns describing files to ignore. diff --git a/tests_integration/__tests__/__snapshots__/with-config-precedence.js.snap b/tests_integration/__tests__/__snapshots__/with-config-precedence.js.snap index 03eb6f6c..907521e3 100644 --- a/tests_integration/__tests__/__snapshots__/with-config-precedence.js.snap +++ b/tests_integration/__tests__/__snapshots__/with-config-precedence.js.snap @@ -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 (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\\" ); 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 (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\\" ); console.log( diff --git a/tests_integration/__tests__/config-resolution.js b/tests_integration/__tests__/config-resolution.js index 390e022c..d07ef148 100644 --- a/tests_integration/__tests__/config-resolution.js +++ b/tests_integration/__tests__/config-resolution.js @@ -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", () => { // Absolute path const file = path.join(__dirname, "../cli/config/filepath/subfolder/file.js"); diff --git a/tests_integration/cli/config/.prettierrc b/tests_integration/cli/config/.prettierrc index 177d6bda..8f522b78 100644 --- a/tests_integration/cli/config/.prettierrc +++ b/tests_integration/cli/config/.prettierrc @@ -1,6 +1,7 @@ -semi: false - overrides: +- files: "*.js" + options: + semi: false - files: "*.ts" options: semi: true diff --git a/tests_integration/cli/config/editorconfig/.editorconfig b/tests_integration/cli/config/editorconfig/.editorconfig new file mode 100644 index 00000000..42984e9d --- /dev/null +++ b/tests_integration/cli/config/editorconfig/.editorconfig @@ -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 diff --git a/tests_integration/cli/config/editorconfig/file.js b/tests_integration/cli/config/editorconfig/file.js new file mode 100644 index 00000000..2e2b4c35 --- /dev/null +++ b/tests_integration/cli/config/editorconfig/file.js @@ -0,0 +1,3 @@ +function f() { + console.log("should have tab width 8"); +} diff --git a/tests_integration/cli/config/editorconfig/lib/file.js b/tests_integration/cli/config/editorconfig/lib/file.js new file mode 100644 index 00000000..b9050554 --- /dev/null +++ b/tests_integration/cli/config/editorconfig/lib/file.js @@ -0,0 +1,3 @@ +function f() { + console.log("should have space width 2"); +} diff --git a/tests_integration/cli/config/editorconfig/lib/indent_size=tab.js b/tests_integration/cli/config/editorconfig/lib/indent_size=tab.js new file mode 100644 index 00000000..1b4f9e78 --- /dev/null +++ b/tests_integration/cli/config/editorconfig/lib/indent_size=tab.js @@ -0,0 +1,3 @@ +function f() { + console.log("should have space width 8"); +} diff --git a/tests_integration/cli/config/js/.editorconfig b/tests_integration/cli/config/js/.editorconfig new file mode 100644 index 00000000..7a2bce1a --- /dev/null +++ b/tests_integration/cli/config/js/.editorconfig @@ -0,0 +1,4 @@ +# This file should be overridden by prettier.config.js + +[*] +tab_width = 1 diff --git a/tests_integration/cli/config/package/.editorconfig b/tests_integration/cli/config/package/.editorconfig new file mode 100644 index 00000000..e22303d2 --- /dev/null +++ b/tests_integration/cli/config/package/.editorconfig @@ -0,0 +1,7 @@ +# This file should be overridden by package.json + +[*] +tab_width = 1 + +[*.ts] +tab_width = 1 diff --git a/yarn.lock b/yarn.lock index bb30c64c..944cc915 100644 --- a/yarn.lock +++ b/yarn.lock @@ -827,6 +827,10 @@ block-stream@*: dependencies: 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: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" @@ -1391,6 +1395,20 @@ ecc-jsbn@~0.1.1: dependencies: 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: version "6.4.0" 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" 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: version "4.1.1" 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" 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: version "1.7.0" 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" 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" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -3958,7 +3992,7 @@ sax@^1.2.1: version "1.2.2" 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" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -4006,6 +4040,10 @@ shellwords@^0.1.0: version "0.1.0" 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: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"