1
0
Fork 0

🚧 Fighting with hooks

This commit is contained in:
joostdecock 2018-07-17 14:16:17 +00:00
parent 7b4514acd8
commit 5d81c6d50a
16 changed files with 379 additions and 661 deletions

View file

@ -1,19 +1,28 @@
import { Pattern } from './lib/pattern' import { Freesewing } from './lib/freesewing'
import { Point } from './lib/point'
import { Path } from './lib/path'
import { Snippet } from './lib/snippet'
import themes from './lib/themes'
import * as utils from './lib/utils'
import bezier from 'bezier-js'
var Freesewing = { var freesewing = new Freesewing();
version: '1.0.1',
pattern: Pattern,
point: Point,
path: Path,
snippet: Snippet,
utils,
bezier
}
export default Freesewing;
//svg.pre('loadStyle', function (next) {
// console.log('loadStyle hook');
// console.log(this.style);
// this.style= 'p {line-height: 1.21;}';
// console.log('logging in hook', this);
// next();
//});
//var p = new app.pattern({parts:['tst']});
//p.draft = function(){
// console.log('drafting in lib index');
//}
//p.draft();
//p.render();
export default freesewing;

23
lib/freesewing.ts Normal file
View file

@ -0,0 +1,23 @@
import { Pattern } from './pattern'
import { Point } from './point'
import { Path } from './path'
import { Snippet } from './snippet'
import themes from './themes'
import * as utils from './utils'
export class Freesewing {
version: string;
pattern: Pattern;
point: Point;
path: Path;
snippet: Snippet;
utils: utils;
constructor() {
this.version = '1.0.1';
this.pattern = Pattern;
this.point = Point;
this.path = Path;
this.snippet = Snippet;
this.utils = utils;
}
}

1
lib/hooks.d.ts vendored Normal file
View file

@ -0,0 +1 @@
declare module 'hooks';

39
lib/hooks.ts Normal file
View file

@ -0,0 +1,39 @@
export class Hooks {
_hooks: object;
constructor(app) {
this._hooks = {};
}
on(hook, method): void {
if(typeof this.hooks._hooks[method] === 'undefined') {
this.hooks._hooks[hook] = [];
}
this.hooks._hooks[hook].push(method);
console.log('in on method', hook, method);
}
list(hook): function[] {
if(typeof this._hooks[hook] === 'undefined') {
return false;
}
return this._hooks[hook];
}
attachPre (hook: string, obj: object): void {
this._attach('pre', hook, obj);
}
attachPost (hook: string, obj: object): void {
this._attach('post', hook, obj);
}
attach (hook: string, obj: object): void {
if(typeof this._hooks[hook] === 'undefined') return;
for(let func of this._hooks[hook]) {
console.log('in attach', hook, func);
obj.pre(hook, func);
}
}
}

View file

