From 5cbc5156da6eb9e6410854bbbffc417706654fee Mon Sep 17 00:00:00 2001 From: Jens Fahnenbruck Date: Fri, 9 Jun 2017 15:32:09 +0200 Subject: [PATCH] feat(*): add clustered markers support Closes #1044 --- docs/content/api-docs/index.md | 4 +- package.json | 11 +- .../core/services/google-maps-api-wrapper.ts | 6 +- .../core/services/managers/marker-manager.ts | 4 +- packages/js-marker-clusterer/directives.ts | 1 + .../directives/marker-cluster.ts | 124 ++++ packages/js-marker-clusterer/index.ts | 7 + .../js-marker-clusterer.module.ts | 11 + packages/js-marker-clusterer/package.json | 6 + packages/js-marker-clusterer/package.tpl.json | 28 + packages/js-marker-clusterer/services.ts | 1 + .../services/google-clusterer-types.ts | 114 ++++ .../services/managers/cluster-manager.spec.ts | 196 ++++++ .../services/managers/cluster-manager.ts | 138 ++++ rollup.core.config.js | 3 +- rollup.js-marker-clusterer.config.js | 22 + scripts/create-package-json.js | 5 + scripts/packages.js | 5 +- yarn.lock | 621 +++++++++++++++++- 19 files changed, 1276 insertions(+), 31 deletions(-) create mode 100644 packages/js-marker-clusterer/directives.ts create mode 100644 packages/js-marker-clusterer/directives/marker-cluster.ts create mode 100644 packages/js-marker-clusterer/index.ts create mode 100644 packages/js-marker-clusterer/js-marker-clusterer.module.ts create mode 100644 packages/js-marker-clusterer/package.json create mode 100644 packages/js-marker-clusterer/package.tpl.json create mode 100644 packages/js-marker-clusterer/services.ts create mode 100644 packages/js-marker-clusterer/services/google-clusterer-types.ts create mode 100644 packages/js-marker-clusterer/services/managers/cluster-manager.spec.ts create mode 100644 packages/js-marker-clusterer/services/managers/cluster-manager.ts create mode 100644 rollup.js-marker-clusterer.config.js diff --git a/docs/content/api-docs/index.md b/docs/content/api-docs/index.md index df5436b60..8e01dcef0 100644 --- a/docs/content/api-docs/index.md +++ b/docs/content/api-docs/index.md @@ -9,4 +9,6 @@ title = "API Docs for Angular Google Maps" * [@agm/core](./agm-core/modules/AgmCoreModule.html) Provides Angular integration solutions for the official Google Maps Core API v3 * [@agm/snazzy-info-window](./agm-snazzy-info-window/modules/AgmSnazzyInfoWindowModule.html) - Styled Info Windows with [Snazzy Info Window](https://github.com/atmist/snazzy-info-window) \ No newline at end of file + Styled Info Windows with [Snazzy Info Window](https://github.com/atmist/snazzy-info-window) +* [@agm/js-marker-clusterer](./js-marker-clusterer/modules/AgmJsMarkerClusterer.html) + Clustered markers with [googlemaps/js-marker-clusterer](https://github.com/googlemaps/js-marker-clusterer) \ No newline at end of file diff --git a/package.json b/package.json index c0331dca1..6ef8abb0b 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@agm/dummy", + "name": "@agm/_dev", "private": true, "version": "1.0.0-beta.0", "description": "Angular 2+ components for Google Maps", @@ -25,8 +25,9 @@ "packagejson": "node ./scripts/create-package-json.js", "copyassets": "node ./scripts/copy-package-assets.js", "scripts": "npm run ngc:esm && npm run bundle", - "bundle": "npm run bundle:umd:core", + "bundle": "npm run bundle:umd:core && npm run bundle:umd:jsmarkerclusterer", "bundle:umd:core": "rollup -c rollup.core.config.js", + "bundle:umd:jsmarkerclusterer": "rollup -c rollup.js-marker-clusterer.config.js", "ngc:esm": "ngc -p tsconfig.json", "clang:format": "clang-format --glob=packages/**/*.ts -i", "postngc:esm": "mkdir -p dist/ && cp -R .tmp/esm/* dist/ && rimraf packages/**/*.ngfactory.ts", @@ -35,9 +36,10 @@ "ci": "npm run build && npm run test", "docs:clean": "rimraf docs/public", "docs:hugo": "cd docs && hugo", - "docs": "npm run docs:hugo && npm run apidocs:core && npm run apidocs:snazzy", + "docs": "npm run docs:hugo && npm run apidocs:core && npm run apidocs:snazzy && npm run apidocs:jsmarkerclusterer", "apidocs:core": "compodoc -p packages/core/tsconfig.compodoc.json --name @agm/core --output docs/public/api-docs/agm-core/ --disablePrivateOrInternalSupport --hideGenerator --disableCoverage", - "apidocs:snazzy": "compodoc -p packages/snazzy-info-window/tsconfig.compodoc.json --name @agm/snazzy-info-window --output docs/public/api-docs/agm-snazzy-info-window/ --disablePrivateOrInternalSupport --hideGenerator --disableCoverage" + "apidocs:snazzy": "compodoc -p packages/snazzy-info-window/tsconfig.compodoc.json --name @agm/snazzy-info-window --output docs/public/api-docs/agm-snazzy-info-window/ --disablePrivateOrInternalSupport --hideGenerator --disableCoverage", + "apidocs:jsmarkerclusterer": "compodoc -p packages/js-marker-clusterer/tsconfig.compodoc.json --name @agm/js-marker-clusterer --output docs/public/api-docs/js-marker-clusterer/ --disablePrivateOrInternalSupport --hideGenerator --disableCoverage" }, "author": "Sebastian Müller ", "license": "MIT", @@ -73,6 +75,7 @@ "html-webpack-plugin": "^2.8.1", "istanbul-instrumenter-loader": "^2.0.0", "jasmine-core": "2.5.0", + "js-marker-clusterer": "^1.0.0", "karma": "^1.3.0", "karma-chrome-launcher": "2.0.0", "karma-coverage": "^1.1.1", diff --git a/packages/core/services/google-maps-api-wrapper.ts b/packages/core/services/google-maps-api-wrapper.ts index 7a611859a..006cd82e6 100644 --- a/packages/core/services/google-maps-api-wrapper.ts +++ b/packages/core/services/google-maps-api-wrapper.ts @@ -39,10 +39,12 @@ export class GoogleMapsAPIWrapper { /** * Creates a google map marker with the map context */ - createMarker(options: mapTypes.MarkerOptions = {}): + createMarker(options: mapTypes.MarkerOptions = {}, addToMap: boolean = true): Promise { return this._map.then((map: mapTypes.GoogleMap) => { - options.map = map; + if (addToMap) { + options.map = map; + } return new google.maps.Marker(options); }); } diff --git a/packages/core/services/managers/marker-manager.ts b/packages/core/services/managers/marker-manager.ts index 518ce79d7..73f307cf8 100644 --- a/packages/core/services/managers/marker-manager.ts +++ b/packages/core/services/managers/marker-manager.ts @@ -9,10 +9,10 @@ import {Marker} from './../google-maps-types'; @Injectable() export class MarkerManager { - private _markers: Map> = + protected _markers: Map> = new Map>(); - constructor(private _mapsWrapper: GoogleMapsAPIWrapper, private _zone: NgZone) {} + constructor(protected _mapsWrapper: GoogleMapsAPIWrapper, protected _zone: NgZone) {} deleteMarker(marker: AgmMarker): Promise { const m = this._markers.get(marker); diff --git a/packages/js-marker-clusterer/directives.ts b/packages/js-marker-clusterer/directives.ts new file mode 100644 index 000000000..48e722f95 --- /dev/null +++ b/packages/js-marker-clusterer/directives.ts @@ -0,0 +1 @@ +export {AgmMarkerCluster} from './directives/marker-cluster'; diff --git a/packages/js-marker-clusterer/directives/marker-cluster.ts b/packages/js-marker-clusterer/directives/marker-cluster.ts new file mode 100644 index 000000000..216626f9a --- /dev/null +++ b/packages/js-marker-clusterer/directives/marker-cluster.ts @@ -0,0 +1,124 @@ +import {Directive, Input, OnDestroy, OnChanges, OnInit, SimpleChange} from '@angular/core'; + +import {ClusterManager} from '../services/managers/cluster-manager'; +import {MarkerManager} from '@agm/core'; + +import {ClusterOptions, ClusterStyle} from '../services/google-clusterer-types'; + +/** + * AgmMarkerCluster clusters map marker if they are near together + * + * ### Example + * ```typescript + * import { Component } from '@angular/core'; + * + * @Component({ + * selector: 'my-map-cmp', + * styles: [` + * agm-map { + * height: 300px; + * } + * `], + * template: ` + * + * + * + * + * + * + * + * + * ` + * }) + * ``` + */ +@Directive({ + selector: 'agm-marker-cluster', + providers: [ClusterManager, {provide: MarkerManager, useExisting: ClusterManager}] +}) +export class AgmMarkerCluster implements OnDestroy, OnChanges, OnInit, ClusterOptions { + /** + * The grid size of a cluster in pixels + */ + @Input() gridSize: number; + + /** + * The maximum zoom level that a marker can be part of a cluster. + */ + @Input() maxZoom: number; + + /** + * Whether the default behaviour of clicking on a cluster is to zoom into it. + */ + @Input() zoomOnClick: boolean; + + /** + * Whether the center of each cluster should be the average of all markers in the cluster. + */ + @Input() averageCenter: boolean; + + /** + * The minimum number of markers to be in a cluster before the markers are hidden and a count is shown. + */ + @Input() minimumClusterSize: number; + + /** + * An object that has style properties. + */ + @Input() styles: ClusterStyle; + + @Input() imagePath: string; + @Input() imageExtension: string; + + constructor(private _clusterManager: ClusterManager) {} + + /** @internal */ + ngOnDestroy() { + this._clusterManager.clearMarkers(); + } + + /** @internal */ + ngOnChanges(changes: {[key: string]: SimpleChange }) { + if (changes['gridSize']) { + this._clusterManager.setGridSize(this); + } + if (changes['maxZoom']) { + this._clusterManager.setMaxZoom(this); + } + if (changes['styles']) { + this._clusterManager.setStyles(this); + } + if (changes['zoomOnClick']) { + this._clusterManager.setZoomOnClick(this); + } + if (changes['averageCenter']) { + this._clusterManager.setAverageCenter(this); + } + if (changes['minimumClusterSize']) { + this._clusterManager.setMinimumClusterSize(this); + } + if (changes['styles']) { + this._clusterManager.setStyles(this); + } + if (changes['imagePath']) { + this._clusterManager.setImagePath(this); + } + if (changes['imageExtension']) { + this._clusterManager.setImageExtension(this); + } + } + + /** @internal */ + ngOnInit() { + this._clusterManager.init({ + gridSize: this.gridSize, + maxZoom: this.maxZoom, + zoomOnClick: this.zoomOnClick, + averageCenter: this.averageCenter, + minimumClusterSize: this.minimumClusterSize, + styles: this.styles, + imagePath: this.imagePath, + imageExtension: this.imageExtension, + }); + } +} diff --git a/packages/js-marker-clusterer/index.ts b/packages/js-marker-clusterer/index.ts new file mode 100644 index 000000000..13ad9ab75 --- /dev/null +++ b/packages/js-marker-clusterer/index.ts @@ -0,0 +1,7 @@ +// main modules +export * from './directives'; +export * from './services'; + +// we explicitly export the module here to prevent this Ionic 2 bug: +// http://stevemichelotti.com/integrate-angular-2-google-maps-into-ionic-2/ +export { AgmJsMarkerClustererModule } from './js-marker-clusterer.module'; diff --git a/packages/js-marker-clusterer/js-marker-clusterer.module.ts b/packages/js-marker-clusterer/js-marker-clusterer.module.ts new file mode 100644 index 000000000..f6efcbfd6 --- /dev/null +++ b/packages/js-marker-clusterer/js-marker-clusterer.module.ts @@ -0,0 +1,11 @@ +import {NgModule} from '@angular/core'; +import {AgmCoreModule} from '@agm/core'; +import {AgmMarkerCluster} from './directives/marker-cluster'; + +@NgModule({ + imports: [AgmCoreModule], + declarations: [AgmMarkerCluster], + exports: [AgmMarkerCluster] +}) +export class AgmJsMarkerClustererModule { +} diff --git a/packages/js-marker-clusterer/package.json b/packages/js-marker-clusterer/package.json new file mode 100644 index 000000000..9b6d89df1 --- /dev/null +++ b/packages/js-marker-clusterer/package.json @@ -0,0 +1,6 @@ +{ + "name": "@agm/clusterer-src", + "dependencies": { + "@agm/core": "file:../core" + } +} diff --git a/packages/js-marker-clusterer/package.tpl.json b/packages/js-marker-clusterer/package.tpl.json new file mode 100644 index 000000000..720371ce2 --- /dev/null +++ b/packages/js-marker-clusterer/package.tpl.json @@ -0,0 +1,28 @@ +{ + "name": "@agm/js-marker-clusterer", + "version": "INSERT_HERE_VIA_BUILD_PROCESS", + "private": true, + "description": "Angular Google Maps (AGM) extension for js-marker-clusterer support", + "repository": { + "type": "git", + "url": "git+https://github.com/SebastianM/angular-google-maps.git" + }, + "keywords": [ + "angular-google-maps", + "angular", + "js-marker-clusterer", + "google-maps", + "agm" + ], + "author": "Jens Fahnenbruck ", + "license": "MIT", + "bugs": { + "url": "https://github.com/SebastianM/angular-google-maps/issues" + }, + "peerDependencies": { + "@angular/core": "^4.0.0", + "@agm/core": "^1.0.0-beta.0", + "js-marker-clusterer": "^1.0.0" + }, + "homepage": "https://github.com/SebastianM/angular-google-maps#readme" +} diff --git a/packages/js-marker-clusterer/services.ts b/packages/js-marker-clusterer/services.ts new file mode 100644 index 000000000..06f16a130 --- /dev/null +++ b/packages/js-marker-clusterer/services.ts @@ -0,0 +1 @@ +export {ClusterManager} from './services/managers/cluster-manager'; diff --git a/packages/js-marker-clusterer/services/google-clusterer-types.ts b/packages/js-marker-clusterer/services/google-clusterer-types.ts new file mode 100644 index 000000000..2416bc8d8 --- /dev/null +++ b/packages/js-marker-clusterer/services/google-clusterer-types.ts @@ -0,0 +1,114 @@ +import {Marker, GoogleMap, LatLngBounds} from '@agm/core/services/google-maps-types'; + +export interface CalculatorResult { + text: string; + index: number; +} + +export type CalculateFunction = (marker: Marker[], count: number) => CalculatorResult; + +export interface MarkerClustererInstance { + zoomOnClick_: boolean; + averageCenter_: boolean; + imagePath_: string; + minimumClusterSize_: number; + imageExtension_: string; + new(map: GoogleMap, marker: Marker[], options: ClusterOptions): MarkerClustererInstance; + addMarker(marker: Marker, noDraw?: boolean): void; + addMarkers(markers: Marker[], noDraw?: boolean): void; + clearMarkers(): void; + getCalculator(): CalculateFunction; + getExtendedBounds(bounds: LatLngBounds): LatLngBounds; + getGridSize(): number; + getMap(): GoogleMap; + getMarkers(): Marker[]; + getStyles(): ClusterStyle; + getTotalClusters(): number; + getTotalMarkers(): Marker[]; + isZoomOnClick(): boolean; + redraw(): void; + removeMarker(marker: Marker): boolean; + resetViewport(): void; + setCalculator(calculator: CalculateFunction): void; + setGridSize(size: number): void; + setMap(map: GoogleMap): void; + setMaxZoom(maxZoom: number): void; + setStyles(styles: ClusterStyle): void; +} + +export interface ClusterOptions { + /** + * The grid size of a cluster in pixels. + */ + gridSize?: number; + + /** + * The maximum zoom level that a marker can be part of a cluster. + */ + maxZoom?: number; + + /** + * Whether the default behaviour of clicking on a cluster is to zoom into it. + */ + zoomOnClick?: boolean; + + /** + * Whether the center of each cluster should be the average of all markers in the cluster. + */ + averageCenter?: boolean; + + /** + * The minimum number of markers to be in a cluster before the markers are hidden and a count is shown. + */ + minimumClusterSize?: number; + + /** + * An object that has style properties. + */ + styles?: ClusterStyle; + + imagePath?: string; + imageExtension?: string; +} + +export interface ClusterStyle { + /** + * The image url. + */ + url?: string; + + /** + * The image height. + */ + height?: number; + + /** + * The image width. + */ + width?: number; + + /** + * The anchor position of the label text. + */ + anchor?: [number, number]; + + /** + * The text color. + */ + textColor?: string; + + /** + * The text size. + */ + textSize?: number; + + /** + * The position of the backgound x, y. + */ + backgroundPosition?: string; + + /** + * The anchor position of the icon x, y. + */ + iconAnchor?: [number, number]; +} diff --git a/packages/js-marker-clusterer/services/managers/cluster-manager.spec.ts b/packages/js-marker-clusterer/services/managers/cluster-manager.spec.ts new file mode 100644 index 000000000..b44e31717 --- /dev/null +++ b/packages/js-marker-clusterer/services/managers/cluster-manager.spec.ts @@ -0,0 +1,196 @@ +import {NgZone} from '@angular/core'; +import {TestBed, async, inject} from '@angular/core/testing'; + +import {AgmMarker} from '../../../core/directives/marker'; +import {GoogleMapsAPIWrapper} from '../../../core/services/google-maps-api-wrapper'; +import {Marker} from '../../../core/services/google-maps-types'; +import {ClusterManager} from './cluster-manager'; + +describe('ClusterManager', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + {provide: NgZone, useFactory: () => new NgZone({enableLongStackTrace: true})}, + ClusterManager, { + provide: GoogleMapsAPIWrapper, + useValue: jasmine.createSpyObj('GoogleMapsAPIWrapper', ['createMarker']) + } + ] + }); + }); + + describe('Create a new marker', () => { + it('should call the mapsApiWrapper when creating a new marker', + inject( + [ClusterManager, GoogleMapsAPIWrapper], + (clusterManager: ClusterManager, apiWrapper: GoogleMapsAPIWrapper) => { + const newMarker = new AgmMarker(clusterManager); + newMarker.latitude = 34.4; + newMarker.longitude = 22.3; + newMarker.label = 'A'; + clusterManager.addMarker(newMarker); + + expect(apiWrapper.createMarker).toHaveBeenCalledWith({ + position: {lat: 34.4, lng: 22.3}, + label: 'A', + draggable: false, + icon: undefined, + opacity: 1, + visible: true, + zIndex: 1, + title: undefined, + clickable: true + }, false); + })); + }); + + describe('Delete a marker', () => { + it('should set the map to null when deleting a existing marker', + inject( + [ClusterManager, GoogleMapsAPIWrapper], + (clusterManager: ClusterManager, apiWrapper: GoogleMapsAPIWrapper) => { + const newMarker = new AgmMarker(clusterManager); + newMarker.latitude = 34.4; + newMarker.longitude = 22.3; + newMarker.label = 'A'; + + const markerInstance: Marker = jasmine.createSpyObj('Marker', ['setMap']); + (apiWrapper.createMarker).and.returnValue(Promise.resolve(markerInstance)); + + clusterManager.addMarker(newMarker); + clusterManager.deleteMarker(newMarker).then( + () => { expect(markerInstance.setMap).toHaveBeenCalledWith(null); }); + })); + }); + + describe('set marker icon', () => { + it('should update that marker via setIcon method when the markerUrl changes', + async(inject( + [ClusterManager, GoogleMapsAPIWrapper], + (markerManager: ClusterManager, apiWrapper: GoogleMapsAPIWrapper) => { + const newMarker = new AgmMarker(markerManager); + newMarker.latitude = 34.4; + newMarker.longitude = 22.3; + newMarker.label = 'A'; + + const markerInstance: Marker = jasmine.createSpyObj('Marker', ['setMap', 'setIcon']); + (apiWrapper.createMarker).and.returnValue(Promise.resolve(markerInstance)); + + markerManager.addMarker(newMarker); + expect(apiWrapper.createMarker).toHaveBeenCalledWith({ + position: {lat: 34.4, lng: 22.3}, + label: 'A', + draggable: false, + icon: undefined, + opacity: 1, + visible: true, + zIndex: 1, + title: undefined, + clickable: true + }, false); + const iconUrl = 'http://angular-maps.com/icon.png'; + newMarker.iconUrl = iconUrl; + return markerManager.updateIcon(newMarker).then( + () => { expect(markerInstance.setIcon).toHaveBeenCalledWith(iconUrl); }); + }))); + }); + + describe('set marker opacity', () => { + it('should update that marker via setOpacity method when the markerOpacity changes', + async(inject( + [ClusterManager, GoogleMapsAPIWrapper], + (markerManager: ClusterManager, apiWrapper: GoogleMapsAPIWrapper) => { + const newMarker = new AgmMarker(markerManager); + newMarker.latitude = 34.4; + newMarker.longitude = 22.3; + newMarker.label = 'A'; + + const markerInstance: Marker = + jasmine.createSpyObj('Marker', ['setMap', 'setOpacity']); + (apiWrapper.createMarker).and.returnValue(Promise.resolve(markerInstance)); + + markerManager.addMarker(newMarker); + expect(apiWrapper.createMarker).toHaveBeenCalledWith({ + position: {lat: 34.4, lng: 22.3}, + label: 'A', + draggable: false, + icon: undefined, + visible: true, + opacity: 1, + zIndex: 1, + title: undefined, + clickable: true + }, false); + const opacity = 0.4; + newMarker.opacity = opacity; + return markerManager.updateOpacity(newMarker).then( + () => { expect(markerInstance.setOpacity).toHaveBeenCalledWith(opacity); }); + }))); + }); + + describe('set visible option', () => { + it('should update that marker via setVisible method when the visible changes', + async(inject( + [ClusterManager, GoogleMapsAPIWrapper], + (markerManager: ClusterManager, apiWrapper: GoogleMapsAPIWrapper) => { + const newMarker = new AgmMarker(markerManager); + newMarker.latitude = 34.4; + newMarker.longitude = 22.3; + newMarker.label = 'A'; + newMarker.visible = false; + + const markerInstance: Marker = + jasmine.createSpyObj('Marker', ['setMap', 'setVisible']); + (apiWrapper.createMarker).and.returnValue(Promise.resolve(markerInstance)); + + markerManager.addMarker(newMarker); + expect(apiWrapper.createMarker).toHaveBeenCalledWith({ + position: {lat: 34.4, lng: 22.3}, + label: 'A', + draggable: false, + icon: undefined, + visible: false, + opacity: 1, + zIndex: 1, + title: undefined, + clickable: true + }, false); + newMarker.visible = true; + return markerManager.updateVisible(newMarker).then( + () => { expect(markerInstance.setVisible).toHaveBeenCalledWith(true); }); + }))); + }); + + describe('set zIndex option', () => { + it('should update that marker via setZIndex method when the zIndex changes', + async(inject( + [ClusterManager, GoogleMapsAPIWrapper], + (markerManager: ClusterManager, apiWrapper: GoogleMapsAPIWrapper) => { + const newMarker = new AgmMarker(markerManager); + newMarker.latitude = 34.4; + newMarker.longitude = 22.3; + newMarker.label = 'A'; + newMarker.visible = false; + + const markerInstance: Marker = jasmine.createSpyObj('Marker', ['setMap', 'setZIndex']); + (apiWrapper.createMarker).and.returnValue(Promise.resolve(markerInstance)); + + markerManager.addMarker(newMarker); + expect(apiWrapper.createMarker).toHaveBeenCalledWith({ + position: {lat: 34.4, lng: 22.3}, + label: 'A', + draggable: false, + icon: undefined, + visible: false, + opacity: 1, + zIndex: 1, + title: undefined, + clickable: true + }, false); + const zIndex = 10; + newMarker.zIndex = zIndex; + return markerManager.updateZIndex(newMarker).then( + () => { expect(markerInstance.setZIndex).toHaveBeenCalledWith(zIndex); }); + }))); + }); +}); diff --git a/packages/js-marker-clusterer/services/managers/cluster-manager.ts b/packages/js-marker-clusterer/services/managers/cluster-manager.ts new file mode 100644 index 000000000..f98ae685b --- /dev/null +++ b/packages/js-marker-clusterer/services/managers/cluster-manager.ts @@ -0,0 +1,138 @@ +import {Injectable, NgZone} from '@angular/core'; + +import 'js-marker-clusterer'; + +import {MarkerManager} from '../../../core/services/managers/marker-manager'; +import {GoogleMapsAPIWrapper} from '../../../core/services/google-maps-api-wrapper'; +import {AgmMarker} from '../../../core/directives/marker'; +import {AgmMarkerCluster} from './../../directives/marker-cluster'; +import {Marker} from '@agm/core/services/google-maps-types'; +import {MarkerClustererInstance, ClusterOptions} from '../google-clusterer-types'; + +declare var MarkerClusterer: any; + +@Injectable() +export class ClusterManager extends MarkerManager { + private _clustererInstance: Promise; + private _resolver: Function; + + constructor(protected _mapsWrapper: GoogleMapsAPIWrapper, protected _zone: NgZone) { + super(_mapsWrapper, _zone); + this._clustererInstance = new Promise((resolver) => { + this._resolver = resolver; + }); + } + + init(options: ClusterOptions): void { + this._mapsWrapper.getNativeMap().then(map => { + const clusterer = new MarkerClusterer(map, [], options); + this._resolver(clusterer); + }); + } + + addMarker(marker: AgmMarker): void { + const clusterPromise: Promise = this._clustererInstance; + const markerPromise = this._mapsWrapper + .createMarker({ + position: { + lat: marker.latitude, + lng: marker.longitude + }, + label: marker.label, + draggable: marker.draggable, + icon: marker.iconUrl, + opacity: marker.opacity, + visible: marker.visible, + zIndex: marker.zIndex, + title: marker.title, + clickable: marker.clickable, + }, false); + + Promise + .all([clusterPromise, markerPromise]) + .then(([cluster, marker]) => { + return cluster.addMarker(marker); + }); + this._markers.set(marker, markerPromise); + } + + deleteMarker(marker: AgmMarker): Promise { + const m = this._markers.get(marker); + if (m == null) { + // marker already deleted + return Promise.resolve(); + } + return m.then((m: Marker) => { + this._zone.run(() => { + this._clustererInstance.then(cluster => { + cluster.removeMarker(m); + this._markers.delete(marker); + }); + }); + }); + } + + clearMarkers(): Promise { + return this._clustererInstance.then(cluster => { + cluster.clearMarkers(); + }); + } + + setGridSize(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + cluster.setGridSize(c.gridSize); + }); + } + + setMaxZoom(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + cluster.setMaxZoom(c.maxZoom); + }); + } + + setStyles(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + cluster.setStyles(c.styles); + }); + } + + setZoomOnClick(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + if (c.zoomOnClick !== undefined) { + cluster.zoomOnClick_ = c.zoomOnClick; + } + }); + } + + setAverageCenter(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + if (c.averageCenter !== undefined) { + cluster.averageCenter_ = c.averageCenter; + } + }); + } + + setImagePath(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + if (c.imagePath !== undefined) { + cluster.imagePath_ = c.imagePath; + } + }); + } + + setMinimumClusterSize(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + if (c.minimumClusterSize !== undefined) { + cluster.minimumClusterSize_ = c.minimumClusterSize; + } + }); + } + + setImageExtension(c: AgmMarkerCluster): void { + this._clustererInstance.then(cluster => { + if (c.imageExtension !== undefined) { + cluster.imageExtension_ = c.imageExtension; + } + }); + } +} diff --git a/rollup.core.config.js b/rollup.core.config.js index 9426e3dea..ca248e866 100644 --- a/rollup.core.config.js +++ b/rollup.core.config.js @@ -10,6 +10,7 @@ export default { '@angular/compiler': 'ng.compiler', '@angular/platform-browser': 'ng.platformBrowser', '@angular/platform-browser-dynamic': 'ng.platformBrowserDynamic', + 'js-marker-clusterer': 'MarkerClusterer', 'rxjs/Subject': 'Rx', 'rxjs/observable/PromiseObservable': 'Rx', 'rxjs/operator/toPromise': 'Rx.Observable.prototype', @@ -17,5 +18,5 @@ export default { 'rxjs/Rx': 'Rx' }, context: 'window', - external: ['rxjs', '@angular/core', 'rxjs/Observable'] + external: ['rxjs', '@angular/core', 'rxjs/Observable', 'js-marker-clusterer'] } diff --git a/rollup.js-marker-clusterer.config.js b/rollup.js-marker-clusterer.config.js new file mode 100644 index 000000000..5ef373813 --- /dev/null +++ b/rollup.js-marker-clusterer.config.js @@ -0,0 +1,22 @@ +export default { + entry: 'dist/js-marker-clusterer/index.js', + dest: 'dist/js-marker-clusterer/js-marker-clusterer.umd.js', + format: 'umd', + moduleName: 'ngmaps.jsMarkerClusterer', + sourceMap: true, + globals: { + '@angular/core': 'ng.core', + '@angular/common': 'ng.common', + '@angular/compiler': 'ng.compiler', + '@angular/platform-browser': 'ng.platformBrowser', + '@angular/platform-browser-dynamic': 'ng.platformBrowserDynamic', + 'rxjs/Subject': 'Rx', + 'rxjs/observable/PromiseObservable': 'Rx', + 'rxjs/operator/toPromise': 'Rx.Observable.prototype', + 'rxjs/Observable': 'Rx', + 'rxjs/Rx': 'Rx', + '@agm/core': 'ngmaps.core' + }, + context: 'window', + external: ['rxjs', '@angular/core', 'rxjs/Observable', '@agm/core', 'js-marker-clusterer'] +} diff --git a/scripts/create-package-json.js b/scripts/create-package-json.js index db91682f4..af8240e02 100644 --- a/scripts/create-package-json.js +++ b/scripts/create-package-json.js @@ -5,6 +5,8 @@ const fs = require('fs'); const path = require('path'); const packages = require('./packages'); +const rootPkgJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')); + packages.forEach(function(pkgName) { let basePkgJson; if (fs.existsSync(`./packages/${pkgName}/package.tpl.json`)) { @@ -16,6 +18,9 @@ packages.forEach(function(pkgName) { // define the package name basePkgJson.name = `@agm/${pkgName}` + // update version + basePkgJson.version = rootPkgJson.version; + // remove scripts delete basePkgJson.scripts; diff --git a/scripts/packages.js b/scripts/packages.js index ba4b5a1f3..1bc4a296c 100644 --- a/scripts/packages.js +++ b/scripts/packages.js @@ -1,7 +1,8 @@ // NPM packages (without the org name) that we publish const packages = [ 'core', - 'snazzy-info-window' + 'snazzy-info-window', + 'js-marker-clusterer', ]; -module.exports = packages; \ No newline at end of file +module.exports = packages; diff --git a/yarn.lock b/yarn.lock index 12c21a31d..b151cc7bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,6 +47,47 @@ dependencies: tsickle "^0.21.0" +"@compodoc/compodoc@^1.0.0-beta.9": + version "1.0.0-beta.14" + resolved "https://registry.yarnpkg.com/@compodoc/compodoc/-/compodoc-1.0.0-beta.14.tgz#66f0682eacdf85b1ef4bf6ac780794bd352650f8" + dependencies: + "@compodoc/ngd-core" "^2.0.0-alpha.1" + "@compodoc/ngd-transformer" "^2.0.0-alpha.3" + cheerio "^1.0.0-rc.2" + chokidar "^1.7.0" + colors "^1.1.2" + commander "2.11.0" + findit "^2.0.0" + fs-extra "^4.0.0" + glob "^7.1.2" + gulp-util "^3.0.8" + handlebars "^4.0.10" + html-entities "^1.2.1" + json5 "^0.5.1" + live-server "1.1.0" + lodash "^4.17.3" + lunr "1.0.0" + marked "^0.3.6" + os-name "^2.0.1" + shelljs "^0.7.8" + typescript "2.4.2" + +"@compodoc/ngd-core@2.0.0-alpha.1", "@compodoc/ngd-core@^2.0.0-alpha.1": + version "2.0.0-alpha.1" + resolved "https://registry.yarnpkg.com/@compodoc/ngd-core/-/ngd-core-2.0.0-alpha.1.tgz#2f4f9df10ccf24c208e2babaae0b438cb72fdb77" + dependencies: + gulp-util "^3.0.7" + +"@compodoc/ngd-transformer@^2.0.0-alpha.3": + version "2.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/@compodoc/ngd-transformer/-/ngd-transformer-2.0.0-alpha.3.tgz#87f6e3f4169ae1b2f8ef6e5ad960062bbdfca98f" + dependencies: + "@compodoc/ngd-core" "2.0.0-alpha.1" + dot "^1.1.1" + fs-extra "^2.0.0" + q "^1.4.1" + viz.js "^1.6.0" + "@ngtools/webpack@1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.3.0.tgz#a1071230985358ecdf87b2fa9879ae6cc6355e83" @@ -75,7 +116,7 @@ abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -accepts@1.3.3: +accepts@1.3.3, accepts@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" dependencies: @@ -115,6 +156,13 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" +ambi@^2.2.0, ambi@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" + dependencies: + editions "^1.1.1" + typechecker "^4.3.0" + amdefine@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" @@ -150,6 +198,16 @@ anymatch@^1.3.0: arrify "^1.0.0" micromatch "^2.1.5" +apache-crypt@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/apache-crypt/-/apache-crypt-1.1.2.tgz#820782a33bb6a5fd2712082f0ed3a24e3c9b0214" + dependencies: + unix-crypt-td-js "^1.0.0" + +apache-md5@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/apache-md5/-/apache-md5-1.0.6.tgz#470239d40c54e7c32dd9d6eb11bc3578ecc903c2" + app-root-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" @@ -360,6 +418,10 @@ balanced-match@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" @@ -372,6 +434,14 @@ base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" +basic-auth@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -462,6 +532,13 @@ brace-expansion@^1.0.0: balanced-match "^0.4.1" concat-map "0.0.1" +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@^0.1.2: version "0.1.5" resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" @@ -618,6 +695,17 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + chokidar@^1.4.1, chokidar@^1.4.3: version "1.6.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" @@ -633,6 +721,21 @@ chokidar@^1.4.1, chokidar@^1.4.3: optionalDependencies: fsevents "^1.0.0" +chokidar@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" @@ -702,7 +805,11 @@ codelyzer@3.0.0-beta.4: source-map "^0.5.6" sprintf-js "^1.0.3" -colors@^1.1.0, colors@^1.1.2: +coffee-script@^1.12.5: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + +colors@^1.1.0, colors@^1.1.2, colors@latest: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -718,6 +825,10 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + commander@2.9.x: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" @@ -762,6 +873,15 @@ configstore@^3.0.0: write-file-atomic "^1.1.2" xdg-basedir "^3.0.0" +connect@3.4.x: + version "3.4.1" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.4.1.tgz#a21361d3f4099ef761cda6dc4a973bb1ebb0a34d" + dependencies: + debug "~2.2.0" + finalhandler "0.4.1" + parseurl "~1.3.1" + utils-merge "1.0.0" + connect@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.0.tgz#f09a4f7dcd17324b663b725c815bdb1c4158a46e" @@ -953,6 +1073,13 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cors@latest: + version "2.8.4" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" + dependencies: + object-assign "^4" + vary "^1" + create-ecdh@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" @@ -1014,7 +1141,13 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" -css-select@^1.1.0: +csextends@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.1.1.tgz#cc53c1349faf7f0ae6cdf6f6c4a4d9156d3c4ec1" + dependencies: + coffee-script "^1.12.5" + +css-select@^1.1.0, css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" dependencies: @@ -1078,7 +1211,11 @@ dateformat@^1.0.11, dateformat@^1.0.12, dateformat@^1.0.6: get-stdin "^4.0.1" meow "^3.3.0" -debug@2.2.0: +dateformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + +debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1096,6 +1233,12 @@ debug@2.6.1, debug@^2.2.0: dependencies: ms "0.7.2" +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1127,6 +1270,10 @@ depd@1.1.0, depd@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +depd@1.1.1, depd@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -1134,6 +1281,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -1171,7 +1322,7 @@ dom-serialize@^2.2.0: extend "^3.0.0" void-elements "^2.0.0" -dom-serializer@0: +dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" dependencies: @@ -1182,7 +1333,7 @@ domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" -domelementtype@1: +domelementtype@1, domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" @@ -1196,13 +1347,19 @@ domhandler@2.1: dependencies: domelementtype "1" +domhandler@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" + dependencies: + domelementtype "1" + domutils@1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" dependencies: domelementtype "1" -domutils@1.5.1: +domutils@1.5.1, domutils@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" dependencies: @@ -1221,6 +1378,10 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dot@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/dot/-/dot-1.1.2.tgz#c7377019fc4e550798928b2b9afeb66abfa1f2f9" + duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" @@ -1231,12 +1392,27 @@ duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +eachr@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eachr/-/eachr-3.2.0.tgz#2c35e43ea086516f7997cf80b7aa64d55a4a4484" + dependencies: + editions "^1.1.1" + typechecker "^4.3.0" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" dependencies: jsbn "~0.1.0" +editions@^1.1.1, editions@^1.1.2, editions@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.3.tgz#0907101bdda20fac3cbe334c27cbd0688dc99a5b" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -1313,7 +1489,7 @@ ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" -entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -1364,6 +1540,22 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +event-stream@latest: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" @@ -1420,12 +1612,27 @@ extend@^3.0.0, extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" +extendr@^3.2.0, extendr@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/extendr/-/extendr-3.2.2.tgz#c6e46fe6d90b2e3e8812a6654bd6182cbf91cd06" + dependencies: + editions "^1.1.2" + typechecker "^4.3.0" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" dependencies: is-extglob "^1.0.0" +extract-opts@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-3.3.1.tgz#5abbedc98c0d5202e3278727f9192d7e086c6be1" + dependencies: + eachr "^3.2.0" + editions "^1.1.1" + typechecker "^4.3.0" + extract-text-webpack-plugin@^2.0.0-beta.4: version "2.1.0" resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.0.tgz#69315b885f876dbf96d3819f6a9f1cca7aebf159" @@ -1454,6 +1661,12 @@ fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" +faye-websocket@0.11.x: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" @@ -1475,6 +1688,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +finalhandler@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.1.tgz#85a17c6c59a94717d262d61230d4b0ebe3d4a14d" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + unpipe "~1.0.0" + finalhandler@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.0.tgz#b5691c2c0912092f18ac23e9416bde5cd7dc6755" @@ -1494,6 +1716,10 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +findit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findit/-/findit-2.0.0.tgz#6509f0126af4c178551cfa99394e032e13a4d56e" + findup-sync@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" @@ -1526,6 +1752,14 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + fs-access@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" @@ -1542,6 +1776,21 @@ fs-extra@^0.26.4: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + +fs-extra@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1693,6 +1942,17 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^9.0.0: version "9.17.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" @@ -1719,7 +1979,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@*, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1750,6 +2010,29 @@ gulp-util@3.0.7: through2 "^2.0.0" vinyl "^0.5.0" +gulp-util@^3.0.7, gulp-util@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + gulplog@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" @@ -1766,6 +2049,16 @@ handlebars@^4.0.1, handlebars@^4.0.2: optionalDependencies: uglify-js "^2.6" +handlebars@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -1842,6 +2135,10 @@ hosted-git-info@^2.1.4: version "2.4.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8" +html-entities@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + html-minifier@^3.2.3: version "3.4.2" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.4.2.tgz#31896baaf735c1d95f7a0b7291f9dc36c0720752" @@ -1866,6 +2163,17 @@ html-webpack-plugin@^2.8.1: pretty-error "^2.0.2" toposort "^1.0.0" +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + htmlparser2@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" @@ -1875,6 +2183,14 @@ htmlparser2@~3.3.0: domutils "1.1" readable-stream "1.0" +http-auth@2.4.x: + version "2.4.11" + resolved "https://registry.yarnpkg.com/http-auth/-/http-auth-2.4.11.tgz#61f024a6e0e7c48934944895c87a1395509c619b" + dependencies: + apache-crypt "1.1.2" + apache-md5 "1.0.6" + node-uuid "^1.4.7" + http-errors@~1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" @@ -1884,6 +2200,15 @@ http-errors@~1.6.1: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + http-proxy@^1.13.0: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" @@ -1911,6 +2236,17 @@ ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" +ignorefs@^1.0.0, ignorefs@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ignorefs/-/ignorefs-1.2.0.tgz#da59fb858976e4a5e43702ccd1f282fdbc9e5756" + dependencies: + editions "^1.3.3" + ignorepatterns "^1.1.0" + +ignorepatterns@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ignorepatterns/-/ignorepatterns-1.1.0.tgz#ac8f436f2239b5dfb66d5f0d3a904a87ac67cc5e" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2084,6 +2420,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-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -2183,6 +2523,10 @@ jodid25519@^1.0.0: dependencies: jsbn "~0.1.0" +js-marker-clusterer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/js-marker-clusterer/-/js-marker-clusterer-1.0.0.tgz#c94be85ae8896819e51c131f891dd2b55558dd17" + js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" @@ -2228,7 +2572,7 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -2238,6 +2582,12 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -2377,6 +2727,24 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +live-server@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/live-server/-/live-server-1.1.0.tgz#a69f0e6ca581e0391aa57941970e17c308dd4869" + dependencies: + colors latest + connect "3.4.x" + cors latest + event-stream latest + faye-websocket "0.11.x" + http-auth "2.4.x" + morgan "^1.6.1" + object-assign latest + opn latest + proxy-middleware latest + send latest + serve-index "^1.7.2" + watchr "2.6.x" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -2508,7 +2876,7 @@ lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -2559,6 +2927,14 @@ ltcdr@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ltcdr/-/ltcdr-2.2.1.tgz#5ab87ad1d4c1dab8e8c08bbf037ee0c1902287cf" +lunr@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-1.0.0.tgz#5c9276c92c91ac35a9241b5018d46723d92e2f5f" + +macos-release@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb" + magic-string@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.19.0.tgz#198948217254e3e0b93080e01146b7c73b2a06b2" @@ -2569,6 +2945,14 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -2624,13 +3008,13 @@ mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.15, mime-types@~2.1.7: version "2.1.15" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" dependencies: mime-db "~1.27.0" -mime@^1.3.4: +mime@1.3.4, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" @@ -2654,6 +3038,12 @@ minimatch@2.x: dependencies: brace-expansion "^1.0.0" +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -2672,6 +3062,16 @@ modify-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" +morgan@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687" + dependencies: + basic-auth "~1.1.0" + debug "2.6.8" + depd "~1.1.0" + on-finished "~2.3.0" + on-headers "~1.0.1" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -2680,6 +3080,10 @@ ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + multipipe@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" @@ -2758,6 +3162,10 @@ node-pre-gyp@^0.6.29: tar "^2.2.1" tar-pack "^3.4.0" +node-uuid@^1.4.7: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + noms@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" @@ -2832,7 +3240,7 @@ object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1, object-assign@latest: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2865,12 +3273,22 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + once@1.x, once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" +opn@latest: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + optimist@^0.6.1, optimist@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -2907,6 +3325,13 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-2.0.1.tgz#b9a386361c17ae3a21736ef0599405c9a8c5dc5e" + dependencies: + macos-release "^1.0.0" + win-release "^1.0.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3024,6 +3449,12 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + pbkdf2@^3.0.3: version "3.0.9" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693" @@ -3075,6 +3506,10 @@ process@^0.11.0: version "0.11.9" resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" +proxy-middleware@latest: + version "0.15.0" + resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.15.0.tgz#a3fdf1befb730f951965872ac2f6074c61477a56" + prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" @@ -3132,7 +3567,7 @@ randombytes@^2.0.0, randombytes@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" -range-parser@^1.0.3, range-parser@^1.2.0: +range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -3218,6 +3653,12 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -3412,6 +3853,27 @@ safe-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +safefs@^3.1.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/safefs/-/safefs-3.2.2.tgz#8170c1444d7038e08caea05a374fae2fa349e15c" + dependencies: + graceful-fs "*" + +safefs@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/safefs/-/safefs-4.1.0.tgz#f82aeb4bdd7ae51f653eb20f6728b3058c8d6445" + dependencies: + editions "^1.1.1" + graceful-fs "^4.1.4" + +scandirectory@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72" + dependencies: + ignorefs "^1.0.0" + safefs "^3.1.2" + taskgroup "^4.0.5" + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -3432,6 +3894,36 @@ semver@~4.3.3: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +send@latest: + version "0.15.4" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" + dependencies: + debug "2.6.8" + depd "~1.1.1" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.2" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-index@^1.7.2: + version "1.9.0" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.0.tgz#d2b280fc560d616ee81b48bf0fa82abed2485ce7" + dependencies: + accepts "~1.3.3" + batch "0.6.1" + debug "2.6.8" + escape-html "~1.0.3" + http-errors "~1.6.1" + mime-types "~2.1.15" + parseurl "~1.3.1" + 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" @@ -3454,6 +3946,14 @@ sha.js@^2.3.6: dependencies: inherits "^2.0.1" +shelljs@^0.7.8: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -3572,6 +4072,12 @@ split2@^2.0.0: dependencies: through2 "^2.0.2" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + split@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" @@ -3608,6 +4114,12 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + stream-http@^2.3.1: version "2.6.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.3.tgz#4c3ddbf9635968ea2cfd4e48d43de5def2625ac3" @@ -3706,6 +4218,22 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" +taskgroup@^4.0.5: + version "4.3.1" + resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a" + dependencies: + ambi "^2.2.0" + csextends "^1.0.3" + +taskgroup@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-5.0.1.tgz#08736c9b24683b1434774231eb4b73aa7c3f79b5" + dependencies: + ambi "^2.5.0" + eachr "^3.2.0" + editions "^1.1.1" + extendr "^3.2.0" + term-size@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" @@ -3730,7 +4258,7 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.2: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@X.X.X: +through@2, "through@>=2.2.7 <3", through@X.X.X, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -3856,6 +4384,16 @@ type-is@~1.6.14: media-typer "0.3.0" mime-types "~2.1.13" +typechecker@^4.3.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.4.1.tgz#f97b95f51b038417212d677d45a373ee7bced7e6" + dependencies: + editions "^1.3.3" + +typescript@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.2.tgz#f8395f85d459276067c988aa41837a8f82870844" + typescript@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.2.1.tgz#4862b662b988a4c8ff691cc7969622d24db76ae9" @@ -3887,6 +4425,14 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unix-crypt-td-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz#1c0824150481bc7a01d49e98f1ec668d82412f3b" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -3965,6 +4511,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" +vary@^1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + verror@1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" @@ -3979,6 +4529,10 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" +viz.js@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/viz.js/-/viz.js-1.8.0.tgz#e0cb5ad241368e35b1a6e960691eba454c24951f" + vlq@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.1.tgz#14439d711891e682535467f8587c5630e4222a6c" @@ -4001,6 +4555,19 @@ watchpack@^1.3.1: chokidar "^1.4.3" graceful-fs "^4.1.2" +watchr@2.6.x: + version "2.6.0" + resolved "https://registry.yarnpkg.com/watchr/-/watchr-2.6.0.tgz#e75c423b10be79267a0c3ef76e2ea104fe0267a5" + dependencies: + eachr "^3.2.0" + extendr "^3.2.2" + extract-opts "^3.3.1" + ignorefs "^1.1.1" + safefs "^4.1.0" + scandirectory "^2.5.0" + taskgroup "^5.0.1" + typechecker "^4.3.0" + webpack-dev-middleware@^1.0.11: version "1.10.1" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.1.tgz#c6b4cf428139cf1aefbe06a0c00fdb4f8da2f893" @@ -4024,9 +4591,9 @@ webpack-sources@^0.2.3: source-list-map "^1.1.1" source-map "~0.5.3" -webpack@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.2.tgz#7d521e6f0777a3a58985c69425263fdfe977b458" +webpack@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78" dependencies: acorn "^4.0.4" acorn-dynamic-import "^2.0.0" @@ -4049,6 +4616,16 @@ webpack@2.3.2: webpack-sources "^0.2.3" yargs "^6.0.0" +websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -4071,6 +4648,12 @@ widest-line@^1.0.0: dependencies: string-width "^1.0.1" +win-release@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" + dependencies: + semver "^5.0.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"