diff --git a/.eslintrc.js b/.eslintrc.js index 182328b..d4a2da6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,56 +1,76 @@ module.exports = { 'env': { 'browser': true, - 'es6': true, - 'node': true + 'es2021': true, + 'node': true, }, 'extends': [ 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended' + 'plugin:@typescript-eslint/recommended', ], - 'globals': { - 'Atomics': 'readonly', - 'SharedArrayBuffer': 'readonly' - }, 'parser': '@typescript-eslint/parser', 'parserOptions': { - 'ecmaVersion': 2018, - 'sourceType': 'module' + 'ecmaVersion': 12, + 'sourceType': 'module', }, 'plugins': [ - '@typescript-eslint' + '@typescript-eslint', ], 'rules': { 'indent': [ - 'off' - ], - 'linebreak-style': [ - 'off' + 'error', + 4, + { + 'SwitchCase': 1, + }, ], 'quotes': [ 'error', 'single', { - 'avoidEscape': true, - 'allowTemplateLiterals': true - } + 'allowTemplateLiterals': true, + }, ], 'semi': [ 'error', - 'always' + 'always', + ], + 'no-console': [ + 'error', + ], + 'eqeqeq': [ + 'error', + ], + 'no-invalid-this': [ + 'error', + ], + 'no-throw-literal': [ + 'error', + ], + 'curly': [ + 'error', ], - '@typescript-eslint/explicit-function-return-type': [ - 'off' + 'brace-style': [ + 'error', ], - '@typescript-eslint/no-unused-vars': [ - 'off' + 'camelcase': [ + 'error', ], - '@typescript-eslint/no-use-before-define': [ - 'off' + 'comma-dangle': [ + 'error', + 'always-multiline', ], - '@typescript-eslint/explicit-module-boundary-types': [ - 'off' - ] - } -}; \ No newline at end of file + 'comma-style': [ + 'error', + ], + 'no-trailing-spaces': [ + 'error', + ], + 'no-var': [ + 'error', + ], + '@typescript-eslint/no-shadow': [ + 'error', + ], + }, +}; diff --git a/.gitignore b/.gitignore index e5d678b..8e97eb9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -npm-debug.log* -/node_modules -/.vscode -/local -/coverage \ No newline at end of file +/node_modules/ +/local/ +/coverage/ +/lib/ +/bench-log/ \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index b7e4c3d..0000000 --- a/.npmignore +++ /dev/null @@ -1,12 +0,0 @@ -npm-debug.log* -/node_modules -/.vscode -/local -/coverage -/.github -/img -/benchmark -/bin -/test -tslint.json -webpack.config.js \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..daca077 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 James Clark + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 7ca2ce1..20f813b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BlockFractal -![Dependencies](https://img.shields.io/badge/dependencies-none-green.svg) +![Dependencies](https://img.shields.io/badge/dependencies-1-green.svg) [![Node.js CI](https://github.com/sbj42/block-fractal/workflows/Node.js%20CI/badge.svg)](https://github.com/sbj42/block-fractal/actions?query=workflow%3A%22Node.js+CI%22) [![License](https://img.shields.io/github/license/sbj42/block-fractal.svg)](https://github.com/sbj42/the-field) diff --git a/benchmark/bench-block-fractal.ts b/benchmark/bf.bench.js similarity index 51% rename from benchmark/bench-block-fractal.ts rename to benchmark/bf.bench.js index 6f4e846..3a4ca49 100644 --- a/benchmark/bench-block-fractal.ts +++ b/benchmark/bf.bench.js @@ -1,40 +1,36 @@ -import * as Benchmark from 'benchmark'; -import * as seedrandom from 'seedrandom'; +/* eslint-disable @typescript-eslint/no-var-requires */ +const { benchmark } = require('high-score'); +const seedrandom = require('seedrandom'); -import * as BlockFractal from '../src'; +const BlockFractal = require('../lib'); -// tslint:disable:no-console +/* eslint-disable no-console */ -const suite = new Benchmark.Suite(); -suite.on('cycle', (event: any) => { - console.log(`BlockFractal/${event.target}`); -}); -suite.add('makeBlockFractal([4 iterations])', () => { +benchmark('makeBlockFractal-4', () => { BlockFractal.makeBlockFractal({ random: seedrandom.alea('A'), iterations: 4, variation: 1, }); }); -suite.add('makeBlockFractal([5 iterations])', () => { +benchmark('makeBlockFractal-5', () => { BlockFractal.makeBlockFractal({ random: seedrandom.alea('A'), iterations: 5, variation: 1, }); }); -suite.add('makeBlockFractal([6 iterations])', () => { +benchmark('makeBlockFractal-6', () => { BlockFractal.makeBlockFractal({ random: seedrandom.alea('A'), iterations: 6, variation: 1, }); }); -suite.add('makeBlockFractal([7 iterations])', () => { +benchmark('makeBlockFractal-7', () => { BlockFractal.makeBlockFractal({ random: seedrandom.alea('A'), iterations: 7, variation: 1, }); }); -suite.run(); diff --git a/bin/block-fractal-1.0.5.js b/bin/block-fractal-1.0.5.js deleted file mode 100644 index 634c8cc..0000000 --- a/bin/block-fractal-1.0.5.js +++ /dev/null @@ -1,1128 +0,0 @@ -var BlockFractal;BlockFractal = -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./src/block-fractal.ts": -/*!******************************!*\ - !*** ./src/block-fractal.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.makeBlockFractal = void 0; -var geom = __webpack_require__(/*! ./geom */ "./src/geom/index.ts"); -function nextToLastMatch(points, next) { - return points.length > 1 && points[points.length - 2].equals(next); -} -function addPoint(points, mask, next) { - if (nextToLastMatch(points, next)) { - mask.set(points.splice(points.length - 1, 1)[0], false); - } - else { - points.push(next); - mask.set(next, true); - } -} -function verticalHelper(points, random, variation, newPoints, mask, i, p1, p2) { - var x = 2 * p1.x; - var yDir = p2.y - p1.y; - var _loop_1 = function (y) { - var np3 = new geom.Offset(x, y + yDir); - // console.info(`- ${np3}`); - if (nextToLastMatch(newPoints, np3)) { - // This can happen around a corner, when just before the corner - // we dip into the corner - // console.info(` remove ${newPoints[newPoints.length - 1]}`); - mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false); - return "continue"; - } - if (i === points.length - 2 && mask.get(np3)) { - // This can happen if the first point was on a corner and the - // first move was to dip into the corner - var index = newPoints.findIndex(function (point) { return point.equals(np3); }); - // console.info(`remove ${index} from beginning`); - for (var _i = 0, _a = newPoints.splice(0, index); _i < _a.length; _i++) { - var point = _a[_i]; - mask.set(point, false); - } - addPoint(newPoints, mask, np3); - return "break"; - } - if (random() < variation) { - var v = Math.floor(random() * 2) * 2 - 1; - var np1 = new geom.Offset(x + v, y); - var np2 = new geom.Offset(x + v, y + yDir); - if (!mask.get(np2)) { - if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) { - addPoint(newPoints, mask, np1); - addPoint(newPoints, mask, np2); - } - } - } - addPoint(newPoints, mask, np3); - }; - for (var y = 2 * p1.y; y !== 2 * p2.y; y += yDir) { - var state_1 = _loop_1(y); - if (state_1 === "break") - break; - } -} -function horizontalHelper(points, random, variation, newPoints, mask, i, p1, p2) { - var y = 2 * p1.y; - var xDir = p2.x - p1.x; - var _loop_2 = function (x) { - var np3 = new geom.Offset(x + xDir, y); - // console.info(`- ${np3}`); - if (nextToLastMatch(newPoints, np3)) { - // This can happen around a corner, when just before the corner - // we dip in the direction of the corner - // console.info(` remove ${newPoints[newPoints.length - 1]}`); - mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false); - return "continue"; - } - if (i === points.length - 2 && mask.get(np3)) { - // This can happen if the first point was on a corner and the - // first move was to dip into the corner - var index = newPoints.findIndex(function (point) { return point.equals(np3); }); - // console.info(`remove ${index} from beginning`); - for (var _i = 0, _a = newPoints.splice(0, index); _i < _a.length; _i++) { - var point = _a[_i]; - mask.set(point, false); - } - addPoint(newPoints, mask, np3); - return "break"; - } - if (random() < variation) { - var v = Math.floor(random() * 2) * 2 - 1; - var np1 = new geom.Offset(x, y + v); - var np2 = new geom.Offset(x + xDir, y + v); - if (!mask.get(np2)) { - if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) { - addPoint(newPoints, mask, np1); - addPoint(newPoints, mask, np2); - } - } - } - addPoint(newPoints, mask, np3); - }; - for (var x = 2 * p1.x; x !== 2 * p2.x; x += xDir) { - var state_2 = _loop_2(x); - if (state_2 === "break") - break; - } -} -function blockFractalIteration(random, points, bounds, variation) { - var newPoints = new Array(); - var newBounds = new geom.Rectangle(bounds.westX * 2 - 1, bounds.northY * 2 - 1, bounds.width * 2 + 2, bounds.height * 2 + 2); - // console.info(` bounds ${newBounds}`); - var mask = new geom.MaskRect(newBounds); - for (var i = 0; i < points.length - 1; i++) { - var p1 = points[i]; - var p2 = points[i + 1]; - if (i === 0) { - addPoint(newPoints, mask, new geom.Offset(p1.x * 2, p1.y * 2)); - } - if (p1.x === p2.x) { - verticalHelper(points, random, variation, newPoints, mask, i, p1, p2); - } - else { - horizontalHelper(points, random, variation, newPoints, mask, i, p1, p2); - } - } - return { - points: newPoints, - bounds: newBounds, - }; -} -function makeBlockFractal(param) { - var _a; - var random = param.random, shape = param.shape, variation = param.variation; - if (typeof random === 'undefined') { - random = Math.random; - } - if (typeof shape === 'undefined') { - shape = new geom.Path({ x: -1, y: -1 }, [ - geom.Direction.EAST, - geom.Direction.EAST, - geom.Direction.SOUTH, - geom.Direction.SOUTH, - geom.Direction.WEST, - geom.Direction.WEST, - geom.Direction.NORTH, - geom.Direction.NORTH, - ]); - } - if (typeof variation === 'undefined') { - variation = 0.4; - } - var points = new Array(); - var bounds = shape.getBounds(); - shape.getOffsets(function (off) { - points.push(new geom.Offset(off.x, off.y)); - }); - for (var iter = 0; iter < param.iterations; iter++) { - // console.info(`iteration ${iter + 1}`); - (_a = blockFractalIteration(random, points, bounds, variation), points = _a.points, bounds = _a.bounds); - } - var segments = new Array(); - for (var i = 0; i < points.length - 1; i++) { - var curPoint = points[i]; - var nextPoint = points[i + 1]; - if (nextPoint.y === curPoint.y - 1) { - segments.push(geom.Direction.NORTH); - } - else if (nextPoint.x === curPoint.x + 1) { - segments.push(geom.Direction.EAST); - } - else if (nextPoint.y === curPoint.y + 1) { - segments.push(geom.Direction.SOUTH); - } - else if (nextPoint.x === curPoint.x - 1) { - segments.push(geom.Direction.WEST); - } - } - return new geom.Path(points[0], segments); -} -exports.makeBlockFractal = makeBlockFractal; - - -/***/ }), - -/***/ "./src/geom/direction-flags.ts": -/*!*************************************!*\ - !*** ./src/geom/direction-flags.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.directionFlagsFromDirection = exports.directionFlagsToString = exports.DirectionFlags = void 0; -// tslint:disable:no-bitwise -var DirectionFlags; -(function (DirectionFlags) { - DirectionFlags[DirectionFlags["NONE"] = 0] = "NONE"; - DirectionFlags[DirectionFlags["NORTH"] = 1] = "NORTH"; - DirectionFlags[DirectionFlags["EAST"] = 2] = "EAST"; - DirectionFlags[DirectionFlags["SOUTH"] = 4] = "SOUTH"; - DirectionFlags[DirectionFlags["WEST"] = 8] = "WEST"; - DirectionFlags[DirectionFlags["ALL"] = 15] = "ALL"; -})(DirectionFlags = exports.DirectionFlags || (exports.DirectionFlags = {})); -function directionFlagsToString(flags) { - var ret = '['; - if ((flags & DirectionFlags.NORTH) !== 0) { - ret += 'N'; - } - if ((flags & DirectionFlags.EAST) !== 0) { - ret += 'E'; - } - if ((flags & DirectionFlags.SOUTH) !== 0) { - ret += 'S'; - } - if ((flags & DirectionFlags.WEST) !== 0) { - ret += 'W'; - } - return ret + ']'; -} -exports.directionFlagsToString = directionFlagsToString; -// conversion -function directionFlagsFromDirection(dir) { - return (1 << dir); -} -exports.directionFlagsFromDirection = directionFlagsFromDirection; - - -/***/ }), - -/***/ "./src/geom/direction.ts": -/*!*******************************!*\ - !*** ./src/geom/direction.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, exports) => { - - -// tslint:disable:no-bitwise -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.directionOpposite = exports.directionToString = exports.DIRECTIONS = exports.Direction = void 0; -var Direction; -(function (Direction) { - Direction[Direction["NORTH"] = 0] = "NORTH"; - Direction[Direction["EAST"] = 1] = "EAST"; - Direction[Direction["SOUTH"] = 2] = "SOUTH"; - Direction[Direction["WEST"] = 3] = "WEST"; -})(Direction = exports.Direction || (exports.Direction = {})); -exports.DIRECTIONS = [ - Direction.NORTH, - Direction.EAST, - Direction.SOUTH, - Direction.WEST, -]; -var DIRECTIONS_STR = [ - 'N', - 'E', - 'S', - 'W', -]; -function directionToString(dir) { - return DIRECTIONS_STR[dir]; -} -exports.directionToString = directionToString; -function directionOpposite(dir) { - return ((dir + 2) & 3); -} -exports.directionOpposite = directionOpposite; - - -/***/ }), - -/***/ "./src/geom/index.ts": -/*!***************************!*\ - !*** ./src/geom/index.ts ***! - \***************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -__exportStar(__webpack_require__(/*! ./direction */ "./src/geom/direction.ts"), exports); -__exportStar(__webpack_require__(/*! ./direction-flags */ "./src/geom/direction-flags.ts"), exports); -__exportStar(__webpack_require__(/*! ./offset */ "./src/geom/offset.ts"), exports); -__exportStar(__webpack_require__(/*! ./size */ "./src/geom/size.ts"), exports); -__exportStar(__webpack_require__(/*! ./rectangle */ "./src/geom/rectangle.ts"), exports); -__exportStar(__webpack_require__(/*! ./mask */ "./src/geom/mask.ts"), exports); -__exportStar(__webpack_require__(/*! ./mask-rect */ "./src/geom/mask-rect.ts"), exports); -__exportStar(__webpack_require__(/*! ./raster-mask */ "./src/geom/raster-mask.ts"), exports); -__exportStar(__webpack_require__(/*! ./path */ "./src/geom/path.ts"), exports); - - -/***/ }), - -/***/ "./src/geom/mask-rect.ts": -/*!*******************************!*\ - !*** ./src/geom/mask-rect.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MaskRect = void 0; -var geom = __webpack_require__(/*! . */ "./src/geom/index.ts"); -var LOCAL_OFF = new geom.Offset(); -var MaskRect = /** @class */ (function () { - function MaskRect(rect, initialValue, outsideValue) { - if (initialValue === void 0) { initialValue = false; } - if (outsideValue === void 0) { outsideValue = false; } - this._rectangle = new geom.Rectangle(); - this._rectangle.copyFrom(rect); - this._mask = new geom.Mask(rect, initialValue); - this._outsideValue = outsideValue; - } - // accessors - MaskRect.prototype.toString = function () { - return this._rectangle.northWest + "/" + this._outsideValue + "\n" + this._mask; - }; - Object.defineProperty(MaskRect.prototype, "westX", { - get: function () { - return this._rectangle.westX; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(MaskRect.prototype, "northY", { - get: function () { - return this._rectangle.northY; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(MaskRect.prototype, "width", { - get: function () { - return this._rectangle.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(MaskRect.prototype, "height", { - get: function () { - return this._rectangle.height; - }, - enumerable: false, - configurable: true - }); - MaskRect.prototype.index = function (off) { - return this._mask.index(LOCAL_OFF.copyFrom(off).subtractOffset(this._rectangle.northWest)); - }; - MaskRect.prototype.getAt = function (index) { - return this._mask.getAt(index); - }; - MaskRect.prototype.get = function (off) { - if (!this._rectangle.containsOffset(off)) { - return this._outsideValue; - } - return this._mask.getAt(this._rectangle.index(off)); - }; - // mutators - MaskRect.prototype.setAt = function (index, value) { - this._mask.setAt(index, value); - return this; - }; - MaskRect.prototype.set = function (off, value) { - this._mask.setAt(this._rectangle.index(off), value); - return this; - }; - return MaskRect; -}()); -exports.MaskRect = MaskRect; - - -/***/ }), - -/***/ "./src/geom/mask.ts": -/*!**************************!*\ - !*** ./src/geom/mask.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Mask = void 0; -var geom = __webpack_require__(/*! . */ "./src/geom/index.ts"); -var Mask = /** @class */ (function () { - // TODO consider Uint8Array for bits - function Mask(size, initialValue) { - if (initialValue === void 0) { initialValue = false; } - this._size = new geom.Size(); - this._size.copyFrom(size); - this._bits = new Array(Math.ceil(this._size.area / 32)).fill(initialValue ? 0xffffffff : 0); - } - // accessors - Mask.prototype.toString = function () { - var ret = ''; - var off = new geom.Offset(); - for (var y = 0; y < this._size.height; y++) { - for (var x = 0; x < this._size.width; x++) { - off.set(x, y); - ret += this.get(off.set(x, y)) ? '☑' : '☐'; - } - ret += '\n'; - } - return ret; - }; - Object.defineProperty(Mask.prototype, "width", { - get: function () { - return this._size.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Mask.prototype, "height", { - get: function () { - return this._size.height; - }, - enumerable: false, - configurable: true - }); - Mask.prototype.index = function (off) { - return this._size.index(off); - }; - Mask.prototype.getAt = function (index) { - // tslint:disable:no-bitwise - var arrayIndex = index >>> 5; - var bitMask = 1 << (index & 31); - return (this._bits[arrayIndex] & bitMask) !== 0; - // tslint:enable:no-bitwise - }; - Mask.prototype.get = function (off) { - return this.getAt(this.index(off)); - }; - // mutators - Mask.prototype.setAt = function (index, value) { - // tslint:disable:no-bitwise - var arrayIndex = index >>> 5; - var bitMask = 1 << (index & 31); - if (value) { - this._bits[arrayIndex] |= bitMask; - } - else { - this._bits[arrayIndex] &= ~bitMask; - } - // tslint:enable:no-bitwise - return this; - }; - Mask.prototype.set = function (off, value) { - return this.setAt(this.index(off), value); - }; - return Mask; -}()); -exports.Mask = Mask; - - -/***/ }), - -/***/ "./src/geom/offset.ts": -/*!****************************!*\ - !*** ./src/geom/offset.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Offset = void 0; -var X_FROM_DIRECTION = [0, 1, 0, -1]; -var Y_FROM_DIRECTION = [-1, 0, 1, 0]; -var Offset = /** @class */ (function () { - function Offset(x, y) { - if (typeof x === 'undefined') { - x = 0; - } - if (typeof y === 'undefined') { - y = 0; - } - this.x = x; - this.y = y; - } - // accessors - Offset.prototype.toString = function () { - return "(" + this.x + "," + this.y + ")"; - }; - Offset.prototype.equals = function (other) { - return this.x === other.x && this.y === other.y; - }; - Object.defineProperty(Offset.prototype, "magnitudeChebyshev", { - // chebyshev: can move in any direction (diagonals are ok) - get: function () { - return Math.max(Math.abs(this.x), Math.abs(this.y)); - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Offset.prototype, "magnitudeManhattan", { - // manhattan: can move only in cardinal directions (no diagonals) - get: function () { - return Math.abs(this.x) + Math.abs(this.y); - }, - enumerable: false, - configurable: true - }); - // mutators - Offset.prototype.set = function (x, y) { - this.x = x; - this.y = y; - return this; - }; - Offset.prototype.copyFrom = function (other) { - this.x = other.x; - this.y = other.y; - return this; - }; - Offset.prototype.setFromDirection = function (dir) { - this.x = X_FROM_DIRECTION[dir]; - this.y = Y_FROM_DIRECTION[dir]; - return this; - }; - Offset.prototype.add = function (x, y) { - this.x += x; - this.y += y; - return this; - }; - Offset.prototype.addSize = function (size) { - this.x += size.width; - this.y += size.height; - return this; - }; - Offset.prototype.addOffset = function (off) { - this.x += off.x; - this.y += off.y; - return this; - }; - Offset.prototype.addDirection = function (dir) { - this.x += X_FROM_DIRECTION[dir]; - this.y += Y_FROM_DIRECTION[dir]; - return this; - }; - Offset.prototype.addCardinalDirection = function (dir) { - this.x += X_FROM_DIRECTION[dir]; - this.y += Y_FROM_DIRECTION[dir]; - return this; - }; - Offset.prototype.subtractOffset = function (off) { - this.x -= off.x; - this.y -= off.y; - return this; - }; - Offset.prototype.multiply = function (factor) { - this.x *= factor; - this.y *= factor; - return this; - }; - // utilities - // chebyshev: can move in any direction (diagonals are ok) - Offset.prototype.distanceChebyshev = function (other) { - return this.subtractOffset(other).magnitudeChebyshev; - }; - // manhattan: can move only in cardinal directions (no diagonals) - Offset.prototype.distanceManhattan = function (other) { - return this.subtractOffset(other).magnitudeManhattan; - }; - return Offset; -}()); -exports.Offset = Offset; - - -/***/ }), - -/***/ "./src/geom/path.ts": -/*!**************************!*\ - !*** ./src/geom/path.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Path = void 0; -var geom = __webpack_require__(/*! . */ "./src/geom/index.ts"); -var LOCAL_OFF = new geom.Offset(); -function sortedInsert(array, value) { - var low = 0; - var high = array.length; - while (low < high) { - // tslint:disable-next-line:no-bitwise - var mid = (low + high) >>> 1; - if (array[mid] < value) { - low = mid + 1; - } - else { - high = mid; - } - } - array.splice(low, 0, value); -} -var Path = /** @class */ (function () { - function Path(start, segments) { - this.start = new geom.Offset(); - if (typeof start !== 'undefined') { - this.start.copyFrom(start); - } - if (typeof segments === 'undefined') { - segments = new Array(); - } - this.segments = segments; - } - Path.prototype.toString = function () { - return this.start.toString() + ":" - + ("" + this.segments.map(function (segment) { return geom.directionToString(segment); }).join('')); - }; - Path.prototype.getIsClosed = function () { - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - LOCAL_OFF.addDirection(segment); - } - return this.start.equals(LOCAL_OFF); - }; - Path.prototype.getOffsets = function (callback) { - var cursor = new geom.Offset(); - cursor.copyFrom(this.start); - callback(cursor); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - cursor.addDirection(segment); - callback(cursor); - } - }; - Path.prototype.getBounds = function () { - var northY = this.start.y; - var southY = northY; - var westX = this.start.x; - var eastX = westX; - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - LOCAL_OFF.addDirection(segment); - switch (segment) { - case geom.Direction.NORTH: - northY = Math.min(northY, LOCAL_OFF.y); - break; - case geom.Direction.EAST: - eastX = Math.max(eastX, LOCAL_OFF.x); - break; - case geom.Direction.SOUTH: - southY = Math.max(southY, LOCAL_OFF.y); - break; - case geom.Direction.WEST: - westX = Math.min(westX, LOCAL_OFF.x); - break; - } - } - return new geom.Rectangle(westX, northY, eastX - westX + 1, southY - northY + 1); - }; - Path.prototype.getArea = function () { - var total = 0; - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - LOCAL_OFF.addDirection(segment); - switch (segment) { - case geom.Direction.NORTH: - total -= LOCAL_OFF.x; - break; - case geom.Direction.SOUTH: - total += LOCAL_OFF.x; - break; - } - } - return Math.abs(total); - }; - Path.prototype.rasterize = function (bounds) { - var lines = new Array(); - if (typeof bounds === 'undefined') { - bounds = this.getBounds(); - } - LOCAL_OFF.copyFrom(this.start); - var northY = bounds.northY; - var southY = northY + bounds.height - 1; - for (var y = northY; y < southY; y++) { - lines.push([]); - } - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - if (segment === geom.Direction.SOUTH) { - sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x); - } - LOCAL_OFF.addDirection(segment); - if (segment === geom.Direction.NORTH) { - sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x); - } - } - return new geom.RasterMask({ - westX: bounds.westX, - northY: bounds.northY, - width: bounds.width - 1, - height: bounds.height - 1, - }, lines); - }; - return Path; -}()); -exports.Path = Path; - - -/***/ }), - -/***/ "./src/geom/raster-mask.ts": -/*!*********************************!*\ - !*** ./src/geom/raster-mask.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RasterMask = void 0; -var geom = __webpack_require__(/*! . */ "./src/geom/index.ts"); -var RasterMask = /** @class */ (function () { - function RasterMask(bounds, lines) { - this.northWest = new geom.Offset(bounds.westX, bounds.northY); - this.size = new geom.Size(bounds.width, bounds.height); - this._lines = lines; - } - RasterMask.prototype.toString = function () { - var shape = ''; - for (var y = 0; y < this.height; y++) { - var line = this._lines[y]; - var x = this.westX; - for (var i = 0; i < line.length; i += 2) { - var start = line[i]; - var end = line[i + 1]; - while (x < start) { - shape += '∙'; - x++; - } - while (x < end) { - shape += '█'; - x++; - } - } - while (x <= this.eastX) { - shape += '∙'; - x++; - } - shape += '\n'; - } - return this.northWest + "\n" + shape; - }; - Object.defineProperty(RasterMask.prototype, "northY", { - // accessors - get: function () { - return this.northWest.y; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "southY", { - get: function () { - return this.northWest.y + this.size.height - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "westX", { - get: function () { - return this.northWest.x; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "eastX", { - get: function () { - return this.northWest.x + this.size.width - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "width", { - get: function () { - return this.size.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "height", { - get: function () { - return this.size.height; - }, - enumerable: false, - configurable: true - }); - RasterMask.prototype.get = function (x, y) { - if (y < this.northY || y > this.southY) { - return false; - } - var line = this._lines[y - this.northY]; - for (var i = 0; i < line.length; i += 2) { - if (x >= line[i] && x < line[i + 1]) { - return true; - } - } - return false; - }; - RasterMask.prototype.bandsAt = function (y, callback) { - if (y < this.northY || y > this.southY) { - return; - } - var line = this._lines[y - this.northY]; - for (var i = 0; i < line.length; i += 2) { - callback(line[i], line[i + 1] - 1); - } - }; - return RasterMask; -}()); -exports.RasterMask = RasterMask; - - -/***/ }), - -/***/ "./src/geom/rectangle.ts": -/*!*******************************!*\ - !*** ./src/geom/rectangle.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Rectangle = void 0; -var geom = __webpack_require__(/*! . */ "./src/geom/index.ts"); -var LOCAL_OFF = new geom.Offset(); -var Rectangle = /** @class */ (function () { - function Rectangle(westX, northY, width, height) { - if (typeof westX === 'undefined') { - westX = 0; - } - if (typeof northY === 'undefined') { - northY = 0; - } - if (typeof width === 'undefined') { - width = 0; - } - if (typeof height === 'undefined') { - height = 0; - } - this.northWest = new geom.Offset(westX, northY); - this.size = new geom.Size(width, height); - } - // accessors - Rectangle.prototype.toString = function () { - return "(" + this.westX + "," + this.northY + " " + this.width + "x" + this.height + ")"; - }; - Rectangle.prototype.equals = function (other) { - return this.westX === other.westX && this.northY === other.northY && this.size.equals(other); - }; - Object.defineProperty(Rectangle.prototype, "northY", { - get: function () { - return this.northWest.y; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "southY", { - get: function () { - return this.northWest.y + this.size.height - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "westX", { - get: function () { - return this.northWest.x; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "eastX", { - get: function () { - return this.northWest.x + this.size.width - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "width", { - get: function () { - return this.size.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "height", { - get: function () { - return this.size.height; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "empty", { - get: function () { - return this.size.empty; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "area", { - get: function () { - return this.size.area; - }, - enumerable: false, - configurable: true - }); - // mutators - Rectangle.prototype.set = function (westX, northY, width, height) { - this.northWest.set(westX, northY); - this.size.set(width, height); - return this; - }; - Rectangle.prototype.copyFrom = function (other) { - this.northWest.set(other.westX, other.northY); - this.size.set(other.width, other.height); - return this; - }; - Rectangle.prototype.extendToInclude = function (off) { - var dx = off.x - this.westX; - if (dx < 0) { - this.size.width -= dx; - this.northWest.x = off.x; - } - else if (dx >= this.size.width) { - this.size.width = dx + 1; - } - var dy = off.y - this.northWest.y; - if (dy < 0) { - this.size.height -= dy; - this.northWest.y = off.y; - } - else if (dy >= this.size.height) { - this.size.height = dy + 1; - } - return this; - }; - // utilities - Rectangle.prototype.containsOffset = function (off) { - return this.size.containsOffset(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest)); - }; - Rectangle.prototype.containsRectangle = function (other) { - LOCAL_OFF.set(other.westX, other.northY).subtractOffset(this.northWest); - if (!this.size.containsOffset(LOCAL_OFF)) { - return false; - } - if (other.width === 0 && other.height === 0) { - return false; - } - return this.size.containsOffset(LOCAL_OFF.add(other.width - 1, other.height - 1)); - }; - Rectangle.prototype.overlapsRectangle = function (other) { - return this.northY <= other.northY + other.height - 1 - && this.southY >= other.northY - && this.westX <= other.westX + other.width - 1 - && this.eastX >= other.westX - && !this.empty - && other.width !== 0 && other.height !== 0; - }; - Rectangle.prototype.index = function (off) { - return this.size.index(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest)); - }; - return Rectangle; -}()); -exports.Rectangle = Rectangle; - - -/***/ }), - -/***/ "./src/geom/size.ts": -/*!**************************!*\ - !*** ./src/geom/size.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Size = void 0; -var Size = /** @class */ (function () { - function Size(width, height) { - if (typeof width === 'undefined') { - width = 0; - } - if (typeof height === 'undefined') { - height = 0; - } - this.width = width; - this.height = height; - } - // accessors - Size.prototype.toString = function () { - return "(" + this.width + "x" + this.height + ")"; - }; - Size.prototype.equals = function (other) { - return this.width === other.width && this.height === other.height; - }; - Object.defineProperty(Size.prototype, "empty", { - get: function () { - return this.width === 0 || this.height === 0; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Size.prototype, "area", { - get: function () { - return this.width * this.height; - }, - enumerable: false, - configurable: true - }); - // mutators - Size.prototype.set = function (width, height) { - this.width = width; - this.height = height; - return this; - }; - Size.prototype.copyFrom = function (other) { - this.width = other.width; - this.height = other.height; - return this; - }; - Size.prototype.add = function (width, height) { - this.width += width; - this.height += height; - return this; - }; - Size.prototype.addOffset = function (off) { - this.width += off.x; - this.height += off.y; - return this; - }; - Size.prototype.multiply = function (factor) { - this.width *= factor; - this.height *= factor; - return this; - }; - // TODO: rotate - // utilities - Size.prototype.containsOffset = function (off) { - return off.x >= 0 && off.y >= 0 && off.x < this.width && off.y < this.height; - }; - Size.prototype.index = function (off) { - return off.y * this.width + off.x; - }; - return Size; -}()); -exports.Size = Size; - - -/***/ }), - -/***/ "./src/index.ts": -/*!**********************!*\ - !*** ./src/index.ts ***! - \**********************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -/* - * BlockFractal - * github.com/sbj42/block-fractal - * James Clark - * Licensed under the MIT license. - */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RasterMask = exports.Path = exports.Offset = exports.DirectionFlags = exports.Direction = exports.makeBlockFractal = void 0; -var block_fractal_1 = __webpack_require__(/*! ./block-fractal */ "./src/block-fractal.ts"); -Object.defineProperty(exports, "makeBlockFractal", ({ enumerable: true, get: function () { return block_fractal_1.makeBlockFractal; } })); -var geom_1 = __webpack_require__(/*! ./geom */ "./src/geom/index.ts"); -Object.defineProperty(exports, "Direction", ({ enumerable: true, get: function () { return geom_1.Direction; } })); -Object.defineProperty(exports, "DirectionFlags", ({ enumerable: true, get: function () { return geom_1.DirectionFlags; } })); -Object.defineProperty(exports, "Offset", ({ enumerable: true, get: function () { return geom_1.Offset; } })); -Object.defineProperty(exports, "Path", ({ enumerable: true, get: function () { return geom_1.Path; } })); -Object.defineProperty(exports, "RasterMask", ({ enumerable: true, get: function () { return geom_1.RasterMask; } })); - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ if(__webpack_module_cache__[moduleId]) { -/******/ return __webpack_module_cache__[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ // module exports must be returned from runtime so entry inlining is disabled -/******/ // startup -/******/ // Load entry module and return exports -/******/ return __webpack_require__("./src/index.ts"); -/******/ })() -; -//# sourceMappingURL=block-fractal-1.0.5.js.map \ No newline at end of file diff --git a/bin/block-fractal-1.0.5.js.map b/bin/block-fractal-1.0.5.js.map deleted file mode 100644 index 7d97dfc..0000000 --- a/bin/block-fractal-1.0.5.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://BlockFractal/./src/block-fractal.ts","webpack://BlockFractal/./src/geom/direction-flags.ts","webpack://BlockFractal/./src/geom/direction.ts","webpack://BlockFractal/./src/geom/index.ts","webpack://BlockFractal/./src/geom/mask-rect.ts","webpack://BlockFractal/./src/geom/mask.ts","webpack://BlockFractal/./src/geom/offset.ts","webpack://BlockFractal/./src/geom/path.ts","webpack://BlockFractal/./src/geom/raster-mask.ts","webpack://BlockFractal/./src/geom/rectangle.ts","webpack://BlockFractal/./src/geom/size.ts","webpack://BlockFractal/./src/index.ts","webpack://BlockFractal/webpack/bootstrap","webpack://BlockFractal/webpack/startup"],"names":[],"mappings":"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","file":"block-fractal-1.0.5.js","sourcesContent":["import * as geom from './geom';\r\n\r\nexport interface BlockFractalParam {\r\n random?: () => number;\r\n iterations: number;\r\n shape?: geom.Path;\r\n variation?: number;\r\n}\r\n\r\nfunction nextToLastMatch(points: geom.Offset[], next: geom.Offset) {\r\n return points.length > 1 && points[points.length - 2].equals(next);\r\n}\r\n\r\nfunction addPoint(points: geom.Offset[], mask: geom.MaskRect, next: geom.Offset) {\r\n if (nextToLastMatch(points, next)) {\r\n mask.set(points.splice(points.length - 1, 1)[0], false);\r\n } else {\r\n points.push(next);\r\n mask.set(next, true);\r\n }\r\n}\r\n\r\nfunction verticalHelper(points: geom.Offset[], random: () => number, variation: number,\r\n newPoints: geom.Offset[], mask: geom.MaskRect, i: number,\r\n p1: geom.Offset, p2: geom.Offset) {\r\n const x = 2 * p1.x;\r\n const yDir = p2.y - p1.y;\r\n for (let y = 2 * p1.y; y !== 2 * p2.y; y += yDir) {\r\n const np3 = new geom.Offset(x, y + yDir);\r\n // console.info(`- ${np3}`);\r\n if (nextToLastMatch(newPoints, np3)) {\r\n // This can happen around a corner, when just before the corner\r\n // we dip into the corner\r\n // console.info(` remove ${newPoints[newPoints.length - 1]}`);\r\n mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false);\r\n continue;\r\n }\r\n if (i === points.length - 2 && mask.get(np3)) {\r\n // This can happen if the first point was on a corner and the\r\n // first move was to dip into the corner\r\n const index = newPoints.findIndex((point) => point.equals(np3));\r\n // console.info(`remove ${index} from beginning`);\r\n for (const point of newPoints.splice(0, index)) {\r\n mask.set(point, false);\r\n }\r\n addPoint(newPoints, mask, np3);\r\n break;\r\n }\r\n if (random() < variation) {\r\n const v = Math.floor(random() * 2) * 2 - 1;\r\n const np1 = new geom.Offset(x + v, y);\r\n const np2 = new geom.Offset(x + v, y + yDir);\r\n if (!mask.get(np2)) {\r\n if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) {\r\n addPoint(newPoints, mask, np1);\r\n addPoint(newPoints, mask, np2);\r\n }\r\n }\r\n }\r\n addPoint(newPoints, mask, np3);\r\n }\r\n}\r\n\r\nfunction horizontalHelper(points: geom.Offset[], random: () => number, variation: number,\r\n newPoints: geom.Offset[], mask: geom.MaskRect, i: number,\r\n p1: geom.Offset, p2: geom.Offset) {\r\n const y = 2 * p1.y;\r\n const xDir = p2.x - p1.x;\r\n for (let x = 2 * p1.x; x !== 2 * p2.x; x += xDir) {\r\n const np3 = new geom.Offset(x + xDir, y);\r\n // console.info(`- ${np3}`);\r\n if (nextToLastMatch(newPoints, np3)) {\r\n // This can happen around a corner, when just before the corner\r\n // we dip in the direction of the corner\r\n // console.info(` remove ${newPoints[newPoints.length - 1]}`);\r\n mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false);\r\n continue;\r\n }\r\n if (i === points.length - 2 && mask.get(np3)) {\r\n // This can happen if the first point was on a corner and the\r\n // first move was to dip into the corner\r\n const index = newPoints.findIndex((point) => point.equals(np3));\r\n // console.info(`remove ${index} from beginning`);\r\n for (const point of newPoints.splice(0, index)) {\r\n mask.set(point, false);\r\n }\r\n addPoint(newPoints, mask, np3);\r\n break;\r\n }\r\n if (random() < variation) {\r\n const v = Math.floor(random() * 2) * 2 - 1;\r\n const np1 = new geom.Offset(x, y + v);\r\n const np2 = new geom.Offset(x + xDir, y + v);\r\n if (!mask.get(np2)) {\r\n if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) {\r\n addPoint(newPoints, mask, np1);\r\n addPoint(newPoints, mask, np2);\r\n }\r\n }\r\n }\r\n addPoint(newPoints, mask, np3);\r\n }\r\n}\r\n\r\nfunction blockFractalIteration(random: () => number, points: geom.Offset[],\r\n bounds: geom.RectangleLike, variation: number) {\r\n const newPoints = new Array();\r\n const newBounds = new geom.Rectangle(\r\n bounds.westX * 2 - 1,\r\n bounds.northY * 2 - 1,\r\n bounds.width * 2 + 2,\r\n bounds.height * 2 + 2,\r\n );\r\n // console.info(` bounds ${newBounds}`);\r\n const mask = new geom.MaskRect(newBounds);\r\n for (let i = 0; i < points.length - 1; i ++) {\r\n const p1 = points[i];\r\n const p2 = points[i + 1];\r\n if (i === 0) {\r\n addPoint(newPoints, mask, new geom.Offset(p1.x * 2, p1.y * 2));\r\n }\r\n if (p1.x === p2.x) {\r\n verticalHelper(points, random, variation, newPoints, mask, i, p1, p2);\r\n } else {\r\n horizontalHelper(points, random, variation, newPoints, mask, i, p1, p2);\r\n }\r\n }\r\n return {\r\n points: newPoints,\r\n bounds: newBounds,\r\n };\r\n}\r\n\r\nexport function makeBlockFractal(param: BlockFractalParam): geom.Path {\r\n let {random, shape, variation} = param;\r\n if (typeof random === 'undefined') {\r\n random = Math.random;\r\n }\r\n if (typeof shape === 'undefined') {\r\n shape = new geom.Path({x: -1, y: -1}, [\r\n geom.Direction.EAST,\r\n geom.Direction.EAST,\r\n geom.Direction.SOUTH,\r\n geom.Direction.SOUTH,\r\n geom.Direction.WEST,\r\n geom.Direction.WEST,\r\n geom.Direction.NORTH,\r\n geom.Direction.NORTH,\r\n ]);\r\n }\r\n if (typeof variation === 'undefined') {\r\n variation = 0.4;\r\n }\r\n\r\n let points = new Array();\r\n let bounds = shape.getBounds();\r\n shape.getOffsets((off) => {\r\n points.push(new geom.Offset(off.x, off.y));\r\n });\r\n\r\n for (let iter = 0; iter < param.iterations; iter ++) {\r\n // console.info(`iteration ${iter + 1}`);\r\n ({points, bounds} = blockFractalIteration(random, points, bounds, variation));\r\n }\r\n\r\n const segments = new Array();\r\n for (let i = 0; i < points.length - 1; i ++) {\r\n const curPoint = points[i];\r\n const nextPoint = points[i + 1];\r\n if (nextPoint.y === curPoint.y - 1) {\r\n segments.push(geom.Direction.NORTH);\r\n } else if (nextPoint.x === curPoint.x + 1) {\r\n segments.push(geom.Direction.EAST);\r\n } else if (nextPoint.y === curPoint.y + 1) {\r\n segments.push(geom.Direction.SOUTH);\r\n } else if (nextPoint.x === curPoint.x - 1) {\r\n segments.push(geom.Direction.WEST);\r\n }\r\n }\r\n\r\n return new geom.Path(points[0], segments);\r\n}\r\n","import * as geom from '.';\r\n\r\n// tslint:disable:no-bitwise\r\n\r\nexport enum DirectionFlags {\r\n NONE = 0,\r\n NORTH = 1,\r\n EAST = 2,\r\n SOUTH = 4,\r\n WEST = 8,\r\n ALL = 15,\r\n}\r\n\r\nexport function directionFlagsToString(flags: DirectionFlags) {\r\n let ret = '[';\r\n if ((flags & DirectionFlags.NORTH) !== 0) {\r\n ret += 'N';\r\n }\r\n if ((flags & DirectionFlags.EAST) !== 0) {\r\n ret += 'E';\r\n }\r\n if ((flags & DirectionFlags.SOUTH) !== 0) {\r\n ret += 'S';\r\n }\r\n if ((flags & DirectionFlags.WEST) !== 0) {\r\n ret += 'W';\r\n }\r\n return ret + ']';\r\n}\r\n\r\n// conversion\r\n\r\nexport function directionFlagsFromDirection(dir: geom.Direction) {\r\n return (1 << dir) as DirectionFlags;\r\n}\r\n","// tslint:disable:no-bitwise\r\n\r\nexport enum Direction {\r\n NORTH = 0,\r\n EAST = 1,\r\n SOUTH = 2,\r\n WEST = 3,\r\n}\r\n\r\nexport const DIRECTIONS = [\r\n Direction.NORTH,\r\n Direction.EAST,\r\n Direction.SOUTH,\r\n Direction.WEST,\r\n];\r\n\r\nconst DIRECTIONS_STR = [\r\n 'N',\r\n 'E',\r\n 'S',\r\n 'W',\r\n];\r\n\r\nexport function directionToString(dir: Direction) {\r\n return DIRECTIONS_STR[dir];\r\n}\r\n\r\nexport function directionOpposite(dir: Direction) {\r\n return ((dir + 2) & 3) as Direction;\r\n}\r\n","export * from './direction';\r\nexport * from './direction-flags';\r\nexport * from './offset';\r\nexport * from './size';\r\nexport * from './rectangle';\r\nexport * from './mask';\r\nexport * from './mask-rect';\r\nexport * from './raster-mask';\r\nexport * from './path';\r\n","import * as geom from '.';\r\n\r\nconst LOCAL_OFF = new geom.Offset();\r\n\r\nexport class MaskRect implements geom.RectangleLike {\r\n private readonly _rectangle = new geom.Rectangle();\r\n private readonly _mask: geom.Mask;\r\n private readonly _outsideValue: boolean;\r\n\r\n constructor(rect: geom.RectangleLike, initialValue = false, outsideValue = false) {\r\n this._rectangle.copyFrom(rect);\r\n this._mask = new geom.Mask(rect, initialValue);\r\n this._outsideValue = outsideValue;\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `${this._rectangle.northWest}/${this._outsideValue}\\n${this._mask}`;\r\n }\r\n\r\n get westX() {\r\n return this._rectangle.westX;\r\n }\r\n\r\n get northY() {\r\n return this._rectangle.northY;\r\n }\r\n\r\n get width() {\r\n return this._rectangle.width;\r\n }\r\n\r\n get height() {\r\n return this._rectangle.height;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return this._mask.index(LOCAL_OFF.copyFrom(off).subtractOffset(this._rectangle.northWest));\r\n }\r\n\r\n getAt(index: number) {\r\n return this._mask.getAt(index);\r\n }\r\n\r\n get(off: geom.OffsetLike) {\r\n if (!this._rectangle.containsOffset(off)) {\r\n return this._outsideValue;\r\n }\r\n return this._mask.getAt(this._rectangle.index(off));\r\n }\r\n\r\n // mutators\r\n\r\n setAt(index: number, value: boolean) {\r\n this._mask.setAt(index, value);\r\n return this;\r\n }\r\n\r\n set(off: geom.OffsetLike, value: boolean) {\r\n this._mask.setAt(this._rectangle.index(off), value);\r\n return this;\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport class Mask implements geom.SizeLike {\r\n private readonly _size = new geom.Size();\r\n private readonly _bits: number[];\r\n // TODO consider Uint8Array for bits\r\n\r\n constructor(size: geom.SizeLike, initialValue = false) {\r\n this._size.copyFrom(size);\r\n this._bits = new Array(Math.ceil(this._size.area / 32)).fill(initialValue ? 0xffffffff : 0);\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n let ret = '';\r\n const off = new geom.Offset();\r\n for (let y = 0; y < this._size.height; y ++) {\r\n for (let x = 0; x < this._size.width; x ++) {\r\n off.set(x, y);\r\n ret += this.get(off.set(x, y)) ? '☑' : '☐';\r\n }\r\n ret += '\\n';\r\n }\r\n return ret;\r\n }\r\n\r\n get width() {\r\n return this._size.width;\r\n }\r\n\r\n get height() {\r\n return this._size.height;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return this._size.index(off);\r\n }\r\n\r\n getAt(index: number) {\r\n // tslint:disable:no-bitwise\r\n const arrayIndex = index >>> 5;\r\n const bitMask = 1 << (index & 31);\r\n return (this._bits[arrayIndex] & bitMask) !== 0;\r\n // tslint:enable:no-bitwise\r\n }\r\n\r\n get(off: geom.OffsetLike) {\r\n return this.getAt(this.index(off));\r\n }\r\n\r\n // mutators\r\n\r\n setAt(index: number, value: boolean) {\r\n // tslint:disable:no-bitwise\r\n const arrayIndex = index >>> 5;\r\n const bitMask = 1 << (index & 31);\r\n if (value) {\r\n this._bits[arrayIndex] |= bitMask;\r\n } else {\r\n this._bits[arrayIndex] &= ~bitMask;\r\n }\r\n // tslint:enable:no-bitwise\r\n return this;\r\n }\r\n\r\n set(off: geom.OffsetLike, value: boolean) {\r\n return this.setAt(this.index(off), value);\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nconst X_FROM_DIRECTION = [ 0, 1, 0, -1 ];\r\nconst Y_FROM_DIRECTION = [ -1, 0, 1, 0 ];\r\n\r\nexport interface OffsetLike {\r\n readonly x: number;\r\n readonly y: number;\r\n}\r\n\r\nexport class Offset implements OffsetLike {\r\n x: number;\r\n y: number;\r\n\r\n constructor();\r\n constructor(x: number, y: number);\r\n constructor(x?: number, y?: number) {\r\n if (typeof x === 'undefined') {\r\n x = 0;\r\n }\r\n if (typeof y === 'undefined') {\r\n y = 0;\r\n }\r\n this.x = x;\r\n this.y = y;\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `(${this.x},${this.y})`;\r\n }\r\n\r\n equals(other: OffsetLike) {\r\n return this.x === other.x && this.y === other.y;\r\n }\r\n\r\n // chebyshev: can move in any direction (diagonals are ok)\r\n get magnitudeChebyshev() {\r\n return Math.max(Math.abs(this.x), Math.abs(this.y));\r\n }\r\n\r\n // manhattan: can move only in cardinal directions (no diagonals)\r\n get magnitudeManhattan(): number {\r\n return Math.abs(this.x) + Math.abs(this.y);\r\n }\r\n\r\n // mutators\r\n\r\n set(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n copyFrom(other: OffsetLike) {\r\n this.x = other.x;\r\n this.y = other.y;\r\n return this;\r\n }\r\n\r\n setFromDirection(dir: geom.Direction) {\r\n this.x = X_FROM_DIRECTION[dir];\r\n this.y = Y_FROM_DIRECTION[dir];\r\n return this;\r\n }\r\n\r\n add(x: number, y: number) {\r\n this.x += x;\r\n this.y += y;\r\n return this;\r\n }\r\n\r\n addSize(size: geom.SizeLike) {\r\n this.x += size.width;\r\n this.y += size.height;\r\n return this;\r\n }\r\n\r\n addOffset(off: OffsetLike) {\r\n this.x += off.x;\r\n this.y += off.y;\r\n return this;\r\n }\r\n\r\n addDirection(dir: geom.Direction) {\r\n this.x += X_FROM_DIRECTION[dir];\r\n this.y += Y_FROM_DIRECTION[dir];\r\n return this;\r\n }\r\n\r\n addCardinalDirection(dir: geom.Direction) {\r\n this.x += X_FROM_DIRECTION[dir];\r\n this.y += Y_FROM_DIRECTION[dir];\r\n return this;\r\n }\r\n\r\n subtractOffset(off: OffsetLike) {\r\n this.x -= off.x;\r\n this.y -= off.y;\r\n return this;\r\n }\r\n\r\n multiply(factor: number) {\r\n this.x *= factor;\r\n this.y *= factor;\r\n return this;\r\n }\r\n\r\n // utilities\r\n\r\n // chebyshev: can move in any direction (diagonals are ok)\r\n distanceChebyshev(other: OffsetLike) {\r\n return this.subtractOffset(other).magnitudeChebyshev;\r\n }\r\n\r\n // manhattan: can move only in cardinal directions (no diagonals)\r\n distanceManhattan(other?: OffsetLike): number {\r\n return this.subtractOffset(other).magnitudeManhattan;\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nconst LOCAL_OFF = new geom.Offset();\r\n\r\nfunction sortedInsert(array: number[], value: number) {\r\n let low = 0;\r\n let high = array.length;\r\n\r\n while (low < high) {\r\n // tslint:disable-next-line:no-bitwise\r\n const mid = (low + high) >>> 1;\r\n if (array[mid] < value) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n\r\n array.splice(low, 0, value);\r\n}\r\n\r\nexport class Path {\r\n start: geom.Offset;\r\n segments: geom.Direction[];\r\n\r\n constructor();\r\n constructor(start: geom.OffsetLike, segments: geom.Direction[]);\r\n constructor(start?: geom.OffsetLike, segments?: geom.Direction[]) {\r\n this.start = new geom.Offset();\r\n if (typeof start !== 'undefined') {\r\n this.start.copyFrom(start);\r\n }\r\n if (typeof segments === 'undefined') {\r\n segments = new Array();\r\n }\r\n this.segments = segments;\r\n }\r\n\r\n toString() {\r\n return `${this.start.toString()}:`\r\n + `${this.segments.map((segment) => geom.directionToString(segment)).join('')}`;\r\n }\r\n\r\n getIsClosed() {\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n LOCAL_OFF.addDirection(segment);\r\n }\r\n return this.start.equals(LOCAL_OFF);\r\n }\r\n\r\n getOffsets(callback: (off: geom.OffsetLike) => void) {\r\n const cursor = new geom.Offset();\r\n cursor.copyFrom(this.start);\r\n callback(cursor);\r\n for (const segment of this.segments) {\r\n cursor.addDirection(segment);\r\n callback(cursor);\r\n }\r\n }\r\n\r\n getBounds(): geom.Rectangle {\r\n let northY = this.start.y;\r\n let southY = northY;\r\n let westX = this.start.x;\r\n let eastX = westX;\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n LOCAL_OFF.addDirection(segment);\r\n switch (segment) {\r\n case geom.Direction.NORTH:\r\n northY = Math.min(northY, LOCAL_OFF.y);\r\n break;\r\n case geom.Direction.EAST:\r\n eastX = Math.max(eastX, LOCAL_OFF.x);\r\n break;\r\n case geom.Direction.SOUTH:\r\n southY = Math.max(southY, LOCAL_OFF.y);\r\n break;\r\n case geom.Direction.WEST:\r\n westX = Math.min(westX, LOCAL_OFF.x);\r\n break;\r\n }\r\n }\r\n return new geom.Rectangle(westX, northY, eastX - westX + 1, southY - northY + 1);\r\n }\r\n\r\n getArea() {\r\n let total = 0;\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n LOCAL_OFF.addDirection(segment);\r\n switch (segment) {\r\n case geom.Direction.NORTH:\r\n total -= LOCAL_OFF.x;\r\n break;\r\n case geom.Direction.SOUTH:\r\n total += LOCAL_OFF.x;\r\n break;\r\n }\r\n }\r\n return Math.abs(total);\r\n }\r\n\r\n rasterize(bounds?: geom.RectangleLike): geom.RasterMask {\r\n const lines = new Array();\r\n if (typeof bounds === 'undefined') {\r\n bounds = this.getBounds();\r\n }\r\n LOCAL_OFF.copyFrom(this.start);\r\n const {northY} = bounds;\r\n const southY = northY + bounds.height - 1;\r\n for (let y = northY; y < southY; y ++) {\r\n lines.push([]);\r\n }\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n if (segment === geom.Direction.SOUTH) {\r\n sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x);\r\n }\r\n LOCAL_OFF.addDirection(segment);\r\n if (segment === geom.Direction.NORTH) {\r\n sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x);\r\n }\r\n }\r\n return new geom.RasterMask({\r\n westX: bounds.westX,\r\n northY: bounds.northY,\r\n width: bounds.width - 1,\r\n height: bounds.height - 1,\r\n }, lines);\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport class RasterMask implements geom.RectangleLike, geom.SizeLike {\r\n northWest: geom.Offset;\r\n size: geom.Size;\r\n private _lines: number[][];\r\n\r\n constructor(bounds: geom.RectangleLike, lines: number[][]) {\r\n this.northWest = new geom.Offset(bounds.westX, bounds.northY);\r\n this.size = new geom.Size(bounds.width, bounds.height);\r\n this._lines = lines;\r\n }\r\n\r\n toString() {\r\n let shape = '';\r\n for (let y = 0; y < this.height; y ++) {\r\n const line = this._lines[y];\r\n let x = this.westX;\r\n for (let i = 0; i < line.length; i += 2) {\r\n const start = line[i];\r\n const end = line[i + 1];\r\n while (x < start) {\r\n shape += '∙';\r\n x ++;\r\n }\r\n while (x < end) {\r\n shape += '█';\r\n x ++;\r\n }\r\n }\r\n while (x <= this.eastX) {\r\n shape += '∙';\r\n x ++;\r\n }\r\n shape += '\\n';\r\n }\r\n return `${this.northWest}\\n${shape}`;\r\n }\r\n\r\n // accessors\r\n\r\n get northY() {\r\n return this.northWest.y;\r\n }\r\n\r\n get southY() {\r\n return this.northWest.y + this.size.height - 1;\r\n }\r\n\r\n get westX() {\r\n return this.northWest.x;\r\n }\r\n\r\n get eastX() {\r\n return this.northWest.x + this.size.width - 1;\r\n }\r\n\r\n get width() {\r\n return this.size.width;\r\n }\r\n\r\n get height() {\r\n return this.size.height;\r\n }\r\n\r\n get(x: number, y: number) {\r\n if (y < this.northY || y > this.southY) {\r\n return false;\r\n }\r\n const line = this._lines[y - this.northY];\r\n for (let i = 0; i < line.length; i += 2) {\r\n if (x >= line[i] && x < line[i + 1]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n bandsAt(y: number, callback: (westX: number, eastX: number) => void) {\r\n if (y < this.northY || y > this.southY) {\r\n return;\r\n }\r\n const line = this._lines[y - this.northY];\r\n for (let i = 0; i < line.length; i += 2) {\r\n callback(line[i], line[i + 1] - 1);\r\n }\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport interface RectangleLike extends geom.SizeLike {\r\n readonly westX: number;\r\n readonly northY: number;\r\n}\r\n\r\nconst LOCAL_OFF = new geom.Offset();\r\n\r\nexport class Rectangle implements RectangleLike, geom.SizeLike {\r\n northWest: geom.Offset;\r\n size: geom.Size;\r\n\r\n constructor();\r\n constructor(westX: number, northY: number, width: number, height: number);\r\n constructor(westX?: number, northY?: number, width?: number, height?: number) {\r\n if (typeof westX === 'undefined') {\r\n westX = 0;\r\n }\r\n if (typeof northY === 'undefined') {\r\n northY = 0;\r\n }\r\n if (typeof width === 'undefined') {\r\n width = 0;\r\n }\r\n if (typeof height === 'undefined') {\r\n height = 0;\r\n }\r\n this.northWest = new geom.Offset(westX, northY);\r\n this.size = new geom.Size(width, height);\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `(${this.westX},${this.northY} ${this.width}x${this.height})`;\r\n }\r\n\r\n equals(other: RectangleLike) {\r\n return this.westX === other.westX && this.northY === other.northY && this.size.equals(other);\r\n }\r\n\r\n get northY() {\r\n return this.northWest.y;\r\n }\r\n\r\n get southY() {\r\n return this.northWest.y + this.size.height - 1;\r\n }\r\n\r\n get westX() {\r\n return this.northWest.x;\r\n }\r\n\r\n get eastX() {\r\n return this.northWest.x + this.size.width - 1;\r\n }\r\n\r\n get width() {\r\n return this.size.width;\r\n }\r\n\r\n get height() {\r\n return this.size.height;\r\n }\r\n\r\n get empty() {\r\n return this.size.empty;\r\n }\r\n\r\n get area() {\r\n return this.size.area;\r\n }\r\n\r\n // mutators\r\n\r\n set(westX: number, northY: number, width: number, height: number) {\r\n this.northWest.set(westX, northY);\r\n this.size.set(width, height);\r\n return this;\r\n }\r\n\r\n copyFrom(other: RectangleLike) {\r\n this.northWest.set(other.westX, other.northY);\r\n this.size.set(other.width, other.height);\r\n return this;\r\n }\r\n\r\n extendToInclude(off: geom.OffsetLike) {\r\n const dx = off.x - this.westX;\r\n if (dx < 0) {\r\n this.size.width -= dx;\r\n this.northWest.x = off.x;\r\n } else if (dx >= this.size.width) {\r\n this.size.width = dx + 1;\r\n }\r\n const dy = off.y - this.northWest.y;\r\n if (dy < 0) {\r\n this.size.height -= dy;\r\n this.northWest.y = off.y;\r\n } else if (dy >= this.size.height) {\r\n this.size.height = dy + 1;\r\n }\r\n return this;\r\n }\r\n\r\n // utilities\r\n\r\n containsOffset(off: geom.OffsetLike) {\r\n return this.size.containsOffset(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest));\r\n }\r\n\r\n containsRectangle(other: RectangleLike) {\r\n LOCAL_OFF.set(other.westX, other.northY).subtractOffset(this.northWest);\r\n if (!this.size.containsOffset(LOCAL_OFF)) {\r\n return false;\r\n }\r\n if (other.width === 0 && other.height === 0) {\r\n return false;\r\n }\r\n return this.size.containsOffset(LOCAL_OFF.add(other.width - 1, other.height - 1));\r\n }\r\n\r\n overlapsRectangle(other: RectangleLike) {\r\n return this.northY <= other.northY + other.height - 1\r\n && this.southY >= other.northY\r\n && this.westX <= other.westX + other.width - 1\r\n && this.eastX >= other.westX\r\n && !this.empty\r\n && other.width !== 0 && other.height !== 0;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return this.size.index(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest));\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport interface SizeLike {\r\n readonly width: number;\r\n readonly height: number;\r\n}\r\n\r\nexport class Size implements SizeLike {\r\n width: number;\r\n height: number;\r\n\r\n constructor();\r\n constructor(width: number, height: number);\r\n constructor(width?: number, height?: number) {\r\n if (typeof width === 'undefined') {\r\n width = 0;\r\n }\r\n if (typeof height === 'undefined') {\r\n height = 0;\r\n }\r\n this.width = width;\r\n this.height = height;\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `(${this.width}x${this.height})`;\r\n }\r\n\r\n equals(other: SizeLike) {\r\n return this.width === other.width && this.height === other.height;\r\n }\r\n\r\n get empty() {\r\n return this.width === 0 || this.height === 0;\r\n }\r\n\r\n get area() {\r\n return this.width * this.height;\r\n }\r\n\r\n // mutators\r\n\r\n set(width: number, height: number) {\r\n this.width = width;\r\n this.height = height;\r\n return this;\r\n }\r\n\r\n copyFrom(other: SizeLike) {\r\n this.width = other.width;\r\n this.height = other.height;\r\n return this;\r\n }\r\n\r\n add(width: number, height: number) {\r\n this.width += width;\r\n this.height += height;\r\n return this;\r\n }\r\n\r\n addOffset(off: geom.OffsetLike) {\r\n this.width += off.x;\r\n this.height += off.y;\r\n return this;\r\n }\r\n\r\n multiply(factor: number) {\r\n this.width *= factor;\r\n this.height *= factor;\r\n return this;\r\n }\r\n\r\n // TODO: rotate\r\n\r\n // utilities\r\n\r\n containsOffset(off: geom.OffsetLike) {\r\n return off.x >= 0 && off.y >= 0 && off.x < this.width && off.y < this.height;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return off.y * this.width + off.x;\r\n }\r\n}\r\n","/*\r\n * BlockFractal\r\n * github.com/sbj42/block-fractal\r\n * James Clark\r\n * Licensed under the MIT license.\r\n */\r\n\r\nexport {makeBlockFractal} from './block-fractal';\r\nexport {Direction, DirectionFlags, Offset, Path, RasterMask} from './geom';\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(\"./src/index.ts\");\n"],"sourceRoot":""} \ No newline at end of file diff --git a/bin/block-fractal-1.0.5.min.js b/bin/block-fractal-1.0.5.min.js deleted file mode 100644 index 8d1c39b..0000000 --- a/bin/block-fractal-1.0.5.min.js +++ /dev/null @@ -1,2 +0,0 @@ -var BlockFractal;BlockFractal=(()=>{"use strict";var t={102:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.makeBlockFractal=void 0;var i=r(842);function n(t,e){return t.length>1&&t[t.length-2].equals(e)}function o(t,e,r){n(t,r)?e.set(t.splice(t.length-1,1)[0],!1):(t.push(r),e.set(r,!0))}function s(t,e,r,s,h,u,a,c){for(var f=2*a.x,p=c.y-a.y,y=function(a){var c=new i.Offset(f,a+p);if(n(s,c))return h.set(s.splice(s.length-1,1)[0],!1),"continue";if(u===t.length-2&&h.get(c)){for(var y=s.findIndex((function(t){return t.equals(c)})),d=0,g=s.splice(0,y);d{var r;Object.defineProperty(e,"__esModule",{value:!0}),e.directionFlagsFromDirection=e.directionFlagsToString=e.DirectionFlags=void 0,function(t){t[t.NONE=0]="NONE",t[t.NORTH=1]="NORTH",t[t.EAST=2]="EAST",t[t.SOUTH=4]="SOUTH",t[t.WEST=8]="WEST",t[t.ALL=15]="ALL"}(r=e.DirectionFlags||(e.DirectionFlags={})),e.directionFlagsToString=function(t){var e="[";return 0!=(t&r.NORTH)&&(e+="N"),0!=(t&r.EAST)&&(e+="E"),0!=(t&r.SOUTH)&&(e+="S"),0!=(t&r.WEST)&&(e+="W"),e+"]"},e.directionFlagsFromDirection=function(t){return 1<{var r;Object.defineProperty(e,"__esModule",{value:!0}),e.directionOpposite=e.directionToString=e.DIRECTIONS=e.Direction=void 0,function(t){t[t.NORTH=0]="NORTH",t[t.EAST=1]="EAST",t[t.SOUTH=2]="SOUTH",t[t.WEST=3]="WEST"}(r=e.Direction||(e.Direction={})),e.DIRECTIONS=[r.NORTH,r.EAST,r.SOUTH,r.WEST];var i=["N","E","S","W"];e.directionToString=function(t){return i[t]},e.directionOpposite=function(t){return t+2&3}},842:function(t,e,r){var i=this&&this.__createBinding||(Object.create?function(t,e,r,i){void 0===i&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){void 0===i&&(i=r),t[i]=e[r]}),n=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||i(e,t,r)};Object.defineProperty(e,"__esModule",{value:!0}),n(r(325),e),n(r(31),e),n(r(803),e),n(r(304),e),n(r(180),e),n(r(501),e),n(r(109),e),n(r(959),e),n(r(328),e)},109:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.MaskRect=void 0;var i=r(842),n=new i.Offset,o=function(){function t(t,e,r){void 0===e&&(e=!1),void 0===r&&(r=!1),this._rectangle=new i.Rectangle,this._rectangle.copyFrom(t),this._mask=new i.Mask(t,e),this._outsideValue=r}return t.prototype.toString=function(){return this._rectangle.northWest+"/"+this._outsideValue+"\n"+this._mask},Object.defineProperty(t.prototype,"westX",{get:function(){return this._rectangle.westX},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"northY",{get:function(){return this._rectangle.northY},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"width",{get:function(){return this._rectangle.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this._rectangle.height},enumerable:!1,configurable:!0}),t.prototype.index=function(t){return this._mask.index(n.copyFrom(t).subtractOffset(this._rectangle.northWest))},t.prototype.getAt=function(t){return this._mask.getAt(t)},t.prototype.get=function(t){return this._rectangle.containsOffset(t)?this._mask.getAt(this._rectangle.index(t)):this._outsideValue},t.prototype.setAt=function(t,e){return this._mask.setAt(t,e),this},t.prototype.set=function(t,e){return this._mask.setAt(this._rectangle.index(t),e),this},t}();e.MaskRect=o},501:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Mask=void 0;var i=r(842),n=function(){function t(t,e){void 0===e&&(e=!1),this._size=new i.Size,this._size.copyFrom(t),this._bits=new Array(Math.ceil(this._size.area/32)).fill(e?4294967295:0)}return t.prototype.toString=function(){for(var t="",e=new i.Offset,r=0;r>>5,r=1<<(31&t);return 0!=(this._bits[e]&r)},t.prototype.get=function(t){return this.getAt(this.index(t))},t.prototype.setAt=function(t,e){var r=t>>>5,i=1<<(31&t);return e?this._bits[r]|=i:this._bits[r]&=~i,this},t.prototype.set=function(t,e){return this.setAt(this.index(t),e)},t}();e.Mask=n},803:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Offset=void 0;var r=[0,1,0,-1],i=[-1,0,1,0],n=function(){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.x=t,this.y=e}return t.prototype.toString=function(){return"("+this.x+","+this.y+")"},t.prototype.equals=function(t){return this.x===t.x&&this.y===t.y},Object.defineProperty(t.prototype,"magnitudeChebyshev",{get:function(){return Math.max(Math.abs(this.x),Math.abs(this.y))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"magnitudeManhattan",{get:function(){return Math.abs(this.x)+Math.abs(this.y)},enumerable:!1,configurable:!0}),t.prototype.set=function(t,e){return this.x=t,this.y=e,this},t.prototype.copyFrom=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.setFromDirection=function(t){return this.x=r[t],this.y=i[t],this},t.prototype.add=function(t,e){return this.x+=t,this.y+=e,this},t.prototype.addSize=function(t){return this.x+=t.width,this.y+=t.height,this},t.prototype.addOffset=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.addDirection=function(t){return this.x+=r[t],this.y+=i[t],this},t.prototype.addCardinalDirection=function(t){return this.x+=r[t],this.y+=i[t],this},t.prototype.subtractOffset=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.multiply=function(t){return this.x*=t,this.y*=t,this},t.prototype.distanceChebyshev=function(t){return this.subtractOffset(t).magnitudeChebyshev},t.prototype.distanceManhattan=function(t){return this.subtractOffset(t).magnitudeManhattan},t}();e.Offset=n},328:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Path=void 0;var i=r(842),n=new i.Offset;function o(t,e){for(var r=0,i=t.length;r>>1;t[n]{Object.defineProperty(e,"__esModule",{value:!0}),e.RasterMask=void 0;var i=r(842),n=function(){function t(t,e){this.northWest=new i.Offset(t.westX,t.northY),this.size=new i.Size(t.width,t.height),this._lines=e}return t.prototype.toString=function(){for(var t="",e=0;ethis.southY)return!1;for(var r=this._lines[e-this.northY],i=0;i=r[i]&&tthis.southY))for(var r=this._lines[t-this.northY],i=0;i{Object.defineProperty(e,"__esModule",{value:!0}),e.Rectangle=void 0;var i=r(842),n=new i.Offset,o=function(){function t(t,e,r,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===r&&(r=0),void 0===n&&(n=0),this.northWest=new i.Offset(t,e),this.size=new i.Size(r,n)}return t.prototype.toString=function(){return"("+this.westX+","+this.northY+" "+this.width+"x"+this.height+")"},t.prototype.equals=function(t){return this.westX===t.westX&&this.northY===t.northY&&this.size.equals(t)},Object.defineProperty(t.prototype,"northY",{get:function(){return this.northWest.y},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"southY",{get:function(){return this.northWest.y+this.size.height-1},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"westX",{get:function(){return this.northWest.x},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"eastX",{get:function(){return this.northWest.x+this.size.width-1},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"width",{get:function(){return this.size.width},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this.size.height},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"empty",{get:function(){return this.size.empty},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"area",{get:function(){return this.size.area},enumerable:!1,configurable:!0}),t.prototype.set=function(t,e,r,i){return this.northWest.set(t,e),this.size.set(r,i),this},t.prototype.copyFrom=function(t){return this.northWest.set(t.westX,t.northY),this.size.set(t.width,t.height),this},t.prototype.extendToInclude=function(t){var e=t.x-this.westX;e<0?(this.size.width-=e,this.northWest.x=t.x):e>=this.size.width&&(this.size.width=e+1);var r=t.y-this.northWest.y;return r<0?(this.size.height-=r,this.northWest.y=t.y):r>=this.size.height&&(this.size.height=r+1),this},t.prototype.containsOffset=function(t){return this.size.containsOffset(n.copyFrom(t).subtractOffset(this.northWest))},t.prototype.containsRectangle=function(t){return n.set(t.westX,t.northY).subtractOffset(this.northWest),!!this.size.containsOffset(n)&&(0!==t.width||0!==t.height)&&this.size.containsOffset(n.add(t.width-1,t.height-1))},t.prototype.overlapsRectangle=function(t){return this.northY<=t.northY+t.height-1&&this.southY>=t.northY&&this.westX<=t.westX+t.width-1&&this.eastX>=t.westX&&!this.empty&&0!==t.width&&0!==t.height},t.prototype.index=function(t){return this.size.index(n.copyFrom(t).subtractOffset(this.northWest))},t}();e.Rectangle=o},304:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Size=void 0;var r=function(){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.width=t,this.height=e}return t.prototype.toString=function(){return"("+this.width+"x"+this.height+")"},t.prototype.equals=function(t){return this.width===t.width&&this.height===t.height},Object.defineProperty(t.prototype,"empty",{get:function(){return 0===this.width||0===this.height},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"area",{get:function(){return this.width*this.height},enumerable:!1,configurable:!0}),t.prototype.set=function(t,e){return this.width=t,this.height=e,this},t.prototype.copyFrom=function(t){return this.width=t.width,this.height=t.height,this},t.prototype.add=function(t,e){return this.width+=t,this.height+=e,this},t.prototype.addOffset=function(t){return this.width+=t.x,this.height+=t.y,this},t.prototype.multiply=function(t){return this.width*=t,this.height*=t,this},t.prototype.containsOffset=function(t){return t.x>=0&&t.y>=0&&t.x{Object.defineProperty(e,"__esModule",{value:!0}),e.RasterMask=e.Path=e.Offset=e.DirectionFlags=e.Direction=e.makeBlockFractal=void 0;var i=r(102);Object.defineProperty(e,"makeBlockFractal",{enumerable:!0,get:function(){return i.makeBlockFractal}});var n=r(842);Object.defineProperty(e,"Direction",{enumerable:!0,get:function(){return n.Direction}}),Object.defineProperty(e,"DirectionFlags",{enumerable:!0,get:function(){return n.DirectionFlags}}),Object.defineProperty(e,"Offset",{enumerable:!0,get:function(){return n.Offset}}),Object.defineProperty(e,"Path",{enumerable:!0,get:function(){return n.Path}}),Object.defineProperty(e,"RasterMask",{enumerable:!0,get:function(){return n.RasterMask}})}},e={};return function r(i){if(e[i])return e[i].exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,r),n.exports}(607)})(); -//# sourceMappingURL=block-fractal-1.0.5.min.js.map \ No newline at end of file diff --git a/bin/block-fractal-1.0.5.min.js.map b/bin/block-fractal-1.0.5.min.js.map deleted file mode 100644 index aeeed9d..0000000 --- a/bin/block-fractal-1.0.5.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://BlockFractal/./src/block-fractal.ts","webpack://BlockFractal/./src/geom/direction-flags.ts","webpack://BlockFractal/./src/geom/direction.ts","webpack://BlockFractal/./src/geom/index.ts","webpack://BlockFractal/./src/geom/mask-rect.ts","webpack://BlockFractal/./src/geom/mask.ts","webpack://BlockFractal/./src/geom/offset.ts","webpack://BlockFractal/./src/geom/path.ts","webpack://BlockFractal/./src/geom/raster-mask.ts","webpack://BlockFractal/./src/geom/rectangle.ts","webpack://BlockFractal/./src/geom/size.ts","webpack://BlockFractal/./src/index.ts","webpack://BlockFractal/webpack/bootstrap","webpack://BlockFractal/webpack/startup"],"names":["nextToLastMatch","points","next","length","equals","addPoint","mask","set","splice","push","verticalHelper","random","variation","newPoints","i","p1","p2","x","yDir","y","np3","geom","Offset","get","index","findIndex","point","v","Math","floor","np1","np2","horizontalHelper","xDir","blockFractalIteration","bounds","Array","newBounds","Rectangle","westX","northY","width","height","MaskRect","param","shape","Path","Direction","EAST","SOUTH","WEST","NORTH","getBounds","getOffsets","off","iter","iterations","segments","curPoint","nextPoint","DirectionFlags","flags","ret","dir","DIRECTIONS","DIRECTIONS_STR","LOCAL_OFF","rect","initialValue","outsideValue","_rectangle","this","copyFrom","_mask","Mask","_outsideValue","toString","northWest","subtractOffset","getAt","containsOffset","setAt","value","size","_size","Size","_bits","ceil","area","fill","arrayIndex","bitMask","X_FROM_DIRECTION","Y_FROM_DIRECTION","other","max","abs","setFromDirection","add","addSize","addOffset","addDirection","addCardinalDirection","multiply","factor","distanceChebyshev","magnitudeChebyshev","distanceManhattan","magnitudeManhattan","sortedInsert","array","low","high","mid","start","map","segment","directionToString","join","getIsClosed","callback","cursor","southY","eastX","min","getArea","total","rasterize","lines","RasterMask","_lines","line","end","bandsAt","empty","extendToInclude","dx","dy","containsRectangle","overlapsRectangle","makeBlockFractal","__webpack_module_cache__","__webpack_require__","moduleId","exports","module","__webpack_modules__","call"],"mappings":"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","file":"block-fractal-1.0.5.min.js","sourcesContent":["import * as geom from './geom';\r\n\r\nexport interface BlockFractalParam {\r\n random?: () => number;\r\n iterations: number;\r\n shape?: geom.Path;\r\n variation?: number;\r\n}\r\n\r\nfunction nextToLastMatch(points: geom.Offset[], next: geom.Offset) {\r\n return points.length > 1 && points[points.length - 2].equals(next);\r\n}\r\n\r\nfunction addPoint(points: geom.Offset[], mask: geom.MaskRect, next: geom.Offset) {\r\n if (nextToLastMatch(points, next)) {\r\n mask.set(points.splice(points.length - 1, 1)[0], false);\r\n } else {\r\n points.push(next);\r\n mask.set(next, true);\r\n }\r\n}\r\n\r\nfunction verticalHelper(points: geom.Offset[], random: () => number, variation: number,\r\n newPoints: geom.Offset[], mask: geom.MaskRect, i: number,\r\n p1: geom.Offset, p2: geom.Offset) {\r\n const x = 2 * p1.x;\r\n const yDir = p2.y - p1.y;\r\n for (let y = 2 * p1.y; y !== 2 * p2.y; y += yDir) {\r\n const np3 = new geom.Offset(x, y + yDir);\r\n // console.info(`- ${np3}`);\r\n if (nextToLastMatch(newPoints, np3)) {\r\n // This can happen around a corner, when just before the corner\r\n // we dip into the corner\r\n // console.info(` remove ${newPoints[newPoints.length - 1]}`);\r\n mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false);\r\n continue;\r\n }\r\n if (i === points.length - 2 && mask.get(np3)) {\r\n // This can happen if the first point was on a corner and the\r\n // first move was to dip into the corner\r\n const index = newPoints.findIndex((point) => point.equals(np3));\r\n // console.info(`remove ${index} from beginning`);\r\n for (const point of newPoints.splice(0, index)) {\r\n mask.set(point, false);\r\n }\r\n addPoint(newPoints, mask, np3);\r\n break;\r\n }\r\n if (random() < variation) {\r\n const v = Math.floor(random() * 2) * 2 - 1;\r\n const np1 = new geom.Offset(x + v, y);\r\n const np2 = new geom.Offset(x + v, y + yDir);\r\n if (!mask.get(np2)) {\r\n if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) {\r\n addPoint(newPoints, mask, np1);\r\n addPoint(newPoints, mask, np2);\r\n }\r\n }\r\n }\r\n addPoint(newPoints, mask, np3);\r\n }\r\n}\r\n\r\nfunction horizontalHelper(points: geom.Offset[], random: () => number, variation: number,\r\n newPoints: geom.Offset[], mask: geom.MaskRect, i: number,\r\n p1: geom.Offset, p2: geom.Offset) {\r\n const y = 2 * p1.y;\r\n const xDir = p2.x - p1.x;\r\n for (let x = 2 * p1.x; x !== 2 * p2.x; x += xDir) {\r\n const np3 = new geom.Offset(x + xDir, y);\r\n // console.info(`- ${np3}`);\r\n if (nextToLastMatch(newPoints, np3)) {\r\n // This can happen around a corner, when just before the corner\r\n // we dip in the direction of the corner\r\n // console.info(` remove ${newPoints[newPoints.length - 1]}`);\r\n mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false);\r\n continue;\r\n }\r\n if (i === points.length - 2 && mask.get(np3)) {\r\n // This can happen if the first point was on a corner and the\r\n // first move was to dip into the corner\r\n const index = newPoints.findIndex((point) => point.equals(np3));\r\n // console.info(`remove ${index} from beginning`);\r\n for (const point of newPoints.splice(0, index)) {\r\n mask.set(point, false);\r\n }\r\n addPoint(newPoints, mask, np3);\r\n break;\r\n }\r\n if (random() < variation) {\r\n const v = Math.floor(random() * 2) * 2 - 1;\r\n const np1 = new geom.Offset(x, y + v);\r\n const np2 = new geom.Offset(x + xDir, y + v);\r\n if (!mask.get(np2)) {\r\n if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) {\r\n addPoint(newPoints, mask, np1);\r\n addPoint(newPoints, mask, np2);\r\n }\r\n }\r\n }\r\n addPoint(newPoints, mask, np3);\r\n }\r\n}\r\n\r\nfunction blockFractalIteration(random: () => number, points: geom.Offset[],\r\n bounds: geom.RectangleLike, variation: number) {\r\n const newPoints = new Array();\r\n const newBounds = new geom.Rectangle(\r\n bounds.westX * 2 - 1,\r\n bounds.northY * 2 - 1,\r\n bounds.width * 2 + 2,\r\n bounds.height * 2 + 2,\r\n );\r\n // console.info(` bounds ${newBounds}`);\r\n const mask = new geom.MaskRect(newBounds);\r\n for (let i = 0; i < points.length - 1; i ++) {\r\n const p1 = points[i];\r\n const p2 = points[i + 1];\r\n if (i === 0) {\r\n addPoint(newPoints, mask, new geom.Offset(p1.x * 2, p1.y * 2));\r\n }\r\n if (p1.x === p2.x) {\r\n verticalHelper(points, random, variation, newPoints, mask, i, p1, p2);\r\n } else {\r\n horizontalHelper(points, random, variation, newPoints, mask, i, p1, p2);\r\n }\r\n }\r\n return {\r\n points: newPoints,\r\n bounds: newBounds,\r\n };\r\n}\r\n\r\nexport function makeBlockFractal(param: BlockFractalParam): geom.Path {\r\n let {random, shape, variation} = param;\r\n if (typeof random === 'undefined') {\r\n random = Math.random;\r\n }\r\n if (typeof shape === 'undefined') {\r\n shape = new geom.Path({x: -1, y: -1}, [\r\n geom.Direction.EAST,\r\n geom.Direction.EAST,\r\n geom.Direction.SOUTH,\r\n geom.Direction.SOUTH,\r\n geom.Direction.WEST,\r\n geom.Direction.WEST,\r\n geom.Direction.NORTH,\r\n geom.Direction.NORTH,\r\n ]);\r\n }\r\n if (typeof variation === 'undefined') {\r\n variation = 0.4;\r\n }\r\n\r\n let points = new Array();\r\n let bounds = shape.getBounds();\r\n shape.getOffsets((off) => {\r\n points.push(new geom.Offset(off.x, off.y));\r\n });\r\n\r\n for (let iter = 0; iter < param.iterations; iter ++) {\r\n // console.info(`iteration ${iter + 1}`);\r\n ({points, bounds} = blockFractalIteration(random, points, bounds, variation));\r\n }\r\n\r\n const segments = new Array();\r\n for (let i = 0; i < points.length - 1; i ++) {\r\n const curPoint = points[i];\r\n const nextPoint = points[i + 1];\r\n if (nextPoint.y === curPoint.y - 1) {\r\n segments.push(geom.Direction.NORTH);\r\n } else if (nextPoint.x === curPoint.x + 1) {\r\n segments.push(geom.Direction.EAST);\r\n } else if (nextPoint.y === curPoint.y + 1) {\r\n segments.push(geom.Direction.SOUTH);\r\n } else if (nextPoint.x === curPoint.x - 1) {\r\n segments.push(geom.Direction.WEST);\r\n }\r\n }\r\n\r\n return new geom.Path(points[0], segments);\r\n}\r\n","import * as geom from '.';\r\n\r\n// tslint:disable:no-bitwise\r\n\r\nexport enum DirectionFlags {\r\n NONE = 0,\r\n NORTH = 1,\r\n EAST = 2,\r\n SOUTH = 4,\r\n WEST = 8,\r\n ALL = 15,\r\n}\r\n\r\nexport function directionFlagsToString(flags: DirectionFlags) {\r\n let ret = '[';\r\n if ((flags & DirectionFlags.NORTH) !== 0) {\r\n ret += 'N';\r\n }\r\n if ((flags & DirectionFlags.EAST) !== 0) {\r\n ret += 'E';\r\n }\r\n if ((flags & DirectionFlags.SOUTH) !== 0) {\r\n ret += 'S';\r\n }\r\n if ((flags & DirectionFlags.WEST) !== 0) {\r\n ret += 'W';\r\n }\r\n return ret + ']';\r\n}\r\n\r\n// conversion\r\n\r\nexport function directionFlagsFromDirection(dir: geom.Direction) {\r\n return (1 << dir) as DirectionFlags;\r\n}\r\n","// tslint:disable:no-bitwise\r\n\r\nexport enum Direction {\r\n NORTH = 0,\r\n EAST = 1,\r\n SOUTH = 2,\r\n WEST = 3,\r\n}\r\n\r\nexport const DIRECTIONS = [\r\n Direction.NORTH,\r\n Direction.EAST,\r\n Direction.SOUTH,\r\n Direction.WEST,\r\n];\r\n\r\nconst DIRECTIONS_STR = [\r\n 'N',\r\n 'E',\r\n 'S',\r\n 'W',\r\n];\r\n\r\nexport function directionToString(dir: Direction) {\r\n return DIRECTIONS_STR[dir];\r\n}\r\n\r\nexport function directionOpposite(dir: Direction) {\r\n return ((dir + 2) & 3) as Direction;\r\n}\r\n","export * from './direction';\r\nexport * from './direction-flags';\r\nexport * from './offset';\r\nexport * from './size';\r\nexport * from './rectangle';\r\nexport * from './mask';\r\nexport * from './mask-rect';\r\nexport * from './raster-mask';\r\nexport * from './path';\r\n","import * as geom from '.';\r\n\r\nconst LOCAL_OFF = new geom.Offset();\r\n\r\nexport class MaskRect implements geom.RectangleLike {\r\n private readonly _rectangle = new geom.Rectangle();\r\n private readonly _mask: geom.Mask;\r\n private readonly _outsideValue: boolean;\r\n\r\n constructor(rect: geom.RectangleLike, initialValue = false, outsideValue = false) {\r\n this._rectangle.copyFrom(rect);\r\n this._mask = new geom.Mask(rect, initialValue);\r\n this._outsideValue = outsideValue;\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `${this._rectangle.northWest}/${this._outsideValue}\\n${this._mask}`;\r\n }\r\n\r\n get westX() {\r\n return this._rectangle.westX;\r\n }\r\n\r\n get northY() {\r\n return this._rectangle.northY;\r\n }\r\n\r\n get width() {\r\n return this._rectangle.width;\r\n }\r\n\r\n get height() {\r\n return this._rectangle.height;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return this._mask.index(LOCAL_OFF.copyFrom(off).subtractOffset(this._rectangle.northWest));\r\n }\r\n\r\n getAt(index: number) {\r\n return this._mask.getAt(index);\r\n }\r\n\r\n get(off: geom.OffsetLike) {\r\n if (!this._rectangle.containsOffset(off)) {\r\n return this._outsideValue;\r\n }\r\n return this._mask.getAt(this._rectangle.index(off));\r\n }\r\n\r\n // mutators\r\n\r\n setAt(index: number, value: boolean) {\r\n this._mask.setAt(index, value);\r\n return this;\r\n }\r\n\r\n set(off: geom.OffsetLike, value: boolean) {\r\n this._mask.setAt(this._rectangle.index(off), value);\r\n return this;\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport class Mask implements geom.SizeLike {\r\n private readonly _size = new geom.Size();\r\n private readonly _bits: number[];\r\n // TODO consider Uint8Array for bits\r\n\r\n constructor(size: geom.SizeLike, initialValue = false) {\r\n this._size.copyFrom(size);\r\n this._bits = new Array(Math.ceil(this._size.area / 32)).fill(initialValue ? 0xffffffff : 0);\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n let ret = '';\r\n const off = new geom.Offset();\r\n for (let y = 0; y < this._size.height; y ++) {\r\n for (let x = 0; x < this._size.width; x ++) {\r\n off.set(x, y);\r\n ret += this.get(off.set(x, y)) ? '☑' : '☐';\r\n }\r\n ret += '\\n';\r\n }\r\n return ret;\r\n }\r\n\r\n get width() {\r\n return this._size.width;\r\n }\r\n\r\n get height() {\r\n return this._size.height;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return this._size.index(off);\r\n }\r\n\r\n getAt(index: number) {\r\n // tslint:disable:no-bitwise\r\n const arrayIndex = index >>> 5;\r\n const bitMask = 1 << (index & 31);\r\n return (this._bits[arrayIndex] & bitMask) !== 0;\r\n // tslint:enable:no-bitwise\r\n }\r\n\r\n get(off: geom.OffsetLike) {\r\n return this.getAt(this.index(off));\r\n }\r\n\r\n // mutators\r\n\r\n setAt(index: number, value: boolean) {\r\n // tslint:disable:no-bitwise\r\n const arrayIndex = index >>> 5;\r\n const bitMask = 1 << (index & 31);\r\n if (value) {\r\n this._bits[arrayIndex] |= bitMask;\r\n } else {\r\n this._bits[arrayIndex] &= ~bitMask;\r\n }\r\n // tslint:enable:no-bitwise\r\n return this;\r\n }\r\n\r\n set(off: geom.OffsetLike, value: boolean) {\r\n return this.setAt(this.index(off), value);\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nconst X_FROM_DIRECTION = [ 0, 1, 0, -1 ];\r\nconst Y_FROM_DIRECTION = [ -1, 0, 1, 0 ];\r\n\r\nexport interface OffsetLike {\r\n readonly x: number;\r\n readonly y: number;\r\n}\r\n\r\nexport class Offset implements OffsetLike {\r\n x: number;\r\n y: number;\r\n\r\n constructor();\r\n constructor(x: number, y: number);\r\n constructor(x?: number, y?: number) {\r\n if (typeof x === 'undefined') {\r\n x = 0;\r\n }\r\n if (typeof y === 'undefined') {\r\n y = 0;\r\n }\r\n this.x = x;\r\n this.y = y;\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `(${this.x},${this.y})`;\r\n }\r\n\r\n equals(other: OffsetLike) {\r\n return this.x === other.x && this.y === other.y;\r\n }\r\n\r\n // chebyshev: can move in any direction (diagonals are ok)\r\n get magnitudeChebyshev() {\r\n return Math.max(Math.abs(this.x), Math.abs(this.y));\r\n }\r\n\r\n // manhattan: can move only in cardinal directions (no diagonals)\r\n get magnitudeManhattan(): number {\r\n return Math.abs(this.x) + Math.abs(this.y);\r\n }\r\n\r\n // mutators\r\n\r\n set(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n }\r\n\r\n copyFrom(other: OffsetLike) {\r\n this.x = other.x;\r\n this.y = other.y;\r\n return this;\r\n }\r\n\r\n setFromDirection(dir: geom.Direction) {\r\n this.x = X_FROM_DIRECTION[dir];\r\n this.y = Y_FROM_DIRECTION[dir];\r\n return this;\r\n }\r\n\r\n add(x: number, y: number) {\r\n this.x += x;\r\n this.y += y;\r\n return this;\r\n }\r\n\r\n addSize(size: geom.SizeLike) {\r\n this.x += size.width;\r\n this.y += size.height;\r\n return this;\r\n }\r\n\r\n addOffset(off: OffsetLike) {\r\n this.x += off.x;\r\n this.y += off.y;\r\n return this;\r\n }\r\n\r\n addDirection(dir: geom.Direction) {\r\n this.x += X_FROM_DIRECTION[dir];\r\n this.y += Y_FROM_DIRECTION[dir];\r\n return this;\r\n }\r\n\r\n addCardinalDirection(dir: geom.Direction) {\r\n this.x += X_FROM_DIRECTION[dir];\r\n this.y += Y_FROM_DIRECTION[dir];\r\n return this;\r\n }\r\n\r\n subtractOffset(off: OffsetLike) {\r\n this.x -= off.x;\r\n this.y -= off.y;\r\n return this;\r\n }\r\n\r\n multiply(factor: number) {\r\n this.x *= factor;\r\n this.y *= factor;\r\n return this;\r\n }\r\n\r\n // utilities\r\n\r\n // chebyshev: can move in any direction (diagonals are ok)\r\n distanceChebyshev(other: OffsetLike) {\r\n return this.subtractOffset(other).magnitudeChebyshev;\r\n }\r\n\r\n // manhattan: can move only in cardinal directions (no diagonals)\r\n distanceManhattan(other?: OffsetLike): number {\r\n return this.subtractOffset(other).magnitudeManhattan;\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nconst LOCAL_OFF = new geom.Offset();\r\n\r\nfunction sortedInsert(array: number[], value: number) {\r\n let low = 0;\r\n let high = array.length;\r\n\r\n while (low < high) {\r\n // tslint:disable-next-line:no-bitwise\r\n const mid = (low + high) >>> 1;\r\n if (array[mid] < value) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n\r\n array.splice(low, 0, value);\r\n}\r\n\r\nexport class Path {\r\n start: geom.Offset;\r\n segments: geom.Direction[];\r\n\r\n constructor();\r\n constructor(start: geom.OffsetLike, segments: geom.Direction[]);\r\n constructor(start?: geom.OffsetLike, segments?: geom.Direction[]) {\r\n this.start = new geom.Offset();\r\n if (typeof start !== 'undefined') {\r\n this.start.copyFrom(start);\r\n }\r\n if (typeof segments === 'undefined') {\r\n segments = new Array();\r\n }\r\n this.segments = segments;\r\n }\r\n\r\n toString() {\r\n return `${this.start.toString()}:`\r\n + `${this.segments.map((segment) => geom.directionToString(segment)).join('')}`;\r\n }\r\n\r\n getIsClosed() {\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n LOCAL_OFF.addDirection(segment);\r\n }\r\n return this.start.equals(LOCAL_OFF);\r\n }\r\n\r\n getOffsets(callback: (off: geom.OffsetLike) => void) {\r\n const cursor = new geom.Offset();\r\n cursor.copyFrom(this.start);\r\n callback(cursor);\r\n for (const segment of this.segments) {\r\n cursor.addDirection(segment);\r\n callback(cursor);\r\n }\r\n }\r\n\r\n getBounds(): geom.Rectangle {\r\n let northY = this.start.y;\r\n let southY = northY;\r\n let westX = this.start.x;\r\n let eastX = westX;\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n LOCAL_OFF.addDirection(segment);\r\n switch (segment) {\r\n case geom.Direction.NORTH:\r\n northY = Math.min(northY, LOCAL_OFF.y);\r\n break;\r\n case geom.Direction.EAST:\r\n eastX = Math.max(eastX, LOCAL_OFF.x);\r\n break;\r\n case geom.Direction.SOUTH:\r\n southY = Math.max(southY, LOCAL_OFF.y);\r\n break;\r\n case geom.Direction.WEST:\r\n westX = Math.min(westX, LOCAL_OFF.x);\r\n break;\r\n }\r\n }\r\n return new geom.Rectangle(westX, northY, eastX - westX + 1, southY - northY + 1);\r\n }\r\n\r\n getArea() {\r\n let total = 0;\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n LOCAL_OFF.addDirection(segment);\r\n switch (segment) {\r\n case geom.Direction.NORTH:\r\n total -= LOCAL_OFF.x;\r\n break;\r\n case geom.Direction.SOUTH:\r\n total += LOCAL_OFF.x;\r\n break;\r\n }\r\n }\r\n return Math.abs(total);\r\n }\r\n\r\n rasterize(bounds?: geom.RectangleLike): geom.RasterMask {\r\n const lines = new Array();\r\n if (typeof bounds === 'undefined') {\r\n bounds = this.getBounds();\r\n }\r\n LOCAL_OFF.copyFrom(this.start);\r\n const {northY} = bounds;\r\n const southY = northY + bounds.height - 1;\r\n for (let y = northY; y < southY; y ++) {\r\n lines.push([]);\r\n }\r\n LOCAL_OFF.copyFrom(this.start);\r\n for (const segment of this.segments) {\r\n if (segment === geom.Direction.SOUTH) {\r\n sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x);\r\n }\r\n LOCAL_OFF.addDirection(segment);\r\n if (segment === geom.Direction.NORTH) {\r\n sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x);\r\n }\r\n }\r\n return new geom.RasterMask({\r\n westX: bounds.westX,\r\n northY: bounds.northY,\r\n width: bounds.width - 1,\r\n height: bounds.height - 1,\r\n }, lines);\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport class RasterMask implements geom.RectangleLike, geom.SizeLike {\r\n northWest: geom.Offset;\r\n size: geom.Size;\r\n private _lines: number[][];\r\n\r\n constructor(bounds: geom.RectangleLike, lines: number[][]) {\r\n this.northWest = new geom.Offset(bounds.westX, bounds.northY);\r\n this.size = new geom.Size(bounds.width, bounds.height);\r\n this._lines = lines;\r\n }\r\n\r\n toString() {\r\n let shape = '';\r\n for (let y = 0; y < this.height; y ++) {\r\n const line = this._lines[y];\r\n let x = this.westX;\r\n for (let i = 0; i < line.length; i += 2) {\r\n const start = line[i];\r\n const end = line[i + 1];\r\n while (x < start) {\r\n shape += '∙';\r\n x ++;\r\n }\r\n while (x < end) {\r\n shape += '█';\r\n x ++;\r\n }\r\n }\r\n while (x <= this.eastX) {\r\n shape += '∙';\r\n x ++;\r\n }\r\n shape += '\\n';\r\n }\r\n return `${this.northWest}\\n${shape}`;\r\n }\r\n\r\n // accessors\r\n\r\n get northY() {\r\n return this.northWest.y;\r\n }\r\n\r\n get southY() {\r\n return this.northWest.y + this.size.height - 1;\r\n }\r\n\r\n get westX() {\r\n return this.northWest.x;\r\n }\r\n\r\n get eastX() {\r\n return this.northWest.x + this.size.width - 1;\r\n }\r\n\r\n get width() {\r\n return this.size.width;\r\n }\r\n\r\n get height() {\r\n return this.size.height;\r\n }\r\n\r\n get(x: number, y: number) {\r\n if (y < this.northY || y > this.southY) {\r\n return false;\r\n }\r\n const line = this._lines[y - this.northY];\r\n for (let i = 0; i < line.length; i += 2) {\r\n if (x >= line[i] && x < line[i + 1]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n bandsAt(y: number, callback: (westX: number, eastX: number) => void) {\r\n if (y < this.northY || y > this.southY) {\r\n return;\r\n }\r\n const line = this._lines[y - this.northY];\r\n for (let i = 0; i < line.length; i += 2) {\r\n callback(line[i], line[i + 1] - 1);\r\n }\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport interface RectangleLike extends geom.SizeLike {\r\n readonly westX: number;\r\n readonly northY: number;\r\n}\r\n\r\nconst LOCAL_OFF = new geom.Offset();\r\n\r\nexport class Rectangle implements RectangleLike, geom.SizeLike {\r\n northWest: geom.Offset;\r\n size: geom.Size;\r\n\r\n constructor();\r\n constructor(westX: number, northY: number, width: number, height: number);\r\n constructor(westX?: number, northY?: number, width?: number, height?: number) {\r\n if (typeof westX === 'undefined') {\r\n westX = 0;\r\n }\r\n if (typeof northY === 'undefined') {\r\n northY = 0;\r\n }\r\n if (typeof width === 'undefined') {\r\n width = 0;\r\n }\r\n if (typeof height === 'undefined') {\r\n height = 0;\r\n }\r\n this.northWest = new geom.Offset(westX, northY);\r\n this.size = new geom.Size(width, height);\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `(${this.westX},${this.northY} ${this.width}x${this.height})`;\r\n }\r\n\r\n equals(other: RectangleLike) {\r\n return this.westX === other.westX && this.northY === other.northY && this.size.equals(other);\r\n }\r\n\r\n get northY() {\r\n return this.northWest.y;\r\n }\r\n\r\n get southY() {\r\n return this.northWest.y + this.size.height - 1;\r\n }\r\n\r\n get westX() {\r\n return this.northWest.x;\r\n }\r\n\r\n get eastX() {\r\n return this.northWest.x + this.size.width - 1;\r\n }\r\n\r\n get width() {\r\n return this.size.width;\r\n }\r\n\r\n get height() {\r\n return this.size.height;\r\n }\r\n\r\n get empty() {\r\n return this.size.empty;\r\n }\r\n\r\n get area() {\r\n return this.size.area;\r\n }\r\n\r\n // mutators\r\n\r\n set(westX: number, northY: number, width: number, height: number) {\r\n this.northWest.set(westX, northY);\r\n this.size.set(width, height);\r\n return this;\r\n }\r\n\r\n copyFrom(other: RectangleLike) {\r\n this.northWest.set(other.westX, other.northY);\r\n this.size.set(other.width, other.height);\r\n return this;\r\n }\r\n\r\n extendToInclude(off: geom.OffsetLike) {\r\n const dx = off.x - this.westX;\r\n if (dx < 0) {\r\n this.size.width -= dx;\r\n this.northWest.x = off.x;\r\n } else if (dx >= this.size.width) {\r\n this.size.width = dx + 1;\r\n }\r\n const dy = off.y - this.northWest.y;\r\n if (dy < 0) {\r\n this.size.height -= dy;\r\n this.northWest.y = off.y;\r\n } else if (dy >= this.size.height) {\r\n this.size.height = dy + 1;\r\n }\r\n return this;\r\n }\r\n\r\n // utilities\r\n\r\n containsOffset(off: geom.OffsetLike) {\r\n return this.size.containsOffset(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest));\r\n }\r\n\r\n containsRectangle(other: RectangleLike) {\r\n LOCAL_OFF.set(other.westX, other.northY).subtractOffset(this.northWest);\r\n if (!this.size.containsOffset(LOCAL_OFF)) {\r\n return false;\r\n }\r\n if (other.width === 0 && other.height === 0) {\r\n return false;\r\n }\r\n return this.size.containsOffset(LOCAL_OFF.add(other.width - 1, other.height - 1));\r\n }\r\n\r\n overlapsRectangle(other: RectangleLike) {\r\n return this.northY <= other.northY + other.height - 1\r\n && this.southY >= other.northY\r\n && this.westX <= other.westX + other.width - 1\r\n && this.eastX >= other.westX\r\n && !this.empty\r\n && other.width !== 0 && other.height !== 0;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return this.size.index(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest));\r\n }\r\n}\r\n","import * as geom from '.';\r\n\r\nexport interface SizeLike {\r\n readonly width: number;\r\n readonly height: number;\r\n}\r\n\r\nexport class Size implements SizeLike {\r\n width: number;\r\n height: number;\r\n\r\n constructor();\r\n constructor(width: number, height: number);\r\n constructor(width?: number, height?: number) {\r\n if (typeof width === 'undefined') {\r\n width = 0;\r\n }\r\n if (typeof height === 'undefined') {\r\n height = 0;\r\n }\r\n this.width = width;\r\n this.height = height;\r\n }\r\n\r\n // accessors\r\n\r\n toString() {\r\n return `(${this.width}x${this.height})`;\r\n }\r\n\r\n equals(other: SizeLike) {\r\n return this.width === other.width && this.height === other.height;\r\n }\r\n\r\n get empty() {\r\n return this.width === 0 || this.height === 0;\r\n }\r\n\r\n get area() {\r\n return this.width * this.height;\r\n }\r\n\r\n // mutators\r\n\r\n set(width: number, height: number) {\r\n this.width = width;\r\n this.height = height;\r\n return this;\r\n }\r\n\r\n copyFrom(other: SizeLike) {\r\n this.width = other.width;\r\n this.height = other.height;\r\n return this;\r\n }\r\n\r\n add(width: number, height: number) {\r\n this.width += width;\r\n this.height += height;\r\n return this;\r\n }\r\n\r\n addOffset(off: geom.OffsetLike) {\r\n this.width += off.x;\r\n this.height += off.y;\r\n return this;\r\n }\r\n\r\n multiply(factor: number) {\r\n this.width *= factor;\r\n this.height *= factor;\r\n return this;\r\n }\r\n\r\n // TODO: rotate\r\n\r\n // utilities\r\n\r\n containsOffset(off: geom.OffsetLike) {\r\n return off.x >= 0 && off.y >= 0 && off.x < this.width && off.y < this.height;\r\n }\r\n\r\n index(off: geom.OffsetLike) {\r\n return off.y * this.width + off.x;\r\n }\r\n}\r\n","/*\r\n * BlockFractal\r\n * github.com/sbj42/block-fractal\r\n * James Clark\r\n * Licensed under the MIT license.\r\n */\r\n\r\nexport {makeBlockFractal} from './block-fractal';\r\nexport {Direction, DirectionFlags, Offset, Path, RasterMask} from './geom';\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(607);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/build/block-fractal.d.ts b/build/block-fractal.d.ts deleted file mode 100644 index 61c08ba..0000000 --- a/build/block-fractal.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as geom from './geom'; -export interface BlockFractalParam { - random?: () => number; - iterations: number; - shape?: geom.Path; - variation?: number; -} -export declare function makeBlockFractal(param: BlockFractalParam): geom.Path; diff --git a/build/block-fractal.js b/build/block-fractal.js deleted file mode 100644 index f6dec3d..0000000 --- a/build/block-fractal.js +++ /dev/null @@ -1,178 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.makeBlockFractal = void 0; -var geom = require("./geom"); -function nextToLastMatch(points, next) { - return points.length > 1 && points[points.length - 2].equals(next); -} -function addPoint(points, mask, next) { - if (nextToLastMatch(points, next)) { - mask.set(points.splice(points.length - 1, 1)[0], false); - } - else { - points.push(next); - mask.set(next, true); - } -} -function verticalHelper(points, random, variation, newPoints, mask, i, p1, p2) { - var x = 2 * p1.x; - var yDir = p2.y - p1.y; - var _loop_1 = function (y) { - var np3 = new geom.Offset(x, y + yDir); - // console.info(`- ${np3}`); - if (nextToLastMatch(newPoints, np3)) { - // This can happen around a corner, when just before the corner - // we dip into the corner - // console.info(` remove ${newPoints[newPoints.length - 1]}`); - mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false); - return "continue"; - } - if (i === points.length - 2 && mask.get(np3)) { - // This can happen if the first point was on a corner and the - // first move was to dip into the corner - var index = newPoints.findIndex(function (point) { return point.equals(np3); }); - // console.info(`remove ${index} from beginning`); - for (var _i = 0, _a = newPoints.splice(0, index); _i < _a.length; _i++) { - var point = _a[_i]; - mask.set(point, false); - } - addPoint(newPoints, mask, np3); - return "break"; - } - if (random() < variation) { - var v = Math.floor(random() * 2) * 2 - 1; - var np1 = new geom.Offset(x + v, y); - var np2 = new geom.Offset(x + v, y + yDir); - if (!mask.get(np2)) { - if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) { - addPoint(newPoints, mask, np1); - addPoint(newPoints, mask, np2); - } - } - } - addPoint(newPoints, mask, np3); - }; - for (var y = 2 * p1.y; y !== 2 * p2.y; y += yDir) { - var state_1 = _loop_1(y); - if (state_1 === "break") - break; - } -} -function horizontalHelper(points, random, variation, newPoints, mask, i, p1, p2) { - var y = 2 * p1.y; - var xDir = p2.x - p1.x; - var _loop_2 = function (x) { - var np3 = new geom.Offset(x + xDir, y); - // console.info(`- ${np3}`); - if (nextToLastMatch(newPoints, np3)) { - // This can happen around a corner, when just before the corner - // we dip in the direction of the corner - // console.info(` remove ${newPoints[newPoints.length - 1]}`); - mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false); - return "continue"; - } - if (i === points.length - 2 && mask.get(np3)) { - // This can happen if the first point was on a corner and the - // first move was to dip into the corner - var index = newPoints.findIndex(function (point) { return point.equals(np3); }); - // console.info(`remove ${index} from beginning`); - for (var _i = 0, _a = newPoints.splice(0, index); _i < _a.length; _i++) { - var point = _a[_i]; - mask.set(point, false); - } - addPoint(newPoints, mask, np3); - return "break"; - } - if (random() < variation) { - var v = Math.floor(random() * 2) * 2 - 1; - var np1 = new geom.Offset(x, y + v); - var np2 = new geom.Offset(x + xDir, y + v); - if (!mask.get(np2)) { - if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) { - addPoint(newPoints, mask, np1); - addPoint(newPoints, mask, np2); - } - } - } - addPoint(newPoints, mask, np3); - }; - for (var x = 2 * p1.x; x !== 2 * p2.x; x += xDir) { - var state_2 = _loop_2(x); - if (state_2 === "break") - break; - } -} -function blockFractalIteration(random, points, bounds, variation) { - var newPoints = new Array(); - var newBounds = new geom.Rectangle(bounds.westX * 2 - 1, bounds.northY * 2 - 1, bounds.width * 2 + 2, bounds.height * 2 + 2); - // console.info(` bounds ${newBounds}`); - var mask = new geom.MaskRect(newBounds); - for (var i = 0; i < points.length - 1; i++) { - var p1 = points[i]; - var p2 = points[i + 1]; - if (i === 0) { - addPoint(newPoints, mask, new geom.Offset(p1.x * 2, p1.y * 2)); - } - if (p1.x === p2.x) { - verticalHelper(points, random, variation, newPoints, mask, i, p1, p2); - } - else { - horizontalHelper(points, random, variation, newPoints, mask, i, p1, p2); - } - } - return { - points: newPoints, - bounds: newBounds, - }; -} -function makeBlockFractal(param) { - var _a; - var random = param.random, shape = param.shape, variation = param.variation; - if (typeof random === 'undefined') { - random = Math.random; - } - if (typeof shape === 'undefined') { - shape = new geom.Path({ x: -1, y: -1 }, [ - geom.Direction.EAST, - geom.Direction.EAST, - geom.Direction.SOUTH, - geom.Direction.SOUTH, - geom.Direction.WEST, - geom.Direction.WEST, - geom.Direction.NORTH, - geom.Direction.NORTH, - ]); - } - if (typeof variation === 'undefined') { - variation = 0.4; - } - var points = new Array(); - var bounds = shape.getBounds(); - shape.getOffsets(function (off) { - points.push(new geom.Offset(off.x, off.y)); - }); - for (var iter = 0; iter < param.iterations; iter++) { - // console.info(`iteration ${iter + 1}`); - (_a = blockFractalIteration(random, points, bounds, variation), points = _a.points, bounds = _a.bounds); - } - var segments = new Array(); - for (var i = 0; i < points.length - 1; i++) { - var curPoint = points[i]; - var nextPoint = points[i + 1]; - if (nextPoint.y === curPoint.y - 1) { - segments.push(geom.Direction.NORTH); - } - else if (nextPoint.x === curPoint.x + 1) { - segments.push(geom.Direction.EAST); - } - else if (nextPoint.y === curPoint.y + 1) { - segments.push(geom.Direction.SOUTH); - } - else if (nextPoint.x === curPoint.x - 1) { - segments.push(geom.Direction.WEST); - } - } - return new geom.Path(points[0], segments); -} -exports.makeBlockFractal = makeBlockFractal; -//# sourceMappingURL=block-fractal.js.map \ No newline at end of file diff --git a/build/block-fractal.js.map b/build/block-fractal.js.map deleted file mode 100644 index be42ac5..0000000 --- a/build/block-fractal.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"block-fractal.js","sourceRoot":"","sources":["../src/block-fractal.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/geom/direction-flags.d.ts b/build/geom/direction-flags.d.ts deleted file mode 100644 index 76f99ae..0000000 --- a/build/geom/direction-flags.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import * as geom from '.'; -export declare enum DirectionFlags { - NONE = 0, - NORTH = 1, - EAST = 2, - SOUTH = 4, - WEST = 8, - ALL = 15 -} -export declare function directionFlagsToString(flags: DirectionFlags): string; -export declare function directionFlagsFromDirection(dir: geom.Direction): geom.DirectionFlags; diff --git a/build/geom/direction-flags.js b/build/geom/direction-flags.js deleted file mode 100644 index 217cd56..0000000 --- a/build/geom/direction-flags.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.directionFlagsFromDirection = exports.directionFlagsToString = exports.DirectionFlags = void 0; -// tslint:disable:no-bitwise -var DirectionFlags; -(function (DirectionFlags) { - DirectionFlags[DirectionFlags["NONE"] = 0] = "NONE"; - DirectionFlags[DirectionFlags["NORTH"] = 1] = "NORTH"; - DirectionFlags[DirectionFlags["EAST"] = 2] = "EAST"; - DirectionFlags[DirectionFlags["SOUTH"] = 4] = "SOUTH"; - DirectionFlags[DirectionFlags["WEST"] = 8] = "WEST"; - DirectionFlags[DirectionFlags["ALL"] = 15] = "ALL"; -})(DirectionFlags = exports.DirectionFlags || (exports.DirectionFlags = {})); -function directionFlagsToString(flags) { - var ret = '['; - if ((flags & DirectionFlags.NORTH) !== 0) { - ret += 'N'; - } - if ((flags & DirectionFlags.EAST) !== 0) { - ret += 'E'; - } - if ((flags & DirectionFlags.SOUTH) !== 0) { - ret += 'S'; - } - if ((flags & DirectionFlags.WEST) !== 0) { - ret += 'W'; - } - return ret + ']'; -} -exports.directionFlagsToString = directionFlagsToString; -// conversion -function directionFlagsFromDirection(dir) { - return (1 << dir); -} -exports.directionFlagsFromDirection = directionFlagsFromDirection; -//# sourceMappingURL=direction-flags.js.map \ No newline at end of file diff --git a/build/geom/direction-flags.js.map b/build/geom/direction-flags.js.map deleted file mode 100644 index 1043d94..0000000 --- a/build/geom/direction-flags.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"direction-flags.js","sourceRoot":"","sources":["../../src/geom/direction-flags.ts"],"names":[],"mappings":";;;AAEA,4BAA4B;AAE5B,IAAY,cAOX;AAPD,WAAY,cAAc;IACtB,mDAAS,CAAA;IACT,qDAAS,CAAA;IACT,mDAAS,CAAA;IACT,qDAAS,CAAA;IACT,mDAAS,CAAA;IACT,kDAAU,CAAA;AACd,CAAC,EAPW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAOzB;AAED,SAAgB,sBAAsB,CAAC,KAAqB;IACxD,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACtC,GAAG,IAAI,GAAG,CAAC;KACd;IACD,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACrC,GAAG,IAAI,GAAG,CAAC;KACd;IACD,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACtC,GAAG,IAAI,GAAG,CAAC;KACd;IACD,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACrC,GAAG,IAAI,GAAG,CAAC;KACd;IACD,OAAO,GAAG,GAAG,GAAG,CAAC;AACrB,CAAC;AAfD,wDAeC;AAED,aAAa;AAEb,SAAgB,2BAA2B,CAAC,GAAmB;IAC3D,OAAO,CAAC,CAAC,IAAI,GAAG,CAAmB,CAAC;AACxC,CAAC;AAFD,kEAEC"} \ No newline at end of file diff --git a/build/geom/direction.d.ts b/build/geom/direction.d.ts deleted file mode 100644 index 335d0a1..0000000 --- a/build/geom/direction.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export declare enum Direction { - NORTH = 0, - EAST = 1, - SOUTH = 2, - WEST = 3 -} -export declare const DIRECTIONS: Direction[]; -export declare function directionToString(dir: Direction): string; -export declare function directionOpposite(dir: Direction): Direction; diff --git a/build/geom/direction.js b/build/geom/direction.js deleted file mode 100644 index 0aa2048..0000000 --- a/build/geom/direction.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -// tslint:disable:no-bitwise -Object.defineProperty(exports, "__esModule", { value: true }); -exports.directionOpposite = exports.directionToString = exports.DIRECTIONS = exports.Direction = void 0; -var Direction; -(function (Direction) { - Direction[Direction["NORTH"] = 0] = "NORTH"; - Direction[Direction["EAST"] = 1] = "EAST"; - Direction[Direction["SOUTH"] = 2] = "SOUTH"; - Direction[Direction["WEST"] = 3] = "WEST"; -})(Direction = exports.Direction || (exports.Direction = {})); -exports.DIRECTIONS = [ - Direction.NORTH, - Direction.EAST, - Direction.SOUTH, - Direction.WEST, -]; -var DIRECTIONS_STR = [ - 'N', - 'E', - 'S', - 'W', -]; -function directionToString(dir) { - return DIRECTIONS_STR[dir]; -} -exports.directionToString = directionToString; -function directionOpposite(dir) { - return ((dir + 2) & 3); -} -exports.directionOpposite = directionOpposite; -//# sourceMappingURL=direction.js.map \ No newline at end of file diff --git a/build/geom/direction.js.map b/build/geom/direction.js.map deleted file mode 100644 index b1f775d..0000000 --- a/build/geom/direction.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"direction.js","sourceRoot":"","sources":["../../src/geom/direction.ts"],"names":[],"mappings":";AAAA,4BAA4B;;;AAE5B,IAAY,SAKX;AALD,WAAY,SAAS;IACjB,2CAAS,CAAA;IACT,yCAAS,CAAA;IACT,2CAAS,CAAA;IACT,yCAAS,CAAA;AACb,CAAC,EALW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAKpB;AAEY,QAAA,UAAU,GAAG;IACtB,SAAS,CAAC,KAAK;IACf,SAAS,CAAC,IAAI;IACd,SAAS,CAAC,KAAK;IACf,SAAS,CAAC,IAAI;CACjB,CAAC;AAEF,IAAM,cAAc,GAAG;IACnB,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;CACN,CAAC;AAEF,SAAgB,iBAAiB,CAAC,GAAc;IAC5C,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAFD,8CAEC;AAED,SAAgB,iBAAiB,CAAC,GAAc;IAC5C,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAc,CAAC;AACxC,CAAC;AAFD,8CAEC"} \ No newline at end of file diff --git a/build/geom/index.d.ts b/build/geom/index.d.ts deleted file mode 100644 index d700063..0000000 --- a/build/geom/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './direction'; -export * from './direction-flags'; -export * from './offset'; -export * from './size'; -export * from './rectangle'; -export * from './mask'; -export * from './mask-rect'; -export * from './raster-mask'; -export * from './path'; diff --git a/build/geom/index.js b/build/geom/index.js deleted file mode 100644 index 6852d6a..0000000 --- a/build/geom/index.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("./direction"), exports); -__exportStar(require("./direction-flags"), exports); -__exportStar(require("./offset"), exports); -__exportStar(require("./size"), exports); -__exportStar(require("./rectangle"), exports); -__exportStar(require("./mask"), exports); -__exportStar(require("./mask-rect"), exports); -__exportStar(require("./raster-mask"), exports); -__exportStar(require("./path"), exports); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/geom/index.js.map b/build/geom/index.js.map deleted file mode 100644 index 50918f2..0000000 --- a/build/geom/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/geom/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAA4B;AAC5B,oDAAkC;AAClC,2CAAyB;AACzB,yCAAuB;AACvB,8CAA4B;AAC5B,yCAAuB;AACvB,8CAA4B;AAC5B,gDAA8B;AAC9B,yCAAuB"} \ No newline at end of file diff --git a/build/geom/mask-rect.d.ts b/build/geom/mask-rect.d.ts deleted file mode 100644 index 3be290d..0000000 --- a/build/geom/mask-rect.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as geom from '.'; -export declare class MaskRect implements geom.RectangleLike { - private readonly _rectangle; - private readonly _mask; - private readonly _outsideValue; - constructor(rect: geom.RectangleLike, initialValue?: boolean, outsideValue?: boolean); - toString(): string; - get westX(): number; - get northY(): number; - get width(): number; - get height(): number; - index(off: geom.OffsetLike): number; - getAt(index: number): boolean; - get(off: geom.OffsetLike): boolean; - setAt(index: number, value: boolean): this; - set(off: geom.OffsetLike, value: boolean): this; -} diff --git a/build/geom/mask-rect.js b/build/geom/mask-rect.js deleted file mode 100644 index fae6991..0000000 --- a/build/geom/mask-rect.js +++ /dev/null @@ -1,71 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MaskRect = void 0; -var geom = require("."); -var LOCAL_OFF = new geom.Offset(); -var MaskRect = /** @class */ (function () { - function MaskRect(rect, initialValue, outsideValue) { - if (initialValue === void 0) { initialValue = false; } - if (outsideValue === void 0) { outsideValue = false; } - this._rectangle = new geom.Rectangle(); - this._rectangle.copyFrom(rect); - this._mask = new geom.Mask(rect, initialValue); - this._outsideValue = outsideValue; - } - // accessors - MaskRect.prototype.toString = function () { - return this._rectangle.northWest + "/" + this._outsideValue + "\n" + this._mask; - }; - Object.defineProperty(MaskRect.prototype, "westX", { - get: function () { - return this._rectangle.westX; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(MaskRect.prototype, "northY", { - get: function () { - return this._rectangle.northY; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(MaskRect.prototype, "width", { - get: function () { - return this._rectangle.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(MaskRect.prototype, "height", { - get: function () { - return this._rectangle.height; - }, - enumerable: false, - configurable: true - }); - MaskRect.prototype.index = function (off) { - return this._mask.index(LOCAL_OFF.copyFrom(off).subtractOffset(this._rectangle.northWest)); - }; - MaskRect.prototype.getAt = function (index) { - return this._mask.getAt(index); - }; - MaskRect.prototype.get = function (off) { - if (!this._rectangle.containsOffset(off)) { - return this._outsideValue; - } - return this._mask.getAt(this._rectangle.index(off)); - }; - // mutators - MaskRect.prototype.setAt = function (index, value) { - this._mask.setAt(index, value); - return this; - }; - MaskRect.prototype.set = function (off, value) { - this._mask.setAt(this._rectangle.index(off), value); - return this; - }; - return MaskRect; -}()); -exports.MaskRect = MaskRect; -//# sourceMappingURL=mask-rect.js.map \ No newline at end of file diff --git a/build/geom/mask-rect.js.map b/build/geom/mask-rect.js.map deleted file mode 100644 index 4d56dd3..0000000 --- a/build/geom/mask-rect.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mask-rect.js","sourceRoot":"","sources":["../../src/geom/mask-rect.ts"],"names":[],"mappings":";;;AAAA,wBAA0B;AAE1B,IAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;AAEpC;IAKI,kBAAY,IAAwB,EAAE,YAAoB,EAAE,YAAoB;QAA1C,6BAAA,EAAA,oBAAoB;QAAE,6BAAA,EAAA,oBAAoB;QAJ/D,eAAU,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAK/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;IACtC,CAAC;IAED,YAAY;IAEZ,2BAAQ,GAAR;QACI,OAAU,IAAI,CAAC,UAAU,CAAC,SAAS,SAAI,IAAI,CAAC,aAAa,UAAK,IAAI,CAAC,KAAO,CAAC;IAC/E,CAAC;IAED,sBAAI,2BAAK;aAAT;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACjC,CAAC;;;OAAA;IAED,sBAAI,4BAAM;aAAV;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAClC,CAAC;;;OAAA;IAED,sBAAI,2BAAK;aAAT;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACjC,CAAC;;;OAAA;IAED,sBAAI,4BAAM;aAAV;YACI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAClC,CAAC;;;OAAA;IAED,wBAAK,GAAL,UAAM,GAAoB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,wBAAK,GAAL,UAAM,KAAa;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,sBAAG,GAAH,UAAI,GAAoB;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;YACtC,OAAO,IAAI,CAAC,aAAa,CAAC;SAC7B;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,WAAW;IAEX,wBAAK,GAAL,UAAM,KAAa,EAAE,KAAc;QAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,sBAAG,GAAH,UAAI,GAAoB,EAAE,KAAc;QACpC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IAChB,CAAC;IACL,eAAC;AAAD,CAAC,AA3DD,IA2DC;AA3DY,4BAAQ"} \ No newline at end of file diff --git a/build/geom/mask.d.ts b/build/geom/mask.d.ts deleted file mode 100644 index a766ac2..0000000 --- a/build/geom/mask.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as geom from '.'; -export declare class Mask implements geom.SizeLike { - private readonly _size; - private readonly _bits; - constructor(size: geom.SizeLike, initialValue?: boolean); - toString(): string; - get width(): number; - get height(): number; - index(off: geom.OffsetLike): number; - getAt(index: number): boolean; - get(off: geom.OffsetLike): boolean; - setAt(index: number, value: boolean): this; - set(off: geom.OffsetLike, value: boolean): this; -} diff --git a/build/geom/mask.js b/build/geom/mask.js deleted file mode 100644 index fa00a00..0000000 --- a/build/geom/mask.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Mask = void 0; -var geom = require("."); -var Mask = /** @class */ (function () { - // TODO consider Uint8Array for bits - function Mask(size, initialValue) { - if (initialValue === void 0) { initialValue = false; } - this._size = new geom.Size(); - this._size.copyFrom(size); - this._bits = new Array(Math.ceil(this._size.area / 32)).fill(initialValue ? 0xffffffff : 0); - } - // accessors - Mask.prototype.toString = function () { - var ret = ''; - var off = new geom.Offset(); - for (var y = 0; y < this._size.height; y++) { - for (var x = 0; x < this._size.width; x++) { - off.set(x, y); - ret += this.get(off.set(x, y)) ? '☑' : '☐'; - } - ret += '\n'; - } - return ret; - }; - Object.defineProperty(Mask.prototype, "width", { - get: function () { - return this._size.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Mask.prototype, "height", { - get: function () { - return this._size.height; - }, - enumerable: false, - configurable: true - }); - Mask.prototype.index = function (off) { - return this._size.index(off); - }; - Mask.prototype.getAt = function (index) { - // tslint:disable:no-bitwise - var arrayIndex = index >>> 5; - var bitMask = 1 << (index & 31); - return (this._bits[arrayIndex] & bitMask) !== 0; - // tslint:enable:no-bitwise - }; - Mask.prototype.get = function (off) { - return this.getAt(this.index(off)); - }; - // mutators - Mask.prototype.setAt = function (index, value) { - // tslint:disable:no-bitwise - var arrayIndex = index >>> 5; - var bitMask = 1 << (index & 31); - if (value) { - this._bits[arrayIndex] |= bitMask; - } - else { - this._bits[arrayIndex] &= ~bitMask; - } - // tslint:enable:no-bitwise - return this; - }; - Mask.prototype.set = function (off, value) { - return this.setAt(this.index(off), value); - }; - return Mask; -}()); -exports.Mask = Mask; -//# sourceMappingURL=mask.js.map \ No newline at end of file diff --git a/build/geom/mask.js.map b/build/geom/mask.js.map deleted file mode 100644 index 547a8a9..0000000 --- a/build/geom/mask.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mask.js","sourceRoot":"","sources":["../../src/geom/mask.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/geom/offset.d.ts b/build/geom/offset.d.ts deleted file mode 100644 index 0d853b4..0000000 --- a/build/geom/offset.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import * as geom from '.'; -export interface OffsetLike { - readonly x: number; - readonly y: number; -} -export declare class Offset implements OffsetLike { - x: number; - y: number; - constructor(); - constructor(x: number, y: number); - toString(): string; - equals(other: OffsetLike): boolean; - get magnitudeChebyshev(): number; - get magnitudeManhattan(): number; - set(x: number, y: number): this; - copyFrom(other: OffsetLike): this; - setFromDirection(dir: geom.Direction): this; - add(x: number, y: number): this; - addSize(size: geom.SizeLike): this; - addOffset(off: OffsetLike): this; - addDirection(dir: geom.Direction): this; - addCardinalDirection(dir: geom.Direction): this; - subtractOffset(off: OffsetLike): this; - multiply(factor: number): this; - distanceChebyshev(other: OffsetLike): number; - distanceManhattan(other?: OffsetLike): number; -} diff --git a/build/geom/offset.js b/build/geom/offset.js deleted file mode 100644 index a517360..0000000 --- a/build/geom/offset.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Offset = void 0; -var X_FROM_DIRECTION = [0, 1, 0, -1]; -var Y_FROM_DIRECTION = [-1, 0, 1, 0]; -var Offset = /** @class */ (function () { - function Offset(x, y) { - if (typeof x === 'undefined') { - x = 0; - } - if (typeof y === 'undefined') { - y = 0; - } - this.x = x; - this.y = y; - } - // accessors - Offset.prototype.toString = function () { - return "(" + this.x + "," + this.y + ")"; - }; - Offset.prototype.equals = function (other) { - return this.x === other.x && this.y === other.y; - }; - Object.defineProperty(Offset.prototype, "magnitudeChebyshev", { - // chebyshev: can move in any direction (diagonals are ok) - get: function () { - return Math.max(Math.abs(this.x), Math.abs(this.y)); - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Offset.prototype, "magnitudeManhattan", { - // manhattan: can move only in cardinal directions (no diagonals) - get: function () { - return Math.abs(this.x) + Math.abs(this.y); - }, - enumerable: false, - configurable: true - }); - // mutators - Offset.prototype.set = function (x, y) { - this.x = x; - this.y = y; - return this; - }; - Offset.prototype.copyFrom = function (other) { - this.x = other.x; - this.y = other.y; - return this; - }; - Offset.prototype.setFromDirection = function (dir) { - this.x = X_FROM_DIRECTION[dir]; - this.y = Y_FROM_DIRECTION[dir]; - return this; - }; - Offset.prototype.add = function (x, y) { - this.x += x; - this.y += y; - return this; - }; - Offset.prototype.addSize = function (size) { - this.x += size.width; - this.y += size.height; - return this; - }; - Offset.prototype.addOffset = function (off) { - this.x += off.x; - this.y += off.y; - return this; - }; - Offset.prototype.addDirection = function (dir) { - this.x += X_FROM_DIRECTION[dir]; - this.y += Y_FROM_DIRECTION[dir]; - return this; - }; - Offset.prototype.addCardinalDirection = function (dir) { - this.x += X_FROM_DIRECTION[dir]; - this.y += Y_FROM_DIRECTION[dir]; - return this; - }; - Offset.prototype.subtractOffset = function (off) { - this.x -= off.x; - this.y -= off.y; - return this; - }; - Offset.prototype.multiply = function (factor) { - this.x *= factor; - this.y *= factor; - return this; - }; - // utilities - // chebyshev: can move in any direction (diagonals are ok) - Offset.prototype.distanceChebyshev = function (other) { - return this.subtractOffset(other).magnitudeChebyshev; - }; - // manhattan: can move only in cardinal directions (no diagonals) - Offset.prototype.distanceManhattan = function (other) { - return this.subtractOffset(other).magnitudeManhattan; - }; - return Offset; -}()); -exports.Offset = Offset; -//# sourceMappingURL=offset.js.map \ No newline at end of file diff --git a/build/geom/offset.js.map b/build/geom/offset.js.map deleted file mode 100644 index f1cf86d..0000000 --- a/build/geom/offset.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"offset.js","sourceRoot":"","sources":["../../src/geom/offset.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/geom/path.d.ts b/build/geom/path.d.ts deleted file mode 100644 index 905858e..0000000 --- a/build/geom/path.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as geom from '.'; -export declare class Path { - start: geom.Offset; - segments: geom.Direction[]; - constructor(); - constructor(start: geom.OffsetLike, segments: geom.Direction[]); - toString(): string; - getIsClosed(): boolean; - getOffsets(callback: (off: geom.OffsetLike) => void): void; - getBounds(): geom.Rectangle; - getArea(): number; - rasterize(bounds?: geom.RectangleLike): geom.RasterMask; -} diff --git a/build/geom/path.js b/build/geom/path.js deleted file mode 100644 index d0ce2f1..0000000 --- a/build/geom/path.js +++ /dev/null @@ -1,129 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Path = void 0; -var geom = require("."); -var LOCAL_OFF = new geom.Offset(); -function sortedInsert(array, value) { - var low = 0; - var high = array.length; - while (low < high) { - // tslint:disable-next-line:no-bitwise - var mid = (low + high) >>> 1; - if (array[mid] < value) { - low = mid + 1; - } - else { - high = mid; - } - } - array.splice(low, 0, value); -} -var Path = /** @class */ (function () { - function Path(start, segments) { - this.start = new geom.Offset(); - if (typeof start !== 'undefined') { - this.start.copyFrom(start); - } - if (typeof segments === 'undefined') { - segments = new Array(); - } - this.segments = segments; - } - Path.prototype.toString = function () { - return this.start.toString() + ":" - + ("" + this.segments.map(function (segment) { return geom.directionToString(segment); }).join('')); - }; - Path.prototype.getIsClosed = function () { - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - LOCAL_OFF.addDirection(segment); - } - return this.start.equals(LOCAL_OFF); - }; - Path.prototype.getOffsets = function (callback) { - var cursor = new geom.Offset(); - cursor.copyFrom(this.start); - callback(cursor); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - cursor.addDirection(segment); - callback(cursor); - } - }; - Path.prototype.getBounds = function () { - var northY = this.start.y; - var southY = northY; - var westX = this.start.x; - var eastX = westX; - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - LOCAL_OFF.addDirection(segment); - switch (segment) { - case geom.Direction.NORTH: - northY = Math.min(northY, LOCAL_OFF.y); - break; - case geom.Direction.EAST: - eastX = Math.max(eastX, LOCAL_OFF.x); - break; - case geom.Direction.SOUTH: - southY = Math.max(southY, LOCAL_OFF.y); - break; - case geom.Direction.WEST: - westX = Math.min(westX, LOCAL_OFF.x); - break; - } - } - return new geom.Rectangle(westX, northY, eastX - westX + 1, southY - northY + 1); - }; - Path.prototype.getArea = function () { - var total = 0; - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - LOCAL_OFF.addDirection(segment); - switch (segment) { - case geom.Direction.NORTH: - total -= LOCAL_OFF.x; - break; - case geom.Direction.SOUTH: - total += LOCAL_OFF.x; - break; - } - } - return Math.abs(total); - }; - Path.prototype.rasterize = function (bounds) { - var lines = new Array(); - if (typeof bounds === 'undefined') { - bounds = this.getBounds(); - } - LOCAL_OFF.copyFrom(this.start); - var northY = bounds.northY; - var southY = northY + bounds.height - 1; - for (var y = northY; y < southY; y++) { - lines.push([]); - } - LOCAL_OFF.copyFrom(this.start); - for (var _i = 0, _a = this.segments; _i < _a.length; _i++) { - var segment = _a[_i]; - if (segment === geom.Direction.SOUTH) { - sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x); - } - LOCAL_OFF.addDirection(segment); - if (segment === geom.Direction.NORTH) { - sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x); - } - } - return new geom.RasterMask({ - westX: bounds.westX, - northY: bounds.northY, - width: bounds.width - 1, - height: bounds.height - 1, - }, lines); - }; - return Path; -}()); -exports.Path = Path; -//# sourceMappingURL=path.js.map \ No newline at end of file diff --git a/build/geom/path.js.map b/build/geom/path.js.map deleted file mode 100644 index 7aee51f..0000000 --- a/build/geom/path.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/geom/path.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/geom/raster-mask.d.ts b/build/geom/raster-mask.d.ts deleted file mode 100644 index 7efb404..0000000 --- a/build/geom/raster-mask.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as geom from '.'; -export declare class RasterMask implements geom.RectangleLike, geom.SizeLike { - northWest: geom.Offset; - size: geom.Size; - private _lines; - constructor(bounds: geom.RectangleLike, lines: number[][]); - toString(): string; - get northY(): number; - get southY(): number; - get westX(): number; - get eastX(): number; - get width(): number; - get height(): number; - get(x: number, y: number): boolean; - bandsAt(y: number, callback: (westX: number, eastX: number) => void): void; -} diff --git a/build/geom/raster-mask.js b/build/geom/raster-mask.js deleted file mode 100644 index 08ae5fb..0000000 --- a/build/geom/raster-mask.js +++ /dev/null @@ -1,103 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RasterMask = void 0; -var geom = require("."); -var RasterMask = /** @class */ (function () { - function RasterMask(bounds, lines) { - this.northWest = new geom.Offset(bounds.westX, bounds.northY); - this.size = new geom.Size(bounds.width, bounds.height); - this._lines = lines; - } - RasterMask.prototype.toString = function () { - var shape = ''; - for (var y = 0; y < this.height; y++) { - var line = this._lines[y]; - var x = this.westX; - for (var i = 0; i < line.length; i += 2) { - var start = line[i]; - var end = line[i + 1]; - while (x < start) { - shape += '∙'; - x++; - } - while (x < end) { - shape += '█'; - x++; - } - } - while (x <= this.eastX) { - shape += '∙'; - x++; - } - shape += '\n'; - } - return this.northWest + "\n" + shape; - }; - Object.defineProperty(RasterMask.prototype, "northY", { - // accessors - get: function () { - return this.northWest.y; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "southY", { - get: function () { - return this.northWest.y + this.size.height - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "westX", { - get: function () { - return this.northWest.x; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "eastX", { - get: function () { - return this.northWest.x + this.size.width - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "width", { - get: function () { - return this.size.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(RasterMask.prototype, "height", { - get: function () { - return this.size.height; - }, - enumerable: false, - configurable: true - }); - RasterMask.prototype.get = function (x, y) { - if (y < this.northY || y > this.southY) { - return false; - } - var line = this._lines[y - this.northY]; - for (var i = 0; i < line.length; i += 2) { - if (x >= line[i] && x < line[i + 1]) { - return true; - } - } - return false; - }; - RasterMask.prototype.bandsAt = function (y, callback) { - if (y < this.northY || y > this.southY) { - return; - } - var line = this._lines[y - this.northY]; - for (var i = 0; i < line.length; i += 2) { - callback(line[i], line[i + 1] - 1); - } - }; - return RasterMask; -}()); -exports.RasterMask = RasterMask; -//# sourceMappingURL=raster-mask.js.map \ No newline at end of file diff --git a/build/geom/raster-mask.js.map b/build/geom/raster-mask.js.map deleted file mode 100644 index 0ba928f..0000000 --- a/build/geom/raster-mask.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"raster-mask.js","sourceRoot":"","sources":["../../src/geom/raster-mask.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/geom/rectangle.d.ts b/build/geom/rectangle.d.ts deleted file mode 100644 index 8fdb4fb..0000000 --- a/build/geom/rectangle.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as geom from '.'; -export interface RectangleLike extends geom.SizeLike { - readonly westX: number; - readonly northY: number; -} -export declare class Rectangle implements RectangleLike, geom.SizeLike { - northWest: geom.Offset; - size: geom.Size; - constructor(); - constructor(westX: number, northY: number, width: number, height: number); - toString(): string; - equals(other: RectangleLike): boolean; - get northY(): number; - get southY(): number; - get westX(): number; - get eastX(): number; - get width(): number; - get height(): number; - get empty(): boolean; - get area(): number; - set(westX: number, northY: number, width: number, height: number): this; - copyFrom(other: RectangleLike): this; - extendToInclude(off: geom.OffsetLike): this; - containsOffset(off: geom.OffsetLike): boolean; - containsRectangle(other: RectangleLike): boolean; - overlapsRectangle(other: RectangleLike): boolean; - index(off: geom.OffsetLike): number; -} diff --git a/build/geom/rectangle.js b/build/geom/rectangle.js deleted file mode 100644 index a6948f1..0000000 --- a/build/geom/rectangle.js +++ /dev/null @@ -1,144 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Rectangle = void 0; -var geom = require("."); -var LOCAL_OFF = new geom.Offset(); -var Rectangle = /** @class */ (function () { - function Rectangle(westX, northY, width, height) { - if (typeof westX === 'undefined') { - westX = 0; - } - if (typeof northY === 'undefined') { - northY = 0; - } - if (typeof width === 'undefined') { - width = 0; - } - if (typeof height === 'undefined') { - height = 0; - } - this.northWest = new geom.Offset(westX, northY); - this.size = new geom.Size(width, height); - } - // accessors - Rectangle.prototype.toString = function () { - return "(" + this.westX + "," + this.northY + " " + this.width + "x" + this.height + ")"; - }; - Rectangle.prototype.equals = function (other) { - return this.westX === other.westX && this.northY === other.northY && this.size.equals(other); - }; - Object.defineProperty(Rectangle.prototype, "northY", { - get: function () { - return this.northWest.y; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "southY", { - get: function () { - return this.northWest.y + this.size.height - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "westX", { - get: function () { - return this.northWest.x; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "eastX", { - get: function () { - return this.northWest.x + this.size.width - 1; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "width", { - get: function () { - return this.size.width; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "height", { - get: function () { - return this.size.height; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "empty", { - get: function () { - return this.size.empty; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Rectangle.prototype, "area", { - get: function () { - return this.size.area; - }, - enumerable: false, - configurable: true - }); - // mutators - Rectangle.prototype.set = function (westX, northY, width, height) { - this.northWest.set(westX, northY); - this.size.set(width, height); - return this; - }; - Rectangle.prototype.copyFrom = function (other) { - this.northWest.set(other.westX, other.northY); - this.size.set(other.width, other.height); - return this; - }; - Rectangle.prototype.extendToInclude = function (off) { - var dx = off.x - this.westX; - if (dx < 0) { - this.size.width -= dx; - this.northWest.x = off.x; - } - else if (dx >= this.size.width) { - this.size.width = dx + 1; - } - var dy = off.y - this.northWest.y; - if (dy < 0) { - this.size.height -= dy; - this.northWest.y = off.y; - } - else if (dy >= this.size.height) { - this.size.height = dy + 1; - } - return this; - }; - // utilities - Rectangle.prototype.containsOffset = function (off) { - return this.size.containsOffset(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest)); - }; - Rectangle.prototype.containsRectangle = function (other) { - LOCAL_OFF.set(other.westX, other.northY).subtractOffset(this.northWest); - if (!this.size.containsOffset(LOCAL_OFF)) { - return false; - } - if (other.width === 0 && other.height === 0) { - return false; - } - return this.size.containsOffset(LOCAL_OFF.add(other.width - 1, other.height - 1)); - }; - Rectangle.prototype.overlapsRectangle = function (other) { - return this.northY <= other.northY + other.height - 1 - && this.southY >= other.northY - && this.westX <= other.westX + other.width - 1 - && this.eastX >= other.westX - && !this.empty - && other.width !== 0 && other.height !== 0; - }; - Rectangle.prototype.index = function (off) { - return this.size.index(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest)); - }; - return Rectangle; -}()); -exports.Rectangle = Rectangle; -//# sourceMappingURL=rectangle.js.map \ No newline at end of file diff --git a/build/geom/rectangle.js.map b/build/geom/rectangle.js.map deleted file mode 100644 index 52e4f2f..0000000 --- a/build/geom/rectangle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"rectangle.js","sourceRoot":"","sources":["../../src/geom/rectangle.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/geom/size.d.ts b/build/geom/size.d.ts deleted file mode 100644 index e4a1763..0000000 --- a/build/geom/size.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as geom from '.'; -export interface SizeLike { - readonly width: number; - readonly height: number; -} -export declare class Size implements SizeLike { - width: number; - height: number; - constructor(); - constructor(width: number, height: number); - toString(): string; - equals(other: SizeLike): boolean; - get empty(): boolean; - get area(): number; - set(width: number, height: number): this; - copyFrom(other: SizeLike): this; - add(width: number, height: number): this; - addOffset(off: geom.OffsetLike): this; - multiply(factor: number): this; - containsOffset(off: geom.OffsetLike): boolean; - index(off: geom.OffsetLike): number; -} diff --git a/build/geom/size.js b/build/geom/size.js deleted file mode 100644 index bde8815..0000000 --- a/build/geom/size.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Size = void 0; -var Size = /** @class */ (function () { - function Size(width, height) { - if (typeof width === 'undefined') { - width = 0; - } - if (typeof height === 'undefined') { - height = 0; - } - this.width = width; - this.height = height; - } - // accessors - Size.prototype.toString = function () { - return "(" + this.width + "x" + this.height + ")"; - }; - Size.prototype.equals = function (other) { - return this.width === other.width && this.height === other.height; - }; - Object.defineProperty(Size.prototype, "empty", { - get: function () { - return this.width === 0 || this.height === 0; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Size.prototype, "area", { - get: function () { - return this.width * this.height; - }, - enumerable: false, - configurable: true - }); - // mutators - Size.prototype.set = function (width, height) { - this.width = width; - this.height = height; - return this; - }; - Size.prototype.copyFrom = function (other) { - this.width = other.width; - this.height = other.height; - return this; - }; - Size.prototype.add = function (width, height) { - this.width += width; - this.height += height; - return this; - }; - Size.prototype.addOffset = function (off) { - this.width += off.x; - this.height += off.y; - return this; - }; - Size.prototype.multiply = function (factor) { - this.width *= factor; - this.height *= factor; - return this; - }; - // TODO: rotate - // utilities - Size.prototype.containsOffset = function (off) { - return off.x >= 0 && off.y >= 0 && off.x < this.width && off.y < this.height; - }; - Size.prototype.index = function (off) { - return off.y * this.width + off.x; - }; - return Size; -}()); -exports.Size = Size; -//# sourceMappingURL=size.js.map \ No newline at end of file diff --git a/build/geom/size.js.map b/build/geom/size.js.map deleted file mode 100644 index 7c6d439..0000000 --- a/build/geom/size.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"size.js","sourceRoot":"","sources":["../../src/geom/size.ts"],"names":[],"mappings":";;;AAOA;IAMI,cAAY,KAAc,EAAE,MAAe;QACvC,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;YAC9B,KAAK,GAAG,CAAC,CAAC;SACb;QACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YAC/B,MAAM,GAAG,CAAC,CAAC;SACd;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,YAAY;IAEZ,uBAAQ,GAAR;QACI,OAAO,MAAI,IAAI,CAAC,KAAK,SAAI,IAAI,CAAC,MAAM,MAAG,CAAC;IAC5C,CAAC;IAED,qBAAM,GAAN,UAAO,KAAe;QAClB,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC;IACtE,CAAC;IAED,sBAAI,uBAAK;aAAT;YACI,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QACjD,CAAC;;;OAAA;IAED,sBAAI,sBAAI;aAAR;YACI,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACpC,CAAC;;;OAAA;IAED,WAAW;IAEX,kBAAG,GAAH,UAAI,KAAa,EAAE,MAAc;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,uBAAQ,GAAR,UAAS,KAAe;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,kBAAG,GAAH,UAAI,KAAa,EAAE,MAAc;QAC7B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,wBAAS,GAAT,UAAU,GAAoB;QAC1B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,uBAAQ,GAAR,UAAS,MAAc;QACnB,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,eAAe;IAEf,YAAY;IAEZ,6BAAc,GAAd,UAAe,GAAoB;QAC/B,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACjF,CAAC;IAED,oBAAK,GAAL,UAAM,GAAoB;QACtB,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IACL,WAAC;AAAD,CAAC,AA9ED,IA8EC;AA9EY,oBAAI"} \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts deleted file mode 100644 index cc6bac9..0000000 --- a/build/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { makeBlockFractal } from './block-fractal'; -export { Direction, DirectionFlags, Offset, Path, RasterMask } from './geom'; diff --git a/build/index.js b/build/index.js deleted file mode 100644 index 3ee6bb2..0000000 --- a/build/index.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; -/* - * BlockFractal - * github.com/sbj42/block-fractal - * James Clark - * Licensed under the MIT license. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RasterMask = exports.Path = exports.Offset = exports.DirectionFlags = exports.Direction = exports.makeBlockFractal = void 0; -var block_fractal_1 = require("./block-fractal"); -Object.defineProperty(exports, "makeBlockFractal", { enumerable: true, get: function () { return block_fractal_1.makeBlockFractal; } }); -var geom_1 = require("./geom"); -Object.defineProperty(exports, "Direction", { enumerable: true, get: function () { return geom_1.Direction; } }); -Object.defineProperty(exports, "DirectionFlags", { enumerable: true, get: function () { return geom_1.DirectionFlags; } }); -Object.defineProperty(exports, "Offset", { enumerable: true, get: function () { return geom_1.Offset; } }); -Object.defineProperty(exports, "Path", { enumerable: true, get: function () { return geom_1.Path; } }); -Object.defineProperty(exports, "RasterMask", { enumerable: true, get: function () { return geom_1.RasterMask; } }); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/index.js.map b/build/index.js.map deleted file mode 100644 index 0ce5f24..0000000 --- a/build/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,iDAAiD;AAAzC,iHAAA,gBAAgB,OAAA;AACxB,+BAA2E;AAAnE,iGAAA,SAAS,OAAA;AAAE,sGAAA,cAAc,OAAA;AAAE,8FAAA,MAAM,OAAA;AAAE,4FAAA,IAAI,OAAA;AAAE,kGAAA,UAAU,OAAA"} \ No newline at end of file diff --git a/demo/.gitignore b/demo/.gitignore new file mode 100644 index 0000000..92cedbd --- /dev/null +++ b/demo/.gitignore @@ -0,0 +1 @@ +/www/build/ \ No newline at end of file diff --git a/demo/img_src/buttons.xcf b/demo/img_src/buttons.xcf new file mode 100644 index 0000000..cd5c8f2 Binary files /dev/null and b/demo/img_src/buttons.xcf differ diff --git a/demo/img_src/favicon.xcf b/demo/img_src/favicon.xcf new file mode 100644 index 0000000..f35c848 Binary files /dev/null and b/demo/img_src/favicon.xcf differ diff --git a/demo/src/demo.ts b/demo/src/demo.ts new file mode 100644 index 0000000..0fda38e --- /dev/null +++ b/demo/src/demo.ts @@ -0,0 +1,340 @@ +import * as BlockFractal from '../../lib'; +import * as seedrandom from 'seedrandom'; + +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +const demo = document.getElementById('canvas') as HTMLCanvasElement; +demo.width = Math.min(demo.width, window.innerWidth - 100); +const demoInner = document.getElementById('demoinner') as HTMLDivElement; +demoInner.style.width = `${demo.width}px`; +const {width, height} = demo; +const context = demo.getContext('2d') as CanvasRenderingContext2D; + +const iterationsInput = (document.getElementById('iterations') as HTMLInputElement); +const variationInput = (document.getElementById('variation') as HTMLInputElement); +const seedInput = (document.getElementById('seed') as HTMLInputElement); +const newseedInput = (document.getElementById('newseed') as HTMLInputElement); + +function getControlInteger(elem: HTMLInputElement, min: number, max: number, defaultValue: number) { + const str = elem.value; + const int = parseInt(str, 10); + if (Number.isFinite(int)) { + return Math.max(min, Math.min(max, int)); + } + return defaultValue; +} + +const DEFAULT_VARIATION = 60; +const DEFAULT_ITERATIONS = 7; +const MAX_VARIATION = 100; +const MAX_ITERATIONS = 11; + +let iterations = DEFAULT_ITERATIONS; +let variation = DEFAULT_VARIATION; +let seed: string; +let hashSeed: string; +// let path: BlockFractal.Path; +let mask: BlockFractal.RasterMask | undefined; + +let mult = 1; + +function generate() { + const thisIterations = getControlInteger(iterationsInput, 0, MAX_ITERATIONS, DEFAULT_ITERATIONS); + const thisSeed = seedInput.value; + const thisVariation = getControlInteger(variationInput, 0, MAX_VARIATION, DEFAULT_VARIATION); + if (mask) { + if (iterations === thisIterations && seed === thisSeed && variation === thisVariation) { + return; + } + } + iterations = thisIterations; + seed = thisSeed; + variation = thisVariation; + const path = BlockFractal.makeBlockFractal({ + random: seedrandom.alea(seed), + iterations, + variation: variation / 100, + }); + mask = path.rasterize(); + //const maxSize = (Math.pow(2, iterations + 2) - 1) * zoom; + mult = Math.pow(2, 7 - iterations); + document.getElementById('label')!.innerText = seed; + document.title = `BlockFractal - ${seed}`; + let newHash = `#${encodeURIComponent(seed)}`; + if (variation !== DEFAULT_VARIATION) { + newHash += `/v=${variation}`; + } + if (hashSeed !== seed) { + window.location.hash = newHash; + hashSeed = seed; + } else { + window.location.replace(newHash); + } +} + +let zoom = 1; +let centerX = 0; +let centerY = 0; + +let targetZoom = 1; +let targetCenterX = 0; +let targetCenterY = 0; + +function reset() { + zoom = 0.5; + targetZoom = 1; + centerX = targetCenterX = 0; + centerY = targetCenterY = 0; +} + +const imageData = context.getImageData(0, 0, width, height); +function render() { + if (document.hidden || typeof mask === 'undefined') { + return; + } + const data = imageData.data; + + const halfHeight = height >>> 1; + const halfWidth = width >>> 1; + let index = 0; + for (let sy = 0; sy < height; sy ++) { + const my = Math.floor(centerY / mult + (sy - halfHeight) / zoom / mult); + for (let sx = 0; sx < width; sx ++) { + const mx = Math.floor(centerX / mult + (sx - halfWidth) / zoom / mult); + if (mask.get(mx, my)) { + data[index++] = 0x40; + data[index++] = 0xfb; + data[index++] = 0x06; + data[index++] = 0xff; + } else { + data[index++] = 0x15; + data[index++] = 0x57; + data[index++] = 0x86; + data[index++] = 0xff; + } + } + } + context.putImageData(imageData, 0, 0); +} + +const ADJECTIVES = ['North', 'East', 'South', 'West', 'Upper', 'Lower', 'Middle', 'Far', 'Near', 'Great', 'High', 'Low', + 'Ancient', 'True', 'Superior', 'Greater', 'Lesser', 'Distant', 'Old', 'Ye Olde', 'New', 'Lost', 'Forgotten']; + +const CONSONANT = ['B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', + 'Z', 'Br', 'Bl', 'By', 'Cr', 'Cl', 'Ch', 'Dr', 'Fr', 'Fl', 'Gr', 'Gl', 'Gh', 'G\'', 'Kr', 'Kl', 'Kh', 'Pr', 'Pl', + 'Ph', 'Py', 'Q\'', 'St', 'Scr', 'Sch', 'Sh', 'Sm', 'Sn', 'Sp', 'Spr', 'Sv', 'Sw', 'Th', 'Thr', 'T\'', 'Tw', 'Vr', + 'Wr']; + +const VOWEL = ['A', 'E', 'I', 'O', 'U', 'A', 'E', 'I', 'O', 'U', 'A', 'E', 'I', 'O', 'U', 'Ae', 'Aeo', 'Ai', 'Ao', + 'Au', 'Ea', 'Ee', 'Ei', 'Eo', 'Ia', 'Ie', 'Io', 'Iou', 'Iu', 'Oa', 'Oe', 'Oi', 'Oo', 'Ou', 'Uio']; + +const CSUFFIXES = ['shire', 'land', 'tis', 'fell', 'ness', 'sia', 'ria', 'delle', 'landia', 'dom', 'vania', 'ville', + 'ton', 'berg', 'ham', 'pico', 'stead', 'dero', 'lato' ]; + +const VSUFFIXES = ['ica', 'inor', 'eros', 'ilia', 'istan', 'edonia', 'uguay', 'onia', 'arnia', 'ing', 'onne', 'ine', + 'ovo', 'ovka', 'ique']; + +function newSeed() { + let name = ''; + if (Math.random() < 0.5) { + if (name) { + name += ' '; + } + name += ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)]; + } + if (name) { + name += ' '; + } + let length = Math.floor(Math.random() * 3 + 1); + if (Math.random() < 0.15) { + length ++; + } + let consonant = Math.random() < 0.7; + for (let i = 0; i < length; i ++) { + let next: string; + if (consonant) { + next = CONSONANT[Math.floor(Math.random() * CONSONANT.length)]; + } else { + next = VOWEL[Math.floor(Math.random() * VOWEL.length)]; + } + if (i > 0) { + next = next.toLowerCase(); + } + name += next; + consonant = !consonant; + } + if (consonant) { + name += CSUFFIXES[Math.floor(Math.random() * CSUFFIXES.length)]; + } else { + name += VSUFFIXES[Math.floor(Math.random() * VSUFFIXES.length)]; + } + seedInput.value = name; + generate(); + reset(); +} + +function hashChange() { + const hash = location.hash; + if (hash.length > 1) { + const firstSlash = hash.indexOf('/'); + const nextSeed = decodeURIComponent(hash.substr(1, firstSlash < 0 ? hash.length : firstSlash - 1)); + let newVariation = DEFAULT_VARIATION; + let newIterations = DEFAULT_ITERATIONS; + if (firstSlash >= 0) { + for (const arg of hash.substr(firstSlash + 1).split('/')) { + if (arg.startsWith('v=')) { + newVariation = parseInt(arg.substr(2)); + if (isNaN(newVariation) || newVariation < 0 || newVariation > MAX_VARIATION) { + newVariation = DEFAULT_VARIATION; + } + } else if (arg.startsWith('i=')) { + newIterations = parseInt(arg.substr(2)); + if (isNaN(newIterations) || newIterations < 0 || newIterations > MAX_ITERATIONS) { + newIterations = DEFAULT_ITERATIONS; + } + } + } + } + if (nextSeed !== seed) { + hashSeed = nextSeed; + seedInput.value = nextSeed; + variationInput.value = String(newVariation); + iterationsInput.value = String(newIterations); + generate(); + } + } +} + +if (location.hash.length > 1) { + hashChange(); +} else { + newSeed(); +} + +iterationsInput.onchange = generate; +iterationsInput.oninput = generate; +variationInput.onchange = generate; +variationInput.oninput = generate; +seedInput.onchange = generate; +seedInput.oninput = generate; +newseedInput.onclick = newSeed; + +window.onhashchange = hashChange; + +const PAN_SPEED = 45; +const ZOOM_SPEED = 1.15; + +document.getElementById('zoomin')!.onclick = () => { + targetZoom *= ZOOM_SPEED; +}; +document.getElementById('zoomout')!.onclick = () => { + targetZoom /= ZOOM_SPEED; +}; + +let mousePressed = false; +let mouseDragX: number; +let mouseDragY: number; +let mouseOver = false; + +demoInner.onmouseleave = () => { + mouseOver = false; +}; +demoInner.onmousedown = (event: MouseEvent) => { + mousePressed = true; + mouseDragX = targetCenterX + event.clientX / zoom; + mouseDragY = targetCenterY + event.clientY / zoom; +}; +demoInner.onmousemove = (event: MouseEvent) => { + if (mousePressed === true) { + centerX = targetCenterX = mouseDragX - event.clientX / zoom; + centerY = targetCenterY = mouseDragY - event.clientY / zoom; + } + mouseOver = true; +}; +document.onmouseup = () => { + mousePressed = false; +}; +demoInner.onwheel = (event: WheelEvent) => { + if (mouseOver) { + const x = centerX + (event.offsetX - (width >>> 1)) / zoom; + const y = centerY + (event.offsetY - (height >>> 1)) / zoom; + targetZoom *= Math.pow(ZOOM_SPEED, event.deltaY / 120); + targetCenterX = x - (event.offsetX - (width >>> 1)) / targetZoom; + targetCenterY = y - (event.offsetY - (height >>> 1)) / targetZoom; + event.preventDefault(); + } +}; +document.onkeypress = (event: KeyboardEvent) => { + if (document.getElementById('seed') === document.activeElement) { + return; + } + switch (event.code) { + case 'Digit0': + case 'Numpad5': + reset(); + break; + case 'Numpad8': + targetCenterY -= PAN_SPEED / zoom; + break; + case 'Numpad2': + targetCenterY += PAN_SPEED / zoom; + break; + case 'Numpad4': + targetCenterX -= PAN_SPEED / zoom; + break; + case 'Numpad6': + targetCenterX += PAN_SPEED / zoom; + break; + case 'Equal': + case 'NumpadAdd': + targetZoom *= ZOOM_SPEED; + break; + case 'Minus': + case 'NumpadSubtract': + targetZoom /= ZOOM_SPEED; + break; + } +}; +document.onkeydown = (event: KeyboardEvent) => { + if (document.getElementById('seed') === document.activeElement) { + return; + } + if (mouseOver) { + switch (event.code) { + case 'ArrowUp': + targetCenterY -= PAN_SPEED / zoom; + event.preventDefault(); + break; + case 'ArrowDown': + targetCenterY += PAN_SPEED / zoom; + event.preventDefault(); + break; + case 'ArrowLeft': + targetCenterX -= PAN_SPEED / zoom; + event.preventDefault(); + break; + case 'ArrowRight': + targetCenterX += PAN_SPEED / zoom; + event.preventDefault(); + break; + } + } +}; + +function animate() { + zoom = (zoom * 4 + targetZoom) / 5; + centerX = (centerX * 4 + targetCenterX) / 5; + centerY = (centerY * 4 + targetCenterY) / 5; + render(); + requestAnimationFrame(animate); +} + +requestAnimationFrame(animate); + +document.addEventListener('visibilitychange', () => { + if (document.hidden) { + mask = undefined; + } else { + generate(); + } +}); \ No newline at end of file diff --git a/demo/tsconfig.json b/demo/tsconfig.json new file mode 100644 index 0000000..2290ae2 --- /dev/null +++ b/demo/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "lib": [ "dom", "es6" ], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "downlevelIteration": true + }, + "include": [ "src/**/*" ] +} diff --git a/demo/webpack.config.js b/demo/webpack.config.js new file mode 100644 index 0000000..587b027 --- /dev/null +++ b/demo/webpack.config.js @@ -0,0 +1,28 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const path = require('path'); + +module.exports = { + entry: './src/demo.ts', + devtool: 'source-map', + target: 'web', + mode: 'production', + output: { + path: path.join(__dirname, 'www', 'build'), + filename: 'demo.js', + }, + resolve: { + extensions: ['.ts', '.js'], + }, + devServer: { + contentBase: path.join(__dirname, 'www'), + publicPath: '/build/', + }, + module: { + rules: [ + { + test: /\.ts$/, + use: [ 'ts-loader' ], + }, + ], + }, +}; diff --git a/demo/www/favicon.png b/demo/www/favicon.png new file mode 100644 index 0000000..d942074 Binary files /dev/null and b/demo/www/favicon.png differ diff --git a/demo/www/index.html b/demo/www/index.html new file mode 100644 index 0000000..9c7e7be --- /dev/null +++ b/demo/www/index.html @@ -0,0 +1,71 @@ + + + + + BlockFractal + + + + +
+
+ by James Clark +
+

