commit
ec88b7eddc
|
@ -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}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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}`;
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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 => {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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."
|
||||
`)
|
||||
);
|
||||
});
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
});
|
|
@ -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
151
yarn.lock
|
@ -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==
|
||||
|
|
Loading…
Reference in New Issue