From 149c749a1bc6882672042937f96171524d41fe82 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Thu, 8 Mar 2018 19:36:02 -0500 Subject: [PATCH 01/16] ease module --- src/index.ts | 1 + src/modules/ease.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/modules/ease.ts diff --git a/src/index.ts b/src/index.ts index de7322b..d60907d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -69,3 +69,4 @@ export * from "./modules/snap"; export * from "./modules/behavior"; export * from "./modules/interval"; export * from "./modules/timeout"; +export * from "./modules/ease"; diff --git a/src/modules/ease.ts b/src/modules/ease.ts new file mode 100644 index 0000000..bdd5ce9 --- /dev/null +++ b/src/modules/ease.ts @@ -0,0 +1,63 @@ +import { Entity } from "../entities/entity"; +import { IntervalEventData } from "../events/interval-event"; + +export type EaseAssign = (value: number) => void; + +export function easeLinear(entity: Entity, + start: number, + end: number, + duration: number, + cb: EaseAssign): void { + easeBase(entity, duration, (t: number) => { + cb((end - start) * t + start); + }); +} + +export function easeQuadBezier(entity: Entity, + start: number, + end: number, + p0: number, + duration: number, + cb: EaseAssign): void { + easeBase(entity, duration, (t: number) => { + const a = Math.pow(1 - t, 2); + const b = 2 * (1 - t) * t; + const c = Math.pow(t, 2); + + cb(a * start + b * p0 + c * end); + }); +} + +export function easeCubeBezier(entity: Entity, + start: number, + end: number, + p0: number, + p1: number, + duration: number, + cb: EaseAssign): void { + easeBase(entity, duration, (t: number) => { + const a = Math.pow(1 - t, 3); + const b = 3 * Math.pow(1 - t, 2) * t; + const c = 3 * (1 - t) * Math.pow(t, 2); + const d = Math.pow(t, 3); + + cb(a * start + b * p0 + c * p1 + d * end); + }); +} + +export function easeBase(entity: Entity, duration: number, cb: EaseAssign): void { + let t = 0; + + const f = function(event: IntervalEventData) { + t += event.dt; + + if (t > duration) { + cb(1); + entity.off(f); + } else { + cb(t / duration); + } + } + + entity.on("interval", f); +} From 1bb18f5c999e5c87f4efa92b47c8f5f89d2021d3 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sun, 11 Mar 2018 09:43:14 -0400 Subject: [PATCH 02/16] TilesetEntity --- src/components/tileset-component.ts | 21 +++++ src/entities/tileset-entity.ts | 68 ++++++++++++++++ src/index.ts | 1 + test/entities/tileset-entity-test.ts | 116 +++++++++++++++++++++++++++ 4 files changed, 206 insertions(+) create mode 100644 src/components/tileset-component.ts create mode 100644 src/entities/tileset-entity.ts create mode 100644 test/entities/tileset-entity-test.ts diff --git a/src/components/tileset-component.ts b/src/components/tileset-component.ts new file mode 100644 index 0000000..7665c0e --- /dev/null +++ b/src/components/tileset-component.ts @@ -0,0 +1,21 @@ +import { Assets } from "../util/assets"; + +export interface TilesetData { + assets: { load(asset: string): any }; + tileset: string; + data: number[][]; +} + +export class TilesetComponent implements TilesetData { + assets: { load(asset: string): any }; + tileset: string; + data: number[][]; + + constructor(options?: Partial) { + this.assets = new Assets(); + this.tileset = ""; + this.data = []; + + Object.assign(this, options); + } +} diff --git a/src/entities/tileset-entity.ts b/src/entities/tileset-entity.ts new file mode 100644 index 0000000..194fea4 --- /dev/null +++ b/src/entities/tileset-entity.ts @@ -0,0 +1,68 @@ +import { Tileset } from "../util/tileset"; + +import { + PositionData, + PositionComponent, +} from "../components/position-component"; + +import { + RenderData, + RenderComponent, +} from "../components/render-component"; + +import { + TilesetData, + TilesetComponent, +} from "../components/tileset-component"; + +import { RenderSystem } from "../systems/render-system"; + +import { + BaseEntity, + BaseEntityConfig, +} from "./base-entity"; + +export interface TilesetEntityConfig extends BaseEntityConfig { + tileset: Partial; + render: Partial; + position: Partial; +} + +export class TilesetEntity extends BaseEntity { + tileset: TilesetData; + render: RenderData; + position: PositionData; + + constructor(config?: Partial) { + super(config); + const layer = document.createElement("canvas"); + const layerCtx = layer.getContext("2d"); + + if (layerCtx === null) { + throw new Error("Failed to create 2d context"); + } + + this.position = new PositionComponent(config && config.position); + + this.tileset = new TilesetComponent(config && config.tileset); + + const tileset = this.tileset.assets.load(this.tileset.tileset) as Tileset; + + layer.width = this.position.width; + layer.height = this.position.height; + + tileset.ready(() => { + for (let j = 0; j < this.tileset.data.length; j += 1) { + for (let i = 0; i < this.tileset.data[j].length; i += 1) { + tileset.drawTile(layerCtx, this.tileset.data[j][i], i, j); + } + } + }); + + this.render = new RenderComponent(Object.assign({ + image: layer, + }, config && config.render)); + + RenderSystem(this); + } +} diff --git a/src/index.ts b/src/index.ts index d60907d..5a08f3c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,6 +25,7 @@ export * from "./entities/collection-entity"; export * from "./entities/simple-entity"; export * from "./entities/stack-entity"; export * from "./entities/stage-entity"; +export * from "./entities/tileset-entity"; export * from "./events/collision-event"; export * from "./events/control-event"; diff --git a/test/entities/tileset-entity-test.ts b/test/entities/tileset-entity-test.ts new file mode 100644 index 0000000..2254ba4 --- /dev/null +++ b/test/entities/tileset-entity-test.ts @@ -0,0 +1,116 @@ +import "../test_helper"; + +import { expect } from "chai"; +import * as sinon from "sinon"; +//@ts-ignore +const jsdom = require("mocha-jsdom"); + +import { TilesetEntity } from "../../src/entities/tileset-entity"; + +const sandbox = sinon.createSandbox(); + +describe("TilesetEntity", function() { + jsdom(); + + afterEach(function() { + sandbox.restore(); + }); + + describe("#constructor", function() { + it("should draw tiles to render image", function() { + const assets = { load: () => {} }; + const canvas = { getContext: () => {}, width: 0, height: 0 }; + const tileset = { ready: () => {}, drawTile: () => {} }; + + const mockTileset = sandbox.mock(tileset); + mockTileset.expects("ready") + .once() + .withArgs(sinon.match.func) + .callsArg(0); + mockTileset.expects("drawTile").once().withArgs("ctx", 0, 0, 0); + mockTileset.expects("drawTile").once().withArgs("ctx", 1, 1, 0); + mockTileset.expects("drawTile").once().withArgs("ctx", 2, 0, 1); + mockTileset.expects("drawTile").once().withArgs("ctx", 3, 1, 1); + + const mockCanvas = sandbox.mock(canvas); + mockCanvas.expects("getContext").once().withArgs("2d").returns("ctx"); + + const mockAssets = sandbox.mock(assets); + mockAssets.expects("load").once().withArgs("tileset-v").returns(tileset); + + const mockDocument = sandbox.mock(document); + mockDocument.expects("createElement") + .once() + .withArgs("canvas") + .returns(canvas); + + const tilesetEntity = new TilesetEntity({ + tileset: { + tileset: "tileset-v", + assets: assets, + data: [ + [ 0, 1 ], + [ 2, 3 ], + ], + }, + }); + + expect(tilesetEntity).to.containSubset({ + tileset: { + tileset: "tileset-v", + assets: assets, + data: [ + [ 0, 1 ], + [ 2, 3 ], + ], + }, + render: { + image: canvas, + }, + position: { + width: 0, + height: 0, + }, + }); + + sandbox.verify(); + }); + + it("should throw error", function() { + const assets = { load: () => {} }; + const canvas = { getContext: () => {}, width: 0, height: 0 }; + const tileset = { ready: () => {}, drawTile: () => {} }; + + const mockTileset = sandbox.mock(tileset); + mockTileset.expects("ready").never(); + mockTileset.expects("drawTile").never(); + + const mockCanvas = sandbox.mock(canvas); + mockCanvas.expects("getContext").once().withArgs("2d").returns(null); + + const mockAssets = sandbox.mock(assets); + mockAssets.expects("load").never(); + + const mockDocument = sandbox.mock(document); + mockDocument.expects("createElement") + .once() + .withArgs("canvas") + .returns(canvas); + + expect(function() { + new TilesetEntity({ + tileset: { + tileset: "tileset-v", + assets: assets, + data: [ + [ 0, 1 ], + [ 2, 3 ], + ], + }, + }); + }).to.throw(); + + sandbox.verify(); + }); + }); +}); From 57f6bd691172c7a475274c8f075b32b53f78d052 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 17 Mar 2018 12:32:31 -0400 Subject: [PATCH 03/16] BackgroundEntity --- src/components/background-component.ts | 25 +++++++++++ src/entities/background-entity.ts | 47 ++++++++++++++++++++ src/systems/background-system.ts | 60 ++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 src/components/background-component.ts create mode 100644 src/entities/background-entity.ts create mode 100644 src/systems/background-system.ts diff --git a/src/components/background-component.ts b/src/components/background-component.ts new file mode 100644 index 0000000..53d3b23 --- /dev/null +++ b/src/components/background-component.ts @@ -0,0 +1,25 @@ +export interface BackgroundData { + fixed: boolean; + xPeriod: number; + yPeriod: number; + xAmp: number; + yAmp: number; +} + +export class BackgroundComponent implements BackgroundData { + fixed: boolean; + xPeriod: number; + yPeriod: number; + xAmp: number; + yAmp: number; + + constructor(options?: Partial) { + this.fixed = false; + this.xPeriod = 0; + this.yPeriod = 0; + this.xAmp = 0; + this.yAmp = 0; + + Object.assign(this, options); + } +} diff --git a/src/entities/background-entity.ts b/src/entities/background-entity.ts new file mode 100644 index 0000000..ecc8e31 --- /dev/null +++ b/src/entities/background-entity.ts @@ -0,0 +1,47 @@ +import { + BaseEntity, + BaseEntityConfig, +} from "./base-entity"; + +import { + PositionData, + PositionComponent, +} from "../components/position-component"; + +import { + RenderData, + RenderComponent, +} from "../components/render-component"; + +import { + BackgroundData, + BackgroundComponent, +} from "../components/background-component"; + +import { BackgroundSystem } from "../systems/background-system"; +import { RenderSystem } from "../systems/render-system"; + +export interface BackgroundEntityConfig extends BaseEntityConfig { + position: Partial; + render: Partial; + background: Partial; +} + +export class BackgroundEntity extends BaseEntity { + position: PositionData; + render: RenderData; + background: BackgroundData; + + constructor(config?: Partial) { + super(config); + + this.position = new PositionComponent(config && config.position); + + this.render = new RenderComponent(config && config.render); + + this.background = new BackgroundComponent(config && config.background); + + BackgroundSystem(this); + RenderSystem(this); + } +} diff --git a/src/systems/background-system.ts b/src/systems/background-system.ts new file mode 100644 index 0000000..3eb6eb6 --- /dev/null +++ b/src/systems/background-system.ts @@ -0,0 +1,60 @@ +import { Entity } from "../entities/entity"; + +import { IntervalEventData } from "../events/interval-event" +import { RenderEventData } from "../events/render-event" + +import { PositionData } from "../components/position-component"; + +import { BackgroundData } from "../components/background-component"; + +export interface BackgroundSystemEntity extends Entity { + position: PositionData; + background: BackgroundData; +} + +export function BackgroundSystem(entity: BackgroundSystemEntity): void { + let xT = 0; + let yT = 0; + + entity.on("interval", (event: IntervalEventData) => { + xT += event.dt; + yT += event.dt; + + if (xT >= entity.background.xPeriod) { + xT -= entity.background.xPeriod; + } + + if (yT >= entity.background.yPeriod) { + yT -= entity.background.yPeriod; + } + }); + + entity.around("render", (f: Function, event: RenderEventData) => { + if (entity.background.fixed) { + entity.position.x = event.viewport.left; + entity.position.y = event.viewport.top; + + entity.position.x += + (xT / entity.background.xPeriod) * entity.background.xAmp; + entity.position.y += + (yT / entity.background.yPeriod) * entity.background.yAmp; + + f(); + } else { + const xSave = entity.position.x; + const ySave = entity.position.y; + + try { + entity.position.x = + xSave + (xT / entity.background.xPeriod) * entity.background.xAmp; + entity.position.y = + ySave + (yT / entity.background.yPeriod) * entity.background.yAmp; + + f(); + } finally { + entity.position.x = xSave; + entity.position.y = ySave; + } + } + }); +} From b3c0ef22faf1777b9bbbcbc3b98cbd8bdb53e65c Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 17 Mar 2018 12:33:11 -0400 Subject: [PATCH 04/16] Make assets config optional --- src/util/assets.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/util/assets.ts b/src/util/assets.ts index 234feed..1fb4ee5 100644 --- a/src/util/assets.ts +++ b/src/util/assets.ts @@ -9,19 +9,19 @@ type Cacheable = Sprite | Tileset | RawImage; export type AssetItem = { type: string, data: any }; export type AssetTable = { [ key: string ]: AssetItem | undefined }; export interface AssetConfig { - preload?: boolean; + preload: boolean; assets: AssetTable; } export class Assets { - private _config: AssetConfig; + private _assets: AssetTable; private _cache: { [ key: string ]: Cacheable | undefined }; - constructor(config: AssetConfig) { - this._config = config; + constructor(config?: Partial) { + this._assets = config && config.assets || {}; this._cache = {}; - if (this._config.preload !== undefined && this._config.preload) { + if (config !== undefined && config.preload) { this._preload(); } } @@ -78,7 +78,7 @@ export class Assets { } load(asset: string): any { - const data = this._config.assets[asset]; + const data = this._assets[asset]; if (data !== undefined) { switch (data.type) { @@ -138,8 +138,8 @@ export class Assets { private _filterType(type: string): string[] { const rval: string[] = []; - for (let e in this._config.assets) { - const asset = this._config.assets[e]; + for (let e in this._assets) { + const asset = this._assets[e]; if (asset !== undefined && asset.type === type) { rval.push(e); @@ -150,8 +150,8 @@ export class Assets { } private _preload(): void { - for (let e in this._config.assets) { - const value = this._config.assets[e]; + for (let e in this._assets) { + const value = this._assets[e]; if (value !== undefined && this._cache[e] === undefined) { switch (value.type) { From 53f6de631dfb57d5f061e891179f3903b1e07f76 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 17 Mar 2018 12:34:31 -0400 Subject: [PATCH 05/16] Stage refacoring --- package.json | 5 +- src/components/stage-component.ts | 25 + src/entities/stage-entity.ts | 59 +-- src/util/stage.ts | 542 ++++++++++++--------- test/test_helper.ts | 2 + test/util/stage-test.ts | 753 +++++++++++++++--------------- yarn.lock | 20 +- 7 files changed, 747 insertions(+), 659 deletions(-) create mode 100644 src/components/stage-component.ts diff --git a/package.json b/package.json index 89eb78c..012d102 100644 --- a/package.json +++ b/package.json @@ -46,17 +46,20 @@ }, "devDependencies": { "@types/chai": "^4.0.5", + "@types/chai-subset": "^1.3.1", "@types/mocha": "^2.2.44", "@types/sinon": "^4.0.0", "@types/sinon-chai": "^2.7.29", "chai": "^4.1.2", + "chai-iterator": "^1.1.4", + "chai-subset": "^1.6.0", "coveralls": "^3.0.0", "jsdom": "^9.0", "mocha": "^5.0.1", "mocha-jsdom": "^1.1.0", "nyc": "^11.3.0", "sinon": "^4.1.2", - "sinon-chai": "^2.14.0", + "sinon-chai": "^3.0.0", "source-map-support": "^0.5.0", "ts-node": "^5.0.1", "tslint": "^5.8.0", diff --git a/src/components/stage-component.ts b/src/components/stage-component.ts new file mode 100644 index 0000000..daf421c --- /dev/null +++ b/src/components/stage-component.ts @@ -0,0 +1,25 @@ +import { Assets } from "../util/assets"; +import { Stage } from "../util/stage"; + +export interface StageData { + name: string; + assets: Assets; + stage: Stage; + gravity: number; +} + +export class StageComponent implements StageData { + name: string; + assets: Assets; + stage: Stage; + gravity: number; + + constructor(options?: Partial) { + this.name = ""; + this.assets = new Assets(); + this.stage = new Stage(0, 0); + this.gravity = 0; + + Object.assign(this, options); + } +} diff --git a/src/entities/stage-entity.ts b/src/entities/stage-entity.ts index a1ff8a8..0cfd8e1 100644 --- a/src/entities/stage-entity.ts +++ b/src/entities/stage-entity.ts @@ -1,6 +1,9 @@ -import { Assets } from "../util/assets"; import { Stage } from "../util/stage"; -import { RenderEventData } from "../events/render-event"; + +import { + StageData, + StageComponent, +} from "../components/stage-component"; import { PositionData, @@ -17,68 +20,44 @@ import { CollectionEntity } from "./collection-entity"; import { MoveMediatorSystem } from "../systems/move-mediator-system"; import { CollisionMediatorSystem } from "../systems/collision-mediator-system"; import { RenderSystem } from "../systems/render-system"; -import { RenderBackendItem } from "../util/render-backend"; export interface StageConfig { - assets: Assets; - stage?: string | Stage; - gravity?: number; + stage?: Partial; position?: Partial; render?: Partial; } export class StageEntity extends CollectionEntity { + stage: StageData; position: PositionData; render: RenderData; - protected stage: Stage; - protected layers: RenderBackendItem[]; - constructor(config: StageConfig) { super(); - if (config.stage === undefined) { - const width = config.position && config.position.width || 0; - const height = config.position && config.position.height || 0; - this.stage = new Stage(width, height); - } else if (typeof config.stage === "string") { - this.stage = config.assets.load(config.stage); - } else { - this.stage = config.stage; - } + const width = config && config.position && config.position.width || 0; + const height = config && config.position && config.position.height || 0; + + this.stage = new StageComponent(Object.assign({ + stage: new Stage(width, height), + }, config && config.stage)); this.position = new PositionComponent(Object.assign({ - width: this.stage.bounds().right + 1, - height: this.stage.bounds().bottom + 1, + width: this.stage.stage.bounds().right + 1, + height: this.stage.stage.bounds().bottom + 1, }, config && config.position)); this.render = new RenderComponent(config && config.render); - for (let e of this.stage.buildEntities(config)) { + for (let e of this.stage.stage.buildEntities(this.stage)) { this.put(e); } MoveMediatorSystem(this, { - gravity: config.gravity || 0, - bounds: this.stage.bounds(), + gravity: this.stage.gravity || 0, + bounds: this.stage.stage.bounds(), }); - CollisionMediatorSystem(this, { bounds: this.stage.bounds() }); + CollisionMediatorSystem(this, { bounds: this.stage.stage.bounds() }); RenderSystem(this); - - this.layers = this.stage.buildLayers(config).map((e) => { - return { - x: 0, - y: 0, - width: 0, - height: 0, - render: e, - }; - }); - - this.on("render", (event: RenderEventData) => { - for (let e of this.layers) { - event.backend.add(e); - } - }); } } diff --git a/src/util/stage.ts b/src/util/stage.ts index 3647406..6387eaf 100644 --- a/src/util/stage.ts +++ b/src/util/stage.ts @@ -1,7 +1,5 @@ import { Entity } from "../entities/entity"; -import { Tileset } from "./tileset"; import { Bounds, Circle, Polygon } from "./shape"; -import { RenderData } from "../components/render-component"; export interface BuildableProperty { value: any; @@ -27,211 +25,135 @@ export interface BuildConfig { assets: { load(asset: string): any }; } -export interface StageTMX { - map: { - $: { - width: string; - height: string; - tilewidth: string; - tileheight: string; - }; - tileset?: ({ $: { source: string } })[]; - properties?: ({ - property?: ({ - $: { - name: string; - type: string; - value: string; - }; - })[]; - })[]; - layer?: ({ - $: { - width: string; - height: string; - }; - data?: ({ _?: string; })[]; - })[]; - objectgroup?: ({ - object?: ({ - $: { - type?: string; - x: string; - y: string; - width: string; - height: string; - visible?: string; - }; - ellipse?: {}[]; - polygon?: ({ $: { points: string; } })[]; - properties?: ({ - property?: ({ - $: { - name: string; - type: string; - value: string; - }; - })[]; - })[]; - })[]; - })[]; +export interface StageTMXProperty { + "#name": "property"; + $: { + name: string; + type: string; + value: string; }; } -export class Stage { - private _width: number; - private _height: number; - private _entities: BuildableEntity[]; - private _tiles: BuildableTileLayer[]; - private _tileset?: string; - private _props: { [key: string]: any }; - - constructor(width: number, height: number, tileset?: string) { - this._entities = []; - this._tiles = []; - this._width = width; - this._height = height; - if (tileset !== undefined) { - this._tileset = tileset.split("/").reverse()[0]; - } - this._props = {}; - } - - static fromTMX(data: StageTMX): Stage { - const width = Number(data.map.$.width) * Number(data.map.$.tilewidth); - const height = Number(data.map.$.height) * Number(data.map.$.tileheight); +export interface StageTMXProperties { + "#name": "properties"; + $$?: StageTMXProperty[]; +} - const stage = (data.map.tileset !== undefined && - data.map.tileset.length > 0) ? - new Stage(width, height, data.map.tileset[0].$.source) : - new Stage(width, height); +export interface StageTMXTileset { + "#name": "tileset"; + $: { source: string }; +} - if (data.map.properties !== undefined) { - for (let e of data.map.properties) { - if (e.property !== undefined) { - for (let f of e.property) { - stage.prop(f.$.name, _valueForProperty(f.$.type, f.$.value).value); - } - } - } - } +export interface StageTMXLayerData { + "#name": "data"; + $: { encoding: string }; + _?: string; +} - if (data.map.layer !== undefined) { - for (let e of data.map.layer) { - const width = Number(e.$.width); - const height = Number(e.$.height); +export interface StageTMXLayer { + "#name": "layer"; + $: { + width: string; + height: string; + }; + $$: [ StageTMXLayerData ]; +} - let data = ""; - if (e.data !== undefined) { - for (let f of e.data) { - if (f._ !== undefined) { - data += f._; - } - } - } - const dataRows = data.trim().split("\n"); +export interface StageTMXImage { + "#name": "image"; + $: { + source: string; + width: string; + height: string; + }; +} - const tiles = new Array(height) as number[][]; - for (let i = 0; i < height; ++i) { - tiles[i] = new Array(width); - tiles[i].fill(0); +export interface StageTMXImageLayer { + "#name": "imagelayer"; + $$: [ StageTMXImage ]; +} - if (i < dataRows.length) { - const row = dataRows[i].split(","); +export interface StageTMXEllipse { + "#name": "ellipse"; +} - for (let j = 0; j < Math.min(row.length, tiles[i].length); ++j) { - tiles[i][j] = Number(row[j]); - } - } - } +export interface StageTMXPolygon { + "#name": "polygon"; + $: { points: string }; +} - stage.addLayer({ - width: width, - height: height, - data: tiles, - }); - } - } +export type StageTMXObjectChild = StageTMXProperties | + StageTMXPolygon | + StageTMXEllipse ; + +export interface StageTMXObject { + "#name": "object"; + $: { + type?: string; + x: string; + y: string; + width: string; + height: string; + visible?: string; + }; + $$?: StageTMXObjectChild[]; +} - if (data.map.objectgroup !== undefined) { - for (let e of data.map.objectgroup) { - if (e.object !== undefined) { - for (let f of e.object) { - const entity = { - type: (f.$.type !== undefined ? f.$.type : "default"), - components: {}, - } as BuildableEntity; - - let x = Number(f.$.x); - let y = Number(f.$.y); - let width = Number(f.$.width); - let height = Number(f.$.height); - let mask = undefined as BuildableProperty | undefined; - - if (f.ellipse) { - const r = Number(f.$.width) / 2; - mask = { - value: new Circle(r, 0, 0), - type: "value", - }; - } else if (f.polygon) { - const pairs = f.polygon[0].$.points.split(" "); - const points = pairs.map((e: string) => { - return e.split(",", 2).map((e) => Number(e)); - }) as ([ number, number ])[]; - - let left = Infinity; - let top = Infinity; - let right = -Infinity; - let bottom = -Infinity; - - for (let e of points) { - left = Math.min(e[0], left); - top = Math.min(e[1], top); - right = Math.max(e[0], right); - bottom = Math.max(e[1], bottom); - } - - x += left; - y += top; - width = right - left + 1; - height = bottom - top + 1; - - mask = { - type: "value", - value: new Polygon(points.map((e) => { - return [ e[0] - left, e[1] - top ] as [ number, number ]; - })), - }; - } +export interface StageTMXObjectGroup { + "#name": "objectgroup"; + $$?: StageTMXObject[]; +} - entity.components.position = { - x: { value: x, type: "value" }, - y: { value: y, type: "value" }, - width: { value: width, type: "value" }, - height: { value: height, type: "value" }, - }; +export type StageTMXChild = StageTMXProperties | + StageTMXImageLayer | + StageTMXObjectGroup | + StageTMXTileset | + StageTMXLayer; - if (mask !== undefined) { - entity.components.position.mask = mask; - } +export interface StageTMX { + "#name": "map"; + $: { + width: string; + height: string; + tilewidth: string; + tileheight: string; + }; + $$?: StageTMXChild[]; +} - if (f.$.visible === undefined || Number(f.$.visible) !== 0) { - entity.components.render = {}; - } +export class Stage { + private _width: number; + private _height: number; + private _entities: BuildableEntity[]; + private _props: { [key: string]: any }; - if (f.properties !== undefined) { - for (let g of f.properties) { - if (g.property !== undefined) { - for (let h of g.property) { - _set(entity, h.$.name, h.$.value, h.$.type); - } - } - } - } + constructor(width: number, height: number) { + this._entities = []; + this._width = width; + this._height = height; + this._props = {}; + } - stage.addEntity(entity); - } + static fromTMX(map: StageTMX): Stage { + const width = Number(map.$.width) * Number(map.$.tilewidth); + const height = Number(map.$.height) * Number(map.$.tileheight); + + const stage = new Stage(width, height); + + if (map.$$ !== undefined) { + for (let i = 0; i < map.$$.length; i += 1) { + const e = map.$$[i]; + + if (_isTMXTileset(e)) { + _fromTMXTileset(stage, e); + } else if (_isTMXProperties(e)) { + _fromTMXProperties(stage, e); + } else if (_isTMXImageLayer(e)) { + _fromTMXImageLayer(stage, e); + } else if (_isTMXLayer(e)) { + _fromTMXLayer(stage, e); + } else if (_isTMXObjectGroup(e)) { + _fromTMXObjectGroup(stage, e); } } } @@ -240,7 +162,7 @@ export class Stage { } static unserialize(data: any): Stage { - return Stage.fromTMX(data) ; + return Stage.fromTMX(data.map) ; } prop(name: string): any; @@ -263,39 +185,6 @@ export class Stage { }; } - buildLayers(config: BuildConfig): RenderData[] { - const rval = [] as RenderData[]; - - if (this._tileset !== undefined) { - const tileset = config.assets.load(this._tileset) as Tileset; - - for (let e of this._tiles) { - const layer = document.createElement("canvas"); - const layerCtx = layer.getContext("2d"); - if (layerCtx === null) { - throw new Error("Failed to create 2d context"); - } - - layer.width = this._width; - layer.height = this._height; - - tileset.ready(() => { - for (let j = 0; j < e.data.length; j += 1) { - for (let i = 0; i < e.data[j].length; i += 1) { - tileset.drawTile(layerCtx, e.data[j][i], i, j); - } - } - }); - - rval.push({ - image: layer, - }); - } - } - - return rval; - } - buildEntities(config: BuildConfig): Entity[] { const rval = []; @@ -307,10 +196,22 @@ export class Stage { [key: string]: { [key: string ]: any } | undefined }; + if (e.type === "tileset") { + components.position = { + width: this._width, + height: this._height, + }; + + components.tileset = { + tileset: this.prop("tileset") || "", + assets: config.assets, + }; + } + for (let f in e.components) { const component = e.components[f]; - const dest = {} as BuildableComponent; + const dest = components[f] || ({} as BuildableComponent); components[f] = dest; for (let g in component) { @@ -339,10 +240,6 @@ export class Stage { addEntity(entity: BuildableEntity): void { this._entities.push(entity); } - - addLayer(layer: BuildableTileLayer): void { - this._tiles.push(layer); - } } function _set(dest: BuildableEntity, @@ -398,3 +295,190 @@ function _valueForProperty(type: string, value: string): BuildableProperty { } } } + +function _isTMXProperties (e: StageTMXChild | StageTMXObjectChild) +: e is StageTMXProperties { + return e["#name"] === "properties"; +} + +function _isTMXPolygon(e: StageTMXObjectChild): e is StageTMXPolygon { + return e["#name"] === "polygon"; +} + +function _isTMXEllipse(e: StageTMXObjectChild): e is StageTMXEllipse{ + return e["#name"] === "ellipse"; +} + +function _isTMXImageLayer(e: StageTMXChild): e is StageTMXImageLayer { + return e["#name"] === "imagelayer"; +} + +function _isTMXObjectGroup(e: StageTMXChild): e is StageTMXObjectGroup { + return e["#name"] === "objectgroup"; +} + +function _isTMXTileset(e: StageTMXChild): e is StageTMXTileset { + return e["#name"] === "tileset"; +} + +function _isTMXLayer(e: StageTMXChild): e is StageTMXLayer { + return e["#name"] === "layer"; +} + +function _fromTMXTileset(stage: Stage, tileset: StageTMXTileset): void { + stage.prop("tileset", tileset.$.source.split("/").reverse()[0]); +} + +function _fromTMXProperties(stage: Stage, props: StageTMXProperties): void { + if (props.$$ !== undefined) { + for (let i = 0; i < props.$$.length; i += 1) { + const e = props.$$[i]; + + stage.prop(e.$.name, _valueForProperty(e.$.type, e.$.value).value); + } + } +} + +function _fromTMXImageLayer(stage: Stage, layer: StageTMXImageLayer): void { + stage.addEntity({ + type: "background", + components: { + position: { + x: { type: "value", value: 0 }, + y: { type: "value", value: 0 }, + width: { type: "value", value: Number(layer.$$[0].$.width) }, + height: { type: "value", value: Number(layer.$$[0].$.height) }, + }, + render: { + image: { + type: "asset", + value: layer.$$[0].$.source.split("/").reverse()[0], + }, + }, + }, + }); +} + +function _fromTMXLayer(stage: Stage, layer: StageTMXLayer): void { + const width = Number(layer.$.width); + const height = Number(layer.$.height); + + const data = layer.$$[0]._ + const dataRows = data !== undefined ? data.trim().split("\n") : []; + + const tiles = new Array(height) as number[][]; + for (let i = 0; i < height; ++i) { + tiles[i] = new Array(width); + tiles[i].fill(0); + + if (i < dataRows.length) { + const row = dataRows[i].split(","); + + for (let j = 0; j < Math.min(row.length, tiles[i].length); ++j) { + tiles[i][j] = Number(row[j]); + } + } + } + + stage.addEntity({ + type: "tileset", + components: { + tileset: { + data: { + type: "value", + value: tiles, + }, + }, + }, + }); +} + +function _fromTMXObjectGroup(stage: Stage, group: StageTMXObjectGroup): void { + if (group.$$ !== undefined) { + for (let i = 0; i < group.$$.length; i += 1) { + const e = group.$$[i]; + + const entity = { + type: (e.$.type !== undefined ? e.$.type : "default"), + components: {}, + } as BuildableEntity; + + entity.components.position = { + x: { value: Number(e.$.x), type: "value" }, + y: { value: Number(e.$.y), type: "value" }, + width: { value: Number(e.$.width), type: "value" }, + height: { value: Number(e.$.height), type: "value" }, + }; + + entity.components.render = { + visible: { + value: (e.$.visible === undefined || Number(e.$.visible) !== 0), + type: "value", + }, + }; + + if (e.$$ !== undefined) { + for (let j = 0; j < e.$$.length; j += 1) { + const f = e.$$[j]; + + if (_isTMXProperties(f)) { + _fromTMXObjectProperties(entity, f); + } else if (_isTMXEllipse(f)) { + entity.components.position.mask = _ellipseForTMX(e); + } else if (_isTMXPolygon(f)) { + const mask = _polygonForTMX(f); + const bounds = mask.value.bounds(); + + entity.components.position.x.value += bounds.left; + entity.components.position.y.value += bounds.top; + entity.components.position.width.value = + bounds.right - bounds.left + 1; + entity.components.position.height.value = + bounds.bottom - bounds.top + 1; + + mask.value.translate(-bounds.left, -bounds.top); + + entity.components.position.mask = mask; + } + } + } + + stage.addEntity(entity); + } + } +} + +function _fromTMXObjectProperties(object: BuildableEntity, + props: StageTMXProperties) +: void { + if (props.$$ !== undefined) { + for (let i = 0; i < props.$$.length; i += 1) { + const e = props.$$[i]; + + _set(object, e.$.name, e.$.value, e.$.type); + } + } +} + +function _ellipseForTMX(object: StageTMXObject): BuildableProperty { + const r = Number(object.$.width) / 2; + return { + value: new Circle(r, 0, 0), + type: "value", + }; +} + +function _polygonForTMX(polygon: StageTMXPolygon) +: BuildableProperty { + const pairs = polygon.$.points.split(" "); + const points = pairs.map((e: string) => { + return e.split(",", 2).map((e) => Number(e)); + }) as ([ number, number ])[]; + + return { + type: "value", + value: new Polygon(points.map((e) => { + return [ e[0], e[1] ] as [ number, number ]; + })), + }; +} diff --git a/test/test_helper.ts b/test/test_helper.ts index bf7f85e..baf2b28 100644 --- a/test/test_helper.ts +++ b/test/test_helper.ts @@ -3,3 +3,5 @@ import "mocha"; import * as chai from "chai"; import * as sinonChai from "sinon-chai"; chai.use(sinonChai); +import chaiSubset = require("chai-subset"); +chai.use(chaiSubset); diff --git a/test/util/stage-test.ts b/test/util/stage-test.ts index 497d58f..e53efd8 100644 --- a/test/util/stage-test.ts +++ b/test/util/stage-test.ts @@ -5,115 +5,211 @@ import * as sinon from "sinon"; //@ts-ignore const jsdom = require("mocha-jsdom"); +import { TilesetEntity } from "../../src/entities/tileset-entity"; import { Stage } from "../../src/util/stage"; describe("Stage", function() { describe(".fromTMX", function() { it("should assign all values", function() { const stage = Stage.fromTMX({ - map: { - $: { - width: "10", - height: "8", - tilewidth: "16", - tileheight: "12", + "#name": "map", + $: { + width: "10", + height: "8", + tilewidth: "16", + tileheight: "12", + }, + $$: [ + { + "#name": "tileset", + $: { source: "tileset-value" }, }, - tileset: [ - { - $: { source: "tileset-value" }, - }, - ], - properties: [ - { - property: [ - { $: { name: "name1", type: "", value: "value-1" } }, - { $: { name: "name2", type: "", value: "[ 1, 2 ]" } }, - { $: { name: "name3", type: "file", value: "path/value-3" } }, - ], - }, - { - property: [ - { $: { name: "name4", type: "bool", value: "true" } }, - { $: { name: "name5", type: "bool", value: "false" } }, - { $: { name: "name6", type: "color", value: "#ff123456" } }, - ], - }, - ], - layer: [ - { - $: { width: "4", height: "3" }, - data: [ - { _: "1,2,3,1\n" }, - { _: "4,5,6,1\n" }, - { _: "7,8,9,1\n" }, - ], - }, - ], - objectgroup: [ - { - object: [ - { - $: { - type: "type-1", - x: "1", - y: "2", - width: "16", - height: "32", - }, - properties: [ - { - property: [ - { $: { name: "comp1.prop1", type: "", value: "value-1" } }, - { $: { name: "comp1.prop2", type: "", value: "value-2" } }, - { $: { name: "comp2.prop3", type: "", value: "value-3" } }, - ], - }, - {}, - ], + { + "#name": "properties", + $$: [ + { + "#name": "property", + $: { name: "name1", type: "", value: "value-1" }, + }, + { + "#name": "property", + $: { name: "name2", type: "", value: "[ 1, 2 ]" }, + }, + { + "#name": "property", + $: { name: "name3", type: "file", value: "path/value-3" }, + }, + ], + }, + { + "#name": "properties", + $$: [ + { + "#name": "property", + $: { name: "name4", type: "bool", value: "true" }, + }, + { + "#name": "property", + $: { name: "name5", type: "bool", value: "false" }, + }, + { + "#name": "property", + $: { name: "name6", type: "color", value: "#ff123456" }, + }, + ], + }, + { + "#name": "imagelayer", + $$: [ + { + "#name": "image", + $: { + source: "path/to/background.png", + width: "321", + height: "654", }, - { - $: { - type: "type-2", - x: "3", - y: "4", - width: "12", - height: "24", - visible: "0" - }, + }, + ], + }, + { + "#name": "layer", + $: { width: "4", height: "3" }, + $$: [ + { + "#name": "data", + $: { encoding: "csv" }, + _: "1,2,3,1\n4,5,6,1\n7,8,9,1", + } + ], + }, + { + "#name": "objectgroup", + $$: [ + { + "#name": "object", + $: { + type: "type-1", + x: "1", + y: "2", + width: "16", + height: "32", }, - ] - }, - { - object: [ - { - $: { - type: "type-3", - x: "5", - y: "6", - width: "8", - height: "19", + $$: [ + { + "#name": "properties", + $$: [ + { + "#name": "property", + $: { name: "comp1.prop1", type: "", value: "value-1" }, + }, + { + "#name": "property", + $: { name: "comp1.prop2", type: "", value: "value-2" }, + }, + { + "#name": "property", + $: { name: "comp2.prop3", type: "", value: "value-3" }, + }, + ], }, - ellipse: [ {} ], + { + "#name": "junk", + } as any, + ], + }, + { + "#name": "object", + $: { + type: "type-2", + x: "3", + y: "4", + width: "12", + height: "24", + visible: "0", }, - { - $: { - x: "5", - y: "5", - width: "10", - height: "10", - }, - polygon: [ { $: { points: "1,2 3,4 5,6" } } ], + }, + ], + }, + { + "#name": "layer", + $: { width: "3", height: "4" }, + $$: [ + { + "#name": "data", + $: { encoding: "csv" }, + } + ], + }, + { + "#name": "objectgroup", + $$: [ + { + "#name": "object", + $: { + type: "type-3", + x: "5", + y: "6", + width: "8", + height: "19", }, - ] - }, - ], - }, + $$: [ { "#name": "ellipse" }, { "#name": "properties" } ], + }, + { + "#name": "object", + $: { + x: "5", + y: "5", + width: "10", + height: "10", + }, + $$: [ + { + "#name": "polygon", + $: { points: "1,2 3,4 5,6" } , + } + ], + }, + ], + }, + { + "#name": "junk" + } as any, + ], }); expect(stage).to.deep.equal({ _width: 160, _height: 96, _entities: [ + { + type: "background", + components: { + position: { + x: { type: "value", value: 0 }, + y: { type: "value", value: 0 }, + width: { type: "value", value: 321 }, + height: { type: "value", value: 654 }, + }, + render: { + image: { type: "asset", value: "background.png" }, + }, + } + }, + { + type: "tileset", + components: { + tileset: { + data: { + type: "value", + value: [ + [ 1, 2, 3, 1 ], + [ 4, 5, 6, 1 ], + [ 7, 8, 9, 1 ], + ], + }, + }, + } + }, { type: "type-1", components: { @@ -123,7 +219,9 @@ describe("Stage", function() { width: { type: "value", value: 16 }, height: { type: "value", value: 32 }, }, - render: {}, + render: { + visible: { type: "value", value: true }, + }, comp1: { prop1: { type: "value", value: "value-1" }, prop2: { type: "value", value: "value-2" }, @@ -142,6 +240,25 @@ describe("Stage", function() { width: { type: "value", value: 12 }, height: { type: "value", value: 24 }, }, + render: { + visible: { type: "value", value: false }, + }, + } + }, + { + type: "tileset", + components: { + tileset: { + data: { + type: "value", + value: [ + [ 0, 0, 0 ], + [ 0, 0, 0 ], + [ 0, 0, 0 ], + [ 0, 0, 0 ], + ], + }, + }, } }, { @@ -161,7 +278,9 @@ describe("Stage", function() { }, }, }, - render: {}, + render: { + visible: { type: "value", value: true }, + }, } }, { @@ -183,22 +302,12 @@ describe("Stage", function() { }, }, }, - render: {}, + render: { + visible: { type: "value", value: true }, + }, } }, ], - _tiles: [ - { - width: 4, - height: 3, - data: [ - [ 1, 2, 3, 1 ], - [ 4, 5, 6, 1 ], - [ 7, 8, 9, 1 ], - ], - } - ], - _tileset: "tileset-value", _props: { name1: "value-1", name2: [ 1, 2 ], @@ -206,19 +315,19 @@ describe("Stage", function() { name4: true, name5: false, name6: "#123456", + tileset: "tileset-value", }, }) }); it("should assign empty values", function() { const stage = Stage.fromTMX({ - map: { - $: { - width: "9", - height: "7", - tilewidth: "13", - tileheight: "8", - }, + "#name": "map", + $: { + width: "9", + height: "7", + tilewidth: "13", + tileheight: "8", }, }); @@ -226,58 +335,33 @@ describe("Stage", function() { _width: 117, _height: 56, _entities: [], - _tiles: [], _props: {}, }); }); it("should assign empty inner values", function() { const stage = Stage.fromTMX({ - map: { - $: { - width: "9", - height: "7", - tilewidth: "13", - tileheight: "8", - }, - properties: [ {} ], - layer: [ - { - $: { width: "3", height: "2" }, - }, - { - $: { width: "5", height: "4" }, - data: [ {} ], - }, - ], - objectgroup: [ {} ], + "#name": "map", + $: { + width: "9", + height: "7", + tilewidth: "13", + tileheight: "8", }, + $$: [ + { + "#name": "properties", + }, + { + "#name": "objectgroup", + }, + ], }); expect(stage).to.deep.equal({ _width: 117, _height: 56, _entities: [], - _tiles: [ - { - width: 3, - height: 2, - data: [ - [ 0, 0, 0 ], - [ 0, 0, 0 ], - ], - }, - { - width: 5, - height: 4, - data: [ - [ 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0 ], - [ 0, 0, 0, 0, 0 ], - ], - }, - ], _props: {}, }); }); @@ -285,36 +369,41 @@ describe("Stage", function() { it("should throw empty path error", function() { expect(function() { Stage.fromTMX({ - map: { - $: { - width: "9", - height: "7", - tilewidth: "13", - tileheight: "8", - }, - objectgroup: [ - { - object: [ - { - $: { - type: "type-1", - x: "1", - y: "2", - width: "16", - height: "32", - }, - properties: [ - { - property: [ - { $: { name: "comp1", type: "", value: "value-1" } }, - ], - }, - ], - }, - ], - }, - ], + "#name": "map", + $: { + width: "9", + height: "7", + tilewidth: "13", + tileheight: "8", }, + $$: [ + { + "#name": "objectgroup", + $$: [ + { + "#name": "object", + $: { + type: "type-1", + x: "1", + y: "2", + width: "16", + height: "32", + }, + $$: [ + { + "#name": "properties", + $$: [ + { + "#name": "property", + $: { name: "comp1", type: "", value: "value-1" }, + }, + ], + }, + ], + }, + ], + }, + ], }); }).to.throw(); }); @@ -323,73 +412,33 @@ describe("Stage", function() { describe(".unserialize", function() { it("should call fromTMX", function() { const mock = sinon.mock(Stage); - mock.expects("fromTMX").once().withArgs("data-value"); + mock.expects("fromTMX").once().withArgs("data-value").returns("rval"); - Stage.unserialize("data-value"); + expect(Stage.unserialize({ map: "data-value" })).to.equal("rval"); mock.verify(); }); - - it("should return fromTMX value", function() { - sinon.stub(Stage, "fromTMX").returns("rval"); - - expect(Stage.unserialize("data-value")).to.equal("rval"); - }); - }); - - describe("#constructor", function() { - it("should assgin values", function() { - expect(new Stage(123, 456, "path/to/tileset-v")).to.deep.equal({ - _entities: [], - _tiles: [], - _width: 123, - _height: 456, - _tileset: "tileset-v", - _props: {}, - }); - }); - - it("should allow optional tileset", function() { - expect(new Stage(123, 456)).to.deep.equal({ - _entities: [], - _tiles: [], - _width: 123, - _height: 456, - _props: {}, - }); - }); }); describe("#prop", function() { - beforeEach(function() { - this.stage = new Stage(123, 456); - }); - - it("should assign property", function() { - this.stage.prop("keyv", "valuev") + it("should return undefined property", function() { + const stage = new Stage(123, 456); - expect(this.stage).to.deep.equal({ - _width: 123, - _height: 456, - _entities: [], - _tiles: [], - _props: { keyv: "valuev" }, - }); + expect(stage.prop("keyk")).to.be.undefined; }); - it("should return property", function() { - this.stage._props = { keyk: "valuek" }; + it("should assign property", function() { + const stage = new Stage(123, 456); + stage.prop("keyk", "valuev") - expect(this.stage.prop("keyk")).to.equal("valuek"); + expect(stage.prop("keyk")).to.equal("valuev"); }); }); describe("#bounds", function() { - beforeEach(function() { - this.stage = new Stage(123, 456); - }); - it("should return bounds", function() { - expect(this.stage.bounds()).to.deep.equal({ + const stage = new Stage(123, 456); + + expect(stage.bounds()).to.deep.equal({ left: 0, top: 0, right: 122, @@ -398,147 +447,39 @@ describe("Stage", function() { }); }); - describe("#buildLayers", function() { - jsdom(); - - beforeEach(function() { - this.stage = new Stage(123, 456); - }); - - it("should return empty array", function() { - const assets = { load: () => {} }; - const mock = sinon.mock(assets); - mock.expects("load").never(); - - expect(this.stage.buildLayers({ assets: assets })).to.deep.equal([]); - mock.verify(); - }); - - it("should return layer array", function() { - this.stage._tileset = "tileset-v" - this.stage._tiles.push({ - width: 2, - height: 2, - data: [ - [ 0, 1 ], - [ 2, 3 ], - ], - }) - - const assets = { load: () => {} }; - const canvas = { getContext: () => {}, width: 0, height: 0 }; - const tileset = { ready: () => {}, drawTile: () => {} }; - - const mockTileset = sinon.mock(tileset); - mockTileset.expects("ready") - .once() - .withArgs(sinon.match.func) - .callsArg(0); - mockTileset.expects("drawTile").once().withArgs("ctx", 0, 0, 0); - mockTileset.expects("drawTile").once().withArgs("ctx", 1, 1, 0); - mockTileset.expects("drawTile").once().withArgs("ctx", 2, 0, 1); - mockTileset.expects("drawTile").once().withArgs("ctx", 3, 1, 1); - - const mockCanvas = sinon.mock(canvas); - mockCanvas.expects("getContext").once().withArgs("2d").returns("ctx"); - - const mockAssets = sinon.mock(assets); - mockAssets.expects("load").once().withArgs("tileset-v").returns(tileset); - - const mockDocument = sinon.mock(document); - mockDocument.expects("createElement") - .once() - .withArgs("canvas") - .returns(canvas); - - expect(this.stage.buildLayers({ assets: assets })).to.deep.equal([ - { image: canvas }, - ]); - expect(canvas.width).to.equal(123); - expect(canvas.height).to.equal(456); - mockDocument.verify(); - mockTileset.verify(); - mockCanvas.verify(); - mockAssets.verify(); - }); - - it("should throw error", function() { - this.stage._tileset = "tileset-v" - this.stage._tiles.push({ - width: 2, - height: 2, - data: [ - [ 0, 1 ], - [ 2, 3 ], - ], - }) - - const assets = { load: () => {} }; - const canvas = { getContext: () => {}, width: 0, height: 0 }; - const tileset = { ready: () => {}, drawTile: () => {} }; - - const mockTileset = sinon.mock(tileset); - mockTileset.expects("ready").never(); - mockTileset.expects("drawTile").never(); - - const mockCanvas = sinon.mock(canvas); - mockCanvas.expects("getContext").once().withArgs("2d").returns(null); - - const mockAssets = sinon.mock(assets); - mockAssets.expects("load").once().withArgs("tileset-v").returns(tileset); - - const mockDocument = sinon.mock(document); - mockDocument.expects("createElement") - .once() - .withArgs("canvas") - .returns(canvas); - - const self = this; - expect(function() { - self.stage.buildLayers({ assets: assets }) - }).to.throw(); - - expect(canvas.width).to.equal(0); - expect(canvas.height).to.equal(0); - - mockDocument.verify(); - mockTileset.verify(); - mockCanvas.verify(); - mockAssets.verify(); - }); - }); - describe("#buildEntities", function() { - beforeEach(function() { - this.stage = new Stage(123, 456); - }); - it("should return empty array", function() { + const stage = new Stage(123, 456); + const assets = { load: () => {} }; const mock = sinon.mock(assets); mock.expects("load").never(); - expect(this.stage.buildEntities({ assets: assets })).to.deep.equal([]); + expect(stage.buildEntities({ assets: assets })).to.deep.equal([]); mock.verify(); }); it("should return entity array", function() { - this.stage._entities.push({ + const stage = new Stage(123, 456); + + stage.prop("tileset", "tileset-v") + + stage.addEntity({ type: "test0", components: {}, }); - this.stage._entities.push({ + stage.addEntity({ type: "test1", components: {}, }); - this.stage._entities.push({ + stage.addEntity({ type: "test2", components: { comp1: {} }, }); - this.stage._entities.push({ + stage.addEntity({ type: "test3", components: { comp1: { @@ -548,6 +489,21 @@ describe("Stage", function() { }, }); + stage.addEntity({ + type: "tileset", + components: { + tileset: { + data: { + type: "value", + value: [ + [ 0, 1 ], + [ 2, 3 ], + ], + }, + }, + }, + }) + const assets = { load: () => {} }; const stub1 = sinon.stub(); @@ -556,18 +512,22 @@ describe("Stage", function() { stub2.returns({ entity: 2 }); const stub3 = sinon.stub(); stub3.returns({ entity: 3 }); + const stub4 = sinon.stub(); + stub4.returns({ entity: 4 }); const mock = sinon.mock(assets); mock.expects("load").once().withArgs("test0-entity").returns(undefined); mock.expects("load").once().withArgs("test1-entity").returns(stub1); mock.expects("load").once().withArgs("test2-entity").returns(stub2); mock.expects("load").once().withArgs("test3-entity").returns(stub3); + mock.expects("load").once().withArgs("tileset-entity").returns(stub4); mock.expects("load").once().withArgs("asset-name-1").returns("asset-1"); - expect(this.stage.buildEntities({ assets: assets })).to.deep.equal([ + expect(stage.buildEntities({ assets: assets })).to.deep.equal([ { entity: 1 }, { entity: 2 }, { entity: 3 }, + { entity: 4 }, ]); expect(stub1).to.have.been.calledWith({}); @@ -578,47 +538,68 @@ describe("Stage", function() { prop2: "asset-1", }, }); + expect(stub4).to.have.been.calledWith({ + position: { + width: 123, + height: 456, + }, + tileset: { + tileset: "tileset-v", + assets: sinon.match.same(assets), + data: [ + [ 0, 1 ], + [ 2, 3 ], + ], + }, + }); mock.verify(); }); - }); - describe("#addEntity", function() { - beforeEach(function() { - this.stage = new Stage(123, 456); - }); + it("should return default tileset", function() { + const stage = new Stage(123, 456); + + stage.addEntity({ + type: "tileset", + components: { + tileset: { + data: { + type: "value", + value: [ + [ 0, 1 ], + [ 2, 3 ], + ], + }, + }, + }, + }) - it("should push entities", function() { - this.stage.addEntity("entity1"); - this.stage.addEntity("entity2"); - this.stage.addEntity("entity3"); + const assets = { load: () => {} }; - expect(this.stage).to.deep.equal({ - _entities: [ "entity1", "entity2", "entity3" ], - _tiles: [], - _width: 123, - _height: 456, - _props: {}, - }); - }) - }); + const stub1 = sinon.stub(); + stub1.returns({ entity: 1 }); - describe("#addLayer", function() { - beforeEach(function() { - this.stage = new Stage(123, 456); - }); + const mock = sinon.mock(assets); + mock.expects("load").once().withArgs("tileset-entity").returns(stub1); - it("should push entities", function() { - this.stage.addLayer("entity1"); - this.stage.addLayer("entity2"); - this.stage.addLayer("entity3"); + expect(stage.buildEntities({ assets: assets })).to.deep.equal([ + { entity: 1 }, + ]); - expect(this.stage).to.deep.equal({ - _entities: [], - _tiles: [ "entity1", "entity2", "entity3" ], - _width: 123, - _height: 456, - _props: {}, + expect(stub1).to.have.been.calledWith({ + position: { + width: 123, + height: 456, + }, + tileset: { + tileset: "", + assets: sinon.match.same(assets), + data: [ + [ 0, 1 ], + [ 2, 3 ], + ], + }, }); - }) + mock.verify(); + }); }); }); diff --git a/yarn.lock b/yarn.lock index 22b8fe1..c9dff0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,6 +8,12 @@ dependencies: samsam "1.3.0" +"@types/chai-subset@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.1.tgz#114af342bb0a3e04d23f55af279b0a4d383c2edd" + dependencies: + "@types/chai" "*" + "@types/chai@*", "@types/chai@^4.0.5": version "4.1.2" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.2.tgz#f1af664769cfb50af805431c407425ed619daa21" @@ -408,6 +414,14 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chai-iterator@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chai-iterator/-/chai-iterator-1.1.4.tgz#77e0dce95a134cf6a1b19cab626d767c2ccd121d" + +chai-subset@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/chai-subset/-/chai-subset-1.6.0.tgz#a5d0ca14e329a79596ed70058b6646bd6988cfe9" + chai@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" @@ -2885,9 +2899,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -sinon-chai@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.14.0.tgz#da7dd4cc83cd6a260b67cca0f7a9fdae26a1205d" +sinon-chai@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.0.0.tgz#d5cbd70fa71031edd96b528e0eed4038fcc99f29" sinon@^4.1.2: version "4.4.2" From 07d3ae0d690780367b89511e8ee5ebd16c8cdd38 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 17 Mar 2018 12:35:18 -0400 Subject: [PATCH 06/16] update exports --- src/index.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 5a08f3c..465e80d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ export * from "./behaviors/sequence-behavior"; export * from "./behaviors/whilst-behavior"; export * from "./entities/entity"; +export * from "./entities/background-entity"; export * from "./entities/base-entity"; export * from "./entities/collection-entity"; export * from "./entities/simple-entity"; @@ -38,8 +39,9 @@ export * from "./events/render-event"; export * from "./events/resolution-event"; export * from "./systems/accel-system"; -export * from "./systems/behavior-system"; export * from "./systems/animation-system"; +export * from "./systems/background-system"; +export * from "./systems/behavior-system"; export * from "./systems/camera-system"; export * from "./systems/collision-system"; export * from "./systems/collision-mediator-system"; @@ -56,14 +58,17 @@ export * from "./systems/render-mediator-system"; export * from "./systems/restrict-system"; export * from "./components/accel-component"; -export * from "./components/behavior-component"; export * from "./components/animation-component"; +export * from "./components/background-component"; +export * from "./components/behavior-component"; export * from "./components/collision-component"; export * from "./components/control-component"; export * from "./components/movement-component"; export * from "./components/path-component"; export * from "./components/position-component"; export * from "./components/render-component"; +export * from "./components/stage-component"; +export * from "./components/tileset-component"; export * from "./modules/shape"; export * from "./modules/snap"; From b4cb10e5f7544bba93dd2244fe04c9cd27c6027d Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 17 Mar 2018 12:35:23 -0400 Subject: [PATCH 07/16] assets config, for entities --- assets.config.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 assets.config.json diff --git a/assets.config.json b/assets.config.json new file mode 100644 index 0000000..46da864 --- /dev/null +++ b/assets.config.json @@ -0,0 +1,8 @@ +{ + "include": [ + "lib/entities/*.js" + ], + "exclude": [ + "**/entity.js" + ] +} From b7d83eba61101d5c386cef87fd9aaf3f64d7bfce Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 17 Mar 2018 13:30:10 -0400 Subject: [PATCH 08/16] Fix background system return values --- src/systems/background-system.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/systems/background-system.ts b/src/systems/background-system.ts index 3eb6eb6..1e60201 100644 --- a/src/systems/background-system.ts +++ b/src/systems/background-system.ts @@ -39,7 +39,7 @@ export function BackgroundSystem(entity: BackgroundSystemEntity): void { entity.position.y += (yT / entity.background.yPeriod) * entity.background.yAmp; - f(); + return f(); } else { const xSave = entity.position.x; const ySave = entity.position.y; @@ -50,7 +50,7 @@ export function BackgroundSystem(entity: BackgroundSystemEntity): void { entity.position.y = ySave + (yT / entity.background.yPeriod) * entity.background.yAmp; - f(); + return f(); } finally { entity.position.x = xSave; entity.position.y = ySave; From 510c0f59bfdc5c63f491922e2cb79a4e71697c30 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sun, 18 Mar 2018 15:45:24 -0400 Subject: [PATCH 09/16] Particle System --- src/components/particle-component.ts | 47 ++++ src/components/render-component.ts | 7 + src/entities/particle-entity.ts | 36 +++ src/events/particle-event.ts | 39 +++ src/index.ts | 4 + src/systems/particle-system.ts | 161 ++++++++++++ src/util/render-backends/render-backend-2d.ts | 248 +++++++++--------- 7 files changed, 420 insertions(+), 122 deletions(-) create mode 100644 src/components/particle-component.ts create mode 100644 src/entities/particle-entity.ts create mode 100644 src/events/particle-event.ts create mode 100644 src/systems/particle-system.ts diff --git a/src/components/particle-component.ts b/src/components/particle-component.ts new file mode 100644 index 0000000..ebbaaa2 --- /dev/null +++ b/src/components/particle-component.ts @@ -0,0 +1,47 @@ +export type ParticleField = "LIFETIME" | + "X" | "Y" | + "X_SUBPIXEL" | "Y_SUBPIXEL" | + "X_SPEED" | "Y_SPEED" | + "X_ACCEL" | "Y_ACCEL" | + "SPRITE_FRAME"; + +export const PARTICLE_FIELDS = [ + "LIFETIME", + "X", + "Y", + "X_SUBPIXEL", + "Y_SUBPIXEL", + "X_SPEED", + "Y_SPEED", + "X_ACCEL", + "Y_ACCEL", + "SPRITE_FRAME", +] as ParticleField[]; + +export const PARTICLE_FIELDS_ENUM = {} as { [key in ParticleField]: number }; +for (let i = 0; i < PARTICLE_FIELDS.length; ++i) { + PARTICLE_FIELDS_ENUM[PARTICLE_FIELDS[i]] = i; +} + +export interface ParticleData { + sprite: string; + length: number; + capacity: number; + data: number[]; +} + +export class ParticleComponent implements ParticleData { + sprite: string; + length: number; + capacity: number; + data: number[]; + + constructor(options?: Partial) { + this.sprite = ""; + this.length = 0; + this.capacity = 0; + this.data = []; + + Object.assign(this, options); + } +} diff --git a/src/components/render-component.ts b/src/components/render-component.ts index 9dee955..16c450a 100644 --- a/src/components/render-component.ts +++ b/src/components/render-component.ts @@ -1,8 +1,14 @@ +import { Assets } from "../util/assets"; import { Transform } from "../util/matrix"; import { Shape, Dimensions } from "../util/shape"; +export interface PaintFunction { + (ctx: CanvasRenderingContext2D, assets: Assets): void; +} + export interface RenderData { visible?: boolean; + paint?: PaintFunction; wraparound?: boolean; stroke?: string; fill?: string; @@ -19,6 +25,7 @@ export interface RenderData { export class RenderComponent implements RenderData { visible?: boolean; + paint?: PaintFunction; wraparound?: boolean; stroke?: string; fill?: string; diff --git a/src/entities/particle-entity.ts b/src/entities/particle-entity.ts new file mode 100644 index 0000000..6a60450 --- /dev/null +++ b/src/entities/particle-entity.ts @@ -0,0 +1,36 @@ +import { + ParticleData, + ParticleComponent, +} from "../components/particle-component"; + +import { + PositionData, + PositionComponent, +} from "../components/position-component"; + +import { ParticleSystem } from "../systems/particle-system"; + +import { + BaseEntity, + BaseEntityConfig, +} from "./base-entity"; + +export interface ParticleEntityConfig extends BaseEntityConfig { + particle: Partial; + position: Partial; +} + +export class ParticleEntity extends BaseEntity { + particle: ParticleData; + position: PositionData; + + constructor(config?: Partial) { + super(config); + + this.particle = new ParticleComponent(config && config.particle); + + this.position = new PositionComponent(config && config.position); + + ParticleSystem(this); + } +} diff --git a/src/events/particle-event.ts b/src/events/particle-event.ts new file mode 100644 index 0000000..0a4f8f4 --- /dev/null +++ b/src/events/particle-event.ts @@ -0,0 +1,39 @@ +export type ParticleEventType = "particle"; + +export interface ParticleEventData { + type: ParticleEventType; + count: number | [ number, number ]; + lifetime: number | [ number, number ]; + xOffset: number | [ number, number ]; + yOffset: number | [ number, number ]; + speed: number | [ number, number ]; + direction: number | [ number, number ]; + accel: number | [ number, number ]; + spriteFrame: number | [ number, number ]; +} + +export class ParticleEvent implements ParticleEvent { + type: ParticleEventType; + count: number | [ number, number ]; + lifetime: number | [ number, number ]; + xOffset: number | [ number, number ]; + yOffset: number | [ number, number ]; + speed: number | [ number, number ]; + direction: number | [ number, number ]; + accel: number | [ number, number ]; + spriteFrame: number | [ number, number ]; + + constructor(options?: Partial) { + this.type = "particle"; + this.count = 1; + this.lifetime = 0; + this.xOffset = 0; + this.yOffset = 0; + this.speed = 0; + this.direction = 0; + this.accel = 0; + this.spriteFrame = 0; + + Object.assign(this, options); + } +} diff --git a/src/index.ts b/src/index.ts index 465e80d..3baf971 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,6 +23,7 @@ export * from "./entities/entity"; export * from "./entities/background-entity"; export * from "./entities/base-entity"; export * from "./entities/collection-entity"; +export * from "./entities/particle-entity"; export * from "./entities/simple-entity"; export * from "./entities/stack-entity"; export * from "./entities/stage-entity"; @@ -35,6 +36,7 @@ export * from "./events/input-event"; export * from "./events/interval-event"; export * from "./events/landing-event"; export * from "./events/move-event"; +export * from "./events/particle-event"; export * from "./events/render-event"; export * from "./events/resolution-event"; @@ -52,6 +54,7 @@ export * from "./systems/interval-system"; export * from "./systems/landing-system"; export * from "./systems/move-system"; export * from "./systems/move-mediator-system"; +export * from "./systems/particle-system"; export * from "./systems/path-system"; export * from "./systems/render-system"; export * from "./systems/render-mediator-system"; @@ -64,6 +67,7 @@ export * from "./components/behavior-component"; export * from "./components/collision-component"; export * from "./components/control-component"; export * from "./components/movement-component"; +export * from "./components/particle-component"; export * from "./components/path-component"; export * from "./components/position-component"; export * from "./components/render-component"; diff --git a/src/systems/particle-system.ts b/src/systems/particle-system.ts new file mode 100644 index 0000000..5f2c1e5 --- /dev/null +++ b/src/systems/particle-system.ts @@ -0,0 +1,161 @@ +import { Entity } from "../entities/entity"; +import { Assets } from "../util/assets"; +import { + ParticleData, + ParticleField, + PARTICLE_FIELDS_ENUM, + PARTICLE_FIELDS, +} from "../components/particle-component"; +import { PositionData } from "../components/position-component"; +import { IntervalEventData } from "../events/interval-event"; +import { ParticleEventData } from "../events/particle-event"; +import { RenderEventData } from "../events/render-event"; + +import { accelerate } from "../modules/movement"; + +export interface ParticleSystemEntity extends Entity { + particle: ParticleData; + position: PositionData; +} + +export function ParticleSystem(entity: ParticleSystemEntity): void { + const paintf = (ctx: CanvasRenderingContext2D, assets: Assets) => { + const sprite = assets.loadSprite(entity.particle.sprite); + + for (let i = 0; i < entity.particle.length; ++i) { + const offset = i * PARTICLE_FIELDS.length; + + const x = entity.particle.data[offset + PARTICLE_FIELDS_ENUM["X"]]; + const y = entity.particle.data[offset + PARTICLE_FIELDS_ENUM["Y"]]; + const frame = + entity.particle.data[offset + PARTICLE_FIELDS_ENUM["SPRITE_FRAME"]]; + + sprite.drawFrame(ctx, frame, x, y); + } + }; + + entity.on("particle", (event: ParticleEventData) => { + const count = Math.floor(_randomRange(event.count)); + + for (let i = 0; i < count; ++i) { + if (entity.particle.capacity === entity.particle.length) { + const block = PARTICLE_FIELDS.length; + entity.particle.capacity += 256; + entity.particle.data.length = entity.particle.capacity * block; + } + + const j = entity.particle.length; + entity.particle.length += 1; + + _set(entity, j, "LIFETIME", _randomRange(event.lifetime)); + _set(entity, j, "X", + Math.floor(_randomRange(event.xOffset)) + entity.position.x); + _set(entity, j, "Y", + Math.floor(_randomRange(event.yOffset) + entity.position.y)); + _set(entity, j, "X_SUBPIXEL", 0); + _set(entity, j, "Y_SUBPIXEL", 0); + + const direction = _randomRange(event.direction); + const speed = _randomRange(event.speed); + const accel = _randomRange(event.accel); + + const xUnit = Math.cos(direction); + const yUnit = Math.sin(direction); + + _set(entity, j, "X_SPEED", speed * xUnit); + _set(entity, j, "Y_SPEED", speed * yUnit); + _set(entity, j, "X_ACCEL", accel * xUnit); + _set(entity, j, "Y_ACCEL", accel * yUnit); + + _set(entity, j, "SPRITE_FRAME", + Math.floor(_randomRange(event.spriteFrame))); + } + }); + + entity.on("interval", (event: IntervalEventData) => { + for (let i = 0; i < entity.particle.length;) { + const lifetime = _get(entity, i, "LIFETIME") - event.dt; + + if (lifetime > 0) { + const xAccel = _get(entity, i, "X_ACCEL"); + const yAccel = _get(entity, i, "Y_ACCEL"); + let xSpeed = _get(entity, i, "X_SPEED"); + let ySpeed = _get(entity, i, "Y_SPEED"); + let xSubpixel = _get(entity, i, "X_SUBPIXEL"); + let ySubpixel = _get(entity, i, "Y_SUBPIXEL"); + let x = _get(entity, i, "X"); + let y = _get(entity, i, "Y"); + + xSpeed = accelerate(event.dt, xSpeed, xAccel); + ySpeed = accelerate(event.dt, ySpeed, yAccel); + + if (xSpeed !== 0) { + xSubpixel += Math.floor(event.dt * xSpeed); + x += Math.trunc(xSubpixel / 1000); + xSubpixel = Math.trunc(xSubpixel % 1000); + } else { + xSubpixel = 0; + } + + if (ySpeed !== 0) { + ySubpixel += Math.floor(event.dt * ySpeed); + y += Math.trunc(ySubpixel / 1000); + ySubpixel = Math.trunc(ySubpixel % 1000); + } else { + ySubpixel = 0; + } + + _set(entity, i, "LIFETIME", lifetime); + _set(entity, i, "X_SPEED", xSpeed); + _set(entity, i, "Y_SPEED", ySpeed); + _set(entity, i, "X_SUBPIXEL", xSubpixel); + _set(entity, i, "Y_SUBPIXEL", ySubpixel); + _set(entity, i, "X", x); + _set(entity, i, "Y", y); + + i += 1; + } else { + const block = PARTICLE_FIELDS.length; + entity.particle.length -= 1; + entity.particle.data.copyWithin(i * block, + entity.particle.length * block, + (entity.particle.length + 1) * block); + } + } + }); + + entity.on("render", (event: RenderEventData) => { + event.backend.add({ + x: 0, + y: 0, + width: 0, + height: 0, + render: { + paint: paintf, + }, + }) + }); +} + +function _get(entity: ParticleSystemEntity, + index: number, + field: ParticleField): number { + const offset = index * PARTICLE_FIELDS.length; + return entity.particle.data[offset + PARTICLE_FIELDS_ENUM[field]]; +} + +function _set(entity: ParticleSystemEntity, + index: number, + field: ParticleField, + value: number): void { + const offset = index * PARTICLE_FIELDS.length; + entity.particle.data[offset + PARTICLE_FIELDS_ENUM[field]] = value; +} + +function _randomRange(n: number | [ number, number ]): number { + if (n instanceof Array) { + return Math.random() * Math.abs(n[1] - n[0]) + Math.min(n[0], n[1]); + } else { + return n; + } +} diff --git a/src/util/render-backends/render-backend-2d.ts b/src/util/render-backends/render-backend-2d.ts index 59b4822..1bed929 100644 --- a/src/util/render-backends/render-backend-2d.ts +++ b/src/util/render-backends/render-backend-2d.ts @@ -73,169 +73,173 @@ function _render(ctx: CanvasRenderingContext2D, return; } - ctx.save(); - if (data.transform !== undefined) { - ctx.transform(data.transform[0], - data.transform[3], - data.transform[1], - data.transform[4], - data.transform[2], - data.transform[5]); - } - - if (data.sprite !== undefined) { - const sprite = assets.loadSprite(data.sprite); - const frame = data.spriteFrame !== undefined && !isNaN(data.spriteFrame) ? - data.spriteFrame : 0; - sprite.drawFrame(ctx, frame, root.x, root.y); - } else if (data.image !== undefined) { - const image = (typeof data.image === "string") ? - assets.loadRawimage(data.image) : data.image; - - ctx.drawImage(image, 0, 0, - image.width, image.height, - root.x, root.y, - image.width, image.height); - - if (data.wraparound) { - if (root.y + image.height >= buffer.height) { - ctx.drawImage(image, 0, 0, - image.width, image.height, - root.x, root.y - image.height, - image.width, image.height); + try { + ctx.save(); + if (data.transform !== undefined) { + ctx.transform(data.transform[0], + data.transform[3], + data.transform[1], + data.transform[4], + data.transform[2], + data.transform[5]); + } - if (root.x + image.width >= buffer.width) { + if (data.paint !== undefined) { + data.paint(ctx, assets); + } else if (data.sprite !== undefined) { + const sprite = assets.loadSprite(data.sprite); + const frame = data.spriteFrame !== undefined && !isNaN(data.spriteFrame) ? + data.spriteFrame : 0; + sprite.drawFrame(ctx, frame, root.x, root.y); + } else if (data.image !== undefined) { + const image = (typeof data.image === "string") ? + assets.loadRawimage(data.image) : data.image; + + ctx.drawImage(image, 0, 0, + image.width, image.height, + root.x, root.y, + image.width, image.height); + + if (data.wraparound) { + if (root.y + image.height >= buffer.height) { ctx.drawImage(image, 0, 0, image.width, image.height, - root.x - image.width, root.y - image.height, + root.x, root.y - image.height, image.width, image.height); - } else if (root.x < 0) { + + if (root.x + image.width >= buffer.width) { + ctx.drawImage(image, 0, 0, + image.width, image.height, + root.x - image.width, root.y - image.height, + image.width, image.height); + } else if (root.x < 0) { + ctx.drawImage(image, 0, 0, + image.width, image.height, + root.x + image.width, root.y - image.height, + image.width, image.height); + } + } else if (root.y < 0) { ctx.drawImage(image, 0, 0, image.width, image.height, - root.x + image.width, root.y - image.height, + root.x, root.y + image.height, image.width, image.height); + + if (root.x + image.width >= buffer.width) { + ctx.drawImage(image, 0, 0, + image.width, image.height, + root.x - image.width, root.y + image.height, + image.width, image.height); + } else if (root.x < 0) { + ctx.drawImage(image, 0, 0, + image.width, image.height, + root.x + image.width, root.y + image.height, + image.width, image.height); + } } - } else if (root.y < 0) { - ctx.drawImage(image, 0, 0, - image.width, image.height, - root.x, root.y + image.height, - image.width, image.height); if (root.x + image.width >= buffer.width) { ctx.drawImage(image, 0, 0, image.width, image.height, - root.x - image.width, root.y + image.height, + root.x - image.width, root.y, image.width, image.height); } else if (root.x < 0) { ctx.drawImage(image, 0, 0, image.width, image.height, - root.x + image.width, root.y + image.height, + root.x + image.width, root.y, image.width, image.height); } } + } else if (data.shape !== undefined) { + if (data.shape instanceof Path2D) { + if (data.stroke !== undefined) { + ctx.strokeStyle = data.stroke; + ctx.stroke(data.shape); + } - if (root.x + image.width >= buffer.width) { - ctx.drawImage(image, 0, 0, - image.width, image.height, - root.x - image.width, root.y, - image.width, image.height); - } else if (root.x < 0) { - ctx.drawImage(image, 0, 0, - image.width, image.height, - root.x + image.width, root.y, - image.width, image.height); - } - } - } else if (data.shape !== undefined) { - if (data.shape instanceof Path2D) { - if (data.stroke !== undefined) { - ctx.strokeStyle = data.stroke; - ctx.stroke(data.shape); - } + if (data.fill !== undefined) { + ctx.fillStyle = data.fill; + ctx.fill(data.shape as any); // TODO + } + } else if ((data.shape instanceof Polygon) || + (data.shape instanceof Circle)) { + const path = data.shape.path(); - if (data.fill !== undefined) { - ctx.fillStyle = data.fill; - ctx.fill(data.shape as any); // TODO - } - } else if ((data.shape instanceof Polygon) || - (data.shape instanceof Circle)) { - const path = data.shape.path(); + if (data.stroke !== undefined) { + ctx.strokeStyle = data.stroke; + ctx.stroke(path); + } - if (data.stroke !== undefined) { - ctx.strokeStyle = data.stroke; - ctx.stroke(path); - } + if (data.fill !== undefined) { + ctx.fillStyle = data.fill; + ctx.fill(path as any); // TODO + } + } else { + const shape = data.shape as Dimensions; - if (data.fill !== undefined) { - ctx.fillStyle = data.fill; - ctx.fill(path as any); // TODO - } - } else { - const shape = data.shape as Dimensions; + if (data.stroke !== undefined) { + ctx.strokeStyle = data.stroke; + ctx.strokeRect(root.x, root.y, shape.width, shape.height); + } - if (data.stroke !== undefined) { - ctx.strokeStyle = data.stroke; - ctx.strokeRect(root.x, root.y, shape.width, shape.height); + if (data.fill !== undefined) { + ctx.fillStyle = data.fill; + ctx.fillRect(root.x, root.y, shape.width, shape.height); + } } + } else if (data.text !== undefined) { + const fontset = _parseFontset(data.font); + + if (fontset !== undefined) { + ctx.save(); + try { + const tileset = assets.loadTileset(fontset); + ctx.translate(root.x, root.y); + + for (let i = 0; i < data.text.length; ++i) { + const c = data.text.charCodeAt(i) + 1; + tileset.drawTile(ctx, c, i, 0); + } + } finally { + ctx.restore(); + } + } else { + if (data.font !== undefined) { + ctx.font = data.font; + } else { + ctx.font = "8pt monospace"; + } - if (data.fill !== undefined) { - ctx.fillStyle = data.fill; - ctx.fillRect(root.x, root.y, shape.width, shape.height); - } - } - } else if (data.text !== undefined) { - const fontset = _parseFontset(data.font); - - if (fontset !== undefined) { - ctx.save(); - try { - const tileset = assets.loadTileset(fontset); - ctx.translate(root.x, root.y); - - for (let i = 0; i < data.text.length; ++i) { - const c = data.text.charCodeAt(i) + 1; - tileset.drawTile(ctx, c, i, 0); + if (data.stroke !== undefined) { + ctx.strokeStyle = data.stroke; + ctx.strokeText(data.text, root.x, root.y); + } + + if (data.fill !== undefined) { + ctx.fillStyle = data.fill; + ctx.fillText(data.text, root.x, root.y); } - } finally { - ctx.restore(); } } else { - if (data.font !== undefined) { - ctx.font = data.font; - } else { - ctx.font = "8pt monospace"; - } - if (data.stroke !== undefined) { ctx.strokeStyle = data.stroke; - ctx.strokeText(data.text, root.x, root.y); + ctx.strokeRect(root.x, root.y, root.width, root.height); } if (data.fill !== undefined) { ctx.fillStyle = data.fill; - ctx.fillText(data.text, root.x, root.y); + ctx.fillRect(root.x, root.y, root.width, root.height); } } - } else { - if (data.stroke !== undefined) { - ctx.strokeStyle = data.stroke; - ctx.strokeRect(root.x, root.y, root.width, root.height); - } - - if (data.fill !== undefined) { - ctx.fillStyle = data.fill; - ctx.fillRect(root.x, root.y, root.width, root.height); - } - } - if (data.children !== undefined) { - for (let i = 0; i < data.children.length; ++i) { - _render(ctx, buffer, data.children[i], root, assets, debug); + if (data.children !== undefined) { + for (let i = 0; i < data.children.length; ++i) { + _render(ctx, buffer, data.children[i], root, assets, debug); + } } + } finally { + ctx.restore(); } - ctx.restore(); - if (debug) { ctx.strokeStyle = "#a2ffcb"; From 61ebd94a2c22ae389656d6b4a1e13923a814e6f9 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sun, 18 Mar 2018 19:45:22 -0400 Subject: [PATCH 10/16] Fix render depth sort --- src/util/render-backends/render-backend-2d.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/util/render-backends/render-backend-2d.ts b/src/util/render-backends/render-backend-2d.ts index 1bed929..a91f3a0 100644 --- a/src/util/render-backends/render-backend-2d.ts +++ b/src/util/render-backends/render-backend-2d.ts @@ -36,7 +36,7 @@ export class RenderBackend2D implements RenderBackend { } render(viewport: Bounds, buffer: HTMLCanvasElement): void { - this._depths.sort(); + this._depths.sort(_layerCompare); (this._ctx as any).resetTransform(); this._ctx.translate(-viewport.left, -viewport.top); @@ -269,3 +269,7 @@ function _parseFontset(s?: string): string | void { } } } + +function _layerCompare(a: number, b: number) { + return -Math.sign(b - a); +} From 6cdb5261565f71f616edca2ade7721c7ef4042ed Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sun, 18 Mar 2018 19:45:45 -0400 Subject: [PATCH 11/16] Add optional render component to particle entity --- src/entities/particle-entity.ts | 9 +++++++++ src/systems/particle-system.ts | 3 +++ 2 files changed, 12 insertions(+) diff --git a/src/entities/particle-entity.ts b/src/entities/particle-entity.ts index 6a60450..25416a8 100644 --- a/src/entities/particle-entity.ts +++ b/src/entities/particle-entity.ts @@ -8,6 +8,11 @@ import { PositionComponent, } from "../components/position-component"; +import { + RenderData, + RenderComponent, +} from "../components/render-component"; + import { ParticleSystem } from "../systems/particle-system"; import { @@ -18,11 +23,13 @@ import { export interface ParticleEntityConfig extends BaseEntityConfig { particle: Partial; position: Partial; + render: Partial; } export class ParticleEntity extends BaseEntity { particle: ParticleData; position: PositionData; + render: RenderData; constructor(config?: Partial) { super(config); @@ -31,6 +38,8 @@ export class ParticleEntity extends BaseEntity { this.position = new PositionComponent(config && config.position); + this.render = new RenderComponent(config && config.render); + ParticleSystem(this); } } diff --git a/src/systems/particle-system.ts b/src/systems/particle-system.ts index 5f2c1e5..db92cf5 100644 --- a/src/systems/particle-system.ts +++ b/src/systems/particle-system.ts @@ -7,6 +7,7 @@ import { PARTICLE_FIELDS, } from "../components/particle-component"; import { PositionData } from "../components/position-component"; +import { RenderData } from "../components/render-component"; import { IntervalEventData } from "../events/interval-event"; import { ParticleEventData } from "../events/particle-event"; import { RenderEventData } from "../events/render-event"; @@ -16,6 +17,7 @@ import { accelerate } from "../modules/movement"; export interface ParticleSystemEntity extends Entity { particle: ParticleData; position: PositionData; + render?: RenderData; } export function ParticleSystem(entity: ParticleSystemEntity): void { @@ -132,6 +134,7 @@ export function ParticleSystem(entity: ParticleSystemEntity): void { height: 0, render: { paint: paintf, + depth: entity.render && entity.render.depth || 0, }, }) }); From 3899eacdc07c61620800ef2acf4ee96a35f76050 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sun, 18 Mar 2018 19:46:07 -0400 Subject: [PATCH 12/16] ignore yarn-error.log --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9095579..fdc612c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ coverage/ node_modules/ lib/ +yarn-error.log From 06ecdb38d447b03ae8f6e2d6b3da7d8a9c8b5919 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 21 Apr 2018 10:34:47 -0400 Subject: [PATCH 13/16] Behavior updates --- src/behaviors/negate-behavior.ts | 29 ++++++++++++++++++++++++ src/behaviors/phase-behavior.ts | 9 ++++++++ src/behaviors/repeat-behavior.ts | 31 +++++++++++++++++++++++--- src/behaviors/until-behavior.ts | 31 ++++++++++++++++++++++++++ src/behaviors/whilst-behavior.ts | 15 +++++++------ src/index.ts | 2 ++ src/modules/behavior.ts | 38 +++++++++++++++++++++++++++----- 7 files changed, 139 insertions(+), 16 deletions(-) create mode 100644 src/behaviors/negate-behavior.ts create mode 100644 src/behaviors/until-behavior.ts diff --git a/src/behaviors/negate-behavior.ts b/src/behaviors/negate-behavior.ts new file mode 100644 index 0000000..6b12040 --- /dev/null +++ b/src/behaviors/negate-behavior.ts @@ -0,0 +1,29 @@ +import { + Behavior, + BehaviorState, + BehaviorOptions, +} from "./behavior"; + +export class NegateBehavior implements Behavior { + private _negate: Behavior; + + constructor(negate: Behavior) { + this._negate = negate; + } + + reset(): void { + this._negate.reset(); + } + + call(options: BehaviorOptions): BehaviorState { + const tmp = this._negate.call(options); + + if (tmp === "success") { + return "failure"; + } else if (tmp === "failure") { + return "success"; + } else { + return "pending"; + } + } +} diff --git a/src/behaviors/phase-behavior.ts b/src/behaviors/phase-behavior.ts index 1656abe..7e34e8e 100644 --- a/src/behaviors/phase-behavior.ts +++ b/src/behaviors/phase-behavior.ts @@ -6,6 +6,7 @@ import { export interface PhaseBehaviorConfig { period: number | (() => number); + leading?: boolean; } export class PhaseBehavior implements Behavior { @@ -17,6 +18,14 @@ export class PhaseBehavior implements Behavior { this._t = 0; this._child = child; this._config = config; + + if (this._config.leading) { + if (typeof this._config.period === "function") { + this._t = this._config.period(); + } else { + this._t = this._config.period; + } + } } reset(): void { diff --git a/src/behaviors/repeat-behavior.ts b/src/behaviors/repeat-behavior.ts index 19c8964..5b8d5bc 100644 --- a/src/behaviors/repeat-behavior.ts +++ b/src/behaviors/repeat-behavior.ts @@ -1,16 +1,25 @@ import { Behavior, BehaviorState, BehaviorOptions } from "./behavior"; +export interface RepeatBehaviorConfig { + count: number; +} + export class RepeatBehavior implements Behavior { private _pending: boolean; private _child: Behavior; + private _count: number; + private _countMax: number; - constructor(arg: Behavior) { + constructor(arg: Behavior, config?: Partial) { this._pending = false; this._child = arg; + this._count = config && config.count || 1; + this._countMax = config && config.count || 1; } reset(): void { this._pending = false; + this._count = this._countMax; this._child.reset(); } @@ -23,10 +32,26 @@ export class RepeatBehavior implements Behavior { switch (this._child.call(options)) { case "success": this._pending = false; - return "success"; + this._count -= 1; + + if (this._count === 0) { + return "success"; + } else { + this._pending = false; + this._child.reset(); + return "pending"; + } case "failure": this._pending = false; - return "failure"; + this._count -= 1; + + if (this._count === 0) { + return "failure"; + } else { + this._pending = false; + this._child.reset(); + return "pending"; + } case "pending": this._pending = true; return "pending"; diff --git a/src/behaviors/until-behavior.ts b/src/behaviors/until-behavior.ts new file mode 100644 index 0000000..cff7f89 --- /dev/null +++ b/src/behaviors/until-behavior.ts @@ -0,0 +1,31 @@ +import { + Behavior, + BehaviorState, + BehaviorOptions, +} from "./behavior"; + +export class UntilBehavior implements Behavior { + private _until: Behavior; + + constructor(until: Behavior) { + this._until = until; + } + + reset(): void { + this._until.reset(); + } + + call(options: BehaviorOptions): BehaviorState { + const tmp = this._until.call(options); + + if (tmp === "success") { + return tmp; + } else { + if (tmp === "failure") { + this._until.reset(); + } + + return "pending"; + } + } +} diff --git a/src/behaviors/whilst-behavior.ts b/src/behaviors/whilst-behavior.ts index 8c6a41d..2fd1e92 100644 --- a/src/behaviors/whilst-behavior.ts +++ b/src/behaviors/whilst-behavior.ts @@ -2,25 +2,26 @@ import { Behavior, BehaviorState, BehaviorOptions } from "./behavior"; export class WhilstBehavior implements Behavior { private _whilst: Behavior; - private _loop: Behavior; - constructor(whilst: Behavior, loop: Behavior) { + constructor(whilst: Behavior) { this._whilst = whilst; - this._loop = loop; } reset(): void { this._whilst.reset(); - this._loop.reset(); } call(options: BehaviorOptions): BehaviorState { const tmp = this._whilst.call(options); - if (tmp === "success") { - return this._loop.call(options); + if (tmp === "failure") { + return "success"; } else { - return tmp; + if (tmp === "success") { + this._whilst.reset(); + } + + return "pending"; } } } diff --git a/src/index.ts b/src/index.ts index 3baf971..1c68c85 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,12 +12,14 @@ export * from "./util/timeline"; export * from "./behaviors/behavior"; export * from "./behaviors/idle-behavior"; +export * from "./behaviors/negate-behavior"; export * from "./behaviors/parallel-behavior"; export * from "./behaviors/phase-behavior"; export * from "./behaviors/repeat-behavior"; export * from "./behaviors/select-behavior"; export * from "./behaviors/sequence-behavior"; export * from "./behaviors/whilst-behavior"; +export * from "./behaviors/until-behavior"; export * from "./entities/entity"; export * from "./entities/background-entity"; diff --git a/src/modules/behavior.ts b/src/modules/behavior.ts index eb2ff04..08fcb08 100644 --- a/src/modules/behavior.ts +++ b/src/modules/behavior.ts @@ -1,6 +1,9 @@ import { Behavior } from "../behaviors/behavior"; import { IdleBehavior } from "../behaviors/idle-behavior"; -import { RepeatBehavior } from "../behaviors/repeat-behavior"; +import { + RepeatBehavior, + RepeatBehaviorConfig, +} from "../behaviors/repeat-behavior"; import { ParallelBehavior } from "../behaviors/parallel-behavior"; import { PhaseBehavior, @@ -9,6 +12,8 @@ import { import { SelectBehavior } from "../behaviors/select-behavior"; import { SequenceBehavior } from "../behaviors/sequence-behavior"; import { WhilstBehavior } from "../behaviors/whilst-behavior"; +import { UntilBehavior } from "../behaviors/until-behavior"; +import { NegateBehavior } from "../behaviors/negate-behavior"; export interface BehaviorDSLLeaf { leaf: Behavior | (() => Behavior); @@ -20,6 +25,7 @@ export interface BehaviorDSLIdle { export interface BehaviorDSLRepeat { repeat: BehaviorDSL; + params?: Partial; } export interface BehaviorDSLParallel { @@ -36,7 +42,14 @@ export interface BehaviorDSLSequence { export interface BehaviorDSLWhilst { whilst: BehaviorDSL; - loop: BehaviorDSL; +} + +export interface BehaviorDSLUntil { + until: BehaviorDSL; +} + +export interface BehaviorDSLNegate { + negate: BehaviorDSL; } export interface BehaviorDSLPhase { @@ -51,7 +64,9 @@ export type BehaviorDSL = BehaviorDSLLeaf | BehaviorDSLParallel | BehaviorDSLSelect | BehaviorDSLSequence | - BehaviorDSLWhilst; + BehaviorDSLWhilst | + BehaviorDSLUntil | + BehaviorDSLNegate; function isLeaf(dsl: BehaviorDSL): dsl is BehaviorDSLLeaf { return dsl.hasOwnProperty("leaf"); @@ -85,6 +100,14 @@ function isWhilst(dsl: BehaviorDSL): dsl is BehaviorDSLWhilst { return dsl.hasOwnProperty("whilst"); } +function isUntil(dsl: BehaviorDSL): dsl is BehaviorDSLUntil { + return dsl.hasOwnProperty("until"); +} + +function isNegate(dsl: BehaviorDSL): dsl is BehaviorDSLNegate { + return dsl.hasOwnProperty("negate"); +} + export function buildBehavior(dsl: BehaviorDSL): Behavior { if (isLeaf(dsl)) { if (typeof dsl.leaf === "function") { @@ -93,7 +116,7 @@ export function buildBehavior(dsl: BehaviorDSL): Behavior { return dsl.leaf; } } else if (isRepeat(dsl)) { - return new RepeatBehavior(buildBehavior(dsl.repeat)); + return new RepeatBehavior(buildBehavior(dsl.repeat), dsl.params); } else if (isParallel(dsl)) { return new ParallelBehavior(dsl.parallel.map((e) => { return buildBehavior(e); @@ -109,8 +132,11 @@ export function buildBehavior(dsl: BehaviorDSL): Behavior { return buildBehavior(e); })); } else if (isWhilst(dsl)) { - return new WhilstBehavior(buildBehavior(dsl.whilst), - buildBehavior(dsl.loop)); + return new WhilstBehavior(buildBehavior(dsl.whilst)); + } else if (isUntil(dsl)) { + return new UntilBehavior(buildBehavior(dsl.until)); + } else if (isNegate(dsl)) { + return new NegateBehavior(buildBehavior(dsl.negate)); } else if (isIdle(dsl)) { return new IdleBehavior(); } else { From 9f87409505c5c33f48a4887294d971278834ab6d Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 21 Apr 2018 10:37:58 -0400 Subject: [PATCH 14/16] Lint fixes --- src/modules/ease.ts | 6 ++- src/systems/background-system.ts | 4 +- src/systems/particle-system.ts | 4 +- src/util/stage.ts | 8 ++-- test/util/collision-test.ts | 74 ++++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 test/util/collision-test.ts diff --git a/src/modules/ease.ts b/src/modules/ease.ts index bdd5ce9..84aad2e 100644 --- a/src/modules/ease.ts +++ b/src/modules/ease.ts @@ -45,7 +45,9 @@ export function easeCubeBezier(entity: Entity, }); } -export function easeBase(entity: Entity, duration: number, cb: EaseAssign): void { +export function easeBase(entity: Entity, + duration: number, + cb: EaseAssign): void { let t = 0; const f = function(event: IntervalEventData) { @@ -57,7 +59,7 @@ export function easeBase(entity: Entity, duration: number, cb: EaseAssign): void } else { cb(t / duration); } - } + }; entity.on("interval", f); } diff --git a/src/systems/background-system.ts b/src/systems/background-system.ts index 1e60201..f44dd4d 100644 --- a/src/systems/background-system.ts +++ b/src/systems/background-system.ts @@ -1,7 +1,7 @@ import { Entity } from "../entities/entity"; -import { IntervalEventData } from "../events/interval-event" -import { RenderEventData } from "../events/render-event" +import { IntervalEventData } from "../events/interval-event"; +import { RenderEventData } from "../events/render-event"; import { PositionData } from "../components/position-component"; diff --git a/src/systems/particle-system.ts b/src/systems/particle-system.ts index db92cf5..283e49a 100644 --- a/src/systems/particle-system.ts +++ b/src/systems/particle-system.ts @@ -48,7 +48,7 @@ export function ParticleSystem(entity: ParticleSystemEntity): void { const j = entity.particle.length; entity.particle.length += 1; - + _set(entity, j, "LIFETIME", _randomRange(event.lifetime)); _set(entity, j, "X", Math.floor(_randomRange(event.xOffset)) + entity.position.x); @@ -136,7 +136,7 @@ export function ParticleSystem(entity: ParticleSystemEntity): void { paint: paintf, depth: entity.render && entity.render.depth || 0, }, - }) + }); }); } diff --git a/src/util/stage.ts b/src/util/stage.ts index 6387eaf..fac3fd8 100644 --- a/src/util/stage.ts +++ b/src/util/stage.ts @@ -86,7 +86,7 @@ export type StageTMXObjectChild = StageTMXProperties | StageTMXPolygon | StageTMXEllipse ; -export interface StageTMXObject { +export interface StageTMXObject { "#name": "object"; $: { type?: string; @@ -204,7 +204,7 @@ export class Stage { components.tileset = { tileset: this.prop("tileset") || "", - assets: config.assets, + assets: config.assets, }; } @@ -305,7 +305,7 @@ function _isTMXPolygon(e: StageTMXObjectChild): e is StageTMXPolygon { return e["#name"] === "polygon"; } -function _isTMXEllipse(e: StageTMXObjectChild): e is StageTMXEllipse{ +function _isTMXEllipse(e: StageTMXObjectChild): e is StageTMXEllipse { return e["#name"] === "ellipse"; } @@ -363,7 +363,7 @@ function _fromTMXLayer(stage: Stage, layer: StageTMXLayer): void { const width = Number(layer.$.width); const height = Number(layer.$.height); - const data = layer.$$[0]._ + const data = layer.$$[0]._; const dataRows = data !== undefined ? data.trim().split("\n") : []; const tiles = new Array(height) as number[][]; diff --git a/test/util/collision-test.ts b/test/util/collision-test.ts new file mode 100644 index 0000000..64c4454 --- /dev/null +++ b/test/util/collision-test.ts @@ -0,0 +1,74 @@ +import "../test_helper"; + +import { expect } from "chai"; +import * as sinon from "sinon"; + +import { BaseEntity } from "../../src/entities/base-entity"; +import { + PositionData, + PositionComponent, +} from "../../src/components/position-component"; +import { + CollisionData, + CollisionComponent, +} from "../../src/components/collision-component"; +import { Collision } from "../../src/util/collision"; + +class MockCollisionEntity extends BaseEntity { + position: PositionData; + collision: CollisionData; + + constructor() { + super(); + + this.position = new PositionComponent(); + this.collision = new CollisionComponent(); + } +} + +describe("Collision", function() { + describe(".checkBounds", function() { + }); + + describe(".check", function() { + }); + + describe("#iterator", function() { + it("should yeild every entity", function() { + const collision = new Collision({ + top: -10, + left: -10, + bottom: 10, + right: 10, + }); + + const other1 = new MockCollisionEntity(); + const other2 = new MockCollisionEntity(); + const other3 = new MockCollisionEntity(); + + collision.add(other1); + collision.add(other2); + collision.add(other3); + + /* + const a = []; + for (let e of collision) { + a.push(e); + } + expect(a).to.deep.equal([ other1, other2, other3 ]); + */ + }); + }); + + describe("#bounds", function() { + }); + + describe("#add", function() { + }); + + describe("#queryBounds", function() { + }); + + describe("#query", function() { + }); +}); From 3361077ff272453cecd4441ab7d9a9385da5a3b3 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 21 Apr 2018 10:50:29 -0400 Subject: [PATCH 15/16] Dependency updates --- package.json | 9 +- test/entities/tileset-entity-test.ts | 4 - test/test_helper.ts | 4 + test/util/stage-test.ts | 3 - yarn.lock | 1313 +++++++++++++++++++------- 5 files changed, 972 insertions(+), 361 deletions(-) diff --git a/package.json b/package.json index 012d102..78567a0 100644 --- a/package.json +++ b/package.json @@ -47,26 +47,27 @@ "devDependencies": { "@types/chai": "^4.0.5", "@types/chai-subset": "^1.3.1", - "@types/mocha": "^2.2.44", + "@types/mocha": "^5.2.0", "@types/sinon": "^4.0.0", "@types/sinon-chai": "^2.7.29", "chai": "^4.1.2", "chai-iterator": "^1.1.4", "chai-subset": "^1.6.0", "coveralls": "^3.0.0", - "jsdom": "^9.0", + "jsdom": "^11.8.0", "mocha": "^5.0.1", - "mocha-jsdom": "^1.1.0", "nyc": "^11.3.0", "sinon": "^4.1.2", "sinon-chai": "^3.0.0", "source-map-support": "^0.5.0", - "ts-node": "^5.0.1", + "ts-node": "^6.0.0", "tslint": "^5.8.0", "tslint-config-standard": "^7.0.0", "typescript": "^2.4.1" }, "dependencies": { + "global-jsdom": "^4.2.0", + "jsdom-global": "^3.0.2", "json": "^9.0.6", "npm": "^5.7.1" } diff --git a/test/entities/tileset-entity-test.ts b/test/entities/tileset-entity-test.ts index 2254ba4..21ba095 100644 --- a/test/entities/tileset-entity-test.ts +++ b/test/entities/tileset-entity-test.ts @@ -2,16 +2,12 @@ import "../test_helper"; import { expect } from "chai"; import * as sinon from "sinon"; -//@ts-ignore -const jsdom = require("mocha-jsdom"); import { TilesetEntity } from "../../src/entities/tileset-entity"; const sandbox = sinon.createSandbox(); describe("TilesetEntity", function() { - jsdom(); - afterEach(function() { sandbox.restore(); }); diff --git a/test/test_helper.ts b/test/test_helper.ts index baf2b28..6f646d9 100644 --- a/test/test_helper.ts +++ b/test/test_helper.ts @@ -1,5 +1,9 @@ import "mocha"; +//@ts-ignore +import jsdom = require("jsdom-global"); +jsdom(); + import * as chai from "chai"; import * as sinonChai from "sinon-chai"; chai.use(sinonChai); diff --git a/test/util/stage-test.ts b/test/util/stage-test.ts index e53efd8..5c0ce50 100644 --- a/test/util/stage-test.ts +++ b/test/util/stage-test.ts @@ -2,10 +2,7 @@ import "../test_helper"; import { expect } from "chai"; import * as sinon from "sinon"; -//@ts-ignore -const jsdom = require("mocha-jsdom"); -import { TilesetEntity } from "../../src/entities/tileset-entity"; import { Stage } from "../../src/util/stage"; describe("Stage", function() { diff --git a/yarn.lock b/yarn.lock index c9dff0c..cacd6cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@sinonjs/formatio@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" + resolved "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" dependencies: samsam "1.3.0" @@ -15,12 +15,12 @@ "@types/chai" "*" "@types/chai@*", "@types/chai@^4.0.5": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.2.tgz#f1af664769cfb50af805431c407425ed619daa21" + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.3.tgz#b8a74352977a23b604c01aa784f5b793443fb7dc" -"@types/mocha@^2.2.44": - version "2.2.48" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.48.tgz#3523b126a0b049482e1c3c11877460f76622ffab" +"@types/mocha@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.0.tgz#b3c8e69f038835db1a7fdc0b3d879fc50506e29e" "@types/sinon-chai@^2.7.29": version "2.7.29" @@ -30,8 +30,8 @@ "@types/sinon" "*" "@types/sinon@*", "@types/sinon@^4.0.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-4.3.0.tgz#7f53915994a00ccea24f4e0c24709822ed11a3b1" + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-4.3.1.tgz#32458f9b166cd44c23844eee4937814276f35199" JSONStream@^1.3.2: version "1.3.2" @@ -40,7 +40,7 @@ JSONStream@^1.3.2: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^1.0.3: +abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -48,15 +48,15 @@ abbrev@1, abbrev@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -acorn-globals@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" dependencies: - acorn "^4.0.4" + acorn "^5.0.0" -acorn@^4.0.4: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" +acorn@^5.0.0, acorn@^5.3.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" agent-base@4, agent-base@^4.1.0: version "4.2.0" @@ -65,8 +65,8 @@ agent-base@4, agent-base@^4.1.0: es6-promisify "^5.0.0" agentkeepalive@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.0.tgz#92487926ec1a93100a89a8a46a6b2d82513543ce" + version "3.4.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.1.tgz#aa95aebc3a749bca5ed53e3880a09f5235b48f0c" dependencies: humanize-ms "^1.2.1" @@ -156,10 +156,18 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" @@ -168,6 +176,10 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -188,6 +200,14 @@ assertion-error@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -196,13 +216,17 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.0.tgz#ab2b150e51d7b122b9efc8d7340c06b6c41076bc" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -279,6 +303,18 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -286,15 +322,14 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" bin-links@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.0.tgz#e0a92cb57f01c4dc1088bca2bae6be110b9f64f9" + version "1.1.2" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" dependencies: bluebird "^3.5.0" cmd-shim "^2.0.2" - fs-write-stream-atomic "^1.0.10" gentle-fs "^2.0.0" graceful-fs "^4.1.11" - slide "^1.1.6" + write-file-atomic "^2.3.0" block-stream@*: version "0.0.9" @@ -345,9 +380,32 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + +buffer-from@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" @@ -379,6 +437,20 @@ cacache@^10.0.0, cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + caching-transform@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" @@ -444,8 +516,8 @@ chalk@^1.1.3: supports-color "^2.0.0" chalk@^2.0.1, chalk@^2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" + version "2.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52" dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -459,10 +531,23 @@ chownr@^1.0.1, chownr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +ci-info@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" + cidr-regex@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-1.0.6.tgz#74abfd619df370b9d54ab14475568e97dd64c0c1" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -484,14 +569,6 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - cliui@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" @@ -501,8 +578,8 @@ cliui@^4.0.0: wrap-ansi "^2.0.0" clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" cmd-shim@^2.0.2, cmd-shim@~2.0.2: version "2.0.2" @@ -519,6 +596,13 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" @@ -530,8 +614,8 @@ color-name@^1.1.1: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" colors@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + version "1.2.1" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.1.tgz#f4a3d302976aaf042356ba1ade3b1a2c62d9d794" columnify@~1.5.4: version "1.5.4" @@ -551,21 +635,26 @@ commander@2.11.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" commander@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" concat-stream@^1.5.0, concat-stream@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26" + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" @@ -578,8 +667,8 @@ config-chain@~1.1.11: proto-list "~1.2.1" configstore@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -592,11 +681,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - -convert-source-map@^1.3.0: +convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -611,9 +696,13 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + core-js@^2.4.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + version "2.5.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -680,22 +769,30 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" -debug@2, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -734,6 +831,25 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -752,6 +868,10 @@ detect-indent@~5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + dezalgo@^1.0.0, dezalgo@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -759,13 +879,9 @@ dezalgo@^1.0.0, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" -diff@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" - -diff@^3.1.0, diff@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" +diff@3.5.0, diff@^3.1.0, diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" doctrine@^0.7.2: version "0.7.2" @@ -774,15 +890,21 @@ doctrine@^0.7.2: esutils "^1.1.6" isarray "0.0.1" +domexception@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: is-obj "^1.0.0" -dotenv@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" +dotenv@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" duplexer3@^0.1.4: version "0.1.4" @@ -849,7 +971,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@^1.6.1: +escodegen@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" dependencies: @@ -898,12 +1020,37 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" dependencies: fill-range "^2.1.0" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -914,6 +1061,19 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -948,6 +1108,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" @@ -967,20 +1136,20 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: locate-path "^2.0.0" flush-write-stream@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" dependencies: inherits "^2.0.1" readable-stream "^2.0.4" -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1009,6 +1178,12 @@ form-data@~2.3.1: combined-stream "1.0.6" mime-types "^2.1.12" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + from2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" @@ -1023,7 +1198,7 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-minipass@^1.2.3: +fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" dependencies: @@ -1037,7 +1212,7 @@ fs-vacuum@^1.2.10, fs-vacuum@~1.2.10: path-is-inside "^1.0.1" rimraf "^2.5.2" -fs-write-stream-atomic@^1.0.10, fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10: +fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" dependencies: @@ -1101,6 +1276,10 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1137,6 +1316,10 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global-jsdom@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/global-jsdom/-/global-jsdom-4.2.0.tgz#a247b85731b6d3ff6e07ad7cb05a24b010929534" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -1208,6 +1391,33 @@ has-unicode@^2.0.0, has-unicode@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" @@ -1225,11 +1435,11 @@ hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" -hosted-git-info@^2.1.4, hosted-git-info@^2.4.2, hosted-git-info@^2.5.0, hosted-git-info@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +hosted-git-info@^2.1.4, hosted-git-info@^2.4.2, hosted-git-info@^2.5.0, hosted-git-info@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" -html-encoding-sniffer@^1.0.1: +html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" dependencies: @@ -1240,11 +1450,11 @@ http-cache-semantics@^3.8.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" http-proxy-agent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4" + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" dependencies: agent-base "4" - debug "2" + debug "3.1.0" http-signature@~1.2.0: version "1.2.0" @@ -1255,8 +1465,8 @@ http-signature@~1.2.0: sshpk "^1.7.0" https-proxy-agent@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" dependencies: agent-base "^4.1.0" debug "^3.1.0" @@ -1267,10 +1477,16 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.19, iconv-lite@~0.4.13: +iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@~0.4.13: + version "0.4.21" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" + dependencies: + safer-buffer "^2.1.0" + iferr@^0.1.5, iferr@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" @@ -1304,12 +1520,12 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -init-package-json@~1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.1.tgz#cd873a167796befb99612b28762a0b6393fd8f6a" +init-package-json@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" dependencies: glob "^7.1.1" - npm-package-arg "^4.0.0 || ^5.0.0" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" promzard "^0.3.0" read "~1.0.1" read-package-json "1 || 2" @@ -1318,8 +1534,8 @@ init-package-json@~1.10.1: validate-npm-package-name "^3.0.0" invariant@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: loose-envify "^1.0.0" @@ -1331,6 +1547,18 @@ ip@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1345,12 +1573,46 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-ci@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + dependencies: + ci-info "^1.0.0" + is-cidr@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-1.0.0.tgz#fb5aacf659255310359da32cae03e40c6a1c2afc" dependencies: cidr-regex "1.0.6" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -1361,10 +1623,16 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" @@ -1414,16 +1682,32 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" dependencies: path-is-inside "^1.0.1" +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -1452,6 +1736,10 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -1470,13 +1758,17 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz#4113c8ff6b7a40a1ef7350b01016331f63afde14" +istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" istanbul-lib-hook@^1.1.0: version "1.1.0" @@ -1484,19 +1776,19 @@ istanbul-lib-hook@^1.1.0: dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.9.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz#84905bf47f7e0b401d6b840da7bad67086b4aab6" +istanbul-lib-instrument@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.1.2" + istanbul-lib-coverage "^1.2.0" semver "^5.3.0" -istanbul-lib-report@^1.1.2: +istanbul-lib-report@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz#2df12188c0fa77990c0d2176d2d0ba3394188259" dependencies: @@ -1505,7 +1797,7 @@ istanbul-lib-report@^1.1.2: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.2: +istanbul-lib-source-maps@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" dependencies: @@ -1515,9 +1807,9 @@ istanbul-lib-source-maps@^1.2.2: rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.4.tgz#5ccba5e22b7b5a5d91d5e0a830f89be334bf97bd" +istanbul-reports@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.4.0.tgz#3d7b44b912ecbe7652a603662b962120739646a1" dependencies: handlebars "^4.0.3" @@ -1526,8 +1818,8 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" js-yaml@^3.6.1, js-yaml@^3.7.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -1536,37 +1828,48 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^9.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" +jsdom-global@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsdom-global/-/jsdom-global-3.0.2.tgz#6bd299c13b0c4626b2da2c0393cd4385d606acb9" + +jsdom@^11.8.0: + version "11.8.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.8.0.tgz#a52e9a7d2b931284f62c80dad5f17d7390499d8b" dependencies: - abab "^1.0.3" - acorn "^4.0.4" - acorn-globals "^3.1.0" + abab "^1.0.4" + acorn "^5.3.0" + acorn-globals "^4.1.0" array-equal "^1.0.0" - content-type-parser "^1.0.1" cssom ">= 0.3.2 < 0.4.0" cssstyle ">= 0.2.37 < 0.3.0" - escodegen "^1.6.1" - html-encoding-sniffer "^1.0.1" - nwmatcher ">= 1.3.9 < 2.0.0" - parse5 "^1.5.1" - request "^2.79.0" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.2" - webidl-conversions "^4.0.0" - whatwg-encoding "^1.0.1" - whatwg-url "^4.3.0" - xml-name-validator "^2.0.1" + data-urls "^1.0.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.2" + left-pad "^1.2.0" + nwmatcher "^1.4.3" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.83.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.0" + ws "^4.0.0" + xml-name-validator "^3.0.0" jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" -json-parse-better-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" json-schema-traverse@^0.3.0: version "0.3.1" @@ -1601,7 +1904,7 @@ just-extend@^1.1.27: version "1.1.27" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -1613,6 +1916,14 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -1637,6 +1948,10 @@ lcov-parse@^0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" +left-pad@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -1644,9 +1959,9 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libcipm@^1.3.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-1.6.0.tgz#3ca7cff31f148615a6aac2b14759de14a5688134" +libcipm@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-1.6.2.tgz#5a9d83b8606b9733cfff016ad9b37d3b8198ae09" dependencies: bin-links "^1.1.0" bluebird "^3.5.1" @@ -1662,18 +1977,18 @@ libcipm@^1.3.3: rimraf "^2.6.2" worker-farm "^1.5.4" -libnpx@~9.7.1: - version "9.7.1" - resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-9.7.1.tgz#55300b5e119bd47b714be9704ca0696ffb18b025" +libnpx@^10.0.1: + version "10.2.0" + resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102" dependencies: - dotenv "^4.0.0" - npm-package-arg "^5.1.2" - rimraf "^2.6.1" + dotenv "^5.0.1" + npm-package-arg "^6.0.0" + rimraf "^2.6.2" safe-buffer "^5.1.0" - update-notifier "^2.2.0" - which "^1.2.14" - y18n "^3.2.1" - yargs "^8.0.2" + update-notifier "^2.3.0" + which "^1.3.0" + y18n "^4.0.0" + yargs "^11.0.0" load-json-file@^1.0.0: version "1.1.0" @@ -1685,15 +2000,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -1702,15 +2008,17 @@ locate-path@^2.0.0: path-exists "^3.0.0" lock-verify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.0.0.tgz#0c957bd542aeae19272408b066b0cad819410452" + version "2.0.1" + resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.0.1.tgz#6d671eea60b459c6048b3b26b62959208be67682" dependencies: npm-package-arg "^5.1.2" semver "^5.4.1" lockfile@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + dependencies: + signal-exit "^3.0.2" lodash._baseuniq@~4.6.0: version "4.6.0" @@ -1735,6 +2043,10 @@ lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + lodash.union@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -1751,7 +2063,7 @@ lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.17.4: +lodash@^4.13.1, lodash@^4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" @@ -1774,12 +2086,12 @@ loose-envify@^1.0.0: js-tokens "^3.0.0" lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + version "4.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -1810,6 +2122,16 @@ make-fetch-happen@^2.5.0, make-fetch-happen@^2.6.0: socks-proxy-agent "^3.0.1" ssri "^5.0.0" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + md5-hex@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" @@ -1854,6 +2176,24 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" @@ -1868,7 +2208,7 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -1886,10 +2226,11 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -minipass@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.1.tgz#5ada97538b1027b4cf7213432428578cb564011f" +minipass@^2.2.1, minipass@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" dependencies: + safe-buffer "^5.1.1" yallist "^3.0.0" minizlib@^1.1.0: @@ -1928,28 +2269,47 @@ mississippi@^2.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -mocha-jsdom@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mocha-jsdom/-/mocha-jsdom-1.1.0.tgz#e1576fbd0601cc89d358a213a0e5585d1b7c7a01" - mocha@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.1.tgz#759b62c836b0732382a62b6b1fb245ec1bc943ac" + version "5.1.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.1.1.tgz#b774c75609dac05eb48f4d9ba1d827b97fde8a7b" dependencies: - browser-stdout "1.3.0" + browser-stdout "1.3.1" commander "2.11.0" debug "3.1.0" - diff "3.3.1" + diff "3.5.0" escape-string-regexp "1.0.5" glob "7.1.2" growl "1.10.3" he "1.1.1" + minimatch "3.0.4" mkdirp "0.5.1" supports-color "4.4.0" @@ -1976,9 +2336,26 @@ mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + nise@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.3.0.tgz#7d6d506e64a0e37959495157f30a799c0436df72" + version "1.3.3" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.3.3.tgz#c17a850066a8a1dfeb37f921da02441afc4a82ba" dependencies: "@sinonjs/formatio" "^2.0.0" just-extend "^1.1.27" @@ -2054,9 +2431,9 @@ npm-install-checks@~3.0.0: dependencies: semver "^2.3.0 || 3.x || 4 || 5" -npm-lifecycle@^2.0.0, npm-lifecycle@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.0.0.tgz#d66fba59e7098dbb5862df66c0d81ed75108f1c6" +npm-lifecycle@^2.0.0, npm-lifecycle@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.0.1.tgz#897313f05ed24db8e28d99fa8b42c31b625e6237" dependencies: byline "^5.0.0" graceful-fs "^4.1.11" @@ -2071,7 +2448,16 @@ npm-logical-tree@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" -"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0", "npm-package-arg@^4.0.0 || ^5.0.0", npm-package-arg@^5.1.2: +"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" + dependencies: + hosted-git-info "^2.6.0" + osenv "^0.1.5" + semver "^5.5.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37" dependencies: @@ -2080,7 +2466,7 @@ npm-logical-tree@^1.2.1: semver "^5.1.0" validate-npm-package-name "^3.0.0" -npm-package-arg@^6.0.0, npm-package-arg@~6.0.0: +npm-package-arg@~6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" dependencies: @@ -2110,20 +2496,21 @@ npm-profile@^3.0.1: aproba "^1.1.2" make-fetch-happen "^2.5.0" -npm-registry-client@~8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.5.0.tgz#4878fb6fa1f18a5dc08ae83acf94d0d0112d7ed0" +npm-registry-client@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.5.1.tgz#8115809c0a4b40938b8a109b8ea74d26c6f5d7f1" dependencies: concat-stream "^1.5.2" graceful-fs "^4.1.6" normalize-package-data "~1.0.1 || ^2.0.0" - npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0" + npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" once "^1.3.3" request "^2.74.0" retry "^0.10.0" + safe-buffer "^5.1.1" semver "2 >=2.2.1 || 3.x || 4 || 5" slide "^1.1.3" - ssri "^4.1.2" + ssri "^5.2.4" optionalDependencies: npmlog "2 || ^3.1.0 || ^4.0.0" @@ -2138,8 +2525,8 @@ npm-user-validate@~1.0.0: resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" npm@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/npm/-/npm-5.7.1.tgz#cf03d41f70472a74d08061cbe8d56ac418026a55" + version "5.8.0" + resolved "https://registry.yarnpkg.com/npm/-/npm-5.8.0.tgz#5e4bfb8c2e7ada01dd41ec0555d13dd0f446ddb2" dependencies: JSONStream "^1.3.2" abbrev "~1.1.1" @@ -2158,6 +2545,7 @@ npm@^5.7.1: columnify "~1.5.4" config-chain "~1.1.11" detect-indent "~5.0.0" + detect-newline "^2.1.0" dezalgo "~1.0.3" editor "~1.0.0" find-npm-prefix "^1.0.2" @@ -2167,16 +2555,17 @@ npm@^5.7.1: glob "~7.1.2" graceful-fs "~4.1.11" has-unicode "~2.0.1" - hosted-git-info "~2.5.0" + hosted-git-info "^2.6.0" iferr "~0.1.5" inflight "~1.0.6" inherits "~2.0.3" ini "^1.3.5" - init-package-json "~1.10.1" + init-package-json "^1.10.3" is-cidr "~1.0.0" + json-parse-better-errors "^1.0.1" lazy-property "~1.0.0" - libcipm "^1.3.3" - libnpx "~9.7.1" + libcipm "^1.6.0" + libnpx "^10.0.1" lockfile "~1.0.3" lodash._baseuniq "~4.6.0" lodash.clonedeep "~4.5.0" @@ -2185,24 +2574,24 @@ npm@^5.7.1: lodash.without "~4.4.0" lru-cache "~4.1.1" meant "~1.0.1" - mississippi "^2.0.0" + mississippi "^3.0.0" mkdirp "~0.5.1" move-concurrently "^1.0.1" nopt "~4.0.1" normalize-package-data "~2.4.0" npm-cache-filename "~1.0.2" npm-install-checks "~3.0.0" - npm-lifecycle "~2.0.0" + npm-lifecycle "^2.0.1" npm-package-arg "~6.0.0" npm-packlist "~1.1.10" npm-profile "^3.0.1" - npm-registry-client "~8.5.0" + npm-registry-client "^8.5.1" npm-user-validate "~1.0.0" npmlog "~4.1.2" once "~1.4.0" opener "~1.4.3" osenv "^0.1.5" - pacote "^7.3.3" + pacote "^7.6.1" path-is-inside "~1.0.2" promise-inflight "~1.0.1" qrcode-terminal "~0.11.0" @@ -2211,9 +2600,9 @@ npm@^5.7.1: read "~1.0.7" read-cmd-shim "~1.0.1" read-installed "~4.0.3" - read-package-json "~2.0.12" + read-package-json "^2.0.13" read-package-tree "~5.1.6" - readable-stream "^2.3.4" + readable-stream "^2.3.5" request "~2.83.0" retry "~0.10.1" rimraf "~2.6.2" @@ -2225,7 +2614,7 @@ npm@^5.7.1: sorted-union-stream "~2.1.3" ssri "^5.2.4" strip-ansi "~4.0.0" - tar "^4.3.3" + tar "^4.4.0" text-table "~0.2.0" uid-number "0.0.6" umask "~1.1.0" @@ -2235,9 +2624,9 @@ npm@^5.7.1: uuid "^3.2.1" validate-npm-package-name "~3.0.0" which "~1.3.0" - worker-farm "^1.5.2" + worker-farm "^1.5.4" wrappy "~1.0.2" - write-file-atomic "~2.1.0" + write-file-atomic "^2.3.0" "npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@~4.1.2: version "4.1.2" @@ -2252,30 +2641,30 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -"nwmatcher@>= 1.3.9 < 2.0.0": - version "1.4.3" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" +nwmatcher@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" nyc@^11.3.0: - version "11.4.1" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.4.1.tgz#13fdf7e7ef22d027c61d174758f6978a68f4f5e5" + version "11.7.1" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.7.1.tgz#7cb0a422e501b88ff2c1634341dec2560299d67b" dependencies: archy "^1.0.0" arrify "^1.0.1" caching-transform "^1.0.0" - convert-source-map "^1.3.0" + convert-source-map "^1.5.1" debug-log "^1.0.1" default-require-extensions "^1.0.0" find-cache-dir "^0.1.1" find-up "^2.1.0" foreground-child "^1.5.3" glob "^7.0.6" - istanbul-lib-coverage "^1.1.1" + istanbul-lib-coverage "^1.1.2" istanbul-lib-hook "^1.1.0" - istanbul-lib-instrument "^1.9.1" - istanbul-lib-report "^1.1.2" - istanbul-lib-source-maps "^1.2.2" - istanbul-reports "^1.1.3" + istanbul-lib-instrument "^1.10.0" + istanbul-lib-report "^1.1.3" + istanbul-lib-source-maps "^1.2.3" + istanbul-reports "^1.4.0" md5-hex "^1.2.0" merge-source-map "^1.0.2" micromatch "^2.3.11" @@ -2284,8 +2673,8 @@ nyc@^11.3.0: rimraf "^2.5.4" signal-exit "^3.0.1" spawn-wrap "^1.4.2" - test-exclude "^4.1.1" - yargs "^10.0.3" + test-exclude "^4.2.0" + yargs "11.1.0" yargs-parser "^8.0.0" oauth-sign@~0.8.2: @@ -2296,6 +2685,20 @@ object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -2303,6 +2706,12 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2383,9 +2792,9 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" -pacote@^7.3.3, pacote@^7.5.1: - version "7.5.3" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-7.5.3.tgz#d0304a517d2a39a978caca69f825aaf0eca74232" +pacote@^7.5.1, pacote@^7.6.1: + version "7.6.1" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-7.6.1.tgz#d44621c89a5a61f173989b60236757728387c094" dependencies: bluebird "^3.5.1" cacache "^10.0.4" @@ -2394,7 +2803,7 @@ pacote@^7.3.3, pacote@^7.5.1: lru-cache "^4.1.1" make-fetch-happen "^2.6.0" minimatch "^3.0.4" - mississippi "^2.0.0" + mississippi "^3.0.0" mkdirp "^0.5.1" normalize-package-data "^2.4.0" npm-package-arg "^6.0.0" @@ -2408,7 +2817,7 @@ pacote@^7.3.3, pacote@^7.5.1: safe-buffer "^5.1.1" semver "^5.5.0" ssri "^5.2.4" - tar "^4.3.3" + tar "^4.4.0" unique-filename "^1.1.0" which "^1.3.0" @@ -2435,9 +2844,13 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" path-exists@^2.0.0: version "2.1.0" @@ -2479,12 +2892,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -2517,6 +2924,14 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -2582,6 +2997,13 @@ pump@^2.0.0, pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" @@ -2594,6 +3016,10 @@ punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + qrcode-terminal@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz#ffc6c28a2fc0bfb47052b47e23f4f446a5fbdb9e" @@ -2603,8 +3029,8 @@ qs@~6.5.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" query-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.0.tgz#9583b15fd1307f899e973ed418886426a9976469" + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" dependencies: decode-uri-component "^0.2.0" object-assign "^4.1.0" @@ -2622,8 +3048,8 @@ randomatic@^1.1.3: kind-of "^4.0.0" rc@^1.0.1, rc@^1.1.6: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + version "1.2.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -2649,12 +3075,12 @@ read-installed@~4.0.3: optionalDependencies: graceful-fs "^4.1.2" -"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.12, read-package-json@~2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.12.tgz#68ea45f98b3741cb6e10ae3bbd42a605026a6951" +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.12, read-package-json@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" dependencies: glob "^7.1.1" - json-parse-better-errors "^1.0.0" + json-parse-better-errors "^1.0.1" normalize-package-data "^2.0.0" slash "^1.0.0" optionalDependencies: @@ -2677,13 +3103,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -2692,30 +3111,22 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read@1, read@~1.0.1, read@~1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: 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.0.3" + string_decoder "~1.1.1" util-deprecate "~1.0.1" readable-stream@~1.1.10: @@ -2746,6 +3157,13 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + registry-auth-token@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" @@ -2767,7 +3185,7 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -2777,7 +3195,48 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@^2.74.0, request@^2.79.0, request@~2.83.0: +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +request@2, request@^2.74.0, request@^2.79.0, request@^2.83.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@~2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -2820,12 +3279,20 @@ resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + resolve@^1.3.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + version "1.7.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" dependencies: path-parse "^1.0.5" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + retry@^0.10.0, retry@~0.10.1: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" @@ -2852,11 +3319,21 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + samsam@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" -sax@^1.2.1: +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -2878,6 +3355,24 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + sha@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" @@ -2904,8 +3399,8 @@ sinon-chai@^3.0.0: resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.0.0.tgz#d5cbd70fa71031edd96b528e0eed4038fcc99f29" sinon@^4.1.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.4.2.tgz#c4c41d4bd346e1d33594daec2d5df0548334fc65" + version "4.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" dependencies: "@sinonjs/formatio" "^2.0.0" diff "^3.1.0" @@ -2927,6 +3422,33 @@ smart-buffer@^1.0.13: version "1.1.15" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" @@ -2958,19 +3480,33 @@ sorted-union-stream@~2.1.3: from2 "^1.3.0" stream-iterate "^1.1.0" +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@^0.5.0, source-map-support@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" + version "0.5.4" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.4.tgz#54456efa89caa9270af7cd624cc2f123e51fbae8" dependencies: source-map "^0.6.0" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.5.3, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -3011,13 +3547,19 @@ spdx-license-ids@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -3029,18 +3571,23 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -ssri@^4.1.2: - version "4.1.6" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-4.1.6.tgz#0cb49b6ac84457e7bdd466cb730c3cb623e9a25b" - dependencies: - safe-buffer "^5.1.0" - ssri@^5.0.0, ssri@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.2.4.tgz#9985e14041e65fc397af96542be35724ac11da52" + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" dependencies: safe-buffer "^5.1.1" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + stream-each@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" @@ -3082,9 +3629,9 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" dependencies: safe-buffer "~5.1.0" @@ -3110,10 +3657,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -3139,12 +3682,12 @@ supports-color@^3.1.2: has-flag "^1.0.0" supports-color@^5.1.0, supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" dependencies: has-flag "^3.0.0" -symbol-tree@^3.2.1: +symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -3156,15 +3699,16 @@ tar@^2.0.0: fstream "^1.0.2" inherits "2" -tar@^4.3.3: - version "4.4.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.0.tgz#3aaf8c29b6b800a8215f33efb4df1c95ce2ac2f5" +tar@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749" dependencies: chownr "^1.0.1" - fs-minipass "^1.2.3" - minipass "^2.2.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" term-size@^1.2.0: @@ -3173,12 +3717,12 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -test-exclude@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.0.tgz#07e3613609a362c74516a717515e13322ab45b3c" +test-exclude@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" dependencies: arrify "^1.0.1" - micromatch "^2.3.11" + micromatch "^3.1.8" object-assign "^4.1.0" read-pkg-up "^1.0.1" require-main-filename "^1.0.1" @@ -3210,23 +3754,47 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" -tough-cookie@^2.3.2, tough-cookie@~2.3.3: +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" +tr46@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" -ts-node@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-5.0.1.tgz#78e5d1cb3f704de1b641e43b76be2d4094f06f81" +ts-node@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-6.0.0.tgz#46c25f8498593a9248eeea16906f1598fa098140" dependencies: arrify "^1.0.0" chalk "^2.3.0" @@ -3277,8 +3845,8 @@ tsutils@^1.4.0: resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" tsutils@^2.12.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.22.1.tgz#30450bd701be623b9e11a129df0c32322678461b" + version "2.26.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.26.1.tgz#9e4a0cb9ff173863f34c22a961969081270d1878" dependencies: tslib "^1.8.1" @@ -3307,8 +3875,8 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" typescript@^2.4.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" uglify-js@^2.6: version "2.8.29" @@ -3331,6 +3899,15 @@ umask@^1.1.0, umask@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + unique-filename@^1.1.0, unique-filename@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" @@ -3353,11 +3930,33 @@ unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -update-notifier@^2.2.0, update-notifier@~2.3.0: +update-notifier@^2.3.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +update-notifier@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" dependencies: @@ -3371,12 +3970,22 @@ update-notifier@^2.2.0, update-notifier@~2.3.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" dependencies: prepend-http "^1.0.1" +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -3410,38 +4019,45 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + wcwidth@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" dependencies: defaults "^1.0.3" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - -webidl-conversions@^4.0.0: +webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" -whatwg-encoding@^1.0.1: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" dependencies: iconv-lite "0.4.19" -whatwg-url@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + +whatwg-url@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + lodash.sortby "^4.7.0" + tr46 "^1.0.0" + webidl-conversions "^4.0.1" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@~1.3.0: +which@1, which@^1.2.9, which@^1.3.0, which@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: @@ -3475,12 +4091,11 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -worker-farm@^1.5.2, worker-farm@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.4.tgz#4debbe46b40edefcc717ebde74a90b1ae1e909a1" +worker-farm@^1.5.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" dependencies: errno "~0.1.7" - xtend "~4.0.1" wrap-ansi@^2.0.0: version "2.1.0" @@ -3501,7 +4116,7 @@ write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" -write-file-atomic@^2.0.0: +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: @@ -3509,21 +4124,20 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" +ws@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" + async-limiter "~1.0.0" + safe-buffer "~5.1.0" xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" -xml-name-validator@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" xtend@~4.0.1: version "4.0.1" @@ -3545,21 +4159,21 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" +yargs-parser@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" dependencies: camelcase "^4.1.0" -yargs-parser@^8.0.0, yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" dependencies: camelcase "^4.1.0" -yargs@^10.0.3: - version "10.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" +yargs@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -3572,25 +4186,24 @@ yargs@^10.0.3: string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^8.1.0" + yargs-parser "^9.0.2" -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" +yargs@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" + cliui "^4.0.0" decamelize "^1.1.1" + find-up "^2.1.0" get-caller-file "^1.0.1" os-locale "^2.0.0" - read-pkg-up "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^7.0.0" + yargs-parser "^9.0.2" yargs@~3.10.0: version "3.10.0" From 6e227a2c9c44b540a27c798be08490df4dd25669 Mon Sep 17 00:00:00 2001 From: "John J. Glynn IV" Date: Sat, 21 Apr 2018 10:51:00 -0400 Subject: [PATCH 16/16] v0.13.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 78567a0..28c6b92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mu-engine", - "version": "0.12.0", + "version": "0.13.0", "description": "mu-engine", "main": "lib/index.js", "typings": "lib/index.d.ts",