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 { 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'
import { Freesewing } from './lib/freesewing'
var Freesewing = {
version: '1.0.1',
pattern: Pattern,
point: Point,
path: Path,
snippet: Snippet,
utils,
bezier
}
var freesewing = new Freesewing();
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) {
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);
};
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 { Part } from './part'
import { Svg } from './svg'
import { Hooks } from './hooks'
import { Option } from './option'
import themes from './themes'
import { Theme } from './themes/theme'
export class Pattern {
config: PatternConfig;
svg: Svg = new Svg();
themes: {[index:string]: Theme} = themes;
parts: {
[index: string]: Part;
}
options: {[propName: string]: number};
values: {[propName: string]: any} = {};
settings: {[propName: string]: any} = {mode: 'draft', units: 'metric'};
hooks: Hooks;
on: function;
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.parts = {};
this.hooks = new Hooks();
this.on = this.hooks.on;
for (let id of config.parts) {
this.parts[id] = new Part(id);
}
this.options = {};
if(typeof config.options !== 'undefined' && config.options.length > 0) {
for (let conf of config.options) {
if(conf.type === 'percentage') this.options[conf.id] = conf.val/100;
else this.options[conf.id] = conf.val;
}
}
return this;
}
@ -39,9 +47,13 @@ export class Pattern {
}
render(): string {
let svg = new Svg();
let theme = this.themes[this.settings.mode];
theme.preRender(this, svg);
let svg = new Svg(this);
this.hooks.attach('loadStyle', svg);
//svg.pre('preRenderSvg', function(next) {
// console.log('manual attach');
// this.style += "path {stroke: #000; fill: none;}";
// next();
//});
return svg.render(this);
}

View file

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

View file

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