forked from external-repos/squoosh
Remove all prerendering & critical CSS stuff
This commit is contained in:
@@ -1,409 +0,0 @@
|
|||||||
const path = require('path');
|
|
||||||
const parse5 = require('parse5');
|
|
||||||
const nwmatcher = require('nwmatcher');
|
|
||||||
const css = require('css');
|
|
||||||
const prettyBytes = require('pretty-bytes');
|
|
||||||
|
|
||||||
const treeAdapter = parse5.treeAdapters.htmlparser2;
|
|
||||||
|
|
||||||
const PLUGIN_NAME = 'critters-webpack-plugin';
|
|
||||||
|
|
||||||
const PARSE5_OPTS = {
|
|
||||||
treeAdapter
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Critters: Webpack Plugin Edition!
|
|
||||||
* @class
|
|
||||||
* @param {Object} options
|
|
||||||
* @param {Boolean} [options.external=true] Fetch and inline critical styles from external stylesheets
|
|
||||||
* @param {Boolean} [options.async=false] Convert critical-inlined external stylesheets to load asynchronously (via link rel="preload" - see https://filamentgroup.com/lab/async-css.html)
|
|
||||||
* @param {Boolean} [options.preload=false] (requires `async` option) Append a new <link rel="stylesheet"> into <body> instead of swapping the preload's rel attribute
|
|
||||||
* @param {Boolean} [options.fonts] If `true`, keeps critical `@font-face` rules and preloads them. If `false`, removes the rules and does not preload the fonts
|
|
||||||
* @param {Boolean} [options.preloadFonts=false] Preloads critical fonts (even those removed by `{fonts:false}`)
|
|
||||||
* @param {Boolean} [options.removeFonts=false] Remove all fonts (even critical ones)
|
|
||||||
* @param {Boolean} [options.compress=true] Compress resulting critical CSS
|
|
||||||
*/
|
|
||||||
module.exports = class CrittersWebpackPlugin {
|
|
||||||
constructor (options) {
|
|
||||||
this.options = options || {};
|
|
||||||
this.urlFilter = this.options.filter;
|
|
||||||
if (this.urlFilter instanceof RegExp) {
|
|
||||||
this.urlFilter = this.urlFilter.test.bind(this.urlFilter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Invoked by Webpack during plugin initialization */
|
|
||||||
apply (compiler) {
|
|
||||||
// hook into the compiler to get a Compilation instance...
|
|
||||||
compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
|
|
||||||
// ... which is how we get an "after" hook into html-webpack-plugin's HTML generation.
|
|
||||||
compilation.hooks.htmlWebpackPluginAfterHtmlProcessing.tapAsync(PLUGIN_NAME, (htmlPluginData, callback) => {
|
|
||||||
this.process(compiler, compilation, htmlPluginData)
|
|
||||||
.then(result => { callback(null, result); })
|
|
||||||
.catch(callback);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
readFile (filename, encoding) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
this.fs.readFile(filename, encoding, (err, data) => {
|
|
||||||
if (err) reject(err);
|
|
||||||
else resolve(data);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async process (compiler, compilation, htmlPluginData) {
|
|
||||||
const outputPath = compiler.options.output.path;
|
|
||||||
|
|
||||||
// Parse the generated HTML in a DOM we can mutate
|
|
||||||
const document = parse5.parse(htmlPluginData.html, PARSE5_OPTS);
|
|
||||||
makeDomInteractive(document);
|
|
||||||
|
|
||||||
// `external:false` skips processing of external sheets
|
|
||||||
if (this.options.external !== false) {
|
|
||||||
const externalSheets = document.querySelectorAll('link[rel="stylesheet"]');
|
|
||||||
await Promise.all(externalSheets.map(
|
|
||||||
link => this.embedLinkedStylesheet(link, compilation, outputPath)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
// go through all the style tags in the document and reduce them to only critical CSS
|
|
||||||
const styles = document.querySelectorAll('style');
|
|
||||||
await Promise.all(styles.map(
|
|
||||||
style => this.processStyle(style, document)
|
|
||||||
));
|
|
||||||
|
|
||||||
// serialize the document back to HTML and we're done
|
|
||||||
const html = parse5.serialize(document, PARSE5_OPTS);
|
|
||||||
return { html };
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Inline the target stylesheet referred to by a <link rel="stylesheet"> (assuming it passes `options.filter`) */
|
|
||||||
async embedLinkedStylesheet (link, compilation, outputPath) {
|
|
||||||
const href = link.getAttribute('href');
|
|
||||||
const document = link.ownerDocument;
|
|
||||||
|
|
||||||
// skip filtered resources, or network resources if no filter is provided
|
|
||||||
if (this.urlFilter ? this.urlFilter(href) : href.match(/^(https?:)?\/\//)) return Promise.resolve();
|
|
||||||
|
|
||||||
// path on disk
|
|
||||||
const filename = path.resolve(outputPath, href.replace(/^\//, ''));
|
|
||||||
|
|
||||||
// try to find a matching asset by filename in webpack's output (not yet written to disk)
|
|
||||||
const asset = compilation.assets[path.relative(outputPath, filename).replace(/^\.\//, '')];
|
|
||||||
|
|
||||||
// CSS loader is only injected for the first sheet, then this becomes an empty string
|
|
||||||
let cssLoaderPreamble = `function $loadcss(u,l){(l=document.createElement('link')).rel='stylesheet';l.href=u;document.head.appendChild(l)}`;
|
|
||||||
|
|
||||||
const media = typeof this.options.media === 'string' ? this.options.media : 'all';
|
|
||||||
|
|
||||||
// { preload:'js', media:true }
|
|
||||||
// { preload:'js', media:'print' }
|
|
||||||
if (this.options.media) {
|
|
||||||
cssLoaderPreamble = cssLoaderPreamble.replace('l.href', "l.media='only x';l.onload=function(){l.media='" + media + "'};l.href");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to read from assets, falling back to a disk read
|
|
||||||
const sheet = asset ? asset.source() : await this.readFile(filename, 'utf8');
|
|
||||||
|
|
||||||
// the reduced critical CSS gets injected into a new <style> tag
|
|
||||||
const style = document.createElement('style');
|
|
||||||
style.appendChild(document.createTextNode(sheet));
|
|
||||||
link.parentNode.insertBefore(style, link.nextSibling);
|
|
||||||
|
|
||||||
// drop a reference to the original URL onto the tag (used for reporting to console later)
|
|
||||||
style.$$name = href;
|
|
||||||
|
|
||||||
// the `async` option changes any critical'd <link rel="stylesheet"> tags to async-loaded equivalents
|
|
||||||
if (this.options.async) {
|
|
||||||
link.setAttribute('rel', 'preload');
|
|
||||||
link.setAttribute('as', 'style');
|
|
||||||
if (this.options.preload === 'js') {
|
|
||||||
const script = document.createElement('script');
|
|
||||||
script.appendChild(document.createTextNode(`${cssLoaderPreamble}$loadcss(${JSON.stringify(href)})`));
|
|
||||||
link.parentNode.insertBefore(script, link.nextSibling);
|
|
||||||
cssLoaderPreamble = '';
|
|
||||||
} else if (this.options.preload) {
|
|
||||||
const bodyLink = document.createElement('link');
|
|
||||||
bodyLink.setAttribute('rel', 'stylesheet');
|
|
||||||
bodyLink.setAttribute('href', href);
|
|
||||||
document.body.appendChild(bodyLink);
|
|
||||||
} else if (this.options.media) {
|
|
||||||
// @see https://github.com/filamentgroup/loadCSS/blob/af1106cfe0bf70147e22185afa7ead96c01dec48/src/loadCSS.js#L26
|
|
||||||
link.setAttribute('rel', 'stylesheet');
|
|
||||||
link.removeAttribute('as');
|
|
||||||
link.setAttribute('media', 'only x');
|
|
||||||
link.setAttribute('onload', "this.media='" + media + "'");
|
|
||||||
} else {
|
|
||||||
link.setAttribute('onload', "this.rel='stylesheet'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Parse the stylesheet within a <style> element, then reduce it to contain only rules used by the document. */
|
|
||||||
async processStyle (style) {
|
|
||||||
const options = this.options;
|
|
||||||
const document = style.ownerDocument;
|
|
||||||
const head = document.querySelector('head');
|
|
||||||
|
|
||||||
// basically `.textContent`
|
|
||||||
let sheet = style.childNodes.length > 0 && style.childNodes.map(node => node.nodeValue).join('\n');
|
|
||||||
|
|
||||||
// store a reference to the previous serialized stylesheet for reporting stats
|
|
||||||
const before = sheet;
|
|
||||||
|
|
||||||
// Skip empty stylesheets
|
|
||||||
if (!sheet) return;
|
|
||||||
|
|
||||||
const ast = css.parse(sheet);
|
|
||||||
|
|
||||||
// a string to search for font names (very loose)
|
|
||||||
let criticalFonts = '';
|
|
||||||
|
|
||||||
// Walk all CSS rules, transforming unused rules to comments (which get removed)
|
|
||||||
visit(ast, rule => {
|
|
||||||
if (rule.type === 'rule') {
|
|
||||||
// Filter the selector list down to only those matche
|
|
||||||
rule.selectors = rule.selectors.filter(sel => {
|
|
||||||
// Strip pseudo-elements and pseudo-classes, since we only care that their associated elements exist.
|
|
||||||
// This means any selector for a pseudo-element or having a pseudo-class will be inlined if the rest of the selector matches.
|
|
||||||
sel = sel.replace(/::?(?:[a-z-]+)([.[#~&^:*]|\s|\n|$)/gi, '$1');
|
|
||||||
return document.querySelector(sel, document) != null;
|
|
||||||
});
|
|
||||||
// If there are no matched selectors, remove the rule:
|
|
||||||
if (rule.selectors.length === 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rule.declarations) {
|
|
||||||
for (let i = 0; i < rule.declarations.length; i++) {
|
|
||||||
const decl = rule.declarations[i];
|
|
||||||
if (decl.property.match(/\bfont\b/i)) {
|
|
||||||
criticalFonts += ' ' + decl.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// keep font rules, they're handled in the second pass:
|
|
||||||
if (rule.type === 'font-face') return;
|
|
||||||
|
|
||||||
// If there are no remaining rules, remove the whole rule:
|
|
||||||
return !rule.rules || rule.rules.length !== 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
const preloadedFonts = [];
|
|
||||||
visit(ast, rule => {
|
|
||||||
// only process @font-face rules in the second pass
|
|
||||||
if (rule.type !== 'font-face') return;
|
|
||||||
|
|
||||||
let family, src;
|
|
||||||
for (let i = 0; i < rule.declarations.length; i++) {
|
|
||||||
const decl = rule.declarations[i];
|
|
||||||
if (decl.property === 'src') {
|
|
||||||
// @todo parse this properly and generate multiple preloads with type="font/woff2" etc
|
|
||||||
src = (decl.value.match(/url\s*\(\s*(['"]?)(.+?)\1\s*\)/) || [])[2];
|
|
||||||
} else if (decl.property === 'font-family') {
|
|
||||||
family = decl.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (src && (options.fonts === true || options.preloadFonts) && preloadedFonts.indexOf(src) === -1) {
|
|
||||||
preloadedFonts.push(src);
|
|
||||||
const preload = document.createElement('link');
|
|
||||||
preload.setAttribute('rel', 'preload');
|
|
||||||
preload.setAttribute('as', 'font');
|
|
||||||
if (src.match(/:\/\//)) {
|
|
||||||
preload.setAttribute('crossorigin', 'anonymous');
|
|
||||||
}
|
|
||||||
preload.setAttribute('href', src.trim());
|
|
||||||
head.appendChild(preload);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we're missing info or the font is unused, remove the rule:
|
|
||||||
if (!family || !src || criticalFonts.indexOf(family) === -1 || !options.fonts || options.removeFonts) return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
sheet = css.stringify(ast, { compress: this.options.compress !== false });
|
|
||||||
|
|
||||||
// If all rules were removed, get rid of the style element entirely
|
|
||||||
if (sheet.trim().length === 0) {
|
|
||||||
sheet.parentNode.removeChild(sheet);
|
|
||||||
} else {
|
|
||||||
// replace the inline stylesheet with its critical'd counterpart
|
|
||||||
while (style.lastChild) {
|
|
||||||
style.removeChild(style.lastChild);
|
|
||||||
}
|
|
||||||
style.appendChild(document.createTextNode(sheet));
|
|
||||||
}
|
|
||||||
|
|
||||||
// output some stats
|
|
||||||
const name = style.$$name ? style.$$name.replace(/^\//, '') : 'inline CSS';
|
|
||||||
const percent = sheet.length / before.length * 100 | 0;
|
|
||||||
console.log('\u001b[32mCritters: inlined ' + prettyBytes(sheet.length) + ' (' + percent + '% of original ' + prettyBytes(before.length) + ') of ' + name + '.\u001b[39m');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Recursively walk all rules in a stylesheet.
|
|
||||||
* The iterator can explicitly return `false` to remove the current node.
|
|
||||||
*/
|
|
||||||
function visit (node, fn) {
|
|
||||||
if (node.stylesheet) return visit(node.stylesheet, fn);
|
|
||||||
|
|
||||||
node.rules = node.rules.filter(rule => {
|
|
||||||
if (rule.rules) {
|
|
||||||
visit(rule, fn);
|
|
||||||
}
|
|
||||||
return fn(rule) !== false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Enhance an htmlparser2-style DOM with basic manipulation methods. */
|
|
||||||
function makeDomInteractive (document) {
|
|
||||||
defineProperties(document, DocumentExtensions);
|
|
||||||
// Find the first <html> element within the document
|
|
||||||
// document.documentElement = document.childNodes.filter( child => String(child.tagName).toLowerCase()==='html' )[0];
|
|
||||||
|
|
||||||
// Extend Element.prototype with DOM manipulation methods.
|
|
||||||
// Note: document.$$scratchElement is also used by createTextNode()
|
|
||||||
const scratch = document.$$scratchElement = document.createElement('div');
|
|
||||||
const elementProto = Object.getPrototypeOf(scratch);
|
|
||||||
defineProperties(elementProto, ElementExtensions);
|
|
||||||
elementProto.ownerDocument = document;
|
|
||||||
|
|
||||||
// nwmatcher is a selector engine that happens to work with Parse5's htmlparser2 DOM (they form the base of jsdom).
|
|
||||||
// It is exposed to the document so that it can be used within Element.prototype methods.
|
|
||||||
document.$match = nwmatcher({ document });
|
|
||||||
document.$match.configure({
|
|
||||||
CACHING: false,
|
|
||||||
USE_QSAPI: false,
|
|
||||||
USE_HTML5: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Essentially Object.defineProperties() except any functions are assigned as values rather than descriptors. */
|
|
||||||
function defineProperties (obj, properties) {
|
|
||||||
for (const i in properties) {
|
|
||||||
const value = properties[i];
|
|
||||||
Object.defineProperty(obj, i, typeof value === 'function' ? { value } : value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** {document,Element}.getElementsByTagName() is the only traversal method required by nwmatcher.
|
|
||||||
* Note: if perf issues arise, 2 faster but more verbose implementations are benchmarked here:
|
|
||||||
* https://esbench.com/bench/5ac3b647f2949800a0f619e1
|
|
||||||
*/
|
|
||||||
function getElementsByTagName (tagName) {
|
|
||||||
// Only return Element/Document nodes
|
|
||||||
if ((this.nodeType !== 1 && this.nodeType !== 9) || this.type === 'directive') return [];
|
|
||||||
return Array.prototype.concat.apply(
|
|
||||||
// Add current element if it matches tag
|
|
||||||
(tagName === '*' || (this.tagName && (this.tagName === tagName || this.nodeName === tagName.toUpperCase()))) ? [this] : [],
|
|
||||||
// Check children recursively
|
|
||||||
this.children.map(child => getElementsByTagName.call(child, tagName))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const reflectedProperty = attributeName => ({
|
|
||||||
get () {
|
|
||||||
return this.getAttribute(attributeName);
|
|
||||||
},
|
|
||||||
set (value) {
|
|
||||||
this.setAttribute(attributeName, value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/** Methods and descriptors to mix into Element.prototype */
|
|
||||||
const ElementExtensions = {
|
|
||||||
nodeName: {
|
|
||||||
get () {
|
|
||||||
return this.tagName.toUpperCase();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
id: reflectedProperty('id'),
|
|
||||||
className: reflectedProperty('class'),
|
|
||||||
insertBefore (child, referenceNode) {
|
|
||||||
if (!referenceNode) return this.appendChild(child);
|
|
||||||
treeAdapter.insertBefore(this, child, referenceNode);
|
|
||||||
return child;
|
|
||||||
},
|
|
||||||
appendChild (child) {
|
|
||||||
treeAdapter.appendChild(this, child);
|
|
||||||
return child;
|
|
||||||
},
|
|
||||||
removeChild (child) {
|
|
||||||
treeAdapter.detachNode(child);
|
|
||||||
},
|
|
||||||
setAttribute (name, value) {
|
|
||||||
if (this.attribs == null) this.attribs = {};
|
|
||||||
if (value == null) value = '';
|
|
||||||
this.attribs[name] = value;
|
|
||||||
},
|
|
||||||
removeAttribute (name) {
|
|
||||||
if (this.attribs != null) {
|
|
||||||
delete this.attribs[name];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getAttribute (name) {
|
|
||||||
return this.attribs != null && this.attribs[name];
|
|
||||||
},
|
|
||||||
hasAttribute (name) {
|
|
||||||
return this.attribs != null && this.attribs[name] != null;
|
|
||||||
},
|
|
||||||
getAttributeNode (name) {
|
|
||||||
const value = this.getAttribute(name);
|
|
||||||
if (value != null) return { specified: true, value };
|
|
||||||
},
|
|
||||||
getElementsByTagName
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Methods and descriptors to mix into the global document instance */
|
|
||||||
const DocumentExtensions = {
|
|
||||||
// document is just an Element in htmlparser2, giving it a nodeType of ELEMENT_NODE.
|
|
||||||
// nwmatcher requires that it at least report a correct nodeType of DOCUMENT_NODE.
|
|
||||||
nodeType: {
|
|
||||||
get () {
|
|
||||||
return 9;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
nodeName: {
|
|
||||||
get () {
|
|
||||||
return '#document';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
documentElement: {
|
|
||||||
get () {
|
|
||||||
// Find the first <html> element within the document
|
|
||||||
return this.childNodes.filter(child => String(child.tagName).toLowerCase() === 'html')[0];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
get () {
|
|
||||||
return this.querySelector('body');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
createElement (name) {
|
|
||||||
return treeAdapter.createElement(name, null, []);
|
|
||||||
},
|
|
||||||
createTextNode (text) {
|
|
||||||
// there is no dedicated createTextNode equivalent in htmlparser2's DOM, so
|
|
||||||
// we have to insert Text and then remove and return the resulting Text node.
|
|
||||||
const scratch = this.$$scratchElement;
|
|
||||||
treeAdapter.insertText(scratch, text);
|
|
||||||
const node = scratch.lastChild;
|
|
||||||
treeAdapter.detachNode(node);
|
|
||||||
return node;
|
|
||||||
},
|
|
||||||
querySelector (sel) {
|
|
||||||
return this.$match.first(sel, this.documentElement);
|
|
||||||
},
|
|
||||||
querySelectorAll (sel) {
|
|
||||||
return this.$match.select(sel, this.documentElement);
|
|
||||||
},
|
|
||||||
getElementsByTagName,
|
|
||||||
// nwmatcher uses inexistence of `document.addEventListener` to detect IE:
|
|
||||||
// https://github.com/dperini/nwmatcher/blob/3edb471e12ce7f7d46dc1606c7f659ff45675a29/src/nwmatcher.js#L353
|
|
||||||
addEventListener: Object
|
|
||||||
};
|
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
const jsdom = require('jsdom');
|
|
||||||
const os = require('os');
|
|
||||||
// const util = require('util');
|
|
||||||
const path = require('path');
|
|
||||||
const loaderUtils = require('loader-utils');
|
|
||||||
const LibraryTemplatePlugin = require('webpack/lib/LibraryTemplatePlugin');
|
|
||||||
const NodeTemplatePlugin = require('webpack/lib/node/NodeTemplatePlugin');
|
|
||||||
const NodeTargetPlugin = require('webpack/lib/node/NodeTargetPlugin');
|
|
||||||
const SingleEntryPlugin = require('webpack/lib/SingleEntryPlugin');
|
|
||||||
const DefinePlugin = require('webpack').DefinePlugin;
|
|
||||||
const MemoryFs = require('memory-fs');
|
|
||||||
|
|
||||||
const FILENAME = 'ssr-bundle.js';
|
|
||||||
|
|
||||||
const PRERENDER_REG = /\{\{prerender(?::\s*([^}]+)\s*)?\}\}/;
|
|
||||||
|
|
||||||
module.exports = function PrerenderLoader (content) {
|
|
||||||
// const { string, disabled, ...options } = getOptions()
|
|
||||||
const options = loaderUtils.getOptions(this) || {};
|
|
||||||
const outputFilter = options.as === 'string' || options.string ? stringToModule : String;
|
|
||||||
|
|
||||||
if (options.disabled === true) {
|
|
||||||
return outputFilter(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
// When applied to HTML, attempts to inject into a specified {{prerender}} field.
|
|
||||||
// @note: this is only used when the entry module exports a String or function
|
|
||||||
// that resolves to a String, otherwise the whole document is serialized.
|
|
||||||
let inject = false;
|
|
||||||
if (!this.request.match(/.(js|ts)x?$/i)) {
|
|
||||||
const matches = content.match(PRERENDER_REG);
|
|
||||||
if (matches) {
|
|
||||||
inject = true;
|
|
||||||
options.entry = matches[1];
|
|
||||||
}
|
|
||||||
options.templateContent = content;
|
|
||||||
}
|
|
||||||
|
|
||||||
const callback = this.async();
|
|
||||||
|
|
||||||
prerender(this, options, inject)
|
|
||||||
.then(output => {
|
|
||||||
callback(null, outputFilter(output));
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
callback(err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
async function prerender (loaderContext, options, inject) {
|
|
||||||
const parentCompilation = loaderContext._compilation;
|
|
||||||
const parentCompiler = rootCompiler(parentCompilation.compiler);
|
|
||||||
const request = loaderContext.request;
|
|
||||||
const context = parentCompiler.options.context || process.cwd();
|
|
||||||
const entry = './' + ((options.entry && [].concat(options.entry).pop().trim()) || path.relative(context, parentCompiler.options.entry));
|
|
||||||
|
|
||||||
// undocumented option (to remove):
|
|
||||||
// !!prerender-loader?template=src/index.html!src/index.js
|
|
||||||
// if (!inject && options.template) {
|
|
||||||
// const loadModule = util.promisify(loaderContext.loadModule);
|
|
||||||
// const source = await loadModule('!!raw-loader!' + path.resolve(context, options.template));
|
|
||||||
// options.templateContent = source;
|
|
||||||
// }
|
|
||||||
|
|
||||||
const outputOptions = {
|
|
||||||
// fix for plugins not using outputfilesystem
|
|
||||||
path: os.tmpdir(),
|
|
||||||
filename: FILENAME
|
|
||||||
};
|
|
||||||
|
|
||||||
// Only copy over mini-extract-text-plugin (excluding it breaks extraction entirely)
|
|
||||||
const plugins = (parentCompiler.options.plugins || []).filter(c => /MiniCssExtractPlugin/i.test(c.constructor.name));
|
|
||||||
|
|
||||||
// Compile to an in-memory filesystem since we just want the resulting bundled code as a string
|
|
||||||
const compiler = parentCompilation.createChildCompiler('prerender', outputOptions, plugins);
|
|
||||||
compiler.outputFileSystem = new MemoryFs();
|
|
||||||
|
|
||||||
// Define PRERENDER to be true within the SSR bundle
|
|
||||||
new DefinePlugin({
|
|
||||||
PRERENDER: 'true',
|
|
||||||
document: 'undefined' // if (typeof document==='undefined') {}
|
|
||||||
}).apply(compiler);
|
|
||||||
|
|
||||||
// ... then define PRERENDER to be false within the client bundle
|
|
||||||
new DefinePlugin({
|
|
||||||
PRERENDER: 'false'
|
|
||||||
}).apply(parentCompiler);
|
|
||||||
|
|
||||||
// Compile to CommonJS to be executed by Node
|
|
||||||
new NodeTemplatePlugin(outputOptions).apply(compiler);
|
|
||||||
new NodeTargetPlugin().apply(compiler);
|
|
||||||
|
|
||||||
new LibraryTemplatePlugin('PRERENDER_RESULT', 'var').apply(compiler);
|
|
||||||
|
|
||||||
// Kick off compilation at our entry module (either the parent compiler's entry or a custom one defined via `{{prerender:entry.js}}`)
|
|
||||||
new SingleEntryPlugin(context, entry, undefined).apply(compiler);
|
|
||||||
|
|
||||||
// Set up cache inheritance for the child compiler
|
|
||||||
const subCache = 'subcache ' + request;
|
|
||||||
function addChildCache (compilation, data) {
|
|
||||||
if (compilation.cache) {
|
|
||||||
if (!compilation.cache[subCache]) compilation.cache[subCache] = {};
|
|
||||||
compilation.cache = compilation.cache[subCache];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (compiler.hooks) {
|
|
||||||
compiler.hooks.compilation.tap('prerender-loader', addChildCache);
|
|
||||||
} else {
|
|
||||||
compiler.plugin('compilation', addChildCache);
|
|
||||||
}
|
|
||||||
|
|
||||||
const compilation = await runChildCompiler(compiler);
|
|
||||||
let result = '';
|
|
||||||
let dom, injectParent;
|
|
||||||
|
|
||||||
if (compilation.assets[compilation.options.output.filename]) {
|
|
||||||
// Get the compiled main bundle
|
|
||||||
const output = compilation.assets[compilation.options.output.filename].source();
|
|
||||||
|
|
||||||
const tpl = options.templateContent || '<!DOCTYPE html><html><head></head><body></body></html>';
|
|
||||||
dom = new jsdom.JSDOM(tpl.replace(PRERENDER_REG, '<div id="PRERENDER_INJECT"></div>'), {
|
|
||||||
// don't track source locations for performance reasons
|
|
||||||
includeNodeLocations: false,
|
|
||||||
// don't allow inline event handlers & script tag exec
|
|
||||||
runScripts: 'outside-only'
|
|
||||||
});
|
|
||||||
const { window } = dom;
|
|
||||||
|
|
||||||
// Find the placeholder node for injection & remove it
|
|
||||||
const injectPlaceholder = window.document.getElementById('PRERENDER_INJECT');
|
|
||||||
if (injectPlaceholder) {
|
|
||||||
injectParent = injectPlaceholder.parentNode;
|
|
||||||
injectPlaceholder.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are missing from JSDOM
|
|
||||||
let counter = 0;
|
|
||||||
window.requestAnimationFrame = () => ++counter;
|
|
||||||
window.cancelAnimationFrame = () => {};
|
|
||||||
|
|
||||||
// Invoke the SSR bundle within the JSDOM document and grab the exported/returned result
|
|
||||||
result = window.eval(output + '\nPRERENDER_RESULT') || result;
|
|
||||||
|
|
||||||
// @todo this seems pointless
|
|
||||||
if (window.PRERENDER_RESULT != null) {
|
|
||||||
result = window.PRERENDER_RESULT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deal with ES Module exports (just use the best guess):
|
|
||||||
if (result && result.__esModule === true) {
|
|
||||||
result = getBestModuleExport(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof result === 'function') {
|
|
||||||
// @todo any arguments worth passing here?
|
|
||||||
result = result();
|
|
||||||
}
|
|
||||||
|
|
||||||
// The entry can export or return a Promise in order to perform fully async prerendering:
|
|
||||||
if (result && result.then) {
|
|
||||||
result = await result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returning or resolving to `null` / `undefined` defaults to serializing the whole document.
|
|
||||||
// Note: this pypasses `inject` because the document is already derived from the template.
|
|
||||||
if (result == null && dom) {
|
|
||||||
result = dom.serialize();
|
|
||||||
} else if (inject) {
|
|
||||||
// @todo determine if this is really necessary for the string return case
|
|
||||||
if (injectParent) {
|
|
||||||
injectParent.insertAdjacentHTML('beforeend', result || '');
|
|
||||||
} else {
|
|
||||||
// Otherwise inject the prerendered HTML into the template
|
|
||||||
result = options.templateContent.replace(PRERENDER_REG, result || '');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Promisified version of compiler.runAsChild() with error hoisting and isolated output/assets
|
|
||||||
function runChildCompiler (compiler) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
// runAsChild() merges assets into the parent compilation, we don't want that.
|
|
||||||
compiler.compile((err, compilation) => {
|
|
||||||
compiler.parentCompilation.children.push(compilation);
|
|
||||||
if (err) return reject(err);
|
|
||||||
|
|
||||||
if (compilation.errors && compilation.errors.length) {
|
|
||||||
const errorDetails = compilation.errors.map(error => error.details).join('\n');
|
|
||||||
return reject(Error('Child compilation failed:\n' + errorDetails));
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve(compilation);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Crawl up the compiler tree and return the outermost compiler instance
|
|
||||||
function rootCompiler (compiler) {
|
|
||||||
while (compiler.parentCompilation && compiler.parentCompilation.compiler) {
|
|
||||||
compiler = compiler.parentCompilation.compiler;
|
|
||||||
}
|
|
||||||
return compiler;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the best possible export for an ES Module. Returns `undefined` for no exports.
|
|
||||||
function getBestModuleExport (exports) {
|
|
||||||
if (exports.default) {
|
|
||||||
return exports.default;
|
|
||||||
}
|
|
||||||
for (const prop in exports) {
|
|
||||||
if (prop !== '__esModule') {
|
|
||||||
return exports[prop];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrap a String up into an ES Module that exports it
|
|
||||||
const stringToModule = str => 'export default ' + JSON.stringify(str);
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
let path = require('path');
|
|
||||||
let preact = require('preact');
|
|
||||||
let renderToString = require('preact-render-to-string');
|
|
||||||
|
|
||||||
let appPath = path.join(__dirname, '../src/index');
|
|
||||||
|
|
||||||
module.exports = function(options) {
|
|
||||||
options = options || {};
|
|
||||||
let url = typeof options==='string' ? options : options.url;
|
|
||||||
global.history = {};
|
|
||||||
global.location = { href: url, pathname: url };
|
|
||||||
|
|
||||||
// let app = require('app-entry-point');
|
|
||||||
let app = require(appPath);
|
|
||||||
|
|
||||||
let html = renderToString(preact.h(app, { url }));
|
|
||||||
console.log(html);
|
|
||||||
|
|
||||||
return html;
|
|
||||||
};
|
|
||||||
727
package-lock.json
generated
727
package-lock.json
generated
@@ -4,6 +4,24 @@
|
|||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@babel/runtime": {
|
||||||
|
"version": "7.0.0-beta.46",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.46.tgz",
|
||||||
|
"integrity": "sha512-/3a3USMKk54BEHhDgY8rtxtaQOs4bp4aQwo6SDtdwmrXmgSgEusWuXNX5oIs/nwzmTD9o8wz2EyAjA+uHDMmJA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"core-js": "2.5.5",
|
||||||
|
"regenerator-runtime": "0.11.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"core-js": {
|
||||||
|
"version": "2.5.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
|
||||||
|
"integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@material/animation": {
|
"@material/animation": {
|
||||||
"version": "0.25.0",
|
"version": "0.25.0",
|
||||||
"resolved": "https://registry.npmjs.org/@material/animation/-/animation-0.25.0.tgz",
|
"resolved": "https://registry.npmjs.org/@material/animation/-/animation-0.25.0.tgz",
|
||||||
@@ -385,12 +403,6 @@
|
|||||||
"integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==",
|
"integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"abab": {
|
|
||||||
"version": "1.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
|
|
||||||
"integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"abbrev": {
|
"abbrev": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
||||||
@@ -422,15 +434,6 @@
|
|||||||
"acorn": "5.5.0"
|
"acorn": "5.5.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"acorn-globals": {
|
|
||||||
"version": "4.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
|
|
||||||
"integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"acorn": "5.5.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"acorn-jsx": {
|
"acorn-jsx": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
|
||||||
@@ -837,12 +840,6 @@
|
|||||||
"integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
|
"integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"array-equal": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"array-filter": {
|
"array-filter": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
|
||||||
@@ -2245,12 +2242,6 @@
|
|||||||
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
|
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"browser-process-hrtime": {
|
|
||||||
"version": "0.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz",
|
|
||||||
"integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"browserify-aes": {
|
"browserify-aes": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
|
||||||
@@ -3317,12 +3308,6 @@
|
|||||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
|
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"content-type-parser": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"convert-source-map": {
|
"convert-source-map": {
|
||||||
"version": "1.5.1",
|
"version": "1.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
|
||||||
@@ -3612,21 +3597,6 @@
|
|||||||
"source-map": "0.5.7"
|
"source-map": "0.5.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cssom": {
|
|
||||||
"version": "0.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
|
|
||||||
"integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"cssstyle": {
|
|
||||||
"version": "0.2.37",
|
|
||||||
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
|
|
||||||
"integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"cssom": "0.3.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"currently-unhandled": {
|
"currently-unhandled": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
|
||||||
@@ -3965,15 +3935,6 @@
|
|||||||
"integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
|
"integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"domexception": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
|
|
||||||
"integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"webidl-conversions": "4.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"domhandler": {
|
"domhandler": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
|
||||||
@@ -4045,36 +4006,6 @@
|
|||||||
"integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=",
|
"integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"ejs-loader": {
|
|
||||||
"version": "0.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ejs-loader/-/ejs-loader-0.3.1.tgz",
|
|
||||||
"integrity": "sha512-bdJHTxBY3uqZ6L5V1WRohf1gr7ousgESpArPVseEQCWCATs+M8BRqxyJWqnFo+h815gTA++g5LyAyqS5OTIfdQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"loader-utils": "0.2.17",
|
|
||||||
"lodash": "3.10.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"loader-utils": {
|
|
||||||
"version": "0.2.17",
|
|
||||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
|
|
||||||
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"big.js": "3.2.0",
|
|
||||||
"emojis-list": "2.1.0",
|
|
||||||
"json5": "0.5.1",
|
|
||||||
"object-assign": "4.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lodash": {
|
|
||||||
"version": "3.10.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
|
|
||||||
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"electron-to-chromium": {
|
"electron-to-chromium": {
|
||||||
"version": "1.3.34",
|
"version": "1.3.34",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.34.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.34.tgz",
|
||||||
@@ -4213,34 +4144,6 @@
|
|||||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"escodegen": {
|
|
||||||
"version": "1.9.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
|
|
||||||
"integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"esprima": "3.1.3",
|
|
||||||
"estraverse": "4.2.0",
|
|
||||||
"esutils": "2.0.2",
|
|
||||||
"optionator": "0.8.2",
|
|
||||||
"source-map": "0.6.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"esprima": {
|
|
||||||
"version": "3.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
|
|
||||||
"integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"source-map": {
|
|
||||||
"version": "0.6.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
|
||||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
|
||||||
"dev": true,
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"eslint": {
|
"eslint": {
|
||||||
"version": "4.18.2",
|
"version": "4.18.2",
|
||||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz",
|
"resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz",
|
||||||
@@ -4763,18 +4666,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"extract-text-webpack-plugin": {
|
|
||||||
"version": "4.0.0-beta.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz",
|
|
||||||
"integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"async": "2.6.0",
|
|
||||||
"loader-utils": "1.1.0",
|
|
||||||
"schema-utils": "0.4.5",
|
|
||||||
"webpack-sources": "1.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"extsprintf": {
|
"extsprintf": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
|
||||||
@@ -4997,109 +4888,6 @@
|
|||||||
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
|
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"fork-ts-checker-notifier-webpack-plugin": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/fork-ts-checker-notifier-webpack-plugin/-/fork-ts-checker-notifier-webpack-plugin-0.4.0.tgz",
|
|
||||||
"integrity": "sha512-v0mt/9FLGbsbeplA68HaXj1s+ydEJkEWYs+NjtZs9r20UdrzmONzOQIkwhhk+k2Xv9RWypXdFFezC3uFphJ68Q==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"node-notifier": "5.2.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fork-ts-checker-webpack-plugin": {
|
|
||||||
"version": "0.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.4.1.tgz",
|
|
||||||
"integrity": "sha512-UckdUYL51F5t9t/2Uqk0xatxz8Cf75a1THNIrDYajjcAcg2Q64SXNP7BTQPxXm0bU1chzjR3brXIaianbFqI3Q==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"babel-code-frame": "6.26.0",
|
|
||||||
"chalk": "1.1.3",
|
|
||||||
"chokidar": "1.7.0",
|
|
||||||
"lodash.endswith": "4.2.1",
|
|
||||||
"lodash.isfunction": "3.0.9",
|
|
||||||
"lodash.isstring": "4.0.1",
|
|
||||||
"lodash.startswith": "4.2.1",
|
|
||||||
"minimatch": "3.0.4",
|
|
||||||
"resolve": "1.6.0",
|
|
||||||
"tapable": "1.0.0",
|
|
||||||
"vue-parser": "1.1.6"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"anymatch": {
|
|
||||||
"version": "1.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
|
|
||||||
"integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"micromatch": "2.3.11",
|
|
||||||
"normalize-path": "2.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chalk": {
|
|
||||||
"version": "1.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
|
||||||
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"ansi-styles": "2.2.1",
|
|
||||||
"escape-string-regexp": "1.0.5",
|
|
||||||
"has-ansi": "2.0.0",
|
|
||||||
"strip-ansi": "3.0.1",
|
|
||||||
"supports-color": "2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chokidar": {
|
|
||||||
"version": "1.7.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
|
|
||||||
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"anymatch": "1.3.2",
|
|
||||||
"async-each": "1.0.1",
|
|
||||||
"fsevents": "1.1.3",
|
|
||||||
"glob-parent": "2.0.0",
|
|
||||||
"inherits": "2.0.3",
|
|
||||||
"is-binary-path": "1.0.1",
|
|
||||||
"is-glob": "2.0.1",
|
|
||||||
"path-is-absolute": "1.0.1",
|
|
||||||
"readdirp": "2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"glob-parent": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
|
|
||||||
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"is-glob": "2.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"is-extglob": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"is-glob": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
|
|
||||||
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"is-extglob": "1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"strip-ansi": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
|
||||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"ansi-regex": "2.1.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"form-data": {
|
"form-data": {
|
||||||
"version": "2.1.4",
|
"version": "2.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
|
||||||
@@ -6485,12 +6273,6 @@
|
|||||||
"lodash": "4.17.5"
|
"lodash": "4.17.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"growly": {
|
|
||||||
"version": "1.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
|
|
||||||
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"gzip-size": {
|
"gzip-size": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
|
||||||
@@ -6515,12 +6297,6 @@
|
|||||||
"integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
|
"integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"har-schema": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
|
|
||||||
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"har-validator": {
|
"har-validator": {
|
||||||
"version": "2.0.6",
|
"version": "2.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
|
||||||
@@ -6771,15 +6547,6 @@
|
|||||||
"integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=",
|
"integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"html-encoding-sniffer": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"whatwg-encoding": "1.0.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"html-entities": {
|
"html-entities": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
|
||||||
@@ -7727,187 +7494,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"jsdom": {
|
|
||||||
"version": "11.6.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz",
|
|
||||||
"integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"abab": "1.0.4",
|
|
||||||
"acorn": "5.5.0",
|
|
||||||
"acorn-globals": "4.1.0",
|
|
||||||
"array-equal": "1.0.0",
|
|
||||||
"browser-process-hrtime": "0.1.2",
|
|
||||||
"content-type-parser": "1.0.2",
|
|
||||||
"cssom": "0.3.2",
|
|
||||||
"cssstyle": "0.2.37",
|
|
||||||
"domexception": "1.0.1",
|
|
||||||
"escodegen": "1.9.1",
|
|
||||||
"html-encoding-sniffer": "1.0.2",
|
|
||||||
"left-pad": "1.2.0",
|
|
||||||
"nwmatcher": "1.4.4",
|
|
||||||
"parse5": "4.0.0",
|
|
||||||
"pn": "1.1.0",
|
|
||||||
"request": "2.85.0",
|
|
||||||
"request-promise-native": "1.0.5",
|
|
||||||
"sax": "1.2.4",
|
|
||||||
"symbol-tree": "3.2.2",
|
|
||||||
"tough-cookie": "2.3.4",
|
|
||||||
"w3c-hr-time": "1.0.1",
|
|
||||||
"webidl-conversions": "4.0.2",
|
|
||||||
"whatwg-encoding": "1.0.3",
|
|
||||||
"whatwg-url": "6.4.0",
|
|
||||||
"ws": "4.1.0",
|
|
||||||
"xml-name-validator": "3.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"assert-plus": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"aws-sign2": {
|
|
||||||
"version": "0.7.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
|
|
||||||
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"boom": {
|
|
||||||
"version": "4.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
|
|
||||||
"integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"hoek": "4.2.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"caseless": {
|
|
||||||
"version": "0.12.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
|
||||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"cryptiles": {
|
|
||||||
"version": "3.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
|
|
||||||
"integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"boom": "5.2.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"boom": {
|
|
||||||
"version": "5.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
|
|
||||||
"integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"hoek": "4.2.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"form-data": {
|
|
||||||
"version": "2.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
|
|
||||||
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"asynckit": "0.4.0",
|
|
||||||
"combined-stream": "1.0.6",
|
|
||||||
"mime-types": "2.1.18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"har-validator": {
|
|
||||||
"version": "5.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
|
|
||||||
"integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"ajv": "5.5.2",
|
|
||||||
"har-schema": "2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hawk": {
|
|
||||||
"version": "6.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
|
|
||||||
"integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"boom": "4.3.1",
|
|
||||||
"cryptiles": "3.1.2",
|
|
||||||
"hoek": "4.2.1",
|
|
||||||
"sntp": "2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hoek": {
|
|
||||||
"version": "4.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
|
|
||||||
"integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"http-signature": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
|
||||||
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"assert-plus": "1.0.0",
|
|
||||||
"jsprim": "1.4.1",
|
|
||||||
"sshpk": "1.13.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"request": {
|
|
||||||
"version": "2.85.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
|
|
||||||
"integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"aws-sign2": "0.7.0",
|
|
||||||
"aws4": "1.6.0",
|
|
||||||
"caseless": "0.12.0",
|
|
||||||
"combined-stream": "1.0.6",
|
|
||||||
"extend": "3.0.1",
|
|
||||||
"forever-agent": "0.6.1",
|
|
||||||
"form-data": "2.3.2",
|
|
||||||
"har-validator": "5.0.3",
|
|
||||||
"hawk": "6.0.2",
|
|
||||||
"http-signature": "1.2.0",
|
|
||||||
"is-typedarray": "1.0.0",
|
|
||||||
"isstream": "0.1.2",
|
|
||||||
"json-stringify-safe": "5.0.1",
|
|
||||||
"mime-types": "2.1.18",
|
|
||||||
"oauth-sign": "0.8.2",
|
|
||||||
"performance-now": "2.1.0",
|
|
||||||
"qs": "6.5.1",
|
|
||||||
"safe-buffer": "5.1.1",
|
|
||||||
"stringstream": "0.0.5",
|
|
||||||
"tough-cookie": "2.3.4",
|
|
||||||
"tunnel-agent": "0.6.0",
|
|
||||||
"uuid": "3.2.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"sntp": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
|
|
||||||
"integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"hoek": "4.2.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tunnel-agent": {
|
|
||||||
"version": "0.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
|
||||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "5.1.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"jsesc": {
|
"jsesc": {
|
||||||
"version": "0.5.0",
|
"version": "0.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
|
||||||
@@ -8073,12 +7659,6 @@
|
|||||||
"invert-kv": "1.0.0"
|
"invert-kv": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"left-pad": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz",
|
|
||||||
"integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"levn": {
|
"levn": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
|
||||||
@@ -8369,24 +7949,6 @@
|
|||||||
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lodash.endswith": {
|
|
||||||
"version": "4.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz",
|
|
||||||
"integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"lodash.isfunction": {
|
|
||||||
"version": "3.0.9",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
|
|
||||||
"integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"lodash.isstring": {
|
|
||||||
"version": "4.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
|
|
||||||
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"lodash.memoize": {
|
"lodash.memoize": {
|
||||||
"version": "4.1.2",
|
"version": "4.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
|
||||||
@@ -8399,18 +7961,6 @@
|
|||||||
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
|
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lodash.sortby": {
|
|
||||||
"version": "4.7.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
|
|
||||||
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"lodash.startswith": {
|
|
||||||
"version": "4.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz",
|
|
||||||
"integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"lodash.tail": {
|
"lodash.tail": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
|
||||||
@@ -8873,7 +8423,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"material-radial-progress": {
|
"material-radial-progress": {
|
||||||
"version": "git+https://gist.github.com/02134901c77c5309924bfcf8b4435ebe.git#76f1dd168b410d5b5ffecf363688270261d44832"
|
"version": "git+https://gist.github.com/02134901c77c5309924bfcf8b4435ebe.git#db6fd760ab355faed5f89456a087992af78faa10"
|
||||||
},
|
},
|
||||||
"math-expression-evaluator": {
|
"math-expression-evaluator": {
|
||||||
"version": "1.2.17",
|
"version": "1.2.17",
|
||||||
@@ -9450,18 +9000,6 @@
|
|||||||
"vm-browserify": "0.0.4"
|
"vm-browserify": "0.0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node-notifier": {
|
|
||||||
"version": "5.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz",
|
|
||||||
"integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"growly": "1.3.0",
|
|
||||||
"semver": "5.5.0",
|
|
||||||
"shellwords": "0.1.1",
|
|
||||||
"which": "1.3.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node-sass": {
|
"node-sass": {
|
||||||
"version": "4.7.2",
|
"version": "4.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz",
|
||||||
@@ -9661,12 +9199,6 @@
|
|||||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"nwmatcher": {
|
|
||||||
"version": "1.4.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
|
|
||||||
"integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"oauth-sign": {
|
"oauth-sign": {
|
||||||
"version": "0.8.2",
|
"version": "0.8.2",
|
||||||
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
|
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
|
||||||
@@ -9810,18 +9342,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"object.values": {
|
|
||||||
"version": "1.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz",
|
|
||||||
"integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"define-properties": "1.1.2",
|
|
||||||
"es-abstract": "1.10.0",
|
|
||||||
"function-bind": "1.1.1",
|
|
||||||
"has": "1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"obuf": {
|
"obuf": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
|
||||||
@@ -10182,12 +9702,6 @@
|
|||||||
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
|
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"parse5": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"parseurl": {
|
"parseurl": {
|
||||||
"version": "1.3.2",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
|
||||||
@@ -10287,12 +9801,6 @@
|
|||||||
"sha.js": "2.4.11"
|
"sha.js": "2.4.11"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"performance-now": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
|
|
||||||
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"pify": {
|
"pify": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
|
||||||
@@ -10329,12 +9837,6 @@
|
|||||||
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
|
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"pn": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"portfinder": {
|
"portfinder": {
|
||||||
"version": "1.0.13",
|
"version": "1.0.13",
|
||||||
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz",
|
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz",
|
||||||
@@ -11052,27 +10554,18 @@
|
|||||||
"preact-material-components-drawer": {
|
"preact-material-components-drawer": {
|
||||||
"version": "git+https://gist.github.com/a78fceed440b98e62582e4440b86bfab.git#51843d83fc0432348eeda65a019920ca77bb79c4"
|
"version": "git+https://gist.github.com/a78fceed440b98e62582e4440b86bfab.git#51843d83fc0432348eeda65a019920ca77bb79c4"
|
||||||
},
|
},
|
||||||
"preact-render-to-string": {
|
|
||||||
"version": "3.7.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-3.7.0.tgz",
|
|
||||||
"integrity": "sha1-fbQXdFS8ATleDQHWrAe8XoOOMe4=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"pretty-format": "3.8.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"preact-router": {
|
"preact-router": {
|
||||||
"version": "2.6.0",
|
"version": "2.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/preact-router/-/preact-router-2.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/preact-router/-/preact-router-2.6.0.tgz",
|
||||||
"integrity": "sha1-Vff7yE5rivDfPqBMjOTCaHFAibY="
|
"integrity": "sha1-Vff7yE5rivDfPqBMjOTCaHFAibY="
|
||||||
},
|
},
|
||||||
"preload-webpack-plugin": {
|
"preload-webpack-plugin": {
|
||||||
"version": "github:GoogleChromeLabs/preload-webpack-plugin#798fc677f42e9ed2c1176065f733efa6b7fdc735",
|
"version": "3.0.0-alpha.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/preload-webpack-plugin/-/preload-webpack-plugin-3.0.0-alpha.3.tgz",
|
||||||
|
"integrity": "sha512-sl0xCvUfw6Qrd2WTo3NzavRFUaui4SknwxkubG6s5yQ1i1NLnnKrzJS5sYrhVZgxK+M9UsXMKUrF5hAYTnRZEw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"object-assign": "4.1.1",
|
"@babel/runtime": "7.0.0-beta.46"
|
||||||
"object.values": "1.0.4",
|
|
||||||
"webpack-log": "1.1.2"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prelude-ls": {
|
"prelude-ls": {
|
||||||
@@ -11115,12 +10608,6 @@
|
|||||||
"utila": "0.4.0"
|
"utila": "0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pretty-format": {
|
|
||||||
"version": "3.8.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
|
|
||||||
"integrity": "sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"private": {
|
"private": {
|
||||||
"version": "0.1.8",
|
"version": "0.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
|
||||||
@@ -11755,26 +11242,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"request-promise-core": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
|
|
||||||
"integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"lodash": "4.17.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"request-promise-native": {
|
|
||||||
"version": "1.0.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
|
|
||||||
"integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"request-promise-core": "1.1.1",
|
|
||||||
"stealthy-require": "1.1.1",
|
|
||||||
"tough-cookie": "2.3.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"require-directory": {
|
"require-directory": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||||
@@ -12358,12 +11825,6 @@
|
|||||||
"rechoir": "0.6.2"
|
"rechoir": "0.6.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shellwords": {
|
|
||||||
"version": "0.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
|
|
||||||
"integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"signal-exit": {
|
"signal-exit": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||||
@@ -12887,12 +12348,6 @@
|
|||||||
"readable-stream": "2.3.4"
|
"readable-stream": "2.3.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stealthy-require": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
|
|
||||||
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"stream-browserify": {
|
"stream-browserify": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
|
||||||
@@ -13099,12 +12554,6 @@
|
|||||||
"integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
|
"integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"symbol-tree": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
|
|
||||||
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"tabbable": {
|
"tabbable": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.2.tgz",
|
||||||
@@ -13311,23 +12760,6 @@
|
|||||||
"punycode": "1.4.1"
|
"punycode": "1.4.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tr46": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
|
|
||||||
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"punycode": "2.1.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"punycode": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
|
|
||||||
"integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"trim-newlines": {
|
"trim-newlines": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
|
||||||
@@ -13817,58 +13249,6 @@
|
|||||||
"integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==",
|
"integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"typescript-loader": {
|
|
||||||
"version": "1.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/typescript-loader/-/typescript-loader-1.1.3.tgz",
|
|
||||||
"integrity": "sha1-X/fmfLO6WSUZAUqswar2ZqcJ3gE=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"bluebird": "2.11.0",
|
|
||||||
"loader-utils": "0.2.17",
|
|
||||||
"object-assign": "2.1.1",
|
|
||||||
"typescript": "1.8.10"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"bluebird": {
|
|
||||||
"version": "2.11.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz",
|
|
||||||
"integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"loader-utils": {
|
|
||||||
"version": "0.2.17",
|
|
||||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
|
|
||||||
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"big.js": "3.2.0",
|
|
||||||
"emojis-list": "2.1.0",
|
|
||||||
"json5": "0.5.1",
|
|
||||||
"object-assign": "4.1.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"object-assign": {
|
|
||||||
"version": "4.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
|
||||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"object-assign": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
|
|
||||||
"integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"typescript": {
|
|
||||||
"version": "1.8.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-1.8.10.tgz",
|
|
||||||
"integrity": "sha1-tHXW4N/wv1DyluXKbvn7tccyDx4=",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"typings-for-css-modules-loader": {
|
"typings-for-css-modules-loader": {
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/typings-for-css-modules-loader/-/typings-for-css-modules-loader-1.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/typings-for-css-modules-loader/-/typings-for-css-modules-loader-1.7.0.tgz",
|
||||||
@@ -14425,35 +13805,6 @@
|
|||||||
"indexof": "0.0.1"
|
"indexof": "0.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"vue-parser": {
|
|
||||||
"version": "1.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/vue-parser/-/vue-parser-1.1.6.tgz",
|
|
||||||
"integrity": "sha512-v3/R7PLbaFVF/c8IIzWs1HgRpT2gN0dLRkaLIT5q+zJGVgmhN4VuZJF4Y9N4hFtFjS4B1EHxAOP6/tzqM4Ug2g==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"parse5": "3.0.3"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"parse5": {
|
|
||||||
"version": "3.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
|
|
||||||
"integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@types/node": "9.4.7"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"w3c-hr-time": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
|
|
||||||
"integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"browser-process-hrtime": "0.1.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"watchpack": {
|
"watchpack": {
|
||||||
"version": "1.5.0",
|
"version": "1.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz",
|
||||||
@@ -14474,12 +13825,6 @@
|
|||||||
"minimalistic-assert": "1.0.0"
|
"minimalistic-assert": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"webidl-conversions": {
|
|
||||||
"version": "4.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
|
|
||||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"webpack": {
|
"webpack": {
|
||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.3.0.tgz",
|
||||||
@@ -15253,32 +14598,12 @@
|
|||||||
"integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
|
"integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"whatwg-encoding": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"iconv-lite": "0.4.19"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"whatwg-fetch": {
|
"whatwg-fetch": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
|
||||||
"integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=",
|
"integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"whatwg-url": {
|
|
||||||
"version": "6.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
|
|
||||||
"integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"lodash.sortby": "4.7.0",
|
|
||||||
"tr46": "1.0.1",
|
|
||||||
"webidl-conversions": "4.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"whet.extend": {
|
"whet.extend": {
|
||||||
"version": "0.9.9",
|
"version": "0.9.9",
|
||||||
"resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
|
"resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
|
||||||
@@ -15560,12 +14885,6 @@
|
|||||||
"integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=",
|
"integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"xml-name-validator": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"xtend": {
|
"xtend": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
|
||||||
|
|||||||
11
package.json
11
package.json
@@ -41,11 +41,9 @@
|
|||||||
"babel-plugin-transform-react-remove-prop-types": "^0.4.13",
|
"babel-plugin-transform-react-remove-prop-types": "^0.4.13",
|
||||||
"babel-preset-env": "^1.6.1",
|
"babel-preset-env": "^1.6.1",
|
||||||
"babel-register": "^6.26.0",
|
"babel-register": "^6.26.0",
|
||||||
"chalk": "^2.3.2",
|
|
||||||
"clean-webpack-plugin": "^0.1.19",
|
"clean-webpack-plugin": "^0.1.19",
|
||||||
"copy-webpack-plugin": "^4.5.1",
|
"copy-webpack-plugin": "^4.5.1",
|
||||||
"css-loader": "^0.28.11",
|
"css-loader": "^0.28.11",
|
||||||
"ejs-loader": "^0.3.1",
|
|
||||||
"eslint": "^4.18.2",
|
"eslint": "^4.18.2",
|
||||||
"eslint-config-standard": "^11.0.0",
|
"eslint-config-standard": "^11.0.0",
|
||||||
"eslint-config-standard-jsx": "^5.0.0",
|
"eslint-config-standard-jsx": "^5.0.0",
|
||||||
@@ -54,19 +52,13 @@
|
|||||||
"eslint-plugin-promise": "^3.7.0",
|
"eslint-plugin-promise": "^3.7.0",
|
||||||
"eslint-plugin-react": "^7.7.0",
|
"eslint-plugin-react": "^7.7.0",
|
||||||
"eslint-plugin-standard": "^3.0.1",
|
"eslint-plugin-standard": "^3.0.1",
|
||||||
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
|
||||||
"fork-ts-checker-notifier-webpack-plugin": "^0.4.0",
|
|
||||||
"fork-ts-checker-webpack-plugin": "^0.4.1",
|
|
||||||
"html-webpack-plugin": "^3.0.6",
|
"html-webpack-plugin": "^3.0.6",
|
||||||
"if-env": "^1.0.4",
|
"if-env": "^1.0.4",
|
||||||
"jsdom": "^11.5.1",
|
|
||||||
"loader-utils": "^1.1.0",
|
"loader-utils": "^1.1.0",
|
||||||
"memory-fs": "^0.4.1",
|
|
||||||
"mini-css-extract-plugin": "^0.3.0",
|
"mini-css-extract-plugin": "^0.3.0",
|
||||||
"node-sass": "^4.7.2",
|
"node-sass": "^4.7.2",
|
||||||
"optimize-css-assets-webpack-plugin": "^4.0.0",
|
"optimize-css-assets-webpack-plugin": "^4.0.0",
|
||||||
"preact-render-to-string": "^3.7.0",
|
"preload-webpack-plugin": "^3.0.0-alpha.3",
|
||||||
"preload-webpack-plugin": "github:GoogleChromeLabs/preload-webpack-plugin",
|
|
||||||
"progress-bar-webpack-plugin": "^1.11.0",
|
"progress-bar-webpack-plugin": "^1.11.0",
|
||||||
"raw-loader": "^0.5.1",
|
"raw-loader": "^0.5.1",
|
||||||
"sass-loader": "^6.0.7",
|
"sass-loader": "^6.0.7",
|
||||||
@@ -78,7 +70,6 @@
|
|||||||
"tslint-config-semistandard": "^7.0.0",
|
"tslint-config-semistandard": "^7.0.0",
|
||||||
"tslint-react": "^3.5.1",
|
"tslint-react": "^3.5.1",
|
||||||
"typescript": "^2.7.2",
|
"typescript": "^2.7.2",
|
||||||
"typescript-loader": "^1.1.3",
|
|
||||||
"typings-for-css-modules-loader": "^1.7.0",
|
"typings-for-css-modules-loader": "^1.7.0",
|
||||||
"webpack": "^4.3.0",
|
"webpack": "^4.3.0",
|
||||||
"webpack-bundle-analyzer": "^2.11.1",
|
"webpack-bundle-analyzer": "^2.11.1",
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ const PreloadPlugin = require('preload-webpack-plugin');
|
|||||||
const ReplacePlugin = require('webpack-plugin-replace');
|
const ReplacePlugin = require('webpack-plugin-replace');
|
||||||
const CopyPlugin = require('copy-webpack-plugin');
|
const CopyPlugin = require('copy-webpack-plugin');
|
||||||
const WorkboxPlugin = require('workbox-webpack-plugin');
|
const WorkboxPlugin = require('workbox-webpack-plugin');
|
||||||
const CrittersPlugin = require('./config/critters-webpack-plugin');
|
|
||||||
const WatchTimestampsPlugin = require('./config/watch-timestamps-plugin');
|
const WatchTimestampsPlugin = require('./config/watch-timestamps-plugin');
|
||||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
||||||
|
|
||||||
@@ -165,7 +164,7 @@ module.exports = function (_, env) {
|
|||||||
// For now we're not doing SSR.
|
// For now we're not doing SSR.
|
||||||
new HtmlPlugin({
|
new HtmlPlugin({
|
||||||
filename: path.join(__dirname, 'build/index.html'),
|
filename: path.join(__dirname, 'build/index.html'),
|
||||||
template: '!' + path.join(__dirname, 'config/prerender-loader') + '?string' + (isProd ? '' : '&disabled') + '!src/index.html',
|
template: 'src/index.html',
|
||||||
minify: isProd && {
|
minify: isProd && {
|
||||||
collapseWhitespace: true,
|
collapseWhitespace: true,
|
||||||
removeScriptTypeAttributes: true,
|
removeScriptTypeAttributes: true,
|
||||||
@@ -187,19 +186,6 @@ module.exports = function (_, env) {
|
|||||||
include: 'initial'
|
include: 'initial'
|
||||||
}),
|
}),
|
||||||
|
|
||||||
isProd && new CrittersPlugin({
|
|
||||||
// Don't inline fonts into critical CSS, but do preload them:
|
|
||||||
preloadFonts: true,
|
|
||||||
// convert critical'd <link rel="stylesheet"> to <link rel="preload" as="style">:
|
|
||||||
async: true,
|
|
||||||
// Use media hack to load async (<link media="only x" onload="this.media='all'">):
|
|
||||||
media: true
|
|
||||||
// // use a $loadcss async CSS loading shim (DOM insertion to head)
|
|
||||||
// preload: 'js'
|
|
||||||
// // copy original <link rel="stylesheet"> to the end of <body>:
|
|
||||||
// preload: true
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Inline constants during build, so they can be folded by UglifyJS.
|
// Inline constants during build, so they can be folded by UglifyJS.
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
// We set node.process=false later in this config.
|
// We set node.process=false later in this config.
|
||||||
|
|||||||
Reference in New Issue
Block a user