diff --git a/.npmignore b/.npmignore index e6c85bd11..1536bd696 100644 --- a/.npmignore +++ b/.npmignore @@ -12,12 +12,15 @@ yarn.lock .npmignore .travis.yml .eslint* +.vscode Gruntfile.js ISSUE_TEMPLATE.md PULL_REQUEST_TEMPLATE.md freelancer karma.conf.js protractor.conf.js +tsconfig.json +webpack.config.js ## From .gitignore: *.log diff --git a/Gruntfile.js b/Gruntfile.js index cfb546341..4c56e9c3b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -25,10 +25,10 @@ module.exports = function(grunt) { } } }, - cssmin: { dist: { options: { + sourceMap: false, keepSpecialComments: '*' }, files: { @@ -37,23 +37,21 @@ module.exports = function(grunt) { } } }, - copy: { dist: { files: { - 'dist/gridstack.js': ['src/gridstack.js'], - 'dist/gridstack.d.ts': ['src/gridstack.d.ts'], - 'dist/gridstack.all.d.ts': ['src/gridstack.d.ts'], - 'dist/gridstack.jQueryUI.js': ['src/gridstack.jQueryUI.js'], +/* 'dist/gridstack-poly.js': ['src/gridstack-poly.js'], 'dist/jquery.js': ['src/jquery.js'], 'dist/jquery-ui.js': ['src/jquery-ui.js'], 'dist/src/gridstack.scss': ['src/gridstack.scss'], 'dist/src/gridstack-extra.scss': ['src/gridstack-extra.scss'], +*/ } } }, + /* uglify: { options: { sourceMap: true, @@ -64,15 +62,13 @@ module.exports = function(grunt) { }, dist: { files: { - 'dist/gridstack.min.js': ['src/gridstack.js'], - 'dist/gridstack.jQueryUI.min.js': ['src/gridstack.jQueryUI.js'], - 'dist/gridstack-poly.min.js': ['src/gridstack-poly.js'], - 'dist/jquery.min.js': ['src/jquery.js'], - 'dist/jquery-ui.min.js': ['src/jquery-ui.js'], - 'dist/gridstack.all.js': ['src/gridstack-poly.js', 'src/jquery.js', 'src/gridstack.js', 'src/jquery-ui.js', 'src/gridstack.jQueryUI.js'] + //'dist/gridstack-poly.min.js': 'src/gridstack-poly.js', + //'dist/jquery.min.js': 'src/jquery.js', + //'dist/jquery-ui.min.js': 'src/jquery-ui.js' } } }, + */ eslint: { target: ['*.js', 'src/*.js'] @@ -87,7 +83,7 @@ module.exports = function(grunt) { }, styles: { files: ['src/*.scss'], - tasks: ['sass', 'cssmin'], + tasks: ['sass'/*, 'cssmin'*/], options: { }, } @@ -120,7 +116,7 @@ module.exports = function(grunt) { }); grunt.registerTask('lint', ['eslint']); - grunt.registerTask('default', ['sass', 'cssmin', 'eslint', 'copy', 'uglify']); + grunt.registerTask('default', ['sass', 'cssmin', /*'eslint',*/ 'copy', /*'uglify'*/]); grunt.registerTask('e2e-test', ['connect', 'protractor_webdriver', 'protractor']); }; /*eslint-enable camelcase */ \ No newline at end of file diff --git a/demo/float.html b/demo/float.html index dbc66085b..24629d493 100644 --- a/demo/float.html +++ b/demo/float.html @@ -7,10 +7,13 @@ Float grid demo + + diff --git a/doc/README.md b/doc/README.md index 68ec69085..417dcbc38 100644 --- a/doc/README.md +++ b/doc/README.md @@ -317,8 +317,8 @@ Parameters: Disables widgets moving/resizing. This is a shortcut for: ```js -grid.movable('.grid-stack-item', false); -grid.resizable('.grid-stack-item', false); +grid.enableMove(false); +grid.enableResize(false); ``` ### enable() @@ -326,24 +326,26 @@ grid.resizable('.grid-stack-item', false); Enables widgets moving/resizing. This is a shortcut for: ```js -grid.movable('.grid-stack-item', true); -grid.resizable('.grid-stack-item', true); +grid.enableMove(true); +grid.enableResize(true); ``` ### enableMove(doEnable, includeNewWidgets) -Enables/disables widget moving. `includeNewWidgets` will force new widgets to be draggable as per `doEnable`'s value by changing the `disableDrag` grid option. This is a shortcut for: +Enables/disables widget moving. `includeNewWidgets` will force new widgets to be draggable as per `doEnable`'s value by changing the `disableDrag` grid option (default: true). This is a shortcut for: ```js -grid.movable(this.container.children('.' + this.opts.itemClass), doEnable); +grid.movable('.grid-stack-item', doEnable); +grid.opts.disableDrag = !doEnable; ``` ### enableResize(doEnable, includeNewWidgets) -Enables/disables widget resizing. `includeNewWidgets` will force new widgets to be resizable as per `doEnable`'s value by changing the `disableResize` grid option. This is a shortcut for: +Enables/disables widget resizing. `includeNewWidgets` will force new widgets to be resizable as per `doEnable`'s value by changing the `disableResize` grid option (default: true). This is a shortcut for: ```js -grid.resizable(this.container.children('.' + this.opts.itemClass), doEnable); +grid.resizable('.grid-stack-item', doEnable); +grid.opts.disableResize = !doEnable; ``` ### float(val?) diff --git a/package.json b/package.json index cfadefcc4..e9cc5e73f 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,23 @@ { "name": "gridstack", - "version": "1.1.0-dev", - "description": "JavaScript / TypeScript for dashboard layout and creation, no external dependencies, with many wrappers (React, Angular, Ember, knockout...)", - "main": "dist/gridstack", + "version": "2.0.0-rc", + "description": "TypeScript/Javascript lib for dashboard layout and creation, no external dependencies, with many wrappers (React, Angular, Ember, knockout...)", + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", "repository": { "type": "git", "url": "git+https://github.com/gridstack/gridstack.js.git" }, "scripts": { - "build": "grunt && doctoc ./README.md && doctoc ./doc/README.md && doctoc ./doc/CHANGES.md", - "test": "grunt lint && karma start karma.conf.js", - "lint": "grunt lint", + "build": "yarn --no-progress && rm -rf dist/* && webpack && grunt && doctoc ./README.md && doctoc ./doc/README.md && doctoc ./doc/CHANGES.md", + "web": "rm -rf dist/* && webpack", + "test": "yarn lint && karma start karma.conf.js", + "lint": "tslint -p ./tsconfig.json", "reset": "rm -rf dist node_modules", "prepublishOnly": "yarn build" }, "keywords": [ - "JavaScript", + "Typescript", "gridstack.js", "grid", "gridster", @@ -27,7 +29,7 @@ "widgets", "Angular", "React", - "Typescript" + "JavaScript" ], "author": "Pavel Reznikov ", "contributors": [ @@ -41,6 +43,8 @@ "homepage": "http://gridstack.github.io/gridstack.js/", "dependencies": {}, "devDependencies": { + "@types/jquery": "^3.3.32", + "@types/jqueryui": "^1.12.10", "connect": "^3.7.0", "core-js": "^3.6.4", "coveralls": "^3.0.9", @@ -64,7 +68,11 @@ "karma-jasmine": "^3.1.1", "node-sass": "^4.13.1", "puppeteer": "^2.1.1", - "serve-static": "^1.14.1" + "serve-static": "^1.14.1", + "ts-loader": "^6.2.1", + "typescript": "3.4.5", + "webpack": "^4.42.0", + "webpack-cli": "^3.3.11" }, "resolutions": { "lodash": "^4.17.13", diff --git a/src/gridstack-dragdrop-plugin.ts b/src/gridstack-dragdrop-plugin.ts new file mode 100644 index 000000000..a2107f364 --- /dev/null +++ b/src/gridstack-dragdrop-plugin.ts @@ -0,0 +1,50 @@ +// gridstack-dragdrop-plugin.ts 2.0.0-rc @preserve + +/** + * https://gridstackjs.com/ + * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov + * gridstack.js may be freely distributed under the MIT license. +*/ + +import { GridStack } from './gridstack'; +import { GridStackElement } from './types'; + +/** drag&drop options currently called from the main code, but others can be passed in grid options */ +export type DDOpts = 'enable' | 'disable' | 'option' | {} | any; +export type DDKey = 'minWidth' | 'minHeight' | string; + +/** + * Base class for drag'n'drop plugin. + */ +export class GridStackDragDropPlugin { + protected grid: GridStack; + static registeredPlugins = []; + + static registerPlugin(pluginClass) { + GridStackDragDropPlugin.registeredPlugins.push(pluginClass); + }; + + public constructor(grid: GridStack) { + this.grid = grid; + } + + public resizable(el: GridStackElement, opts: DDOpts, key?: DDKey, value?): GridStackDragDropPlugin { + return this; + }; + + public draggable(el: GridStackElement, opts: DDOpts, key?: DDKey, value?): GridStackDragDropPlugin { + return this; + }; + + public droppable(el: GridStackElement, opts: DDOpts, key?: DDKey, value?): GridStackDragDropPlugin { + return this; + }; + + public isDroppable(el: GridStackElement): boolean { + return false; + }; + + public on(el: GridStackElement, eventName: string, callback): GridStackDragDropPlugin { + return this; + }; +} diff --git a/src/gridstack-engine.ts b/src/gridstack-engine.ts new file mode 100644 index 000000000..82eec0586 --- /dev/null +++ b/src/gridstack-engine.ts @@ -0,0 +1,593 @@ +// gridstack-engine.ts 2.0.0-rc @preserve + +/** + * https://gridstackjs.com/ + * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov + * gridstack.js may be freely distributed under the MIT license. +*/ + +import { Utils, obsolete } from './utils'; +import { GridStackNode } from './types'; + +export type onChangeCB = (nodes: GridStackNode[], detachNode?: boolean) => void; + +/** @internal class to store per column layout bare minimal info (subset of GridstackWidget) */ +interface layout { + x: number; + y: number; + width: number; + _id: number; // so we can find full node back +} + +/** + * Defines the GridStack engine that does most no DOM grid manipulation. + * See GridStack methods and vars for descriptions. + * + * NOTE: values should not be modified directly - call the main GridStack API instead + */ +export class GridStackEngine { + public column: number; + public maxRow: number; + public nodes: GridStackNode[]; + public onchange: onChangeCB; + public addedNodes: GridStackNode[] = []; + public removedNodes: GridStackNode[] = []; + public batchMode: boolean; + /** @internal */ + private _float: boolean; + /** @internal */ + private _prevFloat: boolean; + /** @internal */ + private _layouts?: layout[][]; // maps column # to array of values nodes + /** @internal */ + private _ignoreLayoutsNodeChange: boolean; + /** @internal */ + private static _idSeq = 1; + + public constructor(column?: number, onchange?: onChangeCB, float?: boolean, maxRow?: number, nodes?: GridStackNode[]) { + this.column = column || 12; + this._float = float || false; + this.maxRow = maxRow || 0; + this.nodes = nodes || []; + this.onchange = onchange || function () {}; + } + + public batchUpdate() { + if (this.batchMode) return; + this.batchMode = true; + this._prevFloat = this._float; + this._float = true; // let things go anywhere for now... commit() will restore and possibly reposition + }; + + public commit() { + if (!this.batchMode) return; + this.batchMode = false; + this._float = this._prevFloat; + delete this._prevFloat; + this._packNodes(); + this._notify(); + }; + + private _fixCollisions(node: GridStackNode) { + this._sortNodes(-1); + + let nn = node; + const hasLocked = Boolean(this.nodes.find(function(n) { return n.locked; })); + if (!this.float && !hasLocked) { + nn = {x: 0, y: node.y, width: this.column, height: node.height}; + } + while (true) { + const array1 = [5, 12, 8, 130, 44]; + const found = array1.find(element => element > 10); + + const collisionNode = this.nodes.find( n => n !== node && Utils.isIntercepted(n, nn), {node: node, nn: nn}); + if (!collisionNode) { return; } + this.moveNode(collisionNode, collisionNode.x, node.y + node.height, + collisionNode.width, collisionNode.height, true); + } + }; + + public isAreaEmpty(x: number, y: number, width: number, height: number) { + const nn = {x: x || 0, y: y || 0, width: width || 1, height: height || 1}; + const collisionNode = this.nodes.find(function(n) { + return Utils.isIntercepted(n, nn); + }); + return !collisionNode; + }; + + /** re-layout grid items to reclaim any empty space */ + public compact() { + if (this.nodes.length === 0) { return; } + this.batchUpdate(); + this._sortNodes(); + const copyNodes = this.nodes; + this.nodes = []; // pretend we have no nodes to conflict layout to start with... + copyNodes.forEach(node => { + if (!node.noMove && !node.locked) { + node.autoPosition = true; + } + this.addNode(node, false); // 'false' for add event trigger + node._dirty = true; // force attr update + }); + this.commit(); + } + + /** + * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) + */ + public set float(val: boolean) { + if (this._float === val) { return; } + this._float = val || false; + if (!val) { + this._packNodes(); + this._notify(); + } + } + + // getter method + public get float(): boolean { return this._float; } + + private _sortNodes(dir?: number) { + this.nodes = Utils.sort(this.nodes, dir, this.column); + }; + + private _packNodes() { + this._sortNodes(); + + if (this.float) { + this.nodes.forEach((n, i) => { + if (n._updating || n._packY === undefined || n.y === n._packY) { + return; + } + let newY = n.y; + while (newY >= n._packY) { + const box = {x: n.x, y: newY, width: n.width, height: n.height}; + const collisionNode = this.nodes + .slice(0, i) + .find(bn => Utils.isIntercepted(box, bn), {n: n, newY: newY}); + if (!collisionNode) { + n._dirty = true; + n.y = newY; + } + --newY; + } + }); + } else { + this.nodes.forEach((n, i) => { + if (n.locked) { return; } + while (n.y > 0) { + const newY = n.y - 1; + let canBeMoved = i === 0; + const box = {x: n.x, y: newY, width: n.width, height: n.height}; + if (i > 0) { + const collisionNode = this.nodes + .slice(0, i) + .find(bn => Utils.isIntercepted(box, bn), {n: n, newY: newY}); + canBeMoved = collisionNode === undefined; + } + + if (!canBeMoved) { break; } + // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions + // and move items back. The user 'change' CB should detect changes from the original + // starting position instead. + n._dirty = (n.y !== newY); + n.y = newY; + } + }); + } + }; + + public _prepareNode(node: GridStackNode, resizing?: boolean) { + node = node || {}; + // if we're missing position, have the grid position us automatically (before we set them to 0,0) + if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) { + node.autoPosition = true; + } + + // assign defaults for missing required fields + const defaults = {width: 1, height: 1, x: 0, y: 0}; + node = Utils.defaults(node, defaults); + + // convert any strings over + /* TODO: check + node.x = parseInt(node.x); + node.y = parseInt(node.y); + node.width = parseInt(node.width); + node.height = parseInt(node.height); + */ + node.autoPosition = node.autoPosition || false; + node.noResize = node.noResize || false; + node.noMove = node.noMove || false; + + // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #) + if (Number.isNaN(node.x)) { node.x = defaults.x; node.autoPosition = true; } + if (Number.isNaN(node.y)) { node.y = defaults.y; node.autoPosition = true; } + if (Number.isNaN(node.width)) { node.width = defaults.width; } + if (Number.isNaN(node.height)) { node.height = defaults.height; } + + if (node.width > this.column) { + node.width = this.column; + } else if (node.width < 1) { + node.width = 1; + } + + if (node.height < 1) { + node.height = 1; + } + + if (node.x < 0) { + node.x = 0; + } + + if (node.x + node.width > this.column) { + if (resizing) { + node.width = this.column - node.x; + } else { + node.x = this.column - node.width; + } + } + + if (node.y < 0) { + node.y = 0; + } + + return node; + }; + + public getDirtyNodes(verify?: boolean) { + // compare original X,Y,W,H (or entire node?) instead as _dirty can be a temporary state + if (verify) { + const dirtNodes = []; + this.nodes.forEach(function (n) { + if (n._dirty) { + if (n.y === n._origY && n.x === n._origX && n.width === n._origW && n.height === n._origH) { + delete n._dirty; + } else { + dirtNodes.push(n); + } + } + }); + return dirtNodes; + } + + return this.nodes.filter(function(n) { return n._dirty; }); + }; + + private _notify(nodes?: GridStackNode | GridStackNode[], detachNode?: boolean) { + if (this.batchMode) { return; } + detachNode = (detachNode === undefined ? true : detachNode); + nodes = (nodes === undefined ? [] : (Array.isArray(nodes) ? nodes : [nodes]) ); + const dirtyNodes = nodes.concat(this.getDirtyNodes()); + this.onchange(dirtyNodes, detachNode); + }; + + public cleanNodes() { + if (this.batchMode) { return; } + this.nodes.forEach(function(n) { delete n._dirty; }); + }; + + public addNode(node: GridStackNode, triggerAddEvent?: boolean) { + node = this._prepareNode(node); + + if (node.maxWidth !== undefined) { node.width = Math.min(node.width, node.maxWidth); } + if (node.maxHeight !== undefined) { node.height = Math.min(node.height, node.maxHeight); } + if (node.minWidth !== undefined) { node.width = Math.max(node.width, node.minWidth); } + if (node.minHeight !== undefined) { node.height = Math.max(node.height, node.minHeight); } + + node._id = node._id || GridStackEngine._idSeq++; + + if (node.autoPosition) { + this._sortNodes(); + + for (var i = 0;; ++i) { + const x = i % this.column; + const y = Math.floor(i / this.column); + if (x + node.width > this.column) { + continue; + } + const box = {x: x, y: y, width: node.width, height: node.height}; + if (!this.nodes.find(n => Utils.isIntercepted(box, n), {x: x, y: y, node: node})) { + node.x = x; + node.y = y; + delete node.autoPosition; // found our slot + break; + } + } + } + + this.nodes.push(node); + if (triggerAddEvent) { + this.addedNodes.push(node); + } + + this._fixCollisions(node); + this._packNodes(); + this._notify(); + return node; + }; + + public removeNode(node: GridStackNode, detachNode?: boolean) { + detachNode = (detachNode === undefined ? true : detachNode); + this.removedNodes.push(node); + node._id = null; // hint that node is being removed + this.nodes = Utils.without(this.nodes, node); + this._packNodes(); + this._notify(node, detachNode); + }; + + public removeAll(detachNode?: boolean) { + delete this._layouts; + if (this.nodes.length === 0) { return; } + detachNode = (detachNode === undefined ? true : detachNode); + this.nodes.forEach(function(n) { n._id = null; }); // hint that node is being removed + this.removedNodes = this.nodes; + this.nodes = []; + this._notify(this.removedNodes, detachNode); + }; + + public canMoveNode(node: GridStackNode, x: number, y: number, width?: number, height?: number): boolean { + if (!this.isNodeChangedPosition(node, x, y, width, height)) { + return false; + } + const hasLocked = Boolean(this.nodes.find(function(n) { return n.locked; })); + + if (!this.maxRow && !hasLocked) { + return true; + } + + let clonedNode; + const clone = new GridStackEngine( + this.column, + null, + this.float, + 0, + this.nodes.map(function(n) { + if (n === node) { + clonedNode = Utils.clone(n); + return clonedNode; + } + return Utils.clone(n); + })); + + if (!clonedNode) { return true;} + + clone.moveNode(clonedNode, x, y, width, height); + + let canMove = true; + if (hasLocked) { + canMove = canMove && !Boolean(clone.nodes.find(function(n) { + return n !== clonedNode && Boolean(n.locked) && Boolean(n._dirty); + })); + } + if (this.maxRow) { + canMove = canMove && (clone.getRow() <= this.maxRow); + } + + return canMove; + }; + + public canBePlacedWithRespectToHeight(node: GridStackNode) { + if (!this.maxRow) { + return true; + } + + const clone = new GridStackEngine( + this.column, + null, + this.float, + 0, + this.nodes.map(function(n) { return Utils.clone(n) })); + clone.addNode(node); + return clone.getRow() <= this.maxRow; + }; + + public isNodeChangedPosition(node: GridStackNode, x: number, y: number, width: number, height: number) { + if (typeof x !== 'number') { x = node.x; } + if (typeof y !== 'number') { y = node.y; } + if (typeof width !== 'number') { width = node.width; } + if (typeof height !== 'number') { height = node.height; } + + if (node.maxWidth !== undefined) { width = Math.min(width, node.maxWidth); } + if (node.maxHeight !== undefined) { height = Math.min(height, node.maxHeight); } + if (node.minWidth !== undefined) { width = Math.max(width, node.minWidth); } + if (node.minHeight !== undefined) { height = Math.max(height, node.minHeight); } + + if (node.x === x && node.y === y && node.width === width && node.height === height) { + return false; + } + return true; + }; + + public moveNode(node: GridStackNode, x: number, y: number, width?: number, height?: number, noPack?: boolean): GridStackNode { + if (typeof x !== 'number') { x = node.x; } + if (typeof y !== 'number') { y = node.y; } + if (typeof width !== 'number') { width = node.width; } + if (typeof height !== 'number') { height = node.height; } + + if (node.maxWidth !== undefined) { width = Math.min(width, node.maxWidth); } + if (node.maxHeight !== undefined) { height = Math.min(height, node.maxHeight); } + if (node.minWidth !== undefined) { width = Math.max(width, node.minWidth); } + if (node.minHeight !== undefined) { height = Math.max(height, node.minHeight); } + + if (node.x === x && node.y === y && node.width === width && node.height === height) { + return node; + } + + const resizing = node.width !== width; + node._dirty = true; + + node.x = x; + node.y = y; + node.width = width; + node.height = height; + + node._lastTriedX = x; + node._lastTriedY = y; + node._lastTriedWidth = width; + node._lastTriedHeight = height; + + node = this._prepareNode(node, resizing); + + this._fixCollisions(node); + if (!noPack) { + this._packNodes(); + this._notify(); + } + return node; + }; + + public getRow(): number { + return this.nodes.reduce(function(memo, n) { return Math.max(memo, n.y + n.height); }, 0); + }; + + public beginUpdate(node: GridStackNode) { + if (node._updating) return; + node._updating = true; + this.nodes.forEach(function(n) { n._packY = n.y; }); + }; + + public endUpdate() { + const n = this.nodes.find(function(n) { return n._updating; }); + if (n) { + n._updating = false; + this.nodes.forEach(function(n) { delete n._packY; }); + } + }; + + /** called whenever a node is added or moved - updates the cached layouts */ + public _layoutsNodesChange(nodes: GridStackNode[]) { + if (!this._layouts || this._ignoreLayoutsNodeChange) return; + // remove smaller layouts - we will re-generate those on the fly... larger ones need to update + this._layouts.forEach(function(layout, column) { + if (!layout || column === this.column) return; + if (column < this.column) { + this._layouts[column] = undefined; + } + else { + // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better. + // Note: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. + nodes.forEach(function(node) { + const n = layout.find(function(l) { return l._id === node._id }); + if (!n) return; // no cache for new nodes. Will use those values. + const ratio = column / this.column; + // Y changed, push down same amount + // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode) + if (node.y !== node._origY) { + n.y += (node.y - node._origY); + } + // X changed, scale from new position + if (node.x !== node._origX) { + n.x = Math.round(node.x * ratio); + } + // width changed, scale from new width + if (node.width !== node._origW) { + n.width = Math.round(node.width * ratio); + } + // ...height always carries over from cache + }, this); + } + }, this); + } + + /** + * Called to scale the widget width & position up/down based on the column change. + * Note we store previous layouts (especially original ones) to make it possible to go + * from say 12 -> 1 -> 12 and get back to where we were. + * + * oldColumn: previous number of columns + * column: new column number + * nodes?: different sorted list (ex: DOM order) instead of current list + */ + public _updateNodeWidths(oldColumn: number, column: number, nodes: GridStackNode[]) { + if (!this.nodes.length || oldColumn === column) { return; } + + // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data + const copy: layout[] = []; + this.nodes.forEach(function(n, i) { copy[i] = {x: n.x, y: n.y, width: n.width, _id: n._id} }); // only thing we change is x,y,w and id to find it back + this._layouts = this._layouts || []; // use array to find larger quick + this._layouts[oldColumn] = copy; + + // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout + if (column === 1 && nodes && nodes.length) { + let top = 0; + nodes.forEach(function(n) { + n.x = 0; + n.width = 1; + n.y = Math.max(n.y, top); + top = n.y + n.height; + }); + } else { + nodes = Utils.sort(this.nodes, -1, oldColumn); // current column reverse sorting so we can insert last to front (limit collision) + } + + // see if we have cached previous layout. + let cacheNodes = this._layouts[column] || []; + // if not AND we are going up in size start with the largest layout as down-scaling is more accurate + const lastIndex = this._layouts.length - 1; + if (cacheNodes.length === 0 && column > oldColumn && column < lastIndex) { + cacheNodes = this._layouts[lastIndex] || []; + if (cacheNodes.length) { + // pretend we came from that larger column by assigning those values as starting point + oldColumn = lastIndex; + cacheNodes.forEach(function(cacheNode) { + const j = nodes.findIndex(function(n) {return n && n._id === cacheNode._id}); + if (j !== -1) { + // still current, use cache info positions + nodes[j].x = cacheNode.x; + nodes[j].y = cacheNode.y; + nodes[j].width = cacheNode.width; + } + }); + cacheNodes = []; // we still don't have new column cached data... will generate from larger one. + } + } + + // if we found cache re-use those nodes that are still current + let newNodes = []; + cacheNodes.forEach(function(cacheNode) { + const j = nodes.findIndex(function(n) {return n && n._id === cacheNode._id}); + if (j !== -1) { + // still current, use cache info positions + nodes[j].x = cacheNode.x; + nodes[j].y = cacheNode.y; + nodes[j].width = cacheNode.width; + newNodes.push(nodes[j]); + nodes[j] = null; // erase it so we know what's left + } + }); + // ...and add any extra non-cached ones + const ratio = column / oldColumn; + nodes.forEach(function(node) { + if (!node) return; + node.x = (column === 1 ? 0 : Math.round(node.x * ratio)); + node.width = ((column === 1 || oldColumn === 1) ? 1 : (Math.round(node.width * ratio) || 1)); + newNodes.push(node); + }); + + // finally re-layout them in reverse order (to get correct placement) + newNodes = Utils.sort(newNodes, -1, column); + this._ignoreLayoutsNodeChange = true; + this.batchUpdate(); + this.nodes = []; // pretend we have no nodes to start with (we use same structures) to simplify layout + newNodes.forEach(function(node) { + this.addNode(node, false); // 'false' for add event trigger + node._dirty = true; // force attr update + }, this); + this.commit(); + delete this._ignoreLayoutsNodeChange; + } + + /** called to save initial position/size */ + public _saveInitial() { + this.nodes.forEach(function(n) { + n._origX = n.x; + n._origY = n.y; + n._origW = n.width; + n._origH = n.height; + delete n._dirty; + }); + } + + // legacy method renames + private getGridHeight = obsolete(GridStackEngine.prototype.getRow, 'getGridHeight', 'getRow', 'v1.0.0'); +} diff --git a/src/gridstack-extra.scss b/src/gridstack-extra.scss index 5725e4475..6fe02327d 100644 --- a/src/gridstack-extra.scss +++ b/src/gridstack-extra.scss @@ -1,5 +1,5 @@ /*! - * gridstack 1.1.0-dev extra CSS for [2-11] columns (non default) + * gridstack 2.0.0-rc extra CSS for [2-11] columns (non default) * https://gridstackjs.com/ * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov * gridstack.js may be freely distributed under the MIT license. diff --git a/src/gridstack-poly.js b/src/gridstack-poly.js index 5ec62d795..d3e65ed97 100644 --- a/src/gridstack-poly.js +++ b/src/gridstack-poly.js @@ -1,5 +1,6 @@ -/** gridstack.js 1.1.0-dev - IE and older browsers Polyfills for this library @preserve*/ -/** +// gridstack-poly.js 2.0.0-rc @preserve + +/** IE and older browsers Polyfills for this library * https://gridstackjs.com/ * (c) 2019-2020 Alain Dumesny * gridstack.js may be freely distributed under the MIT license. diff --git a/src/gridstack.d.ts b/src/gridstack.d.ts deleted file mode 100644 index 337c8855c..000000000 --- a/src/gridstack.d.ts +++ /dev/null @@ -1,644 +0,0 @@ -// Type definitions for Gridstack 1.1.0-dev -// Project: https://gridstackjs.com/ -// Definitions by: Pascal Senn -// Ricky Blankenaufulland -// Sl1MBoy -// John Archer -// Alain Dumesny -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped initially, but now part of gridstack.js -// TypeScript Version: 2.8 - -interface Window { - GridStack: GridStack; -} - -/* Other items in https://github.com/gridstack/gridstack.js/blob/develop/doc/README.md - * Grid attributes - * Item attributes - * Events - */ - -type GridStackElement = string | HTMLElement; -interface GridStackHTMLElement extends HTMLElement { - /** grid's parent DOM element points back to grid class */ - gridstack: GridStack; -} -type GridStackEvent = 'added' | 'change' | 'disable' | 'dragstart' | 'dragstop' | 'dropped' | - 'enable' | 'removed' | 'resize' | 'resizestart' | 'gsresizestop' | string; - -interface GridStack { - /** - * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will - * simply return the existing instance (ignore any passed options). There is also a version that support - * multiple grids initialization. - * @param options grid options (optional) - * @param el element to convert to a grid (default to '.grid-stack' class selector) - * - * @example - * var grid = window.GridStack.init(); - * // Note: the HTMLElement (of type GridStackHTMLElement) will itself store a `gridstack: GridStack` value that can be retrieve later - * var grid = document.querySelector('.grid-stack').gridstack; - */ - init(options?: GridstackOptions, el?: GridStackElement): GridStack; - - /** - * Will initialize a list of elements (given a selector) and return an array of grids. - * @param options grid options (optional) - * @param selector element to convert to grids (default to '.grid-stack' class selector) - * - * @example - * var grids = window.GridStack.initAll(); - * grids.forEach(...) - */ - initAll(options?: GridstackOptions, selector?: string): GridStack[]; - - /** the HTML element tied to this grid after it's been initialized */ - el: GridStackHTMLElement; - - /** engine used to implement non DOM grid functionality */ - engine: GridStackEngine; - - /** - * Creates new widget and returns it. - * - * Widget will be always placed even if result height is more than actual grid height. - * You need to use willItFit method before calling addWidget for additional check. - * See also `makeWidget()`. - * - * @example - * var grid = GridStack.init(); - * grid.addWidget(el, {width: 3, autoPosition: true}); - * - * @param el widget to add - * @param options widget position/size options (optional) - */ - addWidget(el: GridStackElement, options ? : GridstackWidget): HTMLElement; - - /** - * Creates new widget and returns it. - * Legacy: Spelled out version of the widgets options, recommend use new version instead. - * - * @example - * var grid = GridStack.init(); - * grid.addWidget(el, 0, 0, 3, 2, true); - * - * @param el widget to add - * @param x widget position x (optional) - * @param y widget position y (optional) - * @param width widget dimension width (optional) - * @param height widget dimension height (optional) - * @param autoPosition if true then x, y parameters will be ignored and widget will be places on the first available position (optional) - * @param minWidth minimum width allowed during resize/creation (optional) - * @param maxWidth maximum width allowed during resize/creation (optional) - * @param minHeight minimum height allowed during resize/creation (optional) - * @param maxHeight maximum height allowed during resize/creation (optional) - * @param id value for `data-gs-id` (optional) - */ - addWidget(el: GridStackElement, x ? : number, y ? : number, width ? : number, height ? : number, autoPosition ? : boolean, - minWidth ? : number, maxWidth ? : number, minHeight ? : number, maxHeight ? : number, id ? : number | string): HTMLElement; - - /** - * Initializes batch updates. You will see no changes until `commit()` method is called. - */ - batchUpdate(): void; - - /** - * Gets current cell height. - */ - cellHeight(): number; - - /** - * Update current cell height - see `GridstackOptions.cellHeight` for format. - * This method rebuilds an internal CSS style sheet. - * Note: You can expect performance issues if call this method too often. - * - * @param val the cell height - * @param noUpdate (Optional) if true, styles will not be updated - * - * @example - * grid.cellHeight(grid.cellWidth() * 1.2); - */ - cellHeight(val: number | string, noUpdate ? : boolean): void; - - /** - * Gets current cell width. - */ - cellWidth(): number; - - /** - * Finishes batch updates. Updates DOM nodes. You must call it after batchUpdate. - */ - commit(): void; - - /** - * relayout grid items to reclaim any empty space - */ - compact(): void; - - /** - * set the number of columns in the grid. Will update existing widgets to conform to new number of columns, - * as well as cache the original layout so you can revert back to previous positions without loss. - * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [1-11], - * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns) - * @param column - Integer > 0 (default 12). - * @param doNotPropagate if true existing widgets will not be updated (optional) - */ - column(column: number, doNotPropagate ? : boolean): void; - - /** - * get the number of columns in the grid (default 12) - */ - column(): number; - - /** - * Destroys a grid instance. - * @param detachGrid if false nodes and grid will not be removed from the DOM (Optional. Default true). - */ - destroy(detachGrid ? : boolean): void; - - /** - * Disables widgets moving/resizing. This is a shortcut for: - * @example - * grid.movable('.grid-stack-item', false); - * grid.resizable('.grid-stack-item', false); - */ - disable(): void; - - /** - * Enables widgets moving/resizing. This is a shortcut for: - * @example - * grid.movable('.grid-stack-item', true); - * grid.resizable('.grid-stack-item', true); - */ - enable(): void; - - /** - * Enables/disables widget moving. - * - * @param doEnable - * @param includeNewWidgets will force new widgets to be draggable as per - * doEnable`s value by changing the disableDrag grid option. - */ - enableMove(doEnable: boolean, includeNewWidgets: boolean): void; - - /** - * Enables/disables widget resizing - * @param doEnable - * @param includeNewWidgets will force new widgets to be draggable as per - * doEnable`s value by changing the disableResize grid option. - */ - enableResize(doEnable: boolean, includeNewWidgets: boolean): void; - - /** - * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) - * @param mode - */ - float(mode: boolean): void; - - /** - * get the current float mode - */ - float(): boolean; - - /** - * Get the position of the cell under a pixel on screen. - * @param position the position of the pixel to resolve in - * absolute coordinates, as an object with top and left properties - * @param useOffset if true, value will be based on offset vs position (Optional. Default false). - * Useful when grid is within `position: relative` element - * - * Returns an object with properties `x` and `y` i.e. the column and row in the grid. - */ - getCellFromPixel(position: MousePosition, useOffset ? : boolean): CellPosition; - - /** returns the current number of rows */ - getRow(): number; - - /** - * Checks if specified area is empty. - * @param x the position x. - * @param y the position y. - * @param width the width of to check - * @param height the height of to check - */ - isAreaEmpty(x: number, y: number, width: number, height: number): void; - - /** - * Locks/unlocks widget. - * @param el widget to modify. - * @param val if true widget will be locked. - */ - locked(el: GridStackElement, val: boolean): void; - - /** - * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets. - * If you want gridstack to add the elements for you, use addWidget instead. - * Makes the given element a widget and returns it. - * @param el widget to convert. - * - * @example - * var grid = GridStack.init(); - * grid.el.appendChild('
') - * grid.makeWidget('gsi-1'); - */ - makeWidget(el: GridStackElement): HTMLElement; - - /** - * Set the maxWidth for a widget. - * @param el widget to modify. - * @param val A numeric value of the number of columns - */ - maxWidth(el: GridStackElement, val: number): void; - - /** - * Set the minWidth for a widget. - * @param el widget to modify. - * @param val A numeric value of the number of columns - */ - minWidth(el: GridStackElement, val: number): void; - - /** - * Set the maxHeight for a widget. - * @param el widget to modify. - * @param val A numeric value of the number of rows - */ - maxHeight(el: GridStackElement, val: number): void; - - /** - * Set the minHeight for a widget. - * @param el widget to modify. - * @param val A numeric value of the number of rows - */ - minHeight(el: GridStackElement, val: number): void; - - /** - * Enables/Disables moving. - * @param el widget to modify. - * @param val if true widget will be draggable. - */ - movable(el: GridStackElement, val: boolean): void; - - /** - * Changes widget position - * @param el widget to modify - * @param x new position x. If value is null or undefined it will be ignored. - * @param y new position y. If value is null or undefined it will be ignored. - */ - move(el: GridStackElement, x: number, y: number): void; - - /** - * unsubscribe from the 'on' event below - * @param name of the event (see possible values) - */ - off(name: GridStackEvent): void; - - /** - * Event handler that extracts our CustomEvent data out automatically for receiving custom - * notifications (see doc for supported events) - * @param name of the event (see possible values) or list of names space separated - * @param callback function called with event and optional second/third param - * (see README documentation for each signature). - * - * @example - * grid.on('added', function(e, items) { log('added ', items)} ); - * or - * grid.on('added removed change', function(e, items) { log(e.type, items)} ); - * - * Note: in some cases it is the same as calling native handler and parsing the event. - * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} ); - */ - on(name: GridStackEvent, callback: (event: CustomEvent, arg2?: GridStackNode[] | Object, arg3?: Object) => void): void; - - /** - * Removes widget from the grid. - * @param el widget to modify - * @param detachNode if false DOM node won't be removed from the tree (Default? true). - */ - removeWidget(el: GridStackElement, detachNode ? : boolean): void; - - /** - * Removes all widgets from the grid. - * @param detachNode if false DOM nodes won't be removed from the tree (Default? true). - */ - removeAll(detachNode ? : boolean): void; - - /** - * Changes widget size - * @param el widget to modify - * @param width new dimensions width. If value is null or undefined it will be ignored. - * @param height new dimensions height. If value is null or undefined it will be ignored. - */ - resize(el: GridStackElement, width: number, height: number): void; - - /** - * Enables/Disables resizing. - * @param el widget to modify - * @param val if true widget will be resizable. - */ - resizable(el: GridStackElement, val: boolean): void; - - /** - * Toggle the grid animation state. Toggles the `grid-stack-animate` class. - * @param doAnimate if true the grid will animate. - */ - setAnimation(doAnimate: boolean): void; - - /** - * Toggle the grid static state. Also toggle the grid-stack-static class. - * @param staticValue if true the grid become static. - */ - setStatic(staticValue: boolean): void; - - /** - * Updates widget position/size. - * @param el widget to modify - * @param x new position x. If value is null or undefined it will be ignored. - * @param y new position y. If value is null or undefined it will be ignored. - * @param width new dimensions width. If value is null or undefined it will be ignored. - * @param height new dimensions height. If value is null or undefined it will be ignored. - */ - update(el: GridStackElement, x: number, y: number, width: number, height: number): void; - - /** - * returns current vertical margin value - */ - verticalMargin(): number; - - /** - * Updates the vertical margin - see `GridstackOptions.verticalMargin` for format options. - * - * @param value new vertical margin value - * @param noUpdate (optional) if true, styles will not be updated - */ - verticalMargin(value: number | string, noUpdate ? : boolean): void; - - /** - * Returns true if the height of the grid will be less the vertical - * constraint. Always returns true if grid doesn't have height constraint. - * @param x new position x. If value is null or undefined it will be ignored. - * @param y new position y. If value is null or undefined it will be ignored. - * @param width new dimensions width. If value is null or undefined it will be ignored. - * @param height new dimensions height. If value is null or undefined it will be ignored. - * @param autoPosition if true then x, y parameters will be ignored and widget - * will be places on the first available position - * - * @example - * if (grid.willItFit(newNode.x, newNode.y, newNode.width, newNode.height, true)) { - * grid.addWidget(newNode.el, newNode.x, newNode.y, newNode.width, newNode.height, true); - * } else { - * alert('Not enough free space to place the widget'); - * } - */ - willItFit(x: number, y: number, width: number, height: number, autoPosition: boolean): boolean; -} - -/** - * Defines the GridStack engine that does most no DOM grid manipulation. - * See GridStack methods and vars for descriptions. - * - * NOTE: values should not be modified - call the GridStack API instead - */ -interface GridStackEngine { - column: number; - float: boolean; - maxRow: number; - nodes: GridStackNode[]; - getRow(): number; -} - -/** - * Defines the coordinates of an object - */ -interface MousePosition { - top: number; - left: number; -} - -/** - * Defines the position of a cell inside the grid - */ -interface CellPosition { - x: number; - y: number; -} - -/** - * Gridstack Widget creation options - * @param x widget position x (default?: 0) - * @param y widget position y (default?: 0) - * @param width widget dimension width (default?: 1) - * @param height widget dimension height (default?: 1) - * @param autoPosition if true then x, y parameters will be ignored and widget will be places on the first available position (default?: false) - * @param minWidth minimum width allowed during resize/creation (default?: undefined = un-constrained) - * @param maxWidth maximum width allowed during resize/creation (default?: undefined = un-constrained) - * @param minHeight minimum height allowed during resize/creation (default?: undefined = un-constrained) - * @param maxHeight maximum height allowed during resize/creation (default?: undefined = un-constrained) - * @param noResize prevent resizing (default?: undefined = un-constrained) - * @param noMove prevents moving (default?: undefined = un-constrained) - * @param locked prevents moving and resizing (default?: undefined = un-constrained) - * @param resizeHandles widgets can have their own resize handles. For example 'e,w' will make the particular widget only resize east and west. - * @param id value for `data-gs-id` stored on the widget (default?: undefined) - */ -interface GridstackWidget { - x ? : number; - y ? : number; - width ? : number; - height ? : number; - autoPosition ? : boolean; - minWidth ? : number; - maxWidth ? : number; - minHeight ? : number; - maxHeight ? : number; - noResize ? : boolean; - noMove ? : boolean; - locked ? : boolean; - resizeHandles ?: string; - id ? : number | string; -} - -/** - * internal descriptions describing the items in the grid - */ -interface GridStackNode extends GridstackWidget { - el: HTMLElement; - _grid: GridStack; -} - -interface Utils { - /** - * Sorts array of nodes - * @param nodes array to sort - * @param dir 1 for asc, -1 for desc (optional) - * @param width width of the grid. If undefined the width will be calculated automatically (optional). - **/ - sort(nodes: GridStackNode[], dir ? : number, width ? : number): void; -} - -/** - * Gridstack Options - * Defines the options for a Gridstack - */ -interface GridstackOptions { - /** - * accept widgets dragged from other grids or from outside (default: `false`). Can be: - * `true` (uses `'.grid-stack-item'` class filter) or `false`, - * string for explicit class name, - * function returning a boolean. See [example](http://gridstack.github.io/gridstack.js/demo/two.html) - */ - acceptWidgets ? : boolean | string | ((i: number, element: Element) => boolean); - - /** - * if true the resizing handles are shown even if the user is not hovering over the widget (default?: false) - */ - alwaysShowResizeHandle ? : boolean; - - /** - * turns animation on (default?: true) - */ - animate ? : boolean; - - /** - * if false gridstack will not initialize existing items (default?: true) - */ - auto ? : boolean; - - /** - * one cell height (default?: 60). Can be: - * an integer (px) - * a string (ex: '100px', '10em', '10rem', '10%') - * 0 or null, in which case the library will not generate styles for rows. Everything must be defined in CSS files. - * 'auto' - height will be calculated to match cell width (initial square grid). - */ - cellHeight ? : number | string; - - /** - * (internal) unit for cellHeight (default? 'px') which is set when a string cellHeight with a unit is passed (ex: '10rem') - */ - cellHeightUnit ? : string; - - /** - * number of columns (default?: 12). Note: IF you change this, CSS also have to change. See https://github.com/gridstack/gridstack.js#change-grid-columns - */ - column ? : number; - - /** class that implement drag'n'drop functionality for gridstack. If false grid will be static. - * (default?: null - first available plugin will be used) - */ - ddPlugin ? : boolean | null | any; - - /** disallows dragging of widgets (default?: false) */ - disableDrag ? : boolean; - - /** disables the onColumnMode when the window width is less than minWidth (default?: false) */ - disableOneColumnMode ? : boolean; - - /** disallows resizing of widgets (default?: false). */ - disableResize ? : boolean; - - /** - * allows to override UI draggable options. (default?: { handle?: '.grid-stack-item-content', scroll?: true, appendTo?: 'body', containment: null }) - */ - draggable ? : {}; - - /** - * let user drag nested grid items out of a parent or not (default false) - */ - dragOut ? : boolean; - - /** - * enable floating widgets (default?: false) See example (http://gridstack.github.io/gridstack.js/demo/float.html) - */ - float ? : boolean; - - /** - * draggable handle selector (default?: '.grid-stack-item-content') - */ - handle ? : string; - - /** draggable handle class (e.g. 'grid-stack-item-content'). If set 'handle' is ignored (default?: null) */ - handleClass ? : string; - - /** - * widget class (default?: 'grid-stack-item') - */ - itemClass ? : string; - - /** - * maximum rows amount. Default? is 0 which means no maximum rows - */ - maxRow ? : number; - - /** - * minimum rows amount. Default is `0`. You can also do this with `min-height` CSS attribute - * on the grid div in pixels, which will round to the closest row. - */ - minRow?: number; - - /** - * minimal width. If window width is less, grid will be shown in one column mode (default?: 768) - */ - minWidth ? : number; - - /** - * set to true if you want oneColumnMode to use the DOM order and ignore x,y from normal multi column - * layouts during sorting. This enables you to have custom 1 column layout that differ from the rest. (default?: false) - */ - oneColumnModeDomSort?: boolean; - - /** - * class for placeholder (default?: 'grid-stack-placeholder') - */ - placeholderClass ? : string; - - /** placeholder default content (default?: '') */ - placeholderText ? : string; - - /** - * allows to override UI resizable options. (default?: { autoHide?: true, handles?: 'se' }) - */ - resizable ? : {}; - - /** - * if true widgets could be removed by dragging outside of the grid. It could also be a selector string, - * in this case widgets will be removed by dropping them there (default?: false) - * See example (http://gridstack.github.io/gridstack.js/demo/two.html) - */ - removable ? : boolean | string; - - /** - * time in milliseconds before widget is being removed while dragging outside of the grid. (default?: 2000) - */ - removeTimeout ? : number; - - /** - * fix grid number of rows. This is a shortcut of writing `minRow:N, maxRow:N`. - * (default `0` no constrain) - */ - row?: number; - - /** - * if true turns grid to RTL. Possible values are true, false, 'auto' (default?: 'auto') - * See [example](http://gridstack.github.io/gridstack.js/demo/rtl.html) - */ - rtl ? : boolean | 'auto'; - - /** - * makes grid static (default?: false). If `true` widgets are not movable/resizable. - * You don't even need draggable/resizable. A CSS class - * 'grid-stack-static' is also added to the element. - */ - staticGrid ? : boolean; - - /** - * vertical gap size (default?: 20). Can be: - * an integer (px) - * a string (ex: '2em', '20px', '2rem') - */ - verticalMargin ? : number | string; - - /** - * (internal) unit for verticalMargin (default? 'px') set when `verticalMargin` is set as string with unit (ex: 2rem') - */ - verticalMarginUnit ? : string; -} \ No newline at end of file diff --git a/src/gridstack.jQueryUI.js b/src/gridstack.jQueryUI.js deleted file mode 100644 index 0c5c95fb2..000000000 --- a/src/gridstack.jQueryUI.js +++ /dev/null @@ -1,90 +0,0 @@ -/** gridstack.js 1.1.0-dev - JQuery UI Drag&Drop plugin @preserve */ -/** - * https://gridstackjs.com/ - * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov - * gridstack.js may be freely distributed under the MIT license. -*/ -(function(factory) { - /* we compile this in so no need for required loading - if (typeof define === 'function' && define.amd) { - define(['jquery', 'gridstack', 'exports'], factory); - } else if (typeof exports !== 'undefined') { - try { jQuery = require('jquery'); } catch (e) {} - try { gridstack = require('gridstack'); } catch (e) {} - factory(jQuery, gridstack.GridStack, exports); - } else */{ - factory(jQuery, GridStack, window); - } -})(function($, GridStack, scope) { - /** - * @class JQueryUIGridStackDragDropPlugin - * jQuery UI implementation of drag'n'drop gridstack plugin. - */ - function JQueryUIGridStackDragDropPlugin(grid) { - GridStack.DragDropPlugin.call(this, grid); - } - - GridStack.DragDropPlugin.registerPlugin(JQueryUIGridStackDragDropPlugin); - - JQueryUIGridStackDragDropPlugin.prototype = Object.create(GridStack.DragDropPlugin.prototype); - JQueryUIGridStackDragDropPlugin.prototype.constructor = JQueryUIGridStackDragDropPlugin; - - JQueryUIGridStackDragDropPlugin.prototype.resizable = function(el, opts) { - el = $(el); - if (opts === 'disable' || opts === 'enable') { - el.resizable(opts); - } else if (opts === 'option') { - var key = arguments[2]; - var value = arguments[3]; - el.resizable(opts, key, value); - } else { - var handles = el.data('gs-resize-handles') ? el.data('gs-resize-handles') : - this.grid.opts.resizable.handles; - el.resizable($.extend({}, this.grid.opts.resizable, { - handles: handles - }, { - start: opts.start || function() {}, - stop: opts.stop || function() {}, - resize: opts.resize || function() {} - })); - } - return this; - }; - - JQueryUIGridStackDragDropPlugin.prototype.draggable = function(el, opts) { - el = $(el); - if (opts === 'disable' || opts === 'enable') { - el.draggable(opts); - } else { - el.draggable($.extend({}, this.grid.opts.draggable, { - containment: (this.grid.opts.isNested && !this.grid.opts.dragOut) ? - this.grid.$el.parent() : - (this.grid.opts.draggable.containment || null), - start: opts.start || function() {}, - stop: opts.stop || function() {}, - drag: opts.drag || function() {} - })); - } - return this; - }; - - JQueryUIGridStackDragDropPlugin.prototype.droppable = function(el, opts) { - el = $(el); - el.droppable(opts); - return this; - }; - - JQueryUIGridStackDragDropPlugin.prototype.isDroppable = function(el, opts) { - el = $(el); - return Boolean(el.data('droppable')); - }; - - JQueryUIGridStackDragDropPlugin.prototype.on = function(el, eventName, callback) { - $(el).on(eventName, callback); - return this; - }; - - scope.JQueryUIGridStackDragDropPlugin = JQueryUIGridStackDragDropPlugin; - - return JQueryUIGridStackDragDropPlugin; -}); diff --git a/src/gridstack.js b/src/gridstack.js deleted file mode 100644 index a59ce77c9..000000000 --- a/src/gridstack.js +++ /dev/null @@ -1,2119 +0,0 @@ -/** - * gridstack.js 1.1.0-dev - * https://gridstackjs.com/ - * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov - * gridstack.js may be freely distributed under the MIT license. - * @preserve -*/ -(function(factory) { - /* [alain] we compile jquery with our code, so no need to 'load' externally - if (typeof define === 'function' && define.amd) { - define(['jquery', 'exports'], factory); - } else if (typeof exports !== 'undefined') { - var jQueryModule; - - try { jQueryModule = require('jquery'); } catch (e) {} - - factory(jQueryModule || window.jQuery, exports); - } else */{ - factory(window.jQuery, window); - } -})(function($, scope) { - - // checks for obsolete method names - var obsolete = function(f, oldName, newName, rev) { - var wrapper = function() { - console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' + - 'with `' + newName + '`. It will be **completely** removed in v1.0'); - return f.apply(this, arguments); - }; - wrapper.prototype = f.prototype; - - return wrapper; - }; - - // checks for obsolete grid options (can be used for any fields, but msg is about options) - var obsoleteOpts = function(opts, oldName, newName, rev) { - if (opts[oldName] !== undefined) { - opts[newName] = opts[oldName]; - console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' + - newName + '`. It will be **completely** removed in v1.0'); - } - }; - - // checks for obsolete grid options which are gone - var obsoleteOptsDel = function(opts, oldName, rev, info) { - if (opts[oldName] !== undefined) { - console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info); - } - }; - - // checks for obsolete Jquery element attributes - var obsoleteAttr = function(el, oldName, newName, rev) { - var oldAttr = el.attr(oldName); - if (oldAttr !== undefined) { - el.attr(newName, oldAttr); - console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' + - newName + '`. It will be **completely** removed in v1.0'); - } - }; - - var Utils = { - - isIntercepted: function(a, b) { - return !(a.x + a.width <= b.x || b.x + b.width <= a.x || a.y + a.height <= b.y || b.y + b.height <= a.y); - }, - - sort: function(nodes, dir, column) { - if (!column) { - var widths = nodes.map(function(node) { return node.x + node.width; }); - column = Math.max.apply(Math, widths); - } - - if (dir === -1) - return Utils.sortBy(nodes, function(n) { return -(n.x + n.y * column); }); - else - return Utils.sortBy(nodes, function(n) { return (n.x + n.y * column); }); - }, - - createStylesheet: function(id, parent) { - var style = document.createElement('style'); - style.setAttribute('type', 'text/css'); - style.setAttribute('data-gs-style-id', id); - if (style.styleSheet) { - style.styleSheet.cssText = ''; - } else { - style.appendChild(document.createTextNode('')); - } - if (!parent) { parent = document.getElementsByTagName('head')[0]; } // default to head - parent.insertBefore(style, parent.firstChild); - return style.sheet; - }, - - removeStylesheet: function(id) { - $('STYLE[data-gs-style-id=' + id + ']').remove(); - }, - - insertCSSRule: function(sheet, selector, rules, index) { - if (typeof sheet.insertRule === 'function') { - sheet.insertRule(selector + '{' + rules + '}', index); - } else if (typeof sheet.addRule === 'function') { - sheet.addRule(selector, rules, index); - } - }, - - toBool: function(v) { - if (typeof v === 'boolean') { - return v; - } - if (typeof v === 'string') { - v = v.toLowerCase(); - return !(v === '' || v === 'no' || v === 'false' || v === '0'); - } - return Boolean(v); - }, - - _collisionNodeCheck: function(n) { - return n !== this.node && Utils.isIntercepted(n, this.nn); - }, - - _didCollide: function(bn) { - return Utils.isIntercepted({x: this.n.x, y: this.newY, width: this.n.width, height: this.n.height}, bn); - }, - - _isAddNodeIntercepted: function(n) { - return Utils.isIntercepted({x: this.x, y: this.y, width: this.node.width, height: this.node.height}, n); - }, - - parseHeight: function(val) { - var height = val; - var heightUnit = 'px'; - if (height && typeof height === 'string') { - var match = height.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/); - if (!match) { - throw new Error('Invalid height'); - } - heightUnit = match[2] || 'px'; - height = parseFloat(match[1]); - } - return {height: height, unit: heightUnit}; - }, - - without: function(array, item) { - var index = array.indexOf(item); - - if (index !== -1) { - array = array.slice(0); - array.splice(index, 1); - } - - return array; - }, - - sortBy: function(array, getter) { - return array.slice(0).sort(function(left, right) { - var valueLeft = getter(left); - var valueRight = getter(right); - - if (valueRight === valueLeft) { - return 0; - } - - return valueLeft > valueRight ? 1 : -1; - }); - }, - - defaults: function(target) { - var sources = Array.prototype.slice.call(arguments, 1); - - sources.forEach(function(source) { - for (var prop in source) { - if (source.hasOwnProperty(prop) && (!target.hasOwnProperty(prop) || target[prop] === undefined)) { - target[prop] = source[prop]; - } - } - }); - - return target; - }, - - clone: function(target) { - return $.extend({}, target); - }, - - throttle: function(callback, delay) { - var isWaiting = false; - - return function() { - if (!isWaiting) { - callback.apply(this, arguments); - isWaiting = true; - setTimeout(function() { isWaiting = false; }, delay); - } - }; - }, - - removePositioningStyles: function(el) { - var style = el[0].style; - if (style.position) { - style.removeProperty('position'); - } - if (style.left) { - style.removeProperty('left'); - } - if (style.top) { - style.removeProperty('top'); - } - if (style.width) { - style.removeProperty('width'); - } - if (style.height) { - style.removeProperty('height'); - } - }, - getScrollParent: function(el) { - var returnEl; - if (el === null) { - returnEl = null; - } else if (el.scrollHeight > el.clientHeight) { - returnEl = el; - } else { - returnEl = Utils.getScrollParent(el.parentNode); - } - return returnEl; - }, - updateScrollPosition: function(el, ui, distance) { - // is widget in view? - var rect = el.getBoundingClientRect(); - var innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight); - if (rect.top < 0 || - rect.bottom > innerHeightOrClientHeight - ) { - // set scrollTop of first parent that scrolls - // if parent is larger than el, set as low as possible - // to get entire widget on screen - var offsetDiffDown = rect.bottom - innerHeightOrClientHeight; - var offsetDiffUp = rect.top; - var scrollEl = Utils.getScrollParent(el); - if (scrollEl !== null) { - var prevScroll = scrollEl.scrollTop; - if (rect.top < 0 && distance < 0) { - // moving up - if (el.offsetHeight > innerHeightOrClientHeight) { - scrollEl.scrollTop += distance; - } else { - scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp; - } - } else if (distance > 0) { - // moving down - if (el.offsetHeight > innerHeightOrClientHeight) { - scrollEl.scrollTop += distance; - } else { - scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown; - } - } - // move widget y by amount scrolled - ui.position.top += scrollEl.scrollTop - prevScroll; - } - } - } - }; - - /** - * @class GridStackDragDropPlugin - * Base class for drag'n'drop plugin. - */ - function GridStackDragDropPlugin(grid) { - this.grid = grid; - } - - GridStackDragDropPlugin.registeredPlugins = []; - - GridStackDragDropPlugin.registerPlugin = function(pluginClass) { - GridStackDragDropPlugin.registeredPlugins.push(pluginClass); - }; - - GridStackDragDropPlugin.prototype.resizable = function(el, opts) { - return this; - }; - - GridStackDragDropPlugin.prototype.draggable = function(el, opts) { - return this; - }; - - GridStackDragDropPlugin.prototype.droppable = function(el, opts) { - return this; - }; - - GridStackDragDropPlugin.prototype.isDroppable = function(el) { - return false; - }; - - GridStackDragDropPlugin.prototype.on = function(el, eventName, callback) { - return this; - }; - - - var idSeq = 0; - - var GridStackEngine = function(column, onchange, float, maxRow, items) { - this.column = column || 12; - this.float = float || false; - this.maxRow = maxRow || 0; - - this.nodes = items || []; - this.onchange = onchange || function() {}; - - this._addedNodes = []; - this._removedNodes = []; - this._batchMode = false; - }; - - GridStackEngine.prototype.batchUpdate = function() { - if (this._batchMode) return; - this._batchMode = true; - this._prevFloat = this.float; - this.float = true; // let things go anywhere for now... commit() will restore and possibly reposition - }; - - GridStackEngine.prototype.commit = function() { - if (!this._batchMode) return; - this._batchMode = false; - this.float = this._prevFloat; - delete this._prevFloat; - this._packNodes(); - this._notify(); - }; - - // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272 - GridStackEngine.prototype.getNodeDataByDOMEl = function(el) { - return this.nodes.find(function(node) { return el === node.el }); - }; - - GridStackEngine.prototype._fixCollisions = function(node) { - var self = this; - this._sortNodes(-1); - - var nn = node; - var hasLocked = Boolean(this.nodes.find(function(n) { return n.locked; })); - if (!this.float && !hasLocked) { - nn = {x: 0, y: node.y, width: this.column, height: node.height}; - } - while (true) { - var collisionNode = this.nodes.find(Utils._collisionNodeCheck, {node: node, nn: nn}); - if (!collisionNode) { return; } - var moved = this.moveNode(collisionNode, collisionNode.x, node.y + node.height, - collisionNode.width, collisionNode.height, true); - if (!moved) { return; } // break inf loop if we couldn't move after all (ex: maxRow, fixed) - } - }; - - GridStackEngine.prototype.isAreaEmpty = function(x, y, width, height) { - var nn = {x: x || 0, y: y || 0, width: width || 1, height: height || 1}; - var collisionNode = this.nodes.find(function(n) { - return Utils.isIntercepted(n, nn); - }); - return !collisionNode; - }; - - GridStackEngine.prototype._sortNodes = function(dir) { - this.nodes = Utils.sort(this.nodes, dir, this.column); - }; - - GridStackEngine.prototype._packNodes = function() { - this._sortNodes(); - - if (this.float) { - this.nodes.forEach(function(n, i) { - if (n._updating || n._packY === undefined || n.y === n._packY) { - return; - } - - var newY = n.y; - while (newY >= n._packY) { - var collisionNode = this.nodes - .slice(0, i) - .find(Utils._didCollide, {n: n, newY: newY}); - - if (!collisionNode) { - n._dirty = true; - n.y = newY; - } - --newY; - } - }, this); - } else { - this.nodes.forEach(function(n, i) { - if (n.locked) { return; } - while (n.y > 0) { - var newY = n.y - 1; - var canBeMoved = i === 0; - - if (i > 0) { - var collisionNode = this.nodes - .slice(0, i) - .find(Utils._didCollide, {n: n, newY: newY}); - canBeMoved = collisionNode === undefined; - } - - if (!canBeMoved) { break; } - // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions - // and move items back. The user 'change' CB should detect changes from the original - // starting position instead. - n._dirty = (n.y !== newY); - n.y = newY; - } - }, this); - } - }; - - GridStackEngine.prototype._prepareNode = function(node, resizing) { - node = node || {}; - // if we're missing position, have the grid position us automatically (before we set them to 0,0) - if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) { - node.autoPosition = true; - } - - // assign defaults for missing required fields - var defaults = {width: 1, height: 1, x: 0, y: 0}; - node = Utils.defaults(node, defaults); - - // convert any strings over - node.x = parseInt(node.x); - node.y = parseInt(node.y); - node.width = parseInt(node.width); - node.height = parseInt(node.height); - node.autoPosition = node.autoPosition || false; - node.noResize = node.noResize || false; - node.noMove = node.noMove || false; - - // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #) - if (Number.isNaN(node.x)) { node.x = defaults.x; node.autoPosition = true; } - if (Number.isNaN(node.y)) { node.y = defaults.y; node.autoPosition = true; } - if (Number.isNaN(node.width)) { node.width = defaults.width; } - if (Number.isNaN(node.height)) { node.height = defaults.height; } - - if (node.maxWidth !== undefined) { node.width = Math.min(node.width, node.maxWidth); } - if (node.maxHeight !== undefined) { node.height = Math.min(node.height, node.maxHeight); } - if (node.minWidth !== undefined) { node.width = Math.max(node.width, node.minWidth); } - if (node.minHeight !== undefined) { node.height = Math.max(node.height, node.minHeight); } - - if (node.width > this.column) { - node.width = this.column; - } else if (node.width < 1) { - node.width = 1; - } - if (this.maxRow && node.height > this.maxRow) { - node.height = this.maxRow; - } else if (node.height < 1) { - node.height = 1; - } - - if (node.x < 0) { - node.x = 0; - } - if (node.y < 0) { - node.y = 0; - } - - if (node.x + node.width > this.column) { - if (resizing) { - node.width = this.column - node.x; - } else { - node.x = this.column - node.width; - } - } - if (this.maxRow && node.y + node.height > this.maxRow) { - if (resizing) { - node.height = this.maxRow - node.y; - } else { - node.y = this.maxRow - node.height; - } - } - - return node; - }; - - GridStackEngine.prototype._notify = function() { - if (this._batchMode) { return; } - var args = Array.prototype.slice.call(arguments, 0); - args[0] = (args[0] === undefined ? [] : (Array.isArray(args[0]) ? args[0] : [args[0]]) ); - args[1] = (args[1] === undefined ? true : args[1]); - var dirtyNodes = args[0].concat(this.getDirtyNodes()); - this.onchange(dirtyNodes, args[1]); - }; - - GridStackEngine.prototype.cleanNodes = function() { - if (this._batchMode) { return; } - this.nodes.forEach(function(n) { delete n._dirty; }); - }; - - GridStackEngine.prototype.getDirtyNodes = function(verify) { - // compare original X,Y,W,H (or entire node?) instead as _dirty can be a temporary state - if (verify) { - var dirtNodes = []; - this.nodes.forEach(function (n) { - if (n._dirty) { - if (n.y === n._origY && n.x === n._origX && n.width === n._origW && n.height === n._origH) { - delete n._dirty; - } else { - dirtNodes.push(n); - } - } - }); - return dirtNodes; - } - - return this.nodes.filter(function(n) { return n._dirty; }); - }; - - GridStackEngine.prototype.addNode = function(node, triggerAddEvent) { - node = this._prepareNode(node); - - node._id = node._id || ++idSeq; - - if (node.autoPosition) { - this._sortNodes(); - - for (var i = 0;; ++i) { - var x = i % this.column; - var y = Math.floor(i / this.column); - if (x + node.width > this.column) { - continue; - } - if (!this.nodes.find(Utils._isAddNodeIntercepted, {x: x, y: y, node: node})) { - node.x = x; - node.y = y; - delete node.autoPosition; // found our slot - break; - } - } - } - - this.nodes.push(node); - if (triggerAddEvent) { - this._addedNodes.push(node); - } - - this._fixCollisions(node); - this._packNodes(); - this._notify(); - return node; - }; - - GridStackEngine.prototype.removeNode = function(node, detachNode) { - detachNode = (detachNode === undefined ? true : detachNode); - this._removedNodes.push(node); - node._id = null; // hint that node is being removed - this.nodes = Utils.without(this.nodes, node); - this._packNodes(); - this._notify(node, detachNode); - }; - - GridStackEngine.prototype.removeAll = function(detachNode) { - delete this._layouts; - if (this.nodes.length === 0) { return; } - detachNode = (detachNode === undefined ? true : detachNode); - this.nodes.forEach(function(n) { n._id = null; }); // hint that node is being removed - this._removedNodes = this.nodes; - this.nodes = []; - this._notify(this._removedNodes, detachNode); - }; - - GridStackEngine.prototype.canMoveNode = function(node, x, y, width, height) { - if (!this.isNodeChangedPosition(node, x, y, width, height)) { - return false; - } - var hasLocked = Boolean(this.nodes.find(function(n) { return n.locked; })); - - if (!this.maxRow && !hasLocked) { - return true; - } - - var clonedNode; - var clone = new GridStackEngine( - this.column, - null, - this.float, - 0, - this.nodes.map(function(n) { - if (n === node) { - clonedNode = $.extend({}, n); - return clonedNode; - } - return $.extend({}, n); - })); - - if (!clonedNode) { return true;} - - clone.moveNode(clonedNode, x, y, width, height); - - var res = true; - - if (hasLocked) { - res &= !Boolean(clone.nodes.find(function(n) { - return n !== clonedNode && Boolean(n.locked) && Boolean(n._dirty); - })); - } - if (this.maxRow) { - res &= clone.getRow() <= this.maxRow; - } - - return res; - }; - - GridStackEngine.prototype.canBePlacedWithRespectToHeight = function(node) { - if (!this.maxRow) { - return true; - } - - var clone = new GridStackEngine( - this.column, - null, - this.float, - 0, - this.nodes.map(function(n) { return $.extend({}, n); })); - clone.addNode(node); - return clone.getRow() <= this.maxRow; - }; - - GridStackEngine.prototype.isNodeChangedPosition = function(node, x, y, width, height) { - if (typeof x !== 'number') { x = node.x; } - if (typeof y !== 'number') { y = node.y; } - if (typeof width !== 'number') { width = node.width; } - if (typeof height !== 'number') { height = node.height; } - - if (node.maxWidth !== undefined) { width = Math.min(width, node.maxWidth); } - if (node.maxHeight !== undefined) { height = Math.min(height, node.maxHeight); } - if (node.minWidth !== undefined) { width = Math.max(width, node.minWidth); } - if (node.minHeight !== undefined) { height = Math.max(height, node.minHeight); } - - if (node.x === x && node.y === y && node.width === width && node.height === height) { - return false; - } - return true; - }; - - GridStackEngine.prototype.moveNode = function(node, x, y, width, height, noPack) { - if (typeof x !== 'number') { x = node.x; } - if (typeof y !== 'number') { y = node.y; } - if (typeof width !== 'number') { width = node.width; } - if (typeof height !== 'number') { height = node.height; } - - // constrain the passed in values and check if we're still changing our node - var resizing = (node.width !== width || node.height !== height); - var nn = { x: x, y: y, width: width, height: height, - maxWidth: node.maxWidth, maxHeight: NodeIterator.maxHeight, minWidth: node.minWidth, minHeight: node.minHeight}; - nn = this._prepareNode(nn, resizing); - if (node.x === nn.x && node.y === nn.y && node.width === nn.width && node.height === nn.height) { - return null; - } - - node._dirty = true; - - node.x = node.lastTriedX = nn.x; - node.y = node.lastTriedY = nn.y; - node.width = node.lastTriedWidth = nn.width; - node.height = node.lastTriedHeight = nn.height; - - this._fixCollisions(node); - if (!noPack) { - this._packNodes(); - this._notify(); - } - return node; - }; - - GridStackEngine.prototype.getRow = function() { - return this.nodes.reduce(function(memo, n) { return Math.max(memo, n.y + n.height); }, 0); - }; - - GridStackEngine.prototype.beginUpdate = function(node) { - if (node._updating) return; - node._updating = true; - this.nodes.forEach(function(n) { n._packY = n.y; }); - }; - - GridStackEngine.prototype.endUpdate = function() { - var n = this.nodes.find(function(n) { return n._updating; }); - if (n) { - n._updating = false; - this.nodes.forEach(function(n) { delete n._packY; }); - } - }; - - /** - * Construct a grid item from the given element and options - * @param {GridStackElement} el - * @param {GridstackOptions} opts - */ - var GridStack = function(el, opts) { - var self = this; - var oneColumnMode, _prevColumn, isAutoCellHeight; - - opts = opts || {}; - - this.$el = $(el); // TODO: legacy code - this.el = this.$el.get(0); // exposed HTML element to the user - - obsoleteOpts(opts, 'width', 'column', 'v0.5.3'); - obsoleteOpts(opts, 'height', 'maxRow', 'v0.5.3'); - obsoleteOptsDel(opts, 'oneColumnModeClass', 'v0.6.3', '. Use class `.grid-stack-1` instead'); - - // container attributes - obsoleteAttr(this.$el, 'data-gs-width', 'data-gs-column', 'v0.5.3'); - obsoleteAttr(this.$el, 'data-gs-height', 'data-gs-max-row', 'v0.5.3'); - obsoleteAttr(this.$el, 'data-gs-current-height', 'data-gs-current-row', 'v1.0.0'); - - opts.itemClass = opts.itemClass || 'grid-stack-item'; - var isNested = this.$el.closest('.' + opts.itemClass).length > 0; - - // if row property exists, replace minRow and maxRow instead - if (opts.row) { - opts.minRow = opts.maxRow = opts.row; - delete opts.row; - } - var rowAttr = parseInt(this.$el.attr('data-gs-row')); - - // elements attributes override any passed options (like CSS style) - merge the two together - this.opts = Utils.defaults(opts, { - column: parseInt(this.$el.attr('data-gs-column')) || 12, - minRow: rowAttr ? rowAttr : parseInt(this.$el.attr('data-gs-min-row')) || 0, - maxRow: rowAttr ? rowAttr : parseInt(this.$el.attr('data-gs-max-row')) || 0, - itemClass: 'grid-stack-item', - placeholderClass: 'grid-stack-placeholder', - placeholderText: '', - handle: '.grid-stack-item-content', - handleClass: null, - cellHeight: 60, - verticalMargin: 20, - auto: true, - minWidth: 768, - float: false, - staticGrid: false, - _class: 'grid-stack-instance-' + (Math.random() * 10000).toFixed(0), - animate: Boolean(this.$el.attr('data-gs-animate')) || false, - alwaysShowResizeHandle: opts.alwaysShowResizeHandle || false, - resizable: Utils.defaults(opts.resizable || {}, { - autoHide: !(opts.alwaysShowResizeHandle || false), - handles: 'se' - }), - draggable: Utils.defaults(opts.draggable || {}, { - handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || - '.grid-stack-item-content', - scroll: false, - appendTo: 'body' - }), - disableDrag: opts.disableDrag || false, - disableResize: opts.disableResize || false, - rtl: 'auto', - removable: false, - removableOptions: Utils.defaults(opts.removableOptions || {}, { - accept: '.' + opts.itemClass - }), - removeTimeout: 2000, - verticalMarginUnit: 'px', - cellHeightUnit: 'px', - disableOneColumnMode: opts.disableOneColumnMode || false, - oneColumnModeDomSort: opts.oneColumnModeDomSort, - ddPlugin: null - }); - - if (this.opts.ddPlugin === false) { - this.opts.ddPlugin = GridStackDragDropPlugin; - } else if (this.opts.ddPlugin === null) { - this.opts.ddPlugin = GridStackDragDropPlugin.registeredPlugins[0] || GridStackDragDropPlugin; - } - - this.dd = new this.opts.ddPlugin(this); - - if (this.opts.rtl === 'auto') { - this.opts.rtl = this.$el.css('direction') === 'rtl'; - } - - if (this.opts.rtl) { - this.$el.addClass('grid-stack-rtl'); - } - - this.opts.isNested = isNested; - - isAutoCellHeight = (this.opts.cellHeight === 'auto'); - if (isAutoCellHeight) { - // make the cell square initially - self.cellHeight(self.cellWidth(), true); - } else { - this.cellHeight(this.opts.cellHeight, true); - } - this.verticalMargin(this.opts.verticalMargin, true); - - this.$el.addClass(this.opts._class); - - this._setStaticClass(); - - if (isNested) { - this.$el.addClass('grid-stack-nested'); - } - - this._initStyles(); - - this.engine = new GridStackEngine(this.opts.column, function(nodes, detachNode) { - detachNode = (detachNode === undefined ? true : detachNode); - var maxHeight = 0; - this.nodes.forEach(function(n) { - maxHeight = Math.max(maxHeight, n.y + n.height); - }); - nodes.forEach(function(n) { - if (detachNode && n._id === null) { - if (n.el) { - $(n.el).remove(); - } - } else { - $(n.el) - .attr('data-gs-x', n.x) - .attr('data-gs-y', n.y) - .attr('data-gs-width', n.width) - .attr('data-gs-height', n.height); - } - }); - self._updateStyles(maxHeight + 10); - }, this.opts.float, this.opts.maxRow); - - if (this.opts.auto) { - var elements = []; - var _this = this; - this.$el.children('.' + this.opts.itemClass + ':not(.' + this.opts.placeholderClass + ')') - .each(function(index, el) { - el = $(el); - var x = parseInt(el.attr('data-gs-x')); - var y = parseInt(el.attr('data-gs-y')); - elements.push({ - el: el.get(0), - // if x,y are missing (autoPosition) add them to end of list - but keep their respective DOM order - i: (Number.isNaN(x) ? 1000 : x) + (Number.isNaN(y) ? 1000 : y) * _this.opts.column - }); - }); - Utils.sortBy(elements, function(x) { return x.i; }).forEach(function(item) { - this._prepareElement(item.el); - }, this); - } - this.engine._saveInitial(); // initial start of items - - this.setAnimation(this.opts.animate); - - this.placeholder = $( - '
' + - '
' + this.opts.placeholderText + '
').hide(); - - this._updateContainerHeight(); - - this._updateHeightsOnResize = Utils.throttle(function() { - self.cellHeight(self.cellWidth(), false); - }, 100); - - /** - * called when we are being resized - check if the one Column Mode needs to be turned on/off - * and remember the prev columns we used. - */ - this.onResizeHandler = function() { - if (isAutoCellHeight) { - self._updateHeightsOnResize(); - } - - if (self.opts.staticGrid) { return; } - - if (!self.opts.disableOneColumnMode && (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) <= self.opts.minWidth) { - if (self.oneColumnMode) { return; } - self.oneColumnMode = true; - self.column(1); - } else { - if (!self.oneColumnMode) { return; } - self.oneColumnMode = false; - self.column(self._prevColumn); - } - }; - - $(window).resize(this.onResizeHandler); - this.onResizeHandler(); - - if (!self.opts.staticGrid && typeof self.opts.removable === 'string') { - var trashZone = $(self.opts.removable); - if (!this.dd.isDroppable(trashZone)) { - this.dd.droppable(trashZone, self.opts.removableOptions); - } - this.dd - .on(trashZone, 'dropover', function(event, ui) { - var el = $(ui.draggable); - var node = el.data('_gridstack_node'); - if (!node || node._grid !== self) { - return; - } - el.data('inTrashZone', true); - self._setupRemovingTimeout(el); - }) - .on(trashZone, 'dropout', function(event, ui) { - var el = $(ui.draggable); - var node = el.data('_gridstack_node'); - if (!node || node._grid !== self) { - return; - } - el.data('inTrashZone', false); - self._clearRemovingTimeout(el); - }); - } - - if (!self.opts.staticGrid && self.opts.acceptWidgets) { - var draggingElement = null; - - var onDrag = function(event, ui) { - var el = draggingElement; - var node = el.data('_gridstack_node'); - var pos = self.getCellFromPixel({left: event.pageX, top: event.pageY}, true); - var x = Math.max(0, pos.x); - var y = Math.max(0, pos.y); - if (!node._added) { - node._added = true; - - node.el = el.get(0); - node.autoPosition = true; - node.x = x; - node.y = y; - self.engine.cleanNodes(); - self.engine.beginUpdate(node); - self.engine.addNode(node); - - self.$el.append(self.placeholder); - self.placeholder - .attr('data-gs-x', node.x) - .attr('data-gs-y', node.y) - .attr('data-gs-width', node.width) - .attr('data-gs-height', node.height) - .show(); - node.el = self.placeholder.get(0); - node._beforeDragX = node.x; - node._beforeDragY = node.y; - - self._updateContainerHeight(); - } - if (!self.engine.canMoveNode(node, x, y)) { - return; - } - self.engine.moveNode(node, x, y); - self._updateContainerHeight(); - }; - - this.dd - .droppable(self.$el, { - accept: function(el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (node && node._grid === self) { - return false; - } - return el.is(self.opts.acceptWidgets === true ? '.grid-stack-item' : self.opts.acceptWidgets); - } - }) - .on(self.$el, 'dropover', function(event, ui) { - var el = $(ui.draggable); - var width, height; - - // see if we already have a node with widget/height and check for attributes - var origNode = el.data('_gridstack_node'); - if (!origNode || !origNode.width || !origNode.height) { - var w = parseInt(el.attr('data-gs-width')); - if (w > 0) { origNode = origNode || {}; origNode.width = w; } - var h = parseInt(el.attr('data-gs-height')); - if (h > 0) { origNode = origNode || {}; origNode.height = h; } - } - - // if not calculate the grid size based on element outer size - // height: Each row is cellHeight + verticalMargin, until last one which has no margin below - var cellWidth = self.cellWidth(); - var cellHeight = self.cellHeight(); - var verticalMargin = self.opts.verticalMargin; - width = origNode && origNode.width ? origNode.width : Math.ceil(el.outerWidth() / cellWidth); - height = origNode && origNode.height ? origNode.height : Math.round((el.outerHeight() + verticalMargin) / (cellHeight + verticalMargin)); - - draggingElement = el; - - var node = self.engine._prepareNode({width: width, height: height, _added: false, _temporary: true}); - node.isOutOfGrid = true; - el.data('_gridstack_node', node); - el.data('_gridstack_node_orig', origNode); - - el.on('drag', onDrag); - return false; // prevent parent from receiving msg (which may be grid as well) - }) - .on(self.$el, 'dropout', function(event, ui) { - // jquery-ui bug. Must verify widget is being dropped out - // check node variable that gets set when widget is out of grid - var el = $(ui.draggable); - if (!el.data('_gridstack_node')) { - return; - } - var node = el.data('_gridstack_node'); - if (!node.isOutOfGrid) { - return; - } - el.unbind('drag', onDrag); - node.el = null; - self.engine.removeNode(node); - self.placeholder.detach(); - self._updateContainerHeight(); - el.data('_gridstack_node', el.data('_gridstack_node_orig')); - return false; // prevent parent from receiving msg (which may be grid as well) - }) - .on(self.$el, 'drop', function(event, ui) { - self.placeholder.detach(); - - var node = $(ui.draggable).data('_gridstack_node'); - node.isOutOfGrid = false; - node._grid = self; - var el = $(ui.draggable).clone(false); - el.data('_gridstack_node', node); - var originalNode = $(ui.draggable).data('_gridstack_node_orig'); - if (originalNode !== undefined && originalNode._grid !== undefined) { - originalNode._grid._triggerRemoveEvent(); - } - $(ui.helper).remove(); - node.el = el.get(0); - self.placeholder.hide(); - Utils.removePositioningStyles(el); - el.find('div.ui-resizable-handle').remove(); - - el - .attr('data-gs-x', node.x) - .attr('data-gs-y', node.y) - .attr('data-gs-width', node.width) - .attr('data-gs-height', node.height) - .addClass(self.opts.itemClass) - .enableSelection() - .removeData('draggable') - .removeClass('ui-draggable ui-draggable-dragging ui-draggable-disabled') - .unbind('drag', onDrag); - self.$el.append(el); - self._prepareElementsByNode(el, node); - self._updateContainerHeight(); - self.engine._addedNodes.push(node); - self._triggerAddEvent(); - self._triggerChangeEvent(); - - self.engine.endUpdate(); - $(ui.draggable).unbind('drag', onDrag); - $(ui.draggable).removeData('_gridstack_node'); - $(ui.draggable).removeData('_gridstack_node_orig'); - self.$el.trigger('dropped', [originalNode, node]); - return false; // prevent parent from receiving msg (which may be grid as well) - }); - } - }; - - GridStack.prototype._triggerChangeEvent = function(/*forceTrigger*/) { - if (this.engine._batchMode) { return; } - var elements = this.engine.getDirtyNodes(true); // verify they really changed - if (elements && elements.length) { - this.engine._layoutsNodesChange(elements); - this._triggerEvent('change', elements); - } - this.engine._saveInitial(); // we called, now reset initial values & dirty flags - }; - - GridStack.prototype._triggerAddEvent = function() { - if (this.engine._batchMode) { return; } - if (this.engine._addedNodes && this.engine._addedNodes.length > 0) { - this.engine._layoutsNodesChange(this.engine._addedNodes); - // prevent added nodes from also triggering 'change' event (which is called next) - this.engine._addedNodes.forEach(function (n) { delete n._dirty; }); - this._triggerEvent('added', this.engine._addedNodes); - this.engine._addedNodes = []; - } - }; - - GridStack.prototype._triggerRemoveEvent = function() { - if (this.engine._batchMode) { return; } - if (this.engine._removedNodes && this.engine._removedNodes.length > 0) { - this._triggerEvent('removed', this.engine._removedNodes); - this.engine._removedNodes = []; - } - }; - - GridStack.prototype._triggerEvent = function(name, data) { - var event = new CustomEvent(name, {detail: data}); - this.el.dispatchEvent(event); - }; - - GridStack.prototype._initStyles = function() { - if (this._stylesId) { - Utils.removeStylesheet(this._stylesId); - } - this._stylesId = 'gridstack-style-' + (Math.random() * 100000).toFixed(); - // insert style to parent (instead of 'head') to support WebComponent - this._styles = Utils.createStylesheet(this._stylesId, this.el.parentNode); - if (this._styles !== null) { - this._styles._max = 0; - } - }; - - GridStack.prototype._updateStyles = function(maxHeight) { - if (this._styles === null || this._styles === undefined) { - return; - } - - var prefix = '.' + this.opts._class + ' .' + this.opts.itemClass; - var self = this; - var getHeight; - - if (maxHeight === undefined) { - maxHeight = this._styles._max; - } - - this._initStyles(); - this._updateContainerHeight(); - if (!this.opts.cellHeight) { // The rest will be handled by CSS - return ; - } - if (this._styles._max !== 0 && maxHeight <= this._styles._max) { // Keep this._styles._max increasing - return ; - } - - if (!this.opts.verticalMargin || this.opts.cellHeightUnit === this.opts.verticalMarginUnit) { - getHeight = function(nbRows, nbMargins) { - return (self.opts.cellHeight * nbRows + self.opts.verticalMargin * nbMargins) + - self.opts.cellHeightUnit; - }; - } else { - getHeight = function(nbRows, nbMargins) { - if (!nbRows || !nbMargins) { - return (self.opts.cellHeight * nbRows + self.opts.verticalMargin * nbMargins) + - self.opts.cellHeightUnit; - } - return 'calc(' + ((self.opts.cellHeight * nbRows) + self.opts.cellHeightUnit) + ' + ' + - ((self.opts.verticalMargin * nbMargins) + self.opts.verticalMarginUnit) + ')'; - }; - } - - if (this._styles._max === 0) { - Utils.insertCSSRule(this._styles, prefix, 'min-height: ' + getHeight(1, 0) + ';', 0); - } - - if (maxHeight > this._styles._max) { - for (var i = this._styles._max; i < maxHeight; ++i) { - Utils.insertCSSRule(this._styles, - prefix + '[data-gs-height="' + (i + 1) + '"]', - 'height: ' + getHeight(i + 1, i) + ';', - i - ); - Utils.insertCSSRule(this._styles, - prefix + '[data-gs-min-height="' + (i + 1) + '"]', - 'min-height: ' + getHeight(i + 1, i) + ';', - i - ); - Utils.insertCSSRule(this._styles, - prefix + '[data-gs-max-height="' + (i + 1) + '"]', - 'max-height: ' + getHeight(i + 1, i) + ';', - i - ); - Utils.insertCSSRule(this._styles, - prefix + '[data-gs-y="' + i + '"]', - 'top: ' + getHeight(i, i) + ';', - i - ); - } - this._styles._max = maxHeight; - } - }; - - GridStack.prototype._updateContainerHeight = function() { - if (this.engine._batchMode) { return; } - var row = this.engine.getRow(); - if (row < this.opts.minRow) { - row = this.opts.minRow; - } - // check for css min height. Each row is cellHeight + verticalMargin, until last one which has no margin below - var cssMinHeight = parseInt(this.$el.css('min-height')); - if (cssMinHeight > 0) { - var verticalMargin = this.opts.verticalMargin; - var minRow = Math.round((cssMinHeight + verticalMargin) / (this.cellHeight() + verticalMargin)); - if (row < minRow) { - row = minRow; - } - } - this.$el.attr('data-gs-current-row', row); - if (!this.opts.cellHeight) { - return ; - } - if (!this.opts.verticalMargin) { - this.$el.css('height', (row * (this.opts.cellHeight)) + this.opts.cellHeightUnit); - } else if (this.opts.cellHeightUnit === this.opts.verticalMarginUnit) { - this.$el.css('height', (row * (this.opts.cellHeight + this.opts.verticalMargin) - - this.opts.verticalMargin) + this.opts.cellHeightUnit); - } else { - this.$el.css('height', 'calc(' + ((row * (this.opts.cellHeight)) + this.opts.cellHeightUnit) + - ' + ' + ((row * (this.opts.verticalMargin - 1)) + this.opts.verticalMarginUnit) + ')'); - } - }; - - GridStack.prototype._setupRemovingTimeout = function(el) { - var self = this; - var node = $(el).data('_gridstack_node'); - - if (node._removeTimeout || !self.opts.removable) { - return; - } - node._removeTimeout = setTimeout(function() { - el.addClass('grid-stack-item-removing'); - node._isAboutToRemove = true; - }, self.opts.removeTimeout); - }; - - GridStack.prototype._clearRemovingTimeout = function(el) { - var node = $(el).data('_gridstack_node'); - - if (!node._removeTimeout) { - return; - } - clearTimeout(node._removeTimeout); - node._removeTimeout = null; - el.removeClass('grid-stack-item-removing'); - node._isAboutToRemove = false; - }; - - GridStack.prototype._prepareElementsByNode = function(el, node) { - var self = this; - - var cellWidth; - var cellFullHeight; // internal cellHeight + v-margin - - var dragOrResize = function(event, ui) { - var x = Math.round(ui.position.left / cellWidth); - var y = Math.floor((ui.position.top + cellFullHeight / 2) / cellFullHeight); - var width; - var height; - - if (event.type === 'drag') { - var distance = ui.position.top - node._prevYPix; - node._prevYPix = ui.position.top; - Utils.updateScrollPosition(el[0], ui, distance); - if (el.data('inTrashZone') || x < 0 || x >= self.engine.column || y < 0 || - (!self.engine.float && y > self.engine.getRow())) { - if (!node._temporaryRemoved) { - if (self.opts.removable === true) { - self._setupRemovingTimeout(el); - } - - x = node._beforeDragX; - y = node._beforeDragY; - - self.placeholder.detach(); - self.placeholder.hide(); - self.engine.removeNode(node); - self._updateContainerHeight(); - - node._temporaryRemoved = true; - } else { - return; - } - } else { - self._clearRemovingTimeout(el); - - if (node._temporaryRemoved) { - self.engine.addNode(node); - self.placeholder - .attr('data-gs-x', x) - .attr('data-gs-y', y) - .attr('data-gs-width', width) - .attr('data-gs-height', height) - .show(); - self.$el.append(self.placeholder); - node.el = self.placeholder.get(0); - node._temporaryRemoved = false; - } - } - } else if (event.type === 'resize') { - if (x < 0) return; - width = Math.round(ui.size.width / cellWidth); - height = Math.round((ui.size.height + self.verticalMargin()) / cellFullHeight); - } - // width and height are undefined if not resizing - var lastTriedWidth = width !== undefined ? width : node.lastTriedWidth; - var lastTriedHeight = height !== undefined ? height : node.lastTriedHeight; - if (!self.engine.canMoveNode(node, x, y, width, height) || - (node.lastTriedX === x && node.lastTriedY === y && - node.lastTriedWidth === lastTriedWidth && node.lastTriedHeight === lastTriedHeight)) { - return; - } - node.lastTriedX = x; - node.lastTriedY = y; - node.lastTriedWidth = width; - node.lastTriedHeight = height; - self.engine.moveNode(node, x, y, width, height); - self._updateContainerHeight(); - - if (event.type === 'resize') { - $(event.target).trigger('gsresize', node); - } - }; - - var onStartMoving = function(event, ui) { - self.$el.append(self.placeholder); - var o = $(this); - self.engine.cleanNodes(); - self.engine.beginUpdate(node); - cellWidth = self.cellWidth(); - var strictCellHeight = self.cellHeight(); // heigh without v-margin - // compute height with v-margin (Note: we add 1 margin as last row is missing it) - cellFullHeight = (self.$el.height() + self.verticalMargin()) / parseInt(self.$el.attr('data-gs-current-row')); - self.placeholder - .attr('data-gs-x', o.attr('data-gs-x')) - .attr('data-gs-y', o.attr('data-gs-y')) - .attr('data-gs-width', o.attr('data-gs-width')) - .attr('data-gs-height', o.attr('data-gs-height')) - .show(); - node.el = self.placeholder.get(0); - node._beforeDragX = node.x; - node._beforeDragY = node.y; - node._prevYPix = ui.position.top; - var minHeight = (node.minHeight || 1); - var verticalMargin = self.opts.verticalMargin; - - // mineHeight - Each row is cellHeight + verticalMargin, until last one which has no margin below - self.dd.resizable(el, 'option', 'minWidth', cellWidth * (node.minWidth || 1)); - self.dd.resizable(el, 'option', 'minHeight', (strictCellHeight * minHeight) + (minHeight - 1) * verticalMargin); - - if (event.type === 'resizestart') { - o.find('.grid-stack-item').trigger('resizestart'); - } - }; - - var onEndMoving = function(event, ui) { - var o = $(this); - if (!o.data('_gridstack_node')) { - return; - } - - // var forceNotify = false; what is the point of calling 'change' event with no data, when the 'removed' event is already called ? - self.placeholder.detach(); - node.el = o.get(0); - self.placeholder.hide(); - - if (node._isAboutToRemove) { - // forceNotify = true; - var gridToNotify = el.data('_gridstack_node')._grid; - gridToNotify._triggerRemoveEvent(); - el.removeData('_gridstack_node'); - el.remove(); - } else { - self._clearRemovingTimeout(el); - if (!node._temporaryRemoved) { - Utils.removePositioningStyles(o); - o - .attr('data-gs-x', node.x) - .attr('data-gs-y', node.y) - .attr('data-gs-width', node.width) - .attr('data-gs-height', node.height); - } else { - Utils.removePositioningStyles(o); - o - .attr('data-gs-x', node._beforeDragX) - .attr('data-gs-y', node._beforeDragY) - .attr('data-gs-width', node.width) - .attr('data-gs-height', node.height); - node.x = node._beforeDragX; - node.y = node._beforeDragY; - node._temporaryRemoved = false; - self.engine.addNode(node); - } - } - self._updateContainerHeight(); - self._triggerChangeEvent(/*forceNotify*/); - - self.engine.endUpdate(); - - var nestedGrids = o.find('.grid-stack'); - if (nestedGrids.length && event.type === 'resizestop') { - nestedGrids.each(function(index, el) { - el.gridstack.onResizeHandler(); - }); - o.find('.grid-stack-item').trigger('resizestop'); - o.find('.grid-stack-item').trigger('gsresizestop'); - } - if (event.type === 'resizestop') { - self.$el.trigger('gsresizestop', o); - } - }; - - this.dd - .draggable(el, { - start: onStartMoving, - stop: onEndMoving, - drag: dragOrResize - }) - .resizable(el, { - start: onStartMoving, - stop: onEndMoving, - resize: dragOrResize - }); - - if (node.noMove || this.opts.disableDrag || this.opts.staticGrid) { - this.dd.draggable(el, 'disable'); - } - - if (node.noResize || this.opts.disableResize || this.opts.staticGrid) { - this.dd.resizable(el, 'disable'); - } - - this._writeAttr(el, node); - }; - - GridStack.prototype._prepareElement = function(el, triggerAddEvent) { - triggerAddEvent = triggerAddEvent !== undefined ? triggerAddEvent : false; - var self = this; - el = $(el); - - el.addClass(this.opts.itemClass); - var node = this._readAttr(el, {el: el.get(0), _grid: self}); - node = self.engine.addNode(node, triggerAddEvent); - el.data('_gridstack_node', node); - - this._prepareElementsByNode(el, node); - }; - - /** call to write any default attributes back to element */ - GridStack.prototype._writeAttr = function(el, node) { - el = $(el); - node = node || {}; - // Note: passing null removes the attr in jquery - if (node.x !== undefined) { el.attr('data-gs-x', node.x); } - if (node.y !== undefined) { el.attr('data-gs-y', node.y); } - if (node.width !== undefined) { el.attr('data-gs-width', node.width); } - if (node.height !== undefined) { el.attr('data-gs-height', node.height); } - if (node.autoPosition !== undefined) { el.attr('data-gs-auto-position', node.autoPosition ? true : null); } - if (node.minWidth !== undefined) { el.attr('data-gs-min-width', node.minWidth); } - if (node.maxWidth !== undefined) { el.attr('data-gs-max-width', node.maxWidth); } - if (node.minHeight !== undefined) { el.attr('data-gs-min-height', node.minHeight); } - if (node.maxHeight !== undefined) { el.attr('data-gs-max-height', node.maxHeight); } - if (node.noResize !== undefined) { el.attr('data-gs-no-resize', node.noResize ? true : null); } - if (node.noMove !== undefined) { el.attr('data-gs-no-move', node.noMove ? true : null); } - if (node.locked !== undefined) { el.attr('data-gs-locked', node.locked ? true : null); } - if (node.resizeHandles !== undefined) { el.attr('data-gs-resize-handles', node.resizeHandles); } - if (node.id !== undefined) { el.attr('data-gs-id', node.id); } - }; - - /** call to write any default attributes back to element */ - GridStack.prototype._readAttr = function(el, node) { - el = $(el); - node = node || {}; - node.x = el.attr('data-gs-x'); - node.y = el.attr('data-gs-y'); - node.width = el.attr('data-gs-width'); - node.height = el.attr('data-gs-height'); - node.autoPosition = Utils.toBool(el.attr('data-gs-auto-position')); - node.maxWidth = el.attr('data-gs-max-width'); - node.minWidth = el.attr('data-gs-min-width'); - node.maxHeight = el.attr('data-gs-max-height'); - node.minHeight = el.attr('data-gs-min-height'); - node.noResize = Utils.toBool(el.attr('data-gs-no-resize')); - node.noMove = Utils.toBool(el.attr('data-gs-no-move')); - node.locked = Utils.toBool(el.attr('data-gs-locked')); - node.resizeHandles = el.attr('data-gs-resize-handles'); - node.id = el.attr('data-gs-id'); - return node; - }; - - GridStack.prototype.setAnimation = function(enable) { - if (enable) { - this.$el.addClass('grid-stack-animate'); - } else { - this.$el.removeClass('grid-stack-animate'); - } - }; - - GridStack.prototype.addWidget = function(el, opt, y, width, height, autoPosition, minWidth, maxWidth, minHeight, maxHeight, id) { - - // new way of calling with an object - make sure all items have been properly initialized - if (opt === undefined || typeof opt === 'object') { - // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos - // as the actual value are filled in when _prepareElement() calls el.attr('data-gs-xyz) before adding the node. - // opt = this.engine._prepareNode(opt); - } else { - // old legacy way of calling with items spelled out - call us back with single object instead (so we can properly initialized values) - return this.addWidget(el, {x: opt, y: y, width: width, height: height, autoPosition: autoPosition, - minWidth: minWidth, maxWidth: maxWidth, minHeight: minHeight, maxHeight: maxHeight, id: id}); - } - - el = $(el); - if (opt) { // see knockout above - this.engine._prepareNode(opt); - } - this._writeAttr(el, opt); - this.$el.append(el); - return this.makeWidget(el); - }; - - GridStack.prototype.makeWidget = function(el) { - el = $(el); - this._prepareElement(el, true); - this._updateContainerHeight(); - this._triggerAddEvent(); - this._triggerChangeEvent(true); // trigger any other changes - - return el.get(0); - }; - - GridStack.prototype.willItFit = function(x, y, width, height, autoPosition) { - var node = {x: x, y: y, width: width, height: height, autoPosition: autoPosition}; - return this.engine.canBePlacedWithRespectToHeight(node); - }; - - GridStack.prototype.removeWidget = function(el, detachNode) { - detachNode = (detachNode === undefined ? true : detachNode); - el = $(el); - var node = el.data('_gridstack_node'); - // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272 - if (!node) { - node = this.engine.getNodeDataByDOMEl(el.get(0)); - } - - el.removeData('_gridstack_node'); - this.engine.removeNode(node, detachNode); - this._triggerRemoveEvent(); - this._triggerChangeEvent(true); // trigger any other changes - }; - - GridStack.prototype.removeAll = function(detachNode) { - if (detachNode !== false) { - // remove our data structure before list gets emptied and DOM elements stay behind - this.engine.nodes.forEach(function(node) { $(node.el).removeData('_gridstack_node') }); - } - this.engine.removeAll(detachNode); - this._triggerRemoveEvent(); - }; - - GridStack.prototype.destroy = function(detachGrid) { - $(window).off('resize', this.onResizeHandler); - this.disable(); - if (detachGrid !== undefined && !detachGrid) { - this.removeAll(false); - delete this.$el.get(0).gridstack; - } else { - this.$el.remove(); - } - Utils.removeStylesheet(this._stylesId); - if (this.engine) { - this.engine = null; - } - }; - - GridStack.prototype.resizable = function(el, val) { - var self = this; - el = $(el); - el.each(function(index, el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (!node) { return; } - node.noResize = !(val || false); - if (node.noResize) { - self.dd.resizable(el, 'disable'); - } else { - self.dd.resizable(el, 'enable'); - } - }); - return this; - }; - - GridStack.prototype.movable = function(el, val) { - var self = this; - el = $(el); - el.each(function(index, el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (!node) { return; } - node.noMove = !(val || false); - if (node.noMove) { - self.dd.draggable(el, 'disable'); - el.removeClass('ui-draggable-handle'); - } else { - self.dd.draggable(el, 'enable'); - el.addClass('ui-draggable-handle'); - } - }); - return this; - }; - - GridStack.prototype.enableMove = function(doEnable, includeNewWidgets) { - this.movable(this.$el.children('.' + this.opts.itemClass), doEnable); - if (includeNewWidgets) { - this.opts.disableDrag = !doEnable; - } - }; - - GridStack.prototype.enableResize = function(doEnable, includeNewWidgets) { - this.resizable(this.$el.children('.' + this.opts.itemClass), doEnable); - if (includeNewWidgets) { - this.opts.disableResize = !doEnable; - } - }; - - GridStack.prototype.disable = function() { - this.movable(this.$el.children('.' + this.opts.itemClass), false); - this.resizable(this.$el.children('.' + this.opts.itemClass), false); - this.$el.trigger('disable'); - }; - - GridStack.prototype.enable = function() { - this.movable(this.$el.children('.' + this.opts.itemClass), true); - this.resizable(this.$el.children('.' + this.opts.itemClass), true); - this.$el.trigger('enable'); - }; - - GridStack.prototype.locked = function(el, val) { - el = $(el); - el.each(function(index, el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (!node) { return; } - node.locked = (val || false); - el.attr('data-gs-locked', node.locked ? 'yes' : null); - }); - return this; - }; - - GridStack.prototype.maxHeight = function(el, val) { - el = $(el); - el.each(function(index, el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (!node) { return; } - if (!isNaN(val)) { - node.maxHeight = (val || false); - el.attr('data-gs-max-height', val); - } - }); - return this; - }; - - GridStack.prototype.minHeight = function(el, val) { - el = $(el); - el.each(function(index, el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (!node) { return; } - if (!isNaN(val)) { - node.minHeight = (val || false); - el.attr('data-gs-min-height', val); - } - }); - return this; - }; - - GridStack.prototype.maxWidth = function(el, val) { - el = $(el); - el.each(function(index, el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (!node) { return; } - if (!isNaN(val)) { - node.maxWidth = (val || false); - el.attr('data-gs-max-width', val); - } - }); - return this; - }; - - GridStack.prototype.minWidth = function(el, val) { - el = $(el); - el.each(function(index, el) { - el = $(el); - var node = el.data('_gridstack_node'); - if (!node) { return; } - if (!isNaN(val)) { - node.minWidth = (val || false); - el.attr('data-gs-min-width', val); - } - }); - return this; - }; - - GridStack.prototype._updateElement = function(el, callback) { - el = $(el).first(); - var node = el.data('_gridstack_node'); - if (!node) { return; } - var self = this; - - self.engine.cleanNodes(); - self.engine.beginUpdate(node); - - callback.call(this, el, node); - - self._updateContainerHeight(); - self._triggerChangeEvent(); - - self.engine.endUpdate(); - }; - - GridStack.prototype.resize = function(el, width, height) { - this._updateElement(el, function(el, node) { - width = (width !== null && width !== undefined) ? width : node.width; - height = (height !== null && height !== undefined) ? height : node.height; - - this.engine.moveNode(node, node.x, node.y, width, height); - }); - }; - - GridStack.prototype.move = function(el, x, y) { - this._updateElement(el, function(el, node) { - x = (x !== null && x !== undefined) ? x : node.x; - y = (y !== null && y !== undefined) ? y : node.y; - - this.engine.moveNode(node, x, y, node.width, node.height); - }); - }; - - GridStack.prototype.update = function(el, x, y, width, height) { - this._updateElement(el, function(el, node) { - x = (x !== null && x !== undefined) ? x : node.x; - y = (y !== null && y !== undefined) ? y : node.y; - width = (width !== null && width !== undefined) ? width : node.width; - height = (height !== null && height !== undefined) ? height : node.height; - - this.engine.moveNode(node, x, y, width, height); - }); - }; - - /** - * relayout grid items to reclaim any empty space - */ - GridStack.prototype.compact = function() { - if (this.engine.nodes.length === 0) { return; } - this.batchUpdate(); - this.engine._sortNodes(); - var nodes = this.engine.nodes; - this.engine.nodes = []; // pretend we have no nodes to conflict layout to start with... - nodes.forEach(function(node) { - if (!node.noMove && !node.locked) { - node.autoPosition = true; - } - this.engine.addNode(node, false); // 'false' for add event trigger - node._dirty = true; // force attr update - }, this); - this.commit(); - }; - - GridStack.prototype.verticalMargin = function(val, noUpdate) { - if (val === undefined) { - return this.opts.verticalMargin; - } - - var heightData = Utils.parseHeight(val); - - if (this.opts.verticalMarginUnit === heightData.unit && this.opts.maxRow === heightData.height) { - return ; - } - this.opts.verticalMarginUnit = heightData.unit; - this.opts.verticalMargin = heightData.height; - - if (!noUpdate) { - this._updateStyles(); - } - }; - - /** set/get the current cell height value */ - GridStack.prototype.cellHeight = function(val, noUpdate) { - // getter - returns the opts stored height else compute it... - if (val === undefined) { - if (this.opts.cellHeight && this.opts.cellHeight !== 'auto') { - return this.opts.cellHeight; - } - // compute the height taking margin into account (each row has margin other than last one) - var o = this.$el.children('.' + this.opts.itemClass).first(); - var height = o.attr('data-gs-height'); - var verticalMargin = this.opts.verticalMargin; - return Math.round((o.outerHeight() - (height - 1) * verticalMargin) / height); - } - - // setter - updates the cellHeight value if they changed - var heightData = Utils.parseHeight(val); - if (this.opts.cellHeightUnit === heightData.unit && this.opts.cellHeight === heightData.height) { - return ; - } - this.opts.cellHeightUnit = heightData.unit; - this.opts.cellHeight = heightData.height; - - if (!noUpdate) { - this._updateStyles(); - } - }; - - GridStack.prototype.cellWidth = function() { - // TODO: take margin into account ($horizontal_padding in .scss) to make cellHeight='auto' square ? (see 810-many-columns.html) - return Math.round(this.$el.outerWidth() / this.opts.column); - }; - - GridStack.prototype.getCellFromPixel = function(position, useOffset) { - var containerPos = (useOffset !== undefined && useOffset) ? - this.$el.offset() : this.$el.position(); - var relativeLeft = position.left - containerPos.left; - var relativeTop = position.top - containerPos.top; - - var columnWidth = Math.floor(this.$el.width() / this.opts.column); - var rowHeight = Math.floor(this.$el.height() / parseInt(this.$el.attr('data-gs-current-row'))); - - return {x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight)}; - }; - - GridStack.prototype.batchUpdate = function() { - this.engine.batchUpdate(); - }; - - GridStack.prototype.commit = function() { - this.engine.commit(); - this._triggerRemoveEvent(); - this._triggerAddEvent(); - this._triggerChangeEvent(); - }; - - GridStack.prototype.isAreaEmpty = function(x, y, width, height) { - return this.engine.isAreaEmpty(x, y, width, height); - }; - - GridStack.prototype.setStatic = function(staticValue) { - this.opts.staticGrid = (staticValue === true); - this.enableMove(!staticValue); - this.enableResize(!staticValue); - this._setStaticClass(); - }; - - GridStack.prototype._setStaticClass = function() { - var staticClassName = 'grid-stack-static'; - - if (this.opts.staticGrid === true) { - this.$el.addClass(staticClassName); - } else { - this.$el.removeClass(staticClassName); - } - }; - - /** called whenever a node is added or moved - updates the cached layouts */ - GridStackEngine.prototype._layoutsNodesChange = function(nodes) { - if (!this._layouts || this._ignoreLayoutsNodeChange) return; - // remove smaller layouts - we will re-generate those on the fly... larger ones need to update - this._layouts.forEach(function(layout, column) { - if (!layout || column === this.column) return; - if (column < this.column) { - this._layouts[column] = undefined; - } - else { - // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better. - // Note: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. - nodes.forEach(function(node) { - var n = layout.find(function(l) { return l._id === node._id }); - if (!n) return; // no cache for new nodes. Will use those values. - var ratio = column / this.column; - // Y changed, push down same amount - // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode) - if (node.y !== node._origY) { - n.y += (node.y - node._origY); - } - // X changed, scale from new position - if (node.x !== node._origX) { - n.x = Math.round(node.x * ratio); - } - // width changed, scale from new width - if (node.width !== node._origW) { - n.width = Math.round(node.width * ratio); - } - // ...height always carries over from cache - }, this); - } - }, this); - } - - /** - * Called to scale the widget width & position up/down based on the column change. - * Note we store previous layouts (especially original ones) to make it possible to go - * from say 12 -> 1 -> 12 and get back to where we were. - * - * oldColumn: previous number of columns - * column: new column number - * nodes?: different sorted list (ex: DOM order) instead of current list - */ - GridStackEngine.prototype._updateNodeWidths = function(oldColumn, column, nodes) { - if (!this.nodes.length || oldColumn === column) { return; } - - // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data - var copy = [this.nodes.length]; - this.nodes.forEach(function(n, i) {copy[i] = {x: n.x, y: n.y, width: n.width, _id: n._id}}); // only thing we change is x,y,w and id to find it back - this._layouts = this._layouts || []; // use array to find larger quick - this._layouts[oldColumn] = copy; - - // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout - if (column === 1 && nodes && nodes.length) { - var top = 0; - nodes.forEach(function(n) { - n.x = 0; - n.width = 1; - n.y = Math.max(n.y, top); - top = n.y + n.height; - }); - } else { - nodes = Utils.sort(this.nodes, -1, oldColumn); // current column reverse sorting so we can insert last to front (limit collision) - } - - // see if we have cached previous layout. - var cacheNodes = this._layouts[column] || []; - // if not AND we are going up in size start with the largest layout as down-scaling is more accurate - var lastIndex = this._layouts.length - 1; - if (cacheNodes.length === 0 && column > oldColumn && column < lastIndex) { - cacheNodes = this._layouts[lastIndex] || []; - if (cacheNodes.length) { - // pretend we came from that larger column by assigning those values as starting point - oldColumn = lastIndex; - cacheNodes.forEach(function(cacheNode) { - var j = nodes.findIndex(function(n) {return n && n._id === cacheNode._id}); - if (j !== -1) { - // still current, use cache info positions - nodes[j].x = cacheNode.x; - nodes[j].y = cacheNode.y; - nodes[j].width = cacheNode.width; - } - }); - cacheNodes = []; // we still don't have new column cached data... will generate from larger one. - } - } - - // if we found cache re-use those nodes that are still current - var newNodes = []; - cacheNodes.forEach(function(cacheNode) { - var j = nodes.findIndex(function(n) {return n && n._id === cacheNode._id}); - if (j !== -1) { - // still current, use cache info positions - nodes[j].x = cacheNode.x; - nodes[j].y = cacheNode.y; - nodes[j].width = cacheNode.width; - newNodes.push(nodes[j]); - nodes[j] = null; // erase it so we know what's left - } - }); - // ...and add any extra non-cached ones - var ratio = column / oldColumn; - nodes.forEach(function(node) { - if (!node) return; - node.x = (column === 1 ? 0 : Math.round(node.x * ratio)); - node.width = ((column === 1 || oldColumn === 1) ? 1 : (Math.round(node.width * ratio) || 1)); - newNodes.push(node); - }); - - // finally relayout them in reverse order (to get correct placement) - newNodes = Utils.sort(newNodes, -1, column); - this._ignoreLayoutsNodeChange = true; - this.batchUpdate(); - this.nodes = []; // pretend we have no nodes to start with (we use same structures) to simplify layout - newNodes.forEach(function(node) { - this.addNode(node, false); // 'false' for add event trigger - node._dirty = true; // force attr update - }, this); - this.commit(); - delete this._ignoreLayoutsNodeChange; - } - - /** called to save initial position/size */ - GridStackEngine.prototype._saveInitial = function() { - this.nodes.forEach(function(n) { - n._origX = n.x; - n._origY = n.y; - n._origW = n.width; - n._origH = n.height; - delete n._dirty; - }); - } - - /** - * set/get number of columns in the grid. Will attempt to update existing widgets - * to conform to new number of columns. Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11], - * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns) - * @param column - Integer > 0 (default 12). - * @param doNotPropagate if true existing widgets will not be updated (optional) - */ - GridStack.prototype.column = function(column, doNotPropagate) { - // getter - returns the opts stored mode - if (column === undefined) { - return this.opts.column; - } - // setter - if (this.opts.column === column) { return; } - var oldColumn = this.opts.column; - - // if we go into 1 column mode (which happens if we're sized less than minWidth unless disableOneColumnMode is on) - // then remember the original columns so we can restore. - if (column === 1) { - this._prevColumn = oldColumn; - } else { - delete this._prevColumn; - } - - this.$el.removeClass('grid-stack-' + oldColumn); - this.$el.addClass('grid-stack-' + column); - this.opts.column = this.engine.column = column; - - if (doNotPropagate === true) { return; } - - // update the items now - see if the dom order nodes should be passed instead (else default to current list) - var domNodes; - if (this.opts.oneColumnModeDomSort && column === 1) { - domNodes = []; - this.$el.children('.' + this.opts.itemClass).each(function(index, el) { - var node = $(el).data('_gridstack_node'); - if (node) { domNodes.push(node); } - }); - if (!domNodes.length) { domNodes = undefined; } - } - this.engine._updateNodeWidths(oldColumn, column, domNodes); - - // and trigger our event last... - this.engine._ignoreLayoutsNodeChange = true; - this._triggerChangeEvent(); - delete this.engine._ignoreLayoutsNodeChange; - }; - - GridStack.prototype.float = function(val) { - // getter - returns the opts stored mode - if (val === undefined) { - return this.opts.float || false; - } - // setter - updates the mode and relayout if gravity is back on - if (this.opts.float === val) { return; } - this.opts.float = this.engine.float = val || false; - if (!val) { - this.engine._packNodes(); - this.engine._notify(); - this._triggerChangeEvent(); - } - }; - - GridStack.prototype.getRow = function() { - return this.engine.getRow(); - } - - /** Event handler that extracts our CustomEvent data out automatically for receiving custom - * notifications (see doc for supported events) - */ - GridStack.prototype.on = function(eventName, callback) { - // check for array of names being passed instead - if (eventName.indexOf(' ') !== -1) { - var names = eventName.split(' '); - names.forEach(function(name) { this.on(name, callback) }, this); - return; - } - - if (eventName === 'change' || eventName === 'added' || eventName === 'removed') { - // native CustomEvent handlers - cash the generic handlers so we can remove - this._gsEventHandler = this._gsEventHandler || {}; - this._gsEventHandler[eventName] = function(event) { callback(event, event.detail) }; - this.el.addEventListener(eventName, this._gsEventHandler[eventName]); - } else { - // still JQuery events - this.$el.on(eventName, callback); - } - } - - /** unsubscribe from the 'on' event */ - GridStack.prototype.off = function(eventName) { - // check for array of names being passed instead - if (eventName.indexOf(' ') !== -1) { - var names = eventName.split(' '); - names.forEach(function(name) { this.off(name, callback) }, this); - return; - } - - if (eventName === 'change' || eventName === 'added' || eventName === 'removed') { - // remove native CustomEvent handlers - if (this._gsEventHandler && this._gsEventHandler[eventName]) { - this.el.removeEventListener(eventName, this._gsEventHandler[eventName]); - delete this._gsEventHandler[eventName]; - } - } else { - // still JQuery events - this.$el.off(eventName); - } - } - - // legacy method renames - GridStack.prototype.setGridWidth = obsolete(GridStack.prototype.column, 'setGridWidth', 'column', 'v0.5.3'); - GridStack.prototype.setColumn = obsolete(GridStack.prototype.column, 'setColumn', 'column', 'v0.6.4'); - GridStackEngine.prototype.getGridHeight = obsolete(GridStackEngine.prototype.getRow, 'getGridHeight', 'getRow', 'v1.0.0'); - - scope.GridStack = GridStack; - scope.GridStack.Utils = Utils; - scope.GridStack.Engine = GridStackEngine; - scope.GridStack.DragDropPlugin = GridStackDragDropPlugin; - - /** - * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will - * simply return the existing instance (ignore any passed options). - */ - GridStack.init = function(opts, elOrString) { - if (!elOrString) { elOrString = '.grid-stack' } - var el = $(elOrString).get(0); - if (!el) return; - if (!el.gridstack) { - el.gridstack = new GridStack(el, opts); - } - return el.gridstack - }; - - /** - * Will initialize a list of elements (given a selector) and return an array of grids. - */ - GridStack.initAll = function(opts, selector) { - if (!selector) { selector = '.grid-stack' } - var grids = []; - $(selector).each(function(index, el) { - if (!el.gridstack) { - el.gridstack = new GridStack(el, opts); - } - grids.push(el.gridstack); - }); - return grids; - }; - - return scope.GridStack; -}); diff --git a/src/gridstack.scss b/src/gridstack.scss index 07be076d0..a699197da 100644 --- a/src/gridstack.scss +++ b/src/gridstack.scss @@ -1,5 +1,5 @@ /*! - * required gridstack 1.1.0-dev CSS for default 12 and 1 columnMode size. Use gridstack-extra.css for others + * required gridstack 2.0.0-rc CSS for default 12 and 1 columnMode size. Use gridstack-extra.css for others * https://gridstackjs.com/ * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov * gridstack.js may be freely distributed under the MIT license. diff --git a/src/gridstack.ts b/src/gridstack.ts new file mode 100644 index 000000000..f298c4958 --- /dev/null +++ b/src/gridstack.ts @@ -0,0 +1,1586 @@ +// gridstack.ts 2.0.0-rc @preserve + +/** + * https://gridstackjs.com/ + * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov + * gridstack.js may be freely distributed under the MIT license. +*/ + +import { GridStackEngine } from './gridstack-engine' +import { obsoleteOpts, obsoleteOptsDel, obsoleteAttr, obsolete, Utils } from './utils'; +import { GridStackElement, GridItemHTMLElement, GridstackWidget, GridStackNode, GridstackOptions, numberOrString } from './types'; +import { GridStackDragDropPlugin } from './gridstack-dragdrop-plugin'; + +// TODO: TEMPORARY until we remove all jquery calls +// also see https://stackoverflow.com/questions/35345760/importing-jqueryui-with-typescript-and-requirejs +import * as $ from './jquery.js'; + +export interface GridHTMLElement extends HTMLElement { + gridstack?: GridStack; // grid's parent DOM element points back to grid class +} +export type GridStackEvent = 'added' | 'change' | 'disable' | 'dragstart' | 'dragstop' | 'dropped' | + 'enable' | 'removed' | 'resize' | 'resizestart' | 'gsresizestop'; + +/** Defines the coordinates of an object */ +export interface MousePosition { + top: number; + left: number; +} + +/** Defines the position of a cell inside the grid*/ +export interface CellPosition { + x: number; + y: number; +} + +interface GridCSSStyleSheet extends CSSStyleSheet { + _max?: number; // internal tracker of the max # of rows we created +} + +/** + * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid. + * Note: your grid elements MUST have the following classes for the CSS layout to work: + * @example + *
+ *
+ *
Item 1
+ *
+ *
+ */ +export class GridStack { + + /** + * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will + * simply return the existing instance (ignore any passed options). There is also an initAll() version that support + * multiple grids initialization at once. + * @param options grid options (optional) + * @param elOrString element to convert to a grid (default to '.grid-stack' class selector) + * + * @example + * const grid = GridStack.init(); + * + * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later + * const grid = document.querySelector('.grid-stack').gridstack; + */ + public static init(options?: GridstackOptions, elOrString: GridStackElement = '.grid-stack'): GridStack { + const el: GridHTMLElement = (typeof elOrString === 'string' ? document.querySelector(elOrString) : elOrString); + if (!el) { + if (typeof elOrString === 'string') { + console.error('gridstack.js: init() no grid was found. Did you forget class ' + elOrString + ' on your element ?'); + console.error('".grid-stack" is required for proper CSS styling and drag/drop.'); + } else { + console.error('gridstack.js: init() no grid element was passed.'); + } + return; + } + if (!el.gridstack) { + el.gridstack = new GridStack(el, options); + } + return el.gridstack + } + + /** + * Will initialize a list of elements (given a selector) and return an array of grids. + * @param options grid options (optional) + * @param selector element to convert to grids (default to '.grid-stack' class selector) + * + * @example + * const grids = GridStack.initAll(); + * grids.forEach(...) + */ + public static initAll(options?: GridstackOptions, selector = '.grid-stack'): GridStack[] { + const grids: GridStack[] = []; + document.querySelectorAll(selector).forEach((el: GridHTMLElement) => { + if (!el.gridstack) { + el.gridstack = new GridStack(el, options); + } + grids.push(el.gridstack); + }); + if (grids.length === 0) { + console.error('gridstack.js: initAll() no grid was found. Did you forget class ' + selector + ' on your element ?'); + console.error('".grid-stack" is required for proper CSS styling and drag/drop.'); + } + return grids; + } + + /** the HTML element tied to this grid after it's been initialized */ + public el: GridHTMLElement; + + /** engine used to implement non DOM grid functionality */ + public engine: GridStackEngine; + + /** grid options - public for classes to access, but use methods to modify! */ + public opts: GridstackOptions; + + /** @internal */ + private $el: JQuery; // TODO: legacy code + private $placeholder: JQuery; + private oneColumnMode: boolean; + private dd: GridStackDragDropPlugin; + private _prevColumn: number; + private _stylesId: string; + private _gsEventHandler: {}; + private _styles: GridCSSStyleSheet; + private isAutoCellHeight: boolean; + + /** + * Construct a grid item from the given element and options + * @param el + * @param opts + */ + public constructor(el: GridStackElement, opts: GridstackOptions) { + opts = opts || {}; + + this.$el = $(el); // legacy code + this.el = this.$el.get(0); // exposed HTML element to the user + + obsoleteOpts(opts, 'width', 'column', 'v0.5.3'); + obsoleteOpts(opts, 'height', 'maxRow', 'v0.5.3'); + obsoleteOptsDel(opts, 'oneColumnModeClass', 'v0.6.3', '. Use class `.grid-stack-1` instead'); + + // container attributes + obsoleteAttr(this.el, 'data-gs-width', 'data-gs-column', 'v0.5.3'); + obsoleteAttr(this.el, 'data-gs-height', 'data-gs-max-row', 'v0.5.3'); + obsoleteAttr(this.el, 'data-gs-current-height', 'data-gs-current-row', 'v1.0.0'); + + opts.itemClass = opts.itemClass || 'grid-stack-item'; + + // if row property exists, replace minRow and maxRow instead + if (opts.row) { + opts.minRow = opts.maxRow = opts.row; + delete opts.row; + } + const rowAttr = parseInt(this.$el.attr('data-gs-row')); + + // elements attributes override any passed options (like CSS style) - merge the two together + const defaults: GridstackOptions = { + column: parseInt(this.$el.attr('data-gs-column')) || 12, + minRow: rowAttr ? rowAttr : parseInt(this.$el.attr('data-gs-min-row')) || 0, + maxRow: rowAttr ? rowAttr : parseInt(this.$el.attr('data-gs-max-row')) || 0, + itemClass: 'grid-stack-item', + placeholderClass: 'grid-stack-placeholder', + placeholderText: '', + handle: '.grid-stack-item-content', + handleClass: null, + cellHeight: 60, + verticalMargin: 20, + auto: true, + minWidth: 768, + float: false, + staticGrid: false, + _class: 'grid-stack-instance-' + (Math.random() * 10000).toFixed(0), + animate: Boolean(this.$el.attr('data-gs-animate')) || false, + alwaysShowResizeHandle: opts.alwaysShowResizeHandle || false, + resizable: Utils.defaults(opts.resizable || {}, { + autoHide: !(opts.alwaysShowResizeHandle || false), + handles: 'se' + }), + draggable: Utils.defaults(opts.draggable || {}, { + handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || + '.grid-stack-item-content', + scroll: false, + appendTo: 'body' + }), + disableDrag: opts.disableDrag || false, + disableResize: opts.disableResize || false, + rtl: 'auto', + removable: false, + removableOptions: Utils.defaults(opts.removableOptions || {}, { + accept: '.' + opts.itemClass + }), + removeTimeout: 2000, + verticalMarginUnit: 'px', + cellHeightUnit: 'px', + disableOneColumnMode: opts.disableOneColumnMode || false, + oneColumnModeDomSort: opts.oneColumnModeDomSort, + ddPlugin: null + }; + this.opts = Utils.defaults(opts, defaults); + + if (this.opts.ddPlugin === false) { + this.opts.ddPlugin = GridStackDragDropPlugin; + } else if (this.opts.ddPlugin === null) { + this.opts.ddPlugin = GridStackDragDropPlugin.registeredPlugins[0] || GridStackDragDropPlugin; + } + + this.dd = new this.opts.ddPlugin(this); + + if (this.opts.rtl === 'auto') { + this.opts.rtl = this.$el.css('direction') === 'rtl'; + } + + if (this.opts.rtl) { + this.$el.addClass('grid-stack-rtl'); + } + + this.opts._isNested = this.$el.closest('.' + opts.itemClass).length > 0; + if (this.opts._isNested) { + this.$el.addClass('grid-stack-nested'); + } + + this.isAutoCellHeight = (this.opts.cellHeight === 'auto'); + if (this.isAutoCellHeight) { + // make the cell square initially + this.cellHeight(this.cellWidth(), true); + } else { + this.cellHeight(this.opts.cellHeight, true); + } + this.verticalMargin(this.opts.verticalMargin, true); + + this.$el.addClass(this.opts._class); + + this._setStaticClass(); + + this._initStyles(); + + this.engine = new GridStackEngine(this.opts.column, (cbNodes, detachNode) => { + detachNode = (detachNode === undefined ? true : detachNode); + let maxHeight = 0; + this.engine.nodes.forEach(n => { maxHeight = Math.max(maxHeight, n.y + n.height) }); + cbNodes.forEach(n => { + if (detachNode && n._id === null) { + if (n.el) { $(n.el).remove() } + } else { + $(n.el) + .attr('data-gs-x', n.x) + .attr('data-gs-y', n.y) + .attr('data-gs-width', n.width) + .attr('data-gs-height', n.height); + } + }); + this._updateStyles(maxHeight + 10); + }, + this.opts.float, + this.opts.maxRow); + + if (this.opts.auto) { + const elements = []; + const _this = this; + this.$el.children('.' + this.opts.itemClass + ':not(.' + this.opts.placeholderClass + ')') + .each((index, el) => { + const x = parseInt(el.getAttribute('data-gs-x')); + const y = parseInt(el.getAttribute('data-gs-y')); + elements.push({ + el: el, + // if x,y are missing (autoPosition) add them to end of list - but keep their respective DOM order + i: (Number.isNaN(x) ? 1000 : x) + (Number.isNaN(y) ? 1000 : y) * _this.opts.column + }); + }); + Utils.sortBy(elements, x => x.i).forEach( item => { this._prepareElement(item.el) }); + } + this.engine._saveInitial(); // initial start of items + + this.setAnimation(this.opts.animate); + + this.$placeholder = $( + '
' + + '
' + this.opts.placeholderText + '
').hide(); + + this._updateContainerHeight(); + + $(window).resize(this.onResizeHandler); + this.onResizeHandler(); + + if (!this.opts.staticGrid && typeof this.opts.removable === 'string') { + const trashZone = $(this.opts.removable); + if (!this.dd.isDroppable(trashZone)) { + this.dd.droppable(trashZone, this.opts.removableOptions); + } + this.dd + .on(trashZone, 'dropover', (event, ui) => { + const el = $(ui.draggable); + const node = el.get(0).gridstackNode; + if (!node || node._grid !== this) { + return; + } + el.data('inTrashZone', true); + this._setupRemovingTimeout(el); + }) + .on(trashZone, 'dropout', (event, ui) => { + const el = $(ui.draggable); + const node = el.get(0).gridstackNode; + if (!node || node._grid !== this) { + return; + } + el.data('inTrashZone', false); + this._clearRemovingTimeout(el); + }); + } + + this.setupAcceptWidget(); + }; + + + /** + * Creates new widget and returns it. + * + * Widget will be always placed even if result height is more than actual grid height. + * You need to use willItFit method before calling addWidget for additional check. + * See also `makeWidget()`. + * + * @example + * const grid = GridStack.init(); + * grid.addWidget(el, {width: 3, autoPosition: true}); + * + * @param el widget to add + * @param options widget position/size options (optional) + */ + public addWidget(el: GridStackElement, options? : GridstackWidget): HTMLElement; + + /** + * Creates new widget and returns it. + * Legacy: Spelled out version of the widgets options, recommend use new version instead. + * + * @example + * const grid = GridStack.init(); + * grid.addWidget(el, 0, 0, 3, 2, true); + * + * @param el widget to add + * @param x widget position x (optional) + * @param y widget position y (optional) + * @param width widget dimension width (optional) + * @param height widget dimension height (optional) + * @param autoPosition if true then x, y parameters will be ignored and widget will be places on the first available position (optional) + * @param minWidth minimum width allowed during resize/creation (optional) + * @param maxWidth maximum width allowed during resize/creation (optional) + * @param minHeight minimum height allowed during resize/creation (optional) + * @param maxHeight maximum height allowed during resize/creation (optional) + * @param id value for `data-gs-id` (optional) + */ + public addWidget(el: GridStackElement, x? : number | GridstackWidget, y?: number, width?: number, height?: number, autoPosition?: boolean, + minWidth?: number, maxWidth?: number, minHeight?: number, maxHeight?: number, id?: numberOrString): HTMLElement { + // new way of calling with an object - make sure all items have been properly initialized + if (x === undefined || typeof x === 'object') { + // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos + // as the actual value are filled in when _prepareElement() calls el.attr('data-gs-xyz) before adding the node. + // opt = this.engine._prepareNode(opt); + x = x || {}; + } else { + // old legacy way of calling with items spelled out - call us back with single object instead (so we can properly initialized values) + return this.addWidget(el, {x: x, y: y, width: width, height: height, autoPosition: autoPosition, + minWidth: minWidth, maxWidth: maxWidth, minHeight: minHeight, maxHeight: maxHeight, id: id}); + } + + const $el = $(el); + this._writeAttr(el, x); + this.$el.append(el); + return this.makeWidget(el); + } + + /** + * Initializes batch updates. You will see no changes until `commit()` method is called. + */ + public batchUpdate() { + this.engine.batchUpdate(); + } + + /** + * Gets current cell height. + */ + public getCellHeight(): number { + if (this.opts.cellHeight && this.opts.cellHeight !== 'auto') { + return this.opts.cellHeight as number; + } + // compute the height taking margin into account (each row has margin other than last one) + const o = this.$el.children('.' + this.opts.itemClass).first(); + const height = parseInt(o.attr('data-gs-height')); + const verticalMargin = this.opts.verticalMargin as number; + return Math.round((o.outerHeight() - (height - 1) * verticalMargin) / height); + } + + /** + * Update current cell height - see `GridstackOptions.cellHeight` for format. + * This method rebuilds an internal CSS style sheet. + * Note: You can expect performance issues if call this method too often. + * + * @param val the cell height + * @param noUpdate (Optional) if true, styles will not be updated + * + * @example + * grid.cellHeight(grid.cellWidth() * 1.2); + */ + public cellHeight(val: numberOrString, noUpdate?: boolean) { + const heightData = Utils.parseHeight(val); + if (this.opts.cellHeightUnit === heightData.unit && this.opts.cellHeight === heightData.height) { + return ; + } + this.opts.cellHeightUnit = heightData.unit; + this.opts.cellHeight = heightData.height; + + if (!noUpdate) { + this._updateStyles(); + } + } + + /** + * Gets current cell width. + */ + public cellWidth(): number { + // TODO: take margin into account ($horizontal_padding in .scss) to make cellHeight='auto' square ? (see 810-many-columns.html) + return Math.round(this.$el.outerWidth() / this.opts.column); + } + + /** + * Finishes batch updates. Updates DOM nodes. You must call it after batchUpdate. + */ + public commit() { + this.engine.commit(); + this._triggerRemoveEvent(); + this._triggerAddEvent(); + this._triggerChangeEvent(); + }; + + /** re-layout grid items to reclaim any empty space */ + public compact() { + this.engine.compact(); + this._triggerChangeEvent(); + } + + /** + * set the number of columns in the grid. Will update existing widgets to conform to new number of columns, + * as well as cache the original layout so you can revert back to previous positions without loss. + * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [1-11], + * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns) + * @param column - Integer > 0 (default 12). + * @param doNotPropagate if true existing widgets will not be updated (optional) + */ + public column(column: number, doNotPropagate?: boolean) { + if (this.opts.column === column) { return; } + const oldColumn = this.opts.column; + + // if we go into 1 column mode (which happens if we're sized less than minWidth unless disableOneColumnMode is on) + // then remember the original columns so we can restore. + if (column === 1) { + this._prevColumn = oldColumn; + } else { + delete this._prevColumn; + } + + this.$el.removeClass('grid-stack-' + oldColumn); + this.$el.addClass('grid-stack-' + column); + this.opts.column = this.engine.column = column; + + if (doNotPropagate === true) { return; } + + // update the items now - see if the dom order nodes should be passed instead (else default to current list) + let domNodes; + if (this.opts.oneColumnModeDomSort && column === 1) { + domNodes = []; + this.$el.children('.' + this.opts.itemClass).each((index, el: GridItemHTMLElement) => { + const node = el.gridstackNode; + if (node) { domNodes.push(node); } + }); + if (!domNodes.length) { domNodes = undefined; } + } + this.engine._updateNodeWidths(oldColumn, column, domNodes); + + // and trigger our event last... + this._triggerChangeEvent(true); // skip layout update + } + + /** + * get the number of columns in the grid (default 12) + */ + public getColumn(): number { + return this.opts.column; + } + + /** + * Destroys a grid instance. + * @param detachGrid if false nodes and grid will not be removed from the DOM (Optional. Default true). + */ + public destroy(detachGrid?: boolean) { + $(window).off('resize', this.onResizeHandler); + this.disable(); + if (detachGrid !== undefined && !detachGrid) { + this.removeAll(false); + delete this.el.gridstack; + } else { + this.$el.remove(); + } + Utils.removeStylesheet(this._stylesId); + if (this.engine) { + this.engine = null; + } + } + + /** + * Disables widgets moving/resizing. This is a shortcut for: + * @example + * grid.enableMove(false); + * grid.enableResize(false); + */ + public disable() { + this.enableMove(false); + this.enableResize(false); + this.$el.trigger('disable'); + } + + /** + * Enables widgets moving/resizing. This is a shortcut for: + * @example + * grid.enableMove(true); + * grid.enableResize(true); + */ + public enable() { + this.enableMove(true); + this.enableResize(true); + this.$el.trigger('enable'); + } + + /** + * Enables/disables widget moving. + * + * @param doEnable + * @param includeNewWidgets will force new widgets to be draggable as per + * doEnable`s value by changing the disableDrag grid option (default: true). + */ + public enableMove(doEnable: boolean, includeNewWidgets = true) { + this.$el.children('.' + this.opts.itemClass).each((index, el) => { + this.movable(el, doEnable); + }) + if (includeNewWidgets) { + this.opts.disableDrag = !doEnable; + } + } + + /** + * Enables/disables widget resizing + * @param doEnable + * @param includeNewWidgets will force new widgets to be draggable as per + * doEnable`s value by changing the disableResize grid option (default: true). + */ + public enableResize(doEnable: boolean, includeNewWidgets = true) { + this.$el.children('.' + this.opts.itemClass).each((index, el) => { + this.resizable(el, doEnable); + }) + if (includeNewWidgets) { + this.opts.disableResize = !doEnable; + } + } + + /** + * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) + */ + public float(val: boolean) { + this.engine.float = val; + this._triggerChangeEvent(); + } + + /** + * get the current float mode + */ + public getFloat(): boolean { + return this.engine.float || false; + } + + /** + * Get the position of the cell under a pixel on screen. + * @param position the position of the pixel to resolve in + * absolute coordinates, as an object with top and left properties + * @param useOffset if true, value will be based on offset vs position (Optional. Default false). + * Useful when grid is within `position: relative` element + * + * Returns an object with properties `x` and `y` i.e. the column and row in the grid. + */ + public getCellFromPixel(position: MousePosition, useOffset?: boolean): CellPosition { + const containerPos = (useOffset !== undefined && useOffset) ? + this.$el.offset() : this.$el.position(); + const relativeLeft = position.left - containerPos.left; + const relativeTop = position.top - containerPos.top; + + const columnWidth = Math.floor(this.$el.width() / this.opts.column); + const rowHeight = Math.floor(this.$el.height() / parseInt(this.$el.attr('data-gs-current-row'))); + + return {x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight)}; + } + + /** returns the current number of rows */ + public getRow(): number { + return this.engine.getRow(); + } + + /** + * Checks if specified area is empty. + * @param x the position x. + * @param y the position y. + * @param width the width of to check + * @param height the height of to check + */ + public isAreaEmpty(x: number, y: number, width: number, height: number): boolean { + return this.engine.isAreaEmpty(x, y, width, height); + } + + /** + * Locks/unlocks widget. + * @param el element or selector to modify. + * @param val if true widget will be locked. + */ + public locked(els: GridStackElement, val: boolean): GridStack { + $(els).each((index, el) => { + const node = el.gridstackNode; + if (node!) return; + node.locked = (val || false); + if (node.locked) { + el.setAttribute('data-gs-locked', 'yes'); + } else { + el.removeAttribute('data-gs-locked'); + } + }); + return this; + } + + /** + * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets. + * If you want gridstack to add the elements for you, use addWidget instead. + * Makes the given element a widget and returns it. + * @param el widget to convert. + * + * @example + * const grid = GridStack.init(); + * grid.el.appendChild('
') + * grid.makeWidget('gsi-1'); + */ + public makeWidget(el: GridStackElement): HTMLElement { + this._prepareElement(el, true); + this._updateContainerHeight(); + this._triggerAddEvent(); + this._triggerChangeEvent(); + return $(el).get(0); + } + + /** + * Set the maxWidth for a widget. + * @param el widget to modify. + * @param val A numeric value of the number of columns + */ + public maxWidth(els: GridStackElement, val: number): GridStack { + if (isNaN(val)) return; + $(els).each((index, el) => { + const node = el.gridstackNode; + if (!node) { return; } + node.maxWidth = (val || undefined); + if (node.maxWidth) { + el.setAttribute('data-gs-max-width', val); + } else { + el.removeAttribute('data-gs-max-width'); + } + }); + return this; + } + + /** + * Set the minWidth for a widget. + * @param el widget to modify. + * @param val A numeric value of the number of columns + */ + public minWidth(els: GridStackElement, val: number): GridStack { + if (isNaN(val)) return; + $(els).each((index, el) => { + const node = el.gridstackNode; + if (!node) { return; } + if (node.minWidth) { + el.setAttribute('data-gs-min-width', val); + } else { + el.removeAttribute('data-gs-min-width'); + } + }); + return this; + } + + /** + * Set the maxHeight for a widget. + * @param el widget to modify. + * @param val A numeric value of the number of rows + */ + public maxHeight(els: GridStackElement, val: number): GridStack { + if (isNaN(val)) return; + $(els).each((index, el) => { + const node = el.gridstackNode; + if (!node) { return; } + if (node.maxHeight) { + el.setAttribute('data-gs-max-height', val); + } else { + el.removeAttribute('data-gs-max-height'); + } + }); + return this; + } + + /** + * Set the minHeight for a widget. + * @param el widget to modify. + * @param val A numeric value of the number of rows + */ + public minHeight(els: GridStackElement, val: number): GridStack { + if (isNaN(val)) return; + $(els).each((index, el) => { + const node = el.gridstackNode; + if (!node) { return; } + if (node.minHeight) { + el.setAttribute('data-gs-min-height', val); + } else { + el.removeAttribute('data-gs-min-height'); + } + }); + return this; + } + + /** + * Enables/Disables moving. + * @param el widget to modify. + * @param val if true widget will be draggable. + */ + public movable(els: GridStackElement, val: boolean): GridStack { + $(els).each((index, el: GridItemHTMLElement) => { + const node = el.gridstackNode; + if (!node) { return; } + node.noMove = !(val || false); + if (node.noMove) { + this.dd.draggable(el, 'disable'); + el.classList.remove('ui-draggable-handle'); + } else { + this.dd.draggable(el, 'enable'); + el.classList.remove('ui-draggable-handle'); + } + }); + return this; + } + + /** + * Changes widget position + * @param el widget to modify + * @param x new position x. If value is null or undefined it will be ignored. + * @param y new position y. If value is null or undefined it will be ignored. + */ + public move(el: GridStackElement, x: number, y: number) { + this._updateElement(el, (el, node) => { + x = (x !== null && x !== undefined) ? x : node.x; + y = (y !== null && y !== undefined) ? y : node.y; + + this.engine.moveNode(node, x, y, node.width, node.height); + }); + } + + /** + * Event handler that extracts our CustomEvent data out automatically for receiving custom + * notifications (see doc for supported events) + * @param name of the event (see possible values) or list of names space separated + * @param callback function called with event and optional second/third param + * (see README documentation for each signature). + * + * @example + * grid.on('added', function(e, items) { log('added ', items)} ); + * or + * grid.on('added removed change', function(e, items) { log(e.type, items)} ); + * + * Note: in some cases it is the same as calling native handler and parsing the event. + * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} ); + */ + public on(eventName: GridStackEvent, callback: (event: CustomEvent, arg2?: GridStackNode[] | Object, arg3?: Object) => void) { + if (eventName === 'change' || eventName === 'added' || eventName === 'removed' || eventName === 'enable' || eventName === 'disable') { + // native CustomEvent handlers - cash the generic handlers so we can remove + const noData = (eventName === 'enable' || eventName === 'disable'); + this._gsEventHandler = this._gsEventHandler || {}; + if (noData) { + this._gsEventHandler[eventName] = (event) => callback(event); + } else { + this._gsEventHandler[eventName] = (event) => callback(event, event.detail); + } + this.el.addEventListener(eventName, this._gsEventHandler[eventName]); + } else { + // still JQuery events + this.$el.on(eventName as any, callback); + } + } + + /** + * unsubscribe from the 'on' event below + * @param eventName of the event (see possible values) + */ + public off(eventName: GridStackEvent) { + if (eventName === 'change' || eventName === 'added' || eventName === 'removed' || eventName === 'enable' || eventName === 'disable') { + // remove native CustomEvent handlers + if (this._gsEventHandler && this._gsEventHandler[eventName]) { + this.el.removeEventListener(eventName, this._gsEventHandler[eventName]); + delete this._gsEventHandler[eventName]; + } + } else { + // still JQuery events + this.$el.off(eventName); + } + } + + /** + * Removes widget from the grid. + * @param el widget to modify + * @param detachNode if false DOM node won't be removed from the tree (Default? true). + */ + public removeWidget(el: GridStackElement, detachNode?: boolean) { + const elItem = $(el).get(0) as GridItemHTMLElement; + detachNode = (detachNode === undefined ? true : detachNode); + let node = elItem.gridstackNode; + // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272 + if (!node) { + node = this.engine.nodes.find(n => el === n.el); + } + if (!node) return; + + delete elItem.gridstackNode; + this.engine.removeNode(node, detachNode); + this._triggerRemoveEvent(); + this._triggerChangeEvent(); + } + + /** + * Removes all widgets from the grid. + * @param detachNode if false DOM nodes won't be removed from the tree (Default? true). + */ + public removeAll(detachNode?: boolean) { + if (detachNode !== false) { + // remove our data structure before list gets emptied and DOM elements stay behind + this.engine.nodes.forEach(n => delete n.el.gridstackNode); + } + this.engine.removeAll(detachNode); + this._triggerRemoveEvent(); + } + + /** + * Changes widget size + * @param el widget to modify + * @param width new dimensions width. If value is null or undefined it will be ignored. + * @param height new dimensions height. If value is null or undefined it will be ignored. + */ + public resize(el: GridStackElement, width: number, height: number) { + this._updateElement(el, (el, node) => { + width = (width !== null && width !== undefined) ? width : node.width; + height = (height !== null && height !== undefined) ? height : node.height; + + this.engine.moveNode(node, node.x, node.y, width, height); + }); + } + + /** + * Enables/Disables resizing. + * @param el widget to modify + * @param val if true widget will be resizable. + */ + public resizable(els: GridStackElement, val: boolean): GridStack { + $(els).each((index, el: GridItemHTMLElement) => { + const node = el.gridstackNode; + if (!node) { return; } + node.noResize = !(val || false); + if (node.noResize) { + this.dd.resizable(el, 'disable'); + } else { + this.dd.resizable(el, 'enable'); + } + }); + return this; + } + + /** + * Toggle the grid animation state. Toggles the `grid-stack-animate` class. + * @param doAnimate if true the grid will animate. + */ + public setAnimation(doAnimate: boolean) { + if (doAnimate) { + this.$el.addClass('grid-stack-animate'); + } else { + this.$el.removeClass('grid-stack-animate'); + } + } + + /** + * Toggle the grid static state. Also toggle the grid-stack-static class. + * @param staticValue if true the grid become static. + */ + public setStatic(staticValue: boolean) { + this.opts.staticGrid = (staticValue === true); + this.enableMove(!staticValue); + this.enableResize(!staticValue); + this._setStaticClass(); + } + + /** + * Updates widget position/size. + * @param el widget to modify + * @param x new position x. If value is null or undefined it will be ignored. + * @param y new position y. If value is null or undefined it will be ignored. + * @param width new dimensions width. If value is null or undefined it will be ignored. + * @param height new dimensions height. If value is null or undefined it will be ignored. + */ + public update(el: GridStackElement, x: number, y: number, width: number, height: number) { + this._updateElement(el, (el, node) => { + x = (x !== null && x !== undefined) ? x : node.x; + y = (y !== null && y !== undefined) ? y : node.y; + width = (width !== null && width !== undefined) ? width : node.width; + height = (height !== null && height !== undefined) ? height : node.height; + + this.engine.moveNode(node, x, y, width, height); + }); + } + + /** + * Updates the vertical margin - see `GridstackOptions.verticalMargin` for format options. + * + * @param value new vertical margin value + * @param noUpdate (optional) if true, styles will not be updated + */ + public verticalMargin(value: numberOrString, noUpdate?: boolean) { + const heightData = Utils.parseHeight(value); + + if (this.opts.verticalMarginUnit === heightData.unit && this.opts.maxRow === heightData.height) { + return ; + } + this.opts.verticalMarginUnit = heightData.unit; + this.opts.verticalMargin = heightData.height; + + if (!noUpdate) { + this._updateStyles(); + } + } + + /** + * returns current vertical margin value + */ + public getVerticalMargin(): number { return this.opts.verticalMargin as number; } + + /** + * Returns true if the height of the grid will be less the vertical + * constraint. Always returns true if grid doesn't have height constraint. + * @param x new position x. If value is null or undefined it will be ignored. + * @param y new position y. If value is null or undefined it will be ignored. + * @param width new dimensions width. If value is null or undefined it will be ignored. + * @param height new dimensions height. If value is null or undefined it will be ignored. + * @param autoPosition if true then x, y parameters will be ignored and widget + * will be places on the first available position + * + * @example + * if (grid.willItFit(newNode.x, newNode.y, newNode.width, newNode.height, true)) { + * grid.addWidget(newNode.el, newNode.x, newNode.y, newNode.width, newNode.height, true); + * } else { + * alert('Not enough free space to place the widget'); + * } + */ + public willItFit(x: number, y: number, width: number, height: number, autoPosition: boolean): boolean { + const node = {x: x, y: y, width: width, height: height, autoPosition: autoPosition}; + return this.engine.canBePlacedWithRespectToHeight(node); + } + + private _triggerChangeEvent(skipLayoutChange?: boolean) { + if (this.engine.batchMode) { return; } + const elements = this.engine.getDirtyNodes(true); // verify they really changed + if (elements && elements.length) { + if (!skipLayoutChange) { + this.engine._layoutsNodesChange(elements); + } + this._triggerEvent('change', elements); + } + this.engine._saveInitial(); // we called, now reset initial values & dirty flags + } + + private _triggerAddEvent() { + if (this.engine.batchMode) { return; } + if (this.engine.addedNodes && this.engine.addedNodes.length > 0) { + this.engine._layoutsNodesChange(this.engine.addedNodes); + // prevent added nodes from also triggering 'change' event (which is called next) + this.engine.addedNodes.forEach(n => { delete n._dirty; }); + this._triggerEvent('added', this.engine.addedNodes); + this.engine.addedNodes = []; + } + } + + private _triggerRemoveEvent() { + if (this.engine.batchMode) { return; } + if (this.engine.removedNodes && this.engine.removedNodes.length > 0) { + this._triggerEvent('removed', this.engine.removedNodes); + this.engine.removedNodes = []; + } + } + + private _triggerEvent(name: string, data?: any) { + const event = data ? new CustomEvent(name, {bubbles: false, detail: data}) : new Event(name); + this.el.dispatchEvent(event); + } + + private _initStyles() { + if (this._stylesId) { + Utils.removeStylesheet(this._stylesId); + } + this._stylesId = 'gridstack-style-' + (Math.random() * 100000).toFixed(); + // insert style to parent (instead of 'head') to support WebComponent + const parent = this.el.parentNode as HTMLElement; + this._styles = Utils.createStylesheet(this._stylesId, parent); + if (this._styles !== null) { + this._styles._max = 0; + } + } + + private _updateStyles(maxHeight?: number) { + if (this._styles === null || this._styles === undefined) { + return; + } + + const prefix = '.' + this.opts._class + ' .' + this.opts.itemClass; + let getHeight; + + if (maxHeight === undefined) { + maxHeight = this._styles._max; + } + + this._initStyles(); + this._updateContainerHeight(); + if (!this.opts.cellHeight) { // The rest will be handled by CSS + return ; + } + if (this._styles._max !== 0 && maxHeight <= this._styles._max) { // Keep it increasing + return ; + } + const height = this.opts.cellHeight as number; + const margin = this.opts.verticalMargin as number; + + if (!this.opts.verticalMargin || this.opts.cellHeightUnit === this.opts.verticalMarginUnit) { + getHeight = (nbRows, nbMargins) => { + return (height * nbRows + margin * nbMargins) + this.opts.cellHeightUnit; + } + } else { + getHeight = (nbRows, nbMargins) => { + if (!nbRows || !nbMargins) { + return (height * nbRows + margin * nbMargins) + this.opts.cellHeightUnit; + } + return 'calc(' + ((height * nbRows) + this.opts.cellHeightUnit) + ' + ' + + ((margin * nbMargins) + this.opts.verticalMarginUnit) + ')'; + } + } + + if (this._styles._max === 0) { + Utils.insertCSSRule(this._styles, prefix, 'min-height: ' + getHeight(1, 0) + ';', 0); + } + + if (maxHeight > this._styles._max) { + for (var i = this._styles._max; i < maxHeight; ++i) { + Utils.insertCSSRule(this._styles, + prefix + '[data-gs-height="' + (i + 1) + '"]', + 'height: ' + getHeight(i + 1, i) + ';', + i + ); + Utils.insertCSSRule(this._styles, + prefix + '[data-gs-min-height="' + (i + 1) + '"]', + 'min-height: ' + getHeight(i + 1, i) + ';', + i + ); + Utils.insertCSSRule(this._styles, + prefix + '[data-gs-max-height="' + (i + 1) + '"]', + 'max-height: ' + getHeight(i + 1, i) + ';', + i + ); + Utils.insertCSSRule(this._styles, + prefix + '[data-gs-y="' + i + '"]', + 'top: ' + getHeight(i, i) + ';', + i + ); + } + this._styles._max = maxHeight; + } + } + + private _updateContainerHeight() { + if (this.engine.batchMode) { return; } + let row = this.engine.getRow(); + if (row < this.opts.minRow) { + row = this.opts.minRow; + } + // check for css min height. Each row is cellHeight + verticalMargin, until last one which has no margin below + const cssMinHeight = parseInt(this.$el.css('min-height')); + if (cssMinHeight > 0) { + const verticalMargin = this.opts.verticalMargin as number; + const minRow = Math.round((cssMinHeight + verticalMargin) / (this.getCellHeight() + verticalMargin)); + if (row < minRow) { + row = minRow; + } + } + this.$el.attr('data-gs-current-row', row); + if (!this.opts.cellHeight) { + return ; + } + if (!this.opts.verticalMargin) { + this.$el.css('height', (row * (this.opts.cellHeight as number)) + this.opts.cellHeightUnit); + } else if (this.opts.cellHeightUnit === this.opts.verticalMarginUnit) { + this.$el.css('height', (row * ((this.opts.cellHeight as number) + (this.opts.verticalMargin as number)) - + (this.opts.verticalMargin as number)) + this.opts.cellHeightUnit); + } else { + this.$el.css('height', 'calc(' + ((row * (this.opts.cellHeight as number)) + this.opts.cellHeightUnit) + + ' + ' + ((row * ((this.opts.verticalMargin as number) - 1)) + this.opts.verticalMarginUnit) + ')'); + } + } + + private _setupRemovingTimeout(el) { + const node = $(el).get(0).gridstackNode; + if (node._removeTimeout || !this.opts.removable) { return; } + node._removeTimeout = setTimeout(() => { + el.addClass('grid-stack-item-removing'); + node._isAboutToRemove = true; + }, this.opts.removeTimeout); + } + + private _clearRemovingTimeout(el) { + const node = $(el).get(0).gridstackNode; + + if (!node._removeTimeout) { + return; + } + clearTimeout(node._removeTimeout); + node._removeTimeout = null; + el.removeClass('grid-stack-item-removing'); + node._isAboutToRemove = false; + } + + /** + * prepares the element for drag&drop + **/ + private _prepareElementsByNode(el, node) { + el = $(el) + + // variables used/cashed between the 3 start/move/end methods, in addition to node passed above + let cellWidth; + let cellFullHeight; // internal cellHeight + v-margin + const self = this; + + /** called when item starts moving/resizing */ + const onStartMoving = function(event, ui) { + self.$el.append(self.$placeholder); + self.engine.cleanNodes(); + self.engine.beginUpdate(node); + cellWidth = self.cellWidth(); + const strictCellHeight = self.getCellHeight(); // heigh without v-margin + // compute height with v-margin (Note: we add 1 margin as last row is missing it) + cellFullHeight = (self.$el.height() + self.getVerticalMargin()) / parseInt(self.$el.attr('data-gs-current-row')); + const o = $(this); + self.$placeholder + .attr('data-gs-x', o.attr('data-gs-x')) + .attr('data-gs-y', o.attr('data-gs-y')) + .attr('data-gs-width', o.attr('data-gs-width')) + .attr('data-gs-height', o.attr('data-gs-height')) + .show(); + node.el = self.$placeholder.get(0); + node._beforeDragX = node.x; + node._beforeDragY = node.y; + node._prevYPix = ui.position.top; + const minHeight = (node.minHeight || 1); + const verticalMargin = self.opts.verticalMargin as number; + + // mineHeight - Each row is cellHeight + verticalMargin, until last one which has no margin below + self.dd.resizable(el, 'option', 'minWidth', cellWidth * (node.minWidth || 1)); + self.dd.resizable(el, 'option', 'minHeight', (strictCellHeight * minHeight) + (minHeight - 1) * verticalMargin); + + if (event.type === 'resizestart') { + o.find('.grid-stack-item').trigger('resizestart'); + } + } + + /** called when item is being dragged/resized */ + const dragOrResize = function(event, ui) { + let x = Math.round(ui.position.left / cellWidth); + let y = Math.floor((ui.position.top + cellFullHeight / 2) / cellFullHeight); + let width; + let height; + + if (event.type === 'drag') { + const distance = ui.position.top - node._prevYPix; + node._prevYPix = ui.position.top; + Utils.updateScrollPosition(el[0], ui, distance); + if (el.data('inTrashZone') || x < 0 || x >= self.engine.column || y < 0 || + (!self.engine.float && y > self.engine.getRow())) { + if (!node._temporaryRemoved) { + if (self.opts.removable === true) { + self._setupRemovingTimeout(el); + } + + x = node._beforeDragX; + y = node._beforeDragY; + + self.$placeholder.detach(); + self.$placeholder.hide(); + self.engine.removeNode(node); + self._updateContainerHeight(); + + node._temporaryRemoved = true; + } else { + return; + } + } else { + self._clearRemovingTimeout(el); + + if (node._temporaryRemoved) { + self.engine.addNode(node); + self.$placeholder + .attr('data-gs-x', x) + .attr('data-gs-y', y) + .attr('data-gs-width', width) + .attr('data-gs-height', height) + .show(); + self.$el.append(self.$placeholder); + node.el = self.$placeholder.get(0); + node._temporaryRemoved = false; + } + } + } else if (event.type === 'resize') { + if (x < 0) return; + width = Math.round(ui.size.width / cellWidth); + height = Math.round((ui.size.height + self.getVerticalMargin()) / cellFullHeight); + } + // width and height are undefined if not resizing + const _lastTriedWidth = width !== undefined ? width : node._lastTriedWidth; + const _lastTriedHeight = height !== undefined ? height : node._lastTriedHeight; + if (!self.engine.canMoveNode(node, x, y, width, height) || + (node._lastTriedX === x && node._lastTriedY === y && + node._lastTriedWidth === _lastTriedWidth && node._lastTriedHeight === _lastTriedHeight)) { + return; + } + node._lastTriedX = x; + node._lastTriedY = y; + node._lastTriedWidth = width; + node._lastTriedHeight = height; + self.engine.moveNode(node, x, y, width, height); + self._updateContainerHeight(); + + if (event.type === 'resize') { + $(event.target).trigger('gsresize', node); + } + } + + /** called when the item stops moving/resizing */ + const onEndMoving = function(event, ui) { + const o = $(this); + if (!o.get(0).gridstackNode) { + return; + } + + // const forceNotify = false; what is the point of calling 'change' event with no data, when the 'removed' event is already called ? + self.$placeholder.detach(); + node.el = o.get(0); + self.$placeholder.hide(); + + if (node._isAboutToRemove) { + // forceNotify = true; + const gridToNotify = el.get(0).gridstackNode._grid; + gridToNotify._triggerRemoveEvent(); + delete el.get(0).gridstackNode; + el.remove(); + } else { + self._clearRemovingTimeout(el); + if (!node._temporaryRemoved) { + Utils.removePositioningStyles(o); + o + .attr('data-gs-x', node.x) + .attr('data-gs-y', node.y) + .attr('data-gs-width', node.width) + .attr('data-gs-height', node.height); + } else { + Utils.removePositioningStyles(o); + o + .attr('data-gs-x', node._beforeDragX) + .attr('data-gs-y', node._beforeDragY) + .attr('data-gs-width', node.width) + .attr('data-gs-height', node.height); + node.x = node._beforeDragX; + node.y = node._beforeDragY; + node._temporaryRemoved = false; + self.engine.addNode(node); + } + } + self._updateContainerHeight(); + self._triggerChangeEvent(); + + self.engine.endUpdate(); + + const nestedGrids = o.find('.grid-stack'); + if (nestedGrids.length && event.type === 'resizestop') { + nestedGrids.each((index, el) => { + el.gridstack.onResizeHandler(); + }); + o.find('.grid-stack-item').trigger('resizestop'); + o.find('.grid-stack-item').trigger('gsresizestop'); + } + if (event.type === 'resizestop') { + self.$el.trigger('gsresizestop', o); + } + } + + this.dd + .draggable(el, { + start: onStartMoving, + stop: onEndMoving, + drag: dragOrResize + }) + .resizable(el, { + start: onStartMoving, + stop: onEndMoving, + resize: dragOrResize + }); + + if (node.noMove || this.opts.disableDrag || this.opts.staticGrid) { + this.dd.draggable(el, 'disable'); + } + if (node.noResize || this.opts.disableResize || this.opts.staticGrid) { + this.dd.resizable(el, 'disable'); + } + this._writeAttr(el, node); + } + + private _prepareElement(el, triggerAddEvent?: boolean) { + triggerAddEvent = triggerAddEvent !== undefined ? triggerAddEvent : false; + el = $(el); + + el.addClass(this.opts.itemClass); + let node = this._readAttr(el, {el: el.get(0), _grid: this}); + node = this.engine.addNode(node, triggerAddEvent); + el.get(0).gridstackNode = node; + + this._prepareElementsByNode(el, node); + } + + /** call to write any default attributes back to element */ + private _writeAttr(el, node) { + const $el = $(el); + node = node || {} + // Note: passing null removes the attr in jquery + if (node.x !== undefined) { el.attr('data-gs-x', node.x); } + if (node.y !== undefined) { el.attr('data-gs-y', node.y); } + if (node.width !== undefined) { el.attr('data-gs-width', node.width); } + if (node.height !== undefined) { el.attr('data-gs-height', node.height); } + if (node.autoPosition !== undefined) { el.attr('data-gs-auto-position', node.autoPosition ? true : null); } + if (node.minWidth !== undefined) { el.attr('data-gs-min-width', node.minWidth); } + if (node.maxWidth !== undefined) { el.attr('data-gs-max-width', node.maxWidth); } + if (node.minHeight !== undefined) { el.attr('data-gs-min-height', node.minHeight); } + if (node.maxHeight !== undefined) { el.attr('data-gs-max-height', node.maxHeight); } + if (node.noResize !== undefined) { el.attr('data-gs-no-resize', node.noResize ? true : null); } + if (node.noMove !== undefined) { el.attr('data-gs-no-move', node.noMove ? true : null); } + if (node.locked !== undefined) { el.attr('data-gs-locked', node.locked ? true : null); } + if (node.resizeHandles !== undefined) { el.attr('data-gs-resize-handles', node.resizeHandles); } + if (node.id !== undefined) { el.attr('data-gs-id', node.id); } + } + + /** call to write any default attributes back to element */ + private _readAttr(el, node) { + const $el = $(el); + node = node || {}; + node.x = el.attr('data-gs-x'); + node.y = el.attr('data-gs-y'); + node.width = el.attr('data-gs-width'); + node.height = el.attr('data-gs-height'); + node.autoPosition = Utils.toBool(el.attr('data-gs-auto-position')); + node.maxWidth = el.attr('data-gs-max-width'); + node.minWidth = el.attr('data-gs-min-width'); + node.maxHeight = el.attr('data-gs-max-height'); + node.minHeight = el.attr('data-gs-min-height'); + node.noResize = Utils.toBool(el.attr('data-gs-no-resize')); + node.noMove = Utils.toBool(el.attr('data-gs-no-move')); + node.locked = Utils.toBool(el.attr('data-gs-locked')); + node.resizeHandles = el.attr('data-gs-resize-handles'); + node.id = el.attr('data-gs-id'); + return node; + } + + private _updateElement(el, callback) { + el = $(el).first(); + const node = el.gridstackNode; + if (!node) { return; } + + this.engine.cleanNodes(); + this.engine.beginUpdate(node); + + callback.call(this, el, node); + + this._updateContainerHeight(); + this._triggerChangeEvent(); + + this.engine.endUpdate(); + } + + private _setStaticClass() { + const staticClassName = 'grid-stack-static'; + + if (this.opts.staticGrid === true) { + this.$el.addClass(staticClassName); + } else { + this.$el.removeClass(staticClassName); + } + } + + /** + * called when we are being resized - check if the one Column Mode needs to be turned on/off + * and remember the prev columns we used. + */ + private onResizeHandler() { + if (this.isAutoCellHeight) { + Utils.throttle(() => { this.cellHeight(this.cellWidth(), false)}, 100); + } + + if (this.opts.staticGrid) { return; } + + if (!this.opts.disableOneColumnMode && + (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) <= this.opts.minWidth) { + if (this.oneColumnMode) { return; } + this.oneColumnMode = true; + this.column(1); + } else { + if (!this.oneColumnMode) { return; } + this.oneColumnMode = false; + this.column(this._prevColumn); + } + } + + /** called to add drag over support to support widgets*/ + private setupAcceptWidget() { + if (this.opts.staticGrid || !this.opts.acceptWidgets) return; + + // vars used by the function callback + let draggingElement = null; + const self = this; + + const onDrag = function(event, ui) { + const el = draggingElement; + const node = el.get(0).gridstackNode; + const pos = this.getCellFromPixel({left: event.pageX, top: event.pageY}, true); + const x = Math.max(0, pos.x); + const y = Math.max(0, pos.y); + if (!node._added) { + node._added = true; + + node.el = el.get(0); + node.autoPosition = true; + node.x = x; + node.y = y; + this.engine.cleanNodes(); + this.engine.beginUpdate(node); + this.engine.addNode(node); + + this.$el.append(self.$placeholder); + self.$placeholder + .attr('data-gs-x', node.x) + .attr('data-gs-y', node.y) + .attr('data-gs-width', node.width) + .attr('data-gs-height', node.height) + .show(); + node.el = self.$placeholder.get(0); + node._beforeDragX = node.x; + node._beforeDragY = node.y; + + self._updateContainerHeight(); + } + if (!self.engine.canMoveNode(node, x, y)) { + return; + } + self.engine.moveNode(node, x, y); + self._updateContainerHeight(); + }; + + this.dd + .droppable(this.el, { + accept: el => { + el = $(el); + const node = el.get(0).gridstackNode; + if (node && node._grid === this) { + return false; + } + return el.is(this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets); + } + }) + .on(this.el, 'dropover', (event, ui) => { + const el = $(ui.draggable); + let width, height; + + // see if we already have a node with widget/height and check for attributes + let origNode = el.get(0).gridstackNode; + if (!origNode || !origNode.width || !origNode.height) { + const w = parseInt(el.attr('data-gs-width')); + if (w > 0) { origNode = origNode || {}; origNode.width = w; } + const h = parseInt(el.attr('data-gs-height')); + if (h > 0) { origNode = origNode || {}; origNode.height = h; } + } + + // if not calculate the grid size based on element outer size + // height: Each row is cellHeight + verticalMargin, until last one which has no margin below + const cellWidth = this.cellWidth(); + const cellHeight = this.getCellHeight(); + const verticalMargin = this.opts.verticalMargin as number; + width = origNode && origNode.width ? origNode.width : Math.ceil(el.outerWidth() / cellWidth); + height = origNode && origNode.height ? origNode.height : Math.round((el.outerHeight() + verticalMargin) / (cellHeight + verticalMargin)); + + draggingElement = el; + + const node = this.engine._prepareNode({width: width, height: height, _added: false, _temporary: true}); + node._isOutOfGrid = true; + el.get(0).gridstackNode = node; + el.get(0)._gridstackNodeOrig = origNode; + + el.on('drag', onDrag); + return false; // prevent parent from receiving msg (which may be grid as well) + }) + .on(this.el, 'dropout', (event, ui) => { + // jquery-ui bug. Must verify widget is being dropped out + // check node variable that gets set when widget is out of grid + const el = $(ui.draggable); + const node = el.get(0).gridstackNode; + if (!node || !node._isOutOfGrid) { + return; + } + el.unbind('drag', onDrag); + node.el = null; + this.engine.removeNode(node); + this.$placeholder.detach(); + this._updateContainerHeight(); + el.get(0).gridstackNode = el.get(0)._gridstackNodeOrig; + return false; // prevent parent from receiving msg (which may be grid as well) + }) + .on(this.el, 'drop', (event, ui) => { + this.$placeholder.detach(); + + const node = $(ui.draggable).get(0).gridstackNode; + delete node._isOutOfGrid; + node._grid = this; + const el = $(ui.draggable).clone(false); + el.get(0).gridstackNode = node; + const originalNode = $(ui.draggable).get(0)._gridstackNodeOrig; + if (originalNode !== undefined && originalNode._grid !== undefined) { + originalNode._grid._triggerRemoveEvent(); + } + $(ui.helper).remove(); + node.el = el.get(0); + this.$placeholder.hide(); + Utils.removePositioningStyles(el); + el.find('div.ui-resizable-handle').remove(); + + el + .attr('data-gs-x', node.x) + .attr('data-gs-y', node.y) + .attr('data-gs-width', node.width) + .attr('data-gs-height', node.height) + .addClass(this.opts.itemClass) + .enableSelection() + .removeData('draggable') + .removeClass('ui-draggable ui-draggable-dragging ui-draggable-disabled') + .unbind('drag', onDrag); + this.$el.append(el); + this._prepareElementsByNode(el, node); + this._updateContainerHeight(); + this.engine.addedNodes.push(node); + this._triggerAddEvent(); + this._triggerChangeEvent(); + + this.engine.endUpdate(); + $(ui.draggable).unbind('drag', onDrag); + delete $(ui.draggable).get(0).gridstackNode; + delete $(ui.draggable).get(0)._gridstackNodeOrig; + this.$el.trigger('dropped', [originalNode, node]); + return false; // prevent parent from receiving msg (which may be grid as well) + }); + } + + // legacy method renames + private setGridWidth = obsolete(GridStack.prototype.column, 'setGridWidth', 'column', 'v0.5.3'); + private setColumn = obsolete(GridStack.prototype.column, 'setColumn', 'column', 'v0.6.4'); +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..e1bcaae19 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,13 @@ +// index.ts 2.0.0-rc @preserve + +/** + * The package's root file. Exports all exported classes. + */ +import './gridstack-poly.js'; + +export * from './types'; +export * from './utils'; +export * from './gridstack-engine'; +export * from './gridstack-dragdrop-plugin'; +export * from './gridstack'; +export * from './jqueryui-gridstack-dragdrop-plugin'; diff --git a/src/jquery-ui.js b/src/jquery-ui.js index 68b416b22..4030bdfb9 100644 --- a/src/jquery-ui.js +++ b/src/jquery-ui.js @@ -1,7 +1,8 @@ /*! jQuery UI - v1.12.1 - 2019-11-20 * http://jqueryui.com * Includes: widget.js, data.js, disable-selection.js, scroll-parent.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/mouse.js -* Copyright jQuery Foundation and other contributors; Licensed MIT @preserve*/ +* Copyright jQuery Foundation and other contributors; Licensed MIT +*/ (function( factory ) { /* [alain] we compile this in so no need to load with AMD @@ -21,7 +22,7 @@ $.ui = $.ui || {}; var version = $.ui.version = "1.12.1"; -/*! +/* * jQuery UI Widget 1.12.1 * http://jqueryui.com * @@ -744,7 +745,7 @@ $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { var widget = $.widget; -/*! +/* * jQuery UI :data 1.12.1 * http://jqueryui.com * @@ -773,7 +774,7 @@ var data = $.extend( $.expr[ ":" ], { } } ); -/*! +/* * jQuery UI Disable Selection 1.12.1 * http://jqueryui.com * @@ -809,7 +810,7 @@ var disableSelection = $.fn.extend( { } ); -/*! +/* * jQuery UI Scroll Parent 1.12.1 * http://jqueryui.com * @@ -849,7 +850,7 @@ var scrollParent = $.fn.scrollParent = function( includeHidden ) { // This file is deprecated var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); -/*! +/* * jQuery UI Mouse 1.12.1 * http://jqueryui.com * @@ -1135,7 +1136,7 @@ var safeBlur = $.ui.safeBlur = function( element ) { }; -/*! +/* * jQuery UI Draggable 1.12.1 * http://jqueryui.com * @@ -2365,7 +2366,7 @@ $.ui.plugin.add( "draggable", "zIndex", { var widgetsDraggable = $.ui.draggable; -/*! +/* * jQuery UI Droppable 1.12.1 * http://jqueryui.com * @@ -2846,7 +2847,7 @@ if ( $.uiBackCompat !== false ) { var widgetsDroppable = $.ui.droppable; -/*! +/* * jQuery UI Resizable 1.12.1 * http://jqueryui.com * diff --git a/src/jqueryui-gridstack-dragdrop-plugin.ts b/src/jqueryui-gridstack-dragdrop-plugin.ts new file mode 100644 index 000000000..58eeb236c --- /dev/null +++ b/src/jqueryui-gridstack-dragdrop-plugin.ts @@ -0,0 +1,91 @@ +// jqueryui-gridstack-dragdrop-plugin.ts 2.0.0-rc @preserve + +/** JQuery UI Drag&Drop plugin + * https://gridstackjs.com/ + * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov + * gridstack.js may be freely distributed under the MIT license. +*/ + +import { GridStack } from './gridstack'; +import { GridStackDragDropPlugin, DDOpts, DDKey } from './gridstack-dragdrop-plugin'; +import { GridStackElement } from './types'; + +// TODO: TEMPORARY until can remove jquery-ui drag&drop and this class! +// see https://stackoverflow.com/questions/35345760/importing-jqueryui-with-typescript-and-requirejs +import * as $ from './jquery.js'; +import './jquery-ui.js'; + +/** + * Jquery-ui based drag'n'drop plugin. + */ +export class JQueryUIGridStackDragDropPlugin extends GridStackDragDropPlugin { + public constructor(grid: GridStack) { + super(grid); + } + + public resizable(el: GridStackElement, opts: DDOpts, key?: DDKey, value?): GridStackDragDropPlugin { + const $el = $(el); + if (opts === 'disable' || opts === 'enable') { + $el.resizable(opts); + } else if (opts === 'option') { + $el.resizable(opts, key, value); + } else { + const handles = $el.data('gs-resize-handles') ? $el.data('gs-resize-handles') : this.grid.opts.resizable.handles; + $el.resizable({...this.grid.opts.resizable, ...{handles: handles}, ...{ // was using $.extend() + start: opts.start || function() {}, + stop: opts.stop || function() {}, + resize: opts.resize || function() {} + }}); + } + return this; + }; + + public draggable(el: GridStackElement, opts: DDOpts, key?: DDKey, value?): GridStackDragDropPlugin { + const $el = $(el); + if (opts === 'disable' || opts === 'enable') { + $el.draggable(opts); + } else { + $el.draggable({...this.grid.opts.draggable, ...{ // was using $.extend() + containment: (this.grid.opts._isNested && !this.grid.opts.dragOut) ? + $(this.grid.el).parent() : (this.grid.opts.draggable.containment || null), + start: opts.start || function() {}, + stop: opts.stop || function() {}, + drag: opts.drag || function() {} + }}); + } + return this; + }; + + public droppable(el: GridStackElement, opts: DDOpts, key?: DDKey, value?): GridStackDragDropPlugin { + const $el = $(el); + $el.droppable(opts); + return this; + }; + + public isDroppable(el: GridStackElement): boolean { + const $el = $(el); + return Boolean($el.data('droppable')); + }; + + public on(el: GridStackElement, eventName: string, callback): GridStackDragDropPlugin { + $(el).on(eventName, callback); + return this; + }; +} + +// finally register ourself +GridStackDragDropPlugin.registerPlugin(JQueryUIGridStackDragDropPlugin); + +/* OLD code for reference +function JQueryUIGridStackDragDropPlugin(grid) { + GridStack.DragDropPlugin.call(this, grid); +} + +GridStack.DragDropPlugin.registerPlugin(JQueryUIGridStackDragDropPlugin); + +JQueryUIGridStackDragDropPlugin.prototype = Object.create(GridStack.DragDropPlugin.prototype); +JQueryUIGridStackDragDropPlugin.prototype.constructor = JQueryUIGridStackDragDropPlugin; +.... +scope.JQueryUIGridStackDragDropPlugin = JQueryUIGridStackDragDropPlugin; +return JQueryUIGridStackDragDropPlugin; +*/ \ No newline at end of file diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 000000000..cb5081db8 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,212 @@ +// types.ts 2.0.0-rc @preserve + +/** + * https://gridstackjs.com/ + * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov + * gridstack.js may be freely distributed under the MIT license. +*/ + +export type numberOrString = number | string; +export type GridStackElement = string | HTMLElement | GridItemHTMLElement; +export interface GridItemHTMLElement extends HTMLElement { + gridstackNode?: GridStackNode; // grid items point back to node + /** @internal */ + _gridstackNodeOrig?: GridStackNode; +} + +/** + * Defines the options for a Grid + */ +export interface GridstackOptions { + /** + * accept widgets dragged from other grids or from outside (default: `false`). Can be: + * `true` (uses `'.grid-stack-item'` class filter) or `false`, + * string for explicit class name, + * function returning a boolean. See [example](http://gridstack.github.io/gridstack.js/demo/two.html) + */ + acceptWidgets?: boolean | string | ((i: number, element: Element) => boolean); + + /** if true the resizing handles are shown even if the user is not hovering over the widget (default?: false) */ + alwaysShowResizeHandle?: boolean; + + /** turns animation on (default?: true) */ + animate?: boolean; + + /** if false gridstack will not initialize existing items (default?: true) */ + auto?: boolean; + + /** + * one cell height (default?: 60). Can be: + * an integer (px) + * a string (ex: '100px', '10em', '10rem', '10%') + * 0 or null, in which case the library will not generate styles for rows. Everything must be defined in CSS files. + * 'auto' - height will be calculated to match cell width (initial square grid). + */ + cellHeight?: numberOrString; + + /** (internal) unit for cellHeight (default? 'px') which is set when a string cellHeight with a unit is passed (ex: '10rem') */ + cellHeightUnit?: string; + + /** number of columns (default?: 12). Note: IF you change this, CSS also have to change. See https://github.com/gridstack/gridstack.js#change-grid-columns */ + column?: number; + + /** class that implement drag'n'drop functionality for gridstack. If false grid will be static. + * (default?: null - first available plugin will be used) + */ + ddPlugin?: false | null | any; + + /** disallows dragging of widgets (default?: false) */ + disableDrag?: boolean; + + /** disables the onColumnMode when the window width is less than minWidth (default?: false) */ + disableOneColumnMode?: boolean; + + /** disallows resizing of widgets (default?: false). */ + disableResize?: boolean; + + /** allows to override UI draggable options. (default?: { handle?: '.grid-stack-item-content', scroll?: true, appendTo?: 'body', containment: null }) */ + draggable?: {} | any; + + /** let user drag nested grid items out of a parent or not (default false) */ + dragOut?: boolean; + + /** enable floating widgets (default?: false) See example (http://gridstack.github.io/gridstack.js/demo/float.html) */ + float?: boolean; + + /** draggable handle selector (default?: '.grid-stack-item-content') */ + handle?: string; + + /** draggable handle class (e.g. 'grid-stack-item-content'). If set 'handle' is ignored (default?: null) */ + handleClass?: string; + + /** widget class (default?: 'grid-stack-item') */ + itemClass?: string; + + /** maximum rows amount. Default? is 0 which means no maximum rows */ + maxRow?: number; + + /** minimum rows amount. Default is `0`. You can also do this with `min-height` CSS attribute + * on the grid div in pixels, which will round to the closest row. + */ + minRow?: number; + + /** minimal width. If window width is less, grid will be shown in one column mode (default?: 768) */ + minWidth?: number; + + /** + * set to true if you want oneColumnMode to use the DOM order and ignore x,y from normal multi column + * layouts during sorting. This enables you to have custom 1 column layout that differ from the rest. (default?: false) + */ + oneColumnModeDomSort?: boolean; + + /** class for placeholder (default?: 'grid-stack-placeholder') */ + placeholderClass?: string; + + /** placeholder default content (default?: '') */ + placeholderText?: string; + + /** allows to override UI resizable options. (default?: { autoHide?: true, handles?: 'se' }) */ + resizable?: {} | any; + + /** + * if true widgets could be removed by dragging outside of the grid. It could also be a selector string, + * in this case widgets will be removed by dropping them there (default?: false) + * See example (http://gridstack.github.io/gridstack.js/demo/two.html) + */ + removable?: boolean | string; + + /** allows to override UI removable options. (default?: { accept: '.' + opts.itemClass }) */ + removableOptions?: {}; + + /** time in milliseconds before widget is being removed while dragging outside of the grid. (default?: 2000) */ + removeTimeout?: number; + + /** fix grid number of rows. This is a shortcut of writing `minRow:N, maxRow:N`. (default `0` no constrain) */ + row?: number; + + /** + * if true turns grid to RTL. Possible values are true, false, 'auto' (default?: 'auto') + * See [example](http://gridstack.github.io/gridstack.js/demo/rtl.html) + */ + rtl?: boolean | 'auto'; + + /** + * makes grid static (default?: false). If `true` widgets are not movable/resizable. + * You don't even need draggable/resizable. A CSS class + * 'grid-stack-static' is also added to the element. + */ + staticGrid?: boolean; + + /** + * vertical gap size (default?: 20). Can be: + * an integer (px) + * a string (ex: '2em', '20px', '2rem') + */ + verticalMargin?: numberOrString; + + /** (internal) unit for verticalMargin (default? 'px') set when `verticalMargin` is set as string with unit (ex: 2rem') */ + verticalMarginUnit?: string; + + /** @internal */ + _isNested?: boolean; + /** @internal */ + _class?: string; +} + + +/** + * Gridstack Widget creation options + */ +export interface GridstackWidget { + /** widget position x (default?: 0) */ + x?: number; + /** widget position y (default?: 0) */ + y?: number; + /** widget dimension width (default?: 1) */ + width?: number; + /** widget dimension height (default?: 1) */ + height?: number; + /** if true then x, y parameters will be ignored and widget will be places on the first available position (default?: false) */ + autoPosition?: boolean; + /** minimum width allowed during resize/creation (default?: undefined = un-constrained) */ + minWidth?: number; + /** maximum width allowed during resize/creation (default?: undefined = un-constrained) */ + maxWidth?: number; + /** minimum height allowed during resize/creation (default?: undefined = un-constrained) */ + minHeight?: number; + /** maximum height allowed during resize/creation (default?: undefined = un-constrained) */ + maxHeight?: number; + /** prevent resizing (default?: undefined = un-constrained) */ + noResize?: boolean; + /** prevents moving (default?: undefined = un-constrained) */ + noMove?: boolean; + /** prevents moving and resizing (default?: undefined = un-constrained) */ + locked?: boolean; + /** widgets can have their own resize handles. For example 'e,w' will make the particular widget only resize east and west. */ + resizeHandles?: string; + /** value for `data-gs-id` stored on the widget (default?: undefined) */ + id?: numberOrString; +} + +/** + * internal descriptions describing the items in the grid + */ +export interface GridStackNode extends GridstackWidget { + el?: GridItemHTMLElement; + /** @internal need to do that for each and use --stripInternal */ + _id?: number; + _dirty?: boolean; + _updating?: boolean; + _added?: boolean; + _temporary?: boolean; + _isOutOfGrid?: boolean; + _origX?: number; + _origY?: number; + _packY?: number; + _origW?: number; + _origH?: number; + _lastTriedX?: number; + _lastTriedY?: number; + _lastTriedWidth?: number; + _lastTriedHeight?: number; +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 000000000..22aba9baf --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,252 @@ +// utils.ts 2.0.0-rc @preserve + +/** + * https://gridstackjs.com/ + * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov + * gridstack.js may be freely distributed under the MIT license. +*/ + +import { GridstackWidget, GridStackNode, GridstackOptions, numberOrString } from './types'; + +/** checks for obsolete method names */ +export function obsolete(f, oldName: string, newName: string, rev: string) { + const wrapper = function() { + console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' + + 'with `' + newName + '`. It will be **completely** removed in v1.0'); + return f.apply(this, arguments); + } + wrapper.prototype = f.prototype; + return wrapper; +} + +/** checks for obsolete grid options (can be used for any fields, but msg is about options) */ +export function obsoleteOpts(opts: GridstackOptions, oldName: string, newName: string, rev: string) { + if (opts[oldName] !== undefined) { + opts[newName] = opts[oldName]; + console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' + + newName + '`. It will be **completely** removed in v1.0'); + } +} + +/** checks for obsolete grid options which are gone */ +export function obsoleteOptsDel(opts: GridstackOptions, oldName: string, rev: string, info: string) { + if (opts[oldName] !== undefined) { + console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info); + } +} + +/** checks for obsolete Jquery element attributes */ +export function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string) { + const oldAttr = el.getAttribute(oldName); + if (oldAttr !== undefined) { + el.setAttribute(newName, oldAttr); + console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' + + newName + '`. It will be **completely** removed in v1.0'); + } +} + + +/** + * Utility methods + */ +export namespace Utils { + + /** returns true if a and b overlap */ + export function isIntercepted(a: GridstackWidget, b: GridstackWidget): boolean { + return !(a.x + a.width <= b.x || b.x + b.width <= a.x || a.y + a.height <= b.y || b.y + b.height <= a.y); + } + + /** + * Sorts array of nodes + * @param nodes array to sort + * @param dir 1 for asc, -1 for desc (optional) + * @param width width of the grid. If undefined the width will be calculated automatically (optional). + **/ + export function sort(nodes: GridStackNode[], dir?: number, column?: number): GridStackNode[] { + if (!column) { + const widths = nodes.map(function (node) { return node.x + node.width; }); + column = Math.max.apply(Math, widths); + } + + if (dir === -1) + return sortBy(nodes, (n) => -(n.x + n.y * column)); + else + return sortBy(nodes, (n) => (n.x + n.y * column)); + } + + export function createStylesheet(id: string, parent?: HTMLElement): CSSStyleSheet { + const style: HTMLStyleElement = document.createElement('style'); + style.setAttribute('type', 'text/css'); + style.setAttribute('data-gs-style-id', id); + if ((style as any).styleSheet) { // ??? only CSSImportRule have that and different beast... + (style as any).styleSheet.cssText = ''; + } else { + style.appendChild(document.createTextNode('')); // WebKit hack + } + if (!parent) { parent = document.getElementsByTagName('head')[0]; } // default to head + parent.insertBefore(style, parent.firstChild); + return style.sheet as CSSStyleSheet; + } + + export function removeStylesheet(id: string) { + const el = document.querySelector('STYLE[data-gs-style-id=' + id + ']'); + if (!el) return; + el.parentNode.removeChild(el); + } + + export function insertCSSRule(sheet: CSSStyleSheet, selector: string, rules: string, index: number) { + if (typeof sheet.insertRule === 'function') { + sheet.insertRule(selector + '{' + rules + '}', index); + } else if (typeof sheet.addRule === 'function') { + sheet.addRule(selector, rules, index); + } + } + + export function toBool(v: any): boolean { + if (typeof v === 'boolean') { + return v; + } + if (typeof v === 'string') { + v = v.toLowerCase(); + return !(v === '' || v === 'no' || v === 'false' || v === '0'); + } + return Boolean(v); + } + + export function parseHeight(val: numberOrString) { + let height: number; + let heightUnit = 'px'; + if (typeof val === 'string') { + const match = val.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/); + if (!match) { + throw new Error('Invalid height'); + } + heightUnit = match[2] || 'px'; + height = parseFloat(match[1]); + } else { + height = val; + } + return { height: height, unit: heightUnit } + } + + export function without(array, item) { + const index = array.indexOf(item); + + if (index !== -1) { + array = array.slice(0); + array.splice(index, 1); + } + + return array; + } + + export function sortBy(array, getter) { + return array.slice(0).sort(function (left, right) { + const valueLeft = getter(left); + const valueRight = getter(right); + + if (valueRight === valueLeft) { + return 0; + } + + return valueLeft > valueRight ? 1 : -1; + }); + } + + export function defaults(target, arg1) { + const sources = Array.prototype.slice.call(arguments, 1); + + sources.forEach(function (source) { + for (var prop in source) { + if (source.hasOwnProperty(prop) && (!target.hasOwnProperty(prop) || target[prop] === undefined)) { + target[prop] = source[prop]; + } + } + }); + + return target; + } + + export function clone(target) { + return {...target}; // was $.extend({}, target) + } + + export function throttle(callback, delay) { + let isWaiting = false; + + return function () { + if (!isWaiting) { + callback.apply(this, arguments); + isWaiting = true; + setTimeout(function () { isWaiting = false; }, delay); + } + } + } + + export function removePositioningStyles(el) { + const style = el[0].style; + if (style.position) { + style.removeProperty('position'); + } + if (style.left) { + style.removeProperty('left'); + } + if (style.top) { + style.removeProperty('top'); + } + if (style.width) { + style.removeProperty('width'); + } + if (style.height) { + style.removeProperty('height'); + } + } + + export function getScrollParent(el) { + let returnEl; + if (el === null) { + returnEl = null; + } else if (el.scrollHeight > el.clientHeight) { + returnEl = el; + } else { + returnEl = getScrollParent(el.parentNode); + } + return returnEl; + } + + export function updateScrollPosition(el, ui, distance) { + // is widget in view? + const rect = el.getBoundingClientRect(); + const innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight); + if (rect.top < 0 || + rect.bottom > innerHeightOrClientHeight + ) { + // set scrollTop of first parent that scrolls + // if parent is larger than el, set as low as possible + // to get entire widget on screen + const offsetDiffDown = rect.bottom - innerHeightOrClientHeight; + const offsetDiffUp = rect.top; + const scrollEl = getScrollParent(el); + if (scrollEl !== null) { + const prevScroll = scrollEl.scrollTop; + if (rect.top < 0 && distance < 0) { + // moving up + if (el.offsetHeight > innerHeightOrClientHeight) { + scrollEl.scrollTop += distance; + } else { + scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp; + } + } else if (distance > 0) { + // moving down + if (el.offsetHeight > innerHeightOrClientHeight) { + scrollEl.scrollTop += distance; + } else { + scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown; + } + } + // move widget y by amount scrolled + ui.position.top += scrollEl.scrollTop - prevScroll; + } + } + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..948886cf1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,47 @@ +{ + "compilerOptions": { + /* + "allowJs": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "inlineSources": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + "declaration": true, + "lib": [ "es6", "es2015", "dom" ], + "module": "es6", + "noImplicitAny": false, + "outDir": "./dist", + "sourceMap": true, + "strict": false, + "target": "es5", + */ + /* + "outDir": "./dist/", + "noImplicitAny": false, + "module": "commonjs", + "target": "es5", + "allowJs": true + */ + "declaration": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "inlineSources": true, + "lib": [ "es6", "es2015", "dom" ], + "module": "commonjs", + "noImplicitAny": false, + "outDir": "./dist", + "sourceMap": true, + "strict": false, + "target": "es5" + }, + "exclude": [ + "./src/**/*.spec.ts" + ], + "include": [ + "./src/**/*.ts" + ], + "typeroots": [ + "./node_modules/@types" + ] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000..0d3c46ae2 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,23 @@ +const path = require('path'); + +module.exports = { + entry: './src/index.ts', + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: [ '.ts', '.js' ], + }, + output: { + filename: 'gridstack.all.js', + path: path.resolve(__dirname, 'dist'), + libraryTarget: 'umd', + library: 'gridstack', + }, +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0d212947c..33cb2254d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,6 +107,20 @@ traverse "^0.6.6" unified "^6.1.6" +"@types/jquery@*", "@types/jquery@^3.3.32": + version "3.3.33" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.33.tgz#61d9cbd4004ffcdf6cf7e34720a87a5625a7d8e9" + integrity sha512-U6IdXYGkfUI42SR79vB2Spj+h1Ly3J3UZjpd8mi943lh126TK7CB+HZOxGh2nM3IySor7wqVQdemD/xtydsBKA== + dependencies: + "@types/sizzle" "*" + +"@types/jqueryui@^1.12.10": + version "1.12.10" + resolved "https://registry.yarnpkg.com/@types/jqueryui/-/jqueryui-1.12.10.tgz#39ebe4c391fb3b9f623521b4d803d9d4804883fa" + integrity sha512-T8sctslWIiLl/2EHEQQfKCB92S9bMKBaeE3+iBRbSERMK/1gzyfqjaIEksduB4eUEsKq+Ji0Y+qVbiXQwI2Mwg== + dependencies: + "@types/jquery" "*" + "@types/mime-types@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.0.tgz#9ca52cda363f699c69466c2a6ccdaad913ea7a73" @@ -122,6 +136,167 @@ resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw== +"@types/sizzle@*": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" + integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -145,6 +320,11 @@ acorn-jsx@^5.1.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== +acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + acorn@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" @@ -172,7 +352,17 @@ agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== @@ -233,6 +423,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -248,7 +446,7 @@ append-buffer@^1.0.2: dependencies: buffer-equal "^1.0.0" -aproba@^1.0.3: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== @@ -325,6 +523,15 @@ arrify@^1.0.0: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -344,6 +551,14 @@ assert@1.4.1: dependencies: util "0.10.3" +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -354,6 +569,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" @@ -416,6 +636,11 @@ base64-arraybuffer@0.1.5: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" @@ -460,11 +685,28 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + binary-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + blob@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" @@ -484,11 +726,16 @@ blocking-proxy@^1.0.0: dependencies: minimist "^1.2.0" -bluebird@^3.3.0: +bluebird@^3.3.0, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + body-parser@^1.16.1: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -528,7 +775,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -544,13 +791,77 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + browserstack@^1.5.1: version "1.5.3" resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.3.tgz#93ab48799a12ef99dbd074dd595410ddb196a7ac" @@ -586,6 +897,25 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" @@ -596,6 +926,27 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + 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" @@ -639,11 +990,25 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2, chalk@~2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -655,15 +1020,6 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2, chalk@~2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - character-entities-legacy@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" @@ -684,6 +1040,25 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chokidar@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chokidar@^3.0.0: version "3.3.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" @@ -699,6 +1074,26 @@ chokidar@^3.0.0: optionalDependencies: fsevents "~2.1.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -737,6 +1132,15 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -813,11 +1217,16 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@~2.20.3: +commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" @@ -843,7 +1252,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2: +concat-stream@1.6.2, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -868,11 +1277,21 @@ connect@^3.6.0, connect@^3.6.6, connect@^3.7.0: parseurl "~1.3.3" utils-merge "1.0.1" +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + 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" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -895,6 +1314,18 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + 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" @@ -921,15 +1352,38 @@ coveralls@^3.0.9, coveralls@~3.0.0: minimist "^1.2.0" request "^2.88.0" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: - lru-cache "^4.0.1" - which "^1.2.9" + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" -cross-spawn@^6.0.5: +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -940,6 +1394,31 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -952,6 +1431,11 @@ custom-event@~1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1000,7 +1484,7 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -1072,6 +1556,14 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + 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" @@ -1087,6 +1579,15 @@ di@^0.0.1: resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + doctoc@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/doctoc/-/doctoc-1.4.0.tgz#3115aa61d0a92f0abb0672036918ea904f5b9e02" @@ -1124,6 +1625,11 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + domelementtype@1, domelementtype@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" @@ -1154,7 +1660,7 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= -duplexify@^3.5.1, duplexify@^3.6.0: +duplexify@^3.4.2, duplexify@^3.5.1, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== @@ -1177,6 +1683,19 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1192,6 +1711,16 @@ emoji-regex@~6.1.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.3.tgz#ec79a3969b02d2ecf2b72254279bf99bc7a83932" integrity sha1-7HmjlpsC0uzytyJUJ5v5m8eoOTI= +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -1244,6 +1773,24 @@ engine.io@~3.2.0: engine.io-parser "~2.1.0" ws "~3.3.1" +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" @@ -1259,6 +1806,13 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + error-ex@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1307,6 +1861,14 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-scope@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" @@ -1438,6 +2000,32 @@ events@1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit@^0.1.2, exit@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -1562,6 +2150,11 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^1.0.1: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -1589,6 +2182,11 @@ file-sync-cmp@^0.1.0: resolved "https://registry.yarnpkg.com/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz#a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b" integrity sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs= +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -1619,6 +2217,15 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -1627,6 +2234,23 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" @@ -1674,7 +2298,7 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== -flush-write-stream@^1.0.2: +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== @@ -1732,6 +2356,14 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -1749,11 +2381,29 @@ fs-mkdirp-stream@^1.0.0: graceful-fs "^4.1.11" through2 "^2.0.3" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + fsevents@~2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" @@ -1805,11 +2455,23 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + 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" @@ -1869,7 +2531,7 @@ glob@^5.0.15, glob@~5.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -1893,6 +2555,13 @@ glob@~7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -1913,6 +2582,15 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -1946,7 +2624,7 @@ globule@^1.0.0: lodash "~4.17.12" minimatch "~3.0.2" -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== @@ -2213,6 +2891,31 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -2307,6 +3010,11 @@ https-browserify@0.0.1: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" integrity sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI= +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + https-proxy-agent@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" @@ -2330,6 +3038,16 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -2348,6 +3066,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2370,6 +3096,11 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2393,7 +3124,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4: +ini@^1.3.4, ini@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -2417,6 +3148,11 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + interpret@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -2427,6 +3163,11 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -2467,6 +3208,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2641,6 +3389,11 @@ is-relative@^1.0.0: dependencies: is-unc-path "^1.0.0" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -2683,7 +3436,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -isarray@1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -2839,6 +3592,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2859,8 +3617,15 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -jsonfile@^4.0.0: - version "4.0.0" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: @@ -2996,6 +3761,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + lcov-parse@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" @@ -3062,6 +3834,37 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.0.2, loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash.isfinite@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" @@ -3104,7 +3907,14 @@ lru-cache@4.1.x, lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -make-dir@^2.1.0: +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -3119,6 +3929,18 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3151,11 +3973,45 @@ maxmin@^2.1.0: gzip-size "^3.0.0" pretty-bytes "^3.0.0" +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + meow@^3.3.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -3172,7 +4028,7 @@ meow@^3.3.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -micromatch@^3.0.4: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -3191,6 +4047,22 @@ micromatch@^3.0.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.43.0: version "1.43.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" @@ -3213,11 +4085,21 @@ mime@^2.0.3, mime@^2.3.1: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== -mimic-fn@^2.1.0: +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -3240,6 +4122,22 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + 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.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -3266,6 +4164,18 @@ morgan@^1.9.1: on-finished "~2.3.0" on-headers "~1.0.1" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3286,7 +4196,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.13.2: +nan@^2.12.1, nan@^2.13.2: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -3318,7 +4228,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.6.0: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== @@ -3360,6 +4270,35 @@ node-http2@^4.0.1: url "^0.11.0" websocket-stream "^5.0.1" +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + node-sass@^4.13.1: version "4.13.1" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" @@ -3427,6 +4366,13 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -3447,7 +4393,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -3573,6 +4519,11 @@ ordered-read-streams@^1.0.0: dependencies: readable-stream "^2.0.1" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -3585,6 +4536,15 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3598,11 +4558,54 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -pako@~1.0.2: +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.2, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3610,6 +4613,18 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + parse-entities@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50" @@ -3667,6 +4682,11 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -3679,6 +4699,11 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0, path-is-absolute@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -3689,7 +4714,7 @@ path-is-inside@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.1: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -3720,6 +4745,17 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -3730,7 +4766,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.7: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7: version "2.2.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== @@ -3757,6 +4793,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + portscanner@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" @@ -3787,11 +4830,21 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + progress@^2.0.0, progress@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + protractor@^5.0.0: version "5.4.3" resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.3.tgz#35f050741e404a45868618ea648745d89af31683" @@ -3818,6 +4871,11 @@ proxy-from-env@^1.0.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -3828,6 +4886,18 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -3836,7 +4906,15 @@ pump@^2.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.5: +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3, pumpify@^1.3.5: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== @@ -3850,6 +4928,11 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -3901,11 +4984,31 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + range-parser@^1.2.0, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -3946,7 +5049,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -3959,6 +5062,15 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + readdirp@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" @@ -4103,11 +5215,23 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -4116,6 +5240,11 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4177,6 +5306,14 @@ rimraf@2.6.3, rimraf@~2.6.2: dependencies: glob "^7.1.3" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -4184,6 +5321,13 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + rxjs@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" @@ -4196,7 +5340,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -4240,6 +5384,15 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" @@ -4292,6 +5445,11 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -4350,6 +5508,14 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -4452,6 +5618,11 @@ socket.io@2.1.1: socket.io-client "2.1.1" socket.io-parser "~3.2.0" +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -4470,6 +5641,14 @@ source-map-support@~0.4.0: dependencies: source-map "^0.5.6" +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + 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" @@ -4487,7 +5666,7 @@ source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4564,6 +5743,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + state-toggle@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" @@ -4597,6 +5783,33 @@ stream-browserify@2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" @@ -4635,7 +5848,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -4658,6 +5871,13 @@ string_decoder@0.10: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string_decoder@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4679,7 +5899,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -4700,6 +5920,11 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -4719,6 +5944,13 @@ structured-source@^3.0.2: dependencies: boundary "^1.0.1" +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -4738,13 +5970,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -4755,6 +5980,11 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + tar@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" @@ -4764,6 +5994,30 @@ tar@^2.0.0: fstream "^1.0.12" inherits "2" +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.4.tgz#40a0b37afbe5b57e494536815efa68326840fc00" + integrity sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4797,6 +6051,13 @@ timers-browserify@2.0.2: dependencies: setimmediate "^1.0.4" +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + tiny-lr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" @@ -4836,6 +6097,11 @@ to-array@0.1.4: resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -4925,11 +6191,27 @@ trough@^1.0.0: dependencies: glob "^7.1.2" +ts-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" + integrity sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + tslib@^1.9.0: version "1.11.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.0.tgz#f1f3528301621a53220d58373ae510ff747a66bc" integrity sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg== +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -4967,6 +6249,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@3.4.5: + version "3.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" + integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== + uglify-js@^3.1.4, uglify-js@^3.5.0: version "3.8.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.0.tgz#f3541ae97b2f048d7e7e3aa4f39fd8a1f5d7a805" @@ -5028,6 +6315,20 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + unique-stream@^2.0.2: version "2.3.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" @@ -5085,6 +6386,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + update-section@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/update-section/-/update-section-0.3.3.tgz#458f17820d37820dc60e20b86d94391b00123158" @@ -5140,6 +6446,13 @@ util@0.10.3: dependencies: inherits "2.0.1" +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -5150,6 +6463,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" @@ -5254,11 +6572,25 @@ vinyl@^2.0.0, vinyl@^2.1.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + webdriver-js-extender@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" @@ -5284,6 +6616,60 @@ webdriver-manager@^12.0.6: semver "^5.3.0" xml2js "^0.4.17" +webpack-cli@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + websocket-driver@>=0.5.1: version "0.7.3" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" @@ -5315,7 +6701,12 @@ which-module@^1.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= -which@1, which@^1.1.1, which@^1.2.1, which@^1.2.14, which@^1.2.9, which@~1.3.0: +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.14, which@^1.2.9, which@^1.3.1, which@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -5344,6 +6735,13 @@ wordwrap@~0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -5352,6 +6750,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -5413,11 +6820,29 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^13.1.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" @@ -5425,6 +6850,23 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"