@ -5,7 +5,7 @@ import { Attributes } from './attributes'
function PointProxy(id: string) { function PointProxy(id: string) {
this.id = id; this.id = id;
this.get = function(points, key: string, proxy: ProxyHandler<Map<any, any>>): Point { this.get = function(points: any, key: string, proxy: ProxyHandler<Map<any, any>>): Point {
return points.get(key); return points.get(key);
}; };
this.set = function(points: Map<string, Point>, key: string, point: Point, proxy: ProxyHandler<Map<any, any>>) { this.set = function(points: Map<string, Point>, key: string, point: Point, proxy: ProxyHandler<Map<any, any>>) {

View file

@ -2,35 +2,43 @@ import { PatternConfig, PatternOption } from './types'
import { Point } from './point' import { Point } from './point'
import { Part } from './part' import { Part } from './part'
import { Svg } from './svg' import { Svg } from './svg'
import { Hooks } from './hooks'
import { Option } from './option' import { Option } from './option'
import themes from './themes'
import { Theme } from './themes/theme'
export class Pattern { export class Pattern {
config: PatternConfig; config: PatternConfig;
svg: Svg = new Svg(); svg: Svg = new Svg();
themes: {[index:string]: Theme} = themes;
parts: { parts: {
[index: string]: Part; [index: string]: Part;
} }
options: {[propName: string]: number}; options: {[propName: string]: number};
values: {[propName: string]: any} = {}; values: {[propName: string]: any} = {};
settings: {[propName: string]: any} = {mode: 'draft', units: 'metric'}; settings: {[propName: string]: any} = {mode: 'draft', units: 'metric'};
hooks: Hooks;
on: function;
constructor(config: PatternConfig) { constructor(config: PatternConfig) {
if(!config) {
throw "Could not create pattern: You need to provide a pattern config."
}
if(typeof config.parts === 'undefined' || !config.parts || config.parts.length < 1) {
throw "Could not create pattern: You should define at least one part in your pattern config";
}
this.config = config; this.config = config;
this.parts = {}; this.parts = {};
this.hooks = new Hooks();
this.on = this.hooks.on;
for (let id of config.parts) { for (let id of config.parts) {
this.parts[id] = new Part(id); this.parts[id] = new Part(id);
} }
this.options = {}; this.options = {};
for (let conf of config.options) { if(typeof config.options !== 'undefined' && config.options.length > 0) {
if(conf.type === 'percentage') this.options[conf.id] = conf.val/100; for (let conf of config.options) {
else this.options[conf.id] = conf.val; if(conf.type === 'percentage') this.options[conf.id] = conf.val/100;
else this.options[conf.id] = conf.val;
}
} }
return this; return this;
} }
@ -39,9 +47,13 @@ export class Pattern {
} }
render(): string { render(): string {
let svg = new Svg(); let svg = new Svg(this);
let theme = this.themes[this.settings.mode]; this.hooks.attach('loadStyle', svg);
theme.preRender(this, svg); //svg.pre('preRenderSvg', function(next) {
// console.log('manual attach');
// this.style += "path {stroke: #000; fill: none;}";
// next();
//});
return svg.render(this); return svg.render(this);
} }

View file

@ -3,6 +3,8 @@ import { Path } from './path'
import { Snippet } from './snippet' import { Snippet } from './snippet'
import { Pattern } from './pattern' import { Pattern } from './pattern'
import { Attributes } from './attributes' import { Attributes } from './attributes'
import hooklib from 'hooks'
import { Hooks } from './hooks'
export class Svg { export class Svg {
prefix: string; prefix: string;
@ -16,8 +18,11 @@ export class Svg {
tabs: number = 0; tabs: number = 0;
freeId: number = 1; freeId: number = 1;
openGroups: string[] = []; openGroups: string[] = [];
hook: any;
hooks: string[];
pattern: Pattern;
constructor() { constructor(pattern) {
this.prefix = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'; this.prefix = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
this.attributes.add this.attributes.add
this.attributes.add("xmlns", "http://www.w3.org/2000/svg"); this.attributes.add("xmlns", "http://www.w3.org/2000/svg");
@ -25,12 +30,25 @@ export class Svg {
this.attributes.add("xmlns:xlink", "http://www.w3.org/1999/xlink"); this.attributes.add("xmlns:xlink", "http://www.w3.org/1999/xlink");
this.attributes.add("xmlns:freesewing", "http://freesewing.org/namespaces/freesewing"); this.attributes.add("xmlns:freesewing", "http://freesewing.org/namespaces/freesewing");
this.attributes.add("freesewing:foo", "bar"); this.attributes.add("freesewing:foo", "bar");
this.pattern = pattern;
this.hooks = ['loadStyle'];
for(let k in hooklib) this[k] = hooklib[k];
this.hook('loadStyle', this.loadStyle);
return this; return this;
} }
/** Loads CSS styles */
loadStyle(): string {
return this.style;
}
loadStyle() {
return this.style;
}
/** Renders a draft object as SVG */ /** Renders a draft object as SVG */
render(pattern: Pattern): string { render(pattern: Pattern): string {
this.loadStyle();
let svg = this.prefix; let svg = this.prefix;
svg += this.renderComments(this.header); svg += this.renderComments(this.header);
svg += this.renderSvgTag(pattern); svg += this.renderSvgTag(pattern);
@ -66,12 +84,12 @@ export class Svg {
/** Returns SVG code for the style block */ /** Returns SVG code for the style block */
renderStyle() { renderStyle() {
let svg = '<style type="text/css">'; this.loadStyle(); // TODO: Hooks docs
let svg = '<style type="text/css"> <![CDATA[ ';
this.indent(); this.indent();
svg += this.nl()+this.style; svg += this.nl()+this.style;
this.outdent(); this.outdent();
svg += this.nl()+']]> >'+this.nl()+'</style>'+this.nl(); svg += this.nl()+']]> >'+this.nl()+'</style>'+this.nl();
return svg; return svg;
} }

View file

@ -1,15 +0,0 @@
import { Draft } from './themes/draft'
import { Paperless } from './themes/paperless'
import { Sample } from './themes/sample'
import { Compare } from './themes/compare'
import { Designer } from './themes/designer'
/** Standard themes that ship with freesewing */
var themes = {
draft: new Designer(),
paperless: new Paperless(),
sample: new Sample(),
compare: new Compare()
}
export default themes;

View file

@ -1,14 +0,0 @@
import { Pattern } from '../pattern'
import { Svg } from '../svg'
import { Sample } from './sample';
export class Compare extends Sample {
/** Pre-render method is called just prior to rendering */
preRender(pattern: Pattern, svg: Svg) {
super.preRender(pattern, svg);
svg.style += `
path.compare { fill: #000000; fill-opacity: 0.05; stroke: #000000; stroke-opacity:0.5; stroke-width: 1; stroke-linecap:round; stroke-linejoin:round; }
`;
}
}

View file

@ -1,151 +0,0 @@
import { Pattern } from '../pattern'
import { Svg } from '../svg'
import { Path } from '../path'
import { Part } from '../part'
import { Snippet } from '../snippet'
import { Theme } from './theme';
export class Designer extends Theme {
style: string = `
path.curve-control{stroke:#f0ad4e;stroke-width: 0.2;}
path.debug{stroke:#d9534f;stroke-opacity:0.4;stroke-width:2;}
.point{fill:none;stroke-width:0.6;stroke:#f0ad4e;}
text.tooltip{font-size:3px;}`;
defs: string = `
<g id="point">
<circle cy="0" cx="0" r="2" class="stroke-hint stroke-sm" />
<circle cy="0" cx="0" r="0.8" class="fill-hint" />
</g>
<g id="volatile-point">
<circle cy="0" cx="0" r="1" class="stroke-canvas stroke-xs" />
<path d="M -0.5,-0.5 L 0.5,0.5 M 0.5,-0.5 L -0.5,0.5" class="stroke-canvas stroke-sm" />
</g>
<g id="path-point">
<circle cx="0" cy="0" r="2" class="stroke-note stroke-lg" />
<circle cx="0" cy="0" r="0.8" class="fill-note" />
</g>
<g id="path-start-point">
<circle cx="0" cy="0" r="2" class="stroke-canvas stroke-lg" />
<circle cx="0" cy="0" r="0.8" class="fill-canvas" />
</g>
<g id="path-curvecontrol">
<circle cy="0" cx="0" r="2" class="stroke-mark stroke-lg no-fill" />
<circle cx="0" cy="0" r="0.8" class="fill-mark" />
</g>
<g id="focus-point">
<circle cx="0" cy="0" r="2" class="stroke-mark stroke-lg" />
<circle cx="0" cy="0" r="0.8" class="fill-fabric" />
</g>
<g id="marked-point">
<circle cx="0" cy="0" r="3.6" class="stroke-hint stroke-sm" />
<circle cx="0" cy="0" r="2.8" class="stroke-hint stroke-sm" />
<circle cx="0" cy="0" r="2.0" class="stroke-hint stroke-sm" />
<circle cx="0" cy="0" r="1.2" class="stroke-hint stroke-sm" />
<circle cx="0" cy="0" r="0.8" class="stroke-hint stroke-sm" />
<circle cx="0" cy="0" r="0.4" class="fill-hint" />
</g>`;
script:string = `
function pointHover(evt) {
var point = evt.target;
var id = point.id;
var cx = point.getAttribute('x');
var cy = point.getAttribute('y');
console.log('Point '+id+' ( '+cx+' , '+cy+' )');
var scale = 2;
cx = cx-scale*cx;
cy = cy-scale*cy;
point.setAttribute("transform", 'matrix('+scale+', 0, 0, '+scale+', '+cx+', '+cy+')');
setTimeout(function(){
var point = document.getElementById(evt.target.id);
point.removeAttribute("transform", '');
}, 1000);
}`;
/** Pre-render method is called just prior to rendering */
preRender(pattern: Pattern, svg: Svg): void {
super.preRender(pattern, svg);
svg.style += this.style;
svg.defs += this.defs;
svg.script += this.script;
svg.attributes.add('freesewing:theme', 'designer');
svg.attributes.add('viewBox', '-10 -10 300 500');
//this.decoratePoints(pattern, svg);
this.decoratePaths(pattern, svg);
}
/** Decorares points with extra info */
decoratePoints(pattern: Pattern, svg: Svg): void {
for (let partId in pattern.parts) {
let part = pattern.parts[partId];
if (part.render) {
for (let pointId in part.points) {
this.decoratePoint(pointId, part, svg);
}
}
}
}
/** Decorares a point with extra info */
decoratePoint(pointId: string, part: Part, svg: Svg): void {
let point = part.points[pointId];
point.attributes.add('id', svg.getUid());
point.attributes.add('data-point', pointId);
}
/** Decorares paths with extra info */
decoratePaths(pattern: Pattern, svg: Svg): void {
for (let partId in pattern.parts) {
let part = pattern.parts[partId];
if (part.render) {
for (let pathId in part.paths) {
this.decoratePath(pathId, part, svg);
}
}
}
}
/** Decorares a path with extra info */
decoratePath(pathId: string, part: Part, svg: Svg): void {
let path = part.paths[pathId];
if (!path.render) return false;
let id: string;
for (let op of path.ops) {
switch(op.type) {
case 'move':
id = svg.getUid();
part.snippets[id] = new Snippet(op.to, 'path-start-point', `Startpoint of path ${pathId}`);
part.snippets[id].attributes.add('onmouseover', 'pointHover(evt)');
part.snippets[id].attributes.add('id', svg.getUid());
break;
case 'line':
id = svg.getUid();
part.snippets[id] = new Snippet(op.to, 'path-point', `Line endpoint of path ${pathId}`);
part.snippets[id].attributes.add('onmouseover', 'pointHover(evt)');
part.snippets[id].attributes.add('id', svg.getUid());
break;
case 'curve':
id = svg.getUid();
part.snippets[id] = new Snippet(op.to, 'path-point', `Curve endpoint of path ${pathId}`);
part.snippets[id].attributes.add('onmouseover', 'pointHover(evt)');
part.snippets[id].attributes.add('id', svg.getUid());
id = svg.getUid();
part.snippets[id] = new Snippet(op.cp1, 'path-curvecontrol', `Curve cp1 of path ${pathId}`);
part.snippets[id].attributes.add('onmouseover', 'pointHover(evt)');
part.snippets[id].attributes.add('id', svg.getUid());
id = svg.getUid();
part.snippets[id] = new Snippet(op.cp2, 'path-curvecontrol', `Curve cp2 of path ${pathId}`);
part.snippets[id].attributes.add('onmouseover', 'pointHover(evt)');
let cp1 = new Path().move(current).line(op.cp1);
let cp2 = new Path().move(op.to).line(op.cp2);
cp1.attributes.add('class', 'curve-control');
cp1.attributes.add('id', svg.getUid());
cp2.attributes.add('class', 'curve-control');
cp2.attributes.add('id', svg.getUid());
part.paths[svg.getUid()] = cp1;
part.paths[svg.getUid()] = cp2;
break;
}
let current = op.to;
}
}
}

View file

@ -1,11 +0,0 @@
import { Pattern } from '../pattern'
import { Svg } from '../svg'
import { Theme } from './theme';
export class Draft extends Theme {
/** Pre-render method is called just prior to rendering */
preRender(pattern: Pattern, svg: Svg): void {
super.preRender(pattern, svg);
svg.attributes.add('freesewing:theme', 'draft');
}
}

View file

@ -1,34 +0,0 @@
import { Pattern } from '../pattern'
import { Svg } from '../svg'
import { Sample } from './sample';
export class Paperless extends Sample {
/** Pre-render method is called just prior to rendering */
preRender(pattern: Pattern, svg: Svg) {
super.preRender(pattern, svg);
svg.style += `
rect.grid{fill:none;stroke:#555;stroke-width:0.3;fill:url(#grid);}
path.gridline{stroke:#555;stroke-width:0.2;}
path.gridline-lg{stroke:#777;stroke-width:0.2;stroke-dasharray:1.5,1.5;}
path.gridline-sm{stroke:#999;stroke-width:0.1;}
path.gridline-xs{stroke:#999;stroke-width:0.1;stroke-dasharray:0.5,0.5;}
`;
svg.defs += `
<pattern id="metric-grid" height="100" width="100" patternUnits="userSpaceOnUse" >
<path class="gridline-lg" d="M 0 0 L 0 100 L 100 100" />
<path class="gridline" d="M 50 0 L 50 100 M 0 50 L 100 50" />
<path class="gridline-sm" d="M 10 0 L 10 100 M 20 0 L 20 100 M 30 0 L 30 100 M 40 0 L 40 100 M 60 0 L 60 100 M 70 0 L 70 100 M 80 0 L 80 100 M 90 0 L 90 100" />
<path class="gridline-sm" d="M 0 10 L 100 10 M 0 20 L 100 20 M 0 30 L 100 30 M 0 40 L 100 40 M 0 60 L 100 60 M 0 70 L 100 70 M 0 80 L 100 80 M 0 90 L 100 90" />
<path class="gridline-xs" d="M 5 0 L 5 100 M 15 0 L 15 100 M 25 0 L 25 100 M 35 0 L 35 100 M 45 0 L 45 100 M 55 0 L 55 100 M 65 0 L 65 100 M 75 0 L 75 100 M 85 0 L 85 100 M 95 0 L 95 100" />
<path class="gridline-xs" d="M 0 5 L 100 5 M 0 15 L 100 15 M 0 25 L 100 25 M 0 35 L 100 35 M 0 45 L 100 45 M 0 55 L 100 55 M 0 65 L 100 65 M 0 75 L 100 75 M 0 85 L 100 85 M 0 95 L 100 95" />
</pattern>
<pattern id="imperial-grid" height="25.4" width="25.4" patternUnits="userSpaceOnUse" >
<path class="gridline-lg" d="M 0 0 L 0 25.4 L 25.4 25.4" />
<path class="gridline" d="M 12.7 0 L 12.7 25.4 M 0 12.7 L 25.4 12.7" />
<path class="gridline-sm" d="M 3.175 0 L 3.175 25.4 M 6.32 0 L 6.35 25.4 M 9.525 0 L 9.525 25.4 M 15.875 0 L 15.875 25.4 M 19.05 0 L 19.05 25.4 M 22.225 0 L 22.225 25.4" />
<path class="gridline-sm" d="M 0 3.175 L 25.4 3.175 M 0 6.32 L 25.4 6.35 M 0 9.525 L 25.4 9.525 M 0 15.875 L 25.4 15.875 M 0 19.05 L 25.4 19.05 M 0 22.225 L 25.4 22.225" />
</pattern>
`;
}
}

View file

@ -1,15 +0,0 @@
import { Pattern } from '../pattern'
import { Svg } from '../svg'
import { Theme } from './theme';
export class Sample extends Theme {
/** Pre-render method is called just prior to rendering */
preRender(pattern: Pattern, svg: Svg) {
super.preRender(pattern, svg);
svg.style += `
path { fill: none; stroke: #000000; stroke-opacity:1; stroke-width: 0.5; stroke-miterlimit:4; stroke-dashoffset:0; stroke-linecap:round; stroke-linejoin:round; }
path.hidden { fill: none; stroke: none; }
`;
}
}

File diff suppressed because one or more lines are too long

481
package-lock.json generated
View file

@ -33,7 +33,7 @@
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
"requires": { "requires": {
"mime-types": "2.1.18", "mime-types": "~2.1.18",
"negotiator": "0.6.1" "negotiator": "0.6.1"
} }
}, },
@ -42,8 +42,8 @@
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
"integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
"requires": { "requires": {
"micromatch": "2.3.11", "micromatch": "^2.1.5",
"normalize-path": "2.1.1" "normalize-path": "^2.0.0"
} }
}, },
"apache-crypt": { "apache-crypt": {
@ -51,7 +51,7 @@
"resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz", "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz",
"integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=", "integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=",
"requires": { "requires": {
"unix-crypt-td-js": "1.0.0" "unix-crypt-td-js": "^1.0.0"
} }
}, },
"apache-md5": { "apache-md5": {
@ -64,7 +64,7 @@
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"requires": { "requires": {
"arr-flatten": "1.1.0" "arr-flatten": "^1.0.1"
} }
}, },
"arr-flatten": { "arr-flatten": {
@ -129,7 +129,7 @@
"resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.2.13.tgz", "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.2.13.tgz",
"integrity": "sha512-RLQV6Jr6g7J5IDJXFYUhbwBJjuFi1JTsA2PdsVMnwbT7fQhZvEwtI7YF4k+6DEpXsRQ3o3iPj+cOaMP5DjtKsg==", "integrity": "sha512-RLQV6Jr6g7J5IDJXFYUhbwBJjuFi1JTsA2PdsVMnwbT7fQhZvEwtI7YF4k+6DEpXsRQ3o3iPj+cOaMP5DjtKsg==",
"requires": { "requires": {
"live-server": "1.2.0" "live-server": "^1.2.0"
} }
}, },
"binary-extensions": { "binary-extensions": {
@ -142,7 +142,7 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": { "requires": {
"balanced-match": "1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
@ -151,9 +151,9 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"requires": { "requires": {
"expand-range": "1.8.2", "expand-range": "^1.8.1",
"preserve": "0.2.0", "preserve": "^0.2.0",
"repeat-element": "1.1.2" "repeat-element": "^1.1.2"
} }
}, },
"browser-stdout": { "browser-stdout": {
@ -174,12 +174,12 @@
"integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
"dev": true, "dev": true,
"requires": { "requires": {
"assertion-error": "1.1.0", "assertion-error": "^1.0.1",
"check-error": "1.0.2", "check-error": "^1.0.1",
"deep-eql": "3.0.1", "deep-eql": "^3.0.0",
"get-func-name": "2.0.0", "get-func-name": "^2.0.0",
"pathval": "1.1.0", "pathval": "^1.0.0",
"type-detect": "4.0.8" "type-detect": "^4.0.0"
} }
}, },
"check-error": { "check-error": {
@ -193,15 +193,15 @@
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"requires": { "requires": {
"anymatch": "1.3.2", "anymatch": "^1.3.0",
"async-each": "1.0.1", "async-each": "^1.0.0",
"fsevents": "1.2.4", "fsevents": "^1.0.0",
"glob-parent": "2.0.0", "glob-parent": "^2.0.0",
"inherits": "2.0.3", "inherits": "^2.0.1",
"is-binary-path": "1.0.1", "is-binary-path": "^1.0.0",
"is-glob": "2.0.1", "is-glob": "^2.0.0",
"path-is-absolute": "1.0.1", "path-is-absolute": "^1.0.0",
"readdirp": "2.1.0" "readdirp": "^2.0.0"
} }
}, },
"colors": { "colors": {
@ -225,9 +225,9 @@
"resolved": "https://registry.npmjs.org/connect/-/connect-3.5.1.tgz", "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.1.tgz",
"integrity": "sha1-bTDXpjx/FwhXprOqazY9lz3KWI4=", "integrity": "sha1-bTDXpjx/FwhXprOqazY9lz3KWI4=",
"requires": { "requires": {
"debug": "2.2.0", "debug": "~2.2.0",
"finalhandler": "0.5.1", "finalhandler": "0.5.1",
"parseurl": "1.3.2", "parseurl": "~1.3.1",
"utils-merge": "1.0.0" "utils-merge": "1.0.0"
} }
}, },
@ -241,8 +241,8 @@
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz",
"integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=",
"requires": { "requires": {
"object-assign": "4.1.1", "object-assign": "^4",
"vary": "1.1.2" "vary": "^1"
} }
}, },
"debug": { "debug": {
@ -259,7 +259,7 @@
"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true, "dev": true,
"requires": { "requires": {
"type-detect": "4.0.8" "type-detect": "^4.0.0"
} }
}, },
"depd": { "depd": {
@ -314,13 +314,13 @@
"resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
"requires": { "requires": {
"duplexer": "0.1.1", "duplexer": "~0.1.1",
"from": "0.1.7", "from": "~0",
"map-stream": "0.1.0", "map-stream": "~0.1.0",
"pause-stream": "0.0.11", "pause-stream": "0.0.11",
"split": "0.3.3", "split": "0.3",
"stream-combiner": "0.0.4", "stream-combiner": "~0.0.4",
"through": "2.3.8" "through": "~2.3.1"
} }
}, },
"expand-brackets": { "expand-brackets": {
@ -328,7 +328,7 @@
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"requires": { "requires": {
"is-posix-bracket": "0.1.1" "is-posix-bracket": "^0.1.0"
} }
}, },
"expand-range": { "expand-range": {
@ -336,7 +336,7 @@
"resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"requires": { "requires": {
"fill-range": "2.2.4" "fill-range": "^2.1.0"
} }
}, },
"extglob": { "extglob": {
@ -344,7 +344,7 @@
"resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"requires": { "requires": {
"is-extglob": "1.0.0" "is-extglob": "^1.0.0"
} }
}, },
"faye-websocket": { "faye-websocket": {
@ -352,7 +352,7 @@
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
"integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
"requires": { "requires": {
"websocket-driver": "0.7.0" "websocket-driver": ">=0.5.1"
} }
}, },
"filename-regex": { "filename-regex": {
@ -365,11 +365,11 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
"integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
"requires": { "requires": {
"is-number": "2.1.0", "is-number": "^2.1.0",
"isobject": "2.1.0", "isobject": "^2.0.0",
"randomatic": "3.0.0", "randomatic": "^3.0.0",
"repeat-element": "1.1.2", "repeat-element": "^1.1.2",
"repeat-string": "1.6.1" "repeat-string": "^1.5.2"
} }
}, },
"finalhandler": { "finalhandler": {
@ -377,11 +377,11 @@
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.1.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.1.tgz",
"integrity": "sha1-LEANjUUwk1vCMlScX6OF7Afeb80=", "integrity": "sha1-LEANjUUwk1vCMlScX6OF7Afeb80=",
"requires": { "requires": {
"debug": "2.2.0", "debug": "~2.2.0",
"escape-html": "1.0.3", "escape-html": "~1.0.3",
"on-finished": "2.3.0", "on-finished": "~2.3.0",
"statuses": "1.3.1", "statuses": "~1.3.1",
"unpipe": "1.0.0" "unpipe": "~1.0.0"
} }
}, },
"for-in": { "for-in": {
@ -394,7 +394,7 @@
"resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"requires": { "requires": {
"for-in": "1.0.2" "for-in": "^1.0.1"
} }
}, },
"fresh": { "fresh": {
@ -419,8 +419,8 @@
"integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
"optional": true, "optional": true,
"requires": { "requires": {
"nan": "2.10.0", "nan": "^2.9.2",
"node-pre-gyp": "0.10.0" "node-pre-gyp": "^0.10.0"
}, },
"dependencies": { "dependencies": {
"abbrev": { "abbrev": {
@ -442,8 +442,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"delegates": "1.0.0", "delegates": "^1.0.0",
"readable-stream": "2.3.6" "readable-stream": "^2.0.6"
} }
}, },
"balanced-match": { "balanced-match": {
@ -454,7 +454,7 @@
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"requires": { "requires": {
"balanced-match": "1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
@ -508,7 +508,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"minipass": "2.2.4" "minipass": "^2.2.1"
} }
}, },
"fs.realpath": { "fs.realpath": {
@ -521,14 +521,14 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"aproba": "1.2.0", "aproba": "^1.0.3",
"console-control-strings": "1.1.0", "console-control-strings": "^1.0.0",
"has-unicode": "2.0.1", "has-unicode": "^2.0.0",
"object-assign": "4.1.1", "object-assign": "^4.1.0",
"signal-exit": "3.0.2", "signal-exit": "^3.0.0",
"string-width": "1.0.2", "string-width": "^1.0.1",
"strip-ansi": "3.0.1", "strip-ansi": "^3.0.1",
"wide-align": "1.1.2" "wide-align": "^1.1.0"
} }
}, },
"glob": { "glob": {
@ -536,12 +536,12 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"fs.realpath": "1.0.0", "fs.realpath": "^1.0.0",
"inflight": "1.0.6", "inflight": "^1.0.4",
"inherits": "2.0.3", "inherits": "2",
"minimatch": "3.0.4", "minimatch": "^3.0.4",
"once": "1.4.0", "once": "^1.3.0",
"path-is-absolute": "1.0.1" "path-is-absolute": "^1.0.0"
} }
}, },
"has-unicode": { "has-unicode": {
@ -554,7 +554,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"safer-buffer": "2.1.2" "safer-buffer": "^2.1.0"
} }
}, },
"ignore-walk": { "ignore-walk": {
@ -562,7 +562,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"minimatch": "3.0.4" "minimatch": "^3.0.4"
} }
}, },
"inflight": { "inflight": {
@ -570,8 +570,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"once": "1.4.0", "once": "^1.3.0",
"wrappy": "1.0.2" "wrappy": "1"
} }
}, },
"inherits": { "inherits": {
@ -587,7 +587,7 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"requires": { "requires": {
"number-is-nan": "1.0.1" "number-is-nan": "^1.0.0"
} }
}, },
"isarray": { "isarray": {
@ -599,7 +599,7 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"requires": { "requires": {
"brace-expansion": "1.1.11" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": { "minimist": {
@ -610,8 +610,8 @@
"version": "2.2.4", "version": "2.2.4",
"bundled": true, "bundled": true,
"requires": { "requires": {
"safe-buffer": "5.1.1", "safe-buffer": "^5.1.1",
"yallist": "3.0.2" "yallist": "^3.0.0"
} }
}, },
"minizlib": { "minizlib": {
@ -619,7 +619,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"minipass": "2.2.4" "minipass": "^2.2.1"
} }
}, },
"mkdirp": { "mkdirp": {
@ -639,9 +639,9 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"debug": "2.6.9", "debug": "^2.1.2",
"iconv-lite": "0.4.21", "iconv-lite": "^0.4.4",
"sax": "1.2.4" "sax": "^1.2.4"
} }
}, },
"node-pre-gyp": { "node-pre-gyp": {
@ -649,16 +649,16 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"detect-libc": "1.0.3", "detect-libc": "^1.0.2",
"mkdirp": "0.5.1", "mkdirp": "^0.5.1",
"needle": "2.2.0", "needle": "^2.2.0",
"nopt": "4.0.1", "nopt": "^4.0.1",
"npm-packlist": "1.1.10", "npm-packlist": "^1.1.6",
"npmlog": "4.1.2", "npmlog": "^4.0.2",
"rc": "1.2.7", "rc": "^1.1.7",
"rimraf": "2.6.2", "rimraf": "^2.6.1",
"semver": "5.5.0", "semver": "^5.3.0",
"tar": "4.4.1" "tar": "^4"
} }
}, },
"nopt": { "nopt": {
@ -666,8 +666,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"abbrev": "1.1.1", "abbrev": "1",
"osenv": "0.1.5" "osenv": "^0.1.4"
} }
}, },
"npm-bundled": { "npm-bundled": {
@ -680,8 +680,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"ignore-walk": "3.0.1", "ignore-walk": "^3.0.1",
"npm-bundled": "1.0.3" "npm-bundled": "^1.0.1"
} }
}, },
"npmlog": { "npmlog": {
@ -689,10 +689,10 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"are-we-there-yet": "1.1.4", "are-we-there-yet": "~1.1.2",
"console-control-strings": "1.1.0", "console-control-strings": "~1.1.0",
"gauge": "2.7.4", "gauge": "~2.7.3",
"set-blocking": "2.0.0" "set-blocking": "~2.0.0"
} }
}, },
"number-is-nan": { "number-is-nan": {
@ -708,7 +708,7 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"requires": { "requires": {
"wrappy": "1.0.2" "wrappy": "1"
} }
}, },
"os-homedir": { "os-homedir": {
@ -726,8 +726,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"os-homedir": "1.0.2", "os-homedir": "^1.0.0",
"os-tmpdir": "1.0.2" "os-tmpdir": "^1.0.0"
} }
}, },
"path-is-absolute": { "path-is-absolute": {
@ -745,10 +745,10 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"deep-extend": "0.5.1", "deep-extend": "^0.5.1",
"ini": "1.3.5", "ini": "~1.3.0",
"minimist": "1.2.0", "minimist": "^1.2.0",
"strip-json-comments": "2.0.1" "strip-json-comments": "~2.0.1"
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
@ -763,13 +763,13 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"core-util-is": "1.0.2", "core-util-is": "~1.0.0",
"inherits": "2.0.3", "inherits": "~2.0.3",
"isarray": "1.0.0", "isarray": "~1.0.0",
"process-nextick-args": "2.0.0", "process-nextick-args": "~2.0.0",
"safe-buffer": "5.1.1", "safe-buffer": "~5.1.1",
"string_decoder": "1.1.1", "string_decoder": "~1.1.1",
"util-deprecate": "1.0.2" "util-deprecate": "~1.0.1"
} }
}, },
"rimraf": { "rimraf": {
@ -777,7 +777,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"glob": "7.1.2" "glob": "^7.0.5"
} }
}, },
"safe-buffer": { "safe-buffer": {
@ -813,9 +813,9 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"requires": { "requires": {
"code-point-at": "1.1.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "1.0.0", "is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "3.0.1" "strip-ansi": "^3.0.0"
} }
}, },
"string_decoder": { "string_decoder": {
@ -823,14 +823,14 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"safe-buffer": "5.1.1" "safe-buffer": "~5.1.0"
} }
}, },
"strip-ansi": { "strip-ansi": {
"version": "3.0.1", "version": "3.0.1",
"bundled": true, "bundled": true,
"requires": { "requires": {
"ansi-regex": "2.1.1" "ansi-regex": "^2.0.0"
} }
}, },
"strip-json-comments": { "strip-json-comments": {
@ -843,13 +843,13 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"chownr": "1.0.1", "chownr": "^1.0.1",
"fs-minipass": "1.2.5", "fs-minipass": "^1.2.5",
"minipass": "2.2.4", "minipass": "^2.2.4",
"minizlib": "1.1.0", "minizlib": "^1.1.0",
"mkdirp": "0.5.1", "mkdirp": "^0.5.0",
"safe-buffer": "5.1.1", "safe-buffer": "^5.1.1",
"yallist": "3.0.2" "yallist": "^3.0.2"
} }
}, },
"util-deprecate": { "util-deprecate": {
@ -862,7 +862,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"string-width": "1.0.2" "string-width": "^1.0.2"
} }
}, },
"wrappy": { "wrappy": {
@ -887,12 +887,12 @@
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"fs.realpath": "1.0.0", "fs.realpath": "^1.0.0",
"inflight": "1.0.6", "inflight": "^1.0.4",
"inherits": "2.0.3", "inherits": "2",
"minimatch": "3.0.4", "minimatch": "^3.0.4",
"once": "1.4.0", "once": "^1.3.0",
"path-is-absolute": "1.0.1" "path-is-absolute": "^1.0.0"
} }
}, },
"glob-base": { "glob-base": {
@ -900,8 +900,8 @@
"resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"requires": { "requires": {
"glob-parent": "2.0.0", "glob-parent": "^2.0.0",
"is-glob": "2.0.1" "is-glob": "^2.0.0"
} }
}, },
"glob-parent": { "glob-parent": {
@ -909,7 +909,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"requires": { "requires": {
"is-glob": "2.0.1" "is-glob": "^2.0.0"
} }
}, },
"graceful-fs": { "graceful-fs": {
@ -935,15 +935,20 @@
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true "dev": true
}, },
"hooks": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/hooks/-/hooks-0.3.2.tgz",
"integrity": "sha1-ox8GDCAmzqbPHKPrF4Qw5xjhxKM="
},
"http-auth": { "http-auth": {
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz",
"integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=", "integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=",
"requires": { "requires": {
"apache-crypt": "1.2.1", "apache-crypt": "^1.1.2",
"apache-md5": "1.1.2", "apache-md5": "^1.0.6",
"bcryptjs": "2.4.3", "bcryptjs": "^2.3.0",
"uuid": "3.3.2" "uuid": "^3.0.0"
} }
}, },
"http-errors": { "http-errors": {
@ -951,10 +956,10 @@
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
"requires": { "requires": {
"depd": "1.1.2", "depd": "~1.1.2",
"inherits": "2.0.3", "inherits": "2.0.3",
"setprototypeof": "1.1.0", "setprototypeof": "1.1.0",
"statuses": "1.5.0" "statuses": ">= 1.4.0 < 2"
}, },
"dependencies": { "dependencies": {
"statuses": { "statuses": {
@ -975,8 +980,8 @@
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true, "dev": true,
"requires": { "requires": {
"once": "1.4.0", "once": "^1.3.0",
"wrappy": "1.0.2" "wrappy": "1"
} }
}, },
"inherits": { "inherits": {
@ -989,7 +994,7 @@
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"requires": { "requires": {
"binary-extensions": "1.11.0" "binary-extensions": "^1.0.0"
} }
}, },
"is-buffer": { "is-buffer": {
@ -1007,7 +1012,7 @@
"resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"requires": { "requires": {
"is-primitive": "2.0.0" "is-primitive": "^2.0.0"
} }
}, },
"is-extendable": { "is-extendable": {
@ -1025,7 +1030,7 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"requires": { "requires": {
"is-extglob": "1.0.0" "is-extglob": "^1.0.0"
} }
}, },
"is-number": { "is-number": {
@ -1033,7 +1038,7 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"requires": { "requires": {
"kind-of": "3.2.2" "kind-of": "^3.0.2"
} }
}, },
"is-posix-bracket": { "is-posix-bracket": {
@ -1069,7 +1074,7 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"requires": { "requires": {
"is-buffer": "1.1.6" "is-buffer": "^1.1.5"
} }
}, },
"live-server": { "live-server": {
@ -1077,19 +1082,19 @@
"resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.0.tgz", "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.0.tgz",
"integrity": "sha1-RJhkS7+Bpm8Y3Y3/3vYcTBw3TKM=", "integrity": "sha1-RJhkS7+Bpm8Y3Y3/3vYcTBw3TKM=",
"requires": { "requires": {
"chokidar": "1.7.0", "chokidar": "^1.6.0",
"colors": "1.3.0", "colors": "^1.3.0",
"connect": "3.5.1", "connect": "3.5.x",
"cors": "2.8.4", "cors": "^2.8.4",
"event-stream": "3.3.4", "event-stream": "^3.3.4",
"faye-websocket": "0.11.1", "faye-websocket": "0.11.x",
"http-auth": "3.1.3", "http-auth": "3.1.x",
"morgan": "1.9.0", "morgan": "^1.6.1",
"object-assign": "4.1.1", "object-assign": "^4.1.1",
"opn": "5.3.0", "opn": "^5.3.0",
"proxy-middleware": "0.15.0", "proxy-middleware": "^0.15.0",
"send": "0.16.2", "send": "^0.16.2",
"serve-index": "1.9.1" "serve-index": "^1.7.2"
} }
}, },
"make-error": { "make-error": {
@ -1113,19 +1118,19 @@
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"requires": { "requires": {
"arr-diff": "2.0.0", "arr-diff": "^2.0.0",
"array-unique": "0.2.1", "array-unique": "^0.2.1",
"braces": "1.8.5", "braces": "^1.8.2",
"expand-brackets": "0.1.5", "expand-brackets": "^0.1.4",
"extglob": "0.3.2", "extglob": "^0.3.1",
"filename-regex": "2.0.1", "filename-regex": "^2.0.0",
"is-extglob": "1.0.0", "is-extglob": "^1.0.0",
"is-glob": "2.0.1", "is-glob": "^2.0.1",
"kind-of": "3.2.2", "kind-of": "^3.0.2",
"normalize-path": "2.1.1", "normalize-path": "^2.0.1",
"object.omit": "2.0.1", "object.omit": "^2.0.0",
"parse-glob": "3.0.4", "parse-glob": "^3.0.4",
"regex-cache": "0.4.4" "regex-cache": "^0.4.2"
} }
}, },
"mime": { "mime": {
@ -1143,7 +1148,7 @@
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
"requires": { "requires": {
"mime-db": "1.33.0" "mime-db": "~1.33.0"
} }
}, },
"minimatch": { "minimatch": {
@ -1151,7 +1156,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": { "requires": {
"brace-expansion": "1.1.11" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": { "minimist": {
@ -1210,11 +1215,11 @@
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz",
"integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=",
"requires": { "requires": {
"basic-auth": "2.0.0", "basic-auth": "~2.0.0",
"debug": "2.6.9", "debug": "2.6.9",
"depd": "1.1.2", "depd": "~1.1.1",
"on-finished": "2.3.0", "on-finished": "~2.3.0",
"on-headers": "1.0.1" "on-headers": "~1.0.1"
}, },
"dependencies": { "dependencies": {
"debug": { "debug": {
@ -1253,7 +1258,7 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"requires": { "requires": {
"remove-trailing-separator": "1.1.0" "remove-trailing-separator": "^1.0.1"
} }
}, },
"object-assign": { "object-assign": {
@ -1266,8 +1271,8 @@
"resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"requires": { "requires": {
"for-own": "0.1.5", "for-own": "^0.1.4",
"is-extendable": "0.1.1" "is-extendable": "^0.1.1"
} }
}, },
"on-finished": { "on-finished": {
@ -1289,7 +1294,7 @@
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true, "dev": true,
"requires": { "requires": {
"wrappy": "1.0.2" "wrappy": "1"
} }
}, },
"opn": { "opn": {
@ -1297,7 +1302,7 @@
"resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
"integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
"requires": { "requires": {
"is-wsl": "1.1.0" "is-wsl": "^1.1.0"
} }
}, },
"parse-glob": { "parse-glob": {
@ -1305,10 +1310,10 @@
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"requires": { "requires": {
"glob-base": "0.3.0", "glob-base": "^0.3.0",
"is-dotfile": "1.0.3", "is-dotfile": "^1.0.0",
"is-extglob": "1.0.0", "is-extglob": "^1.0.0",
"is-glob": "2.0.1" "is-glob": "^2.0.0"
} }
}, },
"parseurl": { "parseurl": {
@ -1332,7 +1337,7 @@
"resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
"integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
"requires": { "requires": {
"through": "2.3.8" "through": "~2.3"
} }
}, },
"preserve": { "preserve": {
@ -1355,9 +1360,9 @@
"resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
"integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
"requires": { "requires": {
"is-number": "4.0.0", "is-number": "^4.0.0",
"kind-of": "6.0.2", "kind-of": "^6.0.0",
"math-random": "1.0.1" "math-random": "^1.0.1"
}, },
"dependencies": { "dependencies": {
"is-number": { "is-number": {
@ -1382,13 +1387,13 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": { "requires": {
"core-util-is": "1.0.2", "core-util-is": "~1.0.0",
"inherits": "2.0.3", "inherits": "~2.0.3",
"isarray": "1.0.0", "isarray": "~1.0.0",
"process-nextick-args": "2.0.0", "process-nextick-args": "~2.0.0",
"safe-buffer": "5.1.2", "safe-buffer": "~5.1.1",
"string_decoder": "1.1.1", "string_decoder": "~1.1.1",
"util-deprecate": "1.0.2" "util-deprecate": "~1.0.1"
} }
}, },
"readdirp": { "readdirp": {
@ -1396,10 +1401,10 @@
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
"integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
"requires": { "requires": {
"graceful-fs": "4.1.11", "graceful-fs": "^4.1.2",
"minimatch": "3.0.4", "minimatch": "^3.0.2",
"readable-stream": "2.3.6", "readable-stream": "^2.0.2",
"set-immediate-shim": "1.0.1" "set-immediate-shim": "^1.0.1"
} }
}, },
"regex-cache": { "regex-cache": {
@ -1407,7 +1412,7 @@
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
"integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
"requires": { "requires": {
"is-equal-shallow": "0.1.3" "is-equal-shallow": "^0.1.3"
} }
}, },
"remove-trailing-separator": { "remove-trailing-separator": {
@ -1436,18 +1441,18 @@
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
"requires": { "requires": {
"debug": "2.6.9", "debug": "2.6.9",
"depd": "1.1.2", "depd": "~1.1.2",
"destroy": "1.0.4", "destroy": "~1.0.4",
"encodeurl": "1.0.2", "encodeurl": "~1.0.2",
"escape-html": "1.0.3", "escape-html": "~1.0.3",
"etag": "1.8.1", "etag": "~1.8.1",
"fresh": "0.5.2", "fresh": "0.5.2",
"http-errors": "1.6.3", "http-errors": "~1.6.2",
"mime": "1.4.1", "mime": "1.4.1",
"ms": "2.0.0", "ms": "2.0.0",
"on-finished": "2.3.0", "on-finished": "~2.3.0",
"range-parser": "1.2.0", "range-parser": "~1.2.0",
"statuses": "1.4.0" "statuses": "~1.4.0"
}, },
"dependencies": { "dependencies": {
"debug": { "debug": {
@ -1475,13 +1480,13 @@
"resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
"integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
"requires": { "requires": {
"accepts": "1.3.5", "accepts": "~1.3.4",
"batch": "0.6.1", "batch": "0.6.1",
"debug": "2.6.9", "debug": "2.6.9",
"escape-html": "1.0.3", "escape-html": "~1.0.3",
"http-errors": "1.6.3", "http-errors": "~1.6.2",
"mime-types": "2.1.18", "mime-types": "~2.1.17",
"parseurl": "1.3.2" "parseurl": "~1.3.2"
}, },
"dependencies": { "dependencies": {
"debug": { "debug": {
@ -1521,8 +1526,8 @@
"integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==",
"dev": true, "dev": true,
"requires": { "requires": {
"buffer-from": "1.1.0", "buffer-from": "^1.0.0",
"source-map": "0.6.1" "source-map": "^0.6.0"
} }
}, },
"split": { "split": {
@ -1530,7 +1535,7 @@
"resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
"integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
"requires": { "requires": {
"through": "2.3.8" "through": "2"
} }
}, },
"statuses": { "statuses": {
@ -1543,7 +1548,7 @@
"resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
"integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
"requires": { "requires": {
"duplexer": "0.1.1" "duplexer": "~0.1.1"
} }
}, },
"string_decoder": { "string_decoder": {
@ -1551,7 +1556,7 @@
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": { "requires": {
"safe-buffer": "5.1.2" "safe-buffer": "~5.1.0"
} }
}, },
"supports-color": { "supports-color": {
@ -1560,7 +1565,7 @@
"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
"dev": true, "dev": true,
"requires": { "requires": {
"has-flag": "3.0.0" "has-flag": "^3.0.0"
} }
}, },
"through": { "through": {
@ -1574,14 +1579,14 @@
"integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==", "integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"arrify": "1.0.1", "arrify": "^1.0.0",
"buffer-from": "1.1.0", "buffer-from": "^1.1.0",
"diff": "3.5.0", "diff": "^3.1.0",
"make-error": "1.3.4", "make-error": "^1.1.1",
"minimist": "1.2.0", "minimist": "^1.2.0",
"mkdirp": "0.5.1", "mkdirp": "^0.5.1",
"source-map-support": "0.5.6", "source-map-support": "^0.5.6",
"yn": "2.0.0" "yn": "^2.0.0"
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
@ -1639,8 +1644,8 @@
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
"integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
"requires": { "requires": {
"http-parser-js": "0.4.13", "http-parser-js": ">=0.4.0",
"websocket-extensions": "0.1.3" "websocket-extensions": ">=0.1.1"
} }
}, },
"websocket-extensions": { "websocket-extensions": {

View file

@ -20,7 +20,8 @@
}, },
"homepage": "https://github.com/joostdecock/freesewing#readme", "homepage": "https://github.com/joostdecock/freesewing#readme",
"dependencies": { "dependencies": {
"bezier-js": "^2.2.13" "bezier-js": "^2.2.13",
"hooks": "^0.3.2"
}, },
"devDependencies": { "devDependencies": {
"@types/bezier-js": "0.0.7", "@types/bezier-js": "0.0.7",