Merge tag 'v4.35.0' into next

4.35.0
This commit is contained in:
Tobias Koppers 2019-06-21 09:15:49 +02:00
commit ec88b7eddc
13 changed files with 438 additions and 96 deletions

View File

@ -33,6 +33,18 @@ class MultiWatching {
}
}
suspend() {
for (const watching of this.watchings) {
watching.suspend();
}
}
resume() {
for (const watching of this.watchings) {
watching.resume();
}
}
/**
* @param {Callback<void>} callback signals when the watcher is closed
* @returns {void}

View File

@ -5,8 +5,14 @@
"use strict";
const getProperty = (obj, name) => {
name = name.split(".");
/**
* Gets the value at path of object
* @param {object} obj - object to query
* @param {string} path - query path
* @returns {any} - if {@param path} requests element from array, then `undefined` will be returned
*/
const getProperty = (obj, path) => {
let name = path.split(".");
for (let i = 0; i < name.length - 1; i++) {
obj = obj[name[i]];
if (typeof obj !== "object" || !obj || Array.isArray(obj)) return;
@ -14,8 +20,15 @@ const getProperty = (obj, name) => {
return obj[name.pop()];
};
const setProperty = (obj, name, value) => {
name = name.split(".");
/**
* Sets the value at path of object. Stops execution, if {@param path} requests element from array to be set
* @param {object} obj - object to query
* @param {string} path - query path
* @param {any} value - value to be set
* @returns {void}
*/
const setProperty = (obj, path, value) => {
let name = path.split(".");
for (let i = 0; i < name.length - 1; i++) {
if (typeof obj[name[i]] !== "object" && obj[name[i]] !== undefined) return;
if (Array.isArray(obj[name[i]])) return;
@ -25,21 +38,53 @@ const setProperty = (obj, name, value) => {
obj[name.pop()] = value;
};
/**
* @typedef {'call' | 'make' | 'append'} ConfigType
*/
/**
* @typedef {(options: object) => any} MakeConfigHandler
*/
/**
* @typedef {(value: any, options: object) => any} CallConfigHandler
*/
/**
* @typedef {any[]} AppendConfigValues
*/
class OptionsDefaulter {
constructor() {
/**
* Stores default options settings or functions for computing them
*/
this.defaults = {};
/**
* Stores configuration for options
* @type {{[key: string]: ConfigType}}
*/
this.config = {};
}
/**
* Enhancing {@param options} with default values
* @param {object} options - provided options
* @returns {object} - enhanced options
* @throws {Error} - will throw error, if configuration value is other then `undefined` or {@link ConfigType}
*/
process(options) {
options = Object.assign({}, options);
for (let name in this.defaults) {
switch (this.config[name]) {
/**
* If {@link ConfigType} doesn't specified and current value is `undefined`, then default value will be assigned
*/
case undefined:
if (getProperty(options, name) === undefined) {
setProperty(options, name, this.defaults[name]);
}
break;
/**
* Assign result of {@link CallConfigHandler}
*/
case "call":
setProperty(
options,
@ -47,11 +92,17 @@ class OptionsDefaulter {
this.defaults[name].call(this, getProperty(options, name), options)
);
break;
/**
* Assign result of {@link MakeConfigHandler}, if current value is `undefined`
*/
case "make":
if (getProperty(options, name) === undefined) {
setProperty(options, name, this.defaults[name].call(this, options));
}
break;
/**
* Adding {@link AppendConfigValues} at the end of the current array
*/
case "append": {
let oldValue = getProperty(options, name);
if (!Array.isArray(oldValue)) {
@ -70,6 +121,13 @@ class OptionsDefaulter {
return options;
}
/**
* Builds up default values
* @param {string} name - option path
* @param {ConfigType | any} config - if {@param def} is provided, then only {@link ConfigType} is allowed
* @param {MakeConfigHandler | CallConfigHandler | AppendConfigValues} [def] - defaults
* @returns {void}
*/
set(name, config, def) {
if (def !== undefined) {
this.defaults[name] = def;

View File

@ -22,7 +22,8 @@ const createDefaultHandler = profile => {
const defaultHandler = (percentage, msg, ...args) => {
let state = msg;
const details = args;
const details = args.filter(v => v.length);
const maxLineLength = process.stderr.columns || Infinity;
if (percentage < 1) {
percentage = Math.floor(percentage * 100);
msg = `${percentage}% ${msg}`;
@ -32,12 +33,28 @@ const createDefaultHandler = profile => {
if (percentage < 10) {
msg = ` ${msg}`;
}
for (let detail of details) {
if (!detail) continue;
if (detail.length > 40) {
detail = `...${detail.substr(detail.length - 39)}`;
if (details.length) {
const maxTotalDetailsLength = maxLineLength - msg.length;
const totalDetailsLength = details.reduce(
(a, b) => a + b.length,
details.length // account for added space before each detail text
);
const maxDetailLength =
totalDetailsLength < maxTotalDetailsLength
? Infinity
: Math.floor(maxTotalDetailsLength / details.length);
for (let detail of details) {
if (!detail) continue;
if (detail.length + 1 > maxDetailLength) {
const truncatePrefix = "...";
detail = `${truncatePrefix}${detail.substr(
-(maxDetailLength - truncatePrefix.length - 1)
)}`;
}
msg += ` ${detail}`;
}
msg += ` ${detail}`;
}
}
if (profile) {
@ -59,6 +76,7 @@ const createDefaultHandler = profile => {
}
if (lastMessage !== msg) {
goToLineStart(msg);
msg = msg.substring(0, maxLineLength);
process.stderr.write(msg);
lastMessage = msg;
}

View File

@ -32,6 +32,7 @@ class Watching {
/** @type {Callback<void>[]} */
this.callbacks = [];
this.closed = false;
this.suspended = false;
if (typeof watchOptions === "number") {
this.watchOptions = {
aggregateTimeout: watchOptions
@ -164,7 +165,9 @@ class Watching {
this.compiler.fileTimestamps = fileTimeInfoEntries;
this.compiler.contextTimestamps = contextTimeInfoEntries;
this.compiler.removedFiles = removedFiles;
this._invalidate();
if (!this.suspended) {
this._invalidate();
}
},
(fileName, changeTime) => {
this.compiler.hooks.invalid.call(fileName, changeTime);
@ -193,6 +196,7 @@ class Watching {
this.watcher.pause();
this.watcher = null;
}
if (this.running) {
this.invalid = true;
} else {
@ -200,6 +204,18 @@ class Watching {
}
}
suspend() {
this.suspended = true;
this.invalid = false;
}
resume() {
if (this.suspended) {
this.suspended = false;
this._invalidate();
}
}
/**
* @param {Callback<void>} callback signals when the watcher is closed
* @returns {void}

View File

@ -16,7 +16,9 @@ require("../schemas/ajv.absolutePath")(ajv);
const validateSchema = (schema, options) => {
if (Array.isArray(options)) {
const errors = options.map(options => validateObject(schema, options));
const errors = Array.from(options).map(options =>
validateObject(schema, options)
);
errors.forEach((list, idx) => {
const applyPrefix = err => {
err.dataPath = `[${idx}]${err.dataPath}`;

View File

@ -69,6 +69,7 @@
"rimraf": "^2.6.2",
"script-loader": "~0.7.0",
"simple-git": "^1.65.0",
"strip-ansi": "^5.2.0",
"style-loader": "^0.23.1",
"typescript": "^3.5.2",
"url-loader": "^1.1.2",

View File

@ -205,6 +205,11 @@ describe("ConfigTestCases", () => {
let runInNewContext = false;
const moduleScope = {
require: _require.bind(null, path.dirname(p), options),
importScripts: _require.bind(
null,
path.dirname(p),
options
),
module: m,
exports: m.exports,
__dirname: path.dirname(p),

View File

@ -6,6 +6,8 @@ const MultiWatching = require("../lib/MultiWatching");
const createWatching = () => {
return {
invalidate: jest.fn(),
suspend: jest.fn(),
resume: jest.fn(),
close: jest.fn()
};
};
@ -41,6 +43,20 @@ describe("MultiWatching", () => {
});
});
describe("suspend", () => {
it("suspends each watching", () => {
myMultiWatching.suspend();
expect(watchings[0].suspend.mock.calls.length).toBe(1);
expect(watchings[1].suspend.mock.calls.length).toBe(1);
});
it("resume each watching", () => {
myMultiWatching.resume();
expect(watchings[0].resume.mock.calls.length).toBe(1);
expect(watchings[1].resume.mock.calls.length).toBe(1);
});
});
describe("close", () => {
let callback;
const callClosedFinishedCallback = watching => {

View File

@ -1,8 +1,61 @@
"use strict";
const _ = require("lodash");
const path = require("path");
const MemoryFs = require("memory-fs");
const webpack = require("..");
const captureStdio = require("./helpers/captureStdio");
describe("ProgressPlugin", function() {
let _env;
let stderr;
beforeEach(() => {
_env = process.env;
stderr = captureStdio(process.stderr);
});
afterEach(() => {
process.env = _env;
stderr && stderr.restore();
});
it("should not contain NaN as a percentage when it is applied to MultiCompiler", () => {
const compiler = createMultiCompiler();
return RunCompilerAsync(compiler).then(() => {
expect(stderr.toString()).toContain("%");
expect(stderr.toString()).not.toContain("NaN");
});
});
it("should not print lines longer than stderr.columns", () => {
const compiler = createSimpleCompiler();
process.stderr.columns = 40;
return RunCompilerAsync(compiler).then(() => {
const logs = getLogs(stderr.toString());
expect(logs.length).toBeGreaterThan(20);
logs.forEach(log => expect(log.length).toBeLessThanOrEqual(40));
expect(logs).toContain(
" 10% building ...tries ...dules 0 active",
"trims each detail string equally"
);
});
});
it("should handle when stderr.columns is undefined", () => {
const compiler = createSimpleCompiler();
process.stderr.columns = undefined;
return RunCompilerAsync(compiler).then(() => {
const logs = getLogs(stderr.toString());
expect(logs.length).toBeGreaterThan(20);
expect(_.maxBy(logs, "length").length).toBeGreaterThan(50);
});
});
});
const createMultiCompiler = () => {
const compiler = webpack([
@ -16,25 +69,34 @@ const createMultiCompiler = () => {
}
]);
compiler.outputFileSystem = new MemoryFs();
new webpack.ProgressPlugin().apply(compiler);
return compiler;
};
describe("ProgressPlugin", function() {
it("should not contain NaN as a percentage when it is applied to MultiCompiler", function(done) {
const compiler = createMultiCompiler();
const createSimpleCompiler = () => {
const compiler = webpack({
context: path.join(__dirname, "fixtures"),
entry: "./a.js"
});
let percentage = 0;
new webpack.ProgressPlugin((p, msg, ...args) => {
percentage += p;
}).apply(compiler);
compiler.outputFileSystem = new MemoryFs();
new webpack.ProgressPlugin().apply(compiler);
return compiler;
};
const getLogs = logsStr => logsStr.split(/\u0008+/).filter(v => !(v === " "));
const RunCompilerAsync = compiler =>
new Promise((resolve, reject) => {
compiler.run(err => {
if (err) {
throw err;
reject(err);
} else {
expect(percentage).not.toBe(NaN);
done();
resolve();
}
});
});
});

View File

@ -404,6 +404,25 @@ describe("Validation", () => {
- configuration.mode should be one of these:
\\"development\\" | \\"production\\" | \\"none\\"
-> Enable production optimizations or development hints."
`)
);
createTestCase(
"holey array",
// eslint-disable-next-line no-sparse-arrays
[
{
mode: "production"
},
,
{
mode: "development"
}
],
msg =>
expect(msg).toMatchInlineSnapshot(`
"Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
- configuration[1] should be an object."
`)
);
});

97
test/WatchSuspend.test.js Normal file
View File

@ -0,0 +1,97 @@
"use strict";
/*globals describe it */
const path = require("path");
const fs = require("fs");
const webpack = require("../");
describe("WatchSuspend", () => {
if (process.env.NO_WATCH_TESTS) {
it.skip("long running tests excluded", () => {});
return;
}
jest.setTimeout(5000);
describe("suspend and resume watcher", () => {
const fixturePath = path.join(
__dirname,
"fixtures",
"temp-watch-" + Date.now()
);
const filePath = path.join(fixturePath, "file.js");
const outputPath = path.join(fixturePath, "bundle.js");
let compiler = null;
let watching = null;
let onChange = null;
beforeAll(() => {
try {
fs.mkdirSync(fixturePath);
} catch (e) {
// skip
}
try {
fs.writeFileSync(filePath, "'foo'", "utf-8");
} catch (e) {
// skip
}
compiler = webpack({
mode: "development",
entry: filePath,
output: {
path: fixturePath,
filename: "bundle.js"
}
});
watching = compiler.watch({ aggregateTimeout: 50 }, () => {});
compiler.hooks.done.tap("WatchSuspendTest", () => {
if (onChange) onChange();
});
});
afterAll(() => {
watching.close();
compiler = null;
try {
fs.unlinkSync(filePath);
} catch (e) {
// skip
}
try {
fs.rmdirSync(fixturePath);
} catch (e) {
// skip
}
});
it("should compile successfully", done => {
onChange = () => {
expect(fs.readFileSync(outputPath, "utf-8")).toContain("'foo'");
onChange = null;
done();
};
});
it("should suspend compilation", done => {
onChange = jest.fn();
watching.suspend();
fs.writeFileSync(filePath, "'bar'", "utf-8");
setTimeout(() => {
expect(onChange.mock.calls.length).toBe(0);
onChange = null;
done();
}, 1000);
});
it("should resume compilation", done => {
onChange = () => {
expect(fs.readFileSync(outputPath, "utf-8")).toContain("'bar'");
onChange = null;
done();
};
watching.resume();
});
});
});

View File

@ -0,0 +1,31 @@
const stripAnsi = require("strip-ansi");
module.exports = stdio => {
let logs = [];
const write = stdio.write;
stdio.write = function(str) {
logs.push(str);
write.apply(this, arguments);
};
return {
data: logs,
reset: () => (logs = []),
toString: () => {
return logs.map(v => stripAnsi(v)).join("");
},
toStringRaw: () => {
return logs.join("");
},
restore() {
stdio.write = write;
}
};
};

151
yarn.lock
View File

@ -1284,7 +1284,7 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
constantinople@^3.0.1:
constantinople@^3.0.1, constantinople@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==
@ -3453,9 +3453,9 @@ levn@^0.3.0, levn@~0.3.0:
type-check "~0.3.2"
lint-staged@^8.0.4:
version "8.2.0"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.2.0.tgz#3d4149a229580815c955047a7acd8f09054be5a9"
integrity sha512-DxguyxGOIfb67wZ6EOrqzjAbw6ZH9XK3YS74HO+erJf6+SAQeJJPN//GBOG5xhdt2THeuXjVPaHcCYOWGZwRbA==
version "8.2.1"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.2.1.tgz#752fcf222d9d28f323a3b80f1e668f3654ff221f"
integrity sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A==
dependencies:
chalk "^2.3.1"
commander "^2.14.1"
@ -4408,71 +4408,71 @@ psl@^1.1.24, psl@^1.1.28:
resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==
pug-attrs@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15"
integrity sha1-owlflw5kFR972tlX7vVftdeQXRU=
pug-attrs@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336"
integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==
dependencies:
constantinople "^3.0.1"
js-stringify "^1.0.1"
pug-runtime "^2.0.4"
pug-runtime "^2.0.5"
pug-code-gen@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c"
integrity sha1-CVHsgyJddNjPxHan+Zolm199BQw=
pug-code-gen@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.2.tgz#ad0967162aea077dcf787838d94ed14acb0217c2"
integrity sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==
dependencies:
constantinople "^3.0.1"
constantinople "^3.1.2"
doctypes "^1.1.0"
js-stringify "^1.0.1"
pug-attrs "^2.0.3"
pug-error "^1.3.2"
pug-runtime "^2.0.4"
pug-attrs "^2.0.4"
pug-error "^1.3.3"
pug-runtime "^2.0.5"
void-elements "^2.0.1"
with "^5.0.0"
pug-error@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26"
integrity sha1-U659nSm7A89WRJOgJhCfVMR/XyY=
pug-error@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6"
integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==
pug-filters@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e"
integrity sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=
pug-filters@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7"
integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==
dependencies:
clean-css "^4.1.11"
constantinople "^3.0.1"
jstransformer "1.0.0"
pug-error "^1.3.2"
pug-walk "^1.1.7"
pug-error "^1.3.3"
pug-walk "^1.1.8"
resolve "^1.1.6"
uglify-js "^2.6.1"
pug-lexer@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278"
integrity sha1-IQwYRX7y4XYCQnQMXmR715TOwng=
pug-lexer@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd"
integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==
dependencies:
character-parser "^2.1.1"
is-expression "^3.0.0"
pug-error "^1.3.2"
pug-error "^1.3.3"
pug-linker@^3.0.5:
version "3.0.5"
resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f"
integrity sha1-npp65ABWgtAn3uuWsAD4juuDoC8=
pug-linker@^3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb"
integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==
dependencies:
pug-error "^1.3.2"
pug-walk "^1.1.7"
pug-error "^1.3.3"
pug-walk "^1.1.8"
pug-load@^2.0.11:
version "2.0.11"
resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527"
integrity sha1-5kjlftET/iwfRdV4WOorrWvAFSc=
pug-load@^2.0.12:
version "2.0.12"
resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b"
integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==
dependencies:
object-assign "^4.1.0"
pug-walk "^1.1.7"
pug-walk "^1.1.8"
pug-loader@^2.4.0:
version "2.4.0"
@ -4483,44 +4483,49 @@ pug-loader@^2.4.0:
pug-walk "^1.0.0"
resolve "^1.1.7"
pug-parser@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4"
integrity sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=
pug-parser@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9"
integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==
dependencies:
pug-error "^1.3.2"
pug-error "^1.3.3"
token-stream "0.0.1"
pug-runtime@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58"
integrity sha1-4XjhvaaKsujArPybztLFT9iM61g=
pug-runtime@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a"
integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==
pug-strip-comments@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f"
integrity sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=
pug-strip-comments@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8"
integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==
dependencies:
pug-error "^1.3.2"
pug-error "^1.3.3"
pug-walk@^1.0.0, pug-walk@^1.1.7:
pug-walk@^1.0.0:
version "1.1.7"
resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3"
integrity sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=
pug-walk@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a"
integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==
pug@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e"
integrity sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=
version "2.0.4"
resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d"
integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==
dependencies:
pug-code-gen "^2.0.1"
pug-filters "^3.1.0"
pug-lexer "^4.0.0"
pug-linker "^3.0.5"
pug-load "^2.0.11"
pug-parser "^5.0.0"
pug-runtime "^2.0.4"
pug-strip-comments "^1.0.3"
pug-code-gen "^2.0.2"
pug-filters "^3.1.1"
pug-lexer "^4.1.0"
pug-linker "^3.0.6"
pug-load "^2.0.12"
pug-parser "^5.0.1"
pug-runtime "^2.0.5"
pug-strip-comments "^1.0.4"
pump@^2.0.0:
version "2.0.1"
@ -4972,9 +4977,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
simple-git@^1.65.0, simple-git@^1.85.0:
version "1.113.0"
resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.113.0.tgz#668989728a1e9cf4ec6c72b69ea2eecc93489bea"
integrity sha512-i9WVsrK2u0G/cASI9nh7voxOk9mhanWY9eGtWBDSYql6m49Yk5/Fan6uZsDr/xmzv8n+eQ8ahKCoEr8cvU3h+g==
version "1.115.0"
resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.115.0.tgz#159a49cf95c5126d5903e36df67504a8c634e817"
integrity sha512-PXcDVDgXifUE7/M2xUfQQ8uG3r73+kYRyPmsbc/iWwUrPbOASHt8p+HEbu85k546qmXixbcSPDg83kegw1vqcA==
dependencies:
debug "^4.0.1"
@ -5256,7 +5261,7 @@ strip-ansi@^4.0.0:
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^5.0.0:
strip-ansi@^5.0.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==