├── .gitignore
├── aprender
├── src
│ ├── mount.js
│ ├── aprender.js
│ ├── createElement.js
│ ├── render.js
│ ├── patch.js
│ └── diff.js
├── package-lock.json
├── demo
│ ├── index.html
│ └── index.js
├── package.json
└── tests
│ └── index.js
├── examinar
├── package.json
├── package-lock.json
└── src
│ ├── assertions
│ ├── index.js
│ └── deep-equal.js
│ ├── index.js
│ └── mock-dom.js
├── maleta
├── package.json
├── bin
│ └── cli.js
├── src
│ └── bundler.js
└── package-lock.json
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | */node_modules
2 | node_modules
3 | .DS_Store
4 | dist
5 | blogs/
--------------------------------------------------------------------------------
/aprender/src/mount.js:
--------------------------------------------------------------------------------
1 | module.exports = function mount($app, $root) {
2 | return $root.appendChild($app);
3 | }
--------------------------------------------------------------------------------
/aprender/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aprender",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1
5 | }
6 |
--------------------------------------------------------------------------------
/examinar/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "examinar",
3 | "main": "src/index.js",
4 | "dependencies": {
5 | "colors": "^1.3.3"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/aprender/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Hello, World
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/aprender/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "aprender",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "",
6 | "scripts": {
7 | "test": "node tests",
8 | "demo": "maleta demo/index.html"
9 | },
10 | "dependencies": {}
11 | }
12 |
--------------------------------------------------------------------------------
/aprender/src/aprender.js:
--------------------------------------------------------------------------------
1 | const createElement = require('./createElement');
2 | const render = require('./render');
3 | const mount = require('./mount');
4 | const diff = require('./diff');
5 | const patch = require('./patch');
6 |
7 | module.exports = {
8 | createElement,
9 | render,
10 | mount,
11 | diff,
12 | patch
13 | };
--------------------------------------------------------------------------------
/examinar/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "examinar",
3 | "requires": true,
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "colors": {
7 | "version": "1.3.3",
8 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
9 | "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg=="
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/aprender/src/createElement.js:
--------------------------------------------------------------------------------
1 | module.exports = function createElement (type, opts) {
2 | if (type == null || typeof type !== 'string') {
3 | throw Error('The element type must be a string');
4 | }
5 |
6 | if (arguments[1] !== undefined && Object.prototype.toString.call(opts) !== '[object Object]') {
7 | throw Error('The options argument must be an object');
8 | }
9 |
10 | const { attrs = {}, children = [] } = opts || {};
11 |
12 | return {
13 | type,
14 | attrs,
15 | children
16 | }
17 | }
--------------------------------------------------------------------------------
/maleta/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "maleta",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "",
6 | "scripts": {
7 | "build": "node src/bundler.js"
8 | },
9 | "bin": {
10 | "maleta": "bin/cli.js"
11 | },
12 | "dependencies": {
13 | "@babel/core": "^7.5.0",
14 | "@babel/preset-env": "^7.5.4",
15 | "babel-traverse": "^6.26.0",
16 | "babylon": "^6.18.0",
17 | "chalk": "^2.4.2",
18 | "commander": "^2.20.0",
19 | "finalhandler": "^1.1.2",
20 | "http": "0.0.0",
21 | "posthtml": "^0.11.4",
22 | "posthtml-parser": "^0.4.1",
23 | "posthtml-render": "^1.1.5",
24 | "serve-static": "^1.14.1"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/aprender/src/render.js:
--------------------------------------------------------------------------------
1 | const EventDictionary = {
2 | handleEvent (evt) {
3 | const eventHandler = this[`on${evt.type}`];
4 | const result = eventHandler.call(evt.currentTarget, evt);
5 |
6 | if (result === false) {
7 | evt.preventDefault();
8 | evt.stopPropagation();
9 | }
10 | }
11 | }
12 |
13 | function renderElement({ type, attrs, children }) {
14 | const $el = document.createElement(type);
15 |
16 | for (const [attribute, value] of Object.entries(attrs)) {
17 | if (attribute[0] === 'o' && attribute[1] === 'n') {
18 | const events = Object.create(EventDictionary);
19 | $el.addEventListener(attribute.slice(2), events)
20 | events[attribute] = value;
21 | }
22 |
23 | $el.setAttribute(attribute, value);
24 | }
25 | for (const child of children) {
26 | $el.appendChild(render(child));
27 | }
28 |
29 | return $el;
30 | };
31 |
32 | function render(vNode) {
33 | if (typeof vNode === 'string') {
34 | return document.createTextNode(vNode);
35 | }
36 |
37 | return renderElement(vNode);
38 | };
39 |
40 | module.exports = render;
--------------------------------------------------------------------------------
/maleta/bin/cli.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | const program = require('commander');
4 | const version = require('../package.json').version;
5 | const bundler = require('../src/bundler');
6 |
7 | program.version(version);
8 |
9 | program
10 | .command('serve ')
11 | .description('serves the files')
12 | .option(
13 | '--entry ',
14 | 'set the name of the entry JS file'
15 | )
16 | .action(bundle);
17 |
18 | program
19 | .command('help [command]')
20 | .description('display help information for a command')
21 | .action(function(command) {
22 | let cmd = program.commands.find(c => c.name() === command) || program;
23 | cmd.help();
24 | });
25 |
26 | const args = process.argv;
27 |
28 | // Make serve the default command except for --help
29 | if (args[2] === '--help' || args[2] === '-h') args[2] = 'help';
30 | if (!args[2] || !program.commands.some(c => c.name() === args[2])) args.splice(2, 0, 'serve');
31 |
32 | program.parse(process.argv);
33 |
34 | function bundle (entryFile, command) {
35 | bundler(entryFile, {
36 | entryJsFile: command.entry
37 | });
38 | }
--------------------------------------------------------------------------------
/examinar/src/assertions/index.js:
--------------------------------------------------------------------------------
1 | const deepEqual = require('./deep-equal');
2 |
3 | module.exports = {
4 | isDeeplyEqual(a, b) {
5 | if (deepEqual(a, b)) return true;
6 |
7 | throw new Error(`The values are not deeply identical.\n\nFound: ${
8 | JSON.stringify(a, null, 4)}\nWanted: ${JSON.stringify(b, null, 4)}
9 | `)
10 | },
11 | throws(fn, errMsg = '') {
12 | const didNotThrowErr = new Error('The supplied function didn\'t throw an error');
13 |
14 | try {
15 | fn();
16 | throw didNotThrowErr;
17 | } catch (e) {
18 | if (e === didNotThrowErr) throw didNotThrowErr;
19 |
20 | if (!errMsg || e.message === errMsg) return true;
21 |
22 | throw new Error(`\n\nFound: ${e.message}\nWanted: ${errMsg}\n\n`);
23 | }
24 | },
25 | isDomElement(element) {
26 | if (element.hasOwnProperty("$$dom") && element.$$dom) return true;
27 |
28 | throw new Error('The supplied element is not a DOM element')
29 | },
30 | isMounted(element, parentElement) {
31 | if (parentElement.childNodes.length > 1) throw new Error('The root element has more than one child');
32 |
33 | if (parentElement.childNodes[0] === element) return true;
34 |
35 | throw new Error('The supplied element has not been mounted');
36 | }
37 | }
--------------------------------------------------------------------------------
/examinar/src/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const colors = require('colors');
4 | const assert = require('./assertions');
5 | const createMockDom = require('./mock-dom');
6 |
7 | const repeat = (str, n) => Array(n).join(str);
8 | const indent = n => repeat(' ', n);
9 | const indentLines = (str, n) => indent(n) + str.replace(/\n/g, `\n${indent(n)}`);
10 | const log = str => console.log(str);
11 | const summary = { success: 0, fail: 0, disabled: 0 };
12 |
13 | let indentLevel = 0;
14 |
15 | // Hooks
16 | const beforeAll = (fn) => fn();
17 |
18 | function group(title, fn) {
19 | indentLevel++;
20 | log(`\n${indent(indentLevel)}⇨ ${title}`.yellow);
21 | fn();
22 | indentLevel--;
23 | }
24 |
25 | function check(title, fn) {
26 | try {
27 | fn();
28 | log(`${indent(indentLevel + 1)}${' OK '.bgGreen.black} ${title.green}`);
29 | summary.success++;
30 | } catch (e) {
31 | log(`${indent(indentLevel + 1)}${' FAIL '.bgRed.black} ${title.red}`);
32 | log(indentLines(e.message.red, indentLevel + 1));
33 | log(indentLines(e.stack.red, indentLevel + 1));
34 | summary.fail++;
35 | }
36 | }
37 |
38 | function xcheck(title) {
39 | log(`${indent(indentLevel + 1)}${' DISABLED '.bgWhite.black} ${title.gray}`);
40 | summary.disabled++;
41 | }
42 |
43 | function end() {
44 | log(`\n${repeat('.', 60)}\n`);
45 | log('Test summary:\n');
46 | log(` Success: ${summary.success}`.green);
47 | log(` Fail: ${summary.fail}`.red);
48 | log(` Disabled: ${summary.disabled}\n\n`.gray);
49 |
50 | if (summary.fail > 0 ) process.exit(1);
51 | process.exit(0);
52 | }
53 |
54 | module.exports = { assert, check, end, group, createMockDom, beforeAll, xcheck };
--------------------------------------------------------------------------------
/aprender/tests/index.js:
--------------------------------------------------------------------------------
1 | const { assert, group, check, end, createMockDom, beforeAll } = require('examinar');
2 | const createElement = require('../src/createElement');
3 | const render = require('../src/render');
4 | const mount = require('../src/mount');
5 |
6 | group('aprender', () => {
7 | let $root;
8 | let element;
9 | let app;
10 |
11 | beforeAll(() => {
12 | element = createElement('div', {
13 | children: [
14 | createElement('h1', { children: ['Hello, World'] }),
15 | createElement('button', { children: ['Click Me!'] }),
16 | ]
17 | });
18 |
19 | createMockDom();
20 |
21 | $root = document.createElement("div");
22 | $root.setAttribute('id', 'root');
23 | document.body.appendChild($root);
24 |
25 | app = render(element);
26 |
27 | });
28 |
29 | check('it creates a virtual dom object', () => {
30 | const target = createElement('div', { children: [{ type: 'div'}] });
31 | const copy = { type: 'div', attrs: {}, children: [{ type: 'div'}] };
32 | assert.isDeeplyEqual(target, copy);
33 | });
34 |
35 | check('it throws errors when a string is not specified as the first argument', () => {
36 | const err = () => createElement(1, null);
37 | assert.throws(err, 'The element type must be a string');
38 | });
39 |
40 | check('it throws errors when the options argument is not an object', () => {
41 | const err = () => createElement('h1', null);
42 | assert.throws(err, 'The options argument must be an object');
43 | });
44 |
45 | check('it creates DOM elements', () => {
46 | assert.isDomElement(app);
47 | });
48 |
49 | check('it mounts DOM elements', () => {
50 | mount(app, document.getElementById('root'));
51 |
52 | assert.isMounted(app, $root);
53 | });
54 | });
55 |
56 | end();
--------------------------------------------------------------------------------
/aprender/src/patch.js:
--------------------------------------------------------------------------------
1 | const render = require('./render');
2 |
3 | /**
4 | * @param {HTML element} rootDomNode - the HTML element being updated
5 | * @param {object} patches - the object which contains the changes being made
6 | * @return {void}
7 | */
8 | function patch(rootDomNode, patches) {
9 | // keep track of where we are in the process
10 | const index = 0;
11 | performPatches(rootDomNode, patches, index)
12 | }
13 |
14 | /**
15 | * @param {HTML element} node - the HTML element being updated
16 | * @param {object} patches - the object which contains the changes being made
17 | * @param {index} index - a counter to store where we are in the process
18 | * @return {void}
19 | */
20 | function performPatches(node, patches, index) {
21 | const currentPatches = patches[index];
22 |
23 | // does this node have any children?
24 | if (node.childNodes) {
25 | node.childNodes.forEach(node => {
26 | index++
27 | performPatches(node, patches, index)
28 | });
29 | }
30 |
31 | if (currentPatches) {
32 | applyPatches(node, currentPatches)
33 | }
34 | }
35 |
36 | /**
37 | * @param {HTML element} node - the HTML element being updated
38 | * @param {object} currentPatches - the object which contains the changes being made in the current iteration
39 | * @return {void}
40 | */
41 | function applyPatches(node, currentPatches) {
42 | currentPatches.forEach(patch => {
43 | switch (patch.type) {
44 | case 'TEXT': {
45 | if (node.textContent) {
46 | node.textContent = patch.content
47 | }
48 | break;
49 | }
50 | case 'REPLACE': {
51 | const newNode = render(patch.node);
52 | node.parentNode.replaceChild(newNode, node);
53 | break;
54 | }
55 | }
56 | })
57 | }
58 |
59 | module.exports = patch
--------------------------------------------------------------------------------
/examinar/src/assertions/deep-equal.js:
--------------------------------------------------------------------------------
1 | function getLengthAndType(obj) {
2 | if (Object.prototype.toString.call(obj) === '[object Array]') {
3 | return { type: "array", length: obj.length }
4 | }
5 |
6 | if (Object.prototype.toString.call(obj) === '[object Object]') {
7 | return { type: "object", length: Object.keys(obj).length }
8 | }
9 |
10 | return null;
11 | }
12 |
13 | function deepEqual(obj, comparisonObj) {
14 | const objInfo = getLengthAndType(obj);
15 | const comparisonObjInfo = getLengthAndType(comparisonObj);
16 |
17 | // only go forward with arrays or objects
18 | if ( !objInfo || !comparisonObjInfo) {
19 | return false
20 | }
21 |
22 | if (objInfo.length !== comparisonObjInfo.length || objInfo.type !== comparisonObjInfo.type) {
23 | return false
24 | }
25 |
26 | const compare = (val, comparisonVal) => {
27 | const isArrayOrObject = getLengthAndType(val);
28 | const isFunction = Object.prototype.toString.call(val) === '[object Function]';
29 |
30 | if (isArrayOrObject) {
31 | if (!deepEqual(val, comparisonVal)) return false;
32 | }
33 |
34 | else {
35 | if (isFunction) {
36 | if (val.toString() !== comparisonVal.toString()) return false;
37 | } else {
38 | if (val !== comparisonVal) return false; // we are comparing primitive values
39 | }
40 | }
41 | };
42 |
43 | if (objInfo.type === 'array') {
44 | for (var i = 0; i < objInfo.length; i++) {
45 | if (compare(obj[i], comparisonObj[i]) === false) return false;
46 | }
47 | } else {
48 | for (let [key] of Object.entries(obj)) {
49 | if (compare(obj[key], comparisonObj[key]) === false) return false;
50 | }
51 | }
52 |
53 | return true; // nothing failed
54 | }
55 |
56 | module.exports = deepEqual;
--------------------------------------------------------------------------------
/examinar/src/mock-dom.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const document = {
4 | _elementIds: {},
5 | createElement(tag) {
6 | const element = {
7 | nodeType: 1,
8 | nodeName: tag.toUpperCase(),
9 | parentNode: null,
10 | childNodes: [],
11 | appendChild,
12 | setAttribute,
13 | attributes: {},
14 | $$dom: true
15 | };
16 |
17 | return element;
18 | },
19 | createTextNode(text) {
20 | return {
21 | nodeType: 3,
22 | nodeName: "#text",
23 | parentNode: null,
24 | data: text
25 | }
26 | },
27 | getElementById(id) {
28 | if (document._elementIds[id]) {
29 | return document._elementIds[id]
30 | }
31 |
32 | return null;
33 | }
34 | }
35 |
36 | function appendChild(child) {
37 | let ancestor = this;
38 |
39 | if (ancestor === child) throw new Error("Child element cannot be equal to parent element");
40 | if (child.nodeType == null) throw new Error("The child is not a DOM element");
41 |
42 | const index = this.childNodes.indexOf(child);
43 | if (index > -1 ) this.childNodes.splice(index, 1);
44 |
45 | this.childNodes.push(child);
46 | child.parentNode = ancestor;
47 | }
48 |
49 | function setAttribute(name, value) {
50 | this.attributes[name] = value;
51 |
52 | if (name === 'id') {
53 | if (document._elementIds[value]) {
54 | throw new Error(`${value} is already the id of an existing element`);
55 | }
56 | document._elementIds[value] = this;
57 | }
58 | }
59 |
60 | function createMockDom() {
61 | document.documentElement = document.createElement("html");
62 | document.documentElement.appendChild(document.createElement("head"));
63 | document.body = document.createElement("body");
64 | document.documentElement.appendChild(document.body);
65 |
66 | global.document = document;
67 | }
68 |
69 | module.exports = createMockDom;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Learn JavaScript By Building A UI Framework
2 |
3 | ## What Is This?
4 |
5 | A project similar to [this](https://github.com/taniarascia/laconia). They say one of the best ways is to learn is by doing. Well, this is just that. There are so many tools used in frontend development and this is my attempt at learning some of them from a first principles approach. I am building basic, non-production versions of various parts of the frontend stack and documenting the lessons learned in the process.
6 |
7 | The articles written in the series so far are:
8 |
9 | - [Introduction to the UI framework](https://dev.to/carlmungazi/learning-javascript-by-building-a-ui-framework-from-scratch-1767)
10 | - [Building a testing library](https://dev.to/carlmungazi/learn-js-by-building-a-ui-framework-part-2-testing-3pff)
11 | - [Rendering and testing DOM elements](https://dev.to/carlmungazi/learn-javascript-by-building-a-ui-framework-part-3-rendering-testing-dom-elements-97l)
12 | - [Building a module bundler](https://dev.to/carlmungazi/learn-javascript-by-building-a-ui-framework-part-4-creating-a-module-bundler-11el)
13 | - [Adding events to DOM elements](https://dev.to/carlmungazi/learn-javascript-by-building-a-ui-framework-part-5-adding-events-to-dom-elements-3kod)
14 | - [Intro to virtual dom algorithms](https://dev.to/carlmungazi/learn-javascript-by-building-a-ui-framework-part-6-intro-to-virtual-dom-algorithms-jcm)
15 |
16 | Whilst not part of the series, [this](https://www.smashingmagazine.com/2019/07/javascript-knowledge-reading-source-code/#comments-javascript-knowledge-reading-source-code) article I wrote for Smashing Magazine explains some of the benefits of this project.
17 |
18 | ## Aprender
19 |
20 | Aprender is the UI framework and it is built using the virtual DOM paradigm. It contains the following features:
21 | - Turning JavaScript objects into DOM elements
22 | - Adding [on-event](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Event_handlers) handlers to DOM elements
23 | - Very basic virtual dom algorithm
24 |
25 | ## Examinar
26 |
27 | Examinar is a testing framework not modelled upon anything in particular. It has the following features:
28 | - Assertions
29 | - A DOM implementation for the node environment
30 |
31 | ## Maleta
32 |
33 | Maleta is a module bundler which builds upon the work of [Minipack](https://github.com/ronami/minipack). It has the following features:
34 | - Bundles both ES and CommonJS modules
35 | - CLI tool
36 | - Built-in dev server
--------------------------------------------------------------------------------
/aprender/src/diff.js:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | * @param {object} oldChildren - the current child tree
4 | * @param {object} newChildren - the new child tree
5 | * @param {object} patches - the object which stores the changes between the trees
6 | * @param {index} index - a counter to store where we are in the process
7 | */
8 | function diffChildren(oldChildren, newChildren, patches, index) {
9 | oldChildren.forEach((oldChild, idx) => {
10 | index++
11 | performDiff(oldChild, newChildren[idx], patches, index)
12 | })
13 | }
14 |
15 | /**
16 | *
17 | * @param {object} oldTree - the current virtual dom tree
18 | * @param {object} newTree - the new virtual dom tree
19 | * @return {object} patches - an object containing the differences between the two trees
20 | */
21 | function diff(oldTree, newTree) {
22 | // store the differences between the two trees
23 | const patches = {};
24 | // keep track of where we are in the process
25 | const index = 0;
26 | performDiff(oldTree, newTree, patches, index)
27 |
28 | return patches;
29 | }
30 |
31 | /**
32 | *
33 | * @param {object} oldTree - the current virtual dom tree
34 | * @param {object} newTree - the new virtual dom tree
35 | * @param {object} patches - the object which stores the changes between the trees
36 | * @param {index} index - a counter to store where we are in the process
37 | */
38 | function performDiff(oldTree, newTree, patches, index) {
39 | // if we are in a recursive call, we need to keep track of the changes that
40 | // need to be made
41 | const currentPatch = [];
42 |
43 | if (newTree === undefined) {
44 | // we do nothing here because the final else statement will deal with it
45 | } else if (typeof oldTree === 'string' && typeof newTree === 'string') { // are we deal with text nodes?
46 | if (oldTree !== newTree) {
47 | // the trees are both strings with different values
48 | currentPatch.push({
49 | type: 'TEXT',
50 | content: newTree
51 | })
52 | }
53 | } else if (oldTree.type === newTree.type) {
54 | // what if only one of them has children?
55 |
56 | // let us work on the children
57 | diffChildren(oldTree.children, newTree.children, patches, index)
58 | } else {
59 | // the trees are different, so out with the old and in with the new
60 | currentPatch.push({
61 | type: 'REPLACE',
62 | node: newTree
63 | })
64 | }
65 |
66 | // we have changes which need to be recorded
67 | if (currentPatch.length) {
68 | patches[index] = currentPatch
69 | }
70 | }
71 |
72 | module.exports = diff
--------------------------------------------------------------------------------
/aprender/demo/index.js:
--------------------------------------------------------------------------------
1 | // - As a user, I can view the search app - DONE
2 | // - As a user, I can select an API - DONE
3 | // - As a user, after selecting an API, I can view information explaining the API and what search parameters I can use
4 | // - As a user, I can type in the search field and click the search button
5 | // - As a user, after clicking the search button I can view the search results
6 | // - As a user, I can clear the search results
7 |
8 | /* BEGINNING OF TEST */
9 |
10 | const aprender = require('../src/aprender');
11 |
12 | const oldTree = aprender.createElement('div', {
13 | children: ['Search', aprender.createElement('p')]
14 | }
15 | );
16 |
17 | const newTree = aprender.createElement('div', {
18 | children: ['No Search', aprender.createElement('span')]
19 | }
20 | );
21 |
22 | const root = aprender.render(oldTree)
23 | aprender.mount(root, document.getElementById('app'))
24 |
25 | const diff = aprender.diff(oldTree, newTree);
26 |
27 | setTimeout(() => {
28 | aprender.patch(root, diff);
29 | }, 5000)
30 |
31 | /* END OF TEST */
32 |
33 | // const aprender = require('../src/aprender');
34 |
35 | // const Button = aprender.createElement('button', {
36 | // attrs: {
37 | // type: 'submit'
38 | // },
39 | // children: ['Search']
40 | // }
41 | // );
42 |
43 | // const Search = aprender.createElement('input', {
44 | // attrs: {
45 | // type: 'search',
46 | // oninput: (e) => console.log(e.target.value)
47 | // }
48 | // });
49 |
50 | // const Form = aprender.createElement('form', {
51 | // attrs: {
52 | // id: 'form',
53 | // onsubmit: (e) => {
54 | // e.preventDefault();
55 | // console.log('I am being submitted..')
56 | // }
57 | // },
58 | // children: [
59 | // Search,
60 | // Button
61 | // ]
62 | // },
63 | // );
64 |
65 | // const Dropdown = aprender.createElement('select', {
66 | // attrs: {
67 | // onchange: (e) => console.log(e.target.value)
68 | // },
69 | // children: [
70 | // aprender.createElement('option', {
71 | // children: ['--Please select an API--']
72 | // }),
73 | // aprender.createElement('option', {
74 | // children: ['API 1']
75 | // }),
76 | // aprender.createElement('option', {
77 | // children: ['API 2']
78 | // })
79 | // ]
80 | // });
81 |
82 | // const SelectAPI = aprender.createElement('div', {
83 | // children: [
84 | // aprender.createElement('h3', { children: ['Select API: ']}),
85 | // Dropdown
86 | // ]
87 | // })
88 |
89 | // const InfoBox = description => aprender.createElement('div', {
90 | // children: [
91 | // aprender.createElement('p', {
92 | // children: [
93 | // 'The description goes here'
94 | // ]
95 | // })
96 | // ]
97 | // })
98 |
99 | // const Container = () => {
100 | // return aprender.createElement('div', {
101 | // children: [
102 | // InfoBox(),
103 | // SelectAPI,
104 | // Form
105 | // ]
106 | // })
107 | // }
108 |
109 | // const App = aprender.render(Container());
110 |
111 | // aprender.mount(App, document.getElementById('app'));
--------------------------------------------------------------------------------
/maleta/src/bundler.js:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk');
2 | const fs = require('fs');
3 | const path = require('path');
4 | const htmlParser = require('posthtml-parser');
5 | const htmlRender = require('posthtml-render');
6 | const { walk } = require('posthtml/lib/api');
7 | const babylon = require('babylon');
8 | const traverse = require('babel-traverse').default;
9 | const { transformFromAstSync } = require('@babel/core');
10 | const http = require('http');
11 | const serveStatic = require('serve-static');
12 | const finalhandler = require('finalhandler');
13 |
14 | let moduleID = 0;
15 | const rootAsset = {
16 | outDir: '',
17 | content: '',
18 | entryJsFilePath: '',
19 | rootDir: '',
20 | dependencyGraph: '',
21 | ast: ''
22 | }
23 |
24 | function getRootDir(file) {
25 | const parsed = path.parse(file);
26 |
27 | return path.resolve(parsed.dir);
28 | }
29 |
30 | function extractEntryJSFilePathFromEntryFile(rootAsset) {
31 | const parsedHTML = htmlParser(rootAsset.content);
32 |
33 | rootAsset.ast = parsedHTML;
34 | parsedHTML.walk = walk;
35 |
36 | parsedHTML.walk(node => {
37 | if (node.tag === 'script') {
38 | if (node.attrs.src.endsWith('/index.js')) {
39 | rootAsset.entryJsFilePath = path.resolve(rootAsset.rootDir, node.attrs.src)
40 | }
41 | }
42 |
43 | return node;
44 | });
45 |
46 | if (!rootAsset.entryJsFilePath) throw Error('No JavaScript entry file has been provided or specified. Either specify an entry file or make sure the entry file is named \'index.js\'');
47 | }
48 |
49 | function createRootAssetFromEntryFile(file, config) {
50 | // read the contents of the file
51 | rootAsset.content = fs.readFileSync(file, 'utf-8');
52 | // find root directory
53 | rootAsset.rootDir = getRootDir(file);
54 | // create path to output directory
55 | rootAsset.outDir = path.resolve('dist');
56 | // find path for entry js file
57 | if (config.entryJsFile) {
58 | rootAsset.ast = htmlParser(rootAsset.content);
59 | rootAsset.entryJsFilePath = path.resolve(rootAsset.rootDir, config.entryJsFile);
60 | } else {
61 | extractEntryJSFilePathFromEntryFile(rootAsset);
62 | }
63 |
64 | // create dependency graph
65 | rootAsset.dependencyGraph = createDependencyGraph(rootAsset.entryJsFilePath);
66 |
67 | return rootAsset;
68 | }
69 |
70 | // using the entry js file from the entry html file, extract all the dependencies
71 | function createDependencyGraph(entryFile) {
72 |
73 | const mainAsset = createJSAsset(entryFile);
74 |
75 | const assetQueue = [ mainAsset ];
76 |
77 | for ( asset of assetQueue ) {
78 | const dirname = path.dirname(asset.filename);
79 |
80 | asset.relativeFilePathsOfDependenciesArray.forEach(filePath => {
81 | // we only deal with JS files, so we assume it here
82 | // plus we get this from the traverse module
83 | const absolutePath = path.join(dirname, `${filePath}.js`);
84 | const dependenciesOfFileBeingCurrentlyProcessed = createJSAsset(absolutePath);
85 |
86 | asset.mapping[filePath] = dependenciesOfFileBeingCurrentlyProcessed.id;
87 |
88 | assetQueue.push(dependenciesOfFileBeingCurrentlyProcessed);
89 | });
90 | }
91 |
92 | return assetQueue;
93 | }
94 |
95 | function createJSAsset(filename) {
96 | const content = fs.readFileSync(filename, 'utf-8');
97 | const ast = babylon.parse(content, { sourceType: 'module' });
98 |
99 | const relativeFilePathsOfDependenciesArray = [];
100 |
101 | traverse(ast, {
102 | ImportDeclaration({ node }) { // for es6 modules
103 | relativeFilePathsOfDependenciesArray.push(node.source.value)
104 | },
105 | CallExpression({ node }) { // for commonjs, based on parcel
106 | const { callee, arguments: args } = node;
107 | if (
108 | callee.name === 'require' &&
109 | args.length === 1 &&
110 | args[0].type === 'StringLiteral'
111 |
112 | ) {
113 | relativeFilePathsOfDependenciesArray.push(args[0].value)
114 | }
115 | }
116 | })
117 |
118 | const id = moduleID++;
119 |
120 | const { code } = transformFromAstSync(ast, null, {
121 | presets: ['@babel/env'],
122 | cwd: __dirname
123 | });
124 |
125 | return {
126 | id,
127 | code,
128 | filename,
129 | relativeFilePathsOfDependenciesArray,
130 | mapping: {}
131 | }
132 | }
133 |
134 | function createBundle(entryFile, config) {
135 | let modules = '';
136 | let bundle;
137 | const rootAsset = createRootAssetFromEntryFile(entryFile, config);
138 |
139 | const bundlePath = path.resolve(rootAsset.outDir, 'index.js');
140 | const bundleHtml = htmlRender(rootAsset.ast);
141 | const bundleHtmlPath = path.resolve(rootAsset.outDir, 'index.html');
142 |
143 |
144 | rootAsset.dependencyGraph.forEach(mod => {
145 | modules += `${mod.id}: [
146 | function (require, module, exports) {
147 | ${mod.code}
148 | },
149 | ${JSON.stringify(mod.mapping)},
150 | ],`;
151 | });
152 |
153 | bundle = `
154 | (function(modules) {
155 | function require(id) {
156 | const [fn, mapping] = modules[id];
157 |
158 | function localRequire(name) {
159 | return require(mapping[name]);
160 | }
161 |
162 | const module = { exports: {} };
163 |
164 | fn(localRequire, module, module.exports);
165 |
166 | return module.exports;
167 | }
168 |
169 | require(0);
170 | })({${modules}})
171 | `;
172 |
173 |
174 | // create the output directory if it does not exist
175 | if (!fs.existsSync(rootAsset.outDir)) {
176 | fs.mkdirSync(rootAsset.outDir);
177 | }
178 |
179 |
180 | // create output html and js files
181 | fs.writeFileSync(bundlePath, bundle);
182 | fs.writeFileSync(bundleHtmlPath, bundleHtml);
183 |
184 | // create server and serve files
185 | const serve = serveStatic(rootAsset.outDir);
186 | const server = http.createServer( function onRequest(req, res) {
187 | serve(req, res, finalhandler(req, res));
188 | });
189 |
190 | server.listen(3000);
191 | console.log(`${chalk.bold('Now serving the application on')} ${chalk.red('http://localhost:3000')}`);
192 |
193 | };
194 |
195 | module.exports = createBundle;
--------------------------------------------------------------------------------
/maleta/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "maleta",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.5.5",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
11 | "requires": {
12 | "@babel/highlight": "^7.0.0"
13 | }
14 | },
15 | "@babel/core": {
16 | "version": "7.5.5",
17 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz",
18 | "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==",
19 | "requires": {
20 | "@babel/code-frame": "^7.5.5",
21 | "@babel/generator": "^7.5.5",
22 | "@babel/helpers": "^7.5.5",
23 | "@babel/parser": "^7.5.5",
24 | "@babel/template": "^7.4.4",
25 | "@babel/traverse": "^7.5.5",
26 | "@babel/types": "^7.5.5",
27 | "convert-source-map": "^1.1.0",
28 | "debug": "^4.1.0",
29 | "json5": "^2.1.0",
30 | "lodash": "^4.17.13",
31 | "resolve": "^1.3.2",
32 | "semver": "^5.4.1",
33 | "source-map": "^0.5.0"
34 | }
35 | },
36 | "@babel/generator": {
37 | "version": "7.5.5",
38 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz",
39 | "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==",
40 | "requires": {
41 | "@babel/types": "^7.5.5",
42 | "jsesc": "^2.5.1",
43 | "lodash": "^4.17.13",
44 | "source-map": "^0.5.0",
45 | "trim-right": "^1.0.1"
46 | }
47 | },
48 | "@babel/helper-annotate-as-pure": {
49 | "version": "7.0.0",
50 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
51 | "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
52 | "requires": {
53 | "@babel/types": "^7.0.0"
54 | }
55 | },
56 | "@babel/helper-builder-binary-assignment-operator-visitor": {
57 | "version": "7.1.0",
58 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
59 | "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
60 | "requires": {
61 | "@babel/helper-explode-assignable-expression": "^7.1.0",
62 | "@babel/types": "^7.0.0"
63 | }
64 | },
65 | "@babel/helper-call-delegate": {
66 | "version": "7.4.4",
67 | "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
68 | "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
69 | "requires": {
70 | "@babel/helper-hoist-variables": "^7.4.4",
71 | "@babel/traverse": "^7.4.4",
72 | "@babel/types": "^7.4.4"
73 | }
74 | },
75 | "@babel/helper-define-map": {
76 | "version": "7.5.5",
77 | "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
78 | "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==",
79 | "requires": {
80 | "@babel/helper-function-name": "^7.1.0",
81 | "@babel/types": "^7.5.5",
82 | "lodash": "^4.17.13"
83 | }
84 | },
85 | "@babel/helper-explode-assignable-expression": {
86 | "version": "7.1.0",
87 | "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
88 | "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
89 | "requires": {
90 | "@babel/traverse": "^7.1.0",
91 | "@babel/types": "^7.0.0"
92 | }
93 | },
94 | "@babel/helper-function-name": {
95 | "version": "7.1.0",
96 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
97 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
98 | "requires": {
99 | "@babel/helper-get-function-arity": "^7.0.0",
100 | "@babel/template": "^7.1.0",
101 | "@babel/types": "^7.0.0"
102 | }
103 | },
104 | "@babel/helper-get-function-arity": {
105 | "version": "7.0.0",
106 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
107 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
108 | "requires": {
109 | "@babel/types": "^7.0.0"
110 | }
111 | },
112 | "@babel/helper-hoist-variables": {
113 | "version": "7.4.4",
114 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
115 | "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
116 | "requires": {
117 | "@babel/types": "^7.4.4"
118 | }
119 | },
120 | "@babel/helper-member-expression-to-functions": {
121 | "version": "7.5.5",
122 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
123 | "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
124 | "requires": {
125 | "@babel/types": "^7.5.5"
126 | }
127 | },
128 | "@babel/helper-module-imports": {
129 | "version": "7.0.0",
130 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
131 | "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
132 | "requires": {
133 | "@babel/types": "^7.0.0"
134 | }
135 | },
136 | "@babel/helper-module-transforms": {
137 | "version": "7.5.5",
138 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz",
139 | "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==",
140 | "requires": {
141 | "@babel/helper-module-imports": "^7.0.0",
142 | "@babel/helper-simple-access": "^7.1.0",
143 | "@babel/helper-split-export-declaration": "^7.4.4",
144 | "@babel/template": "^7.4.4",
145 | "@babel/types": "^7.5.5",
146 | "lodash": "^4.17.13"
147 | }
148 | },
149 | "@babel/helper-optimise-call-expression": {
150 | "version": "7.0.0",
151 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
152 | "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
153 | "requires": {
154 | "@babel/types": "^7.0.0"
155 | }
156 | },
157 | "@babel/helper-plugin-utils": {
158 | "version": "7.0.0",
159 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
160 | "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA=="
161 | },
162 | "@babel/helper-regex": {
163 | "version": "7.5.5",
164 | "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
165 | "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
166 | "requires": {
167 | "lodash": "^4.17.13"
168 | }
169 | },
170 | "@babel/helper-remap-async-to-generator": {
171 | "version": "7.1.0",
172 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
173 | "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
174 | "requires": {
175 | "@babel/helper-annotate-as-pure": "^7.0.0",
176 | "@babel/helper-wrap-function": "^7.1.0",
177 | "@babel/template": "^7.1.0",
178 | "@babel/traverse": "^7.1.0",
179 | "@babel/types": "^7.0.0"
180 | }
181 | },
182 | "@babel/helper-replace-supers": {
183 | "version": "7.5.5",
184 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
185 | "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
186 | "requires": {
187 | "@babel/helper-member-expression-to-functions": "^7.5.5",
188 | "@babel/helper-optimise-call-expression": "^7.0.0",
189 | "@babel/traverse": "^7.5.5",
190 | "@babel/types": "^7.5.5"
191 | }
192 | },
193 | "@babel/helper-simple-access": {
194 | "version": "7.1.0",
195 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
196 | "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
197 | "requires": {
198 | "@babel/template": "^7.1.0",
199 | "@babel/types": "^7.0.0"
200 | }
201 | },
202 | "@babel/helper-split-export-declaration": {
203 | "version": "7.4.4",
204 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
205 | "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
206 | "requires": {
207 | "@babel/types": "^7.4.4"
208 | }
209 | },
210 | "@babel/helper-wrap-function": {
211 | "version": "7.2.0",
212 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
213 | "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
214 | "requires": {
215 | "@babel/helper-function-name": "^7.1.0",
216 | "@babel/template": "^7.1.0",
217 | "@babel/traverse": "^7.1.0",
218 | "@babel/types": "^7.2.0"
219 | }
220 | },
221 | "@babel/helpers": {
222 | "version": "7.5.5",
223 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz",
224 | "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==",
225 | "requires": {
226 | "@babel/template": "^7.4.4",
227 | "@babel/traverse": "^7.5.5",
228 | "@babel/types": "^7.5.5"
229 | }
230 | },
231 | "@babel/highlight": {
232 | "version": "7.5.0",
233 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
234 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
235 | "requires": {
236 | "chalk": "^2.0.0",
237 | "esutils": "^2.0.2",
238 | "js-tokens": "^4.0.0"
239 | }
240 | },
241 | "@babel/parser": {
242 | "version": "7.5.5",
243 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
244 | "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g=="
245 | },
246 | "@babel/plugin-proposal-async-generator-functions": {
247 | "version": "7.2.0",
248 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
249 | "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
250 | "requires": {
251 | "@babel/helper-plugin-utils": "^7.0.0",
252 | "@babel/helper-remap-async-to-generator": "^7.1.0",
253 | "@babel/plugin-syntax-async-generators": "^7.2.0"
254 | }
255 | },
256 | "@babel/plugin-proposal-dynamic-import": {
257 | "version": "7.5.0",
258 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz",
259 | "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==",
260 | "requires": {
261 | "@babel/helper-plugin-utils": "^7.0.0",
262 | "@babel/plugin-syntax-dynamic-import": "^7.2.0"
263 | }
264 | },
265 | "@babel/plugin-proposal-json-strings": {
266 | "version": "7.2.0",
267 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
268 | "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
269 | "requires": {
270 | "@babel/helper-plugin-utils": "^7.0.0",
271 | "@babel/plugin-syntax-json-strings": "^7.2.0"
272 | }
273 | },
274 | "@babel/plugin-proposal-object-rest-spread": {
275 | "version": "7.5.5",
276 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz",
277 | "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==",
278 | "requires": {
279 | "@babel/helper-plugin-utils": "^7.0.0",
280 | "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
281 | }
282 | },
283 | "@babel/plugin-proposal-optional-catch-binding": {
284 | "version": "7.2.0",
285 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
286 | "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
287 | "requires": {
288 | "@babel/helper-plugin-utils": "^7.0.0",
289 | "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
290 | }
291 | },
292 | "@babel/plugin-proposal-unicode-property-regex": {
293 | "version": "7.4.4",
294 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz",
295 | "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==",
296 | "requires": {
297 | "@babel/helper-plugin-utils": "^7.0.0",
298 | "@babel/helper-regex": "^7.4.4",
299 | "regexpu-core": "^4.5.4"
300 | }
301 | },
302 | "@babel/plugin-syntax-async-generators": {
303 | "version": "7.2.0",
304 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
305 | "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
306 | "requires": {
307 | "@babel/helper-plugin-utils": "^7.0.0"
308 | }
309 | },
310 | "@babel/plugin-syntax-dynamic-import": {
311 | "version": "7.2.0",
312 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
313 | "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
314 | "requires": {
315 | "@babel/helper-plugin-utils": "^7.0.0"
316 | }
317 | },
318 | "@babel/plugin-syntax-json-strings": {
319 | "version": "7.2.0",
320 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
321 | "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
322 | "requires": {
323 | "@babel/helper-plugin-utils": "^7.0.0"
324 | }
325 | },
326 | "@babel/plugin-syntax-object-rest-spread": {
327 | "version": "7.2.0",
328 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
329 | "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
330 | "requires": {
331 | "@babel/helper-plugin-utils": "^7.0.0"
332 | }
333 | },
334 | "@babel/plugin-syntax-optional-catch-binding": {
335 | "version": "7.2.0",
336 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
337 | "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
338 | "requires": {
339 | "@babel/helper-plugin-utils": "^7.0.0"
340 | }
341 | },
342 | "@babel/plugin-transform-arrow-functions": {
343 | "version": "7.2.0",
344 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
345 | "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
346 | "requires": {
347 | "@babel/helper-plugin-utils": "^7.0.0"
348 | }
349 | },
350 | "@babel/plugin-transform-async-to-generator": {
351 | "version": "7.5.0",
352 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz",
353 | "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==",
354 | "requires": {
355 | "@babel/helper-module-imports": "^7.0.0",
356 | "@babel/helper-plugin-utils": "^7.0.0",
357 | "@babel/helper-remap-async-to-generator": "^7.1.0"
358 | }
359 | },
360 | "@babel/plugin-transform-block-scoped-functions": {
361 | "version": "7.2.0",
362 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
363 | "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
364 | "requires": {
365 | "@babel/helper-plugin-utils": "^7.0.0"
366 | }
367 | },
368 | "@babel/plugin-transform-block-scoping": {
369 | "version": "7.5.5",
370 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz",
371 | "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==",
372 | "requires": {
373 | "@babel/helper-plugin-utils": "^7.0.0",
374 | "lodash": "^4.17.13"
375 | }
376 | },
377 | "@babel/plugin-transform-classes": {
378 | "version": "7.5.5",
379 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz",
380 | "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==",
381 | "requires": {
382 | "@babel/helper-annotate-as-pure": "^7.0.0",
383 | "@babel/helper-define-map": "^7.5.5",
384 | "@babel/helper-function-name": "^7.1.0",
385 | "@babel/helper-optimise-call-expression": "^7.0.0",
386 | "@babel/helper-plugin-utils": "^7.0.0",
387 | "@babel/helper-replace-supers": "^7.5.5",
388 | "@babel/helper-split-export-declaration": "^7.4.4",
389 | "globals": "^11.1.0"
390 | }
391 | },
392 | "@babel/plugin-transform-computed-properties": {
393 | "version": "7.2.0",
394 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
395 | "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
396 | "requires": {
397 | "@babel/helper-plugin-utils": "^7.0.0"
398 | }
399 | },
400 | "@babel/plugin-transform-destructuring": {
401 | "version": "7.5.0",
402 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz",
403 | "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==",
404 | "requires": {
405 | "@babel/helper-plugin-utils": "^7.0.0"
406 | }
407 | },
408 | "@babel/plugin-transform-dotall-regex": {
409 | "version": "7.4.4",
410 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz",
411 | "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==",
412 | "requires": {
413 | "@babel/helper-plugin-utils": "^7.0.0",
414 | "@babel/helper-regex": "^7.4.4",
415 | "regexpu-core": "^4.5.4"
416 | }
417 | },
418 | "@babel/plugin-transform-duplicate-keys": {
419 | "version": "7.5.0",
420 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz",
421 | "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==",
422 | "requires": {
423 | "@babel/helper-plugin-utils": "^7.0.0"
424 | }
425 | },
426 | "@babel/plugin-transform-exponentiation-operator": {
427 | "version": "7.2.0",
428 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
429 | "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
430 | "requires": {
431 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
432 | "@babel/helper-plugin-utils": "^7.0.0"
433 | }
434 | },
435 | "@babel/plugin-transform-for-of": {
436 | "version": "7.4.4",
437 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
438 | "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
439 | "requires": {
440 | "@babel/helper-plugin-utils": "^7.0.0"
441 | }
442 | },
443 | "@babel/plugin-transform-function-name": {
444 | "version": "7.4.4",
445 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
446 | "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
447 | "requires": {
448 | "@babel/helper-function-name": "^7.1.0",
449 | "@babel/helper-plugin-utils": "^7.0.0"
450 | }
451 | },
452 | "@babel/plugin-transform-literals": {
453 | "version": "7.2.0",
454 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
455 | "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
456 | "requires": {
457 | "@babel/helper-plugin-utils": "^7.0.0"
458 | }
459 | },
460 | "@babel/plugin-transform-member-expression-literals": {
461 | "version": "7.2.0",
462 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
463 | "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
464 | "requires": {
465 | "@babel/helper-plugin-utils": "^7.0.0"
466 | }
467 | },
468 | "@babel/plugin-transform-modules-amd": {
469 | "version": "7.5.0",
470 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz",
471 | "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==",
472 | "requires": {
473 | "@babel/helper-module-transforms": "^7.1.0",
474 | "@babel/helper-plugin-utils": "^7.0.0",
475 | "babel-plugin-dynamic-import-node": "^2.3.0"
476 | }
477 | },
478 | "@babel/plugin-transform-modules-commonjs": {
479 | "version": "7.5.0",
480 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz",
481 | "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==",
482 | "requires": {
483 | "@babel/helper-module-transforms": "^7.4.4",
484 | "@babel/helper-plugin-utils": "^7.0.0",
485 | "@babel/helper-simple-access": "^7.1.0",
486 | "babel-plugin-dynamic-import-node": "^2.3.0"
487 | }
488 | },
489 | "@babel/plugin-transform-modules-systemjs": {
490 | "version": "7.5.0",
491 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz",
492 | "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==",
493 | "requires": {
494 | "@babel/helper-hoist-variables": "^7.4.4",
495 | "@babel/helper-plugin-utils": "^7.0.0",
496 | "babel-plugin-dynamic-import-node": "^2.3.0"
497 | }
498 | },
499 | "@babel/plugin-transform-modules-umd": {
500 | "version": "7.2.0",
501 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
502 | "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
503 | "requires": {
504 | "@babel/helper-module-transforms": "^7.1.0",
505 | "@babel/helper-plugin-utils": "^7.0.0"
506 | }
507 | },
508 | "@babel/plugin-transform-named-capturing-groups-regex": {
509 | "version": "7.4.5",
510 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz",
511 | "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==",
512 | "requires": {
513 | "regexp-tree": "^0.1.6"
514 | }
515 | },
516 | "@babel/plugin-transform-new-target": {
517 | "version": "7.4.4",
518 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
519 | "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
520 | "requires": {
521 | "@babel/helper-plugin-utils": "^7.0.0"
522 | }
523 | },
524 | "@babel/plugin-transform-object-super": {
525 | "version": "7.5.5",
526 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz",
527 | "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==",
528 | "requires": {
529 | "@babel/helper-plugin-utils": "^7.0.0",
530 | "@babel/helper-replace-supers": "^7.5.5"
531 | }
532 | },
533 | "@babel/plugin-transform-parameters": {
534 | "version": "7.4.4",
535 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
536 | "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
537 | "requires": {
538 | "@babel/helper-call-delegate": "^7.4.4",
539 | "@babel/helper-get-function-arity": "^7.0.0",
540 | "@babel/helper-plugin-utils": "^7.0.0"
541 | }
542 | },
543 | "@babel/plugin-transform-property-literals": {
544 | "version": "7.2.0",
545 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
546 | "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
547 | "requires": {
548 | "@babel/helper-plugin-utils": "^7.0.0"
549 | }
550 | },
551 | "@babel/plugin-transform-regenerator": {
552 | "version": "7.4.5",
553 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
554 | "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
555 | "requires": {
556 | "regenerator-transform": "^0.14.0"
557 | }
558 | },
559 | "@babel/plugin-transform-reserved-words": {
560 | "version": "7.2.0",
561 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
562 | "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
563 | "requires": {
564 | "@babel/helper-plugin-utils": "^7.0.0"
565 | }
566 | },
567 | "@babel/plugin-transform-shorthand-properties": {
568 | "version": "7.2.0",
569 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
570 | "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
571 | "requires": {
572 | "@babel/helper-plugin-utils": "^7.0.0"
573 | }
574 | },
575 | "@babel/plugin-transform-spread": {
576 | "version": "7.2.2",
577 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
578 | "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
579 | "requires": {
580 | "@babel/helper-plugin-utils": "^7.0.0"
581 | }
582 | },
583 | "@babel/plugin-transform-sticky-regex": {
584 | "version": "7.2.0",
585 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
586 | "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
587 | "requires": {
588 | "@babel/helper-plugin-utils": "^7.0.0",
589 | "@babel/helper-regex": "^7.0.0"
590 | }
591 | },
592 | "@babel/plugin-transform-template-literals": {
593 | "version": "7.4.4",
594 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
595 | "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
596 | "requires": {
597 | "@babel/helper-annotate-as-pure": "^7.0.0",
598 | "@babel/helper-plugin-utils": "^7.0.0"
599 | }
600 | },
601 | "@babel/plugin-transform-typeof-symbol": {
602 | "version": "7.2.0",
603 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
604 | "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
605 | "requires": {
606 | "@babel/helper-plugin-utils": "^7.0.0"
607 | }
608 | },
609 | "@babel/plugin-transform-unicode-regex": {
610 | "version": "7.4.4",
611 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz",
612 | "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==",
613 | "requires": {
614 | "@babel/helper-plugin-utils": "^7.0.0",
615 | "@babel/helper-regex": "^7.4.4",
616 | "regexpu-core": "^4.5.4"
617 | }
618 | },
619 | "@babel/preset-env": {
620 | "version": "7.5.5",
621 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz",
622 | "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==",
623 | "requires": {
624 | "@babel/helper-module-imports": "^7.0.0",
625 | "@babel/helper-plugin-utils": "^7.0.0",
626 | "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
627 | "@babel/plugin-proposal-dynamic-import": "^7.5.0",
628 | "@babel/plugin-proposal-json-strings": "^7.2.0",
629 | "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
630 | "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
631 | "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
632 | "@babel/plugin-syntax-async-generators": "^7.2.0",
633 | "@babel/plugin-syntax-dynamic-import": "^7.2.0",
634 | "@babel/plugin-syntax-json-strings": "^7.2.0",
635 | "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
636 | "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
637 | "@babel/plugin-transform-arrow-functions": "^7.2.0",
638 | "@babel/plugin-transform-async-to-generator": "^7.5.0",
639 | "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
640 | "@babel/plugin-transform-block-scoping": "^7.5.5",
641 | "@babel/plugin-transform-classes": "^7.5.5",
642 | "@babel/plugin-transform-computed-properties": "^7.2.0",
643 | "@babel/plugin-transform-destructuring": "^7.5.0",
644 | "@babel/plugin-transform-dotall-regex": "^7.4.4",
645 | "@babel/plugin-transform-duplicate-keys": "^7.5.0",
646 | "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
647 | "@babel/plugin-transform-for-of": "^7.4.4",
648 | "@babel/plugin-transform-function-name": "^7.4.4",
649 | "@babel/plugin-transform-literals": "^7.2.0",
650 | "@babel/plugin-transform-member-expression-literals": "^7.2.0",
651 | "@babel/plugin-transform-modules-amd": "^7.5.0",
652 | "@babel/plugin-transform-modules-commonjs": "^7.5.0",
653 | "@babel/plugin-transform-modules-systemjs": "^7.5.0",
654 | "@babel/plugin-transform-modules-umd": "^7.2.0",
655 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
656 | "@babel/plugin-transform-new-target": "^7.4.4",
657 | "@babel/plugin-transform-object-super": "^7.5.5",
658 | "@babel/plugin-transform-parameters": "^7.4.4",
659 | "@babel/plugin-transform-property-literals": "^7.2.0",
660 | "@babel/plugin-transform-regenerator": "^7.4.5",
661 | "@babel/plugin-transform-reserved-words": "^7.2.0",
662 | "@babel/plugin-transform-shorthand-properties": "^7.2.0",
663 | "@babel/plugin-transform-spread": "^7.2.0",
664 | "@babel/plugin-transform-sticky-regex": "^7.2.0",
665 | "@babel/plugin-transform-template-literals": "^7.4.4",
666 | "@babel/plugin-transform-typeof-symbol": "^7.2.0",
667 | "@babel/plugin-transform-unicode-regex": "^7.4.4",
668 | "@babel/types": "^7.5.5",
669 | "browserslist": "^4.6.0",
670 | "core-js-compat": "^3.1.1",
671 | "invariant": "^2.2.2",
672 | "js-levenshtein": "^1.1.3",
673 | "semver": "^5.5.0"
674 | }
675 | },
676 | "@babel/template": {
677 | "version": "7.4.4",
678 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
679 | "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
680 | "requires": {
681 | "@babel/code-frame": "^7.0.0",
682 | "@babel/parser": "^7.4.4",
683 | "@babel/types": "^7.4.4"
684 | }
685 | },
686 | "@babel/traverse": {
687 | "version": "7.5.5",
688 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz",
689 | "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==",
690 | "requires": {
691 | "@babel/code-frame": "^7.5.5",
692 | "@babel/generator": "^7.5.5",
693 | "@babel/helper-function-name": "^7.1.0",
694 | "@babel/helper-split-export-declaration": "^7.4.4",
695 | "@babel/parser": "^7.5.5",
696 | "@babel/types": "^7.5.5",
697 | "debug": "^4.1.0",
698 | "globals": "^11.1.0",
699 | "lodash": "^4.17.13"
700 | }
701 | },
702 | "@babel/types": {
703 | "version": "7.5.5",
704 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz",
705 | "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==",
706 | "requires": {
707 | "esutils": "^2.0.2",
708 | "lodash": "^4.17.13",
709 | "to-fast-properties": "^2.0.0"
710 | }
711 | },
712 | "ansi-regex": {
713 | "version": "2.1.1",
714 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
715 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
716 | },
717 | "ansi-styles": {
718 | "version": "3.2.1",
719 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
720 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
721 | "requires": {
722 | "color-convert": "^1.9.0"
723 | }
724 | },
725 | "babel-code-frame": {
726 | "version": "6.26.0",
727 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
728 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
729 | "requires": {
730 | "chalk": "^1.1.3",
731 | "esutils": "^2.0.2",
732 | "js-tokens": "^3.0.2"
733 | },
734 | "dependencies": {
735 | "ansi-styles": {
736 | "version": "2.2.1",
737 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
738 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
739 | },
740 | "chalk": {
741 | "version": "1.1.3",
742 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
743 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
744 | "requires": {
745 | "ansi-styles": "^2.2.1",
746 | "escape-string-regexp": "^1.0.2",
747 | "has-ansi": "^2.0.0",
748 | "strip-ansi": "^3.0.0",
749 | "supports-color": "^2.0.0"
750 | }
751 | },
752 | "js-tokens": {
753 | "version": "3.0.2",
754 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
755 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
756 | },
757 | "supports-color": {
758 | "version": "2.0.0",
759 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
760 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
761 | }
762 | }
763 | },
764 | "babel-messages": {
765 | "version": "6.23.0",
766 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
767 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
768 | "requires": {
769 | "babel-runtime": "^6.22.0"
770 | }
771 | },
772 | "babel-plugin-dynamic-import-node": {
773 | "version": "2.3.0",
774 | "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
775 | "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
776 | "requires": {
777 | "object.assign": "^4.1.0"
778 | }
779 | },
780 | "babel-runtime": {
781 | "version": "6.26.0",
782 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
783 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
784 | "requires": {
785 | "core-js": "^2.4.0",
786 | "regenerator-runtime": "^0.11.0"
787 | }
788 | },
789 | "babel-traverse": {
790 | "version": "6.26.0",
791 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
792 | "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
793 | "requires": {
794 | "babel-code-frame": "^6.26.0",
795 | "babel-messages": "^6.23.0",
796 | "babel-runtime": "^6.26.0",
797 | "babel-types": "^6.26.0",
798 | "babylon": "^6.18.0",
799 | "debug": "^2.6.8",
800 | "globals": "^9.18.0",
801 | "invariant": "^2.2.2",
802 | "lodash": "^4.17.4"
803 | },
804 | "dependencies": {
805 | "debug": {
806 | "version": "2.6.9",
807 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
808 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
809 | "requires": {
810 | "ms": "2.0.0"
811 | }
812 | },
813 | "globals": {
814 | "version": "9.18.0",
815 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
816 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
817 | },
818 | "ms": {
819 | "version": "2.0.0",
820 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
821 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
822 | }
823 | }
824 | },
825 | "babel-types": {
826 | "version": "6.26.0",
827 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
828 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
829 | "requires": {
830 | "babel-runtime": "^6.26.0",
831 | "esutils": "^2.0.2",
832 | "lodash": "^4.17.4",
833 | "to-fast-properties": "^1.0.3"
834 | },
835 | "dependencies": {
836 | "to-fast-properties": {
837 | "version": "1.0.3",
838 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
839 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
840 | }
841 | }
842 | },
843 | "babylon": {
844 | "version": "6.18.0",
845 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
846 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
847 | },
848 | "browserslist": {
849 | "version": "4.7.0",
850 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
851 | "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
852 | "requires": {
853 | "caniuse-lite": "^1.0.30000989",
854 | "electron-to-chromium": "^1.3.247",
855 | "node-releases": "^1.1.29"
856 | }
857 | },
858 | "caniuse-lite": {
859 | "version": "1.0.30000989",
860 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz",
861 | "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw=="
862 | },
863 | "chalk": {
864 | "version": "2.4.2",
865 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
866 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
867 | "requires": {
868 | "ansi-styles": "^3.2.1",
869 | "escape-string-regexp": "^1.0.5",
870 | "supports-color": "^5.3.0"
871 | }
872 | },
873 | "color-convert": {
874 | "version": "1.9.3",
875 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
876 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
877 | "requires": {
878 | "color-name": "1.1.3"
879 | }
880 | },
881 | "color-name": {
882 | "version": "1.1.3",
883 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
884 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
885 | },
886 | "commander": {
887 | "version": "2.20.0",
888 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
889 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ=="
890 | },
891 | "convert-source-map": {
892 | "version": "1.6.0",
893 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
894 | "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
895 | "requires": {
896 | "safe-buffer": "~5.1.1"
897 | }
898 | },
899 | "core-js": {
900 | "version": "2.6.9",
901 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
902 | "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
903 | },
904 | "core-js-compat": {
905 | "version": "3.2.1",
906 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz",
907 | "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==",
908 | "requires": {
909 | "browserslist": "^4.6.6",
910 | "semver": "^6.3.0"
911 | },
912 | "dependencies": {
913 | "semver": {
914 | "version": "6.3.0",
915 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
916 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
917 | }
918 | }
919 | },
920 | "debug": {
921 | "version": "4.1.1",
922 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
923 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
924 | "requires": {
925 | "ms": "^2.1.1"
926 | }
927 | },
928 | "define-properties": {
929 | "version": "1.1.3",
930 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
931 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
932 | "requires": {
933 | "object-keys": "^1.0.12"
934 | }
935 | },
936 | "depd": {
937 | "version": "1.1.2",
938 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
939 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
940 | },
941 | "destroy": {
942 | "version": "1.0.4",
943 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
944 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
945 | },
946 | "dom-serializer": {
947 | "version": "0.2.1",
948 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz",
949 | "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==",
950 | "requires": {
951 | "domelementtype": "^2.0.1",
952 | "entities": "^2.0.0"
953 | },
954 | "dependencies": {
955 | "domelementtype": {
956 | "version": "2.0.1",
957 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
958 | "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
959 | },
960 | "entities": {
961 | "version": "2.0.0",
962 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
963 | "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw=="
964 | }
965 | }
966 | },
967 | "domelementtype": {
968 | "version": "1.3.1",
969 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
970 | "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
971 | },
972 | "domhandler": {
973 | "version": "2.4.2",
974 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
975 | "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
976 | "requires": {
977 | "domelementtype": "1"
978 | }
979 | },
980 | "domutils": {
981 | "version": "1.7.0",
982 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
983 | "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
984 | "requires": {
985 | "dom-serializer": "0",
986 | "domelementtype": "1"
987 | }
988 | },
989 | "ee-first": {
990 | "version": "1.1.1",
991 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
992 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
993 | },
994 | "electron-to-chromium": {
995 | "version": "1.3.250",
996 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.250.tgz",
997 | "integrity": "sha512-2OAU91iUw83QvzuWJPfT+FMj+O+DC1EyTx1QBFcc9WZzOQSfZEAWINpdLWElxkgfiqTvQRDOKg0DkMZd9QoNug=="
998 | },
999 | "encodeurl": {
1000 | "version": "1.0.2",
1001 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1002 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
1003 | },
1004 | "entities": {
1005 | "version": "1.1.2",
1006 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
1007 | "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
1008 | },
1009 | "escape-html": {
1010 | "version": "1.0.3",
1011 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1012 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
1013 | },
1014 | "escape-string-regexp": {
1015 | "version": "1.0.5",
1016 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1017 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
1018 | },
1019 | "esutils": {
1020 | "version": "2.0.3",
1021 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1022 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
1023 | },
1024 | "etag": {
1025 | "version": "1.8.1",
1026 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1027 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
1028 | },
1029 | "finalhandler": {
1030 | "version": "1.1.2",
1031 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
1032 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
1033 | "requires": {
1034 | "debug": "2.6.9",
1035 | "encodeurl": "~1.0.2",
1036 | "escape-html": "~1.0.3",
1037 | "on-finished": "~2.3.0",
1038 | "parseurl": "~1.3.3",
1039 | "statuses": "~1.5.0",
1040 | "unpipe": "~1.0.0"
1041 | },
1042 | "dependencies": {
1043 | "debug": {
1044 | "version": "2.6.9",
1045 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1046 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1047 | "requires": {
1048 | "ms": "2.0.0"
1049 | }
1050 | },
1051 | "ms": {
1052 | "version": "2.0.0",
1053 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1054 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1055 | }
1056 | }
1057 | },
1058 | "fresh": {
1059 | "version": "0.5.2",
1060 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1061 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
1062 | },
1063 | "function-bind": {
1064 | "version": "1.1.1",
1065 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1066 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1067 | },
1068 | "globals": {
1069 | "version": "11.12.0",
1070 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
1071 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
1072 | },
1073 | "has-ansi": {
1074 | "version": "2.0.0",
1075 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1076 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1077 | "requires": {
1078 | "ansi-regex": "^2.0.0"
1079 | }
1080 | },
1081 | "has-flag": {
1082 | "version": "3.0.0",
1083 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1084 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
1085 | },
1086 | "has-symbols": {
1087 | "version": "1.0.0",
1088 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
1089 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
1090 | },
1091 | "htmlparser2": {
1092 | "version": "3.10.1",
1093 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
1094 | "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
1095 | "requires": {
1096 | "domelementtype": "^1.3.1",
1097 | "domhandler": "^2.3.0",
1098 | "domutils": "^1.5.1",
1099 | "entities": "^1.1.1",
1100 | "inherits": "^2.0.1",
1101 | "readable-stream": "^3.1.1"
1102 | }
1103 | },
1104 | "http": {
1105 | "version": "0.0.0",
1106 | "resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz",
1107 | "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I="
1108 | },
1109 | "http-errors": {
1110 | "version": "1.7.3",
1111 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
1112 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
1113 | "requires": {
1114 | "depd": "~1.1.2",
1115 | "inherits": "2.0.4",
1116 | "setprototypeof": "1.1.1",
1117 | "statuses": ">= 1.5.0 < 2",
1118 | "toidentifier": "1.0.0"
1119 | }
1120 | },
1121 | "inherits": {
1122 | "version": "2.0.4",
1123 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1124 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1125 | },
1126 | "invariant": {
1127 | "version": "2.2.4",
1128 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
1129 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
1130 | "requires": {
1131 | "loose-envify": "^1.0.0"
1132 | }
1133 | },
1134 | "js-levenshtein": {
1135 | "version": "1.1.6",
1136 | "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
1137 | "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="
1138 | },
1139 | "js-tokens": {
1140 | "version": "4.0.0",
1141 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1142 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1143 | },
1144 | "jsesc": {
1145 | "version": "2.5.2",
1146 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
1147 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
1148 | },
1149 | "json5": {
1150 | "version": "2.1.0",
1151 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
1152 | "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
1153 | "requires": {
1154 | "minimist": "^1.2.0"
1155 | }
1156 | },
1157 | "lodash": {
1158 | "version": "4.17.19",
1159 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
1160 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
1161 | },
1162 | "loose-envify": {
1163 | "version": "1.4.0",
1164 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1165 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1166 | "requires": {
1167 | "js-tokens": "^3.0.0 || ^4.0.0"
1168 | }
1169 | },
1170 | "mime": {
1171 | "version": "1.6.0",
1172 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1173 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1174 | },
1175 | "minimist": {
1176 | "version": "1.2.5",
1177 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1178 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1179 | },
1180 | "ms": {
1181 | "version": "2.1.2",
1182 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1183 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1184 | },
1185 | "node-releases": {
1186 | "version": "1.1.29",
1187 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.29.tgz",
1188 | "integrity": "sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==",
1189 | "requires": {
1190 | "semver": "^5.3.0"
1191 | }
1192 | },
1193 | "object-assign": {
1194 | "version": "4.1.1",
1195 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1196 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1197 | },
1198 | "object-keys": {
1199 | "version": "1.1.1",
1200 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1201 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
1202 | },
1203 | "object.assign": {
1204 | "version": "4.1.0",
1205 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1206 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1207 | "requires": {
1208 | "define-properties": "^1.1.2",
1209 | "function-bind": "^1.1.1",
1210 | "has-symbols": "^1.0.0",
1211 | "object-keys": "^1.0.11"
1212 | }
1213 | },
1214 | "on-finished": {
1215 | "version": "2.3.0",
1216 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1217 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1218 | "requires": {
1219 | "ee-first": "1.1.1"
1220 | }
1221 | },
1222 | "parseurl": {
1223 | "version": "1.3.3",
1224 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1225 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1226 | },
1227 | "path-parse": {
1228 | "version": "1.0.6",
1229 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1230 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
1231 | },
1232 | "posthtml": {
1233 | "version": "0.11.6",
1234 | "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz",
1235 | "integrity": "sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==",
1236 | "requires": {
1237 | "posthtml-parser": "^0.4.1",
1238 | "posthtml-render": "^1.1.5"
1239 | }
1240 | },
1241 | "posthtml-parser": {
1242 | "version": "0.4.1",
1243 | "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.1.tgz",
1244 | "integrity": "sha512-h7vXIQ21Ikz2w5wPClPakNP6mJeJCK6BT0GpqnQrNNABdR7/TchNlFyryL1Bz6Ww53YWCKkr6tdZuHlxY1AVdQ==",
1245 | "requires": {
1246 | "htmlparser2": "^3.9.2",
1247 | "object-assign": "^4.1.1"
1248 | }
1249 | },
1250 | "posthtml-render": {
1251 | "version": "1.1.5",
1252 | "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.1.5.tgz",
1253 | "integrity": "sha512-yvt54j0zCBHQVEFAuR+yHld8CZrCa/E1Z/OcFNCV1IEWTLVxT8O7nYnM4IIw1CD4r8kaRd3lc42+0lgCKgm87w=="
1254 | },
1255 | "private": {
1256 | "version": "0.1.8",
1257 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
1258 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
1259 | },
1260 | "range-parser": {
1261 | "version": "1.2.1",
1262 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1263 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1264 | },
1265 | "readable-stream": {
1266 | "version": "3.4.0",
1267 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
1268 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
1269 | "requires": {
1270 | "inherits": "^2.0.3",
1271 | "string_decoder": "^1.1.1",
1272 | "util-deprecate": "^1.0.1"
1273 | }
1274 | },
1275 | "regenerate": {
1276 | "version": "1.4.0",
1277 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
1278 | "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
1279 | },
1280 | "regenerate-unicode-properties": {
1281 | "version": "8.1.0",
1282 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
1283 | "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
1284 | "requires": {
1285 | "regenerate": "^1.4.0"
1286 | }
1287 | },
1288 | "regenerator-runtime": {
1289 | "version": "0.11.1",
1290 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
1291 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
1292 | },
1293 | "regenerator-transform": {
1294 | "version": "0.14.1",
1295 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
1296 | "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
1297 | "requires": {
1298 | "private": "^0.1.6"
1299 | }
1300 | },
1301 | "regexp-tree": {
1302 | "version": "0.1.13",
1303 | "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.13.tgz",
1304 | "integrity": "sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw=="
1305 | },
1306 | "regexpu-core": {
1307 | "version": "4.5.5",
1308 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz",
1309 | "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==",
1310 | "requires": {
1311 | "regenerate": "^1.4.0",
1312 | "regenerate-unicode-properties": "^8.1.0",
1313 | "regjsgen": "^0.5.0",
1314 | "regjsparser": "^0.6.0",
1315 | "unicode-match-property-ecmascript": "^1.0.4",
1316 | "unicode-match-property-value-ecmascript": "^1.1.0"
1317 | }
1318 | },
1319 | "regjsgen": {
1320 | "version": "0.5.0",
1321 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
1322 | "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA=="
1323 | },
1324 | "regjsparser": {
1325 | "version": "0.6.0",
1326 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
1327 | "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
1328 | "requires": {
1329 | "jsesc": "~0.5.0"
1330 | },
1331 | "dependencies": {
1332 | "jsesc": {
1333 | "version": "0.5.0",
1334 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
1335 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
1336 | }
1337 | }
1338 | },
1339 | "resolve": {
1340 | "version": "1.12.0",
1341 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
1342 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
1343 | "requires": {
1344 | "path-parse": "^1.0.6"
1345 | }
1346 | },
1347 | "safe-buffer": {
1348 | "version": "5.1.2",
1349 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1350 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1351 | },
1352 | "semver": {
1353 | "version": "5.7.1",
1354 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1355 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1356 | },
1357 | "send": {
1358 | "version": "0.17.1",
1359 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1360 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1361 | "requires": {
1362 | "debug": "2.6.9",
1363 | "depd": "~1.1.2",
1364 | "destroy": "~1.0.4",
1365 | "encodeurl": "~1.0.2",
1366 | "escape-html": "~1.0.3",
1367 | "etag": "~1.8.1",
1368 | "fresh": "0.5.2",
1369 | "http-errors": "~1.7.2",
1370 | "mime": "1.6.0",
1371 | "ms": "2.1.1",
1372 | "on-finished": "~2.3.0",
1373 | "range-parser": "~1.2.1",
1374 | "statuses": "~1.5.0"
1375 | },
1376 | "dependencies": {
1377 | "debug": {
1378 | "version": "2.6.9",
1379 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1380 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1381 | "requires": {
1382 | "ms": "2.0.0"
1383 | },
1384 | "dependencies": {
1385 | "ms": {
1386 | "version": "2.0.0",
1387 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1388 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1389 | }
1390 | }
1391 | },
1392 | "ms": {
1393 | "version": "2.1.1",
1394 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1395 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1396 | }
1397 | }
1398 | },
1399 | "serve-static": {
1400 | "version": "1.14.1",
1401 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1402 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1403 | "requires": {
1404 | "encodeurl": "~1.0.2",
1405 | "escape-html": "~1.0.3",
1406 | "parseurl": "~1.3.3",
1407 | "send": "0.17.1"
1408 | }
1409 | },
1410 | "setprototypeof": {
1411 | "version": "1.1.1",
1412 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1413 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1414 | },
1415 | "source-map": {
1416 | "version": "0.5.7",
1417 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1418 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
1419 | },
1420 | "statuses": {
1421 | "version": "1.5.0",
1422 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1423 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1424 | },
1425 | "string_decoder": {
1426 | "version": "1.3.0",
1427 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1428 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1429 | "requires": {
1430 | "safe-buffer": "~5.2.0"
1431 | },
1432 | "dependencies": {
1433 | "safe-buffer": {
1434 | "version": "5.2.0",
1435 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
1436 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
1437 | }
1438 | }
1439 | },
1440 | "strip-ansi": {
1441 | "version": "3.0.1",
1442 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1443 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1444 | "requires": {
1445 | "ansi-regex": "^2.0.0"
1446 | }
1447 | },
1448 | "supports-color": {
1449 | "version": "5.5.0",
1450 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1451 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1452 | "requires": {
1453 | "has-flag": "^3.0.0"
1454 | }
1455 | },
1456 | "to-fast-properties": {
1457 | "version": "2.0.0",
1458 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
1459 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
1460 | },
1461 | "toidentifier": {
1462 | "version": "1.0.0",
1463 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1464 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1465 | },
1466 | "trim-right": {
1467 | "version": "1.0.1",
1468 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
1469 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
1470 | },
1471 | "unicode-canonical-property-names-ecmascript": {
1472 | "version": "1.0.4",
1473 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
1474 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
1475 | },
1476 | "unicode-match-property-ecmascript": {
1477 | "version": "1.0.4",
1478 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
1479 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
1480 | "requires": {
1481 | "unicode-canonical-property-names-ecmascript": "^1.0.4",
1482 | "unicode-property-aliases-ecmascript": "^1.0.4"
1483 | }
1484 | },
1485 | "unicode-match-property-value-ecmascript": {
1486 | "version": "1.1.0",
1487 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
1488 | "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g=="
1489 | },
1490 | "unicode-property-aliases-ecmascript": {
1491 | "version": "1.0.5",
1492 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
1493 | "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw=="
1494 | },
1495 | "unpipe": {
1496 | "version": "1.0.0",
1497 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1498 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1499 | },
1500 | "util-deprecate": {
1501 | "version": "1.0.2",
1502 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1503 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1504 | }
1505 | }
1506 | }
1507 |
--------------------------------------------------------------------------------