BlockFractal

+

a blocky fractal-like shape generator

+
+
+ name: + + iterations: + variation: + + + + + +
+
+
+ + + +
+
+
+
+ +

BlockFractal

+

+ BlockFractal generates a fractal-like fully-connected shape on a grid. +

    +
  • Generates a single connected shape +
  • Like a randomized quadric fractal +
  • Continents or islands for a tile-based game? +
+

+
+ + + + \ No newline at end of file diff --git a/demo/www/style.css b/demo/www/style.css new file mode 100644 index 0000000..222d3ab --- /dev/null +++ b/demo/www/style.css @@ -0,0 +1,116 @@ +body { + font-family: 'Electrolize', serif; + margin: 0px; + background: #ffe; +} + +#top { + text-align: center; + background: #489032; + padding: 5px; + color: #ebf8ff; + box-shadow: 0px 2px 6px #888; +} +#credit { + position: absolute; + right: 10px; + top: 0px; + font-family: 'Nunito', Verdana, sans-serif; + font-size: 14px; +} +#credit a { + color: #ebf8ff; + opacity: 0.8; +} + +#title { + font-size: 40px; + font-weight: normal; + margin: 0px; +} + +#subtitle { + font-family: 'Nunito', Verdana, sans-serif; + font-size: 18px; + margin: 0px; +} + +#controls { + padding-top: 20px; + font-family: 'Nunito', Verdana, sans-serif; + text-align: center; +} +#controls input { + font-family: 'Nunito', Verdana, sans-serif; +} + +#demo { + padding-top: 10px; +} +#demoinner { + width: 1158px; + height: 608px; + box-shadow: 3px 3px 8px rgba(0,0,0,0.8); + margin: 0px auto; + position: relative; + cursor: move; + cursor: grab; + cursor: -moz-grab; + cursor: -webkit-grab; +} +#label { + user-select: none; + font-family: 'Tangerine', cursive; + font-size: 50px; + color: #ffd; + text-shadow: 2px 2px 2px #444; + position: absolute; + top: 10px; + left: 50px; + right: 50px; + text-align: center; +} + +#zoomout { + opacity: 0.6; + position: absolute; + top: 16px; + left: 16px; + cursor: default; +} +#zoomin { + opacity: 0.6; + position: absolute; + top: 48px; + left: 16px; + cursor: default; +} +#zoomout:hover, #zoomin:hover { + opacity: 1; +} + +#desc { + font-family: 'Nunito', Verdana, sans-serif; + max-width: 1084px; + margin: 0px auto; + margin-bottom: 100px; +} +#desc h2 { + font-family: 'Electrolize', Verdana, sans-serif; +} +#desc p { + max-width: 600px; +} +#link { + float: right; + background: #3498db; + margin-top: 30px; + box-shadow: 4px 4px 4px #888; +} +#link a { + font-size: 31px; + padding: 20px; + color: #fff; + text-decoration: none; + line-height: 2em; +} \ No newline at end of file diff --git a/demo/www/zoomin.png b/demo/www/zoomin.png new file mode 100644 index 0000000..d984d7f Binary files /dev/null and b/demo/www/zoomin.png differ diff --git a/demo/www/zoomout.png b/demo/www/zoomout.png new file mode 100644 index 0000000..da18064 Binary files /dev/null and b/demo/www/zoomout.png differ diff --git a/jest.config.js b/jest.config.js index f07bb7c..8530011 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,9 +1,8 @@ module.exports = { - collectCoverage: true, - coverageDirectory: 'coverage', - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: [ - '**/test/**/*.+(ts|tsx|js)' - ] + coverageDirectory: 'coverage', + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: [ + '**/test/**/*.ts', + ], }; diff --git a/package-lock.json b/package-lock.json index 29b0244..d7f794a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "block-fractal", - "version": "1.0.3", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -768,12 +768,6 @@ "@babel/types": "^7.3.0" } }, - "@types/benchmark": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.0.tgz", - "integrity": "sha512-wxT2/LZn4z0NvSfZirxmBx686CU7EXp299KHkIk79acXpQtgeYHrslFzDacPGXifC0Pe3CEaLup07bgY1PnuQw==", - "dev": true - }, "@types/eslint": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", @@ -800,6 +794,16 @@ "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", "dev": true }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/graceful-fs": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", @@ -849,6 +853,12 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/node": { "version": "14.14.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz", @@ -1157,6 +1167,16 @@ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -1197,6 +1217,12 @@ "uri-js": "^4.2.2" } }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -1226,6 +1252,12 @@ } } }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -1251,12 +1283,6 @@ "picomatch": "^2.0.4" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1284,12 +1310,24 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -1323,6 +1361,27 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1479,6 +1538,12 @@ } } }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1488,22 +1553,79 @@ "tweetnacl": "^0.14.3" } }, - "benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", - "dev": true, - "requires": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1566,6 +1688,18 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1583,6 +1717,16 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1632,6 +1776,180 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "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" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, "chrome-trace-event": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", @@ -1751,13 +2069,75 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "convert-source-map": { + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", @@ -1766,6 +2146,18 @@ "safe-buffer": "~5.1.1" } }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -1778,12 +2170,6 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1865,6 +2251,20 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1877,6 +2277,25 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -1918,22 +2337,90 @@ } } }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, "diff-sequences": { @@ -1951,6 +2438,31 @@ "path-type": "^4.0.0" } }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1987,6 +2499,12 @@ "safer-buffer": "^2.1.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, "electron-to-chromium": { "version": "1.3.641", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.641.tgz", @@ -2011,6 +2529,12 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2076,6 +2600,12 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2299,12 +2829,33 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, "exec-sh": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", @@ -2447,6 +2998,73 @@ "jest-regex-util": "^26.0.0" } }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2592,6 +3210,15 @@ "reusify": "^1.0.4" } }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -2619,6 +3246,38 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2645,6 +3304,12 @@ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", "dev": true }, + "follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -2668,6 +3333,12 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -2677,6 +3348,12 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2714,6 +3391,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -2809,6 +3497,12 @@ "dev": true, "optional": true }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2840,6 +3534,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2892,12 +3592,42 @@ } } }, + "high-score": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/high-score/-/high-score-0.1.0.tgz", + "integrity": "sha512-yg3nl2AToDAXuvu4ZQvqgaAodngXe/4+DvObwadyQEhZWuiRsdd3trxOvUXjiIpvAvF3tdCJ3G8xMmc1zlQciQ==", + "dev": true, + "requires": { + "commander": "^7.0.0", + "picomatch": "^2.2.2" + }, + "dependencies": { + "commander": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz", + "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==", + "dev": true + } + } + }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -2907,98 +3637,293 @@ "whatwg-encoding": "^1.0.5" } }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", "dev": true }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -3019,12 +3944,30 @@ } } }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -3069,6 +4012,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -3134,6 +4083,30 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3149,6 +4122,15 @@ "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", "dev": true }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3835,6 +4817,12 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -3856,6 +4844,12 @@ "verror": "1.10.0" } }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3934,6 +4928,12 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3990,6 +4990,12 @@ "object-visit": "^1.0.0" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -4000,6 +5006,12 @@ "readable-stream": "^2.0.1" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4012,6 +5024,12 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -4022,6 +5040,12 @@ "picomatch": "^2.0.5" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, "mime-db": { "version": "1.45.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", @@ -4043,6 +5067,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4091,9 +5121,25 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { @@ -4116,6 +5162,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -4128,6 +5180,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4216,6 +5274,12 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -4247,6 +5311,22 @@ } } }, + "object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -4265,6 +5345,27 @@ "isobject": "^3.0.1" } }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4283,6 +5384,23 @@ "mimic-fn": "^2.1.0" } }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -4297,6 +5415,15 @@ "word-wrap": "^1.2.3" } }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, "p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -4327,6 +5454,21 @@ "p-limit": "^2.2.0" } }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4360,12 +5502,24 @@ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4378,6 +5532,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4390,6 +5550,12 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -4408,6 +5574,27 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -4426,11 +5613,36 @@ "find-up": "^4.0.0" } }, - "platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", - "dev": true + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } }, "posix-character-classes": { "version": "0.1.1", @@ -4478,6 +5690,16 @@ "sisteransi": "^1.0.5" } }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -4512,6 +5734,18 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -4521,6 +5755,32 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, "react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", @@ -4573,6 +5833,122 @@ "util-deprecate": "~1.0.1" } }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, "rechoir": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", @@ -4592,6 +5968,16 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", @@ -4712,6 +6098,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -4757,6 +6149,12 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -4972,6 +6370,21 @@ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "dev": true }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, "semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", @@ -4981,6 +6394,52 @@ "lru-cache": "^6.0.0" } }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, "serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", @@ -4990,6 +6449,74 @@ "randombytes": "^2.1.0" } }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5019,6 +6546,12 @@ } } }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5198,6 +6731,50 @@ } } }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -5265,12 +6842,52 @@ "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -5341,6 +6958,12 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -5556,6 +7179,17 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tiled-geometry": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tiled-geometry/-/tiled-geometry-1.0.0.tgz", + "integrity": "sha512-d92D8Ujz5UjRifjT9ctihcy7niaNMQ2QtoJqsmMX5KMnMgaN1rZtgbz3rjVfATGpM7MG5trASmXNUA7uyMVcbw==" + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -5609,6 +7243,12 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, "tough-cookie": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", @@ -5669,20 +7309,6 @@ "semver": "^7.3.4" } }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - } - }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -5734,6 +7360,16 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -5761,6 +7397,12 @@ "set-value": "^2.0.1" } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -5801,6 +7443,12 @@ } } }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5816,6 +7464,34 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -5828,6 +7504,12 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -5870,6 +7552,12 @@ "spdx-expression-parse": "^3.0.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -5918,6 +7606,15 @@ "graceful-fs": "^4.1.2" } }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -6099,6 +7796,385 @@ } } }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, "webpack-merge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", @@ -6118,6 +8194,23 @@ "source-map": "^0.6.1" } }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -6253,12 +8346,6 @@ "decamelize": "^1.2.0" } }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index f2d6976..325e049 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,49 @@ { "name": "block-fractal", - "version": "1.0.5", + "version": "2.0.0", "description": "Generates a blocky fractal-like shape, like a tile-based randomized koch curve", "keywords": [ "fractal", "roguelike", "procedural" ], - "main": "build/index.js", - "typings": "build/index.d.ts", - "repository": "https://github.com/sbj42/block-fractal.git", "author": "James Clark ", "license": "MIT", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "repository": "https://github.com/sbj42/block-fractal.git", + "files": [ + "lib" + ], "scripts": { - "test": "jest", + "test": "jest --coverage", "lint": "eslint \"src/**/*.ts\" && tsc --noEmit", - "benchmark": "ts-node benchmark/bench-block-fractal.ts", - "build": "rimraf bin build && webpack --mode development && webpack --mode production && tsc && rimraf bin/build" + "build": "rimraf lib && tsc", + "dist": "rimraf dist && webpack --mode development && webpack --mode production", + "prepublish": "npm run build", + "demo:build": "cd demo && webpack", + "demo": "cd demo && webpack serve", + "benchmark": "high-score" }, "devDependencies": { - "@types/benchmark": "^2.1.0", "@types/jest": "^26.0.20", "@types/node": "^14.14.21", "@types/seedrandom": "^2.4.28", "@typescript-eslint/eslint-plugin": "^4.13.0", "@typescript-eslint/parser": "^4.13.0", - "benchmark": "^2.1.4", "eslint": "^7.18.0", + "high-score": "^0.1.0", "jest": "^26.6.3", "rimraf": "^3.0.2", "seedrandom": "^3.0.5", "ts-jest": "^26.4.4", "ts-loader": "^8.0.14", - "ts-node": "^9.1.1", "typescript": "^4.1.3", "webpack": "^5.15.0", - "webpack-cli": "^4.3.1" + "webpack-cli": "^4.3.1", + "webpack-dev-server": "^3.11.2" }, - "dependencies": {} + "dependencies": { + "tiled-geometry": "^1.0.0" + } } diff --git a/src/block-fractal.ts b/src/block-fractal.ts index 5d264c4..2d23fc7 100644 --- a/src/block-fractal.ts +++ b/src/block-fractal.ts @@ -1,9 +1,11 @@ -import * as geom from './geom'; +import * as geom from 'tiled-geometry'; + +/* eslint-disable indent */ export interface BlockFractalParam { random?: () => number; iterations: number; - shape?: geom.Path; + shape?: geom.CardinalPath; variation?: number; } @@ -11,17 +13,17 @@ function nextToLastMatch(points: geom.Offset[], next: geom.Offset) { return points.length > 1 && points[points.length - 2].equals(next); } -function addPoint(points: geom.Offset[], mask: geom.MaskRect, next: geom.Offset) { +function addPoint(points: geom.Offset[], mask: geom.MaskRectangle, next: geom.Offset) { if (nextToLastMatch(points, next)) { - mask.set(points.splice(points.length - 1, 1)[0], false); + mask.setAtOffset(points.splice(points.length - 1, 1)[0], false); } else { points.push(next); - mask.set(next, true); + mask.setAtOffset(next, true); } } function verticalHelper(points: geom.Offset[], random: () => number, variation: number, - newPoints: geom.Offset[], mask: geom.MaskRect, i: number, + newPoints: geom.Offset[], mask: geom.MaskRectangle, i: number, p1: geom.Offset, p2: geom.Offset) { const x = 2 * p1.x; const yDir = p2.y - p1.y; @@ -32,16 +34,16 @@ function verticalHelper(points: geom.Offset[], random: () => number, variation: // This can happen around a corner, when just before the corner // we dip into the corner // console.info(` remove ${newPoints[newPoints.length - 1]}`); - mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false); + mask.setAtOffset(newPoints.splice(newPoints.length - 1, 1)[0], false); continue; } - if (i === points.length - 2 && mask.get(np3)) { + if (i === points.length - 2 && mask.getAtOffset(np3)) { // This can happen if the first point was on a corner and the // first move was to dip into the corner const index = newPoints.findIndex((point) => point.equals(np3)); // console.info(`remove ${index} from beginning`); for (const point of newPoints.splice(0, index)) { - mask.set(point, false); + mask.setAtOffset(point, false); } addPoint(newPoints, mask, np3); break; @@ -50,8 +52,8 @@ function verticalHelper(points: geom.Offset[], random: () => number, variation: const v = Math.floor(random() * 2) * 2 - 1; const np1 = new geom.Offset(x + v, y); const np2 = new geom.Offset(x + v, y + yDir); - if (!mask.get(np2)) { - if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) { + if (!mask.getAtOffset(np2)) { + if (!mask.getAtOffset(np1) || nextToLastMatch(newPoints, np1)) { addPoint(newPoints, mask, np1); addPoint(newPoints, mask, np2); } @@ -62,7 +64,7 @@ function verticalHelper(points: geom.Offset[], random: () => number, variation: } function horizontalHelper(points: geom.Offset[], random: () => number, variation: number, - newPoints: geom.Offset[], mask: geom.MaskRect, i: number, + newPoints: geom.Offset[], mask: geom.MaskRectangle, i: number, p1: geom.Offset, p2: geom.Offset) { const y = 2 * p1.y; const xDir = p2.x - p1.x; @@ -73,16 +75,16 @@ function horizontalHelper(points: geom.Offset[], random: () => number, variation // This can happen around a corner, when just before the corner // we dip in the direction of the corner // console.info(` remove ${newPoints[newPoints.length - 1]}`); - mask.set(newPoints.splice(newPoints.length - 1, 1)[0], false); + mask.setAtOffset(newPoints.splice(newPoints.length - 1, 1)[0], false); continue; } - if (i === points.length - 2 && mask.get(np3)) { + if (i === points.length - 2 && mask.getAtOffset(np3)) { // This can happen if the first point was on a corner and the // first move was to dip into the corner const index = newPoints.findIndex((point) => point.equals(np3)); // console.info(`remove ${index} from beginning`); for (const point of newPoints.splice(0, index)) { - mask.set(point, false); + mask.setAtOffset(point, false); } addPoint(newPoints, mask, np3); break; @@ -91,8 +93,8 @@ function horizontalHelper(points: geom.Offset[], random: () => number, variation const v = Math.floor(random() * 2) * 2 - 1; const np1 = new geom.Offset(x, y + v); const np2 = new geom.Offset(x + xDir, y + v); - if (!mask.get(np2)) { - if (!mask.get(np1) || nextToLastMatch(newPoints, np1)) { + if (!mask.getAtOffset(np2)) { + if (!mask.getAtOffset(np1) || nextToLastMatch(newPoints, np1)) { addPoint(newPoints, mask, np1); addPoint(newPoints, mask, np2); } @@ -112,7 +114,7 @@ function blockFractalIteration(random: () => number, points: geom.Offset[], bounds.height * 2 + 2, ); // console.info(` bounds ${newBounds}`); - const mask = new geom.MaskRect(newBounds); + const mask = new geom.MaskRectangle(newBounds); for (let i = 0; i < points.length - 1; i ++) { const p1 = points[i]; const p2 = points[i + 1]; @@ -131,21 +133,21 @@ function blockFractalIteration(random: () => number, points: geom.Offset[], }; } -export function makeBlockFractal(param: BlockFractalParam): geom.Path { +export function makeBlockFractal(param: BlockFractalParam): geom.CardinalPath { let {random, shape, variation} = param; if (typeof random === 'undefined') { random = Math.random; } if (typeof shape === 'undefined') { - shape = new geom.Path({x: -1, y: -1}, [ - geom.Direction.EAST, - geom.Direction.EAST, - geom.Direction.SOUTH, - geom.Direction.SOUTH, - geom.Direction.WEST, - geom.Direction.WEST, - geom.Direction.NORTH, - geom.Direction.NORTH, + shape = new geom.CardinalPath({x: -1, y: -1}, [ + geom.CardinalDirection.EAST, + geom.CardinalDirection.EAST, + geom.CardinalDirection.SOUTH, + geom.CardinalDirection.SOUTH, + geom.CardinalDirection.WEST, + geom.CardinalDirection.WEST, + geom.CardinalDirection.NORTH, + geom.CardinalDirection.NORTH, ]); } if (typeof variation === 'undefined') { @@ -154,29 +156,29 @@ export function makeBlockFractal(param: BlockFractalParam): geom.Path { let points = new Array(); let bounds = shape.getBounds(); - shape.getOffsets((off) => { + for (const off of shape.offsets()) { points.push(new geom.Offset(off.x, off.y)); - }); + } for (let iter = 0; iter < param.iterations; iter ++) { // console.info(`iteration ${iter + 1}`); ({points, bounds} = blockFractalIteration(random, points, bounds, variation)); } - const segments = new Array(); + const segments = new Array(); for (let i = 0; i < points.length - 1; i ++) { const curPoint = points[i]; const nextPoint = points[i + 1]; if (nextPoint.y === curPoint.y - 1) { - segments.push(geom.Direction.NORTH); + segments.push(geom.CardinalDirection.NORTH); } else if (nextPoint.x === curPoint.x + 1) { - segments.push(geom.Direction.EAST); + segments.push(geom.CardinalDirection.EAST); } else if (nextPoint.y === curPoint.y + 1) { - segments.push(geom.Direction.SOUTH); + segments.push(geom.CardinalDirection.SOUTH); } else if (nextPoint.x === curPoint.x - 1) { - segments.push(geom.Direction.WEST); + segments.push(geom.CardinalDirection.WEST); } } - return new geom.Path(points[0], segments); + return new geom.CardinalPath(points[0], segments); } diff --git a/src/geom/direction-flags.ts b/src/geom/direction-flags.ts deleted file mode 100644 index 44e3bbf..0000000 --- a/src/geom/direction-flags.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as geom from '.'; - -// tslint:disable:no-bitwise - -export enum DirectionFlags { - NONE = 0, - NORTH = 1, - EAST = 2, - SOUTH = 4, - WEST = 8, - ALL = 15, -} - -export function directionFlagsToString(flags: DirectionFlags) { - let ret = '['; - if ((flags & DirectionFlags.NORTH) !== 0) { - ret += 'N'; - } - if ((flags & DirectionFlags.EAST) !== 0) { - ret += 'E'; - } - if ((flags & DirectionFlags.SOUTH) !== 0) { - ret += 'S'; - } - if ((flags & DirectionFlags.WEST) !== 0) { - ret += 'W'; - } - return ret + ']'; -} - -// conversion - -export function directionFlagsFromDirection(dir: geom.Direction) { - return (1 << dir) as DirectionFlags; -} diff --git a/src/geom/direction.ts b/src/geom/direction.ts deleted file mode 100644 index bb95a59..0000000 --- a/src/geom/direction.ts +++ /dev/null @@ -1,30 +0,0 @@ -// tslint:disable:no-bitwise - -export enum Direction { - NORTH = 0, - EAST = 1, - SOUTH = 2, - WEST = 3, -} - -export const DIRECTIONS = [ - Direction.NORTH, - Direction.EAST, - Direction.SOUTH, - Direction.WEST, -]; - -const DIRECTIONS_STR = [ - 'N', - 'E', - 'S', - 'W', -]; - -export function directionToString(dir: Direction) { - return DIRECTIONS_STR[dir]; -} - -export function directionOpposite(dir: Direction) { - return ((dir + 2) & 3) as Direction; -} diff --git a/src/geom/index.ts b/src/geom/index.ts deleted file mode 100644 index d700063..0000000 --- a/src/geom/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './direction'; -export * from './direction-flags'; -export * from './offset'; -export * from './size'; -export * from './rectangle'; -export * from './mask'; -export * from './mask-rect'; -export * from './raster-mask'; -export * from './path'; diff --git a/src/geom/mask-rect.ts b/src/geom/mask-rect.ts deleted file mode 100644 index 45fec96..0000000 --- a/src/geom/mask-rect.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as geom from '.'; - -const LOCAL_OFF = new geom.Offset(); - -export class MaskRect implements geom.RectangleLike { - private readonly _rectangle = new geom.Rectangle(); - private readonly _mask: geom.Mask; - private readonly _outsideValue: boolean; - - constructor(rect: geom.RectangleLike, initialValue = false, outsideValue = false) { - this._rectangle.copyFrom(rect); - this._mask = new geom.Mask(rect, initialValue); - this._outsideValue = outsideValue; - } - - // accessors - - toString() { - return `${this._rectangle.northWest}/${this._outsideValue}\n${this._mask}`; - } - - get westX() { - return this._rectangle.westX; - } - - get northY() { - return this._rectangle.northY; - } - - get width() { - return this._rectangle.width; - } - - get height() { - return this._rectangle.height; - } - - index(off: geom.OffsetLike) { - return this._mask.index(LOCAL_OFF.copyFrom(off).subtractOffset(this._rectangle.northWest)); - } - - getAt(index: number) { - return this._mask.getAt(index); - } - - get(off: geom.OffsetLike) { - if (!this._rectangle.containsOffset(off)) { - return this._outsideValue; - } - return this._mask.getAt(this._rectangle.index(off)); - } - - // mutators - - setAt(index: number, value: boolean) { - this._mask.setAt(index, value); - return this; - } - - set(off: geom.OffsetLike, value: boolean) { - this._mask.setAt(this._rectangle.index(off), value); - return this; - } -} diff --git a/src/geom/mask.ts b/src/geom/mask.ts deleted file mode 100644 index f3e3d06..0000000 --- a/src/geom/mask.ts +++ /dev/null @@ -1,70 +0,0 @@ -import * as geom from '.'; - -export class Mask implements geom.SizeLike { - private readonly _size = new geom.Size(); - private readonly _bits: number[]; - // TODO consider Uint8Array for bits - - constructor(size: geom.SizeLike, initialValue = false) { - this._size.copyFrom(size); - this._bits = new Array(Math.ceil(this._size.area / 32)).fill(initialValue ? 0xffffffff : 0); - } - - // accessors - - toString() { - let ret = ''; - const off = new geom.Offset(); - for (let y = 0; y < this._size.height; y ++) { - for (let x = 0; x < this._size.width; x ++) { - off.set(x, y); - ret += this.get(off.set(x, y)) ? '☑' : '☐'; - } - ret += '\n'; - } - return ret; - } - - get width() { - return this._size.width; - } - - get height() { - return this._size.height; - } - - index(off: geom.OffsetLike) { - return this._size.index(off); - } - - getAt(index: number) { - // tslint:disable:no-bitwise - const arrayIndex = index >>> 5; - const bitMask = 1 << (index & 31); - return (this._bits[arrayIndex] & bitMask) !== 0; - // tslint:enable:no-bitwise - } - - get(off: geom.OffsetLike) { - return this.getAt(this.index(off)); - } - - // mutators - - setAt(index: number, value: boolean) { - // tslint:disable:no-bitwise - const arrayIndex = index >>> 5; - const bitMask = 1 << (index & 31); - if (value) { - this._bits[arrayIndex] |= bitMask; - } else { - this._bits[arrayIndex] &= ~bitMask; - } - // tslint:enable:no-bitwise - return this; - } - - set(off: geom.OffsetLike, value: boolean) { - return this.setAt(this.index(off), value); - } -} diff --git a/src/geom/offset.ts b/src/geom/offset.ts deleted file mode 100644 index f814727..0000000 --- a/src/geom/offset.ts +++ /dev/null @@ -1,121 +0,0 @@ -import * as geom from '.'; - -const X_FROM_DIRECTION = [ 0, 1, 0, -1 ]; -const Y_FROM_DIRECTION = [ -1, 0, 1, 0 ]; - -export interface OffsetLike { - readonly x: number; - readonly y: number; -} - -export class Offset implements OffsetLike { - x: number; - y: number; - - constructor(); - constructor(x: number, y: number); - constructor(x?: number, y?: number) { - if (typeof x === 'undefined') { - x = 0; - } - if (typeof y === 'undefined') { - y = 0; - } - this.x = x; - this.y = y; - } - - // accessors - - toString() { - return `(${this.x},${this.y})`; - } - - equals(other: OffsetLike) { - return this.x === other.x && this.y === other.y; - } - - // chebyshev: can move in any direction (diagonals are ok) - get magnitudeChebyshev() { - return Math.max(Math.abs(this.x), Math.abs(this.y)); - } - - // manhattan: can move only in cardinal directions (no diagonals) - get magnitudeManhattan(): number { - return Math.abs(this.x) + Math.abs(this.y); - } - - // mutators - - set(x: number, y: number) { - this.x = x; - this.y = y; - return this; - } - - copyFrom(other: OffsetLike) { - this.x = other.x; - this.y = other.y; - return this; - } - - setFromDirection(dir: geom.Direction) { - this.x = X_FROM_DIRECTION[dir]; - this.y = Y_FROM_DIRECTION[dir]; - return this; - } - - add(x: number, y: number) { - this.x += x; - this.y += y; - return this; - } - - addSize(size: geom.SizeLike) { - this.x += size.width; - this.y += size.height; - return this; - } - - addOffset(off: OffsetLike) { - this.x += off.x; - this.y += off.y; - return this; - } - - addDirection(dir: geom.Direction) { - this.x += X_FROM_DIRECTION[dir]; - this.y += Y_FROM_DIRECTION[dir]; - return this; - } - - addCardinalDirection(dir: geom.Direction) { - this.x += X_FROM_DIRECTION[dir]; - this.y += Y_FROM_DIRECTION[dir]; - return this; - } - - subtractOffset(off: OffsetLike) { - this.x -= off.x; - this.y -= off.y; - return this; - } - - multiply(factor: number) { - this.x *= factor; - this.y *= factor; - return this; - } - - // utilities - - // chebyshev: can move in any direction (diagonals are ok) - distanceChebyshev(other: OffsetLike) { - return this.subtractOffset(other).magnitudeChebyshev; - } - - // manhattan: can move only in cardinal directions (no diagonals) - distanceManhattan(other?: OffsetLike): number { - return this.subtractOffset(other).magnitudeManhattan; - } -} diff --git a/src/geom/path.ts b/src/geom/path.ts deleted file mode 100644 index 203e679..0000000 --- a/src/geom/path.ts +++ /dev/null @@ -1,133 +0,0 @@ -import * as geom from '.'; - -const LOCAL_OFF = new geom.Offset(); - -function sortedInsert(array: number[], value: number) { - let low = 0; - let high = array.length; - - while (low < high) { - // tslint:disable-next-line:no-bitwise - const mid = (low + high) >>> 1; - if (array[mid] < value) { - low = mid + 1; - } else { - high = mid; - } - } - - array.splice(low, 0, value); -} - -export class Path { - start: geom.Offset; - segments: geom.Direction[]; - - constructor(); - constructor(start: geom.OffsetLike, segments: geom.Direction[]); - constructor(start?: geom.OffsetLike, segments?: geom.Direction[]) { - this.start = new geom.Offset(); - if (typeof start !== 'undefined') { - this.start.copyFrom(start); - } - if (typeof segments === 'undefined') { - segments = new Array(); - } - this.segments = segments; - } - - toString() { - return `${this.start.toString()}:` - + `${this.segments.map((segment) => geom.directionToString(segment)).join('')}`; - } - - getIsClosed() { - LOCAL_OFF.copyFrom(this.start); - for (const segment of this.segments) { - LOCAL_OFF.addDirection(segment); - } - return this.start.equals(LOCAL_OFF); - } - - getOffsets(callback: (off: geom.OffsetLike) => void) { - const cursor = new geom.Offset(); - cursor.copyFrom(this.start); - callback(cursor); - for (const segment of this.segments) { - cursor.addDirection(segment); - callback(cursor); - } - } - - getBounds(): geom.Rectangle { - let northY = this.start.y; - let southY = northY; - let westX = this.start.x; - let eastX = westX; - LOCAL_OFF.copyFrom(this.start); - for (const segment of this.segments) { - LOCAL_OFF.addDirection(segment); - switch (segment) { - case geom.Direction.NORTH: - northY = Math.min(northY, LOCAL_OFF.y); - break; - case geom.Direction.EAST: - eastX = Math.max(eastX, LOCAL_OFF.x); - break; - case geom.Direction.SOUTH: - southY = Math.max(southY, LOCAL_OFF.y); - break; - case geom.Direction.WEST: - westX = Math.min(westX, LOCAL_OFF.x); - break; - } - } - return new geom.Rectangle(westX, northY, eastX - westX + 1, southY - northY + 1); - } - - getArea() { - let total = 0; - LOCAL_OFF.copyFrom(this.start); - for (const segment of this.segments) { - LOCAL_OFF.addDirection(segment); - switch (segment) { - case geom.Direction.NORTH: - total -= LOCAL_OFF.x; - break; - case geom.Direction.SOUTH: - total += LOCAL_OFF.x; - break; - } - } - return Math.abs(total); - } - - rasterize(bounds?: geom.RectangleLike): geom.RasterMask { - const lines = new Array(); - if (typeof bounds === 'undefined') { - bounds = this.getBounds(); - } - LOCAL_OFF.copyFrom(this.start); - const {northY} = bounds; - const southY = northY + bounds.height - 1; - for (let y = northY; y < southY; y ++) { - lines.push([]); - } - LOCAL_OFF.copyFrom(this.start); - for (const segment of this.segments) { - if (segment === geom.Direction.SOUTH) { - sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x); - } - LOCAL_OFF.addDirection(segment); - if (segment === geom.Direction.NORTH) { - sortedInsert(lines[LOCAL_OFF.y - northY], LOCAL_OFF.x); - } - } - return new geom.RasterMask({ - westX: bounds.westX, - northY: bounds.northY, - width: bounds.width - 1, - height: bounds.height - 1, - }, lines); - } -} diff --git a/src/geom/raster-mask.ts b/src/geom/raster-mask.ts deleted file mode 100644 index 201100b..0000000 --- a/src/geom/raster-mask.ts +++ /dev/null @@ -1,88 +0,0 @@ -import * as geom from '.'; - -export class RasterMask implements geom.RectangleLike, geom.SizeLike { - northWest: geom.Offset; - size: geom.Size; - private _lines: number[][]; - - constructor(bounds: geom.RectangleLike, lines: number[][]) { - this.northWest = new geom.Offset(bounds.westX, bounds.northY); - this.size = new geom.Size(bounds.width, bounds.height); - this._lines = lines; - } - - toString() { - let shape = ''; - for (let y = 0; y < this.height; y ++) { - const line = this._lines[y]; - let x = this.westX; - for (let i = 0; i < line.length; i += 2) { - const start = line[i]; - const end = line[i + 1]; - while (x < start) { - shape += '∙'; - x ++; - } - while (x < end) { - shape += '█'; - x ++; - } - } - while (x <= this.eastX) { - shape += '∙'; - x ++; - } - shape += '\n'; - } - return `${this.northWest}\n${shape}`; - } - - // accessors - - get northY() { - return this.northWest.y; - } - - get southY() { - return this.northWest.y + this.size.height - 1; - } - - get westX() { - return this.northWest.x; - } - - get eastX() { - return this.northWest.x + this.size.width - 1; - } - - get width() { - return this.size.width; - } - - get height() { - return this.size.height; - } - - get(x: number, y: number) { - if (y < this.northY || y > this.southY) { - return false; - } - const line = this._lines[y - this.northY]; - for (let i = 0; i < line.length; i += 2) { - if (x >= line[i] && x < line[i + 1]) { - return true; - } - } - return false; - } - - bandsAt(y: number, callback: (westX: number, eastX: number) => void) { - if (y < this.northY || y > this.southY) { - return; - } - const line = this._lines[y - this.northY]; - for (let i = 0; i < line.length; i += 2) { - callback(line[i], line[i + 1] - 1); - } - } -} diff --git a/src/geom/rectangle.ts b/src/geom/rectangle.ts deleted file mode 100644 index 915a4aa..0000000 --- a/src/geom/rectangle.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as geom from '.'; - -export interface RectangleLike extends geom.SizeLike { - readonly westX: number; - readonly northY: number; -} - -const LOCAL_OFF = new geom.Offset(); - -export class Rectangle implements RectangleLike, geom.SizeLike { - northWest: geom.Offset; - size: geom.Size; - - constructor(); - constructor(westX: number, northY: number, width: number, height: number); - constructor(westX?: number, northY?: number, width?: number, height?: number) { - if (typeof westX === 'undefined') { - westX = 0; - } - if (typeof northY === 'undefined') { - northY = 0; - } - if (typeof width === 'undefined') { - width = 0; - } - if (typeof height === 'undefined') { - height = 0; - } - this.northWest = new geom.Offset(westX, northY); - this.size = new geom.Size(width, height); - } - - // accessors - - toString() { - return `(${this.westX},${this.northY} ${this.width}x${this.height})`; - } - - equals(other: RectangleLike) { - return this.westX === other.westX && this.northY === other.northY && this.size.equals(other); - } - - get northY() { - return this.northWest.y; - } - - get southY() { - return this.northWest.y + this.size.height - 1; - } - - get westX() { - return this.northWest.x; - } - - get eastX() { - return this.northWest.x + this.size.width - 1; - } - - get width() { - return this.size.width; - } - - get height() { - return this.size.height; - } - - get empty() { - return this.size.empty; - } - - get area() { - return this.size.area; - } - - // mutators - - set(westX: number, northY: number, width: number, height: number) { - this.northWest.set(westX, northY); - this.size.set(width, height); - return this; - } - - copyFrom(other: RectangleLike) { - this.northWest.set(other.westX, other.northY); - this.size.set(other.width, other.height); - return this; - } - - extendToInclude(off: geom.OffsetLike) { - const dx = off.x - this.westX; - if (dx < 0) { - this.size.width -= dx; - this.northWest.x = off.x; - } else if (dx >= this.size.width) { - this.size.width = dx + 1; - } - const dy = off.y - this.northWest.y; - if (dy < 0) { - this.size.height -= dy; - this.northWest.y = off.y; - } else if (dy >= this.size.height) { - this.size.height = dy + 1; - } - return this; - } - - // utilities - - containsOffset(off: geom.OffsetLike) { - return this.size.containsOffset(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest)); - } - - containsRectangle(other: RectangleLike) { - LOCAL_OFF.set(other.westX, other.northY).subtractOffset(this.northWest); - if (!this.size.containsOffset(LOCAL_OFF)) { - return false; - } - if (other.width === 0 && other.height === 0) { - return false; - } - return this.size.containsOffset(LOCAL_OFF.add(other.width - 1, other.height - 1)); - } - - overlapsRectangle(other: RectangleLike) { - return this.northY <= other.northY + other.height - 1 - && this.southY >= other.northY - && this.westX <= other.westX + other.width - 1 - && this.eastX >= other.westX - && !this.empty - && other.width !== 0 && other.height !== 0; - } - - index(off: geom.OffsetLike) { - return this.size.index(LOCAL_OFF.copyFrom(off).subtractOffset(this.northWest)); - } -} diff --git a/src/geom/size.ts b/src/geom/size.ts deleted file mode 100644 index 099347c..0000000 --- a/src/geom/size.ts +++ /dev/null @@ -1,86 +0,0 @@ -import * as geom from '.'; - -export interface SizeLike { - readonly width: number; - readonly height: number; -} - -export class Size implements SizeLike { - width: number; - height: number; - - constructor(); - constructor(width: number, height: number); - constructor(width?: number, height?: number) { - if (typeof width === 'undefined') { - width = 0; - } - if (typeof height === 'undefined') { - height = 0; - } - this.width = width; - this.height = height; - } - - // accessors - - toString() { - return `(${this.width}x${this.height})`; - } - - equals(other: SizeLike) { - return this.width === other.width && this.height === other.height; - } - - get empty() { - return this.width === 0 || this.height === 0; - } - - get area() { - return this.width * this.height; - } - - // mutators - - set(width: number, height: number) { - this.width = width; - this.height = height; - return this; - } - - copyFrom(other: SizeLike) { - this.width = other.width; - this.height = other.height; - return this; - } - - add(width: number, height: number) { - this.width += width; - this.height += height; - return this; - } - - addOffset(off: geom.OffsetLike) { - this.width += off.x; - this.height += off.y; - return this; - } - - multiply(factor: number) { - this.width *= factor; - this.height *= factor; - return this; - } - - // TODO: rotate - - // utilities - - containsOffset(off: geom.OffsetLike) { - return off.x >= 0 && off.y >= 0 && off.x < this.width && off.y < this.height; - } - - index(off: geom.OffsetLike) { - return off.y * this.width + off.x; - } -} diff --git a/src/index.ts b/src/index.ts index c35843f..aae4e22 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,4 +6,4 @@ */ export {makeBlockFractal} from './block-fractal'; -export {Direction, DirectionFlags, Offset, Path, RasterMask} from './geom'; +export {CardinalDirection, CardinalDirectionFlags, Offset, CardinalPath, RasterMask} from 'tiled-geometry'; diff --git a/test/geom/test-direction-flags.ts b/test/geom/test-direction-flags.ts deleted file mode 100644 index 1c67737..0000000 --- a/test/geom/test-direction-flags.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/direction-flags', () => { - describe('directionFlagsToString', () => { - it('works', () => { - assert.strictEqual(geom.directionFlagsToString( - geom.DirectionFlags.NONE, - ), '[]'); - assert.strictEqual(geom.directionFlagsToString( - geom.DirectionFlags.NORTH, - ), '[N]'); - assert.strictEqual(geom.directionFlagsToString( - geom.DirectionFlags.EAST + geom.DirectionFlags.SOUTH, - ), '[ES]'); - assert.strictEqual(geom.directionFlagsToString( - geom.DirectionFlags.ALL, - ), '[NESW]'); - }); - }); - describe('directionFlagsFromCardinalDirection', () => { - it('works', () => { - assert.strictEqual(geom.directionFlagsFromDirection(geom.Direction.NORTH), - geom.DirectionFlags.NORTH); - assert.strictEqual(geom.directionFlagsFromDirection(geom.Direction.EAST), - geom.DirectionFlags.EAST); - assert.strictEqual(geom.directionFlagsFromDirection(geom.Direction.SOUTH), - geom.DirectionFlags.SOUTH); - assert.strictEqual(geom.directionFlagsFromDirection(geom.Direction.WEST), - geom.DirectionFlags.WEST); - }); - }); -}); diff --git a/test/geom/test-direction.ts b/test/geom/test-direction.ts deleted file mode 100644 index 15f7c3f..0000000 --- a/test/geom/test-direction.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/direction', () => { - describe('DIRECTIONS', () => { - it('has 4 directions', () => { - assert.deepStrictEqual(geom.DIRECTIONS.length, 4); - }); - }); - describe('directionToString', () => { - it('works', () => { - assert.strictEqual(geom.directionToString(geom.Direction.NORTH), 'N'); - assert.strictEqual(geom.directionToString(geom.Direction.SOUTH), 'S'); - assert.strictEqual(geom.directionToString(geom.Direction.WEST), 'W'); - }); - }); - describe('directionOpposite', () => { - it('works', () => { - assert.strictEqual(geom.directionOpposite(geom.Direction.NORTH), geom.Direction.SOUTH); - assert.strictEqual(geom.directionOpposite(geom.Direction.EAST), geom.Direction.WEST); - assert.strictEqual(geom.directionOpposite(geom.Direction.SOUTH), geom.Direction.NORTH); - assert.strictEqual(geom.directionOpposite(geom.Direction.WEST), geom.Direction.EAST); - }); - }); -}); diff --git a/test/geom/test-mask-rect.ts b/test/geom/test-mask-rect.ts deleted file mode 100644 index 99ea022..0000000 --- a/test/geom/test-mask-rect.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/mask-rect', () => { - describe('#constructor()', () => { - it('starts filled with false', () => { - const o = new geom.MaskRect({westX: 1, northY: 2, width: 3, height: 4}); - assert.strictEqual(o.westX, 1); - assert.strictEqual(o.northY, 2); - assert.strictEqual(o.width, 3); - assert.strictEqual(o.height, 4); - assert.strictEqual(o.get({x: 1, y: 2}), false); - assert.strictEqual(o.get({x: 0, y: 0}), false); - }); - it('can be filled with true', () => { - const o = new geom.MaskRect(new geom.Rectangle().set(1, 2, 3, 4), true); - assert.strictEqual(o.westX, 1); - assert.strictEqual(o.northY, 2); - assert.strictEqual(o.width, 3); - assert.strictEqual(o.height, 4); - assert.strictEqual(o.get({x: 1, y: 2}), true); - assert.strictEqual(o.get({x: 0, y: 0}), false); - }); - it('can have outside values be true', () => { - const o = new geom.MaskRect(new geom.Rectangle().set(1, 2, 3, 4), false, true); - assert.strictEqual(o.westX, 1); - assert.strictEqual(o.northY, 2); - assert.strictEqual(o.width, 3); - assert.strictEqual(o.height, 4); - assert.strictEqual(o.get({x: 1, y: 2}), false); - assert.strictEqual(o.get({x: 0, y: 0}), true); - }); - }); - describe('#set()', () => { - it('works', () => { - const o = new geom.MaskRect({westX: 1, northY: 2, width: 3, height: 4}); - o.set({x: 2, y: 3}, true); - assert.strictEqual(o.get({x: 2, y: 3}), true); - o.set({x: 2, y: 3}, false); - assert.strictEqual(o.get({x: 2, y: 3}), false); - }); - }); - describe('#toString()', () => { - it('works', () => { - const o = new geom.MaskRect({westX: 1, northY: 2, width: 3, height: 3}); - o.set({x: 1, y: 2}, true); - o.set({x: 2, y: 3}, true); - o.set({x: 3, y: 3}, true); - assert.strictEqual(o.toString(), '(1,2)/false\n☑☐☐\n☐☑☑\n☐☐☐\n'); - }); - }); -}); diff --git a/test/geom/test-mask.ts b/test/geom/test-mask.ts deleted file mode 100644 index 3d7b88c..0000000 --- a/test/geom/test-mask.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/mask', () => { - describe('#constructor()', () => { - it('starts filled with false', () => { - const o = new geom.Mask({width: 10, height: 11}); - assert.strictEqual(o.width, 10); - assert.strictEqual(o.height, 11); - assert.strictEqual(o.get({x: 1, y: 2}), false); - }); - it('can be filled with true', () => { - const o = new geom.Mask({width: 10, height: 11}, true); - assert.strictEqual(o.width, 10); - assert.strictEqual(o.height, 11); - assert.strictEqual(o.get({x: 1, y: 2}), true); - }); - }); - describe('#set()', () => { - it('works', () => { - const o = new geom.Mask({width: 10, height: 11}); - o.set({x: 1, y: 2}, true); - assert.strictEqual(o.get({x: 1, y: 2}), true); - o.set({x: 1, y: 2}, false); - assert.strictEqual(o.get({x: 1, y: 2}), false); - }); - }); - describe('#toString()', () => { - it('works', () => { - const o = new geom.Mask({width: 3, height: 3}); - o.set({x: 0, y: 0}, true); - o.set({x: 1, y: 1}, true); - o.set({x: 2, y: 1}, true); - assert.strictEqual(o.toString(), '☑☐☐\n☐☑☑\n☐☐☐\n'); - }); - }); -}); diff --git a/test/geom/test-offset.ts b/test/geom/test-offset.ts deleted file mode 100644 index 4e36561..0000000 --- a/test/geom/test-offset.ts +++ /dev/null @@ -1,128 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/offset', () => { - it('starts at 0,0', () => { - const o = new geom.Offset(); - assert.strictEqual(o.x, 0); - assert.strictEqual(o.y, 0); - }); - it('is mutable', () => { - const o = new geom.Offset(); - o.x = 1; - assert.strictEqual(o.x, 1); - }); - describe('#constructor()', () => { - it('works', () => { - const o = new geom.Offset(1, 2); - assert.strictEqual(o.x, 1); - assert.strictEqual(o.y, 2); - }); - }); - describe('#set()', () => { - it('works', () => { - const o = new geom.Offset().set(1, 2); - assert.strictEqual(o.x, 1); - assert.strictEqual(o.y, 2); - }); - }); - describe('#toString()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).toString(), '(1,2)'); - assert.strictEqual(new geom.Offset(-3, -4).toString(), '(-3,-4)'); - }); - }); - describe('#equals()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).equals({x: 1, y: 2}), true); - assert.strictEqual(new geom.Offset(1, 2).equals({x: 2, y: 2}), false); - assert.strictEqual(new geom.Offset(1, 2).equals({x: 1, y: 1}), false); - }); - }); - describe('#magnitudeChebyshev', () => { - it('works', () => { - assert.strictEqual(new geom.Offset().magnitudeChebyshev, 0); - assert.strictEqual(new geom.Offset(7, 3).magnitudeChebyshev, 7); - assert.strictEqual(new geom.Offset(-7, 5).magnitudeChebyshev, 7); - assert.strictEqual(new geom.Offset(7, -6).magnitudeChebyshev, 7); - assert.strictEqual(new geom.Offset(2, -7).magnitudeChebyshev, 7); - assert.strictEqual(new geom.Offset(11, 17).magnitudeChebyshev, 17); - }); - }); - describe('#magnitudeManhattan', () => { - it('works', () => { - assert.strictEqual(new geom.Offset().magnitudeManhattan, 0); - assert.strictEqual(new geom.Offset(7, 3).magnitudeManhattan, 10); - assert.strictEqual(new geom.Offset(-7, 5).magnitudeManhattan, 12); - assert.strictEqual(new geom.Offset(7, -6).magnitudeManhattan, 13); - assert.strictEqual(new geom.Offset(2, -7).magnitudeManhattan, 9); - assert.strictEqual(new geom.Offset(11, 17).magnitudeManhattan, 28); - }); - }); - describe('#copyFrom()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset().copyFrom(new geom.Offset(1, 2)).toString(), '(1,2)'); - assert.strictEqual(new geom.Offset().copyFrom({y: 2, x: 1}).toString(), '(1,2)'); - }); - }); - describe('#setFromDirection()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset().setFromDirection(geom.Direction.NORTH).toString(), '(0,-1)'); - assert.strictEqual(new geom.Offset().setFromDirection(geom.Direction.EAST).toString(), '(1,0)'); - assert.strictEqual(new geom.Offset().setFromDirection(geom.Direction.SOUTH).toString(), '(0,1)'); - assert.strictEqual(new geom.Offset().setFromDirection(geom.Direction.WEST).toString(), '(-1,0)'); - }); - }); - describe('#add()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).add(-3, 4).toString(), '(-2,6)'); - }); - }); - describe('#addSize()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).addSize({width: 3, height: 4}).toString(), '(4,6)'); - }); - }); - describe('#addOffset()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).addOffset({x: -3, y: -5}).toString(), '(-2,-3)'); - }); - }); - describe('#addDirection()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).addDirection(geom.Direction.NORTH).toString(), - '(1,1)'); - assert.strictEqual(new geom.Offset(1, 2).addDirection(geom.Direction.EAST).toString(), - '(2,2)'); - assert.strictEqual(new geom.Offset(1, 2).addDirection(geom.Direction.SOUTH).toString(), - '(1,3)'); - }); - }); - describe('#subtractOffset()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).subtractOffset({x: 3, y: 5}).toString(), '(-2,-3)'); - }); - }); - describe('#multiply()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).multiply(3).toString(), '(3,6)'); - }); - }); - describe('#distanceChebyshev()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).distanceChebyshev({x: 1, y: 2}), 0); - assert.strictEqual(new geom.Offset(1, 2).distanceChebyshev({x: 2, y: 1}), 1); - assert.strictEqual(new geom.Offset(1, 2).distanceChebyshev({x: 2, y: 2}), 1); - assert.strictEqual(new geom.Offset(1, 2).distanceChebyshev({x: -5, y: 7}), 6); - }); - }); - describe('#distanceManhattan()', () => { - it('works', () => { - assert.strictEqual(new geom.Offset(1, 2).distanceManhattan({x: 1, y: 2}), 0); - assert.strictEqual(new geom.Offset(1, 2).distanceManhattan({x: 2, y: 1}), 2); - assert.strictEqual(new geom.Offset(1, 2).distanceManhattan({x: 2, y: 2}), 1); - assert.strictEqual(new geom.Offset(1, 2).distanceManhattan({x: -5, y: 7}), 11); - }); - }); -}); diff --git a/test/geom/test-path.ts b/test/geom/test-path.ts deleted file mode 100644 index 2fd2a9e..0000000 --- a/test/geom/test-path.ts +++ /dev/null @@ -1,123 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -function makePath(x: number, y: number, path: string) { - const segments = new Array(); - for (let i = 0; i < path.length; i ++) { - switch (path.charAt(i).toUpperCase()) { - case 'N': - segments.push(geom.Direction.NORTH); - break; - case 'E': - segments.push(geom.Direction.EAST); - break; - case 'S': - segments.push(geom.Direction.SOUTH); - break; - case 'W': - segments.push(geom.Direction.WEST); - break; - } - } - return new geom.Path({x, y}, segments); -} - -describe('geom/path', () => { - it('starts empty', () => { - const p = new geom.Path(); - assert.strictEqual(p.start.x, 0); - assert.strictEqual(p.start.y, 0); - assert.strictEqual(p.segments.length, 0); - }); - describe('#constructor()', () => { - it('works', () => { - const p = makePath(1, 2, 'N'); - assert.strictEqual(p.start.x, 1); - assert.strictEqual(p.start.y, 2); - assert.strictEqual(p.segments.length, 1); - assert.strictEqual(p.segments[0], geom.Direction.NORTH); - }); - }); - describe('#toString()', () => { - it('works', () => { - const p = makePath(1, 2, 'NW'); - assert.strictEqual(p.toString(), '(1,2):NW'); - }); - }); - describe('#getIsClosed()', () => { - it('works for a simple closed path', () => { - const p = makePath(1, 2, 'NWSE'); - assert.strictEqual(p.getIsClosed(), true); - }); - it('works for a simple open path', () => { - const p = makePath(1, 2, 'NWE'); - assert.strictEqual(p.getIsClosed(), false); - }); - it('works for a more complex shape', () => { - // 1 2 3 4 5 - // 1 ..... - // 2 ... . - // 3 . ... ... - // 4 . . ... . - // 5 ... ... - const p = makePath(1, 2, 'ENEESSESSWNWNWSSWNNN'); - assert.strictEqual(p.getIsClosed(), true); - }); - }); - describe('#getBounds()', () => { - it('works for a simple square', () => { - const p = makePath(1, 2, 'NWSE'); - assert.strictEqual(p.getBounds().toString(), '(0,1 2x2)'); - }); - it('works for a more complex shape', () => { - // 1 2 3 4 5 - // 1 ..... - // 2 ... . - // 3 . ... ... - // 4 . . ... . - // 5 ... ... - const p = makePath(1, 2, 'ENEESSESSWNWNWSSWNNN'); - assert.strictEqual(p.getBounds().toString(), '(1,1 5x5)'); - }); - }); - describe('#getArea()', () => { - it('works for a simple square', () => { - const p = makePath(1, 2, 'NWSE'); - assert.strictEqual(p.getArea(), 1); - }); - it('works for a more complex shape', () => { - // 1 2 3 4 5 - // 1 ..... - // 2 ... . - // 3 . ... ... - // 4 . . ... . - // 5 ... ... - const p = makePath(1, 2, 'ENEESSESSWNWNWSSWNNN'); - assert.strictEqual(p.getArea(), 10); - }); - }); - describe('#rasterize()', () => { - it('works for a simple square', () => { - const p = makePath(1, 2, 'NWSE'); - assert.strictEqual(p.rasterize().toString(), `(0,1) -█ -`); - }); - it('works for a more complex shape', () => { - // 1 2 3 4 5 - // 1 ..... - // 2 ... . - // 3 . ... ... - // 4 . . ... . - // 5 ... ... - const p = makePath(1, 2, 'ENEESSESSWNWNWSSWNNN'); - assert.strictEqual(p.rasterize().toString(), `(1,1) -∙██∙ -███∙ -█∙██ -█∙∙█ -`); - }); - }); -}); diff --git a/test/geom/test-raster-mask.ts b/test/geom/test-raster-mask.ts deleted file mode 100644 index 8cdf95c..0000000 --- a/test/geom/test-raster-mask.ts +++ /dev/null @@ -1,72 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/raster-mask', () => { - describe('#constructor()', () => { - it('works', () => { - const m = new geom.RasterMask({westX: 1, northY: 2, width: 3, height: 4}, [ - [1, 2], - [1, 4], - [1, 2, 3, 4], - [2, 4], - ]); - assert.strictEqual(m.westX, 1); - assert.strictEqual(m.northY, 2); - assert.strictEqual(m.width, 3); - assert.strictEqual(m.height, 4); - }); - }); - describe('#toString()', () => { - it('works', () => { - const m = new geom.RasterMask({westX: 1, northY: 2, width: 3, height: 4}, [ - [1, 2], - [1, 4], - [1, 2, 3, 4], - [2, 4], - ]); - assert.strictEqual(m.toString(), `(1,2) -█∙∙ -███ -█∙█ -∙██ -`); - }); - }); - describe('#get()', () => { - it('works', () => { - const m = new geom.RasterMask({westX: 1, northY: 2, width: 3, height: 4}, [ - [1, 2], - [1, 4], - [1, 2, 3, 4], - [2, 4], - ]); - assert.strictEqual(m.get(1, 0), false); - assert.strictEqual(m.get(1, 2), true); - assert.strictEqual(m.get(2, 2), false); - assert.strictEqual(m.get(0, 3), false); - assert.strictEqual(m.get(5, 3), false); - assert.strictEqual(m.get(2, 4), false); - assert.strictEqual(m.get(3, 4), true); - assert.strictEqual(m.get(4, 4), false); - }); - }); - describe('#bandsAt()', () => { - it('works', () => { - const m = new geom.RasterMask({westX: 1, northY: 2, width: 3, height: 4}, [ - [1, 2], - [1, 4], - [1, 2, 3, 4], - [2, 4], - ]); - let count = 0; - m.bandsAt(1, () => count++); - assert.strictEqual(count, 0); - m.bandsAt(3, () => count++); - assert.strictEqual(count, 1); - count = 0; - m.bandsAt(4, () => count++); - assert.strictEqual(count, 2); - }); - }); -}); diff --git a/test/geom/test-rectangle.ts b/test/geom/test-rectangle.ts deleted file mode 100644 index fa0a534..0000000 --- a/test/geom/test-rectangle.ts +++ /dev/null @@ -1,150 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/rectangle', () => { - it('starts at 0,0 0x0', () => { - const o = new geom.Rectangle(); - assert.strictEqual(o.westX, 0); - assert.strictEqual(o.northY, 0); - assert.strictEqual(o.width, 0); - assert.strictEqual(o.height, 0); - }); - it('is mutable', () => { - const o = new geom.Rectangle(); - o.northWest.y = 1; - o.size.width = 2; - assert.strictEqual(o.northY, 1); - assert.strictEqual(o.width, 2); - }); - describe('#constructor()', () => { - it('works', () => { - const o = new geom.Rectangle(1, 2, 3, 4); - assert.strictEqual(o.westX, 1); - assert.strictEqual(o.northY, 2); - assert.strictEqual(o.width, 3); - assert.strictEqual(o.height, 4); - }); - }); - describe('#set()', () => { - it('works', () => { - const o = new geom.Rectangle().set(1, 2, 3, 4); - assert.strictEqual(o.westX, 1); - assert.strictEqual(o.northY, 2); - assert.strictEqual(o.width, 3); - assert.strictEqual(o.height, 4); - }); - }); - describe('#toString()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).toString(), '(1,2 3x4)'); - }); - }); - describe('#equals()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).equals({westX: 1, northY: 2, width: 3, height: 4}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).equals({westX: 2, northY: 2, width: 3, height: 4}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 4, 4).equals({westX: 1, northY: 2, width: 3, height: 4}), false); - assert.strictEqual(new geom.Rectangle(1, 4, 3, 2).equals({westX: 1, northY: 2, width: 3, height: 4}), false); - }); - }); - describe('#empty', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 0, 0).empty, true); - assert.strictEqual(new geom.Rectangle(1, 2, 9, 0).empty, true); - assert.strictEqual(new geom.Rectangle(1, 2, 0, 9).empty, true); - assert.strictEqual(new geom.Rectangle(1, 2, 1, 2).empty, false); - }); - }); - describe('#area', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 0, 0).area, 0); - assert.strictEqual(new geom.Rectangle(1, 2, 1, 0).area, 0); - assert.strictEqual(new geom.Rectangle(1, 2, 0, 1).area, 0); - assert.strictEqual(new geom.Rectangle(1, 2, 1, 1).area, 1); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).area, 12); - assert.strictEqual(new geom.Rectangle(1, 2, 4, 3).area, 12); - }); - }); - describe('#copyFrom()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle().copyFrom(new geom.Rectangle(1, 2, 3, 4)).toString(), '(1,2 3x4)'); - assert.strictEqual(new geom.Rectangle().copyFrom({ - height: 4, - width: 3, - northY: 2, - westX: 1, - }).toString(), '(1,2 3x4)'); - }); - }); - describe('#extendToInclude()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).extendToInclude({x: 1, y: 3}).toString(), '(1,2 3x4)'); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).extendToInclude({x: 5, y: 3}).toString(), '(1,2 5x4)'); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).extendToInclude({x: -2, y: 5}).toString(), '(-2,2 6x4)'); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).extendToInclude({x: 0, y: 0}).toString(), '(0,0 4x6)'); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).extendToInclude({x: 1, y: 7}).toString(), '(1,2 3x6)'); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).extendToInclude({x: 7, y: 7}).toString(), '(1,2 7x6)'); - }); - }); - describe('#containsOffset()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).containsOffset({x: 1, y: 3}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).containsOffset({x: 1, y: 2}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).containsOffset({x: 3, y: 5}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).containsOffset({x: 4, y: 5}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).containsOffset({x: 3, y: 6}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).containsOffset({x: 1, y: 0}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4).containsOffset({x: 0, y: 3}), false); - }); - }); - describe('#containsRectangle()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .containsRectangle({westX: 1, northY: 2, width: 0, height: 0}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .containsRectangle({westX: 3, northY: 5, width: 0, height: 0}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .containsRectangle({westX: 1, northY: 2, width: 1, height: 0}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .containsRectangle({westX: 1, northY: 2, width: 0, height: 1}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .containsRectangle({westX: 0, northY: 0, width: 10, height: 10}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .containsRectangle({westX: 1, northY: 2, width: 1, height: 2}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .containsRectangle({westX: 2, northY: 3, width: 1, height: 2}), true); - }); - }); - describe('#overlapsRectangle()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 1, northY: 2, width: 0, height: 0}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 3, northY: 5, width: 0, height: 0}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 1, northY: 2, width: 1, height: 0}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 1, northY: 2, width: 0, height: 1}), false); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 0, northY: 0, width: 10, height: 10}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 0, northY: 3, width: 2, height: 1}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 0, northY: 3, width: 5, height: 1}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 2, northY: 3, width: 1, height: 1}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 1, northY: 2, width: 1, height: 2}), true); - assert.strictEqual(new geom.Rectangle(1, 2, 3, 4) - .overlapsRectangle({westX: 2, northY: 3, width: 1, height: 2}), true); - }); - }); - describe('#index()', () => { - it('works', () => { - assert.strictEqual(new geom.Rectangle(1, 2, 6, 4).index({x: 4, y: 5}), 21); - assert.strictEqual(new geom.Rectangle(1, 2, 6, 4).index({x: 6, y: 3}), 11); - assert.strictEqual(new geom.Rectangle(1, 2, 6, 4).index({x: 1, y: 4}), 12); - }); - }); -}); diff --git a/test/geom/test-size.ts b/test/geom/test-size.ts deleted file mode 100644 index 60595cb..0000000 --- a/test/geom/test-size.ts +++ /dev/null @@ -1,105 +0,0 @@ -import * as assert from 'assert'; - -import * as geom from '../../src/geom'; - -describe('geom/size', () => { - it('starts at 0x0', () => { - const o = new geom.Size(); - assert.strictEqual(o.width, 0); - assert.strictEqual(o.height, 0); - }); - it('is mutable', () => { - const o = new geom.Size(); - o.width = 1; - assert.strictEqual(o.width, 1); - }); - describe('#constructor()', () => { - it('works', () => { - const o = new geom.Size(1, 2); - assert.strictEqual(o.width, 1); - assert.strictEqual(o.height, 2); - }); - }); - describe('#set()', () => { - it('works', () => { - const o = new geom.Size().set(1, 2); - assert.strictEqual(o.width, 1); - assert.strictEqual(o.height, 2); - }); - }); - describe('#toString()', () => { - it('works', () => { - assert.strictEqual(new geom.Size(1, 2).toString(), '(1x2)'); - }); - }); - describe('#equals()', () => { - it('works', () => { - assert.strictEqual(new geom.Size(1, 2).equals({width: 1, height: 2}), true); - assert.strictEqual(new geom.Size(1, 2).equals({width: 2, height: 2}), false); - assert.strictEqual(new geom.Size(1, 2).equals({width: 1, height: 1}), false); - }); - }); - describe('#empty', () => { - it('works', () => { - assert.strictEqual(new geom.Size(0, 0).empty, true); - assert.strictEqual(new geom.Size(1, 0).empty, true); - assert.strictEqual(new geom.Size(0, 1).empty, true); - assert.strictEqual(new geom.Size(1, 1).empty, false); - }); - }); - describe('#area', () => { - it('works', () => { - assert.strictEqual(new geom.Size(0, 0).area, 0); - assert.strictEqual(new geom.Size(1, 0).area, 0); - assert.strictEqual(new geom.Size(0, 1).area, 0); - assert.strictEqual(new geom.Size(1, 1).area, 1); - assert.strictEqual(new geom.Size(3, 4).area, 12); - assert.strictEqual(new geom.Size(4, 3).area, 12); - }); - }); - describe('#copyFrom()', () => { - it('works', () => { - assert.strictEqual(new geom.Size().copyFrom(new geom.Size(1, 2)).toString(), '(1x2)'); - assert.strictEqual(new geom.Size().copyFrom({height: 2, width: 1}).toString(), '(1x2)'); - }); - }); - describe('#add()', () => { - it('works', () => { - assert.strictEqual(new geom.Size().add(1, 2).toString(), '(1x2)'); - assert.strictEqual(new geom.Size(3, 5).add(1, 2).toString(), '(4x7)'); - }); - }); - describe('#addOffset()', () => { - it('works', () => { - assert.strictEqual(new geom.Size().addOffset({x: 1, y: 2}).toString(), '(1x2)'); - assert.strictEqual(new geom.Size(3, 5).addOffset({x: 1, y: 2}).toString(), '(4x7)'); - }); - }); - describe('#multiply()', () => { - it('works', () => { - assert.strictEqual(new geom.Size(1, 2).multiply(3).toString(), '(3x6)'); - }); - }); - describe('#containsOffset()', () => { - it('works', () => { - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 3, y: 6}), true); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: -3, y: 6}), false); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 3, y: -6}), false); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 6, y: 3}), false); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 3, y: 11}), false); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 0, y: 0}), true); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 4, y: 9}), true); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 5, y: 9}), false); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 4, y: 10}), false); - assert.strictEqual(new geom.Size(5, 10).containsOffset({x: 5, y: 10}), false); - }); - }); - describe('#index()', () => { - it('works', () => { - assert.strictEqual(new geom.Size(5, 10).index(new geom.Offset()), 0); - assert.strictEqual(new geom.Size(5, 10).index({x: 4, y: 2}), 14); - assert.strictEqual(new geom.Size(5, 10).index({x: 0, y: 3}), 15); - assert.strictEqual(new geom.Size(5, 10).index({x: 3, y: 6}), 33); - }); - }); -}); diff --git a/tsconfig.json b/tsconfig.json index 1bdc7b9..696b1bf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,15 @@ { - "compilerOptions": { - "sourceMap": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "strictNullChecks": false, - "noUnusedLocals": true, - "declaration": true, - "module": "commonjs", - "target": "es5", - "lib": ["es6"], - "outDir": "build" - }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "downlevelIteration": true, + "rootDir": "src", + "outDir": "lib", + "declaration": true + }, + "include": [ "src/**/*" ] +} diff --git a/webpack.config.js b/webpack.config.js index 36601ce..73646e3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/no-var-requires */ -var path = require('path'); -var config = require('./package.json'); +const path = require('path'); +const config = require('./package.json'); module.exports = (env, argv) => { - var filename = 'block-fractal-' + config.version; + let filename = config.name + '-' + config.version; if (argv.mode === 'production') { filename += '.min.js'; } else { @@ -13,22 +13,22 @@ module.exports = (env, argv) => { entry: './src/index.ts', devtool: 'source-map', output: { - path: path.resolve(__dirname, 'bin'), - publicPath: '/bin/', + path: path.resolve(__dirname, 'dist'), + publicPath: '/dist/', filename: filename, libraryTarget: 'var', - library: 'BlockFractal' + library: 'BlockFractal', }, resolve: { - extensions: ['.ts'] + extensions: ['.ts', '.js'], }, module: { rules: [ { test: /\.ts$/, - use: [ 'ts-loader' ] - } - ] - } + use: [ 'ts-loader' ], + }, + ], + }, }; };