From c03259cbc2b3a8b2f556744c96cb9bf6f674ce66 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 14 Sep 2018 20:33:17 +0100 Subject: [PATCH 01/77] feat(geom): import (updated) old thi.ng/geom package (minus vectors) --- packages/geom/.npmignore | 10 ++ packages/geom/LICENSE | 201 +++++++++++++++++++++++++++++++ packages/geom/README.md | 38 ++++++ packages/geom/package.json | 47 ++++++++ packages/geom/src/circle2.ts | 96 +++++++++++++++ packages/geom/src/common.ts | 21 ++++ packages/geom/src/container2.ts | 133 ++++++++++++++++++++ packages/geom/src/container3.ts | 125 +++++++++++++++++++ packages/geom/src/index.ts | 6 + packages/geom/src/line2.ts | 32 +++++ packages/geom/src/poly2.ts | 59 +++++++++ packages/geom/test/index.ts | 30 +++++ packages/geom/test/tsconfig.json | 10 ++ packages/geom/tsconfig.json | 9 ++ 14 files changed, 817 insertions(+) create mode 100644 packages/geom/.npmignore create mode 100644 packages/geom/LICENSE create mode 100644 packages/geom/README.md create mode 100644 packages/geom/package.json create mode 100644 packages/geom/src/circle2.ts create mode 100644 packages/geom/src/common.ts create mode 100644 packages/geom/src/container2.ts create mode 100644 packages/geom/src/container3.ts create mode 100644 packages/geom/src/index.ts create mode 100644 packages/geom/src/line2.ts create mode 100644 packages/geom/src/poly2.ts create mode 100644 packages/geom/test/index.ts create mode 100644 packages/geom/test/tsconfig.json create mode 100644 packages/geom/tsconfig.json diff --git a/packages/geom/.npmignore b/packages/geom/.npmignore new file mode 100644 index 0000000000..d703bda97a --- /dev/null +++ b/packages/geom/.npmignore @@ -0,0 +1,10 @@ +build +coverage +dev +doc +src* +test +.nyc_output +tsconfig.json +*.tgz +*.html diff --git a/packages/geom/LICENSE b/packages/geom/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/geom/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/geom/README.md b/packages/geom/README.md new file mode 100644 index 0000000000..385773331b --- /dev/null +++ b/packages/geom/README.md @@ -0,0 +1,38 @@ +# @thi.ng/geom + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/geom.svg)](https://www.npmjs.com/package/@thi.ng/geom) + +This project is part of the +[@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo. + + + +- [About](#about) +- [Installation](#installation) +- [Usage examples](#usage-examples) +- [Authors](#authors) +- [License](#license) + + + +## About + +## Installation + +```bash +yarn add @thi.ng/geom +``` + +## Usage examples + +```ts +import * as geom from "@thi.ng/geom"; +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2016 - 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/geom/package.json b/packages/geom/package.json new file mode 100644 index 0000000000..d3c42a63da --- /dev/null +++ b/packages/geom/package.json @@ -0,0 +1,47 @@ +{ + "name": "@thi.ng/geom", + "version": "0.0.1", + "description": "2D/3D geometry primitives", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thi-ng/umbrella.git" + }, + "homepage": "https://github.com/thi-ng/umbrella/tree/master/packages/geom", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc", + "cover": "yarn test && nyc report --reporter=lcov", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^5.2.5", + "@types/node": "^10.5.5", + "mocha": "^5.2.0", + "nyc": "^12.0.2", + "typedoc": "^0.11.1", + "typescript": "^3.0.1" + }, + "dependencies": { + "@thi.ng/api": "^4.1.1", + "@thi.ng/transducers": "^2.1.1", + "@thi.ng/vectors": "^1.1.0" + }, + "keywords": [ + "ES6", + "geometry", + "2d", + "3d", + "shapes", + "intersection", + "typescript" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts new file mode 100644 index 0000000000..80341d9a60 --- /dev/null +++ b/packages/geom/src/circle2.ts @@ -0,0 +1,96 @@ +import { IObjectOf } from "@thi.ng/api/api"; +import { normRange } from "@thi.ng/transducers/iter/norm-range"; +import { Vec } from "@thi.ng/vectors/api"; +import { mix1, PI, TAU } from "@thi.ng/vectors/math"; +import { + addN2o, + set2, + setS2, + subN2o, + toCartesian2, + Vec2 +} from "@thi.ng/vectors/vec2"; + +import { Polygon2 } from "./poly2"; + +export class Circle2 { + + buf: Vec; + offset: number; + attribs: any; + + constructor(buf: Vec, attribs?: IObjectOf, offset = 0) { + this.buf = buf; + this.attribs = attribs; + this.offset = offset; + } + + get pos() { + return new Vec2(this.buf, this.offset); + } + + set pos(v: Readonly) { + set2(this.buf, v.buf, this.offset, v.i, 1, v.s); + } + + get r() { + return this.buf[this.offset + 2]; + } + + set r(r: number) { + this.buf[this.offset + 2] = r; + } + + verticesRaw(from: number, + to: number, + res: number, + inclLast: boolean, + dest: Vec = [], + destOffset = 0, + cstride = 1, + estride = 2) { + + const buf = this.buf; + const o = this.offset; + const r = buf[o + 2]; + for (let t of normRange(inclLast ? res - 1 : res, inclLast)) { + toCartesian2(setS2(dest, r, mix1(from, to, t), destOffset, cstride), buf, destOffset, o, cstride, 1); + destOffset += estride; + } + return dest; + } + + vertices(res = 20) { + return Vec2.mapBuffer(this.verticesRaw(0, TAU, res, false), res); + } + + area() { + return PI * Math.pow(this.r, 2); + } + + circumference() { + return TAU * this.r; + } + + bounds() { + const buf = this.buf; + return [ + new Vec2(subN2o([], buf, buf[2], 0, this.offset)), + new Vec2(addN2o([], buf, buf[2], 0, this.offset)) + ]; + } + + toPolygon(res = 20) { + return new Polygon2(this.verticesRaw(0, TAU, res, false), res); + } + + toHiccup() { + return ["circle", this.attribs, this.pos, this.r]; + } +} + +export const circle2m = (buf: Vec, attribs?: IObjectOf, offset?: number) => + new Circle2(buf, attribs, offset); + +export const circle2 = (pos: Readonly, r = 1, attribs?: IObjectOf) => + new Circle2([pos.x, pos.y, r], attribs, 0); diff --git a/packages/geom/src/common.ts b/packages/geom/src/common.ts new file mode 100644 index 0000000000..b390cb0353 --- /dev/null +++ b/packages/geom/src/common.ts @@ -0,0 +1,21 @@ +import { wrap } from "@thi.ng/transducers/iter/wrap"; +import { partition } from "@thi.ng/transducers/xform/partition"; +import { ReadonlyVec, ReadonlyVecOp2 } from "@thi.ng/vectors/api"; + +export const arcLength = (dist: ReadonlyVecOp2, buf: ReadonlyVec, num: number, offset: number, stride: number, closed = false) => { + num--; + let res = 0; + for (let n = num, i = offset, j = i + stride; n > 0; n-- , i = j, j += stride) { + res += dist(buf, buf, i, j); + } + if (closed) { + res += dist(buf, buf, offset + num * stride, offset); + } + return res; +} + +export const resample = () => { }; + +export function edges(vertices: T[], closed = false) { + return partition(2, 1, closed ? wrap(vertices, 1, false, true) : vertices); +} diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts new file mode 100644 index 0000000000..fe4c179299 --- /dev/null +++ b/packages/geom/src/container2.ts @@ -0,0 +1,133 @@ +import { IObjectOf } from "@thi.ng/api/api"; +import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; +import { Vec } from "@thi.ng/vectors/api"; +import { transformVectors1 } from "@thi.ng/vectors/common"; +import { Mat23, mulV23 } from "@thi.ng/vectors/mat23"; +import { + add2, + max2, + min2, + mul2, + set2, + swap2, + Vec2 +} from "@thi.ng/vectors/vec2"; + +export class PointContainer2 { + + buf: Vec; + length: number; + offset: number; + stride: number; + attribs: IObjectOf; + + constructor(buf: Vec, num?: number, attribs?: IObjectOf, offset = 0, stride = 2) { + this.buf = buf; + this.length = num != null ? num : buf.length / 2; + this.attribs = attribs; + this.offset = offset; + this.stride = stride; + } + + *[Symbol.iterator]() { + yield* this.vertices(); + } + + vertices() { + return Vec2.mapBuffer(this.buf, this.length, this.offset, 1, this.stride); + } + + get(i: number, safe = true) { + safe && this.ensureIndex(i); + return new Vec2(this.buf, this.offset + i * this.stride); + } + + set(i: number, v: Readonly, safe = true) { + safe && this.ensureIndex(i); + set2(this.buf, v.buf, this.offset + i * this.stride, v.i, 1, v.s); + } + + bounds() { + const s = this.stride; + const pts = this.buf; + const min = Vec2.MAX.copy(); + const max = Vec2.MIN.copy(); + for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { + min2(min.buf, pts, 0, i, 1, 1); + max2(max.buf, pts, 0, i, 1, 1); + } + return [min, max]; + } + + centroid(c?: Vec2): Vec2 { + !this.length && illegalArgs("no points available"); + !c && (c = Vec2.ZERO.copy()); + const s = this.stride; + const pts = this.buf; + for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { + add2(c.buf, pts, c.i, i, c.s, 1); + } + return c.divN(this.length); + } + + center(origin?: Readonly) { + const d = this.centroid().neg(); + return this.translate(origin ? d.add(origin) : d); + } + + flip() { + const s = this.stride; + for (let i = 0, j = (this.length - 1) * s; i < j; i += s, j -= s) { + swap2(this.buf, this.buf, i, j); + } + } + + scale(v: Readonly) { + transformVectors1( + mul2, + this.buf, + v.buf, + this.length, + this.offset, + v.i, + 1, + v.s, + this.stride + ); + return this; + } + + translate(v: Readonly) { + transformVectors1( + add2, + this.buf, + v.buf, + this.length, + this.offset, + v.i, + 1, + v.s, + this.stride + ); + return this; + } + + transform(mat: Readonly) { + transformVectors1( + mulV23, + this.buf, + mat.buf, + this.length, + this.offset, + mat.i, + 1, + 1, + this.stride + ); + return this; + } + + protected ensureIndex(i: number) { + (i < 0 && i >= this.length) && illegalArgs(`index out of bounds: ${i}`); + } +} diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts new file mode 100644 index 0000000000..11689c770c --- /dev/null +++ b/packages/geom/src/container3.ts @@ -0,0 +1,125 @@ +import { IObjectOf } from "@thi.ng/api/api"; +import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; +import { Vec } from "@thi.ng/vectors/api"; +import { transformVectors1 } from "@thi.ng/vectors/common"; +import { Mat44, mulV344 } from "@thi.ng/vectors/mat44"; +import { + add3, + max3, + min3, + mul3, + set3, + swap3, + Vec3 +} from "@thi.ng/vectors/vec3"; + +export class PointContainer3 { + + buf: Vec; + length: number; + offset: number; + stride: number; + attribs: IObjectOf; + + constructor(buf: Vec, num: number, offset = 0, stride = 2) { + this.buf = buf; + this.length = num; + this.offset = offset; + this.stride = stride; + } + + *[Symbol.iterator]() { + yield* this.vertices(); + } + + vertices() { + return Vec3.mapBuffer(this.buf, this.length, this.offset, 1, this.stride); + } + + get(i: number, safe = true) { + safe && this.ensureIndex(i); + return new Vec3(this.buf, this.offset + i * this.stride); + } + + set(i: number, v: Readonly, safe = false) { + safe && this.ensureIndex(i); + set3(this.buf, v.buf, this.offset + i * this.stride, v.i, 1, v.s); + } + + bounds() { + const s = this.stride; + const pts = this.buf; + const min = Vec3.MAX.copy(); + const max = Vec3.MIN.copy(); + for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { + min3(min.buf, pts, 0, i, 1, 1); + max3(max.buf, pts, 0, i, 1, 1); + } + return [min, max]; + } + + centroid(c?: Vec3): Vec3 { + !this.length && illegalArgs("no points available"); + !c && (c = Vec3.ZERO.copy()); + const s = this.stride; + const pts = this.buf; + for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { + add3(c.buf, pts, c.i, i, c.s, 1); + } + return c.divN(this.length); + } + + center(p?: Readonly) { + const d = this.centroid().neg(); + return this.translate(p ? d.add(p) : d); + } + + flip() { + const s = this.stride; + for (let i = 0, j = (this.length - 1) * s; i < j; i += s, j -= s) { + swap3(this.buf, this.buf, i, j); + } + } + + scale(v: Readonly) { + transformVectors1( + mul3, + this.buf, + v.buf, + this.length, + this.offset, + v.i, + 1, + v.s, + this.stride + ); + return this; + } + + translate(t: Readonly) { + transformVectors1( + add3, + this.buf, + t.buf, + this.length, + this.offset, + t.i, + 1, + t.s, + this.stride + ); + return this; + } + + transform(mat: Readonly) { + const s = this.stride; + for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { + mulV344(mat.buf, this.buf, mat.i, i, 1); + } + return this; + } + + protected ensureIndex(i: number) { + (i < 0 && i >= this.length) && illegalArgs(`index out of bounds: ${i}`); + } +} diff --git a/packages/geom/src/index.ts b/packages/geom/src/index.ts new file mode 100644 index 0000000000..94b2161164 --- /dev/null +++ b/packages/geom/src/index.ts @@ -0,0 +1,6 @@ +export * from "./container2"; +export * from "./container3"; + +export * from "./circle2"; +export * from "./line2"; +export * from "./poly2"; diff --git a/packages/geom/src/line2.ts b/packages/geom/src/line2.ts new file mode 100644 index 0000000000..468ec1e9ce --- /dev/null +++ b/packages/geom/src/line2.ts @@ -0,0 +1,32 @@ +import { IObjectOf } from "@thi.ng/api/api"; +import { Vec } from "@thi.ng/vectors/api"; +import { dist2 } from "@thi.ng/vectors/vec2"; + +import { arcLength, edges } from "./common"; +import { PointContainer2 } from "./container2"; + +export class Polyline2 extends PointContainer2 { + + constructor(points: Vec, num?: number, attribs?: IObjectOf, offset = 0, stride = 2) { + super(points, num, attribs, offset, stride); + } + + edges() { + return edges(this.vertices()); + } + + area() { + return 0; + } + + arcLength() { + return arcLength(dist2, this.buf, this.length, this.offset, this.stride); + } + + toHiccup() { + return ["polyline", this.attribs, this.vertices()]; + } +} + +export const polyline2 = (points: Vec, num?: number, attribs?: IObjectOf, offset?: number, stride?: number) => + new Polyline2(points, num, attribs, offset, stride); diff --git a/packages/geom/src/poly2.ts b/packages/geom/src/poly2.ts new file mode 100644 index 0000000000..1b0ea6d98f --- /dev/null +++ b/packages/geom/src/poly2.ts @@ -0,0 +1,59 @@ +import { IObjectOf } from "@thi.ng/api/api"; +import { Vec } from "@thi.ng/vectors/api"; +import { cross2, dist2, Vec2 } from "@thi.ng/vectors/vec2"; + +import { arcLength, edges } from "./common"; +import { PointContainer2 } from "./container2"; + +export class Polygon2 extends PointContainer2 { + + constructor(points: Vec, num?: number, attribs?: IObjectOf, offset = 0, stride = 2) { + super(points, num, attribs, offset, stride); + } + + edges() { + return edges(this.vertices(), true); + } + + area() { + const s = this.stride; + const pts = this.buf; + let res = 0; + for (let n = (this.length - 1) * s, i = this.offset + n, j = this.offset; n >= 0; i = j, j += s, n -= s) { + res += cross2(pts, pts, i, j); + } + return res / 2; + } + + circumference() { + return arcLength(dist2, this.buf, this.length, this.offset, this.stride, true); + } + + centroid(c?: Vec2): Vec2 { + const s = this.stride; + const pts = this.buf; + let area = 0; + let x = 0; + let y = 0; + for (let n = (this.length - 1) * s, i = this.offset + n, j = this.offset; n >= 0; i = j, j += s, n -= s) { + const z = cross2(pts, pts, i, j); + area += z; + x += (pts[i] + pts[j]) * z; + y += (pts[i + 1] + pts[j + 1]) * z; + } + area = 1 / (area * 3); + x *= area; + y *= area; + return c ? c.setS(x, y) : new Vec2([x, y]); + } + + toHiccup() { + return ["polygon", this.attribs, this.vertices()]; + } +} + +export const polygon2m = (points: Vec, num?: number, attribs?: IObjectOf, offset?: number, stride?: number) => + new Polygon2(points, num, attribs, offset, stride); + +export const polygon2 = (points: Iterable>, attribs?: IObjectOf) => + new Polygon2(Vec2.intoBuffer([], points), null, attribs); diff --git a/packages/geom/test/index.ts b/packages/geom/test/index.ts new file mode 100644 index 0000000000..6405093df4 --- /dev/null +++ b/packages/geom/test/index.ts @@ -0,0 +1,30 @@ +import * as assert from "assert"; +import { equiv } from "@thi.ng/equiv"; +import { polygon2m } from "../src/index"; + +describe("polygon2", () => { + + it("area", () => { + const a = polygon2m([0, 0, 100, 0, 100, 100, 0, 100], 4); + assert.equal(a.area(), 100 * 100); + a.length = 3; + assert.equal(a.area(), 100 * 100 / 2); + }); + + it("circumference", () => { + const a = polygon2m([0, 0, 100, 0, 100, 100, 0, 100], 4); + assert.equal(a.circumference(), 400); + a.length = 3; + assert.equal(a.circumference(), 200 + Math.sqrt(2) * 100); + }); + + it("hiccup", () => { + const a = polygon2m([0, 0, 100, 0, 100, 100, 0, 100], 4, { fill: "red" }); + assert( + equiv( + a.toHiccup(), + ["polygon", { fill: "red" }, [[0, 0], [100, 0], [100, 100], [0, 100]]] + ) + ); + }); +}); diff --git a/packages/geom/test/tsconfig.json b/packages/geom/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/geom/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/geom/tsconfig.json b/packages/geom/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/geom/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 177855c3a5ad7fab5f9d35441cca87b22f8355fc Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 14 Sep 2018 20:34:11 +0100 Subject: [PATCH 02/77] feat(examples): add geom circle test --- examples/hdom-canvas-shapes/src/index.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/examples/hdom-canvas-shapes/src/index.ts b/examples/hdom-canvas-shapes/src/index.ts index f542afc3a4..d1c35ad1e8 100644 --- a/examples/hdom-canvas-shapes/src/index.ts +++ b/examples/hdom-canvas-shapes/src/index.ts @@ -12,6 +12,7 @@ import { map } from "@thi.ng/transducers/xform/map"; import { serialize } from "@thi.ng/hiccup"; import { convertTree } from "@thi.ng/hiccup-svg/convert"; import { svg } from "@thi.ng/hiccup-svg/svg"; +import { circle2 } from "@thi.ng/geom/circle2"; import logo from "../assets/logo-64.png"; // ignore error, resolved by parcel import { download } from "./download"; @@ -180,6 +181,22 @@ const TESTS = { const body = ["g", {}, ...repeatedly(ball, 10)]; return () => body; })() + }, + + "geom circles": { + attribs: {}, + body: () => + ["g", + { + translate: [150, 150], + stroke: "#f07", + weight: 1, + }, + ...repeatedly( + () => circle2([...randpos(), Math.random() * 50]).toPolygon(6), + 100 + ) + ] } }; From be25c48ec79d9e3969af8a1ac1f57df652670737 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 15 Sep 2018 14:02:06 +0100 Subject: [PATCH 03/77] feat(examples): add circles test --- examples/hdom-canvas-shapes/src/index.ts | 52 +++++++++++++++++------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/examples/hdom-canvas-shapes/src/index.ts b/examples/hdom-canvas-shapes/src/index.ts index d1c35ad1e8..1c64fe9707 100644 --- a/examples/hdom-canvas-shapes/src/index.ts +++ b/examples/hdom-canvas-shapes/src/index.ts @@ -7,6 +7,7 @@ import { updateDOM } from "@thi.ng/transducers-hdom"; import { range } from "@thi.ng/transducers/iter/range"; import { repeatedly } from "@thi.ng/transducers/iter/repeatedly"; import { map } from "@thi.ng/transducers/xform/map"; +import { U8 } from "@thi.ng/strings/radix"; // for testing SVG conversion import { serialize } from "@thi.ng/hiccup"; @@ -23,6 +24,16 @@ const randpos = () => const randdir = (n = 1) => [Math.random() * n * 2 - n, Math.random() * n * 2 - n]; +const randcol = (r1, r2, g1, g2, b1, b2, a1 = 1, a2 = 1) => { + const r = (Math.random() * (r2 - r1) + r1) | 0; + const g = (Math.random() * (g2 - g1) + g1) | 0; + const b = (Math.random() * (b2 - b1) + b1) | 0; + const a = Math.random() * (a2 - a1) + a1; + return a < 1 ? + `rgba(${r},${g},${b},${a.toFixed(2)})` : + `#${U8(r)}${U8(g)}${U8(b)}`; +} + // various tests for different shapes & canvas drawing options // each test is a standalone component (only one used at a time) const TESTS = { @@ -157,7 +168,7 @@ const TESTS = { } }, - "image": { + "image 1k": { attribs: {}, body: (() => { const img = new Image(); @@ -178,25 +189,36 @@ const TESTS = { return ["img", {}, [...p], img]; }; }; - const body = ["g", {}, ...repeatedly(ball, 10)]; + const body = ["g", {}, ...repeatedly(ball, 1000)]; return () => body; })() }, - "geom circles": { + "geom circles 1k": { attribs: {}, - body: () => - ["g", - { - translate: [150, 150], - stroke: "#f07", - weight: 1, - }, + body: (() => { + const circles = [ ...repeatedly( - () => circle2([...randpos(), Math.random() * 50]).toPolygon(6), - 100 + () => + circle2( + [...randpos(), Math.random() * 25], + { stroke: randcol(0, 64, 64, 224, 192, 256) } + ), + 1000 ) - ] + ]; + return () => { + const t = Date.now() * 0.002; + circles.forEach((c, i) => (c.r = Math.sin(t + i * 0.01) * 10 + 12)); + return ["g", + { + translate: [150, 150], + weight: 1, + }, + ...circles + ] + }; + })() } }; @@ -206,7 +228,7 @@ const choices = (_, target, id) => { class: "w4 ma2", onchange: (e) => { - window.location.hash = e.target.value.replace(" ", "-"); + window.location.hash = e.target.value.replace(/\s/g, "-"); target.next(e.target.value); } }, @@ -260,7 +282,7 @@ sync({ // initial selection selection.next( window.location.hash.length > 1 ? - window.location.hash.substr(1).replace("-", " ") : + window.location.hash.substr(1).replace(/-/g, " ") : "shape morph" ); From c0a8926b535abc83f51e2d50daa9e56a414ce470 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Mon, 24 Sep 2018 23:51:12 +0100 Subject: [PATCH 04/77] fix(examples): rename `prepare` script alias, add commits.json (#46) - rename `prepare` => `prep` to avoid autoexec during `yarn install` - add getCommits() to retrieve commits for caching and write to `commits.json` - commits.json stub file --- examples/commit-table-ssr/commits.json | 1 + examples/commit-table-ssr/package.json | 4 ++-- examples/commit-table-ssr/src/server/index.ts | 12 +++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 examples/commit-table-ssr/commits.json diff --git a/examples/commit-table-ssr/commits.json b/examples/commit-table-ssr/commits.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/examples/commit-table-ssr/commits.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/examples/commit-table-ssr/package.json b/examples/commit-table-ssr/package.json index eb6e093ae1..7de550e95a 100644 --- a/examples/commit-table-ssr/package.json +++ b/examples/commit-table-ssr/package.json @@ -6,9 +6,9 @@ "license": "Apache-2.0", "scripts": { "clean": "rm -rf .cache build out", - "prepare": "yarn clean && mkdir -p out && cp commits.json out", + "prep": "yarn clean && mkdir -p out && cp commits.json out", "build-static": "tsc && node build/server/static.js", - "build": "yarn prepare && parcel build index.html -d out --no-source-maps --no-cache --detailed-report --public-url ./", + "build": "yarn prep && parcel build index.html -d out --no-source-maps --no-cache --detailed-report --public-url ./", "start": "tsc && node build/server/index.js" }, "devDependencies": { diff --git a/examples/commit-table-ssr/src/server/index.ts b/examples/commit-table-ssr/src/server/index.ts index 5ac57b254e..0292329c79 100644 --- a/examples/commit-table-ssr/src/server/index.ts +++ b/examples/commit-table-ssr/src/server/index.ts @@ -1,6 +1,7 @@ import { TLRUCache } from "@thi.ng/cache"; import * as express from "express"; import * as Bundler from "parcel-bundler"; +import * as fs from "fs"; import { Commit } from "../common/api"; import { ctx } from "../common/config"; @@ -13,13 +14,18 @@ import { repoCommits } from "./git"; const rawCache = new TLRUCache(null, { ttl: 60 * 60 * 1000 }); const htmlCache = new TLRUCache(null, { ttl: 60 * 60 * 1000 }); -// console.log("parcel:", Object.keys(parcel)); const bundler = new Bundler("index.html", { outDir: "./out", outFile: "index.html", publicUrl: "/out", }); +const getCommits = async () => { + const commits = [...repoCommits(ctx.repo.path)]; + fs.writeFileSync("commits.json", JSON.stringify(commits)); + return commits; +}; + const app = express(); // route for browser version @@ -34,7 +40,7 @@ app.get("/commits", (_, res) => { // (re)create if missing... rawCache.getSet( ctx.repo.path, - async () => [...repoCommits(ctx.repo.path)] + getCommits ).then( (commits) => res.type("json").send(commits) ) @@ -50,7 +56,7 @@ app.get("/ssr", (_, res) => { async () => buildRepoTableHTML( await rawCache.getSet( ctx.repo.path, - async () => [...repoCommits(ctx.repo.path)] + getCommits ) ) ).then((doc) => res.send(doc)) From 888ea747c3c4a8f5d0f75a631cb4595482eb5d2a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Mon, 24 Sep 2018 23:52:16 +0100 Subject: [PATCH 05/77] fix(examples): rename `prepare` script aliases - avoid autoexec during `yarn install` --- examples/async-effect/package.json | 6 +++--- examples/router-basics/package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/async-effect/package.json b/examples/async-effect/package.json index 0098aeece5..31052e68e8 100644 --- a/examples/async-effect/package.json +++ b/examples/async-effect/package.json @@ -6,9 +6,9 @@ "license": "Apache-2.0", "scripts": { "clean": "rm -rf .cache build out", - "prepare": "yarn clean && mkdir -p out && cp foo.json out", - "build": "yarn prepare && parcel build index.html -d out --no-source-maps --no-cache --detailed-report --public-url ./", - "start": "yarn prepare && parcel index.html -p 8080 --open -d out" + "prep": "yarn clean && mkdir -p out && cp foo.json out", + "build": "yarn prep && parcel build index.html -d out --no-source-maps --no-cache --detailed-report --public-url ./", + "start": "yarn prep && parcel index.html -p 8080 --open -d out" }, "devDependencies": { "parcel-bundler": "^1.9.7", diff --git a/examples/router-basics/package.json b/examples/router-basics/package.json index 3b799bd14e..c54772b5c2 100644 --- a/examples/router-basics/package.json +++ b/examples/router-basics/package.json @@ -7,9 +7,9 @@ "license": "Apache-2.0", "scripts": { "clean": "rm -rf .cache build out", - "prepare": "yarn clean && mkdir -p out && cp -R assets out", - "build": "yarn prepare && parcel build index.html -d out --no-source-maps --no-cache --detailed-report --public-url ./", - "start": "yarn prepare && parcel index.html -p 8080 --open -d out" + "prep": "yarn clean && mkdir -p out && cp -R assets out", + "build": "yarn prep && parcel build index.html -d out --no-source-maps --no-cache --detailed-report --public-url ./", + "start": "yarn prep && parcel index.html -p 8080 --open -d out" }, "dependencies": { "@thi.ng/atom": "latest", From 8cbfb97e586595a308654907c7344914318adcc0 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Mon, 24 Sep 2018 23:53:10 +0100 Subject: [PATCH 06/77] fix(strings): rename number parsers - rename to `maybeParseInt` / `maybeParseFloat` --- packages/strings/src/parse.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/strings/src/parse.ts b/packages/strings/src/parse.ts index efaef03f42..ada5e7bae6 100644 --- a/packages/strings/src/parse.ts +++ b/packages/strings/src/parse.ts @@ -1,9 +1,9 @@ -export const parseInt = (x: string, defaultVal = 0, radix = 10) => { +export const maybeParseInt = (x: string, defaultVal: any = 0, radix = 10) => { const n = parseInt(x, radix); return isNaN(n) ? defaultVal : n; }; -export const parseFloat = (x: string, defaultVal = 0) => { +export const maybeParseFloat = (x: string, defaultVal: any = 0) => { const n = parseFloat(x); return isNaN(n) ? defaultVal : n; }; From cb263002a3438da99efcea81cf6df989a4687f95 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 00:03:33 +0100 Subject: [PATCH 07/77] feat(examples): add xml-converter example --- examples/xml-converter/.gitignore | 5 + examples/xml-converter/README.md | 26 ++++++ examples/xml-converter/index.html | 28 ++++++ examples/xml-converter/package.json | 29 ++++++ examples/xml-converter/src/index.ts | 135 +++++++++++++++++++++++++++ examples/xml-converter/tsconfig.json | 11 +++ 6 files changed, 234 insertions(+) create mode 100644 examples/xml-converter/.gitignore create mode 100644 examples/xml-converter/README.md create mode 100644 examples/xml-converter/index.html create mode 100644 examples/xml-converter/package.json create mode 100644 examples/xml-converter/src/index.ts create mode 100644 examples/xml-converter/tsconfig.json diff --git a/examples/xml-converter/.gitignore b/examples/xml-converter/.gitignore new file mode 100644 index 0000000000..0c5abcab62 --- /dev/null +++ b/examples/xml-converter/.gitignore @@ -0,0 +1,5 @@ +.cache +out +node_modules +yarn.lock +*.js diff --git a/examples/xml-converter/README.md b/examples/xml-converter/README.md new file mode 100644 index 0000000000..c91a088a34 --- /dev/null +++ b/examples/xml-converter/README.md @@ -0,0 +1,26 @@ +# xml-converter + +[Live demo](http://demo.thi.ng/umbrella/xml-converter/) + +This example uses +[@thi.ng/sax](https://github.com/thi-ng/umbrella/tree/master/packages/sax) +to convert XML/HTML syntax into +[@thi.ng/hiccup](https://github.com/thi-ng/umbrella/tree/master/packages/hiccup) +syntax. + +TODO better output formatting, html boolean attribs + +```bash +git clone https://github.com/thi-ng/umbrella.git +cd umbrella/examples/xml-converter +yarn install +yarn start +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/examples/xml-converter/index.html b/examples/xml-converter/index.html new file mode 100644 index 0000000000..cfc00c1ff9 --- /dev/null +++ b/examples/xml-converter/index.html @@ -0,0 +1,28 @@ + + + + + + + + xml-converter + + + + + +
+
+

Current limitations

+
    +
  • No HTML quirks allowed (well formed XML only)
  • +
  • No HTML boolean attribs
  • +
  • Probably many more... :)
  • +
+ Source code +
+ + + + \ No newline at end of file diff --git a/examples/xml-converter/package.json b/examples/xml-converter/package.json new file mode 100644 index 0000000000..4e5b480a57 --- /dev/null +++ b/examples/xml-converter/package.json @@ -0,0 +1,29 @@ +{ + "name": "xml-converter", + "version": "0.0.1", + "repository": "https://github.com/thi-ng/umbrella", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "clean": "rm -rf .cache build out", + "build": "yarn clean && parcel build index.html -d out --public-url ./ --no-source-maps --no-cache --detailed-report", + "start": "parcel index.html -p 8080 --open" + }, + "devDependencies": { + "parcel-bundler": "^1.9.7", + "terser": "^3.8.2", + "typescript": "^3.0.1" + }, + "dependencies": { + "@thi.ng/rstream": "latest", + "@thi.ng/sax": "latest", + "@thi.ng/strings": "latest", + "@thi.ng/transducers-hdom": "latest" + }, + "browserslist": [ + "last 3 Chrome versions" + ], + "browser": { + "process": false + } +} \ No newline at end of file diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts new file mode 100644 index 0000000000..2cb5f8b1f8 --- /dev/null +++ b/examples/xml-converter/src/index.ts @@ -0,0 +1,135 @@ +import { stream } from "@thi.ng/rstream/stream"; +import { parse, Type } from "@thi.ng/sax"; +import { maybeParseFloat } from "@thi.ng/strings/parse"; +import { updateDOM } from "@thi.ng/transducers-hdom"; +import { comp } from "@thi.ng/transducers/func/comp"; +import { identity } from "@thi.ng/transducers/func/identity"; +import { pairs } from "@thi.ng/transducers/iter/pairs"; +import { assocObj } from "@thi.ng/transducers/rfn/assoc-obj"; +import { last } from "@thi.ng/transducers/rfn/last"; +import { push } from "@thi.ng/transducers/rfn/push"; +import { transduce } from "@thi.ng/transducers/transduce"; +import { filter } from "@thi.ng/transducers/xform/filter"; +import { map } from "@thi.ng/transducers/xform/map"; +import { multiplex } from "@thi.ng/transducers/xform/multiplex"; + +const parseXML = (src: string) => + transduce( + comp( + parse({ trim: true }), + filter((e) => e.type === Type.ELEM_END || e.type === Type.ERROR) + ), + last(), + src + ); + +const transformAttribs = (attribs: any) => + transduce( + comp( + map(([k, v]) => [k, maybeParseFloat(v, null)]), + filter(([_, v]) => v !== null), + ), + assocObj(), + attribs, + pairs(attribs) + ); + +const transformTree = (tree) => { + if (tree.type === Type.ERROR) { + return ["error", tree.body]; + } + const res: any[] = []; + const attribs = transformAttribs(tree.attribs); + let tag = tree.tag; + if (attribs.id) { + tag += "#" + attribs.id; + delete attribs.id; + } + if (attribs.class) { + tag += "." + attribs.class.replace(/\s+/g, "."); + delete attribs.class; + } + res.push(tag); + if (Object.keys(attribs).length) { + res.push(attribs); + } + if (tree.body) { + res.push(tree.body); + } + if (tree.children && tree.children.length) { + transduce(map(transformTree), push(), res, tree.children) + } + return res; +}; + +const app = ([html, hiccup]) => + ["div.flex", + ["div", + ["h3", "XML/HTML source", + ["small.fw1.ml2", "(must be well formed!)"]], + ["textarea.mr2.f7.code.bg-light-yellow", + { + cols: 72, + rows: 25, + oninput: (e) => src.next(e.target.value), + value: html + }] + ], + ["div", + ["h3", "Parsed Hiccup / JSON"], + ["textarea.f7.code", + { + cols: 72, + rows: 25, + disabled: true + }, + JSON.stringify(hiccup, null, 2) + ] + ] + ]; + +const src = stream() + .transform( + multiplex( + map(identity), + comp( + map(parseXML), + map(transformTree) + ) + ), + map(app), + updateDOM() + ); + +src.next(` + + foo + + +
+ +`); + +if (process.env.NODE_ENV !== "production") { + const hot = (module).hot; + hot && hot.dispose(() => src.done()); +} + +["html", + { + "lang": "en" + }, + [ + "head", + [ + "title", + "foo" + ] + ], + [ + "body.foo.bar", + [ + "div#app" + ] + ] +] \ No newline at end of file diff --git a/examples/xml-converter/tsconfig.json b/examples/xml-converter/tsconfig.json new file mode 100644 index 0000000000..bbf112cc18 --- /dev/null +++ b/examples/xml-converter/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": ".", + "target": "es6", + "sourceMap": true + }, + "include": [ + "./src/**/*.ts" + ] +} From febe3c36d4c7e5a5f71ca89a68d27eeb8278397d Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 00:13:23 +0100 Subject: [PATCH 08/77] Publish - @thi.ng/associative@0.6.9 - @thi.ng/cache@0.2.26 - @thi.ng/csp@0.3.65 - @thi.ng/dcons@1.1.9 - @thi.ng/dgraph@0.2.21 - @thi.ng/hdom-components@2.2.8 - @thi.ng/hiccup-css@0.2.24 - @thi.ng/iges@0.2.14 - @thi.ng/iterators@4.1.30 - @thi.ng/range-coder@0.1.14 - @thi.ng/rstream-csp@0.1.110 - @thi.ng/rstream-dot@0.2.49 - @thi.ng/rstream-gestures@0.5.11 - @thi.ng/rstream-graph@2.1.35 - @thi.ng/rstream-log@1.0.61 - @thi.ng/rstream-query@0.3.48 - @thi.ng/rstream@1.13.3 - @thi.ng/sax@0.4.1 - @thi.ng/strings@0.4.3 - @thi.ng/transducers-fsm@0.2.22 - @thi.ng/transducers-hdom@1.1.3 - @thi.ng/transducers-stats@0.4.9 - @thi.ng/transducers@2.1.4 --- packages/associative/CHANGELOG.md | 9 +++++++++ packages/associative/package.json | 6 +++--- packages/cache/CHANGELOG.md | 9 +++++++++ packages/cache/package.json | 6 +++--- packages/csp/CHANGELOG.md | 9 +++++++++ packages/csp/package.json | 6 +++--- packages/dcons/CHANGELOG.md | 9 +++++++++ packages/dcons/package.json | 4 ++-- packages/dgraph/CHANGELOG.md | 9 +++++++++ packages/dgraph/package.json | 6 +++--- packages/hdom-components/CHANGELOG.md | 9 +++++++++ packages/hdom-components/package.json | 4 ++-- packages/hiccup-css/CHANGELOG.md | 9 +++++++++ packages/hiccup-css/package.json | 4 ++-- packages/iges/CHANGELOG.md | 9 +++++++++ packages/iges/package.json | 6 +++--- packages/iterators/CHANGELOG.md | 9 +++++++++ packages/iterators/package.json | 4 ++-- packages/range-coder/CHANGELOG.md | 9 +++++++++ packages/range-coder/package.json | 4 ++-- packages/rstream-csp/CHANGELOG.md | 9 +++++++++ packages/rstream-csp/package.json | 6 +++--- packages/rstream-dot/CHANGELOG.md | 9 +++++++++ packages/rstream-dot/package.json | 4 ++-- packages/rstream-gestures/CHANGELOG.md | 9 +++++++++ packages/rstream-gestures/package.json | 6 +++--- packages/rstream-graph/CHANGELOG.md | 9 +++++++++ packages/rstream-graph/package.json | 6 +++--- packages/rstream-log/CHANGELOG.md | 9 +++++++++ packages/rstream-log/package.json | 6 +++--- packages/rstream-query/CHANGELOG.md | 9 +++++++++ packages/rstream-query/package.json | 10 +++++----- packages/rstream/CHANGELOG.md | 9 +++++++++ packages/rstream/package.json | 6 +++--- packages/sax/CHANGELOG.md | 9 +++++++++ packages/sax/package.json | 6 +++--- packages/strings/CHANGELOG.md | 12 ++++++++++++ packages/strings/package.json | 2 +- packages/transducers-fsm/CHANGELOG.md | 9 +++++++++ packages/transducers-fsm/package.json | 4 ++-- packages/transducers-hdom/CHANGELOG.md | 9 +++++++++ packages/transducers-hdom/package.json | 4 ++-- packages/transducers-stats/CHANGELOG.md | 9 +++++++++ packages/transducers-stats/package.json | 6 +++--- packages/transducers/CHANGELOG.md | 9 +++++++++ packages/transducers/package.json | 4 ++-- 46 files changed, 270 insertions(+), 60 deletions(-) diff --git a/packages/associative/CHANGELOG.md b/packages/associative/CHANGELOG.md index d83bf05f48..358d46d94a 100644 --- a/packages/associative/CHANGELOG.md +++ b/packages/associative/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.6.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.8...@thi.ng/associative@0.6.9) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/associative + + + + + ## [0.6.8](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.7...@thi.ng/associative@0.6.8) (2018-09-24) diff --git a/packages/associative/package.json b/packages/associative/package.json index 9383a0446e..6d2103739f 100644 --- a/packages/associative/package.json +++ b/packages/associative/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/associative", - "version": "0.6.8", + "version": "0.6.9", "description": "Alternative Set & Map data type implementations with customizable equality semantics & supporting operations", "main": "./index.js", "typings": "./index.d.ts", @@ -31,10 +31,10 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/compare": "^0.1.9", - "@thi.ng/dcons": "^1.1.8", + "@thi.ng/dcons": "^1.1.9", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "data structures", diff --git a/packages/cache/CHANGELOG.md b/packages/cache/CHANGELOG.md index 5e357915c8..d9cc1a1fdf 100644 --- a/packages/cache/CHANGELOG.md +++ b/packages/cache/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.26](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.25...@thi.ng/cache@0.2.26) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/cache + + + + + ## [0.2.25](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.24...@thi.ng/cache@0.2.25) (2018-09-24) diff --git a/packages/cache/package.json b/packages/cache/package.json index ad665eb3e8..82c4227a67 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/cache", - "version": "0.2.25", + "version": "0.2.26", "description": "In-memory cache implementations with ES6 Map-like API and different eviction strategies", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.8", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/dcons": "^1.1.9", + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "cache", diff --git a/packages/csp/CHANGELOG.md b/packages/csp/CHANGELOG.md index d7aeda7e4a..8dfd32de4f 100644 --- a/packages/csp/CHANGELOG.md +++ b/packages/csp/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.65](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.64...@thi.ng/csp@0.3.65) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/csp + + + + + ## [0.3.64](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.63...@thi.ng/csp@0.3.64) (2018-09-24) diff --git a/packages/csp/package.json b/packages/csp/package.json index b23784230d..5ec3a7f4d9 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/csp", - "version": "0.3.64", + "version": "0.3.65", "description": "ES6 promise based CSP implementation", "main": "./index.js", "typings": "./index.d.ts", @@ -34,9 +34,9 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", - "@thi.ng/dcons": "^1.1.8", + "@thi.ng/dcons": "^1.1.9", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "async", diff --git a/packages/dcons/CHANGELOG.md b/packages/dcons/CHANGELOG.md index 29bc7bcd12..c28b236145 100644 --- a/packages/dcons/CHANGELOG.md +++ b/packages/dcons/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.8...@thi.ng/dcons@1.1.9) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/dcons + + + + + ## [1.1.8](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.7...@thi.ng/dcons@1.1.8) (2018-09-24) diff --git a/packages/dcons/package.json b/packages/dcons/package.json index 0e484ad8dc..2d3521ce78 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dcons", - "version": "1.1.8", + "version": "1.1.9", "description": "Comprehensive doubly linked list structure w/ iterator support", "main": "./index.js", "typings": "./index.d.ts", @@ -33,7 +33,7 @@ "@thi.ng/compare": "^0.1.9", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "datastructure", diff --git a/packages/dgraph/CHANGELOG.md b/packages/dgraph/CHANGELOG.md index 90a3b677e0..f6bad146f4 100644 --- a/packages/dgraph/CHANGELOG.md +++ b/packages/dgraph/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.21](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.20...@thi.ng/dgraph@0.2.21) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/dgraph + + + + + ## [0.2.20](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.19...@thi.ng/dgraph@0.2.20) (2018-09-24) diff --git a/packages/dgraph/package.json b/packages/dgraph/package.json index ed69d7442d..75ec7dcad2 100644 --- a/packages/dgraph/package.json +++ b/packages/dgraph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dgraph", - "version": "0.2.20", + "version": "0.2.21", "description": "Type-agnostic directed acyclic graph (DAG) & graph operations", "main": "./index.js", "typings": "./index.d.ts", @@ -29,10 +29,10 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.8", + "@thi.ng/associative": "^0.6.9", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "data structure", diff --git a/packages/hdom-components/CHANGELOG.md b/packages/hdom-components/CHANGELOG.md index ac72686151..dc06cac56f 100644 --- a/packages/hdom-components/CHANGELOG.md +++ b/packages/hdom-components/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.2.8](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.7...@thi.ng/hdom-components@2.2.8) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/hdom-components + + + + + ## [2.2.7](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.6...@thi.ng/hdom-components@2.2.7) (2018-09-24) diff --git a/packages/hdom-components/package.json b/packages/hdom-components/package.json index 3f061d396d..9416639010 100644 --- a/packages/hdom-components/package.json +++ b/packages/hdom-components/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-components", - "version": "2.2.7", + "version": "2.2.8", "description": "Raw, skinnable UI & SVG components for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -30,7 +30,7 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", - "@thi.ng/transducers": "^2.1.3", + "@thi.ng/transducers": "^2.1.4", "@types/webgl2": "^0.0.4" }, "keywords": [ diff --git a/packages/hiccup-css/CHANGELOG.md b/packages/hiccup-css/CHANGELOG.md index 5ab23e7314..0ad51bcb49 100644 --- a/packages/hiccup-css/CHANGELOG.md +++ b/packages/hiccup-css/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.24](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.23...@thi.ng/hiccup-css@0.2.24) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/hiccup-css + + + + + ## [0.2.23](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.22...@thi.ng/hiccup-css@0.2.23) (2018-09-24) diff --git a/packages/hiccup-css/package.json b/packages/hiccup-css/package.json index b33d830cf1..1e0e1e2eae 100644 --- a/packages/hiccup-css/package.json +++ b/packages/hiccup-css/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-css", - "version": "0.2.23", + "version": "0.2.24", "description": "CSS from nested JS data structures", "main": "./index.js", "typings": "./index.d.ts", @@ -31,7 +31,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "clojure", diff --git a/packages/iges/CHANGELOG.md b/packages/iges/CHANGELOG.md index bd15babe16..aecfc68775 100644 --- a/packages/iges/CHANGELOG.md +++ b/packages/iges/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.14](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.13...@thi.ng/iges@0.2.14) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/iges + + + + + ## [0.2.13](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.12...@thi.ng/iges@0.2.13) (2018-09-24) diff --git a/packages/iges/package.json b/packages/iges/package.json index 3976c496fb..2f9b29dc08 100644 --- a/packages/iges/package.json +++ b/packages/iges/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iges", - "version": "0.2.13", + "version": "0.2.14", "description": "IGES 5.3 serializer for (currently only) polygonal geometry, both open & closed", "main": "./index.js", "typings": "./index.d.ts", @@ -30,8 +30,8 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/defmulti": "^0.3.11", - "@thi.ng/strings": "^0.4.2", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/strings": "^0.4.3", + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "CAD", diff --git a/packages/iterators/CHANGELOG.md b/packages/iterators/CHANGELOG.md index c230d20ba4..aa1033d428 100644 --- a/packages/iterators/CHANGELOG.md +++ b/packages/iterators/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [4.1.30](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.29...@thi.ng/iterators@4.1.30) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/iterators + + + + + ## [4.1.29](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.28...@thi.ng/iterators@4.1.29) (2018-09-24) diff --git a/packages/iterators/package.json b/packages/iterators/package.json index f55b3b4af1..1db138610e 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iterators", - "version": "4.1.29", + "version": "4.1.30", "description": "clojure.core inspired, composable ES6 iterators & generators", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.8", + "@thi.ng/dcons": "^1.1.9", "@thi.ng/errors": "^0.1.9" }, "keywords": [ diff --git a/packages/range-coder/CHANGELOG.md b/packages/range-coder/CHANGELOG.md index 0129415a6b..9e5ac527b5 100644 --- a/packages/range-coder/CHANGELOG.md +++ b/packages/range-coder/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.14](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.13...@thi.ng/range-coder@0.1.14) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/range-coder + + + + + ## [0.1.13](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.12...@thi.ng/range-coder@0.1.13) (2018-09-24) diff --git a/packages/range-coder/package.json b/packages/range-coder/package.json index 0f87a53c46..c5a7db64f9 100644 --- a/packages/range-coder/package.json +++ b/packages/range-coder/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/range-coder", - "version": "0.1.13", + "version": "0.1.14", "description": "Binary data range encoder / decoder", "main": "./index.js", "typings": "./index.d.ts", @@ -20,7 +20,7 @@ "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" }, "devDependencies": { - "@thi.ng/transducers": "^2.1.3", + "@thi.ng/transducers": "^2.1.4", "@types/mocha": "^5.2.5", "@types/node": "^10.5.5", "mocha": "^5.2.0", diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index b3722f4d15..b52032fe68 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.110](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.109...@thi.ng/rstream-csp@0.1.110) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/rstream-csp + + + + + ## [0.1.109](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.108...@thi.ng/rstream-csp@0.1.109) (2018-09-24) diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 4c07c313c9..847d07d3fa 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "0.1.109", + "version": "0.1.110", "description": "@thi.ng/csp bridge module for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/csp": "^0.3.64", - "@thi.ng/rstream": "^1.13.2" + "@thi.ng/csp": "^0.3.65", + "@thi.ng/rstream": "^1.13.3" }, "keywords": [ "bridge", diff --git a/packages/rstream-dot/CHANGELOG.md b/packages/rstream-dot/CHANGELOG.md index ebe4bc292f..25adb475b6 100644 --- a/packages/rstream-dot/CHANGELOG.md +++ b/packages/rstream-dot/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.49](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.48...@thi.ng/rstream-dot@0.2.49) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/rstream-dot + + + + + ## [0.2.48](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.47...@thi.ng/rstream-dot@0.2.48) (2018-09-24) diff --git a/packages/rstream-dot/package.json b/packages/rstream-dot/package.json index 7679faf8d1..41e6c6c08c 100644 --- a/packages/rstream-dot/package.json +++ b/packages/rstream-dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-dot", - "version": "0.2.48", + "version": "0.2.49", "description": "Graphviz DOT conversion of @thi.ng/rstream dataflow graph topologies", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/rstream": "^1.13.2" + "@thi.ng/rstream": "^1.13.3" }, "keywords": [ "conversion", diff --git a/packages/rstream-gestures/CHANGELOG.md b/packages/rstream-gestures/CHANGELOG.md index 16e7b106df..1bdd106ead 100644 --- a/packages/rstream-gestures/CHANGELOG.md +++ b/packages/rstream-gestures/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.5.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.10...@thi.ng/rstream-gestures@0.5.11) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/rstream-gestures + + + + + ## [0.5.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.9...@thi.ng/rstream-gestures@0.5.10) (2018-09-24) diff --git a/packages/rstream-gestures/package.json b/packages/rstream-gestures/package.json index 0bb7c1a204..93bdbc7c92 100644 --- a/packages/rstream-gestures/package.json +++ b/packages/rstream-gestures/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-gestures", - "version": "0.5.10", + "version": "0.5.11", "description": "Unified mouse, mouse wheel & single-touch event stream abstraction", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/rstream": "^1.13.2", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/rstream": "^1.13.3", + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "dataflow", diff --git a/packages/rstream-graph/CHANGELOG.md b/packages/rstream-graph/CHANGELOG.md index 8e4195490a..81595f3167 100644 --- a/packages/rstream-graph/CHANGELOG.md +++ b/packages/rstream-graph/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.1.35](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.34...@thi.ng/rstream-graph@2.1.35) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/rstream-graph + + + + + ## [2.1.34](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.33...@thi.ng/rstream-graph@2.1.34) (2018-09-24) diff --git a/packages/rstream-graph/package.json b/packages/rstream-graph/package.json index 8b8236458d..0404b53921 100644 --- a/packages/rstream-graph/package.json +++ b/packages/rstream-graph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-graph", - "version": "2.1.34", + "version": "2.1.35", "description": "Declarative dataflow graph construction for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -33,8 +33,8 @@ "@thi.ng/errors": "^0.1.9", "@thi.ng/paths": "^1.6.3", "@thi.ng/resolve-map": "^3.0.13", - "@thi.ng/rstream": "^1.13.2", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/rstream": "^1.13.3", + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "compute", diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index 3df83e7c3c..9c1fd797c6 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.0.61](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.60...@thi.ng/rstream-log@1.0.61) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/rstream-log + + + + + ## [1.0.60](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.59...@thi.ng/rstream-log@1.0.60) (2018-09-24) diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index e3b06ad73b..5341d9a08a 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "1.0.60", + "version": "1.0.61", "description": "Structured, multilevel & hierarchical loggers based on @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -31,8 +31,8 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.2", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/rstream": "^1.13.3", + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "ES6", diff --git a/packages/rstream-query/CHANGELOG.md b/packages/rstream-query/CHANGELOG.md index 5d84732b30..be6723f0cd 100644 --- a/packages/rstream-query/CHANGELOG.md +++ b/packages/rstream-query/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.48](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.47...@thi.ng/rstream-query@0.3.48) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/rstream-query + + + + + ## [0.3.47](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.46...@thi.ng/rstream-query@0.3.47) (2018-09-24) diff --git a/packages/rstream-query/package.json b/packages/rstream-query/package.json index d6d21378ba..84c6815027 100644 --- a/packages/rstream-query/package.json +++ b/packages/rstream-query/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-query", - "version": "0.3.47", + "version": "0.3.48", "description": "@thi.ng/rstream based triple store & reactive query engine", "main": "./index.js", "typings": "./index.d.ts", @@ -29,13 +29,13 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.8", + "@thi.ng/associative": "^0.6.9", "@thi.ng/checks": "^1.5.11", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.2", - "@thi.ng/rstream-dot": "^0.2.48", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/rstream": "^1.13.3", + "@thi.ng/rstream-dot": "^0.2.49", + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "dataflow", diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index 6426c24926..79ebaa91e4 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.13.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.2...@thi.ng/rstream@1.13.3) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/rstream + + + + + ## [1.13.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.1...@thi.ng/rstream@1.13.2) (2018-09-24) diff --git a/packages/rstream/package.json b/packages/rstream/package.json index 44282917e9..0b8549075f 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "1.13.2", + "version": "1.13.3", "description": "Reactive multi-tap streams, dataflow & transformation pipeline constructs", "main": "./index.js", "typings": "./index.d.ts", @@ -29,12 +29,12 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.8", + "@thi.ng/associative": "^0.6.9", "@thi.ng/atom": "^1.5.4", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", "@thi.ng/paths": "^1.6.3", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "datastructure", diff --git a/packages/sax/CHANGELOG.md b/packages/sax/CHANGELOG.md index d0cb8bd679..4d88b168df 100644 --- a/packages/sax/CHANGELOG.md +++ b/packages/sax/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.4.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.4.0...@thi.ng/sax@0.4.1) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/sax + + + + + # [0.4.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.3.21...@thi.ng/sax@0.4.0) (2018-09-24) diff --git a/packages/sax/package.json b/packages/sax/package.json index 6c70b722ee..dbab0d948c 100644 --- a/packages/sax/package.json +++ b/packages/sax/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/sax", - "version": "0.4.0", + "version": "0.4.1", "description": "Transducer-based, SAX-like, non-validating, speedy & tiny XML parser", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.3", - "@thi.ng/transducers-fsm": "^0.2.21" + "@thi.ng/transducers": "^2.1.4", + "@thi.ng/transducers-fsm": "^0.2.22" }, "keywords": [ "ES6", diff --git a/packages/strings/CHANGELOG.md b/packages/strings/CHANGELOG.md index 6a52b9e272..e3b892efbc 100644 --- a/packages/strings/CHANGELOG.md +++ b/packages/strings/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.4.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/strings@0.4.2...@thi.ng/strings@0.4.3) (2018-09-24) + + +### Bug Fixes + +* **strings:** rename number parsers ([8cbfb97](https://github.com/thi-ng/umbrella/commit/8cbfb97)) + + + + + ## [0.4.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/strings@0.4.1...@thi.ng/strings@0.4.2) (2018-09-24) diff --git a/packages/strings/package.json b/packages/strings/package.json index 54c1688cb9..10cf623f66 100644 --- a/packages/strings/package.json +++ b/packages/strings/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/strings", - "version": "0.4.2", + "version": "0.4.3", "description": "Various string formatting & utility functions", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/transducers-fsm/CHANGELOG.md b/packages/transducers-fsm/CHANGELOG.md index e378ffb09b..2a8c543731 100644 --- a/packages/transducers-fsm/CHANGELOG.md +++ b/packages/transducers-fsm/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.22](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.21...@thi.ng/transducers-fsm@0.2.22) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/transducers-fsm + + + + + ## [0.2.21](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.20...@thi.ng/transducers-fsm@0.2.21) (2018-09-24) diff --git a/packages/transducers-fsm/package.json b/packages/transducers-fsm/package.json index a289f65ff4..3a8341468e 100644 --- a/packages/transducers-fsm/package.json +++ b/packages/transducers-fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-fsm", - "version": "0.2.21", + "version": "0.2.22", "description": "Transducer-based Finite State Machine transformer", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "ES6", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index 0720d13932..ebc85864f8 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.2...@thi.ng/transducers-hdom@1.1.3) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [1.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.1...@thi.ng/transducers-hdom@1.1.2) (2018-09-24) diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index 417d5b2e05..d6cceacd6e 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "1.1.2", + "version": "1.1.3", "description": "Transducer based UI updater for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -30,7 +30,7 @@ "dependencies": { "@thi.ng/checks": "^1.5.11", "@thi.ng/hdom": "^5.0.2", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "diff", diff --git a/packages/transducers-stats/CHANGELOG.md b/packages/transducers-stats/CHANGELOG.md index 44c795791e..52dd6c24c9 100644 --- a/packages/transducers-stats/CHANGELOG.md +++ b/packages/transducers-stats/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.4.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.8...@thi.ng/transducers-stats@0.4.9) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/transducers-stats + + + + + ## [0.4.8](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.7...@thi.ng/transducers-stats@0.4.8) (2018-09-24) diff --git a/packages/transducers-stats/package.json b/packages/transducers-stats/package.json index 71cd21e08b..b0944da9c7 100644 --- a/packages/transducers-stats/package.json +++ b/packages/transducers-stats/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-stats", - "version": "0.4.8", + "version": "0.4.9", "description": "Transducers for statistical / technical analysis", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/dcons": "^1.1.8", + "@thi.ng/dcons": "^1.1.9", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.3" + "@thi.ng/transducers": "^2.1.4" }, "keywords": [ "ES6", diff --git a/packages/transducers/CHANGELOG.md b/packages/transducers/CHANGELOG.md index db8fef0175..79016dbf17 100644 --- a/packages/transducers/CHANGELOG.md +++ b/packages/transducers/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.3...@thi.ng/transducers@2.1.4) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/transducers + + + + + ## [2.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.2...@thi.ng/transducers@2.1.3) (2018-09-24) diff --git a/packages/transducers/package.json b/packages/transducers/package.json index b20df7af82..605f7adf0b 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers", - "version": "2.1.3", + "version": "2.1.4", "description": "Lightweight transducer implementations for ES6 / TypeScript", "main": "./index.js", "typings": "./index.d.ts", @@ -34,7 +34,7 @@ "@thi.ng/compose": "^0.1.4", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/strings": "^0.4.2" + "@thi.ng/strings": "^0.4.3" }, "keywords": [ "ES6", From 50fa6492565c68be6fd4698d1de039e358e72e94 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 00:37:04 +0100 Subject: [PATCH 09/77] fix(hdom): add DEFAULT_IMPL to re-exports (#47) --- packages/hdom/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hdom/src/index.ts b/packages/hdom/src/index.ts index f7ca9cf68f..e33ab1e275 100644 --- a/packages/hdom/src/index.ts +++ b/packages/hdom/src/index.ts @@ -1,4 +1,5 @@ export * from "./api"; +export * from "./default"; export * from "./diff"; export * from "./dom"; export * from "./normalize"; From 436edc0f26b2b320b02ef4096930a23981f7a11c Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 00:37:32 +0100 Subject: [PATCH 10/77] Publish - @thi.ng/hdom-canvas@0.1.3 - @thi.ng/hdom@5.0.3 - @thi.ng/transducers-hdom@1.1.4 --- packages/hdom-canvas/CHANGELOG.md | 9 +++++++++ packages/hdom-canvas/package.json | 4 ++-- packages/hdom/CHANGELOG.md | 12 ++++++++++++ packages/hdom/package.json | 2 +- packages/transducers-hdom/CHANGELOG.md | 9 +++++++++ packages/transducers-hdom/package.json | 4 ++-- 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/hdom-canvas/CHANGELOG.md b/packages/hdom-canvas/CHANGELOG.md index a953d26a1e..215ea29890 100644 --- a/packages/hdom-canvas/CHANGELOG.md +++ b/packages/hdom-canvas/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.2...@thi.ng/hdom-canvas@0.1.3) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/hdom-canvas + + + + + ## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.1...@thi.ng/hdom-canvas@0.1.2) (2018-09-24) diff --git a/packages/hdom-canvas/package.json b/packages/hdom-canvas/package.json index bc35c61122..541fc3b010 100644 --- a/packages/hdom-canvas/package.json +++ b/packages/hdom-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-canvas", - "version": "0.1.2", + "version": "0.1.3", "description": "Declarative canvas scenegraph & visualization for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -31,7 +31,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/diff": "^1.1.2", - "@thi.ng/hdom": "^5.0.2" + "@thi.ng/hdom": "^5.0.3" }, "keywords": [ "ES6", diff --git a/packages/hdom/CHANGELOG.md b/packages/hdom/CHANGELOG.md index 694be3c7cf..597f266b56 100644 --- a/packages/hdom/CHANGELOG.md +++ b/packages/hdom/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [5.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.2...@thi.ng/hdom@5.0.3) (2018-09-24) + + +### Bug Fixes + +* **hdom:** add DEFAULT_IMPL to re-exports ([#47](https://github.com/thi-ng/umbrella/issues/47)) ([50fa649](https://github.com/thi-ng/umbrella/commit/50fa649)) + + + + + ## [5.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.1...@thi.ng/hdom@5.0.2) (2018-09-24) diff --git a/packages/hdom/package.json b/packages/hdom/package.json index f66e0f009a..d4a1301687 100644 --- a/packages/hdom/package.json +++ b/packages/hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom", - "version": "5.0.2", + "version": "5.0.3", "description": "Lightweight vanilla ES6 UI component trees with customizable branch-local behaviors", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index ebc85864f8..07550063d9 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.3...@thi.ng/transducers-hdom@1.1.4) (2018-09-24) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [1.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.2...@thi.ng/transducers-hdom@1.1.3) (2018-09-24) diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index d6cceacd6e..cfab8f1b11 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "1.1.3", + "version": "1.1.4", "description": "Transducer based UI updater for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/checks": "^1.5.11", - "@thi.ng/hdom": "^5.0.2", + "@thi.ng/hdom": "^5.0.3", "@thi.ng/transducers": "^2.1.4" }, "keywords": [ From 5a893d5bdf07c5d3a164b7e9201a2dc92292557d Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 00:45:27 +0100 Subject: [PATCH 11/77] docs(examples): update table --- examples/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/README.md b/examples/README.md index 1007040b42..8d9b0dccd2 100644 --- a/examples/README.md +++ b/examples/README.md @@ -37,3 +37,4 @@ If you want to [contribute](../CONTRIBUTING.md) an example, please get in touch | 29 | [transducers-hdom](./transducers-hdom) | Transducer & rstream based hdom UI updates | hdom, rstream, transducers-hdom | basic | | 30 | [triple-query](./triple-query) | Triple store query results & sortable table | atom, hdom, hdom-components, rstream-query, transducers | intermediate | | 31 | [webgl](./webgl) | Canvas component handling | hdom, hdom-components | basic | +| 32 | [xml-converter](./xml-converter) | XML/HTML/SVG to hiccup conversion as you type | rstream, sax, transducers, transducers-hdom | basic | From 5119b67eb593c1b8b5333f901dacfc0eb61cb775 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 02:08:58 +0100 Subject: [PATCH 12/77] feat(sax): add opt support for boolean attribs, add tests --- packages/sax/src/index.ts | 41 ++++++++++++++++++++++++++++++++++---- packages/sax/test/index.ts | 23 +++++++++++++++++++-- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/packages/sax/src/index.ts b/packages/sax/src/index.ts index 4f21a8a952..4765924d6b 100644 --- a/packages/sax/src/index.ts +++ b/packages/sax/src/index.ts @@ -27,8 +27,23 @@ export interface ParseOpts { * Default: false */ trim: boolean; + /** + * If `true`, HTML5 boolean attributes are supported. + * + * Default: false + */ + boolean: boolean; + /** + * If given, element names in this set are allowed to omit their + * closing `/`. E.g. `` vs `` + * + * Default: undefined (none allowed) + */ + // voidTags: Set; // TODO #48 } +export const VOID_TAGS = new Set("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")); + export interface ParseElement { tag: string; attribs: IObjectOf; @@ -342,10 +357,7 @@ const PARSER: FSMStateMap = { } } else { if (ch === ">") { - state.state = State.ELEM_BODY; - state.scope.push({ tag: state.tag, attribs: state.attribs, children: [] }); - state.body = ""; - return [{ type: Type.ELEM_START, tag: state.tag, attribs: state.attribs }]; + return beginElementBody(state); } else if (ch === "/") { state.state = State.ELEM_SINGLE; } else if (!isWS(ch)) { @@ -361,6 +373,20 @@ const PARSER: FSMStateMap = { state.name += ch; } else if (ch === "=") { state.state = State.ATTRIB_VAL_START; + } else if (state.opts.boolean) { + if (ch === " ") { + state.attribs[state.name] = true; + state.state = State.MAYBE_ATTRIB; + } else if (ch === "/") { + state.attribs[state.name] = true; + state.state = State.ELEM_SINGLE; + return; + } else if (ch === ">") { + state.attribs[state.name] = true; + return beginElementBody(state); + } else { + return unexpected(state, ch); + } } else { return unexpected(state, ch); } @@ -515,3 +541,10 @@ const PARSER: FSMStateMap = { } }, }; + +const beginElementBody = (state: ParseState) => { + state.state = State.ELEM_BODY; + state.scope.push({ tag: state.tag, attribs: state.attribs, children: [] }); + state.body = ""; + return [{ type: Type.ELEM_START, tag: state.tag, attribs: state.attribs }]; +}; diff --git a/packages/sax/test/index.ts b/packages/sax/test/index.ts index 6876c47102..fe2ae9805c 100644 --- a/packages/sax/test/index.ts +++ b/packages/sax/test/index.ts @@ -120,11 +120,11 @@ describe("sax", () => { it("errors", () => { assert.deepEqual( - [...tx.iterator(sax.parse(), "a")], + [...sax.parse("a")], [{ type: 7, body: "unexpected char: 'a' @ pos 1" }] ); assert.deepEqual( - [...tx.iterator(sax.parse(), "")], + [...sax.parse("")], [ { type: 4, tag: "a", attribs: {} }, { type: 4, tag: "b", attribs: {} }, @@ -132,4 +132,23 @@ describe("sax", () => { ] ); }); + + it("boolean attribs", () => { + assert.deepEqual( + [...sax.parse({ boolean: true }, ``)], + [ + { type: 4, tag: "foo", attribs: { a: true, b: "2", c: true } }, + { type: 5, tag: "foo", attribs: { a: true, b: "2", c: true }, children: [] } + ], + "no slash" + ) + assert.deepEqual( + [...sax.parse({ boolean: true }, ``)], + [ + { type: 4, tag: "foo", attribs: { a: true, b: "2", c: true } }, + { type: 5, tag: "foo", attribs: { a: true, b: "2", c: true } } + ], + "with slash" + ) + }); }); From 0cddc7d678bb8c2fc10e6f761c6cdb6edd8b33ac Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 02:09:32 +0100 Subject: [PATCH 13/77] feat(example): update xml-converter (add boolean attrib support) --- examples/xml-converter/index.html | 6 ++++-- examples/xml-converter/src/index.ts | 22 ++-------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/examples/xml-converter/index.html b/examples/xml-converter/index.html index cfc00c1ff9..65695cbea8 100644 --- a/examples/xml-converter/index.html +++ b/examples/xml-converter/index.html @@ -16,9 +16,11 @@

Current limitations

    -
  • No HTML quirks allowed (well formed XML only)
  • -
  • No HTML boolean attribs
  • +
  • Nicer output formatting needed
  • +
  • No HTML quirks supported (well formed XML only)
  • +
  • No HTML boolean attribs
  • Probably many more... :)
  • +
  • See issue #48
Source code
diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index 2cb5f8b1f8..f4cbc63175 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -16,7 +16,7 @@ import { multiplex } from "@thi.ng/transducers/xform/multiplex"; const parseXML = (src: string) => transduce( comp( - parse({ trim: true }), + parse({ trim: true, boolean: true }), filter((e) => e.type === Type.ELEM_END || e.type === Type.ERROR) ), last(), @@ -107,6 +107,7 @@ src.next(`
+ `); @@ -114,22 +115,3 @@ if (process.env.NODE_ENV !== "production") { const hot = (module).hot; hot && hot.dispose(() => src.done()); } - -["html", - { - "lang": "en" - }, - [ - "head", - [ - "title", - "foo" - ] - ], - [ - "body.foo.bar", - [ - "div#app" - ] - ] -] \ No newline at end of file From 8b8bf885c8ef8c1c939d4d871d811ba08a956691 Mon Sep 17 00:00:00 2001 From: nkint Date: Tue, 25 Sep 2018 14:09:19 +0200 Subject: [PATCH 14/77] typo --- packages/transducers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transducers/README.md b/packages/transducers/README.md index e92bd2318f..9393285c8a 100644 --- a/packages/transducers/README.md +++ b/packages/transducers/README.md @@ -56,7 +56,7 @@ other JS based implementations) and dozens of less common, but generally highly useful operators have been added. See full list below. Furthermore, since v2.0.0 most transducers & reducers provided here -accept an optional input iterable, which allows them them to be used +accept an optional input iterable, which allows them to be used directly instead of having to wrap their call in one of the execution functions (i.e. `transduce()`, `reduce()`, `iterator()`, `run()`). If executed this way, transducer functions will return a transforming ES6 From 0cce048818e61bc3f7606082e870531d5af3fee1 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 14:09:53 +0100 Subject: [PATCH 15/77] feat(strings): add splice(), refactor repeat(), add tests --- packages/strings/README.md | 2 +- packages/strings/package.json | 3 ++- packages/strings/src/center.ts | 8 ++++---- packages/strings/src/index.ts | 1 + packages/strings/src/repeat.ts | 2 +- packages/strings/src/splice.ts | 32 ++++++++++++++++++++++++++++++++ packages/strings/test/index.ts | 2 +- packages/strings/test/splice.ts | 29 +++++++++++++++++++++++++++++ 8 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 packages/strings/src/splice.ts create mode 100644 packages/strings/test/splice.ts diff --git a/packages/strings/README.md b/packages/strings/README.md index 9ab38a59d0..bf6def08b2 100644 --- a/packages/strings/README.md +++ b/packages/strings/README.md @@ -21,7 +21,7 @@ This project is part of the ## About Various higher-order, but low-level string formatting & utility -functions, some memoized. WIP / Alpha. +functions, some memoized. WIP / Alpha. Please sources for now. ## Installation diff --git a/packages/strings/package.json b/packages/strings/package.json index 10cf623f66..8078e5a7ba 100644 --- a/packages/strings/package.json +++ b/packages/strings/package.json @@ -28,6 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { + "@thi.ng/errors": "^0.1.9", "@thi.ng/memoize": "^0.2.3" }, "keywords": [ @@ -43,4 +44,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/strings/src/center.ts b/packages/strings/src/center.ts index 23aa06c956..a2a6597b5c 100644 --- a/packages/strings/src/center.ts +++ b/packages/strings/src/center.ts @@ -20,11 +20,11 @@ import { truncate } from "./truncate"; * ``` * * @param lineWidth target length - * @param ch pad character(s) + * @param pad pad character(s) */ -export const center: (lineWidth: number, ch?: string | number) => Stringer = - memoizeJ>((n, ch = " ") => { - const buf = repeat(ch, n); +export const center: (lineWidth: number, pad?: string | number) => Stringer = + memoizeJ>((n, pad = " ") => { + const buf = repeat(pad, n); return (x: any) => { if (x == null) return buf; x = x.toString(); diff --git a/packages/strings/src/index.ts b/packages/strings/src/index.ts index 8b09d3e2d0..55ff7a5424 100644 --- a/packages/strings/src/index.ts +++ b/packages/strings/src/index.ts @@ -9,6 +9,7 @@ export * from "./parse"; export * from "./percent"; export * from "./radix"; export * from "./repeat"; +export * from "./splice"; export * from "./truncate"; export * from "./truncate-left"; export * from "./wrap"; diff --git a/packages/strings/src/repeat.ts b/packages/strings/src/repeat.ts index 8a5101500a..86738ee717 100644 --- a/packages/strings/src/repeat.ts +++ b/packages/strings/src/repeat.ts @@ -5,5 +5,5 @@ import { memoizeJ } from "@thi.ng/memoize/memoizej"; * @param n repeat count */ export const repeat = memoizeJ( - (ch: string, n: number) => new Array(n).fill(ch).join("") + (ch: string, n: number) => ch.repeat(n) ); diff --git a/packages/strings/src/splice.ts b/packages/strings/src/splice.ts new file mode 100644 index 0000000000..7aa846314d --- /dev/null +++ b/packages/strings/src/splice.ts @@ -0,0 +1,32 @@ +import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; + +/** + * Forms a new strings which inserts given `insert` string into `src` + * string at `from` position and appends remaining `src` chars from + * original `to` position. If `from` and `to` are equal (`to` by default + * is), the operation is a pure insertion. If not, then some chars from + * `src` will be removed in the new string. If either position is + * negative, it'll be considered relative to the end of the `src`. + * + * @param src + * @param insert + * @param from + * @param to + */ +export const splice = (src: string, insert: string, from: number, to = from) => { + if (from < 0) { + from += src.length; + } + if (to < 0) { + to += src.length; + } + if (from > to) { + illegalArgs("'from' index must be <= 'to'"); + } + to = Math.max(to, 0); + return from <= 0 ? + insert + src.substr(to) : + from >= src.length ? + src + insert : + src.substr(0, from) + insert + src.substr(to); +}; diff --git a/packages/strings/test/index.ts b/packages/strings/test/index.ts index dac73b9054..4b5bff721e 100644 --- a/packages/strings/test/index.ts +++ b/packages/strings/test/index.ts @@ -13,7 +13,7 @@ describe("strings", () => { assert.strictEqual(str.padLeft(5), str.padLeft(5)); }); - it("padr", () => { + it("padRight", () => { assert.equal(str.padRight(4)(undefined), " "); assert.equal(str.padRight(4, "0")(null), "0000"); assert.equal(str.padRight(4)(1), "1 "); diff --git a/packages/strings/test/splice.ts b/packages/strings/test/splice.ts new file mode 100644 index 0000000000..c5e7968415 --- /dev/null +++ b/packages/strings/test/splice.ts @@ -0,0 +1,29 @@ +import * as assert from "assert"; +import { splice } from "../src/splice"; + +const SRC = "abc"; + +describe("splice", () => { + it("pos index", () => { + assert.equal(splice(SRC, "x", 0), "xabc"); + assert.equal(splice(SRC, "x", 1), "axbc"); + assert.equal(splice(SRC, "x", 2), "abxc"); + assert.equal(splice(SRC, "x", 3), "abcx"); + assert.equal(splice(SRC, "x", 4), "abcx"); + }); + it("neg index", () => { + assert.equal(splice(SRC, "x", -1), "abxc"); + assert.equal(splice(SRC, "x", -2), "axbc"); + assert.equal(splice(SRC, "x", -3), "xabc"); + assert.equal(splice(SRC, "x", -4), "xabc"); + }); + it("w/ deletion", () => { + assert.equal(splice(SRC, "xx", 0, 1), "xxbc"); + assert.equal(splice(SRC, "xx", 1, 2), "axxc"); + assert.equal(splice(SRC, "xx", 2, 4), "abxx"); + assert.equal(splice(SRC, "xx", -1, 4), "abxx"); + assert.equal(splice(SRC, "xx", -2, 4), "axx"); + assert.equal(splice(SRC, "xx", -3, 4), "xx"); + assert.equal(splice(SRC, "xx", -3, 2), "xxc"); + }); +}); \ No newline at end of file From 79cf49e1d471a48e0ad5e7e18de32d32bdea13c3 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 14:13:30 +0100 Subject: [PATCH 16/77] feat(examples): add value coercions & re-formatter (xml-converter) --- examples/xml-converter/index.html | 16 +- examples/xml-converter/src/index.ts | 241 ++++++++++++++++++++++------ 2 files changed, 198 insertions(+), 59 deletions(-) diff --git a/examples/xml-converter/index.html b/examples/xml-converter/index.html index 65695cbea8..274ce607a5 100644 --- a/examples/xml-converter/index.html +++ b/examples/xml-converter/index.html @@ -14,15 +14,17 @@
-

Current limitations

+

Current features

    -
  • Nicer output formatting needed
  • -
  • No HTML quirks supported (well formed XML only)
  • -
  • No HTML boolean attribs
  • -
  • Probably many more... :)
  • -
  • See issue #48
  • +
  • HTML boolean attribs
  • +
  • Numeric & boolean attrib value parsing
  • +
  • style attrib conversion
  • +
  • Standard HTML entity unescaping
  • +
  • Input must be well formed XML
  • +
  • Hiccup specific (more compact) JSON formatting
  • +
  • See issue #48
- Source code + Source code
diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index f4cbc63175..86950425ac 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -1,9 +1,17 @@ -import { stream } from "@thi.ng/rstream/stream"; +import { isArray } from "@thi.ng/checks/is-array"; +import { isBoolean } from "@thi.ng/checks/is-boolean"; +import { isNumber } from "@thi.ng/checks/is-number"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { DEFAULT, defmulti } from "@thi.ng/defmulti"; +import { stream, Stream } from "@thi.ng/rstream/stream"; import { parse, Type } from "@thi.ng/sax"; +import { splice } from "@thi.ng/strings/splice"; import { maybeParseFloat } from "@thi.ng/strings/parse"; +import { repeat } from "@thi.ng/strings/repeat"; import { updateDOM } from "@thi.ng/transducers-hdom"; import { comp } from "@thi.ng/transducers/func/comp"; import { identity } from "@thi.ng/transducers/func/identity"; +import { peek } from "@thi.ng/transducers/func/peek"; import { pairs } from "@thi.ng/transducers/iter/pairs"; import { assocObj } from "@thi.ng/transducers/rfn/assoc-obj"; import { last } from "@thi.ng/transducers/rfn/last"; @@ -13,34 +21,53 @@ import { filter } from "@thi.ng/transducers/xform/filter"; import { map } from "@thi.ng/transducers/xform/map"; import { multiplex } from "@thi.ng/transducers/xform/multiplex"; +// parses given XMLish string using @thi.ng/sax transducer into a tree +// sequence of parse events. we only care about the final (or error) +// event, which will be related to the final close tag and contains the +// entire tree const parseXML = (src: string) => transduce( comp( - parse({ trim: true, boolean: true }), + parse({ trim: true, boolean: true, entities: true }), filter((e) => e.type === Type.ELEM_END || e.type === Type.ERROR) ), last(), src ); +// transforms string of CSS properties into a plain object +const transformCSS = (css: string) => + css.split(";").reduce( + (acc, p) => { + const [k, v] = p.split(":"); + acc[k.trim()] = v.trim(); + return acc; + }, + {} + ); + +// takes attrib key-value pair and attempts to coerce / transform its +// value. returns updated pair. +const parseAttrib = ([k, v]: string[]) => + k === "style" ? + [k, transformCSS(v)] : + v === "true" ? + [k, true] : + v === "false" ? + [k, false] : + [k, maybeParseFloat(v, v)]; + +// transforms an entire object of attributes const transformAttribs = (attribs: any) => transduce( - comp( - map(([k, v]) => [k, maybeParseFloat(v, null)]), - filter(([_, v]) => v !== null), - ), + map(parseAttrib), assocObj(), attribs, - pairs(attribs) + pairs(attribs) ); -const transformTree = (tree) => { - if (tree.type === Type.ERROR) { - return ["error", tree.body]; - } - const res: any[] = []; - const attribs = transformAttribs(tree.attribs); - let tag = tree.tag; +// transforms element name by attempting to form Emmet-like tags +const transformTag = (tag: string, attribs: any) => { if (attribs.id) { tag += "#" + attribs.id; delete attribs.id; @@ -49,7 +76,16 @@ const transformTree = (tree) => { tag += "." + attribs.class.replace(/\s+/g, "."); delete attribs.class; } - res.push(tag); + return tag; +}; + +// recursively transforms entire parse tree +const transformTree = (tree: any) => { + if (tree.type === Type.ERROR) { + return ["error", tree.body]; + } + const attribs = transformAttribs(tree.attribs); + const res: any[] = [transformTag(tree.tag, attribs)]; if (Object.keys(attribs).length) { res.push(attribs); } @@ -62,55 +98,156 @@ const transformTree = (tree) => { return res; }; -const app = ([html, hiccup]) => - ["div.flex", - ["div", - ["h3", "XML/HTML source", - ["small.fw1.ml2", "(must be well formed!)"]], - ["textarea.mr2.f7.code.bg-light-yellow", - { - cols: 72, - rows: 25, - oninput: (e) => src.next(e.target.value), - value: html - }] - ], - ["div", - ["h3", "Parsed Hiccup / JSON"], - ["textarea.f7.code", - { - cols: 72, - rows: 25, - disabled: true - }, - JSON.stringify(hiccup, null, 2) +// dispatch helper function for the `format` defmulti below +const classify = (x: any) => + isArray(x) ? "array" : isPlainObject(x) ? "obj" : DEFAULT; + +// wraps attrib name in quotes if needed +const formatAttrib = (x: string) => + /^[a-z]+$/i.test(x) ? x : `"${x}"`; + +// attrib or body value formatter +const formatVal = (x: any, indent: number, istep: number) => + isNumber(x) || isBoolean(x) ? + x : + isPlainObject(x) ? + format(x, "", indent + istep, istep) : + `"${x}"`; + +// attrib key-value pair formatter w/ indentation +const formatPair = (x: any, k: string, indent: number, istep: number) => + `${spaces(indent)}${formatAttrib(k)}: ${formatVal(x[k], indent, istep)}`; + +// memoized indentations +const spaces = (n: number) => repeat(" ", n); + +// multiply dispatch function to format the transformed tree (hiccup +// structure) into a more compact & legible format than produced by +// standard: `JSON.stringify(tree, null, 4)` +const format = defmulti(classify); + +// implementation for array values +format.add("array", (x, res, indent, istep) => { + const hasAttribs = isPlainObject(x[1]); + let attribs = hasAttribs ? Object.keys(x[1]) : []; + res += `${spaces(indent)}["${x[0]}"`; + if (hasAttribs) { + res += ", "; + res = format(x[1], res, indent + istep, istep); + } + // single line if none or only single child + // and if max. 1 CSS prop + if (x.length === (hasAttribs ? 3 : 2) && + attribs.length < 2 && + attribs[0] !== "style" && + classify(peek(x)) === DEFAULT) { + return format(peek(x), res += ", ", 0, istep) + "]"; + } + // default format if more children + for (let i = hasAttribs ? 2 : 1; i < x.length; i++) { + res += ",\n"; + res = format(x[i], res, indent + istep, istep); + } + res += "]"; + return res; +}); + +// implementation for object values (i.e. attributes in this case) +format.add("obj", (x, res, indent, istep) => { + const keys = Object.keys(x); + if (keys.length === 1 && + (keys[0] !== "style" || Object.keys(x.style).length == 1)) { + res += `{ ${formatPair(x, keys[0], 0, istep)} }`; + } else { + const outer = spaces(indent); + res += `\n${outer}{\n`; + for (let k in x) { + res += formatPair(x, k, indent + istep, istep) + ",\n"; + } + res += outer + "}"; + } + return res; +}); + +// implementation for other values +format.add(DEFAULT, (x, res, indent, istep) => + res += spaces(indent) + formatVal(x, indent, istep)); + +// hdom UI root component receives tuple of xml & formatted hiccup +// strings. defined as closure purely for demonstration purposes and to +// avoid app using global vars +const app = (src: Stream) => + ([xml, hiccup]: string[]) => + ["div.flex", + ["div", + ["h3", "XML/HTML source", + ["small.fw1.ml2", "(must be well formed!)"]], + ["textarea.mr2.f7.code.bg-light-yellow", + { + cols: 72, + rows: 25, + autofocus: true, + onkeydown: (e: KeyboardEvent) => { + // override tab to insert spaces at edit pos + if (e.key === "Tab") { + e.preventDefault(); + src.next( + splice(xml, spaces(4), (e.target).selectionStart) + ); + } + }, + // emitting a new value to the stream will + // re-trigger UI update + oninput: (e) => src.next(e.target.value), + value: xml + }] + ], + ["div", + ["h3", "Parsed Hiccup / JSON"], + ["textarea.f7.code", + { + cols: 72, + rows: 25, + disabled: true, + value: hiccup + }, + ] ] - ] - ]; - -const src = stream() - .transform( - multiplex( - map(identity), - comp( - map(parseXML), - map(transformTree) - ) - ), - map(app), - updateDOM() - ); + ]; + +// create a stream which transforms input values (xml strings) parses, +// transforms and formats them and then forms a tuple of: +// `[orig, formatted]` to pass to the root component function and +// finally updates the DOM +const src = stream(); +src.transform( + multiplex( + map(identity), + comp( + map(parseXML), + map(transformTree), + map((tree) => format(tree, "", 0, 4)) + ) + ), + map(app(src)), + updateDOM() +); +// seed input and kick off UI/app src.next(` foo +

+ HTML & Hiccup walk into a bar... +

`); +// ParcelJS HMR handling if (process.env.NODE_ENV !== "production") { const hot = (module).hot; hot && hot.dispose(() => src.done()); From 04872dbe30d6c521c59ebaef57acb61b9cd0ae40 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 14:31:00 +0100 Subject: [PATCH 17/77] Publish - @thi.ng/associative@0.6.10 - @thi.ng/cache@0.2.27 - @thi.ng/csp@0.3.66 - @thi.ng/dcons@1.1.10 - @thi.ng/dgraph@0.2.22 - @thi.ng/hdom-components@2.2.9 - @thi.ng/hiccup-css@0.2.25 - @thi.ng/iges@0.2.15 - @thi.ng/iterators@4.1.31 - @thi.ng/range-coder@0.1.15 - @thi.ng/rstream-csp@0.1.111 - @thi.ng/rstream-dot@0.2.50 - @thi.ng/rstream-gestures@0.5.12 - @thi.ng/rstream-graph@2.1.36 - @thi.ng/rstream-log@1.0.62 - @thi.ng/rstream-query@0.3.49 - @thi.ng/rstream@1.13.4 - @thi.ng/sax@0.5.0 - @thi.ng/strings@0.5.0 - @thi.ng/transducers-fsm@0.2.23 - @thi.ng/transducers-hdom@1.1.5 - @thi.ng/transducers-stats@0.4.10 - @thi.ng/transducers@2.1.5 --- packages/associative/CHANGELOG.md | 9 +++++++++ packages/associative/package.json | 6 +++--- packages/cache/CHANGELOG.md | 9 +++++++++ packages/cache/package.json | 6 +++--- packages/csp/CHANGELOG.md | 9 +++++++++ packages/csp/package.json | 6 +++--- packages/dcons/CHANGELOG.md | 9 +++++++++ packages/dcons/package.json | 4 ++-- packages/dgraph/CHANGELOG.md | 9 +++++++++ packages/dgraph/package.json | 6 +++--- packages/hdom-components/CHANGELOG.md | 9 +++++++++ packages/hdom-components/package.json | 4 ++-- packages/hiccup-css/CHANGELOG.md | 9 +++++++++ packages/hiccup-css/package.json | 4 ++-- packages/iges/CHANGELOG.md | 9 +++++++++ packages/iges/package.json | 6 +++--- packages/iterators/CHANGELOG.md | 9 +++++++++ packages/iterators/package.json | 4 ++-- packages/range-coder/CHANGELOG.md | 9 +++++++++ packages/range-coder/package.json | 4 ++-- packages/rstream-csp/CHANGELOG.md | 9 +++++++++ packages/rstream-csp/package.json | 6 +++--- packages/rstream-dot/CHANGELOG.md | 9 +++++++++ packages/rstream-dot/package.json | 4 ++-- packages/rstream-gestures/CHANGELOG.md | 9 +++++++++ packages/rstream-gestures/package.json | 6 +++--- packages/rstream-graph/CHANGELOG.md | 9 +++++++++ packages/rstream-graph/package.json | 6 +++--- packages/rstream-log/CHANGELOG.md | 9 +++++++++ packages/rstream-log/package.json | 6 +++--- packages/rstream-query/CHANGELOG.md | 9 +++++++++ packages/rstream-query/package.json | 10 +++++----- packages/rstream/CHANGELOG.md | 9 +++++++++ packages/rstream/package.json | 6 +++--- packages/sax/CHANGELOG.md | 12 ++++++++++++ packages/sax/package.json | 6 +++--- packages/strings/CHANGELOG.md | 12 ++++++++++++ packages/strings/package.json | 4 ++-- packages/transducers-fsm/CHANGELOG.md | 9 +++++++++ packages/transducers-fsm/package.json | 4 ++-- packages/transducers-hdom/CHANGELOG.md | 9 +++++++++ packages/transducers-hdom/package.json | 4 ++-- packages/transducers-stats/CHANGELOG.md | 9 +++++++++ packages/transducers-stats/package.json | 6 +++--- packages/transducers/CHANGELOG.md | 9 +++++++++ packages/transducers/package.json | 4 ++-- 46 files changed, 274 insertions(+), 61 deletions(-) diff --git a/packages/associative/CHANGELOG.md b/packages/associative/CHANGELOG.md index 358d46d94a..00d9945344 100644 --- a/packages/associative/CHANGELOG.md +++ b/packages/associative/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.6.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.9...@thi.ng/associative@0.6.10) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/associative + + + + + ## [0.6.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.8...@thi.ng/associative@0.6.9) (2018-09-24) diff --git a/packages/associative/package.json b/packages/associative/package.json index 6d2103739f..48b90ff347 100644 --- a/packages/associative/package.json +++ b/packages/associative/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/associative", - "version": "0.6.9", + "version": "0.6.10", "description": "Alternative Set & Map data type implementations with customizable equality semantics & supporting operations", "main": "./index.js", "typings": "./index.d.ts", @@ -31,10 +31,10 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/compare": "^0.1.9", - "@thi.ng/dcons": "^1.1.9", + "@thi.ng/dcons": "^1.1.10", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "data structures", diff --git a/packages/cache/CHANGELOG.md b/packages/cache/CHANGELOG.md index d9cc1a1fdf..f862bf5eb0 100644 --- a/packages/cache/CHANGELOG.md +++ b/packages/cache/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.27](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.26...@thi.ng/cache@0.2.27) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/cache + + + + + ## [0.2.26](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.25...@thi.ng/cache@0.2.26) (2018-09-24) diff --git a/packages/cache/package.json b/packages/cache/package.json index 82c4227a67..8ddb2218c3 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/cache", - "version": "0.2.26", + "version": "0.2.27", "description": "In-memory cache implementations with ES6 Map-like API and different eviction strategies", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.9", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/dcons": "^1.1.10", + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "cache", diff --git a/packages/csp/CHANGELOG.md b/packages/csp/CHANGELOG.md index 8dfd32de4f..f62d1ab808 100644 --- a/packages/csp/CHANGELOG.md +++ b/packages/csp/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.66](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.65...@thi.ng/csp@0.3.66) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/csp + + + + + ## [0.3.65](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.64...@thi.ng/csp@0.3.65) (2018-09-24) diff --git a/packages/csp/package.json b/packages/csp/package.json index 5ec3a7f4d9..2fa4d1388d 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/csp", - "version": "0.3.65", + "version": "0.3.66", "description": "ES6 promise based CSP implementation", "main": "./index.js", "typings": "./index.d.ts", @@ -34,9 +34,9 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", - "@thi.ng/dcons": "^1.1.9", + "@thi.ng/dcons": "^1.1.10", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "async", diff --git a/packages/dcons/CHANGELOG.md b/packages/dcons/CHANGELOG.md index c28b236145..03ef0f80ea 100644 --- a/packages/dcons/CHANGELOG.md +++ b/packages/dcons/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.9...@thi.ng/dcons@1.1.10) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/dcons + + + + + ## [1.1.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.8...@thi.ng/dcons@1.1.9) (2018-09-24) diff --git a/packages/dcons/package.json b/packages/dcons/package.json index 2d3521ce78..e5bd0c1645 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dcons", - "version": "1.1.9", + "version": "1.1.10", "description": "Comprehensive doubly linked list structure w/ iterator support", "main": "./index.js", "typings": "./index.d.ts", @@ -33,7 +33,7 @@ "@thi.ng/compare": "^0.1.9", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "datastructure", diff --git a/packages/dgraph/CHANGELOG.md b/packages/dgraph/CHANGELOG.md index f6bad146f4..a2735a52c8 100644 --- a/packages/dgraph/CHANGELOG.md +++ b/packages/dgraph/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.22](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.21...@thi.ng/dgraph@0.2.22) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/dgraph + + + + + ## [0.2.21](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.20...@thi.ng/dgraph@0.2.21) (2018-09-24) diff --git a/packages/dgraph/package.json b/packages/dgraph/package.json index 75ec7dcad2..d86eac92ff 100644 --- a/packages/dgraph/package.json +++ b/packages/dgraph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dgraph", - "version": "0.2.21", + "version": "0.2.22", "description": "Type-agnostic directed acyclic graph (DAG) & graph operations", "main": "./index.js", "typings": "./index.d.ts", @@ -29,10 +29,10 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.9", + "@thi.ng/associative": "^0.6.10", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "data structure", diff --git a/packages/hdom-components/CHANGELOG.md b/packages/hdom-components/CHANGELOG.md index dc06cac56f..b090a087fb 100644 --- a/packages/hdom-components/CHANGELOG.md +++ b/packages/hdom-components/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.2.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.8...@thi.ng/hdom-components@2.2.9) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/hdom-components + + + + + ## [2.2.8](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.7...@thi.ng/hdom-components@2.2.8) (2018-09-24) diff --git a/packages/hdom-components/package.json b/packages/hdom-components/package.json index 9416639010..86c170bf15 100644 --- a/packages/hdom-components/package.json +++ b/packages/hdom-components/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-components", - "version": "2.2.8", + "version": "2.2.9", "description": "Raw, skinnable UI & SVG components for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -30,7 +30,7 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", - "@thi.ng/transducers": "^2.1.4", + "@thi.ng/transducers": "^2.1.5", "@types/webgl2": "^0.0.4" }, "keywords": [ diff --git a/packages/hiccup-css/CHANGELOG.md b/packages/hiccup-css/CHANGELOG.md index 0ad51bcb49..cfaca52bb6 100644 --- a/packages/hiccup-css/CHANGELOG.md +++ b/packages/hiccup-css/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.25](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.24...@thi.ng/hiccup-css@0.2.25) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/hiccup-css + + + + + ## [0.2.24](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.23...@thi.ng/hiccup-css@0.2.24) (2018-09-24) diff --git a/packages/hiccup-css/package.json b/packages/hiccup-css/package.json index 1e0e1e2eae..1cda2dcf36 100644 --- a/packages/hiccup-css/package.json +++ b/packages/hiccup-css/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-css", - "version": "0.2.24", + "version": "0.2.25", "description": "CSS from nested JS data structures", "main": "./index.js", "typings": "./index.d.ts", @@ -31,7 +31,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "clojure", diff --git a/packages/iges/CHANGELOG.md b/packages/iges/CHANGELOG.md index aecfc68775..d0697d25e2 100644 --- a/packages/iges/CHANGELOG.md +++ b/packages/iges/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.15](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.14...@thi.ng/iges@0.2.15) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/iges + + + + + ## [0.2.14](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.13...@thi.ng/iges@0.2.14) (2018-09-24) diff --git a/packages/iges/package.json b/packages/iges/package.json index 2f9b29dc08..4e0e9bf2f4 100644 --- a/packages/iges/package.json +++ b/packages/iges/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iges", - "version": "0.2.14", + "version": "0.2.15", "description": "IGES 5.3 serializer for (currently only) polygonal geometry, both open & closed", "main": "./index.js", "typings": "./index.d.ts", @@ -30,8 +30,8 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/defmulti": "^0.3.11", - "@thi.ng/strings": "^0.4.3", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/strings": "^0.5.0", + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "CAD", diff --git a/packages/iterators/CHANGELOG.md b/packages/iterators/CHANGELOG.md index aa1033d428..71c4301752 100644 --- a/packages/iterators/CHANGELOG.md +++ b/packages/iterators/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [4.1.31](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.30...@thi.ng/iterators@4.1.31) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/iterators + + + + + ## [4.1.30](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.29...@thi.ng/iterators@4.1.30) (2018-09-24) diff --git a/packages/iterators/package.json b/packages/iterators/package.json index 1db138610e..6d6c81ec8e 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iterators", - "version": "4.1.30", + "version": "4.1.31", "description": "clojure.core inspired, composable ES6 iterators & generators", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.9", + "@thi.ng/dcons": "^1.1.10", "@thi.ng/errors": "^0.1.9" }, "keywords": [ diff --git a/packages/range-coder/CHANGELOG.md b/packages/range-coder/CHANGELOG.md index 9e5ac527b5..c57fd489d3 100644 --- a/packages/range-coder/CHANGELOG.md +++ b/packages/range-coder/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.15](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.14...@thi.ng/range-coder@0.1.15) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/range-coder + + + + + ## [0.1.14](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.13...@thi.ng/range-coder@0.1.14) (2018-09-24) diff --git a/packages/range-coder/package.json b/packages/range-coder/package.json index c5a7db64f9..f06fd6fdee 100644 --- a/packages/range-coder/package.json +++ b/packages/range-coder/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/range-coder", - "version": "0.1.14", + "version": "0.1.15", "description": "Binary data range encoder / decoder", "main": "./index.js", "typings": "./index.d.ts", @@ -20,7 +20,7 @@ "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" }, "devDependencies": { - "@thi.ng/transducers": "^2.1.4", + "@thi.ng/transducers": "^2.1.5", "@types/mocha": "^5.2.5", "@types/node": "^10.5.5", "mocha": "^5.2.0", diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index b52032fe68..3d629df369 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.111](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.110...@thi.ng/rstream-csp@0.1.111) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/rstream-csp + + + + + ## [0.1.110](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.109...@thi.ng/rstream-csp@0.1.110) (2018-09-24) diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 847d07d3fa..49f5c3d71b 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "0.1.110", + "version": "0.1.111", "description": "@thi.ng/csp bridge module for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/csp": "^0.3.65", - "@thi.ng/rstream": "^1.13.3" + "@thi.ng/csp": "^0.3.66", + "@thi.ng/rstream": "^1.13.4" }, "keywords": [ "bridge", diff --git a/packages/rstream-dot/CHANGELOG.md b/packages/rstream-dot/CHANGELOG.md index 25adb475b6..404a291e97 100644 --- a/packages/rstream-dot/CHANGELOG.md +++ b/packages/rstream-dot/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.50](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.49...@thi.ng/rstream-dot@0.2.50) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/rstream-dot + + + + + ## [0.2.49](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.48...@thi.ng/rstream-dot@0.2.49) (2018-09-24) diff --git a/packages/rstream-dot/package.json b/packages/rstream-dot/package.json index 41e6c6c08c..a588c4dd96 100644 --- a/packages/rstream-dot/package.json +++ b/packages/rstream-dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-dot", - "version": "0.2.49", + "version": "0.2.50", "description": "Graphviz DOT conversion of @thi.ng/rstream dataflow graph topologies", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/rstream": "^1.13.3" + "@thi.ng/rstream": "^1.13.4" }, "keywords": [ "conversion", diff --git a/packages/rstream-gestures/CHANGELOG.md b/packages/rstream-gestures/CHANGELOG.md index 1bdd106ead..9a5e9ee663 100644 --- a/packages/rstream-gestures/CHANGELOG.md +++ b/packages/rstream-gestures/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.5.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.11...@thi.ng/rstream-gestures@0.5.12) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/rstream-gestures + + + + + ## [0.5.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.10...@thi.ng/rstream-gestures@0.5.11) (2018-09-24) diff --git a/packages/rstream-gestures/package.json b/packages/rstream-gestures/package.json index 93bdbc7c92..3bc4aec389 100644 --- a/packages/rstream-gestures/package.json +++ b/packages/rstream-gestures/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-gestures", - "version": "0.5.11", + "version": "0.5.12", "description": "Unified mouse, mouse wheel & single-touch event stream abstraction", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/rstream": "^1.13.3", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/rstream": "^1.13.4", + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "dataflow", diff --git a/packages/rstream-graph/CHANGELOG.md b/packages/rstream-graph/CHANGELOG.md index 81595f3167..0c6ea542a0 100644 --- a/packages/rstream-graph/CHANGELOG.md +++ b/packages/rstream-graph/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.1.36](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.35...@thi.ng/rstream-graph@2.1.36) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/rstream-graph + + + + + ## [2.1.35](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.34...@thi.ng/rstream-graph@2.1.35) (2018-09-24) diff --git a/packages/rstream-graph/package.json b/packages/rstream-graph/package.json index 0404b53921..2a772bebe6 100644 --- a/packages/rstream-graph/package.json +++ b/packages/rstream-graph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-graph", - "version": "2.1.35", + "version": "2.1.36", "description": "Declarative dataflow graph construction for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -33,8 +33,8 @@ "@thi.ng/errors": "^0.1.9", "@thi.ng/paths": "^1.6.3", "@thi.ng/resolve-map": "^3.0.13", - "@thi.ng/rstream": "^1.13.3", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/rstream": "^1.13.4", + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "compute", diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index 9c1fd797c6..9a013b20e3 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.0.62](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.61...@thi.ng/rstream-log@1.0.62) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/rstream-log + + + + + ## [1.0.61](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.60...@thi.ng/rstream-log@1.0.61) (2018-09-24) diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index 5341d9a08a..285f08d365 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "1.0.61", + "version": "1.0.62", "description": "Structured, multilevel & hierarchical loggers based on @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -31,8 +31,8 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.3", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/rstream": "^1.13.4", + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "ES6", diff --git a/packages/rstream-query/CHANGELOG.md b/packages/rstream-query/CHANGELOG.md index be6723f0cd..4f8071df5b 100644 --- a/packages/rstream-query/CHANGELOG.md +++ b/packages/rstream-query/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.49](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.48...@thi.ng/rstream-query@0.3.49) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/rstream-query + + + + + ## [0.3.48](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.47...@thi.ng/rstream-query@0.3.48) (2018-09-24) diff --git a/packages/rstream-query/package.json b/packages/rstream-query/package.json index 84c6815027..bb00931ad5 100644 --- a/packages/rstream-query/package.json +++ b/packages/rstream-query/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-query", - "version": "0.3.48", + "version": "0.3.49", "description": "@thi.ng/rstream based triple store & reactive query engine", "main": "./index.js", "typings": "./index.d.ts", @@ -29,13 +29,13 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.9", + "@thi.ng/associative": "^0.6.10", "@thi.ng/checks": "^1.5.11", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.3", - "@thi.ng/rstream-dot": "^0.2.49", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/rstream": "^1.13.4", + "@thi.ng/rstream-dot": "^0.2.50", + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "dataflow", diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index 79ebaa91e4..f2dcf24d34 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.13.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.3...@thi.ng/rstream@1.13.4) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/rstream + + + + + ## [1.13.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.2...@thi.ng/rstream@1.13.3) (2018-09-24) diff --git a/packages/rstream/package.json b/packages/rstream/package.json index 0b8549075f..6f0d9f8df6 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "1.13.3", + "version": "1.13.4", "description": "Reactive multi-tap streams, dataflow & transformation pipeline constructs", "main": "./index.js", "typings": "./index.d.ts", @@ -29,12 +29,12 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.9", + "@thi.ng/associative": "^0.6.10", "@thi.ng/atom": "^1.5.4", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", "@thi.ng/paths": "^1.6.3", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "datastructure", diff --git a/packages/sax/CHANGELOG.md b/packages/sax/CHANGELOG.md index 4d88b168df..4a1cd2086d 100644 --- a/packages/sax/CHANGELOG.md +++ b/packages/sax/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [0.5.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.4.1...@thi.ng/sax@0.5.0) (2018-09-25) + + +### Features + +* **sax:** add opt support for boolean attribs, add tests ([5119b67](https://github.com/thi-ng/umbrella/commit/5119b67)) + + + + + ## [0.4.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.4.0...@thi.ng/sax@0.4.1) (2018-09-24) diff --git a/packages/sax/package.json b/packages/sax/package.json index dbab0d948c..780c2e8c0f 100644 --- a/packages/sax/package.json +++ b/packages/sax/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/sax", - "version": "0.4.1", + "version": "0.5.0", "description": "Transducer-based, SAX-like, non-validating, speedy & tiny XML parser", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.4", - "@thi.ng/transducers-fsm": "^0.2.22" + "@thi.ng/transducers": "^2.1.5", + "@thi.ng/transducers-fsm": "^0.2.23" }, "keywords": [ "ES6", diff --git a/packages/strings/CHANGELOG.md b/packages/strings/CHANGELOG.md index e3b892efbc..2b4afb89e7 100644 --- a/packages/strings/CHANGELOG.md +++ b/packages/strings/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [0.5.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/strings@0.4.3...@thi.ng/strings@0.5.0) (2018-09-25) + + +### Features + +* **strings:** add splice(), refactor repeat(), add tests ([0cce048](https://github.com/thi-ng/umbrella/commit/0cce048)) + + + + + ## [0.4.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/strings@0.4.2...@thi.ng/strings@0.4.3) (2018-09-24) diff --git a/packages/strings/package.json b/packages/strings/package.json index 8078e5a7ba..0d1b119eab 100644 --- a/packages/strings/package.json +++ b/packages/strings/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/strings", - "version": "0.4.3", + "version": "0.5.0", "description": "Various string formatting & utility functions", "main": "./index.js", "typings": "./index.d.ts", @@ -44,4 +44,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/transducers-fsm/CHANGELOG.md b/packages/transducers-fsm/CHANGELOG.md index 2a8c543731..0b23131469 100644 --- a/packages/transducers-fsm/CHANGELOG.md +++ b/packages/transducers-fsm/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.23](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.22...@thi.ng/transducers-fsm@0.2.23) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/transducers-fsm + + + + + ## [0.2.22](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.21...@thi.ng/transducers-fsm@0.2.22) (2018-09-24) diff --git a/packages/transducers-fsm/package.json b/packages/transducers-fsm/package.json index 3a8341468e..1059becc55 100644 --- a/packages/transducers-fsm/package.json +++ b/packages/transducers-fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-fsm", - "version": "0.2.22", + "version": "0.2.23", "description": "Transducer-based Finite State Machine transformer", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "ES6", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index 07550063d9..454359f095 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.4...@thi.ng/transducers-hdom@1.1.5) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [1.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.3...@thi.ng/transducers-hdom@1.1.4) (2018-09-24) diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index cfab8f1b11..bb0db84c08 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "1.1.4", + "version": "1.1.5", "description": "Transducer based UI updater for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -30,7 +30,7 @@ "dependencies": { "@thi.ng/checks": "^1.5.11", "@thi.ng/hdom": "^5.0.3", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "diff", diff --git a/packages/transducers-stats/CHANGELOG.md b/packages/transducers-stats/CHANGELOG.md index 52dd6c24c9..6891278afd 100644 --- a/packages/transducers-stats/CHANGELOG.md +++ b/packages/transducers-stats/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.4.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.9...@thi.ng/transducers-stats@0.4.10) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/transducers-stats + + + + + ## [0.4.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.8...@thi.ng/transducers-stats@0.4.9) (2018-09-24) diff --git a/packages/transducers-stats/package.json b/packages/transducers-stats/package.json index b0944da9c7..b73a717c2e 100644 --- a/packages/transducers-stats/package.json +++ b/packages/transducers-stats/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-stats", - "version": "0.4.9", + "version": "0.4.10", "description": "Transducers for statistical / technical analysis", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/dcons": "^1.1.9", + "@thi.ng/dcons": "^1.1.10", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.4" + "@thi.ng/transducers": "^2.1.5" }, "keywords": [ "ES6", diff --git a/packages/transducers/CHANGELOG.md b/packages/transducers/CHANGELOG.md index 79016dbf17..bcced9e770 100644 --- a/packages/transducers/CHANGELOG.md +++ b/packages/transducers/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.4...@thi.ng/transducers@2.1.5) (2018-09-25) + +**Note:** Version bump only for package @thi.ng/transducers + + + + + ## [2.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.3...@thi.ng/transducers@2.1.4) (2018-09-24) diff --git a/packages/transducers/package.json b/packages/transducers/package.json index 605f7adf0b..9deb5762ec 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers", - "version": "2.1.4", + "version": "2.1.5", "description": "Lightweight transducer implementations for ES6 / TypeScript", "main": "./index.js", "typings": "./index.d.ts", @@ -34,7 +34,7 @@ "@thi.ng/compose": "^0.1.4", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/strings": "^0.4.3" + "@thi.ng/strings": "^0.5.0" }, "keywords": [ "ES6", From a169d2dfe618ae7001e40e38c710aa848615ca42 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 14:35:36 +0100 Subject: [PATCH 18/77] fix(examples): add missing index.html (#46) --- examples/commit-table-ssr/index.html | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 examples/commit-table-ssr/index.html diff --git a/examples/commit-table-ssr/index.html b/examples/commit-table-ssr/index.html new file mode 100644 index 0000000000..868c182c64 --- /dev/null +++ b/examples/commit-table-ssr/index.html @@ -0,0 +1,17 @@ + + + + + + + + + commit-table-hdom + + + +
+ + + + \ No newline at end of file From b8a93ea83338c9e97fb78b8d9bf2a8ce23eb9fae Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 15:08:50 +0100 Subject: [PATCH 19/77] fix(examples): add null check & parseAttrib() in transformCSS() --- examples/xml-converter/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index 86950425ac..1aa21ed6db 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -40,7 +40,7 @@ const transformCSS = (css: string) => css.split(";").reduce( (acc, p) => { const [k, v] = p.split(":"); - acc[k.trim()] = v.trim(); + (v != null) && (acc[k.trim()] = parseAttrib([k, v.trim()])[1]); return acc; }, {} From 823d828da193ceb72d7dc8a50dcc7e4c801bdb8a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 17:13:32 +0100 Subject: [PATCH 20/77] fix(transducers): fix matchLast(), fix & update return match*() types - use iterator() instead of iterator1() for matchLast() - fix return type decls for both matchFirst() / matchLast() - update doc strings --- packages/transducers/src/xform/match-first.ts | 20 +++++++++++++++-- packages/transducers/src/xform/match-last.ts | 22 ++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/packages/transducers/src/xform/match-first.ts b/packages/transducers/src/xform/match-first.ts index ac28647196..467364ec7e 100644 --- a/packages/transducers/src/xform/match-first.ts +++ b/packages/transducers/src/xform/match-first.ts @@ -14,12 +14,28 @@ import { take } from "./take"; * ``` * * Yields none or only the first value which passed the predicate check - * and then causes early termination. + * and then causes early termination. If `src` input is given, returns + * first match found (or `undefined`). Also see `matchLast()`. + * + * ``` + * matchFirst((x) => x >= 5, [3, 1, 4, 2, 6, 5]) + * // 6 + * + * transduce( + * comp( + * matchFirst((x) => x >= 5), + * map((x) => x * 10) + * ), + * last(), + * [3, 1, 4, 2, 6, 5] + * ) + * // 60 + * ``` * * @param pred predicate function */ export function matchFirst(pred: Predicate): Transducer; -export function matchFirst(pred: Predicate, src: Iterable): IterableIterator; +export function matchFirst(pred: Predicate, src: Iterable): T | undefined; export function matchFirst(pred: Predicate, src?: Iterable): any { return src ? [...iterator1(matchFirst(pred), src)][0] : diff --git a/packages/transducers/src/xform/match-last.ts b/packages/transducers/src/xform/match-last.ts index 0771080a9a..e126d9ba3f 100644 --- a/packages/transducers/src/xform/match-last.ts +++ b/packages/transducers/src/xform/match-last.ts @@ -2,7 +2,7 @@ import { Predicate } from "@thi.ng/api"; import { Transducer } from "../api"; import { comp } from "../func/comp"; -import { iterator1 } from "../iterator"; +import { iterator } from "../iterator"; import { filter } from "./filter"; import { takeLast } from "./take-last"; @@ -14,14 +14,30 @@ import { takeLast } from "./take-last"; * ``` * * Yields none or only the last value which passed the predicate check. + * If `src` input is given, returns last match found (or `undefined`). + * + * ``` + * matchLast((x) => x >= 5, [3, 1, 6, 5, 4, 2]) + * // 5 + * + * transduce( + * comp( + * matchLast((x) => x >= 5), + * map((x) => x * 10) + * ), + * last(), + * [3, 1, 4, 2, 6, 5] + * ) + * // 50 + * ``` * * @param pred predicate function * @param src */ export function matchLast(pred: Predicate): Transducer; -export function matchLast(pred: Predicate, src: Iterable): IterableIterator; +export function matchLast(pred: Predicate, src: Iterable): T | undefined; export function matchLast(pred: Predicate, src?: Iterable): any { return src ? - iterator1(matchLast(pred), src) : + [...iterator(matchLast(pred), src)][0] : comp(filter(pred), takeLast(1)); } From ad1bac8f71ff7c00f712763cba3b555fbc6f6f51 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 18:07:59 +0100 Subject: [PATCH 21/77] refactor(examples): refactor hiccup formatter, minor fixes --- examples/xml-converter/index.html | 1 + examples/xml-converter/src/format.ts | 100 ++++++++++++++++++++++++ examples/xml-converter/src/index.ts | 110 +++++---------------------- 3 files changed, 119 insertions(+), 92 deletions(-) create mode 100644 examples/xml-converter/src/format.ts diff --git a/examples/xml-converter/index.html b/examples/xml-converter/index.html index 274ce607a5..d881ac7db2 100644 --- a/examples/xml-converter/index.html +++ b/examples/xml-converter/index.html @@ -7,6 +7,7 @@ xml-converter + diff --git a/examples/xml-converter/src/format.ts b/examples/xml-converter/src/format.ts new file mode 100644 index 0000000000..e01ea07f32 --- /dev/null +++ b/examples/xml-converter/src/format.ts @@ -0,0 +1,100 @@ +import { isArray } from "@thi.ng/checks/is-array"; +import { isBoolean } from "@thi.ng/checks/is-boolean"; +import { isNumber } from "@thi.ng/checks/is-number"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { DEFAULT, defmulti } from "@thi.ng/defmulti"; +import { repeat } from "@thi.ng/strings/repeat"; +import { peek } from "@thi.ng/transducers/func/peek"; + +interface FormatterState { + indent: number; + tabSize: number; + prefix?: string; +} + +// memoized indentations +export const spaces = (n: number) => repeat(" ", n); + +// creates new state with deeper indentation +const indentState = (state: FormatterState): FormatterState => + ({ ...state, indent: state.indent + state.tabSize }); + +// dispatch helper function for the `format` defmulti below +const classify = (_: FormatterState, x: any) => + isArray(x) ? "array" : isPlainObject(x) ? "obj" : DEFAULT; + +// wraps attrib name in quotes if needed +const formatAttrib = (x: string) => + /^[a-z]+$/i.test(x) ? x : `"${x}"`; + +// attrib or body value formatter +const formatVal = (state: FormatterState, x: any, indent = true) => + isNumber(x) || isBoolean(x) ? + x : + isPlainObject(x) ? + format(indent ? indentState(state) : state, x, "") : + `"${x}"`; + +// attrib key-value pair formatter w/ indentation +const formatPair = (state: FormatterState, x: any, k: string) => + `${spaces(state.indent)}${formatAttrib(k)}: ${formatVal(state, x[k], k !== "style")}`; + +// multiple-dispatch function to format the transformed tree (hiccup +// structure) into a more compact & legible format than produced by +// standard: `JSON.stringify(tree, null, 4)` +export const format = defmulti(classify); + +// implementation for array values +format.add("array", (state, x, res) => { + const hasAttribs = isPlainObject(x[1]); + let attribs = hasAttribs ? Object.keys(x[1]) : []; + res += `${spaces(state.indent)}["${x[0]}"`; + if (hasAttribs) { + res += ", "; + res = format( + { + ...indentState(state), + prefix: `\n${spaces(state.indent + state.tabSize)}` + }, + x[1], res + ); + } + // single line if none or only single child + // and if no `style` attrib + if (x.length === (hasAttribs ? 3 : 2) && + attribs.length < 2 && + attribs[0] !== "style" && + classify(state, peek(x)) === DEFAULT) { + return format({ ...state, indent: 0 }, peek(x), res += ", ") + "]"; + } + // default format if more children + for (let i = hasAttribs ? 2 : 1; i < x.length; i++) { + res += ",\n"; + res = format(indentState(state), x[i], res); + } + res += "]"; + return res; +}); + +// implementation for object values (i.e. attributes in this case) +format.add("obj", (state, x, res) => { + const keys = Object.keys(x); + if (keys.length === 0) { + res += `{}`; + } else if (keys.length === 1 && + (keys[0] !== "style" || Object.keys(x.style).length < 2)) { + res += `{ ${formatPair({ ...state, indent: 0 }, x, keys[0])} }`; + } else { + const outer = spaces(state.indent); + res += `${state.prefix}{\n`; + for (let k in x) { + res += formatPair(k === "style" ? { ...indentState(state), prefix: "" } : indentState(state), x, k) + ",\n"; + } + res += outer + "}"; + } + return res; +}); + +// implementation for other values +format.add(DEFAULT, (state, x, res) => + res += spaces(state.indent) + formatVal(state, x)); diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index 1aa21ed6db..8cbbe5978a 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -1,17 +1,16 @@ -import { isArray } from "@thi.ng/checks/is-array"; -import { isBoolean } from "@thi.ng/checks/is-boolean"; -import { isNumber } from "@thi.ng/checks/is-number"; -import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { DEFAULT, defmulti } from "@thi.ng/defmulti"; +import { isString } from "@thi.ng/checks/is-string"; import { stream, Stream } from "@thi.ng/rstream/stream"; -import { parse, Type } from "@thi.ng/sax"; -import { splice } from "@thi.ng/strings/splice"; +import { + parse, + ParseElement, + ParseEvent, + Type +} from "@thi.ng/sax"; import { maybeParseFloat } from "@thi.ng/strings/parse"; -import { repeat } from "@thi.ng/strings/repeat"; +import { splice } from "@thi.ng/strings/splice"; import { updateDOM } from "@thi.ng/transducers-hdom"; import { comp } from "@thi.ng/transducers/func/comp"; import { identity } from "@thi.ng/transducers/func/identity"; -import { peek } from "@thi.ng/transducers/func/peek"; import { pairs } from "@thi.ng/transducers/iter/pairs"; import { assocObj } from "@thi.ng/transducers/rfn/assoc-obj"; import { last } from "@thi.ng/transducers/rfn/last"; @@ -20,8 +19,9 @@ import { transduce } from "@thi.ng/transducers/transduce"; import { filter } from "@thi.ng/transducers/xform/filter"; import { map } from "@thi.ng/transducers/xform/map"; import { multiplex } from "@thi.ng/transducers/xform/multiplex"; +import { format, spaces } from "./format"; -// parses given XMLish string using @thi.ng/sax transducer into a tree +// parses given XMLish string using @thi.ng/sax transducer into a // sequence of parse events. we only care about the final (or error) // event, which will be related to the final close tag and contains the // entire tree @@ -49,7 +49,7 @@ const transformCSS = (css: string) => // takes attrib key-value pair and attempts to coerce / transform its // value. returns updated pair. const parseAttrib = ([k, v]: string[]) => - k === "style" ? + k === "style" && isString(v) ? [k, transformCSS(v)] : v === "true" ? [k, true] : @@ -72,16 +72,17 @@ const transformTag = (tag: string, attribs: any) => { tag += "#" + attribs.id; delete attribs.id; } - if (attribs.class) { - tag += "." + attribs.class.replace(/\s+/g, "."); + if (isString(attribs.class)) { + const classes = attribs.class.replace(/\s+/g, "."); + classes.length && (tag += "." + classes); delete attribs.class; } return tag; }; // recursively transforms entire parse tree -const transformTree = (tree: any) => { - if (tree.type === Type.ERROR) { +const transformTree = (tree: ParseEvent | ParseElement) => { + if ((tree).type === Type.ERROR) { return ["error", tree.body]; } const attribs = transformAttribs(tree.attribs); @@ -98,81 +99,6 @@ const transformTree = (tree: any) => { return res; }; -// dispatch helper function for the `format` defmulti below -const classify = (x: any) => - isArray(x) ? "array" : isPlainObject(x) ? "obj" : DEFAULT; - -// wraps attrib name in quotes if needed -const formatAttrib = (x: string) => - /^[a-z]+$/i.test(x) ? x : `"${x}"`; - -// attrib or body value formatter -const formatVal = (x: any, indent: number, istep: number) => - isNumber(x) || isBoolean(x) ? - x : - isPlainObject(x) ? - format(x, "", indent + istep, istep) : - `"${x}"`; - -// attrib key-value pair formatter w/ indentation -const formatPair = (x: any, k: string, indent: number, istep: number) => - `${spaces(indent)}${formatAttrib(k)}: ${formatVal(x[k], indent, istep)}`; - -// memoized indentations -const spaces = (n: number) => repeat(" ", n); - -// multiply dispatch function to format the transformed tree (hiccup -// structure) into a more compact & legible format than produced by -// standard: `JSON.stringify(tree, null, 4)` -const format = defmulti(classify); - -// implementation for array values -format.add("array", (x, res, indent, istep) => { - const hasAttribs = isPlainObject(x[1]); - let attribs = hasAttribs ? Object.keys(x[1]) : []; - res += `${spaces(indent)}["${x[0]}"`; - if (hasAttribs) { - res += ", "; - res = format(x[1], res, indent + istep, istep); - } - // single line if none or only single child - // and if max. 1 CSS prop - if (x.length === (hasAttribs ? 3 : 2) && - attribs.length < 2 && - attribs[0] !== "style" && - classify(peek(x)) === DEFAULT) { - return format(peek(x), res += ", ", 0, istep) + "]"; - } - // default format if more children - for (let i = hasAttribs ? 2 : 1; i < x.length; i++) { - res += ",\n"; - res = format(x[i], res, indent + istep, istep); - } - res += "]"; - return res; -}); - -// implementation for object values (i.e. attributes in this case) -format.add("obj", (x, res, indent, istep) => { - const keys = Object.keys(x); - if (keys.length === 1 && - (keys[0] !== "style" || Object.keys(x.style).length == 1)) { - res += `{ ${formatPair(x, keys[0], 0, istep)} }`; - } else { - const outer = spaces(indent); - res += `\n${outer}{\n`; - for (let k in x) { - res += formatPair(x, k, indent + istep, istep) + ",\n"; - } - res += outer + "}"; - } - return res; -}); - -// implementation for other values -format.add(DEFAULT, (x, res, indent, istep) => - res += spaces(indent) + formatVal(x, indent, istep)); - // hdom UI root component receives tuple of xml & formatted hiccup // strings. defined as closure purely for demonstration purposes and to // avoid app using global vars @@ -226,7 +152,7 @@ src.transform( comp( map(parseXML), map(transformTree), - map((tree) => format(tree, "", 0, 4)) + map((tree) => format({ indent: 0, tabSize: 4 }, tree, "")) ) ), map(app(src)), @@ -239,7 +165,7 @@ src.next(` foo -

+

HTML & Hiccup walk into a bar...

From 0a49d0a536ab868e44c7fd7b32cfc2e2b9283aaa Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 25 Sep 2018 19:13:41 +0100 Subject: [PATCH 22/77] fix: update .gitignore (fixes #46, fixes #50) --- .gitignore | 1 - examples/commit-table-ssr/.gitignore | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3b7c9023b4..0ff6e4f073 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ examples/hdom-class .DS_Store tachyons.min.css bundle.* -*.html *.log *.tgz *.js diff --git a/examples/commit-table-ssr/.gitignore b/examples/commit-table-ssr/.gitignore index 0c5abcab62..aa37efed9a 100644 --- a/examples/commit-table-ssr/.gitignore +++ b/examples/commit-table-ssr/.gitignore @@ -2,4 +2,5 @@ out node_modules yarn.lock +table.html *.js From 963670217a7a33c5eb9287a623de7ff2129d924a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 26 Sep 2018 16:04:45 +0100 Subject: [PATCH 23/77] docs(hdom): add/update docs (fix #47) --- packages/hdom/README.md | 151 +++++++++++++++++++++++++-------- packages/hdom/src/api.ts | 133 +++++++++++++++++++++++++++-- packages/hdom/src/diff.ts | 33 ++++--- packages/hdom/src/dom.ts | 76 ++++++++++------- packages/hdom/src/normalize.ts | 42 +-------- 5 files changed, 307 insertions(+), 128 deletions(-) diff --git a/packages/hdom/README.md b/packages/hdom/README.md index 344bd23b57..c7bd682676 100644 --- a/packages/hdom/README.md +++ b/packages/hdom/README.md @@ -34,16 +34,18 @@ This project is part of the - [Mouse gesture analysis](#mouse-gesture-analysis) - [Canvas based radial dial input widget](#canvas-based-radial-dial-input-widget) - [SPA with router and event bus](#spa-with-router-and-event-bus) + - [XML/HTML to Hiccup syntax converter](#xmlhtml-to-hiccup-syntax-converter) - [Installation](#installation) - [Dependencies](#dependencies) - [API & Usage](#api--usage) - [start()](#start) - [renderOnce()](#renderonce) - [HDOMOpts config options](#hdomopts-config-options) + - [HDOMImplementation interface](#hdomimplementation-interface) - [normalizeTree()](#normalizetree) - [diffTree()](#difftree) - - [createDOM()](#createdom) - - [hydrateDOM()](#hydratedom) + - [createTree()](#createtree) + - [hydrateTree()](#hydratetree) - [User context](#user-context) - [Behavior control attributes](#behavior-control-attributes) - [Benchmark](#benchmark) @@ -480,7 +482,7 @@ const now = () => new Date().toLocaleString(); ### Iterators -ES6 iteratables are supported out of the box and their use is encouraged +ES6 iterables are supported out of the box and their use is encouraged to avoid the unnecessary allocation of temporary objects caused by chained application of `Array.map()` to transform raw state values into components. However, since iterators can only be consumed once, please @@ -774,6 +776,11 @@ Based on the `create-hdom-app` project scaffolding... [Source](https://github.com/thi-ng/umbrella/tree/master/examples/router-basics) | [Live version](https://demo.thi.ng/umbrella/router-basics/) +### XML/HTML to Hiccup syntax converter + +[Source](https://github.com/thi-ng/umbrella/tree/master/examples/xml-converter) +| [Live version](https://demo.thi.ng/umbrella/xml-converter/) + ## Installation ```bash @@ -866,7 +873,7 @@ update loop. ### renderOnce() -One-off hdom tree conversion & target DOM application. Takes same args +One-off hdom tree conversion & target / DOM application. Takes same args as `start()`, but performs no diffing and only creates or hydrates target (DOM) once. The given tree is first normalized and no further action will be taken, if the normalized result is `null` or `undefined`. @@ -893,11 +900,35 @@ Config options object passed to hdom's `start()`, `renderOnce()` or other discrepancies between the pre-existing DOM and the hdom trees will cause undefined behavior. +### HDOMImplementation interface + +The following functions are the core parts of the `HDOMImplementation` +interface, the abstraction layer used by hdom to support different +targets. + +- [interface definition](https://github.com/thi-ng/umbrella/blob/master/packages/hdom/src/api.ts#L127) +- [default implementation](https://github.com/thi-ng/umbrella/blob/master/packages/hdom/src/default.ts) + ### normalizeTree() -Calling this function is a prerequisite before passing a component tree -to `diffTree()`. Recursively expands given hiccup component tree into -its canonical form: +Normalizes given hdom tree, expands Emmet-style tags, embedded +iterables, component functions, component objects with life cycle +methods and injects `key` attributes for `diffTree()` to later identify +changes in nesting order. During normalization any embedded component +functions are called with the given (optional) user `ctx` object as +first argument. For further details of the default implementation, +please see `normalizeTree()` in `normalize.ts`. + +Implementations MUST check for the presence of the `__impl` control +attribute on each branch. If given, the current implementation MUST +delegate to the `normalizeTree()` method of the specified implementation +and not descent into that branch further itself. + +Furthermore, if (and only if) an element has the `__normalize` control +attrib set to `false`, the normalization of that element's children MUST +be skipped. Calling this function is a prerequisite before passing a +component tree to `diffTree()`. Recursively expands given hiccup +component tree into its canonical form: ```ts ["tag", { attribs }, ...body] @@ -923,42 +954,88 @@ its canonical form: Additionally, unless the `keys` option is explicitly set to false, an unique `key` attribute is created for each node in the tree. This -attribute is used by `diffElement` to determine if a changed node can be +attribute is used by `diffTree` to determine if a changed node can be patched or will need to be moved, replaced or removed. -### diffTree() +In terms of life cycle methods: `render` should ALWAYS return an array +or another function, else the component's `init` or `release` fns will +NOT be able to be called. E.g. If the return value of `render` evaluates +as a string or number, it should be wrapped as `["span", "foo"]` or an +equivalent wrapper node. If no `init` or `release` methods are used, +this requirement is relaxed. -Takes a DOM root element and two hiccup trees, `prev` and `curr`. -Recursively computes diff between both trees and applies any necessary -changes to reflect `curr` tree in real DOM. +See `normalizeElement` (normalize.ts) for further details about the +canonical element form. -For newly added components, calls `init` with created DOM element (plus -user provided context and any other args) for any components with `init` -life cycle method. Likewise, calls `release` on components with -`release` method when the DOM element is removed. - -**Important:** The actual DOM element/subtree given is assumed to -exactly represent the state of the `prev` tree. Since this function does -NOT track the real DOM at all, the resulting changes will result in -potentially undefined behavior if there're discrepancies. - -### createDOM() +### diffTree() -Creates an actual DOM tree from given hiccup component and `parent` -element. Calls `init` with created element (user provided context and -other args) for any components with `init` life cycle method. Returns +Takes an `HDOMOpts` options object, an `HDOMImplementation` and two +normalized hiccup trees, `prev` and `curr`. Recursively computes diff +between both trees and applies any necessary changes to reflect `curr` +tree, based on the differences to `prev`, in target (browser DOM when +using the `DEFAULT_IMPL` implementation). + +All target modification operations are delegated to the given +implementation. `diffTree()` merely manages which elements or attributes +need to be created, updated or removed and this NEVER involves any form +of tracking of the actual underlying target data structure (e.g. the +real browser DOM). hdom in general and `diffTree()` specifically are +stateless. The only state available is that of the two trees given (prev +/ curr). + +Implementations MUST check for the presence of the `__impl` control +attribute on each branch. If given, the current implementation MUST +delegate to the `diffTree()` method of the specified implementation and +not descent into that branch further itself. + +Furthermore, if (and only if) an element has the `__diff` control +attribute set to `false`, then: + +1) Computing the difference between old & new branch MUST be skipped +2) The implementation MUST recursively call any `release` life cycle + methods present anywhere in the current `prev` tree (branch). The + recursive release process itself is implemented by the exported + `releaseDeep()` function in `diff.ts`. Custom implementations are + encouraged to reuse this, since that function also takes care of + handling the `__release` attrib: if the attrib is present and set to + false, `releaseDeep()` will not descend into the branch any further. +3) Call the current implementation's `replaceChild()` method to replace + the old element / branch with the new one. + +### createTree() + +Realizes the given hdom tree in the target below the `parent` node, e.g. +in the case of the browser DOM, creates all required DOM elements +encoded by the given hdom tree. If `parent` is null the result tree +won't be attached to any parent. If `insert` is given, the new elements +will be inserted at given child index. + +For any components with `init` life cycle methods, the implementation +MUST call `init` with the created element, the user provided context +(obtained from `opts`) and any other args. `createTree()` returns the created root element(s) - usually only a single one, but can be an array -of elements, if the provided tree is an iterable. Creates DOM text nodes -for non-component values. Returns `parent` if tree is `null` or -`undefined`. - -### hydrateDOM() - -Takes a DOM root element and normalized hdom tree, then walks tree and -initializes any event listeners and components with lifecycle init -methods. Assumes that an equivalent DOM (minus listeners) already exists -(e.g. generated via SSR) when called. Any other discrepancies between -the pre-existing DOM and the hdom tree will cause undefined behavior. +of elements, if the provided tree is an iterable of multiple roots. The +default implementation creates text nodes for non-component values. +Returns `parent` if tree is `null` or `undefined`. + +Implementations MUST check for the presence of the `__impl` control +attribute on each branch. If given, the current implementation MUST +delegate to the `createTree()` method of the specified implementation +and not descent into that branch further itself. + +### hydrateTree() + +Takes a target root element and normalized hdom tree, then walks tree +and initializes any event listeners and components with life cycle +`init` methods. Assumes that an equivalent "DOM" (minus listeners) +already exists when this function is called. Any other discrepancies +between the pre-existing DOM and the hdom tree might cause undefined +behavior. + +Implementations MUST check for the presence of the `__impl` control +attribute on each branch. If given, the current implementation MUST +delegate to the `hydrateTree()` method of the specified implementation +and not descent into that branch further itself. ## User context diff --git a/packages/hdom/src/api.ts b/packages/hdom/src/api.ts index 09e2358d2f..e37b7340e7 100644 --- a/packages/hdom/src/api.ts +++ b/packages/hdom/src/api.ts @@ -65,6 +65,12 @@ export interface HDOMBehaviorAttribs { * any of its children. */ __release?: boolean; + /** + * Currently only used by thi.ng/hiccup. No relevance for hdom. If + * `false`, the element and its children will be omitted from the + * serialized result. + */ + __serialize?: boolean } export interface ComponentAttribs extends HDOMBehaviorAttribs { @@ -142,6 +148,60 @@ export interface HDOMImplementation { * default implementation, please see `normalizeTree()` in * `normalize.ts`. * + * Implementations MUST check for the presence of the `__impl` + * control attribute on each branch. If given, the current + * implementation MUST delegate to the `normalizeTree()` method of + * the specified implementation and not descent into that branch + * further itself. + * + * Furthermore, if (and only if) an element has the `__normalize` + * control attrib set to `false`, the normalization of that + * element's children MUST be skipped. + * + * Calling this function is a prerequisite before passing a + * component tree to `diffTree()`. Recursively expands given hiccup + * component tree into its canonical form: + * + * ``` + * ["tag", { attribs }, ...body] + * ``` + * + * - resolves Emmet-style tags (e.g. from `div#id.foo.bar`) + * - adds missing attribute objects (and `key` attribs) + * - merges Emmet-style classes with additional `class` attrib + * values (if given), e.g. `["div.foo", { class: "bar" }]` => + * `["div", {class: "bar foo" }]` + * - evaluates embedded functions and replaces them with their + * result + * - calls the `render` life cycle method on component objects and + * uses result + * - consumes iterables and normalizes their individual values + * - calls `deref()` on elements implementing the `IDeref` interface + * and uses returned results + * - calls `toHiccup()` on elements implementing the `IToHiccup` + * interface and uses returned results + * - calls `.toString()` on any other non-component value and by + * default wraps it in `["span", x]`. The only exceptions to this + * are: `button`, `option`, `textarea` and SVG `text` elements, + * for which spans are never created. + * + * Additionally, unless the `keys` option is explicitly set to + * false, an unique `key` attribute is created for each node in the + * tree. This attribute is used by `diffTree` to determine if a + * changed node can be patched or will need to be moved, replaced or + * removed. + * + * In terms of life cycle methods: `render` should ALWAYS return an + * array or another function, else the component's `init` or + * `release` fns will NOT be able to be called. E.g. If the return + * value of `render` evaluates as a string or number, it should be + * wrapped as `["span", "foo"]` or an equivalent wrapper node. If no + * `init` or `release` methods are used, this requirement is + * relaxed. + * + * See `normalizeElement` (normalize.ts) for further details about + * the canonical element form. + * * @param tree * @param opts */ @@ -149,10 +209,24 @@ export interface HDOMImplementation { /** * Realizes the given hdom tree in the target below the `parent` * node, e.g. in the case of the browser DOM, creates all required - * DOM elements encoded by the hdom tree. If `parent` is null the - * result tree won't be attached to any parent. See `createDOM()` - * for further details. If `insert` is given, the new elements will - * be inserted at given child index. + * DOM elements encoded by the given hdom tree. If `parent` is null + * the result tree won't be attached to any parent. If `insert` is + * given, the new elements will be inserted at given child index. + * + * For any components with `init` life cycle methods, the + * implementation MUST call `init` with the created element, the + * user provided context (obtained from `opts`) and any other args. + * `createTree()` returns the created root element(s) - usually only + * a single one, but can be an array of elements, if the provided + * tree is an iterable of multiple roots. The default implementation + * creates text nodes for non-component values. Returns `parent` if + * tree is `null` or `undefined`. + * + * Implementations MUST check for the presence of the `__impl` + * control attribute on each branch. If given, the current + * implementation MUST delegate to the `createTree()` method of the + * specified implementation and not descent into that branch further + * itself. * * @param parent * @param tree @@ -160,6 +234,18 @@ export interface HDOMImplementation { */ createTree(opts: Partial, parent: T, tree: any, insert?: number): T | T[]; /** + * Takes a target root element and normalized hdom tree, then walks + * tree and initializes any event listeners and components with life + * cycle `init` methods. Assumes that an equivalent "DOM" (minus + * listeners) already exists when this function is called. Any other + * discrepancies between the pre-existing DOM and the hdom tree + * might cause undefined behavior. + * + * Implementations MUST check for the presence of the `__impl` + * control attribute on each branch. If given, the current + * implementation MUST delegate to the `hydrateTree()` method of the + * specified implementation and not descent into that branch further + * itself. * * @param opts * @param parent @@ -168,6 +254,42 @@ export interface HDOMImplementation { */ hydrateTree(opts: Partial, parent: T, tree: any, idx?: number); /** + * Takes an `HDOMOpts` options object, an `HDOMImplementation` and + * two normalized hiccup trees, `prev` and `curr`. Recursively + * computes diff between both trees and applies any necessary + * changes to reflect `curr` tree, based on the differences to + * `prev`, in target (browser DOM when using the `DEFAULT_IMPL` + * implementation). + * + * All target modification operations are delegated to the given + * implementation. `diffTree()` merely manages which elements or + * attributes need to be created, updated or removed and this NEVER + * involves any form of tracking of the actual underlying target + * data structure (e.g. the real browser DOM). hdom in general and + * `diffTree()` specifically are stateless. The only state available + * is that of the two trees given (prev / curr). + * + * Implementations MUST check for the presence of the `__impl` + * control attribute on each branch. If given, the current + * implementation MUST delegate to the `diffTree()` method of the + * specified implementation and not descent into that branch further + * itself. + * + * Furthermore, if (and only if) an element has the `__diff` control + * attribute set to `false`, then: + * + * 1) Computing the difference between old & new branch MUST be + * skipped + * 2) The implementation MUST recursively call any `release` life + * cycle methods present anywhere in the current `prev` tree + * (branch). The recursive release process itself is implemented + * by the exported `releaseDeep()` function in `diff.ts`. Custom + * implementations are encouraged to reuse this, since that + * function also takes care of handling the `__release` attrib: + * if the attrib is present and set to false, `releaseDeep()` + * will not descend into the branch any further. + * 3) Call the current implementation's `replaceChild()` method to + * replace the old element / branch with the new one. * * @param opts * @param impl @@ -235,7 +357,8 @@ export interface HDOMImplementation { */ removeAttribs?(element: T, attribs: string[], prevAttribs: any); /** - * Sets target `element`'s text/body content. + * Sets target `element`'s text / body content. + * * @param element * @param value */ diff --git a/packages/hdom/src/diff.ts b/packages/hdom/src/diff.ts index 12c9b4d9cc..b983dc54f9 100644 --- a/packages/hdom/src/diff.ts +++ b/packages/hdom/src/diff.ts @@ -35,20 +35,7 @@ const buildIndex = (n: number) => { }; /** - * Takes a DOM root element and two normalized hiccup trees, `prev` and - * `curr`. Recursively computes diff between both trees and applies any - * necessary changes to reflect `curr` tree in target (browser DOM by - * default). - * - * For newly added components, calls `init` with created DOM element - * (plus user provided context and any other args) for any components - * with `init` life cycle method. Likewise, calls `release` on - * components with `release` method when the DOM element is removed. - * - * Important: The actual DOM element given is assumed to exactly - * represent the state of the `prev` tree. Since this function does NOT - * track the real DOM at all, the resulting changes will result in - * potentially undefined behavior if there're discrepancies. + * See `HDOMImplementation` interface for further details. * * @param opts * @param impl hdom implementation @@ -159,6 +146,15 @@ export const diffTree = ( } }; +/** + * Helper function for `diffTree()` to compute & apply the difference + * between a node's `prev` and `curr` attributes. + * + * @param impl + * @param el + * @param prev + * @param curr + */ export const diffAttributes = (impl: HDOMImplementation, el: T, prev: any, curr: any) => { const delta = diffObject(prev, curr, _equiv); impl.removeAttribs(el, delta.dels, prev); @@ -189,6 +185,15 @@ export const diffAttributes = (impl: HDOMImplementation, el: T, prev: any, } }; +/** + * Recursively attempts to call the `release` lifecycle method on every + * element in given tree (branch), using depth-first descent. Each + * element is checked for the presence of the `__release` control + * attribute. If (and only if) it is set to `false`, further descent + * into that element's branch is skipped. + * + * @param tag + */ export const releaseTree = (tag: any) => { if (isArray(tag)) { let x: any; diff --git a/packages/hdom/src/dom.ts b/packages/hdom/src/dom.ts index 679264f267..1ee537903f 100644 --- a/packages/hdom/src/dom.ts +++ b/packages/hdom/src/dom.ts @@ -8,14 +8,9 @@ const isArray = isa.isArray; const isNotStringAndIterable = isi.isNotStringAndIterable /** - * Creates an actual DOM tree from given hiccup component and `parent` - * element. Calls `init` with created element (user provided context and - * other args) for any components with `init` life cycle method. Returns - * created root element(s) - usually only a single one, but can be an - * array of elements, if the provided tree is an iterable. Creates DOM - * text nodes for non-component values. Returns `parent` if tree is - * `null` or `undefined`. + * See `HDOMImplementation` interface for further details. * + * @param opts * @param parent * @param tree * @param insert @@ -57,29 +52,24 @@ export const createDOM = (opts: Partial, parent: Element, tree: any, i }; /** - * Takes a DOM root element and normalized hdom tree, then walks tree - * and initializes any event listeners and components with lifecycle - * `init` methods. Assumes that an equivalent DOM (minus listeners) - * already exists (e.g. generated via SSR) when called. Any other - * discrepancies between the pre-existing DOM and the hdom tree will - * cause undefined behavior. + * See `HDOMImplementation` interface for further details. * + * @param opts * @param parent * @param tree - * @param i + * @param index */ -export const hydrateDOM = (opts: Partial, parent: Element, tree: any, i = 0) => { +export const hydrateDOM = (opts: Partial, parent: Element, tree: any, index = 0) => { if (isArray(tree)) { - const el = parent.children[i]; + const el = parent.children[index]; if (typeof tree[0] === "function") { - hydrateDOM(opts, parent, tree[0].apply(null, [opts.ctx, ...tree.slice(1)]), i); + hydrateDOM(opts, parent, tree[0].apply(null, [opts.ctx, ...tree.slice(1)]), index); } const attribs = tree[1]; if (attribs.__impl) { - return (>attribs.__impl).hydrateTree(opts, parent, tree, i); + return (>attribs.__impl).hydrateTree(opts, parent, tree, index); } if ((tree).__init) { - // TODO hdom ctx? (tree).__init.apply((tree).__this, [el, ...(tree).__args]); } for (let a in attribs) { @@ -92,12 +82,26 @@ export const hydrateDOM = (opts: Partial, parent: Element, tree: any, } } else if (isNotStringAndIterable(tree)) { for (let t of tree) { - hydrateDOM(opts, parent, t, i); - i++; + hydrateDOM(opts, parent, t, index); + index++; } } }; +/** + * Creates a new DOM element of type `tag` with optional `attribs`. If + * `parent` is not `null`, the new element will be inserted as child at + * given `insert` index. If `insert` is missing, the element will be + * appended to the `parent`'s list of children. Returns new DOM node. + * + * If `tag` is a known SVG element name, the new element will be created + * with the proper SVG XML namespace. + * + * @param parent + * @param tag + * @param attribs + * @param insert + */ export const createElement = (parent: Element, tag: string, attribs?: any, insert?: number) => { const el = SVG_TAGS[tag] ? document.createElementNS(SVG_NS, tag) : @@ -153,20 +157,20 @@ export const setAttribs = (el: Element, attribs: any) => { }; /** - * Sets a single attribute on given element. If attrib name is NOT - * an event name and its value is a function, it is called with - * given `attribs` object (usually the full attrib object passed - * to `setAttribs`) and the function's return value is used as attrib - * value. + * Sets a single attribute on given element. If attrib name is NOT an + * event name (prefix: "on") and its value is a function, it is called + * with given `attribs` object (usually the full attrib object passed to + * `setAttribs`) and the function's return value is used as the actual + * attrib value. * * Special rules apply for certain attributes: * - * - "style": see `setStyle()` - * - "value": see `updateValueAttrib()` + * - "style": delegated to `setStyle()` + * - "value": delegated to `updateValueAttrib()` * - attrib IDs starting with "on" are treated as event listeners * - * If the given (or computed) attrib value is `false` or `undefined` - * the attrib is removed from the element. + * If the given (or computed) attrib value is `false` or `undefined` the + * attrib is removed from the element. * * @param el * @param id @@ -204,7 +208,15 @@ export const setAttrib = (el: Element, id: string, val: any, attribs?: any) => { return el; }; +/** + * Updates an element's `value` property. For form elements it too + * ensures the edit cursor retains its position. + * + * @param el + * @param v + */ export const updateValueAttrib = (el: HTMLInputElement, v: any) => { + let ev; switch (el.type) { case "text": case "textarea": @@ -213,8 +225,8 @@ export const updateValueAttrib = (el: HTMLInputElement, v: any) => { case "url": case "tel": case "search": - if (el.value !== undefined && typeof v === "string") { - const off = v.length - (el.value.length - el.selectionStart); + if ((ev = el.value) !== undefined && typeof v === "string") { + const off = v.length - (ev.length - el.selectionStart); el.value = v; el.selectionStart = el.selectionEnd = off; break; diff --git a/packages/hdom/src/normalize.ts b/packages/hdom/src/normalize.ts index 190e5a39e2..edeff0d8c9 100644 --- a/packages/hdom/src/normalize.ts +++ b/packages/hdom/src/normalize.ts @@ -60,48 +60,10 @@ export const normalizeElement = (spec: any[], keys: boolean) => { }; /** - * Calling this function is a prerequisite before passing a component - * tree to `diffTree()`. Recursively expands given hiccup component tree - * into its canonical form: + * See `HDOMImplementation` interface for further details. * - * ``` - * ["tag", { attribs }, ...body] - * ``` - * - * - resolves Emmet-style tags (e.g. from `div#id.foo.bar`) - * - adds missing attribute objects (and `key` attribs) - * - merges Emmet-style classes with additional `class` attrib values - * (if given), e.g. `["div.foo", { class: "bar" }]` => `["div", { - * class: "bar foo" }]` - * - evaluates embedded functions and replaces them with their result - * - calls the `render` life cycle method on component objects and uses - * result - * - consumes iterables and normalizes their individual values - * - calls `deref()` on elements implementing the `IDeref` interface and - * uses returned results - * - calls `toHiccup()` on elements implementing the `IToHiccup` - * interface and uses returned results - * - calls `.toString()` on any other non-component value and by default - * wraps it in `["span", x]`. The only exceptions to this are: - * `button`, `option`, `textarea` and SVG `text` elements, for which - * spans are never created. - * - * Additionally, unless the `keys` option is explicitly set to false, an - * unique `key` attribute is created for each node in the tree. This - * attribute is used by `diffElement` to determine if a changed node can - * be patched or will need to be moved, replaced or removed. - * - * In terms of life cycle methods: `render` should ALWAYS return an - * array or another function, else the component's `init` or `release` - * fns will NOT be able to be called. E.g. If the return value of - * `render` evaluates as a string or number, the return value should be - * wrapped as `["span", "foo"]`. If no `init` or `release` are used, - * this requirement is relaxed. - * - * See `normalizeElement` for further details about canonical form. - * - * @param tree * @param opts + * @param tree */ export const normalizeTree = (opts: Partial, tree: any) => _normalizeTree(tree, opts, opts.ctx, [0], opts.keys !== false, opts.span !== false); From 4b78c8a3c858fac6756fec6b47b8d91b58f20bc3 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 26 Sep 2018 16:06:35 +0100 Subject: [PATCH 24/77] minor(examples): xml-converter --- examples/xml-converter/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index 8cbbe5978a..2f64cbbce8 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -165,7 +165,7 @@ src.next(` foo -

+

HTML & Hiccup walk into a bar...

From 2f01447177e8df1671982d89c31ac1556bf75d95 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 26 Sep 2018 16:12:03 +0100 Subject: [PATCH 25/77] Publish - @thi.ng/associative@0.6.11 - @thi.ng/cache@0.2.28 - @thi.ng/csp@0.3.67 - @thi.ng/dcons@1.1.11 - @thi.ng/dgraph@0.2.23 - @thi.ng/hdom-canvas@0.1.4 - @thi.ng/hdom-components@2.2.10 - @thi.ng/hdom@5.0.4 - @thi.ng/hiccup-css@0.2.26 - @thi.ng/iges@0.2.16 - @thi.ng/iterators@4.1.32 - @thi.ng/range-coder@0.1.16 - @thi.ng/rstream-csp@0.1.112 - @thi.ng/rstream-dot@0.2.51 - @thi.ng/rstream-gestures@0.5.13 - @thi.ng/rstream-graph@2.1.37 - @thi.ng/rstream-log@1.0.63 - @thi.ng/rstream-query@0.3.50 - @thi.ng/rstream@1.13.5 - @thi.ng/sax@0.5.1 - @thi.ng/transducers-fsm@0.2.24 - @thi.ng/transducers-hdom@1.1.6 - @thi.ng/transducers-stats@0.4.11 - @thi.ng/transducers@2.1.6 --- packages/associative/CHANGELOG.md | 9 +++++++++ packages/associative/package.json | 6 +++--- packages/cache/CHANGELOG.md | 9 +++++++++ packages/cache/package.json | 6 +++--- packages/csp/CHANGELOG.md | 9 +++++++++ packages/csp/package.json | 6 +++--- packages/dcons/CHANGELOG.md | 9 +++++++++ packages/dcons/package.json | 4 ++-- packages/dgraph/CHANGELOG.md | 9 +++++++++ packages/dgraph/package.json | 6 +++--- packages/hdom-canvas/CHANGELOG.md | 9 +++++++++ packages/hdom-canvas/package.json | 4 ++-- packages/hdom-components/CHANGELOG.md | 9 +++++++++ packages/hdom-components/package.json | 4 ++-- packages/hdom/CHANGELOG.md | 9 +++++++++ packages/hdom/package.json | 2 +- packages/hiccup-css/CHANGELOG.md | 9 +++++++++ packages/hiccup-css/package.json | 4 ++-- packages/iges/CHANGELOG.md | 9 +++++++++ packages/iges/package.json | 4 ++-- packages/iterators/CHANGELOG.md | 9 +++++++++ packages/iterators/package.json | 4 ++-- packages/range-coder/CHANGELOG.md | 9 +++++++++ packages/range-coder/package.json | 4 ++-- packages/rstream-csp/CHANGELOG.md | 9 +++++++++ packages/rstream-csp/package.json | 6 +++--- packages/rstream-dot/CHANGELOG.md | 9 +++++++++ packages/rstream-dot/package.json | 4 ++-- packages/rstream-gestures/CHANGELOG.md | 9 +++++++++ packages/rstream-gestures/package.json | 6 +++--- packages/rstream-graph/CHANGELOG.md | 9 +++++++++ packages/rstream-graph/package.json | 6 +++--- packages/rstream-log/CHANGELOG.md | 9 +++++++++ packages/rstream-log/package.json | 6 +++--- packages/rstream-query/CHANGELOG.md | 9 +++++++++ packages/rstream-query/package.json | 10 +++++----- packages/rstream/CHANGELOG.md | 9 +++++++++ packages/rstream/package.json | 6 +++--- packages/sax/CHANGELOG.md | 9 +++++++++ packages/sax/package.json | 6 +++--- packages/transducers-fsm/CHANGELOG.md | 9 +++++++++ packages/transducers-fsm/package.json | 4 ++-- packages/transducers-hdom/CHANGELOG.md | 9 +++++++++ packages/transducers-hdom/package.json | 6 +++--- packages/transducers-stats/CHANGELOG.md | 9 +++++++++ packages/transducers-stats/package.json | 6 +++--- packages/transducers/CHANGELOG.md | 12 ++++++++++++ packages/transducers/package.json | 2 +- 48 files changed, 280 insertions(+), 61 deletions(-) diff --git a/packages/associative/CHANGELOG.md b/packages/associative/CHANGELOG.md index 00d9945344..e1bf036159 100644 --- a/packages/associative/CHANGELOG.md +++ b/packages/associative/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.6.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.10...@thi.ng/associative@0.6.11) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/associative + + + + + ## [0.6.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.9...@thi.ng/associative@0.6.10) (2018-09-25) diff --git a/packages/associative/package.json b/packages/associative/package.json index 48b90ff347..67d1b02d5b 100644 --- a/packages/associative/package.json +++ b/packages/associative/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/associative", - "version": "0.6.10", + "version": "0.6.11", "description": "Alternative Set & Map data type implementations with customizable equality semantics & supporting operations", "main": "./index.js", "typings": "./index.d.ts", @@ -31,10 +31,10 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/compare": "^0.1.9", - "@thi.ng/dcons": "^1.1.10", + "@thi.ng/dcons": "^1.1.11", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "data structures", diff --git a/packages/cache/CHANGELOG.md b/packages/cache/CHANGELOG.md index f862bf5eb0..068111148d 100644 --- a/packages/cache/CHANGELOG.md +++ b/packages/cache/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.28](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.27...@thi.ng/cache@0.2.28) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/cache + + + + + ## [0.2.27](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.26...@thi.ng/cache@0.2.27) (2018-09-25) diff --git a/packages/cache/package.json b/packages/cache/package.json index 8ddb2218c3..7174b9bc07 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/cache", - "version": "0.2.27", + "version": "0.2.28", "description": "In-memory cache implementations with ES6 Map-like API and different eviction strategies", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.10", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/dcons": "^1.1.11", + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "cache", diff --git a/packages/csp/CHANGELOG.md b/packages/csp/CHANGELOG.md index f62d1ab808..2d2c9b244e 100644 --- a/packages/csp/CHANGELOG.md +++ b/packages/csp/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.67](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.66...@thi.ng/csp@0.3.67) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/csp + + + + + ## [0.3.66](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.65...@thi.ng/csp@0.3.66) (2018-09-25) diff --git a/packages/csp/package.json b/packages/csp/package.json index 2fa4d1388d..a4eb966450 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/csp", - "version": "0.3.66", + "version": "0.3.67", "description": "ES6 promise based CSP implementation", "main": "./index.js", "typings": "./index.d.ts", @@ -34,9 +34,9 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", - "@thi.ng/dcons": "^1.1.10", + "@thi.ng/dcons": "^1.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "async", diff --git a/packages/dcons/CHANGELOG.md b/packages/dcons/CHANGELOG.md index 03ef0f80ea..0bd8ed7abb 100644 --- a/packages/dcons/CHANGELOG.md +++ b/packages/dcons/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.10...@thi.ng/dcons@1.1.11) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/dcons + + + + + ## [1.1.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.9...@thi.ng/dcons@1.1.10) (2018-09-25) diff --git a/packages/dcons/package.json b/packages/dcons/package.json index e5bd0c1645..c03a714709 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dcons", - "version": "1.1.10", + "version": "1.1.11", "description": "Comprehensive doubly linked list structure w/ iterator support", "main": "./index.js", "typings": "./index.d.ts", @@ -33,7 +33,7 @@ "@thi.ng/compare": "^0.1.9", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "datastructure", diff --git a/packages/dgraph/CHANGELOG.md b/packages/dgraph/CHANGELOG.md index a2735a52c8..e807ab275e 100644 --- a/packages/dgraph/CHANGELOG.md +++ b/packages/dgraph/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.23](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.22...@thi.ng/dgraph@0.2.23) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/dgraph + + + + + ## [0.2.22](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.21...@thi.ng/dgraph@0.2.22) (2018-09-25) diff --git a/packages/dgraph/package.json b/packages/dgraph/package.json index d86eac92ff..5ebd4df11b 100644 --- a/packages/dgraph/package.json +++ b/packages/dgraph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dgraph", - "version": "0.2.22", + "version": "0.2.23", "description": "Type-agnostic directed acyclic graph (DAG) & graph operations", "main": "./index.js", "typings": "./index.d.ts", @@ -29,10 +29,10 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.10", + "@thi.ng/associative": "^0.6.11", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "data structure", diff --git a/packages/hdom-canvas/CHANGELOG.md b/packages/hdom-canvas/CHANGELOG.md index 215ea29890..a4d4083255 100644 --- a/packages/hdom-canvas/CHANGELOG.md +++ b/packages/hdom-canvas/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.3...@thi.ng/hdom-canvas@0.1.4) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/hdom-canvas + + + + + ## [0.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.2...@thi.ng/hdom-canvas@0.1.3) (2018-09-24) diff --git a/packages/hdom-canvas/package.json b/packages/hdom-canvas/package.json index 541fc3b010..d87c23fcdb 100644 --- a/packages/hdom-canvas/package.json +++ b/packages/hdom-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-canvas", - "version": "0.1.3", + "version": "0.1.4", "description": "Declarative canvas scenegraph & visualization for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -31,7 +31,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/diff": "^1.1.2", - "@thi.ng/hdom": "^5.0.3" + "@thi.ng/hdom": "^5.0.4" }, "keywords": [ "ES6", diff --git a/packages/hdom-components/CHANGELOG.md b/packages/hdom-components/CHANGELOG.md index b090a087fb..bc38bf9cde 100644 --- a/packages/hdom-components/CHANGELOG.md +++ b/packages/hdom-components/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.2.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.9...@thi.ng/hdom-components@2.2.10) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/hdom-components + + + + + ## [2.2.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.8...@thi.ng/hdom-components@2.2.9) (2018-09-25) diff --git a/packages/hdom-components/package.json b/packages/hdom-components/package.json index 86c170bf15..5693fd1d04 100644 --- a/packages/hdom-components/package.json +++ b/packages/hdom-components/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-components", - "version": "2.2.9", + "version": "2.2.10", "description": "Raw, skinnable UI & SVG components for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -30,7 +30,7 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", - "@thi.ng/transducers": "^2.1.5", + "@thi.ng/transducers": "^2.1.6", "@types/webgl2": "^0.0.4" }, "keywords": [ diff --git a/packages/hdom/CHANGELOG.md b/packages/hdom/CHANGELOG.md index 597f266b56..6fdd9b7d1c 100644 --- a/packages/hdom/CHANGELOG.md +++ b/packages/hdom/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [5.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.3...@thi.ng/hdom@5.0.4) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/hdom + + + + + ## [5.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.2...@thi.ng/hdom@5.0.3) (2018-09-24) diff --git a/packages/hdom/package.json b/packages/hdom/package.json index d4a1301687..a0414075f3 100644 --- a/packages/hdom/package.json +++ b/packages/hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom", - "version": "5.0.3", + "version": "5.0.4", "description": "Lightweight vanilla ES6 UI component trees with customizable branch-local behaviors", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/hiccup-css/CHANGELOG.md b/packages/hiccup-css/CHANGELOG.md index cfaca52bb6..315209dbd1 100644 --- a/packages/hiccup-css/CHANGELOG.md +++ b/packages/hiccup-css/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.26](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.25...@thi.ng/hiccup-css@0.2.26) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/hiccup-css + + + + + ## [0.2.25](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.24...@thi.ng/hiccup-css@0.2.25) (2018-09-25) diff --git a/packages/hiccup-css/package.json b/packages/hiccup-css/package.json index 1cda2dcf36..97a22f7367 100644 --- a/packages/hiccup-css/package.json +++ b/packages/hiccup-css/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-css", - "version": "0.2.25", + "version": "0.2.26", "description": "CSS from nested JS data structures", "main": "./index.js", "typings": "./index.d.ts", @@ -31,7 +31,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "clojure", diff --git a/packages/iges/CHANGELOG.md b/packages/iges/CHANGELOG.md index d0697d25e2..c4e5892942 100644 --- a/packages/iges/CHANGELOG.md +++ b/packages/iges/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.16](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.15...@thi.ng/iges@0.2.16) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/iges + + + + + ## [0.2.15](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.14...@thi.ng/iges@0.2.15) (2018-09-25) diff --git a/packages/iges/package.json b/packages/iges/package.json index 4e0e9bf2f4..20ef7e4c87 100644 --- a/packages/iges/package.json +++ b/packages/iges/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iges", - "version": "0.2.15", + "version": "0.2.16", "description": "IGES 5.3 serializer for (currently only) polygonal geometry, both open & closed", "main": "./index.js", "typings": "./index.d.ts", @@ -31,7 +31,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/defmulti": "^0.3.11", "@thi.ng/strings": "^0.5.0", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "CAD", diff --git a/packages/iterators/CHANGELOG.md b/packages/iterators/CHANGELOG.md index 71c4301752..0db42811e6 100644 --- a/packages/iterators/CHANGELOG.md +++ b/packages/iterators/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [4.1.32](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.31...@thi.ng/iterators@4.1.32) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/iterators + + + + + ## [4.1.31](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.30...@thi.ng/iterators@4.1.31) (2018-09-25) diff --git a/packages/iterators/package.json b/packages/iterators/package.json index 6d6c81ec8e..35891d2b95 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iterators", - "version": "4.1.31", + "version": "4.1.32", "description": "clojure.core inspired, composable ES6 iterators & generators", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.10", + "@thi.ng/dcons": "^1.1.11", "@thi.ng/errors": "^0.1.9" }, "keywords": [ diff --git a/packages/range-coder/CHANGELOG.md b/packages/range-coder/CHANGELOG.md index c57fd489d3..9c18605dde 100644 --- a/packages/range-coder/CHANGELOG.md +++ b/packages/range-coder/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.16](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.15...@thi.ng/range-coder@0.1.16) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/range-coder + + + + + ## [0.1.15](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.14...@thi.ng/range-coder@0.1.15) (2018-09-25) diff --git a/packages/range-coder/package.json b/packages/range-coder/package.json index f06fd6fdee..da0c54cbb1 100644 --- a/packages/range-coder/package.json +++ b/packages/range-coder/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/range-coder", - "version": "0.1.15", + "version": "0.1.16", "description": "Binary data range encoder / decoder", "main": "./index.js", "typings": "./index.d.ts", @@ -20,7 +20,7 @@ "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" }, "devDependencies": { - "@thi.ng/transducers": "^2.1.5", + "@thi.ng/transducers": "^2.1.6", "@types/mocha": "^5.2.5", "@types/node": "^10.5.5", "mocha": "^5.2.0", diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index 3d629df369..6593d30001 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.112](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.111...@thi.ng/rstream-csp@0.1.112) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/rstream-csp + + + + + ## [0.1.111](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.110...@thi.ng/rstream-csp@0.1.111) (2018-09-25) diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 49f5c3d71b..5e6634a219 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "0.1.111", + "version": "0.1.112", "description": "@thi.ng/csp bridge module for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/csp": "^0.3.66", - "@thi.ng/rstream": "^1.13.4" + "@thi.ng/csp": "^0.3.67", + "@thi.ng/rstream": "^1.13.5" }, "keywords": [ "bridge", diff --git a/packages/rstream-dot/CHANGELOG.md b/packages/rstream-dot/CHANGELOG.md index 404a291e97..ea4f1cd82e 100644 --- a/packages/rstream-dot/CHANGELOG.md +++ b/packages/rstream-dot/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.51](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.50...@thi.ng/rstream-dot@0.2.51) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/rstream-dot + + + + + ## [0.2.50](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.49...@thi.ng/rstream-dot@0.2.50) (2018-09-25) diff --git a/packages/rstream-dot/package.json b/packages/rstream-dot/package.json index a588c4dd96..c6279967b2 100644 --- a/packages/rstream-dot/package.json +++ b/packages/rstream-dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-dot", - "version": "0.2.50", + "version": "0.2.51", "description": "Graphviz DOT conversion of @thi.ng/rstream dataflow graph topologies", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/rstream": "^1.13.4" + "@thi.ng/rstream": "^1.13.5" }, "keywords": [ "conversion", diff --git a/packages/rstream-gestures/CHANGELOG.md b/packages/rstream-gestures/CHANGELOG.md index 9a5e9ee663..8e8c2b032d 100644 --- a/packages/rstream-gestures/CHANGELOG.md +++ b/packages/rstream-gestures/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.5.13](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.12...@thi.ng/rstream-gestures@0.5.13) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/rstream-gestures + + + + + ## [0.5.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.11...@thi.ng/rstream-gestures@0.5.12) (2018-09-25) diff --git a/packages/rstream-gestures/package.json b/packages/rstream-gestures/package.json index 3bc4aec389..c92f5f8cff 100644 --- a/packages/rstream-gestures/package.json +++ b/packages/rstream-gestures/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-gestures", - "version": "0.5.12", + "version": "0.5.13", "description": "Unified mouse, mouse wheel & single-touch event stream abstraction", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/rstream": "^1.13.4", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/rstream": "^1.13.5", + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "dataflow", diff --git a/packages/rstream-graph/CHANGELOG.md b/packages/rstream-graph/CHANGELOG.md index 0c6ea542a0..5f773165a0 100644 --- a/packages/rstream-graph/CHANGELOG.md +++ b/packages/rstream-graph/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.1.37](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.36...@thi.ng/rstream-graph@2.1.37) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/rstream-graph + + + + + ## [2.1.36](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.35...@thi.ng/rstream-graph@2.1.36) (2018-09-25) diff --git a/packages/rstream-graph/package.json b/packages/rstream-graph/package.json index 2a772bebe6..2a2d0fa43f 100644 --- a/packages/rstream-graph/package.json +++ b/packages/rstream-graph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-graph", - "version": "2.1.36", + "version": "2.1.37", "description": "Declarative dataflow graph construction for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -33,8 +33,8 @@ "@thi.ng/errors": "^0.1.9", "@thi.ng/paths": "^1.6.3", "@thi.ng/resolve-map": "^3.0.13", - "@thi.ng/rstream": "^1.13.4", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/rstream": "^1.13.5", + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "compute", diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index 9a013b20e3..22eaa54abb 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.0.63](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.62...@thi.ng/rstream-log@1.0.63) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/rstream-log + + + + + ## [1.0.62](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.61...@thi.ng/rstream-log@1.0.62) (2018-09-25) diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index 285f08d365..d3a5fb906c 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "1.0.62", + "version": "1.0.63", "description": "Structured, multilevel & hierarchical loggers based on @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -31,8 +31,8 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.4", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/rstream": "^1.13.5", + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "ES6", diff --git a/packages/rstream-query/CHANGELOG.md b/packages/rstream-query/CHANGELOG.md index 4f8071df5b..6ac40c981b 100644 --- a/packages/rstream-query/CHANGELOG.md +++ b/packages/rstream-query/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.50](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.49...@thi.ng/rstream-query@0.3.50) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/rstream-query + + + + + ## [0.3.49](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.48...@thi.ng/rstream-query@0.3.49) (2018-09-25) diff --git a/packages/rstream-query/package.json b/packages/rstream-query/package.json index bb00931ad5..459aeb661a 100644 --- a/packages/rstream-query/package.json +++ b/packages/rstream-query/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-query", - "version": "0.3.49", + "version": "0.3.50", "description": "@thi.ng/rstream based triple store & reactive query engine", "main": "./index.js", "typings": "./index.d.ts", @@ -29,13 +29,13 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.10", + "@thi.ng/associative": "^0.6.11", "@thi.ng/checks": "^1.5.11", "@thi.ng/equiv": "^0.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.4", - "@thi.ng/rstream-dot": "^0.2.50", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/rstream": "^1.13.5", + "@thi.ng/rstream-dot": "^0.2.51", + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "dataflow", diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index f2dcf24d34..1b5f3125a0 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.13.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.4...@thi.ng/rstream@1.13.5) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/rstream + + + + + ## [1.13.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.3...@thi.ng/rstream@1.13.4) (2018-09-25) diff --git a/packages/rstream/package.json b/packages/rstream/package.json index 6f0d9f8df6..d2d89aba3b 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "1.13.4", + "version": "1.13.5", "description": "Reactive multi-tap streams, dataflow & transformation pipeline constructs", "main": "./index.js", "typings": "./index.d.ts", @@ -29,12 +29,12 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.10", + "@thi.ng/associative": "^0.6.11", "@thi.ng/atom": "^1.5.4", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", "@thi.ng/paths": "^1.6.3", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "datastructure", diff --git a/packages/sax/CHANGELOG.md b/packages/sax/CHANGELOG.md index 4a1cd2086d..336cedb324 100644 --- a/packages/sax/CHANGELOG.md +++ b/packages/sax/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.5.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.5.0...@thi.ng/sax@0.5.1) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/sax + + + + + # [0.5.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.4.1...@thi.ng/sax@0.5.0) (2018-09-25) diff --git a/packages/sax/package.json b/packages/sax/package.json index 780c2e8c0f..430a5d82c2 100644 --- a/packages/sax/package.json +++ b/packages/sax/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/sax", - "version": "0.5.0", + "version": "0.5.1", "description": "Transducer-based, SAX-like, non-validating, speedy & tiny XML parser", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.5", - "@thi.ng/transducers-fsm": "^0.2.23" + "@thi.ng/transducers": "^2.1.6", + "@thi.ng/transducers-fsm": "^0.2.24" }, "keywords": [ "ES6", diff --git a/packages/transducers-fsm/CHANGELOG.md b/packages/transducers-fsm/CHANGELOG.md index 0b23131469..bc9d4050a9 100644 --- a/packages/transducers-fsm/CHANGELOG.md +++ b/packages/transducers-fsm/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.24](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.23...@thi.ng/transducers-fsm@0.2.24) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/transducers-fsm + + + + + ## [0.2.23](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.22...@thi.ng/transducers-fsm@0.2.23) (2018-09-25) diff --git a/packages/transducers-fsm/package.json b/packages/transducers-fsm/package.json index 1059becc55..02a7ae4365 100644 --- a/packages/transducers-fsm/package.json +++ b/packages/transducers-fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-fsm", - "version": "0.2.23", + "version": "0.2.24", "description": "Transducer-based Finite State Machine transformer", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "ES6", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index 454359f095..c219346b98 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.5...@thi.ng/transducers-hdom@1.1.6) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [1.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.4...@thi.ng/transducers-hdom@1.1.5) (2018-09-25) diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index bb0db84c08..994c363e3f 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "1.1.5", + "version": "1.1.6", "description": "Transducer based UI updater for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ }, "dependencies": { "@thi.ng/checks": "^1.5.11", - "@thi.ng/hdom": "^5.0.3", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/hdom": "^5.0.4", + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "diff", diff --git a/packages/transducers-stats/CHANGELOG.md b/packages/transducers-stats/CHANGELOG.md index 6891278afd..15605a0f79 100644 --- a/packages/transducers-stats/CHANGELOG.md +++ b/packages/transducers-stats/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.4.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.10...@thi.ng/transducers-stats@0.4.11) (2018-09-26) + +**Note:** Version bump only for package @thi.ng/transducers-stats + + + + + ## [0.4.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.9...@thi.ng/transducers-stats@0.4.10) (2018-09-25) diff --git a/packages/transducers-stats/package.json b/packages/transducers-stats/package.json index b73a717c2e..505e2ac4be 100644 --- a/packages/transducers-stats/package.json +++ b/packages/transducers-stats/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-stats", - "version": "0.4.10", + "version": "0.4.11", "description": "Transducers for statistical / technical analysis", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/dcons": "^1.1.10", + "@thi.ng/dcons": "^1.1.11", "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.5" + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "ES6", diff --git a/packages/transducers/CHANGELOG.md b/packages/transducers/CHANGELOG.md index bcced9e770..1d1d3b4ef8 100644 --- a/packages/transducers/CHANGELOG.md +++ b/packages/transducers/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.1.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.5...@thi.ng/transducers@2.1.6) (2018-09-26) + + +### Bug Fixes + +* **transducers:** fix matchLast(), fix & update return match*() types ([823d828](https://github.com/thi-ng/umbrella/commit/823d828)) + + + + + ## [2.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.4...@thi.ng/transducers@2.1.5) (2018-09-25) diff --git a/packages/transducers/package.json b/packages/transducers/package.json index 9deb5762ec..c288e794ee 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers", - "version": "2.1.5", + "version": "2.1.6", "description": "Lightweight transducer implementations for ES6 / TypeScript", "main": "./index.js", "typings": "./index.d.ts", From 95ba4f6d9311779196824a0cbe855f7fedd811dd Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 27 Sep 2018 16:20:29 +0100 Subject: [PATCH 26/77] feat(examples): extend xml-converter, add CLI version, update docs --- assets/dot/xml-converter.dot | 34 +++ assets/xml-converter.png | Bin 0 -> 69834 bytes examples/README.md | 2 +- examples/xml-converter/README.md | 72 +++++- examples/xml-converter/bin/hiccup | 43 ++++ examples/xml-converter/index.html | 11 - examples/xml-converter/package.json | 4 +- examples/xml-converter/src/convert.ts | 137 ++++++++++++ examples/xml-converter/src/format.ts | 93 +++++--- examples/xml-converter/src/index.ts | 271 +++++++++++------------ examples/xml-converter/src/utils.ts | 7 + examples/xml-converter/tsconfig-cli.json | 11 + 12 files changed, 491 insertions(+), 194 deletions(-) create mode 100644 assets/dot/xml-converter.dot create mode 100644 assets/xml-converter.png create mode 100755 examples/xml-converter/bin/hiccup create mode 100644 examples/xml-converter/src/convert.ts create mode 100644 examples/xml-converter/src/utils.ts create mode 100644 examples/xml-converter/tsconfig-cli.json diff --git a/assets/dot/xml-converter.dot b/assets/dot/xml-converter.dot new file mode 100644 index 0000000000..c4dd90e3d9 --- /dev/null +++ b/assets/dot/xml-converter.dot @@ -0,0 +1,34 @@ +digraph g { + rankdir=LR; + node[fontname="Inconsolata", fontsize="11"]; + edge[arrowsize="0.75", fontname="Inconsolata", fontsize="9"]; + + rank=same { + prettyPrint; + doubleQuote; + trailingComma; + removeTags; + removeAttribs; + xml; + } + + prettyPrint -> formatOpts; + doubleQuote -> formatOpts; + trailingComma -> formatOpts; + + removeTags -> opts; + removeAttribs -> opts; + formatOpts -> opts; + + xml -> main; + opts -> main; + + main -> app -> ui; + + ui -> xml[label="user", style=dashed]; + ui -> prettyPrint[label="user", style=dashed]; + ui -> doubleQuote[label="user", style=dashed]; + ui -> trailingComma[label="user", style=dashed]; + ui -> removeTags[label="user", style=dashed]; + ui -> removeAttribs[label="user", style=dashed]; +} \ No newline at end of file diff --git a/assets/xml-converter.png b/assets/xml-converter.png new file mode 100644 index 0000000000000000000000000000000000000000..ca95fc8e7966f2aaa7588f682f7bb8887e1bf468 GIT binary patch literal 69834 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 literal 0 HcmV?d00001 diff --git a/examples/README.md b/examples/README.md index 8d9b0dccd2..16dfc833c0 100644 --- a/examples/README.md +++ b/examples/README.md @@ -37,4 +37,4 @@ If you want to [contribute](../CONTRIBUTING.md) an example, please get in touch | 29 | [transducers-hdom](./transducers-hdom) | Transducer & rstream based hdom UI updates | hdom, rstream, transducers-hdom | basic | | 30 | [triple-query](./triple-query) | Triple store query results & sortable table | atom, hdom, hdom-components, rstream-query, transducers | intermediate | | 31 | [webgl](./webgl) | Canvas component handling | hdom, hdom-components | basic | -| 32 | [xml-converter](./xml-converter) | XML/HTML/SVG to hiccup conversion as you type | rstream, sax, transducers, transducers-hdom | basic | +| 32 | [xml-converter](./xml-converter) | XML/HTML/SVG to hiccup conversion as you type | rstream, sax, transducers, transducers-hdom | advanced | diff --git a/examples/xml-converter/README.md b/examples/xml-converter/README.md index c91a088a34..c3c9333baa 100644 --- a/examples/xml-converter/README.md +++ b/examples/xml-converter/README.md @@ -4,12 +4,20 @@ This example uses [@thi.ng/sax](https://github.com/thi-ng/umbrella/tree/master/packages/sax) -to convert XML/HTML syntax into -[@thi.ng/hiccup](https://github.com/thi-ng/umbrella/tree/master/packages/hiccup) -syntax. +to convert XML/HTML/SVG syntax into +[hiccup](https://github.com/thi-ng/umbrella/tree/master/packages/hiccup) +/ JSON syntax and provides several options to filter the parsed tree and +control the resulting output format. -TODO better output formatting, html boolean attribs +## Dataflow +This diagram illustrates the +[@thi.ng/rstream](https://github.com/thi-ng/umbrella/tree/master/packages/rstream) +dataflow topology used by the browser app: + +![dataflow](https://raw.githubusercontent.com/thi-ng/umbrella/master/assets/xml-converter.png) + +## Browser version ```bash git clone https://github.com/thi-ng/umbrella.git cd umbrella/examples/xml-converter @@ -17,6 +25,62 @@ yarn install yarn start ``` +## CLI version + +In addition to the above browser UI, this example can be built as a +**basic** CLI tool to convert & filter files (the result is always +written to stdout). + +```bash +# in this example's project root... +yarn build-cli + +bin/hiccup --help +# Usage: hiccup [options] +# +# Options: +# +# -V, --version output the version number +# -t, --tags remove tags from tree +# -a, --attribs remove attribs from tree +# -v, --var generate TS export var declaration +# -s, --single-quote use single quotes +# -p, --no-pretty disable pretty printing +# -h, --help output usage information + +# Example file +cat << EOF > foo.svg + + + add + Foo bar + + + + + +EOF + +bin/hiccup \ + -v ICON \ # create a target var name + -t title,desc,defs \ # remove tags + -a id,style,stroke,fill,xmlns,width,height,version \ # remove attribs + foo.svg +# export const ICON = +# ["svg", { viewBox: "0 0 10 10" }, +# ["g", +# { +# "fill-rule": "evenodd", +# "stroke-width": 1, +# }, +# ["path", { d: "M6,4 L10,4 L10,6 L6,6 L6,10 L4,10 L4,6 L0,6 L0,4 L4,4 L4,0 L6,0 L6,4 Z" }]]]; +``` + ## Authors - Karsten Schmidt diff --git a/examples/xml-converter/bin/hiccup b/examples/xml-converter/bin/hiccup new file mode 100755 index 0000000000..e4b6448d7d --- /dev/null +++ b/examples/xml-converter/bin/hiccup @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +const fs = require("fs"); +const path = require("path"); +const program = require("commander"); +const package = require("../package.json"); +const convert = require("./convert"); +const format = require("./format"); +const utils = require("./utils"); + +program + .version(package.version) + .usage("[options] ") + .option("-t, --tags ", "remove tags from tree", utils.asSet) + .option("-a, --attribs ", "remove attribs from tree", utils.asSet) + .option("-v, --var ", "generate TS export var decl") + .option("-s, --single-quote", "use single quotes") + .option("-p, --no-pretty", "disable pretty printing") + .parse(process.argv); + +if (program.args.length == 0) { + console.log("Please run: hiccup --help"); + process.exit(1); +} + +const xmlFile = path.resolve(program.args[0]); +const quote = program.singleQuote ? `'` : `"`; +const copts = { + format: program.pretty ? + { ...format.DEFAULT_FORMAT, quote, indent: 4 } : + { ...format.COMPACT_FORMAT, quote }, + removeAttribs: program.attribs || new Set(), + removeTags: program.tags || new Set(), +}; + +const xml = fs.readFileSync(xmlFile).toString(); +const hiccup = convert.convertXML(xml, copts); + +console.log( + program.var ? + `export const ${program.var} =\n${hiccup};` : + hiccup +); diff --git a/examples/xml-converter/index.html b/examples/xml-converter/index.html index d881ac7db2..63cebaa1d8 100644 --- a/examples/xml-converter/index.html +++ b/examples/xml-converter/index.html @@ -7,7 +7,6 @@ xml-converter - @@ -15,16 +14,6 @@
-

Current features

-
    -
  • HTML boolean attribs
  • -
  • Numeric & boolean attrib value parsing
  • -
  • style attrib conversion
  • -
  • Standard HTML entity unescaping
  • -
  • Input must be well formed XML
  • -
  • Hiccup specific (more compact) JSON formatting
  • -
  • See issue #48
  • -
Source code
diff --git a/examples/xml-converter/package.json b/examples/xml-converter/package.json index 4e5b480a57..096c7a6f1c 100644 --- a/examples/xml-converter/package.json +++ b/examples/xml-converter/package.json @@ -7,6 +7,7 @@ "scripts": { "clean": "rm -rf .cache build out", "build": "yarn clean && parcel build index.html -d out --public-url ./ --no-source-maps --no-cache --detailed-report", + "build-cli": "tsc -p tsconfig-cli.json", "start": "parcel index.html -p 8080 --open" }, "devDependencies": { @@ -18,7 +19,8 @@ "@thi.ng/rstream": "latest", "@thi.ng/sax": "latest", "@thi.ng/strings": "latest", - "@thi.ng/transducers-hdom": "latest" + "@thi.ng/transducers-hdom": "latest", + "commander": "^2.18.0" }, "browserslist": [ "last 3 Chrome versions" diff --git a/examples/xml-converter/src/convert.ts b/examples/xml-converter/src/convert.ts new file mode 100644 index 0000000000..e78b7bf8a4 --- /dev/null +++ b/examples/xml-converter/src/convert.ts @@ -0,0 +1,137 @@ +import { isString } from "@thi.ng/checks/is-string"; +import { + parse, + ParseElement, + ParseEvent, + Type +} from "@thi.ng/sax"; +import { comp } from "@thi.ng/transducers/func/comp"; +import { pairs } from "@thi.ng/transducers/iter/pairs"; +import { assocObj } from "@thi.ng/transducers/rfn/assoc-obj"; +import { last } from "@thi.ng/transducers/rfn/last"; +import { push } from "@thi.ng/transducers/rfn/push"; +import { transduce } from "@thi.ng/transducers/transduce"; +import { filter } from "@thi.ng/transducers/xform/filter"; +import { map } from "@thi.ng/transducers/xform/map"; +import { DEFAULT_FORMAT, format, FormatOpts } from "./format"; + +export interface ConversionOpts { + format: FormatOpts; + removeTags: Set; + removeAttribs: Set; +} + +export const DEFAULT_OPTS: ConversionOpts = { + format: DEFAULT_FORMAT, + removeAttribs: new Set(), + removeTags: new Set(), +}; + +// converts given XMLish string into formatted hiccup +export const convertXML = (src: string, opts: Partial = {}) => { + let tree = transformTree( + parseXML(src), + { ...DEFAULT_OPTS, ...opts } + ); + return format({ ...DEFAULT_FORMAT, ...opts.format }, "", tree); +}; + +// parses given XMLish string using @thi.ng/sax transducer into a +// sequence of parse events. we only care about the final (or error) +// event, which will be related to the final close tag and contains the +// entire tree +const parseXML = (src: string) => + transduce( + comp( + parse({ trim: true, boolean: true, entities: true }), + filter((e) => e.type === Type.ELEM_END || e.type === Type.ERROR) + ), + last(), + src + ); + +// transforms string of CSS properties into a plain object +const transformCSS = (css: string) => + css.split(";").reduce( + (acc, p) => { + const [k, v] = p.split(":"); + (v != null) && (acc[k.trim()] = parseAttrib([k, v.trim()])[1]); + return acc; + }, + {} + ); + +// takes attrib key-value pair and attempts to coerce / transform its +// value. returns updated pair. +const parseAttrib = (attrib: string[]) => { + let [k, v] = attrib; + if (isString(v)) { + v = v.replace(/[\n\r]+\s*/g, " "); + return k === "style" ? + [k, transformCSS(v)] : + v === "true" ? + [k, true] : + v === "false" ? + [k, false] : + [k, /^[0-9.e+-]+$/.test(v) ? + parseFloat(v) : + v]; + } + return attrib; +}; + +// transforms an entire object of attributes +const transformAttribs = (attribs: any, remove: Set = new Set()) => + transduce( + comp( + filter((a) => !remove.has(a[0])), + map(parseAttrib) + ), + assocObj(), + {}, + pairs(attribs) + ); + +// transforms element name by attempting to form Emmet-like tags +const transformTag = (tag: string, attribs: any) => { + if (attribs.id) { + tag += "#" + attribs.id; + delete attribs.id; + } + if (isString(attribs.class)) { + const classes = attribs.class.replace(/\s+/g, "."); + classes.length && (tag += "." + classes); + delete attribs.class; + } + return tag; +}; + +// recursively transforms entire parse tree +const transformTree = (tree: ParseEvent | ParseElement, opts: ConversionOpts) => { + if ((tree).type === Type.ERROR) { + return ["error", tree.body]; + } + if (opts.removeTags.has(tree.tag)) { + return; + } + const attribs = transformAttribs(tree.attribs, opts.removeAttribs); + const res: any[] = [transformTag(tree.tag, attribs)]; + if (Object.keys(attribs).length) { + res.push(attribs); + } + if (tree.body) { + res.push(tree.body); + } + if (tree.children && tree.children.length) { + transduce( + comp( + map((t: any) => transformTree(t, opts)), + filter((t) => !!t) + ), + push(), + res, + tree.children + ) + } + return res; +}; diff --git a/examples/xml-converter/src/format.ts b/examples/xml-converter/src/format.ts index e01ea07f32..87ae1bcd2e 100644 --- a/examples/xml-converter/src/format.ts +++ b/examples/xml-converter/src/format.ts @@ -6,57 +6,85 @@ import { DEFAULT, defmulti } from "@thi.ng/defmulti"; import { repeat } from "@thi.ng/strings/repeat"; import { peek } from "@thi.ng/transducers/func/peek"; -interface FormatterState { +export interface FormatOpts { indent: number; tabSize: number; + lineSep: string; prefix?: string; + quote: string; + ws: string; + trailingComma: boolean; } +export const DEFAULT_FORMAT: FormatOpts = { + indent: 0, + tabSize: 4, + trailingComma: true, + lineSep: "\n", + prefix: "", + quote: `"`, + ws: " " +}; + +export const COMPACT_FORMAT: FormatOpts = { + indent: 0, + tabSize: 0, + trailingComma: false, + lineSep: "", + prefix: "", + quote: `"`, + ws: "" +}; + // memoized indentations export const spaces = (n: number) => repeat(" ", n); // creates new state with deeper indentation -const indentState = (state: FormatterState): FormatterState => - ({ ...state, indent: state.indent + state.tabSize }); +const indentState = (opts: FormatOpts): FormatOpts => + ({ ...opts, indent: opts.indent + opts.tabSize }); // dispatch helper function for the `format` defmulti below -const classify = (_: FormatterState, x: any) => +const classify = (x: any) => isArray(x) ? "array" : isPlainObject(x) ? "obj" : DEFAULT; // wraps attrib name in quotes if needed -const formatAttrib = (x: string) => - /^[a-z]+$/i.test(x) ? x : `"${x}"`; +const formatAttrib = (opts: FormatOpts, x: string) => + /^[a-z]+$/i.test(x) ? x : opts.quote + x + opts.quote; // attrib or body value formatter -const formatVal = (state: FormatterState, x: any, indent = true) => +const formatVal = (opts: FormatOpts, x: any, indent = true) => isNumber(x) || isBoolean(x) ? x : isPlainObject(x) ? - format(indent ? indentState(state) : state, x, "") : - `"${x}"`; + format(indent ? indentState(opts) : opts, "", x) : + opts.quote + x + opts.quote; // attrib key-value pair formatter w/ indentation -const formatPair = (state: FormatterState, x: any, k: string) => - `${spaces(state.indent)}${formatAttrib(k)}: ${formatVal(state, x[k], k !== "style")}`; +const formatPair = (opts: FormatOpts, x: any, k: string) => + spaces(opts.indent) + formatAttrib(opts, k) + ":" + opts.ws + + formatVal(opts, x[k], k !== "style"); // multiple-dispatch function to format the transformed tree (hiccup // structure) into a more compact & legible format than produced by // standard: `JSON.stringify(tree, null, 4)` -export const format = defmulti(classify); +export const format = defmulti( + (_, __, x) => classify(x) +); // implementation for array values -format.add("array", (state, x, res) => { +format.add("array", (opts, res, x) => { const hasAttribs = isPlainObject(x[1]); let attribs = hasAttribs ? Object.keys(x[1]) : []; - res += `${spaces(state.indent)}["${x[0]}"`; + res += spaces(opts.indent) + "[" + opts.quote + x[0] + opts.quote; if (hasAttribs) { - res += ", "; + res += "," + opts.ws; res = format( { - ...indentState(state), - prefix: `\n${spaces(state.indent + state.tabSize)}` + ...indentState(opts), + prefix: `${opts.lineSep}${spaces(opts.indent + opts.tabSize)}` }, - x[1], res + res, + x[1] ); } // single line if none or only single child @@ -64,31 +92,36 @@ format.add("array", (state, x, res) => { if (x.length === (hasAttribs ? 3 : 2) && attribs.length < 2 && attribs[0] !== "style" && - classify(state, peek(x)) === DEFAULT) { - return format({ ...state, indent: 0 }, peek(x), res += ", ") + "]"; + classify(peek(x)) === DEFAULT) { + return format({ ...opts, indent: 0 }, res += "," + opts.ws, peek(x)) + "]"; } // default format if more children for (let i = hasAttribs ? 2 : 1; i < x.length; i++) { - res += ",\n"; - res = format(indentState(state), x[i], res); + res += "," + opts.lineSep; + res = format(indentState(opts), res, x[i]); } res += "]"; return res; }); // implementation for object values (i.e. attributes in this case) -format.add("obj", (state, x, res) => { +format.add("obj", (opts, res, x) => { const keys = Object.keys(x); if (keys.length === 0) { res += `{}`; } else if (keys.length === 1 && (keys[0] !== "style" || Object.keys(x.style).length < 2)) { - res += `{ ${formatPair({ ...state, indent: 0 }, x, keys[0])} }`; + res += "{" + opts.ws + formatPair({ ...opts, indent: 0 }, x, keys[0]) + opts.ws + "}"; } else { - const outer = spaces(state.indent); - res += `${state.prefix}{\n`; - for (let k in x) { - res += formatPair(k === "style" ? { ...indentState(state), prefix: "" } : indentState(state), x, k) + ",\n"; + const outer = spaces(opts.indent); + res += opts.prefix + opts.lineSep; + for (let i = keys.length; --i >= 0;) { + const k = keys[i]; + res += formatPair( + k === "style" ? + { ...indentState(opts), prefix: "" } : + indentState(opts), x, k); + res += (opts.trailingComma || i > 0 ? "," : "") + opts.lineSep; } res += outer + "}"; } @@ -96,5 +129,5 @@ format.add("obj", (state, x, res) => { }); // implementation for other values -format.add(DEFAULT, (state, x, res) => - res += spaces(state.indent) + formatVal(state, x)); +format.add(DEFAULT, (opts, res, x) => + res += spaces(opts.indent) + formatVal(opts, x)); diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index 2f64cbbce8..907f2b29bf 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -1,166 +1,143 @@ -import { isString } from "@thi.ng/checks/is-string"; -import { stream, Stream } from "@thi.ng/rstream/stream"; -import { - parse, - ParseElement, - ParseEvent, - Type -} from "@thi.ng/sax"; -import { maybeParseFloat } from "@thi.ng/strings/parse"; +import { stream } from "@thi.ng/rstream/stream"; +import { sync } from "@thi.ng/rstream/stream-sync"; import { splice } from "@thi.ng/strings/splice"; import { updateDOM } from "@thi.ng/transducers-hdom"; -import { comp } from "@thi.ng/transducers/func/comp"; -import { identity } from "@thi.ng/transducers/func/identity"; -import { pairs } from "@thi.ng/transducers/iter/pairs"; -import { assocObj } from "@thi.ng/transducers/rfn/assoc-obj"; -import { last } from "@thi.ng/transducers/rfn/last"; -import { push } from "@thi.ng/transducers/rfn/push"; -import { transduce } from "@thi.ng/transducers/transduce"; -import { filter } from "@thi.ng/transducers/xform/filter"; import { map } from "@thi.ng/transducers/xform/map"; -import { multiplex } from "@thi.ng/transducers/xform/multiplex"; -import { format, spaces } from "./format"; +import { mapIndexed } from "@thi.ng/transducers/xform/map-indexed"; +import { convertXML } from "./convert"; +import { COMPACT_FORMAT, DEFAULT_FORMAT } from "./format"; +import { xformAsSet } from "./utils"; -// parses given XMLish string using @thi.ng/sax transducer into a -// sequence of parse events. we only care about the final (or error) -// event, which will be related to the final close tag and contains the -// entire tree -const parseXML = (src: string) => - transduce( - comp( - parse({ trim: true, boolean: true, entities: true }), - filter((e) => e.type === Type.ELEM_END || e.type === Type.ERROR) - ), - last(), - src - ); - -// transforms string of CSS properties into a plain object -const transformCSS = (css: string) => - css.split(";").reduce( - (acc, p) => { - const [k, v] = p.split(":"); - (v != null) && (acc[k.trim()] = parseAttrib([k, v.trim()])[1]); - return acc; - }, - {} - ); - -// takes attrib key-value pair and attempts to coerce / transform its -// value. returns updated pair. -const parseAttrib = ([k, v]: string[]) => - k === "style" && isString(v) ? - [k, transformCSS(v)] : - v === "true" ? - [k, true] : - v === "false" ? - [k, false] : - [k, maybeParseFloat(v, v)]; +// input streams (reactive state values) +const inputs = { + xml: stream(), + prettyPrint: stream(), + doubleQuote: stream(), + trailingComma: stream(), + removeAttribs: stream(), + removeTags: stream(), +}; -// transforms an entire object of attributes -const transformAttribs = (attribs: any) => - transduce( - map(parseAttrib), - assocObj(), - attribs, - pairs(attribs) - ); +// configurable editor panel UI component +// (uses Tachyons CSS classes for styling) +const editPane = (_, title, attribs, value, extra?) => + ["div", + ["h3.ma0.mb2", ...title], + ["textarea.pa2.f7.code", { cols: 72, rows: 25, value, ...attribs }], + ["div", `${value.length} chars`], + extra]; -// transforms element name by attempting to form Emmet-like tags -const transformTag = (tag: string, attribs: any) => { - if (attribs.id) { - tag += "#" + attribs.id; - delete attribs.id; - } - if (isString(attribs.class)) { - const classes = attribs.class.replace(/\s+/g, "."); - classes.length && (tag += "." + classes); - delete attribs.class; - } - return tag; -}; +// configurable input UI component +const input = (_, label, attribs) => + ["div.mb2", + ["label.dib.w5", { for: attribs.id }, label], + ["input.pa1", attribs]]; -// recursively transforms entire parse tree -const transformTree = (tree: ParseEvent | ParseElement) => { - if ((tree).type === Type.ERROR) { - return ["error", tree.body]; - } - const attribs = transformAttribs(tree.attribs); - const res: any[] = [transformTag(tree.tag, attribs)]; - if (Object.keys(attribs).length) { - res.push(attribs); - } - if (tree.body) { - res.push(tree.body); - } - if (tree.children && tree.children.length) { - transduce(map(transformTree), push(), res, tree.children) - } - return res; -}; +// combined transform options input components +const transformOpts = (_, inputs) => + ["div", + ["h3", "Options"], + mapIndexed( + (i, [label, type, stream]) => { + let v = type === "checkbox" ? "checked" : "value"; + return [input, label, + { + id: "opt" + i, + type, + [v]: stream.deref(), + oninput: (e) => stream.next(e.target[v]) + }]; + }, + [ + ["Remove tags", "text", inputs.removeTags], + ["Remove attributes", "text", inputs.removeAttribs], + ["Pretty print", "checkbox", inputs.prettyPrint], + ["Double quotes", "checkbox", inputs.doubleQuote], + ["Trailing commas", "checkbox", inputs.trailingComma], + ] + ) + ]; // hdom UI root component receives tuple of xml & formatted hiccup // strings. defined as closure purely for demonstration purposes and to -// avoid app using global vars -const app = (src: Stream) => - ([xml, hiccup]: string[]) => +// avoid component is using global vars +const app = (inputs: any) => + ({ src, hiccup }) => ["div.flex", - ["div", - ["h3", "XML/HTML source", - ["small.fw1.ml2", "(must be well formed!)"]], - ["textarea.mr2.f7.code.bg-light-yellow", - { - cols: 72, - rows: 25, - autofocus: true, - onkeydown: (e: KeyboardEvent) => { - // override tab to insert spaces at edit pos - if (e.key === "Tab") { - e.preventDefault(); - src.next( - splice(xml, spaces(4), (e.target).selectionStart) - ); - } - }, - // emitting a new value to the stream will - // re-trigger UI update - oninput: (e) => src.next(e.target.value), - value: xml - }] - ], - ["div", - ["h3", "Parsed Hiccup / JSON"], - ["textarea.f7.code", - { - cols: 72, - rows: 25, - disabled: true, - value: hiccup + [editPane, + ["XML/HTML source", ["small.fw1.ml2", "(must be well formed!)"]], + { + class: "mr2 bg-light-yellow", + autofocus: true, + onkeydown: (e: KeyboardEvent) => { + // override tab to insert spaces at edit pos + if (e.key === "Tab") { + e.preventDefault(); + inputs.xml.next( + splice(src, " ", (e.target).selectionStart) + ); + } }, - ] - ] - ]; + // emitting a new value to the stream will + // re-trigger UI update + oninput: (e) => inputs.xml.next(e.target.value), + }, + src], + [editPane, + ["Transformed Hiccup / JSON"], + { disabled: true }, + hiccup, + [transformOpts, inputs]]]; -// create a stream which transforms input values (xml strings) parses, -// transforms and formats them and then forms a tuple of: -// `[orig, formatted]` to pass to the root component function and -// finally updates the DOM -const src = stream(); -src.transform( - multiplex( - map(identity), - comp( - map(parseXML), - map(transformTree), - map((tree) => format({ indent: 0, tabSize: 4 }, tree, "")) - ) - ), - map(app(src)), +// stream combinator to assemble formatter options +const formatOpts = sync({ + src: { + trailingComma: inputs.trailingComma, + doubleQuote: inputs.doubleQuote, + prettyPrint: inputs.prettyPrint, + }, + xform: map( + (opts: any) => ({ + ...(opts.prettyPrint ? DEFAULT_FORMAT : COMPACT_FORMAT), + trailingComma: opts.trailingComma, + quote: opts.doubleQuote ? `"` : `'`, + }) + ) +}); + +// stream combinator to assemble conversion options +const opts = sync({ + src: { + format: formatOpts, + removeAttribs: inputs.removeAttribs.transform(xformAsSet), + removeTags: inputs.removeTags.transform(xformAsSet), + } +}); + +// main stream combinator to create & update UI +const main = sync({ + src: { + opts, + src: inputs.xml + } +}).transform( + map((state: any) => ({ + ...state, + hiccup: convertXML(state.src, state.opts) + })), + map(app(inputs)), updateDOM() ); +// initial options +inputs.removeTags.next("head"); +inputs.removeAttribs.next("id,class"); +inputs.trailingComma.next(true); +inputs.doubleQuote.next(true); +inputs.prettyPrint.next(true); + // seed input and kick off UI/app -src.next(` +inputs.xml.next(` foo @@ -176,5 +153,5 @@ src.next(` // ParcelJS HMR handling if (process.env.NODE_ENV !== "production") { const hot = (module).hot; - hot && hot.dispose(() => src.done()); + hot && hot.dispose(() => main.done()); } diff --git a/examples/xml-converter/src/utils.ts b/examples/xml-converter/src/utils.ts new file mode 100644 index 0000000000..8bc7d16918 --- /dev/null +++ b/examples/xml-converter/src/utils.ts @@ -0,0 +1,7 @@ +import { map } from "@thi.ng/transducers/xform/map"; + +export const asSet = (x: string) => + new Set(map((x) => x.trim(), x.split(","))); + +// helper transducer to convert a CSV string into an ES6 Set +export const xformAsSet = map(asSet); diff --git a/examples/xml-converter/tsconfig-cli.json b/examples/xml-converter/tsconfig-cli.json new file mode 100644 index 0000000000..8471f0aa29 --- /dev/null +++ b/examples/xml-converter/tsconfig-cli.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "bin", + "target": "es6", + "module": "commonjs" + }, + "include": [ + "./src/**/*.ts" + ] +} \ No newline at end of file From 71cbd19a5615506ca4055056dd5131902a24c19a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 27 Sep 2018 16:25:10 +0100 Subject: [PATCH 27/77] fix(examples): fix attrib format --- examples/xml-converter/src/format.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/xml-converter/src/format.ts b/examples/xml-converter/src/format.ts index 87ae1bcd2e..db99cc652c 100644 --- a/examples/xml-converter/src/format.ts +++ b/examples/xml-converter/src/format.ts @@ -114,7 +114,7 @@ format.add("obj", (opts, res, x) => { res += "{" + opts.ws + formatPair({ ...opts, indent: 0 }, x, keys[0]) + opts.ws + "}"; } else { const outer = spaces(opts.indent); - res += opts.prefix + opts.lineSep; + res += opts.prefix + "{" + opts.lineSep; for (let i = keys.length; --i >= 0;) { const k = keys[i]; res += formatPair( From 5cfbf70da641c8239445435fb624ede35c3a793f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 27 Sep 2018 20:55:38 +0100 Subject: [PATCH 28/77] feat(examples): update css --- examples/xml-converter/index.html | 14 ++++++++------ examples/xml-converter/src/index.ts | 22 +++++++++++++--------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/examples/xml-converter/index.html b/examples/xml-converter/index.html index 63cebaa1d8..905fec36aa 100644 --- a/examples/xml-converter/index.html +++ b/examples/xml-converter/index.html @@ -5,16 +5,18 @@ - xml-converter + xml/html/svg-to-hiccup converter - - + +
+

XML / Hiccup converter

+
-
- Source code + diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index 907f2b29bf..bf149f4ff6 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -21,17 +21,17 @@ const inputs = { // configurable editor panel UI component // (uses Tachyons CSS classes for styling) const editPane = (_, title, attribs, value, extra?) => - ["div", + ["div.w-50-ns.pa3", ["h3.ma0.mb2", ...title], - ["textarea.pa2.f7.code", { cols: 72, rows: 25, value, ...attribs }], - ["div", `${value.length} chars`], + ["textarea.w-100.pa2.bn.f7.code", { rows: 25, value, ...attribs }], + ["div.f7", `${value.length} chars`], extra]; // configurable input UI component const input = (_, label, attribs) => ["div.mb2", - ["label.dib.w5", { for: attribs.id }, label], - ["input.pa1", attribs]]; + ["label.dib.w-100.w-25-l.pv2", { for: attribs.id }, label], + ["input.w-100.w-75-l.pa1.bg-light-silver.white.bn", attribs]]; // combined transform options input components const transformOpts = (_, inputs) => @@ -63,11 +63,11 @@ const transformOpts = (_, inputs) => // avoid component is using global vars const app = (inputs: any) => ({ src, hiccup }) => - ["div.flex", + ["div.flex-ns", [editPane, - ["XML/HTML source", ["small.fw1.ml2", "(must be well formed!)"]], + ["XML/HTML source", ["small.fw1.ml2.dn.dib-l", "(must be well formed!)"]], { - class: "mr2 bg-light-yellow", + class: "bg-washed-green", autofocus: true, onkeydown: (e: KeyboardEvent) => { // override tab to insert spaces at edit pos @@ -85,7 +85,11 @@ const app = (inputs: any) => src], [editPane, ["Transformed Hiccup / JSON"], - { disabled: true }, + { + class: hiccup.indexOf("error") < 0 ? + "bg-light-gray" : + "bg-washed-red" + }, hiccup, [transformOpts, inputs]]]; From 6db26c2b2ff8db80dc3dfdce202737b26f2726c0 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 01:31:38 +0100 Subject: [PATCH 29/77] feat(examples): add copy-to-clipboard, extract UI config & components - add copy button to place result tree in clipboard - move all components to `ui.ts` - extract UI config to simplify components - update transformTree() to check for empty input --- examples/xml-converter/index.html | 8 +- examples/xml-converter/src/convert.ts | 3 + examples/xml-converter/src/index.ts | 101 +++------------- examples/xml-converter/src/ui.ts | 159 ++++++++++++++++++++++++++ examples/xml-converter/src/utils.ts | 16 +++ 5 files changed, 201 insertions(+), 86 deletions(-) create mode 100644 examples/xml-converter/src/ui.ts diff --git a/examples/xml-converter/index.html b/examples/xml-converter/index.html index 905fec36aa..bca5d4683a 100644 --- a/examples/xml-converter/index.html +++ b/examples/xml-converter/index.html @@ -9,14 +9,14 @@ - -
+ +

XML / Hiccup converter

diff --git a/examples/xml-converter/src/convert.ts b/examples/xml-converter/src/convert.ts index e78b7bf8a4..08bf73e1ff 100644 --- a/examples/xml-converter/src/convert.ts +++ b/examples/xml-converter/src/convert.ts @@ -108,6 +108,9 @@ const transformTag = (tag: string, attribs: any) => { // recursively transforms entire parse tree const transformTree = (tree: ParseEvent | ParseElement, opts: ConversionOpts) => { + if (tree == null) { + return ""; + } if ((tree).type === Type.ERROR) { return ["error", tree.body]; } diff --git a/examples/xml-converter/src/index.ts b/examples/xml-converter/src/index.ts index bf149f4ff6..402b9c11ef 100644 --- a/examples/xml-converter/src/index.ts +++ b/examples/xml-converter/src/index.ts @@ -1,11 +1,11 @@ import { stream } from "@thi.ng/rstream/stream"; import { sync } from "@thi.ng/rstream/stream-sync"; -import { splice } from "@thi.ng/strings/splice"; import { updateDOM } from "@thi.ng/transducers-hdom"; import { map } from "@thi.ng/transducers/xform/map"; -import { mapIndexed } from "@thi.ng/transducers/xform/map-indexed"; + import { convertXML } from "./convert"; import { COMPACT_FORMAT, DEFAULT_FORMAT } from "./format"; +import { app, UI } from "./ui"; import { xformAsSet } from "./utils"; // input streams (reactive state values) @@ -16,83 +16,9 @@ const inputs = { trailingComma: stream(), removeAttribs: stream(), removeTags: stream(), + copyButton: stream(), }; -// configurable editor panel UI component -// (uses Tachyons CSS classes for styling) -const editPane = (_, title, attribs, value, extra?) => - ["div.w-50-ns.pa3", - ["h3.ma0.mb2", ...title], - ["textarea.w-100.pa2.bn.f7.code", { rows: 25, value, ...attribs }], - ["div.f7", `${value.length} chars`], - extra]; - -// configurable input UI component -const input = (_, label, attribs) => - ["div.mb2", - ["label.dib.w-100.w-25-l.pv2", { for: attribs.id }, label], - ["input.w-100.w-75-l.pa1.bg-light-silver.white.bn", attribs]]; - -// combined transform options input components -const transformOpts = (_, inputs) => - ["div", - ["h3", "Options"], - mapIndexed( - (i, [label, type, stream]) => { - let v = type === "checkbox" ? "checked" : "value"; - return [input, label, - { - id: "opt" + i, - type, - [v]: stream.deref(), - oninput: (e) => stream.next(e.target[v]) - }]; - }, - [ - ["Remove tags", "text", inputs.removeTags], - ["Remove attributes", "text", inputs.removeAttribs], - ["Pretty print", "checkbox", inputs.prettyPrint], - ["Double quotes", "checkbox", inputs.doubleQuote], - ["Trailing commas", "checkbox", inputs.trailingComma], - ] - ) - ]; - -// hdom UI root component receives tuple of xml & formatted hiccup -// strings. defined as closure purely for demonstration purposes and to -// avoid component is using global vars -const app = (inputs: any) => - ({ src, hiccup }) => - ["div.flex-ns", - [editPane, - ["XML/HTML source", ["small.fw1.ml2.dn.dib-l", "(must be well formed!)"]], - { - class: "bg-washed-green", - autofocus: true, - onkeydown: (e: KeyboardEvent) => { - // override tab to insert spaces at edit pos - if (e.key === "Tab") { - e.preventDefault(); - inputs.xml.next( - splice(src, " ", (e.target).selectionStart) - ); - } - }, - // emitting a new value to the stream will - // re-trigger UI update - oninput: (e) => inputs.xml.next(e.target.value), - }, - src], - [editPane, - ["Transformed Hiccup / JSON"], - { - class: hiccup.indexOf("error") < 0 ? - "bg-light-gray" : - "bg-washed-red" - }, - hiccup, - [transformOpts, inputs]]]; - // stream combinator to assemble formatter options const formatOpts = sync({ src: { @@ -121,18 +47,25 @@ const opts = sync({ // main stream combinator to create & update UI const main = sync({ src: { + src: inputs.xml, + copy: inputs.copyButton, opts, - src: inputs.xml } }).transform( + // convert xml -> hiccup map((state: any) => ({ ...state, hiccup: convertXML(state.src, state.opts) })), - map(app(inputs)), - updateDOM() + // transform into hdom tree + map(app(UI.main, inputs)), + // apply to real DOM + updateDOM({ ctx: UI }) ); +// all inputs need to be initialized +// in order for the UI to be rendered at least once + // initial options inputs.removeTags.next("head"); inputs.removeAttribs.next("id,class"); @@ -140,8 +73,11 @@ inputs.trailingComma.next(true); inputs.doubleQuote.next(true); inputs.prettyPrint.next(true); +inputs.copyButton.next(false); + // seed input and kick off UI/app -inputs.xml.next(` +inputs.xml.next( + ` foo @@ -152,7 +88,8 @@ inputs.xml.next(`
-`); +` +); // ParcelJS HMR handling if (process.env.NODE_ENV !== "production") { diff --git a/examples/xml-converter/src/ui.ts b/examples/xml-converter/src/ui.ts new file mode 100644 index 0000000000..738453d71d --- /dev/null +++ b/examples/xml-converter/src/ui.ts @@ -0,0 +1,159 @@ +import { mapIndexed } from "@thi.ng/transducers/xform/map-indexed"; +import { handleTab } from "./utils"; + +// converted from: +// https://github.com/IBM/carbon-icons/blob/master/src/svg/copy.svg +const ICON_COPY = + ["svg.mr2", { viewBox: "0 0 16 16", width: "0.7rem", height: "0.7rem", stroke: "white" }, + ["path", { d: "M1,10H0V2c0-1.1,0.9-2,2-2l8,0l0,1L2,1C1.4,1,1,1.5,1,2L1,10z" }], + ["path", { d: "M11,4.2V8h3.8L11,4.2z M15,9h-4c-0.6,0-1-0.4-1-1V4H4.5C4.2,4,4,4.2,4,4.5v10C4,14.8,4.2,15,4.5,15h10 c0.3,0,0.5-0.2,0.5-0.5V9z M11,3c0.1,0,0.3,0.1,0.4,0.1l4.5,4.5C15.9,7.7,16,7.9,16,8v6.5c0,0.8-0.7,1.5-1.5,1.5h-10 C3.7,16,3,15.3,3,14.5v-10C3,3.7,3.7,3,4.5,3H11z" }]]; + +// component styles: +// this object will be provided as hdom user context to all +// component functions +export const UI = { + editor: { + root: { class: "w-50-ns pa3" }, + title: { class: "ma0 mb2" }, + textarea: { class: "w-100.pa2.bn.f7.code.lh-copy" }, + stats: { class: "f7" } + }, + input: { + root: { class: "mb2" }, + label: { class: "dib w-100 w-25-l pv2" }, + input: { class: "w-100 w-75-l pa1 bg-silver white bn" }, + }, + button: { + href: "#", + class: "dib.link.white.pv1.ph2.w4.bn.hover-bg-blue.bg-animate", + }, + copyButton: { + style: { + position: "relative", + top: "-3rem", + left: "0.5rem" + }, + }, + main: { + small: { class: "fw1 ml2 dn dib-l" }, + src: { + class: "bg-washed-green", + autofocus: true, + }, + result: { + success: { + disabled: true, + class: "bg-light-gray" + }, + error: { + disabled: true, + class: "bg-washed-red" + } + }, + } +}; + +// hdom UI root component. this function will be used as stream +// transformer and receives a tuple of xml & formatted hiccup strings. +// defined as closure to avoid using global vars. the `ctx` is the above +// `UI.main` and `inputs` are defined in `index.ts`. +export const app = (ctx: any, inputs: any) => + ({ src, hiccup }) => + ["div.flex-ns", + [editPane, + [ + "XML/HTML source", + ["small", ctx.small, "(must be well formed!)"] + ], + { + ...ctx.src, + onkeydown: handleTab(inputs.xml), + // emitting a new value to the stream will + // re-trigger conversion & UI update + oninput: (e) => inputs.xml.next(e.target.value), + }, + src], + [editPane, + ["Transformed Hiccup / JSON"], + hiccup.indexOf("error") < 0 ? + ctx.result.success : + ctx.result.error, + hiccup, + [copyButton, + { + class: hiccup.indexOf("error") < 0 ? + "bg-green" : + "bg-gray" + }, + inputs.copyButton, + hiccup], + [transformOpts, inputs]]]; + +// configurable editor panel UI component +// (uses Tachyons CSS classes for styling) +const editPane = ({ editor }, title, attribs, value, ...extra) => + ["div", editor.root, + ["h3", editor.title, ...title], + [`textarea.${editor.textarea.class}`, { rows: 16, value, ...attribs }], + ["div", editor.stats, `${value.length} chars`], + ...extra]; + +// configurable input UI component +const input = ({ input }, label, attribs) => + ["div", input.root, + ["label", { ...input.label, for: attribs.id }, label], + ["input", { ...input.input, ...attribs }]]; + + +const iconButton = ({ button }, attribs, icon, label) => + [`a.${button.class}`, { ...button, ...attribs }, icon, label]; + +// button which, when clicked, copies given `text` to clipboard and +// emits true on `stream`. resets stream back to false after given +// `delay` time. +const copyButton = ({ copyButton }, attribs, stream, text, delay = 500) => + [iconButton, + { + ...copyButton, + ...attribs, + onclick: (e) => { + e.preventDefault(); + e.target.blur(); + (navigator).clipboard.writeText(text) + .then( + () => { + setTimeout(() => stream.next(false), delay); + stream.next(true); + }, + () => alert("Couldn't copy to clipboard") + ); + } + }, + ICON_COPY, + stream.deref() ? "Copied" : "Copy" + ]; + +// combined transform options input components +const transformOpts = (_, inputs) => + ["div", + ["h3", "Options"], + mapIndexed( + (i, [label, type, stream]) => { + let v = type === "checkbox" ? "checked" : "value"; + return [input, label, + { + id: "opt" + i, + type, + [v]: stream.deref(), + oninput: (e) => stream.next(e.target[v]) + }]; + }, + [ + ["Remove tags", "text", inputs.removeTags], + ["Remove attributes", "text", inputs.removeAttribs], + ["Pretty print", "checkbox", inputs.prettyPrint], + ["Double quotes", "checkbox", inputs.doubleQuote], + ["Trailing commas", "checkbox", inputs.trailingComma], + ] + ) + ]; diff --git a/examples/xml-converter/src/utils.ts b/examples/xml-converter/src/utils.ts index 8bc7d16918..008ad8b5e4 100644 --- a/examples/xml-converter/src/utils.ts +++ b/examples/xml-converter/src/utils.ts @@ -1,3 +1,4 @@ +import { splice } from "@thi.ng/strings/splice"; import { map } from "@thi.ng/transducers/xform/map"; export const asSet = (x: string) => @@ -5,3 +6,18 @@ export const asSet = (x: string) => // helper transducer to convert a CSV string into an ES6 Set export const xformAsSet = map(asSet); + +// key event handler for textareas to override Tab key behavior and +// insert spaces at cursor position instead of changing keyboard focus +export const handleTab = (stream) => + (e: KeyboardEvent) => { + // override tab to insert spaces at edit pos + if (e.key === "Tab") { + e.preventDefault(); + stream.next( + splice((e.target).value, " ", + (e.target).selectionStart + ) + ); + } + }; From d964865e982043136aa05e6922ce5860c32b7a68 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 02:23:39 +0100 Subject: [PATCH 30/77] docs(hdom): add xml-converter example link & screenshot --- assets/screenshots/xml-converter.png | Bin 0 -> 201953 bytes packages/hdom/README.md | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 assets/screenshots/xml-converter.png diff --git a/assets/screenshots/xml-converter.png b/assets/screenshots/xml-converter.png new file mode 100644 index 0000000000000000000000000000000000000000..16aa3ab321a441608960e48ea8827b977338f7be GIT binary patch literal 201953 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 literal 0 HcmV?d00001 diff --git a/packages/hdom/README.md b/packages/hdom/README.md index c7bd682676..083679e1cf 100644 --- a/packages/hdom/README.md +++ b/packages/hdom/README.md @@ -28,6 +28,7 @@ This project is part of the - [Example projects](#example-projects) - [Realtime crypto candle chart](#realtime-crypto-candle-chart) - [Git commit log table](#git-commit-log-table) + - [XML/HTML/SVG to Hiccup converter](#xmlhtmlsvg-to-hiccup-converter) - [Interactive SVG grid generator](#interactive-svg-grid-generator) - [Interactive additive waveform visualization](#interactive-additive-waveform-visualization) - [Dataflow graph SVG components](#dataflow-graph-svg-components) @@ -730,6 +731,13 @@ Non-exhaustive list: [Source](https://github.com/thi-ng/umbrella/tree/master/examples/commit-table-ssr) | [Live version](https://demo.thi.ng/umbrella/commit-table-ssr/) +### XML/HTML/SVG to Hiccup converter + +![screenshot](https://raw.githubusercontent.com/thi-ng/umbrella/master/assets/screenshots/xml-converter.png) + +[Source](https://github.com/thi-ng/umbrella/tree/master/examples/xml-converter) | +[Live version](https://demo.thi.ng/umbrella/xml-converter/) + ### Interactive SVG grid generator ![screenshot](https://raw.githubusercontent.com/thi-ng/umbrella/master/assets/screenshots/rstream-grid.png) From b5ed2545add8f8a9d3cc50b9dcad3387aae95872 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 04:57:05 +0100 Subject: [PATCH 31/77] feat(vectors): add vector ops codegen, update basic vec2/3/4 ops (#51) --- packages/vectors/src/api.ts | 12 +++ packages/vectors/src/codegen.ts | 70 +++++++++++++++++ packages/vectors/src/index.ts | 2 + packages/vectors/src/vec2.ts | 72 ++++++----------- packages/vectors/src/vec3.ts | 120 ++++++----------------------- packages/vectors/src/vec4.ts | 132 ++++++-------------------------- 6 files changed, 159 insertions(+), 249 deletions(-) create mode 100644 packages/vectors/src/codegen.ts diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 1cb3389c74..46bd1d088f 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -18,12 +18,24 @@ export type VecOp1 = (v: Vec, i?: number, s?: number) => T; */ export type VecOp2 = (a: Vec, b: ReadonlyVec, ia?: number, ib?: number, sa?: number, sb?: number) => T; +/** + * A vector operation involving a vector and a scalar. The vector might + * be modified. + */ +export type VecOpN2 = (a: Vec, n: number, ia?: number, sa?: number) => T; + /** * A vector operation involving input readonly two vectors and writing * result to an output vector `out`. */ export type VecOp2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io?: number, ia?: number, ib?: number, so?: number, sa?: number, sb?: number) => T; +/** + * A vector operation involving input readonly two vectors and writing + * result to an output vector `out`. + */ +export type VecOpN2o = (out: Vec, a: ReadonlyVec, n: number, io?: number, ia?: number, so?: number, sa?: number) => T; + /** * A readonly vector operation involving only a single vector. */ diff --git a/packages/vectors/src/codegen.ts b/packages/vectors/src/codegen.ts new file mode 100644 index 0000000000..38329833dc --- /dev/null +++ b/packages/vectors/src/codegen.ts @@ -0,0 +1,70 @@ +import { + Vec, + VecOp1, + VecOp2, + VecOp2o, + VecOpN2, + VecOpN2o +} from "@thi.ng/vectors/src/api"; + +const compile = (args: string, src: string[]) => + new Function(args, src.join("")); + +const assemble = (fn: (op: string, i: number) => string, dim: number, op: string, ret = "a") => { + const src = []; + for (let i = 0; i < dim; i++) { + src.push(fn(op, i)); + } + src.push(`return ${ret};`); + return src; +} + +const uniop = (op: string, i: number) => + i > 1 ? + `a[ia+${i}*sa]=${op}(a[ia+${i}*sa]);` : + i == 1 ? + `a[ia+sa]=${op}(a[ia+sa]);` : + `a[ia]=${op}(a[ia]);`; + +const binop = (op: string, i: number) => + i > 1 ? + `a[ia+${i}*sa]${op}=b[ib+${i}*sb];` : + i == 1 ? + `a[ia+sa]${op}=b[ib+sb];` : + `a[ia]${op}=b[ib];`; + +const binopN = (op: string, i: number) => + i > 1 ? + `a[ia+${i}*sa]${op}=n;` : + i == 1 ? + `a[ia+sa]${op}=n;` : + `a[ia]${op}=n;`; + +const binopO = (op: string, i: number) => + i > 1 ? + `o[io+${i}*so]=a[ia+${i}*sa]${op}b[ib+${i}*sb];` : + i == 1 ? + `o[io+so]=a[ia+sa]${op}b[ib+sb];` : + `o[io]=a[ia]${op}b[ib];`; + +const binopON = (op: string, i: number) => + i > 1 ? + `o[io+${i}*so]=a[ia+${i}*sa]${op}n;` : + i == 1 ? + `o[io+so]=a[ia+sa]${op}n;` : + `o[io]=a[ia]${op}n;`; + +export const vuniop = (dim: number, op: string): VecOp1 => + compile("a,ia=0,sa=1", assemble(uniop, dim, op)); + +export const vbinop = (dim: number, op: string): VecOp2 => + compile("a,b,ia=0,ib=0,sa=1,sb=1", assemble(binop, dim, op)); + +export const vbinopN = (dim: number, op: string): VecOpN2 => + compile("a,n,ia=0,sa=1", assemble(binopN, dim, op)); + +export const vbinopO = (dim: number, op: string): VecOp2o => + compile("o,a,b,io=0,ia=0,ib=0,so=1,sa=1,sb=1", assemble(binopO, dim, op, "o")); + +export const vbinopON = (dim: number, op: string): VecOpN2o => + compile("o,a,n,io=0,ia=0,so=1,sa=1", assemble(binopON, dim, op, "o")); diff --git a/packages/vectors/src/index.ts b/packages/vectors/src/index.ts index 5ffd20465f..f795cc3571 100644 --- a/packages/vectors/src/index.ts +++ b/packages/vectors/src/index.ts @@ -8,3 +8,5 @@ export * from "./gvec"; export * from "./vec2"; export * from "./vec3"; export * from "./vec4"; + +export * from "./codegen"; diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index 98fdad7ef8..ad46db0484 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -14,6 +14,12 @@ import { Vec, ZERO4 } from "./api"; +import { + vbinop, + vbinopN, + vbinopO, + vbinopON +} from "./codegen"; import { $iter, declareIndices } from "./common"; import { atan2Abs1, @@ -91,53 +97,25 @@ export const eqDelta2 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia], b[ib], eps) && eqDelta1(a[ia + sa], b[ib + sb], eps); -export const add2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - (a[ia] += b[ib], a[ia + sa] += b[ib + sb], a); - -export const sub2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - (a[ia] -= b[ib], a[ia + sa] -= b[ib + sb], a); - -export const mul2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - (a[ia] *= b[ib], a[ia + sa] *= b[ib + sb], a); - -export const div2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - (a[ia] /= b[ib], a[ia + sa] /= b[ib + sb], a); - -export const add2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => - (out[io] = a[ia] + b[ib], out[io + so] = a[ia + sa] + b[ib + sb], out); - -export const sub2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => - (out[io] = a[ia] - b[ib], out[io + so] = a[ia + sa] - b[ib + sb], out); - -export const mul2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => - (out[io] = a[ia] * b[ib], out[io + so] = a[ia + sa] * b[ib + sb], out); - -export const div2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => - (out[io] = a[ia] / b[ib], out[io + so] = a[ia + sa] / b[ib + sb], out); - -export const addN2 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] += n, a[ia + sa] += n, a); - -export const subN2 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] -= n, a[ia + sa] -= n, a); - -export const mulN2 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] *= n, a[ia + sa] *= n, a); - -export const divN2 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] /= n, a[ia + sa] /= n, a); - -export const addN2o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => - (out[io] = a[ia] + n, out[io + so] = a[ia + sa] + n, out); - -export const subN2o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => - (out[io] = a[ia] - n, out[io + so] = a[ia + sa] - n, out); - -export const mulN2o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => - (out[io] = a[ia] * n, out[io + so] = a[ia + sa] * n, out); - -export const divN2o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => - (out[io] = a[ia] / n, out[io + so] = a[ia + sa] / n, out); +export const add2 = vbinop(2, "+"); +export const sub2 = vbinop(2, "-"); +export const mul2 = vbinop(2, "*"); +export const div2 = vbinop(2, "/"); + +export const add2o = vbinopO(2, "+"); +export const sub2o = vbinopO(2, "-"); +export const mul2o = vbinopO(2, "*"); +export const div2o = vbinopO(2, "/"); + +export const addN2 = vbinopN(2, "+"); +export const subN2 = vbinopN(2, "-"); +export const mulN2 = vbinopN(2, "*"); +export const divN2 = vbinopN(2, "/"); + +export const addN2o = vbinopON(2, "+"); +export const subN2o = vbinopON(2, "-"); +export const mulN2o = vbinopON(2, "*"); +export const divN2o = vbinopON(2, "/"); export const neg2 = (a: Vec, ia = 0, sa = 1) => mulN2(a, -1, ia, sa); diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 91ad0dc891..3623be771f 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -14,6 +14,12 @@ import { Vec, ZERO4 } from "./api"; +import { + vbinop, + vbinopN, + vbinopO, + vbinopON +} from "./codegen"; import { $iter, declareIndices } from "./common"; import { atan2Abs1, @@ -115,101 +121,25 @@ export const eqDelta3 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + sa], b[ib + sb], eps) && eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps); -export const add3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] += b[ib], - a[ia + sa] += b[ib + sb], - a[ia + 2 * sa] += b[ib + 2 * sb], - a -); - -export const mul3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] *= b[ib], - a[ia + sa] *= b[ib + sb], - a[ia + 2 * sa] *= b[ib + 2 * sb], - a -); - -export const sub3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] -= b[ib], - a[ia + sa] -= b[ib + sb], - a[ia + 2 * sa] -= b[ib + 2 * sb], - a -); - -export const div3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] /= b[ib], - a[ia + sa] /= b[ib + sb], - a[ia + 2 * sa] /= b[ib + 2 * sb], - a -); - -export const add3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] + b[ib], - out[io + so] = a[ia + sa] + b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] + b[ib + 2 * sb], - out -); - -export const sub3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] - b[ib], - out[io + so] = a[ia + sa] - b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] - b[ib + 2 * sb], - out -); - -export const mul3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] * b[ib], - out[io + so] = a[ia + sa] * b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] * b[ib + 2 * sb], - out -); - -export const div3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] / b[ib], - out[io + so] = a[ia + sa] / b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] / b[ib + 2 * sb], - out -); - -export const addN3 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] += n, a[ia + sa] += n, a[ia + 2 * sa] += n, a); - -export const subN3 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] -= n, a[ia + sa] -= n, a[ia + 2 * sa] -= n, a); - -export const mulN3 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] *= n, a[ia + sa] *= n, a[ia + 2 * sa] *= n, a); - -export const divN3 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] /= n, a[ia + sa] /= n, a[ia + 2 * sa] /= n, a); - -export const addN3o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] + n, - out[io + so] = a[ia + sa] + n, - out[io + 2 * so] = a[ia + 2 * sa] + n, - out -); - -export const subN3o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] - n, - out[io + so] = a[ia + sa] - n, - out[io + 2 * so] = a[ia + 2 * sa] - n, - out -); - -export const mulN3o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] * n, - out[io + so] = a[ia + sa] * n, - out[io + 2 * so] = a[ia + 2 * sa] * n, - out -); - -export const divN3o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] / n, - out[io + so] = a[ia + sa] / n, - out[io + 2 * so] = a[ia + 2 * sa] / n, - out -); +export const add3 = vbinop(3, "+"); +export const sub3 = vbinop(3, "-"); +export const mul3 = vbinop(3, "*"); +export const div3 = vbinop(3, "/"); + +export const add3o = vbinopO(3, "+"); +export const sub3o = vbinopO(3, "-"); +export const mul3o = vbinopO(3, "*"); +export const div3o = vbinopO(3, "/"); + +export const addN3 = vbinopN(3, "+"); +export const subN3 = vbinopN(3, "-"); +export const mulN3 = vbinopN(3, "*"); +export const divN3 = vbinopN(3, "/"); + +export const addN3o = vbinopON(3, "+"); +export const subN3o = vbinopON(3, "-"); +export const mulN3o = vbinopON(3, "*"); +export const divN3o = vbinopON(3, "/"); export const neg3 = (a: Vec, ia = 0, sa = 1) => mulN3(a, -1, ia, sa); diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index 7e775b157a..34d5ed6f82 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -14,6 +14,12 @@ import { Vec, ZERO4 } from "./api"; +import { + vbinop, + vbinopN, + vbinopO, + vbinopON +} from "./codegen"; import { $iter, declareIndices } from "./common"; import { EPS, @@ -122,113 +128,25 @@ export const eqDelta4 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps) && eqDelta1(a[ia + 3 * sa], b[ib + 3 * sb], eps); -export const add4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] += b[ib], - a[ia + sa] += b[ib + sb], - a[ia + 2 * sa] += b[ib + 2 * sb], - a[ia + 3 * sa] += b[ib + 3 * sb], - a -); - -export const mul4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] *= b[ib], - a[ia + sa] *= b[ib + sb], - a[ia + 2 * sa] *= b[ib + 2 * sb], - a[ia + 3 * sa] *= b[ib + 3 * sb], - a -); - -export const sub4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] -= b[ib], - a[ia + sa] -= b[ib + sb], - a[ia + 2 * sa] -= b[ib + 2 * sb], - a[ia + 3 * sa] -= b[ib + 3 * sb], - a -); - -export const div4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] /= b[ib], - a[ia + sa] /= b[ib + sb], - a[ia + 2 * sa] /= b[ib + 2 * sb], - a[ia + 3 * sa] /= b[ib + 3 * sb], - a -); - -export const add4o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] + b[ib], - out[io + so] = a[ia + sa] + b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] + b[ib + 2 * sb], - out[io + 3 * so] = a[ia + 3 * sa] + b[ib + 3 * sb], - out -); - -export const sub4o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] - b[ib], - out[io + so] = a[ia + sa] - b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] - b[ib + 2 * sb], - out[io + 3 * so] = a[ia + 3 * sa] - b[ib + 3 * sb], - out -); - -export const mul4o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] * b[ib], - out[io + so] = a[ia + sa] * b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] * b[ib + 2 * sb], - out[io + 3 * so] = a[ia + 3 * sa] * b[ib + 3 * sb], - out -); - -export const div4o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] / b[ib], - out[io + so] = a[ia + sa] / b[ib + sb], - out[io + 2 * so] = a[ia + 2 * sa] / b[ib + 2 * sb], - out[io + 3 * so] = a[ia + 3 * sa] / b[ib + 3 * sb], - out -); - -export const addN4 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] += n, a[ia + sa] += n, a[ia + 2 * sa] += n, a[ia + 3 * sa] += n, a); - -export const subN4 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] -= n, a[ia + sa] -= n, a[ia + 2 * sa] -= n, a[ia + 3 * sa] -= n, a); - -export const mulN4 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] *= n, a[ia + sa] *= n, a[ia + 2 * sa] *= n, a[ia + 3 * sa] *= n, a); - -export const divN4 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] /= n, a[ia + sa] /= n, a[ia + 2 * sa] /= n, a[ia + 3 * sa] /= n, a); - -export const addN4o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] + n, - out[io + so] = a[ia + sa] + n, - out[io + 2 * so] = a[ia + 2 * sa] + n, - out[io + 3 * so] = a[ia + 3 * sa] + n, - out -); - -export const subN4o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] - n, - out[io + so] = a[ia + sa] - n, - out[io + 2 * so] = a[ia + 2 * sa] - n, - out[io + 3 * so] = a[ia + 3 * sa] - n, - out -); - -export const mulN4o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] * n, - out[io + so] = a[ia + sa] * n, - out[io + 2 * so] = a[ia + 2 * sa] * n, - out[io + 3 * so] = a[ia + 3 * sa] * n, - out -); - -export const divN4o = (out: Vec, a: ReadonlyVec, n: number, io = 0, ia = 0, so = 1, sa = 1) => ( - out[io] = a[ia] / n, - out[io + so] = a[ia + sa] / n, - out[io + 2 * so] = a[ia + 2 * sa] / n, - out[io + 3 * so] = a[ia + 3 * sa] / n, - out -); +export const add4 = vbinop(4, "+"); +export const sub4 = vbinop(4, "-"); +export const mul4 = vbinop(4, "*"); +export const div4 = vbinop(4, "/"); + +export const add4o = vbinopO(4, "+"); +export const sub4o = vbinopO(4, "-"); +export const mul4o = vbinopO(4, "*"); +export const div4o = vbinopO(4, "/"); + +export const addN4 = vbinopN(4, "+"); +export const subN4 = vbinopN(4, "-"); +export const mulN4 = vbinopN(4, "*"); +export const divN4 = vbinopN(4, "/"); + +export const addN4o = vbinopON(4, "+"); +export const subN4o = vbinopON(4, "-"); +export const mulN4o = vbinopON(4, "*"); +export const divN4o = vbinopON(4, "/"); export const neg4 = (a: Vec, ia = 0, sa = 1) => mulN4(a, -1, ia, sa); From 9bee7f853622233fb379c937c85451e890d86101 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 05:22:34 +0100 Subject: [PATCH 32/77] refactor(vectors): use codegen for unary vec2/3/4 ops --- packages/vectors/src/vec2.ts | 32 ++++++++++---------------------- packages/vectors/src/vec3.ts | 33 ++++++++++----------------------- packages/vectors/src/vec4.ts | 32 ++++++++++---------------------- 3 files changed, 30 insertions(+), 67 deletions(-) diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index ad46db0484..bd2bb08d77 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -18,7 +18,8 @@ import { vbinop, vbinopN, vbinopO, - vbinopON + vbinopON, + vuniop } from "./codegen"; import { $iter, declareIndices } from "./common"; import { @@ -117,33 +118,20 @@ export const subN2o = vbinopON(2, "-"); export const mulN2o = vbinopON(2, "*"); export const divN2o = vbinopON(2, "/"); +export const abs2 = vuniop(2, "Math.abs"); +export const sign2 = vuniop(2, "Math.sign"); +export const floor2 = vuniop(2, "Math.floor"); +export const ceil2 = vuniop(2, "Math.ceil"); +export const sin2 = vuniop(2, "Math.sin"); +export const cos2 = vuniop(2, "Math.cos"); +export const sqrt2 = vuniop(2, "Math.sqrt"); + export const neg2 = (a: Vec, ia = 0, sa = 1) => mulN2(a, -1, ia, sa); -export const abs2 = (a: Vec, ia = 0, sa = 1) => - op2(Math.abs, a, ia, sa); - -export const sign2 = (a: Vec, ia = 0, sa = 1) => - op2(Math.sign, a, ia, sa); - -export const floor2 = (a: Vec, ia = 0, sa = 1) => - op2(Math.floor, a, ia, sa); - -export const ceil2 = (a: Vec, ia = 0, sa = 1) => - op2(Math.ceil, a, ia, sa); - export const fract2 = (a: Vec, ia = 0, sa = 1) => op2(fract1, a, ia, sa); -export const sin2 = (a: Vec, ia = 0, sa = 1) => - op2(Math.sin, a, ia, sa); - -export const cos2 = (a: Vec, ia = 0, sa = 1) => - op2(Math.cos, a, ia, sa); - -export const sqrt2 = (a: Vec, ia = 0, sa = 1) => - op2(Math.sqrt, a, ia, sa); - export const pow2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => op22(Math.pow, a, b, ia, ib, sa, sb); diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 3623be771f..1a164c4d58 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -18,7 +18,8 @@ import { vbinop, vbinopN, vbinopO, - vbinopON + vbinopON, + vuniop } from "./codegen"; import { $iter, declareIndices } from "./common"; import { @@ -29,7 +30,6 @@ import { max3id, min3id, mixBilinear1, - sign1, smoothStep1, step1 } from "./math"; @@ -141,33 +141,20 @@ export const subN3o = vbinopON(3, "-"); export const mulN3o = vbinopON(3, "*"); export const divN3o = vbinopON(3, "/"); +export const abs3 = vuniop(3, "Math.abs"); +export const sign3 = vuniop(3, "Math.sign"); +export const floor3 = vuniop(3, "Math.floor"); +export const ceil3 = vuniop(3, "Math.ceil"); +export const sin3 = vuniop(3, "Math.sin"); +export const cos3 = vuniop(3, "Math.cos"); +export const sqrt3 = vuniop(3, "Math.sqrt"); + export const neg3 = (a: Vec, ia = 0, sa = 1) => mulN3(a, -1, ia, sa); -export const abs3 = (a: Vec, ia = 0, sa = 1) => - op3(Math.abs, a, ia, sa); - -export const sign3 = (a: Vec, eps = EPS, ia = 0, sa = 1) => - op3((x) => sign1(x, eps), a, ia, sa); - -export const floor3 = (a: Vec, ia = 0, sa = 1) => - op3(Math.floor, a, ia, sa); - -export const ceil3 = (a: Vec, ia = 0, sa = 1) => - op3(Math.ceil, a, ia, sa); - export const fract3 = (a: Vec, ia = 0, sa = 1) => op3(fract1, a, ia, sa); -export const sin3 = (a: Vec, ia = 0, sa = 1) => - op3(Math.sin, a, ia, sa); - -export const cos3 = (a: Vec, ia = 0, sa = 1) => - op3(Math.cos, a, ia, sa); - -export const sqrt3 = (a: Vec, ia = 0, sa = 1) => - op3(Math.sqrt, a, ia, sa); - export const pow3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => op32(Math.pow, a, b, ia, ib, sa, sb); diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index 34d5ed6f82..be7bf600d1 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -18,7 +18,8 @@ import { vbinop, vbinopN, vbinopO, - vbinopON + vbinopON, + vuniop } from "./codegen"; import { $iter, declareIndices } from "./common"; import { @@ -148,33 +149,20 @@ export const subN4o = vbinopON(4, "-"); export const mulN4o = vbinopON(4, "*"); export const divN4o = vbinopON(4, "/"); +export const abs4 = vuniop(4, "Math.abs"); +export const sign4 = vuniop(4, "Math.sign"); +export const floor4 = vuniop(4, "Math.floor"); +export const ceil4 = vuniop(4, "Math.ceil"); +export const sin4 = vuniop(4, "Math.sin"); +export const cos4 = vuniop(4, "Math.cos"); +export const sqrt4 = vuniop(4, "Math.sqrt"); + export const neg4 = (a: Vec, ia = 0, sa = 1) => mulN4(a, -1, ia, sa); -export const abs4 = (a: Vec, ia = 0, sa = 1) => - op4(Math.abs, a, ia, sa); - -export const sign4 = (a: Vec, ia = 0, sa = 1) => - op4(Math.sign, a, ia, sa); - -export const floor4 = (a: Vec, ia = 0, sa = 1) => - op4(Math.floor, a, ia, sa); - -export const ceil4 = (a: Vec, ia = 0, sa = 1) => - op4(Math.ceil, a, ia, sa); - export const fract4 = (a: Vec, ia = 0, sa = 1) => op4(fract1, a, ia, sa); -export const sin4 = (a: Vec, ia = 0, sa = 1) => - op4(Math.sin, a, ia, sa); - -export const cos4 = (a: Vec, ia = 0, sa = 1) => - op4(Math.cos, a, ia, sa); - -export const sqrt4 = (a: Vec, ia = 0, sa = 1) => - op4(Math.sqrt, a, ia, sa); - export const pow4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => op42(Math.pow, a, b, ia, ib, sa, sb); From 719b27ac87ef3d19fba97f1ff50efe1ccc324efe Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 14:54:26 +0100 Subject: [PATCH 33/77] refactor(vectors): rewrite codegen, add more types & gen ops (#51) - replace existing generated vec2/3/4 ops w/ defcommon() --- packages/vectors/package.json | 5 +- packages/vectors/src/api.ts | 71 +++++++++++ packages/vectors/src/codegen.ts | 205 +++++++++++++++++++++++--------- packages/vectors/src/vec2.ts | 80 ++----------- packages/vectors/src/vec3.ts | 100 ++-------------- packages/vectors/src/vec4.ts | 108 ++--------------- 6 files changed, 250 insertions(+), 319 deletions(-) diff --git a/packages/vectors/package.json b/packages/vectors/package.json index 4f85be133c..faaea53cea 100644 --- a/packages/vectors/package.json +++ b/packages/vectors/package.json @@ -31,7 +31,8 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/errors": "^0.1.9", + "@thi.ng/transducers": "^2.1.6" }, "keywords": [ "ES6", @@ -45,4 +46,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 46bd1d088f..b8ee8f1aec 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -6,6 +6,8 @@ export type ReadonlyVec = ArrayLike & Iterable; export type Mat = NumericArray; export type ReadonlyMat = ArrayLike & Iterable; +// FIXME update all VecOp* descriptions + /** * A vector operation involving only a single vector. The vector might * be modified. @@ -36,6 +38,30 @@ export type VecOp2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io?: number, */ export type VecOpN2o = (out: Vec, a: ReadonlyVec, n: number, io?: number, ia?: number, so?: number, sa?: number) => T; +/** + * A vector operation involving three vectors. The first vector might be + * modified. + */ +export type VecOp3 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia?: number, ib?: number, ic?: number, sa?: number, sb?: number, sc?: number) => T; + +/** + * A vector operation involving two vectors and a scalar. The first + * vector might be modified. + */ +export type VecOpN3 = (a: Vec, b: ReadonlyVec, n: number, ia?: number, ib?: number, sa?: number, sb?: number) => T; + +/** + * A vector operation involving three vectors. The first vector might be + * modified. + */ +export type VecOp3o = (o: Vec, a: ReadonlyVec, b: ReadonlyVec, c: ReadonlyVec, io?: number, ia?: number, ib?: number, ic?: number, so?: number, sa?: number, sb?: number, sc?: number) => T; + +/** + * A vector operation involving three vectors and a scalar. The first + * vector might be modified. + */ +export type VecOpN3o = (o: Vec, a: ReadonlyVec, b: ReadonlyVec, n: number, io?: number, ia?: number, ib?: number, so?: number, sa?: number, sb?: number) => T; + /** * A readonly vector operation involving only a single vector. */ @@ -59,3 +85,48 @@ export const MIN4 = Object.freeze([min, min, min, min]); export const MAX4 = Object.freeze([max, max, max, max]); export const ONE4 = Object.freeze([1, 1, 1, 1]); export const ZERO4 = Object.freeze([0, 0, 0, 0]); + +export type CommonOps = [ + + // add, sub, mul, div + VecOp2, + VecOp2, + VecOp2, + VecOp2, + + VecOp2o, + VecOp2o, + VecOp2o, + VecOp2o, + + VecOpN2, + VecOpN2, + VecOpN2, + VecOpN2, + + VecOpN2o, + VecOpN2o, + VecOpN2o, + VecOpN2o, + + // madd / msub + VecOp3, + VecOpN3, + VecOp3, + VecOpN3, + + // Math.* + VecOp1, + VecOp1, + VecOp1, + VecOp1, + VecOp1, + VecOp1, + VecOp1, + + // mix, mixN, mixo, mixNo + VecOp3, + VecOpN3, + VecOp3o, + VecOpN3o +]; diff --git a/packages/vectors/src/codegen.ts b/packages/vectors/src/codegen.ts index 38329833dc..c2c1a3b959 100644 --- a/packages/vectors/src/codegen.ts +++ b/packages/vectors/src/codegen.ts @@ -1,70 +1,157 @@ +import { comp } from "@thi.ng/transducers/func/comp"; +import { range } from "@thi.ng/transducers/iter/range"; +import { tuples } from "@thi.ng/transducers/iter/tuples"; +import { push } from "@thi.ng/transducers/rfn/push"; +import { transduce } from "@thi.ng/transducers/transduce"; +import { map } from "@thi.ng/transducers/xform/map"; +import { mapcat } from "@thi.ng/transducers/xform/mapcat"; +import { take } from "@thi.ng/transducers/xform/take"; import { + CommonOps, Vec, VecOp1, VecOp2, VecOp2o, + VecOp3, + VecOp3o, VecOpN2, - VecOpN2o + VecOpN2o, + VecOpN3, + VecOpN3o } from "@thi.ng/vectors/src/api"; +/** + * HOF array index lookup gen to provide optimized versions of: + * + * ``` + * lookup("a")(0) // a[ia] + * lookup("a")(1) // a[ia * sa] + * lookup("a")(2) // a[ia + 2 * sa] + * ``` + * + * @param sym + */ +const lookup = (sym) => + (i) => i > 1 ? + `${sym}[i${sym}+${i}*s${sym}]` : + i == 1 ? `${sym}[i${sym}+s${sym}]` : + `${sym}[i${sym}]`; + +/** + * Infinite iterator of index lookups for `sym`. + * + * @param sym + */ +const indices = (sym) => map(lookup(sym), range()); + +/** + * Takes a vector size `dim`, a code template function and an array of + * symbol names participating in the template. For each symbol, creates + * iterator of index lookups, forms them into tuples and passes them to + * template to generate code. If the optional `ret` arg is not `null` + * (default `"a"`), appends a `return` statement to the result array, + * using `ret` as return value. Returns array + * + * @param dim + * @param tpl + * @param syms + * @param ret + */ +const assemble = (dim: number, tpl: (syms: string[]) => string, syms: string[], ret = "a") => { + const src = transduce( + comp(take(dim), map(tpl)), + push(), + tuples.apply(null, [...map(indices, syms)]) + ); + ret !== null && src.push(`return ${ret};`); + return src; +}; + const compile = (args: string, src: string[]) => new Function(args, src.join("")); -const assemble = (fn: (op: string, i: number) => string, dim: number, op: string, ret = "a") => { - const src = []; - for (let i = 0; i < dim; i++) { - src.push(fn(op, i)); - } - src.push(`return ${ret};`); - return src; -} - -const uniop = (op: string, i: number) => - i > 1 ? - `a[ia+${i}*sa]=${op}(a[ia+${i}*sa]);` : - i == 1 ? - `a[ia+sa]=${op}(a[ia+sa]);` : - `a[ia]=${op}(a[ia]);`; - -const binop = (op: string, i: number) => - i > 1 ? - `a[ia+${i}*sa]${op}=b[ib+${i}*sb];` : - i == 1 ? - `a[ia+sa]${op}=b[ib+sb];` : - `a[ia]${op}=b[ib];`; - -const binopN = (op: string, i: number) => - i > 1 ? - `a[ia+${i}*sa]${op}=n;` : - i == 1 ? - `a[ia+sa]${op}=n;` : - `a[ia]${op}=n;`; - -const binopO = (op: string, i: number) => - i > 1 ? - `o[io+${i}*so]=a[ia+${i}*sa]${op}b[ib+${i}*sb];` : - i == 1 ? - `o[io+so]=a[ia+sa]${op}b[ib+sb];` : - `o[io]=a[ia]${op}b[ib];`; - -const binopON = (op: string, i: number) => - i > 1 ? - `o[io+${i}*so]=a[ia+${i}*sa]${op}n;` : - i == 1 ? - `o[io+so]=a[ia+sa]${op}n;` : - `o[io]=a[ia]${op}n;`; - -export const vuniop = (dim: number, op: string): VecOp1 => - compile("a,ia=0,sa=1", assemble(uniop, dim, op)); - -export const vbinop = (dim: number, op: string): VecOp2 => - compile("a,b,ia=0,ib=0,sa=1,sb=1", assemble(binop, dim, op)); - -export const vbinopN = (dim: number, op: string): VecOpN2 => - compile("a,n,ia=0,sa=1", assemble(binopN, dim, op)); - -export const vbinopO = (dim: number, op: string): VecOp2o => - compile("o,a,b,io=0,ia=0,ib=0,so=1,sa=1,sb=1", assemble(binopO, dim, op, "o")); - -export const vbinopON = (dim: number, op: string): VecOpN2o => - compile("o,a,n,io=0,ia=0,so=1,sa=1", assemble(binopON, dim, op, "o")); +export const defop1 = (dim: number, op: string): VecOp1 => + compile( + "a,ia=0,sa=1", + assemble(dim, ([a]) => `${a}=${op}(${a});`, ["a"]) + ); + +export const defop2 = (dim: number, op: string): VecOp2 => + compile( + "a,b,ia=0,ib=0,sa=1,sb=1", + assemble(dim, ([a, b]) => `${a}${op}=${b};`, ["a", "b"]) + ); + +export const defopN = (dim: number, op: string): VecOpN2 => + compile( + "a,n,ia=0,sa=1", + assemble(dim, ([a]) => `${a}${op}=n;`, ["a"]) + ); + +export const defop2o = (dim: number, op: string): VecOp2o => + compile( + "o,a,b,io=0,ia=0,ib=0,so=1,sa=1,sb=1", + assemble(dim, ([o, a, b]) => `${o}=${a}${op}${b};`, ["o", "a", "b"], "o") + ); + +export const defopNo = (dim: number, op: string): VecOpN2o => + compile( + "o,a,n,io=0,ia=0,so=1,sa=1", + assemble(dim, ([o, a]) => `${o}=${a}${op}n;`, ["o", "a"], "o") + ); + +export const defop3 = (dim: number, op1: string, op2: string): VecOp3 => + compile( + "a,b,c,ia=0,ib=0,ic=0,sa=1,sb=1,sc=1", + assemble(dim, ([a, b, c]) => `${a}${op1}=${b}${op2}${c};`, ["a", "b", "c"]) + ); + +export const defopN3 = (dim: number, op1: string, op2: string): VecOpN3 => + compile( + "a,b,n,ia=0,ib=0,sa=1,sb=1", + assemble(dim, ([a, b]) => `${a}${op1}=${b}${op2}n;`, ["a", "b"]) + ); + +export const defmix = (dim: number): VecOp3 => + compile( + "a,b,c,ia=0,ib=0,ic=0,sa=1,sb=1,sc=1", + assemble(dim, ([a, b, c]) => `${a}+=(${b}-${a})*${c};`, ["a", "b", "c"]) + ); + +export const defmixN = (dim: number): VecOpN3 => + compile( + "a,b,n,ia=0,ib=0,sa=1,sb=1", + assemble(dim, ([a, b]) => `${a}+=(${b}-${a})*n;`, ["a", "b"]) + ); + +export const defmixo = (dim: number): VecOp3o => + compile( + "o,a,b,c,io=0,ia=0,ib=0,ic=0,so=1,sa=1,sb=1,sc=1", + assemble(dim, ([o, a, b, c]) => `${o}=${a}+(${b}-${a})*${c};`, ["o", "a", "b", "c"], "o") + ); + +export const defmixNo = (dim: number): VecOpN3o => + compile( + "o,a,b,n,io=0,ia=0,ib=0,so=1,sa=1,sb=1", + assemble(dim, ([o, a, b]) => `${o}=${a}+(${b}-${a})*n;`, ["o", "a", "b"], "o") + ); + +export const defcommon = (dim: number): CommonOps => + [ + ...mapcat( + (f) => map((op) => f(dim, op), "+-*/"), + [defop2, defop2o, defopN, defopNo] + ), + ...mapcat( + ([op1, op2]) => [defop3(dim, op1, op2), defopN3(dim, op1, op2)], + [["+", "*"], ["-", "*"]] + ), + ...map( + (op) => defop1(dim, `Math.${op}`), + ["abs", "sign", "floor", "ceil", "sin", "cos", "sqrt"] + ), + defmix(dim), + defmixN(dim), + defmixo(dim), + defmixNo(dim), + ]; \ No newline at end of file diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index bd2bb08d77..33e9db0940 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -14,13 +14,7 @@ import { Vec, ZERO4 } from "./api"; -import { - vbinop, - vbinopN, - vbinopO, - vbinopON, - vuniop -} from "./codegen"; +import { defcommon } from "./codegen"; import { $iter, declareIndices } from "./common"; import { atan2Abs1, @@ -98,33 +92,15 @@ export const eqDelta2 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia], b[ib], eps) && eqDelta1(a[ia + sa], b[ib + sb], eps); -export const add2 = vbinop(2, "+"); -export const sub2 = vbinop(2, "-"); -export const mul2 = vbinop(2, "*"); -export const div2 = vbinop(2, "/"); - -export const add2o = vbinopO(2, "+"); -export const sub2o = vbinopO(2, "-"); -export const mul2o = vbinopO(2, "*"); -export const div2o = vbinopO(2, "/"); - -export const addN2 = vbinopN(2, "+"); -export const subN2 = vbinopN(2, "-"); -export const mulN2 = vbinopN(2, "*"); -export const divN2 = vbinopN(2, "/"); - -export const addN2o = vbinopON(2, "+"); -export const subN2o = vbinopON(2, "-"); -export const mulN2o = vbinopON(2, "*"); -export const divN2o = vbinopON(2, "/"); - -export const abs2 = vuniop(2, "Math.abs"); -export const sign2 = vuniop(2, "Math.sign"); -export const floor2 = vuniop(2, "Math.floor"); -export const ceil2 = vuniop(2, "Math.ceil"); -export const sin2 = vuniop(2, "Math.sin"); -export const cos2 = vuniop(2, "Math.cos"); -export const sqrt2 = vuniop(2, "Math.sqrt"); +export const [ + add2, sub2, mul2, div2, + add2o, sub2o, mul2o, div2o, + addN2, subN2, mulN2, divN2, + addN2o, subN2o, mulN2o, divN2o, + madd2, maddN2, msub2, msubN2, + abs2, sign2, floor2, ceil2, sin2, cos2, sqrt2, + mix2, mixN2, mix2o, mixN2o +] = defcommon(2); export const neg2 = (a: Vec, ia = 0, sa = 1) => mulN2(a, -1, ia, sa); @@ -138,48 +114,12 @@ export const pow2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => export const powN2 = (a: Vec, n: number, ia = 0, sa = 1) => op21(Math.pow, a, n, ia, sa); -export const madd2 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => - (a[ia] += b[ib] * c[ic], a[ia + sa] += b[ib + sb] * c[ic + sc], a); - -export const maddN2 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => - (a[ia] += b[ib] * n, a[ia + sa] += b[ib + sb] * n, a); - -export const msub2 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => - (a[ia] -= b[ib] * c[ic], a[ia + sa] -= b[ib + sb] * c[ic + sc], a); - -export const msubN2 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => - (a[ia] -= b[ib] * n, a[ia + sa] -= b[ib + sb] * n, a); - export const dot2 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => a[ia] * b[ib] + a[ia + sa] * b[ib + sb]; export const cross2 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => a[ia] * b[ib + sb] - a[ia + sa] * b[ib]; -export const mix2 = (a: Vec, b: ReadonlyVec, t: ReadonlyVec, ia = 0, ib = 0, it = 0, sa = 1, sb = 1, st = 1) => ( - a[ia] += (b[ib] - a[ia]) * t[it], - a[ia + sa] += (b[ib + sb] - a[ia + sa]) * t[it + st], - a -); - -export const mixN2 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] += (b[ib] - a[ia]) * n, - a[ia + sa] += (b[ib + sb] - a[ia + sa]) * n, - a -); - -export const mix2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, t: ReadonlyVec, io = 0, ia = 0, ib = 0, it = 0, so = 1, sa = 1, sb = 1, st = 1) => ( - out[io] = a[ia] + (b[ib] - a[ia]) * t[it], - out[io + so] = a[ia + sa] + (b[ib + sb] - a[ia + sa]) * t[it + st], - out -); - -export const mixN2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, n: number, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] + (b[ib] - a[ia]) * n, - out[io + so] = a[ia + sa] + (b[ib + sb] - a[ia + sa]) * n, - out -); - export const mixBilinear2 = ( a: Vec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, u: number, v: number, ia = 0, ib = 0, ic = 0, id = 0, diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 1a164c4d58..2818c96b07 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -14,13 +14,7 @@ import { Vec, ZERO4 } from "./api"; -import { - vbinop, - vbinopN, - vbinopO, - vbinopON, - vuniop -} from "./codegen"; +import { defcommon } from "./codegen"; import { $iter, declareIndices } from "./common"; import { atan2Abs1, @@ -121,33 +115,15 @@ export const eqDelta3 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + sa], b[ib + sb], eps) && eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps); -export const add3 = vbinop(3, "+"); -export const sub3 = vbinop(3, "-"); -export const mul3 = vbinop(3, "*"); -export const div3 = vbinop(3, "/"); - -export const add3o = vbinopO(3, "+"); -export const sub3o = vbinopO(3, "-"); -export const mul3o = vbinopO(3, "*"); -export const div3o = vbinopO(3, "/"); - -export const addN3 = vbinopN(3, "+"); -export const subN3 = vbinopN(3, "-"); -export const mulN3 = vbinopN(3, "*"); -export const divN3 = vbinopN(3, "/"); - -export const addN3o = vbinopON(3, "+"); -export const subN3o = vbinopON(3, "-"); -export const mulN3o = vbinopON(3, "*"); -export const divN3o = vbinopON(3, "/"); - -export const abs3 = vuniop(3, "Math.abs"); -export const sign3 = vuniop(3, "Math.sign"); -export const floor3 = vuniop(3, "Math.floor"); -export const ceil3 = vuniop(3, "Math.ceil"); -export const sin3 = vuniop(3, "Math.sin"); -export const cos3 = vuniop(3, "Math.cos"); -export const sqrt3 = vuniop(3, "Math.sqrt"); +export const [ + add3, sub3, mul3, div3, + add3o, sub3o, mul3o, div3o, + addN3, subN3, mulN3, divN3, + addN3o, subN3o, mulN3o, divN3o, + madd3, maddN3, msub3, msubN3, + abs3, sign3, floor3, ceil3, sin3, cos3, sqrt3, + mix3, mixN3, mix3o, mixN3o +] = defcommon(3); export const neg3 = (a: Vec, ia = 0, sa = 1) => mulN3(a, -1, ia, sa); @@ -161,34 +137,6 @@ export const pow3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => export const powN3 = (a: Vec, n: number, ia = 0, sa = 1) => op31(Math.pow, a, n, ia, sa); -export const madd3 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => ( - a[ia] += b[ib] * c[ic], - a[ia + sa] += b[ib + sb] * c[ic + sc], - a[ia + 2 * sa] += b[ib + 2 * sb] * c[ic + 2 * sc], - a -); - -export const maddN3 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] += b[ib] * n, - a[ia + sa] += b[ib + sb] * n, - a[ia + 2 * sa] += b[ib + 2 * sb] * n, - a -); - -export const msub3 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => ( - a[ia] -= b[ib] * c[ic], - a[ia + sa] -= b[ib + sb] * c[ic + sc], - a[ia + 2 * sa] -= b[ib + 2 * sb] * c[ic + 2 * sc], - a -); - -export const msubN3 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] -= b[ib] * n, - a[ia + sa] -= b[ib + sb] * n, - a[ia + 2 * sa] -= b[ib + 2 * sb] * n, - a -); - export const dot3 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => a[ia] * b[ib] + a[ia + sa] * b[ib + sb] + @@ -213,34 +161,6 @@ export const orthoNormal3 = (a: Vec, b: Vec, c: Vec, ia = 0, ib = 0, ic = 0, sa sub3(get3(b, ib, sb), a, 0, ia, 1, sa) ); -export const mix3 = (a: Vec, b: ReadonlyVec, t: ReadonlyVec, ia = 0, ib = 0, it = 0, sa = 1, sb = 1, st = 1) => ( - a[ia] += (b[ib] - a[ia]) * t[it], - a[ia + sa] += (b[ib + sb] - a[ia + sa]) * t[it + st], - a[ia + 2 * sa] += (b[ib + 2 * sb] - a[ia + 2 * sa]) * t[it + 2 * st], - a -); - -export const mixN3 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] += (b[ib] - a[ia]) * n, - a[ia + sa] += (b[ib + sb] - a[ia + sa]) * n, - a[ia + 2 * sa] += (b[ib + 2 * sb] - a[ia + 2 * sa]) * n, - a -); - -export const mix3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, t: ReadonlyVec, io = 0, ia = 0, ib = 0, it = 0, so = 1, sa = 1, sb = 1, st = 1) => ( - out[io] = a[ia] + (b[ib] - a[ia]) * t[it], - out[io + so] = a[ia + sa] + (b[ib + sb] - a[ia + sa]) * t[it + st], - out[io + 2 * so] = a[ia + 2 * sa] + (b[ib + 2 * sb] - a[ia + 2 * sa]) * t[it + 2 * st], - out -); - -export const mixN3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, n: number, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] + (b[ib] - a[ia]) * n, - out[io + so] = a[ia + sa] + (b[ib + sb] - a[ia + sa]) * n, - out[io + 2 * so] = a[ia + 2 * sa] + (b[ib + 2 * sb] - a[ia + 2 * sa]) * n, - out -); - export const mixBilinear3 = ( a: Vec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, u: number, v: number, ia = 0, ib = 0, ic = 0, id = 0, diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index be7bf600d1..9a1a78e289 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -14,13 +14,7 @@ import { Vec, ZERO4 } from "./api"; -import { - vbinop, - vbinopN, - vbinopO, - vbinopON, - vuniop -} from "./codegen"; +import { defcommon } from "./codegen"; import { $iter, declareIndices } from "./common"; import { EPS, @@ -129,33 +123,15 @@ export const eqDelta4 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps) && eqDelta1(a[ia + 3 * sa], b[ib + 3 * sb], eps); -export const add4 = vbinop(4, "+"); -export const sub4 = vbinop(4, "-"); -export const mul4 = vbinop(4, "*"); -export const div4 = vbinop(4, "/"); - -export const add4o = vbinopO(4, "+"); -export const sub4o = vbinopO(4, "-"); -export const mul4o = vbinopO(4, "*"); -export const div4o = vbinopO(4, "/"); - -export const addN4 = vbinopN(4, "+"); -export const subN4 = vbinopN(4, "-"); -export const mulN4 = vbinopN(4, "*"); -export const divN4 = vbinopN(4, "/"); - -export const addN4o = vbinopON(4, "+"); -export const subN4o = vbinopON(4, "-"); -export const mulN4o = vbinopON(4, "*"); -export const divN4o = vbinopON(4, "/"); - -export const abs4 = vuniop(4, "Math.abs"); -export const sign4 = vuniop(4, "Math.sign"); -export const floor4 = vuniop(4, "Math.floor"); -export const ceil4 = vuniop(4, "Math.ceil"); -export const sin4 = vuniop(4, "Math.sin"); -export const cos4 = vuniop(4, "Math.cos"); -export const sqrt4 = vuniop(4, "Math.sqrt"); +export const [ + add4, sub4, mul4, div4, + add4o, sub4o, mul4o, div4o, + addN4, subN4, mulN4, divN4, + addN4o, subN4o, mulN4o, divN4o, + madd4, maddN4, msub4, msubN4, + abs4, sign4, floor4, ceil4, sin4, cos4, sqrt4, + mix4, mixN4, mix4o, mixN4o +] = defcommon(4); export const neg4 = (a: Vec, ia = 0, sa = 1) => mulN4(a, -1, ia, sa); @@ -169,76 +145,12 @@ export const pow4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => export const powN4 = (a: Vec, n: number, ia = 0, sa = 1) => op4((x) => Math.pow(x, n), a, ia, sa); -export const madd4 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => ( - a[ia] += b[ib] * c[ic], - a[ia + sa] += b[ib + sb] * c[ic + sc], - a[ia + 2 * sa] += b[ib + 2 * sb] * c[ic + 2 * sc], - a[ia + 3 * sa] += b[ib + 3 * sb] * c[ic + 3 * sc], - a -); - -export const maddN4 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] += b[ib] * n, - a[ia + sa] += b[ib + sb] * n, - a[ia + 2 * sa] += b[ib + 2 * sb] * n, - a[ia + 3 * sa] += b[ib + 3 * sb] * n, - a -); - -export const msub4 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => ( - a[ia] -= b[ib] * c[ic], - a[ia + sa] -= b[ib + sb] * c[ic + sc], - a[ia + 2 * sa] -= b[ib + 2 * sb] * c[ic + 2 * sc], - a[ia + 3 * sa] -= b[ib + 3 * sb] * c[ic + 3 * sc], - a -); - -export const msubN4 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] -= b[ib] * n, - a[ia + sa] -= b[ib + sb] * n, - a[ia + 2 * sa] -= b[ib + 2 * sb] * n, - a[ia + 3 * sa] -= b[ib + 3 * sb] * n, - a -); - export const dot4 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => a[ia] * b[ib] + a[ia + sa] * b[ib + sb] + a[ia + 2 * sa] * b[ib + 2 * sb] + a[ia + 3 * sa] * b[ib + 3 * sb]; -export const mix4 = (a: Vec, b: ReadonlyVec, t: ReadonlyVec, ia = 0, ib = 0, it = 0, sa = 1, sb = 1, st = 1) => ( - a[ia] += (b[ib] - a[ia]) * t[it], - a[ia + sa] += (b[ib + sb] - a[ia + sa]) * t[it + st], - a[ia + 2 * sa] += (b[ib + 2 * sb] - a[ia + 2 * sa]) * t[it + 2 * st], - a[ia + 3 * sa] += (b[ib + 3 * sb] - a[ia + 3 * sa]) * t[it + 3 * st], - a -); - -export const mixN4 = (a: Vec, b: ReadonlyVec, n: number, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] += (b[ib] - a[ia]) * n, - a[ia + sa] += (b[ib + sb] - a[ia + sa]) * n, - a[ia + 2 * sa] += (b[ib + 2 * sb] - a[ia + 2 * sa]) * n, - a[ia + 3 * sa] += (b[ib + 3 * sb] - a[ia + 3 * sa]) * n, - a -); - -export const mix4o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, t: ReadonlyVec, io = 0, ia = 0, ib = 0, it = 0, so = 1, sa = 1, sb = 1, st = 1) => ( - out[io] = a[ia] + (b[ib] - a[ia]) * t[it], - out[io + so] = a[ia + sa] + (b[ib + sb] - a[ia + sa]) * t[it + st], - out[io + 2 * so] = a[ia + 2 * sa] + (b[ib + 2 * sb] - a[ia + 2 * sa]) * t[it + 2 * st], - out[io + 3 * so] = a[ia + 3 * sa] + (b[ib + 3 * sb] - a[ia + 3 * sa]) * t[it + 3 * st], - out -); - -export const mixN4o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, n: number, io = 0, ia = 0, ib = 0, so = 1, sa = 1, sb = 1) => ( - out[io] = a[ia] + (b[ib] - a[ia]) * n, - out[io + so] = a[ia + sa] + (b[ib + sb] - a[ia + sa]) * n, - out[io + 2 * so] = a[ia + 2 * sa] + (b[ib + 2 * sb] - a[ia + 2 * sa]) * n, - out[io + 3 * so] = a[ia + 3 * sa] + (b[ib + 3 * sb] - a[ia + 3 * sa]) * n, - out -); - export const mixBilinear4 = ( a: Vec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, u: number, v: number, ia = 0, ib = 0, ic = 0, id = 0, From 247dec027ba2e46a7d8876d151c7885469af39bb Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 17:40:33 +0100 Subject: [PATCH 34/77] refactor(vectors): generate more ops, move declareIndices() (#51) - redefine set(), setN(), pow(), min(), max() as part of defcommon() - remove obsolete op22/32/42() - move declareIndices() to codegen.ts - fix QUARTER_PI (typo) - remove codegen from main re-exports --- packages/vectors/src/api.ts | 9 ++++++++ packages/vectors/src/codegen.ts | 39 ++++++++++++++++++++++++++++++- packages/vectors/src/common.ts | 24 ------------------- packages/vectors/src/index.ts | 2 +- packages/vectors/src/mat23.ts | 4 ++-- packages/vectors/src/mat33.ts | 4 ++-- packages/vectors/src/mat44.ts | 4 ++-- packages/vectors/src/math.ts | 2 +- packages/vectors/src/vec2.ts | 27 ++++------------------ packages/vectors/src/vec3.ts | 36 ++++------------------------- packages/vectors/src/vec4.ts | 41 ++++----------------------------- 11 files changed, 68 insertions(+), 124 deletions(-) diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index b8ee8f1aec..58d9ad9094 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -88,6 +88,10 @@ export const ZERO4 = Object.freeze([0, 0, 0, 0]); export type CommonOps = [ + // set, setN + VecOp2, + VecOpN2, + // add, sub, mul, div VecOp2, VecOp2, @@ -124,6 +128,11 @@ export type CommonOps = [ VecOp1, VecOp1, + // pow, min,max + VecOp2, + VecOp2, + VecOp2, + // mix, mixN, mixo, mixNo VecOp3, VecOpN3, diff --git a/packages/vectors/src/codegen.ts b/packages/vectors/src/codegen.ts index c2c1a3b959..f2990941a4 100644 --- a/packages/vectors/src/codegen.ts +++ b/packages/vectors/src/codegen.ts @@ -82,6 +82,12 @@ export const defop2 = (dim: number, op: string): VecOp2 => assemble(dim, ([a, b]) => `${a}${op}=${b};`, ["a", "b"]) ); +export const defopfn2 = (dim: number, fn: string): VecOp2 => + compile( + "a,b,ia=0,ib=0,sa=1,sb=1", + assemble(dim, ([a, b]) => `${a}=${fn}(${a},${b});`, ["a", "b"]) + ); + export const defopN = (dim: number, op: string): VecOpN2 => compile( "a,n,ia=0,sa=1", @@ -138,6 +144,9 @@ export const defmixNo = (dim: number): VecOpN3o => export const defcommon = (dim: number): CommonOps => [ + defop2(dim, ""), + defopN(dim, ""), + ...mapcat( (f) => map((op) => f(dim, op), "+-*/"), [defop2, defop2o, defopN, defopNo] @@ -150,8 +159,36 @@ export const defcommon = (dim: number): CommonOps => (op) => defop1(dim, `Math.${op}`), ["abs", "sign", "floor", "ceil", "sin", "cos", "sqrt"] ), + ...map( + (op) => defopfn2(dim, `Math.${op}`), + ["pow", "min", "max"] + ), defmix(dim), defmixN(dim), defmixo(dim), defmixNo(dim), - ]; \ No newline at end of file + ]; + +/** + * Helper function to create vector/matrix index & property accessors. + * + * @param proto + * @param indices + * @param props + */ +export const declareIndices = (proto: any, props: string[]) => { + const get = (i: number) => function () { return this.buf[this.i + i * (this.s || 1)]; }; + const set = (i: number) => function (n: number) { this.buf[this.i + i * (this.s || 1)] = n; }; + props.forEach((id, i) => { + Object.defineProperty(proto, i, { + get: get(i), + set: set(i), + enumerable: true, + }); + Object.defineProperty(proto, id, { + get: get(i), + set: set(i), + enumerable: true, + }); + }); +}; diff --git a/packages/vectors/src/common.ts b/packages/vectors/src/common.ts index 19459dc3fb..7d27034bbb 100644 --- a/packages/vectors/src/common.ts +++ b/packages/vectors/src/common.ts @@ -184,27 +184,3 @@ export const eqDelta = (a: ReadonlyVec, b: ReadonlyVec, n: number, eps = EPS, ia } return true; }; - -/** - * Helper function to create vector/matrix index & property accessors. - * - * @param proto - * @param indices - * @param props - */ -export const declareIndices = (proto: any, props: string[]) => { - const get = (i: number) => function () { return this.buf[this.i + i * (this.s || 1)]; }; - const set = (i: number) => function (n: number) { this.buf[this.i + i * (this.s || 1)] = n; }; - props.forEach((id, i) => { - Object.defineProperty(proto, i, { - get: get(i), - set: set(i), - enumerable: true, - }); - Object.defineProperty(proto, id, { - get: get(i), - set: set(i), - enumerable: true, - }); - }); -}; diff --git a/packages/vectors/src/index.ts b/packages/vectors/src/index.ts index f795cc3571..8c96810f59 100644 --- a/packages/vectors/src/index.ts +++ b/packages/vectors/src/index.ts @@ -9,4 +9,4 @@ export * from "./vec2"; export * from "./vec3"; export * from "./vec4"; -export * from "./codegen"; +// export * from "./codegen"; diff --git a/packages/vectors/src/mat23.ts b/packages/vectors/src/mat23.ts index 81083b62ea..f0e5dd16c6 100644 --- a/packages/vectors/src/mat23.ts +++ b/packages/vectors/src/mat23.ts @@ -1,13 +1,13 @@ import { ICopy, IEqualsDelta } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; - import { Mat, ReadonlyMat, ReadonlyVec, Vec } from "./api"; -import { $iter, declareIndices, eqDelta } from "./common"; +import { declareIndices } from "./codegen"; +import { $iter, eqDelta } from "./common"; import { EPS } from "./math"; import { cross2, diff --git a/packages/vectors/src/mat33.ts b/packages/vectors/src/mat33.ts index 08bef70f75..13e9ea5c12 100644 --- a/packages/vectors/src/mat33.ts +++ b/packages/vectors/src/mat33.ts @@ -1,13 +1,13 @@ import { ICopy, IEqualsDelta } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; - import { Mat, ReadonlyMat, ReadonlyVec, Vec } from "./api"; -import { $iter, declareIndices, eqDelta } from "./common"; +import { declareIndices } from "./codegen"; +import { $iter, eqDelta } from "./common"; import { EPS } from "./math"; import { dot3, diff --git a/packages/vectors/src/mat44.ts b/packages/vectors/src/mat44.ts index 8e2889f5be..42805f13c2 100644 --- a/packages/vectors/src/mat44.ts +++ b/packages/vectors/src/mat44.ts @@ -1,13 +1,13 @@ import { ICopy, IEqualsDelta } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; - import { Mat, ReadonlyMat, ReadonlyVec, Vec } from "./api"; -import { $iter, declareIndices, eqDelta } from "./common"; +import { declareIndices } from "./codegen"; +import { $iter, eqDelta } from "./common"; import { Mat33 } from "./mat33"; import { EPS, rad } from "./math"; import { diff --git a/packages/vectors/src/math.ts b/packages/vectors/src/math.ts index b8ef6179aa..70cce557db 100644 --- a/packages/vectors/src/math.ts +++ b/packages/vectors/src/math.ts @@ -1,7 +1,7 @@ export const PI = Math.PI; export const TAU = PI * 2; export const HALF_PI = PI / 2; -export const QUARTER_PI = PI / 2; +export const QUARTER_PI = PI / 4; export const DEG2RAD = PI / 180; export const RAD2DEG = 180 / PI; diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index 33e9db0940..ca5ff9fa92 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -14,8 +14,8 @@ import { Vec, ZERO4 } from "./api"; -import { defcommon } from "./codegen"; -import { $iter, declareIndices } from "./common"; +import { declareIndices, defcommon } from "./codegen"; +import { $iter } from "./common"; import { atan2Abs1, EPS, @@ -45,21 +45,9 @@ export const op21 = (fn: (a: number, n: number) => number, a: Vec, n: number, ia a ); -export const op22 = (fn: (a: number, b: number) => number, a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] = fn(a[ia], b[ib]), - a[ia + sa] = fn(a[ia + sa], b[ib + sb]), - a -); - export const get2 = (a: ReadonlyVec, ia = 0, sa = 1) => set2(new ((a.constructor))(2), a, 0, ia, 1, sa); -export const set2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - (a[ia] = b[ib], a[ia + sa] = b[ib + sb], a); - -export const setN2 = (a: Vec, n: number, ia = 0, sa = 1) => - (a[ia] = n, a[ia + sa] = n, a); - export const setS2 = (a: Vec, x: number, y: number, ia = 0, sa = 1) => (a[ia] = x, a[ia + sa] = y, a); @@ -93,12 +81,14 @@ export const eqDelta2 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + sa], b[ib + sb], eps); export const [ + set2, setN2, add2, sub2, mul2, div2, add2o, sub2o, mul2o, div2o, addN2, subN2, mulN2, divN2, addN2o, subN2o, mulN2o, divN2o, madd2, maddN2, msub2, msubN2, abs2, sign2, floor2, ceil2, sin2, cos2, sqrt2, + pow2, min2, max2, mix2, mixN2, mix2o, mixN2o ] = defcommon(2); @@ -108,9 +98,6 @@ export const neg2 = (a: Vec, ia = 0, sa = 1) => export const fract2 = (a: Vec, ia = 0, sa = 1) => op2(fract1, a, ia, sa); -export const pow2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op22(Math.pow, a, b, ia, ib, sa, sb); - export const powN2 = (a: Vec, n: number, ia = 0, sa = 1) => op21(Math.pow, a, n, ia, sa); @@ -129,12 +116,6 @@ export const mixBilinear2 = ( a ); -export const min2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op22(Math.min, a, b, ia, ib, sa, sb); - -export const max2 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op22(Math.max, a, b, ia, ib, sa, sb); - export const clamp2 = (a: Vec, min: ReadonlyVec, max: ReadonlyVec, ia = 0, imin = 0, imax = 0, sa = 1, smin = 1, smax = 1) => max2(min2(a, max, ia, imax, sa, smax), min, ia, imin, sa, smin); diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 2818c96b07..7ccc5337ce 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -14,8 +14,8 @@ import { Vec, ZERO4 } from "./api"; -import { defcommon } from "./codegen"; -import { $iter, declareIndices } from "./common"; +import { declareIndices, defcommon } from "./codegen"; +import { $iter } from "./common"; import { atan2Abs1, EPS, @@ -55,30 +55,9 @@ export const op31 = (fn: (a: number, n: number) => number, a: Vec, n: number, ia a ); -export const op32 = (fn: (a: number, b: number) => number, a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] = fn(a[ia], b[ib]), - a[ia + sa] = fn(a[ia + sa], b[ib + sb]), - a[ia + 2 * sa] = fn(a[ia + 2 * sa], b[ib + 2 * sb]), - a -); - export const get3 = (a: ReadonlyVec, ia = 0, sa = 1) => set3(new ((a.constructor))(3), a, 0, ia, 1, sa); -export const set3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] = b[ib], - a[ia + sa] = b[ib + sb], - a[ia + 2 * sa] = b[ib + 2 * sb], - a -); - -export const setN3 = (a: Vec, n: number, ia = 0, sa = 1) => ( - a[ia] = n, - a[ia + sa] = n, - a[ia + 2 * sa] = n, - a -); - export const setS3 = (a: Vec, x: number, y: number, z: number, ia = 0, sa = 1) => (a[ia] = x, a[ia + sa] = y, a[ia + 2 * sa] = z, a); @@ -116,12 +95,14 @@ export const eqDelta3 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps); export const [ + set3, setN3, add3, sub3, mul3, div3, add3o, sub3o, mul3o, div3o, addN3, subN3, mulN3, divN3, addN3o, subN3o, mulN3o, divN3o, madd3, maddN3, msub3, msubN3, abs3, sign3, floor3, ceil3, sin3, cos3, sqrt3, + pow3, min3, max3, mix3, mixN3, mix3o, mixN3o ] = defcommon(3); @@ -131,9 +112,6 @@ export const neg3 = (a: Vec, ia = 0, sa = 1) => export const fract3 = (a: Vec, ia = 0, sa = 1) => op3(fract1, a, ia, sa); -export const pow3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op32(Math.pow, a, b, ia, ib, sa, sb); - export const powN3 = (a: Vec, n: number, ia = 0, sa = 1) => op31(Math.pow, a, n, ia, sa); @@ -171,12 +149,6 @@ export const mixBilinear3 = ( a ); -export const min3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op32(Math.min, a, b, ia, ib, sa, sb); - -export const max3 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op32(Math.max, a, b, ia, ib, sa, sb); - export const clamp3 = (a: Vec, min: ReadonlyVec, max: ReadonlyVec, ia = 0, imin = 0, imax = 0, sa = 1, smin = 1, smax = 1) => max3(min3(a, max, ia, imax, sa, smax), min, ia, imin, sa, smin); diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index 9a1a78e289..25fdd514dc 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -14,8 +14,8 @@ import { Vec, ZERO4 } from "./api"; -import { defcommon } from "./codegen"; -import { $iter, declareIndices } from "./common"; +import { declareIndices, defcommon } from "./codegen"; +import { $iter } from "./common"; import { EPS, eqDelta1, @@ -51,33 +51,9 @@ export const op41 = (fn: (a: number, n: number) => number, a: Vec, n: number, ia a ); -export const op42 = (fn: (a: number, b: number) => number, a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] = fn(a[ia], b[ib]), - a[ia + sa] = fn(a[ia + sa], b[ib + sb]), - a[ia + 2 * sa] = fn(a[ia + 2 * sa], b[ib + 2 * sb]), - a[ia + 3 * sa] = fn(a[ia + 3 * sa], b[ib + 3 * sb]), - a -); - export const get4 = (a: ReadonlyVec, ia = 0, sa = 1) => set4(new ((a.constructor))(4), a, 0, ia, 1, sa); -export const set4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => ( - a[ia] = b[ib], - a[ia + sa] = b[ib + sb], - a[ia + 2 * sa] = b[ib + 2 * sb], - a[ia + 3 * sa] = b[ib + 3 * sb], - a -); - -export const setN4 = (a: Vec, n: number, ia = 0, sa = 1) => ( - a[ia] = n, - a[ia + sa] = n, - a[ia + 2 * sa] = n, - a[ia + 3 * sa] = n, - a -); - export const setS4 = (a: Vec, x: number, y: number, z: number, w: number, ia = 0, sa = 1) => ( a[ia] = x, a[ia + sa] = y, @@ -124,12 +100,14 @@ export const eqDelta4 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + 3 * sa], b[ib + 3 * sb], eps); export const [ + set4, setN4, add4, sub4, mul4, div4, add4o, sub4o, mul4o, div4o, addN4, subN4, mulN4, divN4, addN4o, subN4o, mulN4o, divN4o, madd4, maddN4, msub4, msubN4, abs4, sign4, floor4, ceil4, sin4, cos4, sqrt4, + pow4, min4, max4, mix4, mixN4, mix4o, mixN4o ] = defcommon(4); @@ -139,11 +117,8 @@ export const neg4 = (a: Vec, ia = 0, sa = 1) => export const fract4 = (a: Vec, ia = 0, sa = 1) => op4(fract1, a, ia, sa); -export const pow4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op42(Math.pow, a, b, ia, ib, sa, sb); - export const powN4 = (a: Vec, n: number, ia = 0, sa = 1) => - op4((x) => Math.pow(x, n), a, ia, sa); + op41(Math.pow, a, n, ia, sa); export const dot4 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => a[ia] * b[ib] + @@ -162,12 +137,6 @@ export const mixBilinear4 = ( a ); -export const min4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op42(Math.min, a, b, ia, ib, sa, sb); - -export const max4 = (a: Vec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => - op42(Math.max, a, b, ia, ib, sa, sb); - export const clamp4 = (a: Vec, min: ReadonlyVec, max: ReadonlyVec, ia = 0, imin = 0, imax = 0, sa = 1, smin = 1, smax = 1) => max4(min4(a, max, ia, imax, sa, smax), min, ia, imin, sa, smin); From 8399ec2f16d3fd049ac126d4db06372ae5581c0c Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 18:01:50 +0100 Subject: [PATCH 35/77] docs(vectors): fix docstrings, hide CommonOpts type alias --- packages/vectors/src/api.ts | 82 ++++++--------------------------- packages/vectors/src/codegen.ts | 57 ++++++++++++++++++++++- 2 files changed, 68 insertions(+), 71 deletions(-) diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 58d9ad9094..5f7dcc5f0f 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -6,8 +6,6 @@ export type ReadonlyVec = ArrayLike & Iterable; export type Mat = NumericArray; export type ReadonlyMat = ArrayLike & Iterable; -// FIXME update all VecOp* descriptions - /** * A vector operation involving only a single vector. The vector might * be modified. @@ -15,7 +13,7 @@ export type ReadonlyMat = ArrayLike & Iterable; export type VecOp1 = (v: Vec, i?: number, s?: number) => T; /** - * A vector operation involving two vectors. The first vector might be + * A vector operation involving 2 vectors. The first vector might be * modified. */ export type VecOp2 = (a: Vec, b: ReadonlyVec, ia?: number, ib?: number, sa?: number, sb?: number) => T; @@ -27,40 +25,40 @@ export type VecOp2 = (a: Vec, b: ReadonlyVec, ia?: number, ib?: number, sa?: export type VecOpN2 = (a: Vec, n: number, ia?: number, sa?: number) => T; /** - * A vector operation involving input readonly two vectors and writing - * result to an output vector `out`. + * A vector operation involving 2 readonly vectors and storing result + * in output vector `out`. */ export type VecOp2o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, io?: number, ia?: number, ib?: number, so?: number, sa?: number, sb?: number) => T; /** - * A vector operation involving input readonly two vectors and writing - * result to an output vector `out`. + * A vector operation involving a readonly vector and a scalar, + * storing result in output vector `out`. */ export type VecOpN2o = (out: Vec, a: ReadonlyVec, n: number, io?: number, ia?: number, so?: number, sa?: number) => T; /** - * A vector operation involving three vectors. The first vector might be + * A vector operation involving 3 vectors. The first vector might be * modified. */ export type VecOp3 = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, ia?: number, ib?: number, ic?: number, sa?: number, sb?: number, sc?: number) => T; /** - * A vector operation involving two vectors and a scalar. The first + * A vector operation involving 2 vectors and a scalar. The first * vector might be modified. */ export type VecOpN3 = (a: Vec, b: ReadonlyVec, n: number, ia?: number, ib?: number, sa?: number, sb?: number) => T; /** - * A vector operation involving three vectors. The first vector might be - * modified. + * A vector operation involving 3 readonly vectors and storing result in + * output vector `out`. */ -export type VecOp3o = (o: Vec, a: ReadonlyVec, b: ReadonlyVec, c: ReadonlyVec, io?: number, ia?: number, ib?: number, ic?: number, so?: number, sa?: number, sb?: number, sc?: number) => T; +export type VecOp3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, c: ReadonlyVec, io?: number, ia?: number, ib?: number, ic?: number, so?: number, sa?: number, sb?: number, sc?: number) => T; /** - * A vector operation involving three vectors and a scalar. The first - * vector might be modified. + * A vector operation involving 3 operands: 2 readonly vectors and a + * scalar, storing result in output vector `out`. */ -export type VecOpN3o = (o: Vec, a: ReadonlyVec, b: ReadonlyVec, n: number, io?: number, ia?: number, ib?: number, so?: number, sa?: number, sb?: number) => T; +export type VecOpN3o = (out: Vec, a: ReadonlyVec, b: ReadonlyVec, n: number, io?: number, ia?: number, ib?: number, so?: number, sa?: number, sb?: number) => T; /** * A readonly vector operation involving only a single vector. @@ -85,57 +83,3 @@ export const MIN4 = Object.freeze([min, min, min, min]); export const MAX4 = Object.freeze([max, max, max, max]); export const ONE4 = Object.freeze([1, 1, 1, 1]); export const ZERO4 = Object.freeze([0, 0, 0, 0]); - -export type CommonOps = [ - - // set, setN - VecOp2, - VecOpN2, - - // add, sub, mul, div - VecOp2, - VecOp2, - VecOp2, - VecOp2, - - VecOp2o, - VecOp2o, - VecOp2o, - VecOp2o, - - VecOpN2, - VecOpN2, - VecOpN2, - VecOpN2, - - VecOpN2o, - VecOpN2o, - VecOpN2o, - VecOpN2o, - - // madd / msub - VecOp3, - VecOpN3, - VecOp3, - VecOpN3, - - // Math.* - VecOp1, - VecOp1, - VecOp1, - VecOp1, - VecOp1, - VecOp1, - VecOp1, - - // pow, min,max - VecOp2, - VecOp2, - VecOp2, - - // mix, mixN, mixo, mixNo - VecOp3, - VecOpN3, - VecOp3o, - VecOpN3o -]; diff --git a/packages/vectors/src/codegen.ts b/packages/vectors/src/codegen.ts index f2990941a4..089d4ce6cc 100644 --- a/packages/vectors/src/codegen.ts +++ b/packages/vectors/src/codegen.ts @@ -7,7 +7,6 @@ import { map } from "@thi.ng/transducers/xform/map"; import { mapcat } from "@thi.ng/transducers/xform/mapcat"; import { take } from "@thi.ng/transducers/xform/take"; import { - CommonOps, Vec, VecOp1, VecOp2, @@ -18,7 +17,61 @@ import { VecOpN2o, VecOpN3, VecOpN3o -} from "@thi.ng/vectors/src/api"; +} from "./api"; + +type CommonOps = [ + + // set, setN + VecOp2, + VecOpN2, + + // add, sub, mul, div + VecOp2, + VecOp2, + VecOp2, + VecOp2, + + VecOp2o, + VecOp2o, + VecOp2o, + VecOp2o, + + VecOpN2, + VecOpN2, + VecOpN2, + VecOpN2, + + VecOpN2o, + VecOpN2o, + VecOpN2o, + VecOpN2o, + + // madd / msub + VecOp3, + VecOpN3, + VecOp3, + VecOpN3, + + // Math.* + VecOp1, + VecOp1, + VecOp1, + VecOp1, + VecOp1, + VecOp1, + VecOp1, + + // pow, min,max + VecOp2, + VecOp2, + VecOp2, + + // mix, mixN, mixo, mixNo + VecOp3, + VecOpN3, + VecOp3o, + VecOpN3o +]; /** * HOF array index lookup gen to provide optimized versions of: From 4f15ea80304f3b55c43a2c7138cf6b651813f7fa Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 28 Sep 2018 18:02:35 +0100 Subject: [PATCH 36/77] Publish - @thi.ng/hdom-canvas@0.1.5 - @thi.ng/hdom@5.0.5 - @thi.ng/transducers-hdom@1.1.7 - @thi.ng/vectors@1.3.0 --- packages/hdom-canvas/CHANGELOG.md | 9 +++++++++ packages/hdom-canvas/package.json | 4 ++-- packages/hdom/CHANGELOG.md | 9 +++++++++ packages/hdom/package.json | 2 +- packages/transducers-hdom/CHANGELOG.md | 9 +++++++++ packages/transducers-hdom/package.json | 4 ++-- packages/vectors/CHANGELOG.md | 12 ++++++++++++ packages/vectors/package.json | 4 ++-- 8 files changed, 46 insertions(+), 7 deletions(-) diff --git a/packages/hdom-canvas/CHANGELOG.md b/packages/hdom-canvas/CHANGELOG.md index a4d4083255..91cca886f4 100644 --- a/packages/hdom-canvas/CHANGELOG.md +++ b/packages/hdom-canvas/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.4...@thi.ng/hdom-canvas@0.1.5) (2018-09-28) + +**Note:** Version bump only for package @thi.ng/hdom-canvas + + + + + ## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.3...@thi.ng/hdom-canvas@0.1.4) (2018-09-26) diff --git a/packages/hdom-canvas/package.json b/packages/hdom-canvas/package.json index d87c23fcdb..e1fe846a80 100644 --- a/packages/hdom-canvas/package.json +++ b/packages/hdom-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-canvas", - "version": "0.1.4", + "version": "0.1.5", "description": "Declarative canvas scenegraph & visualization for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -31,7 +31,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/diff": "^1.1.2", - "@thi.ng/hdom": "^5.0.4" + "@thi.ng/hdom": "^5.0.5" }, "keywords": [ "ES6", diff --git a/packages/hdom/CHANGELOG.md b/packages/hdom/CHANGELOG.md index 6fdd9b7d1c..f5d6a944f6 100644 --- a/packages/hdom/CHANGELOG.md +++ b/packages/hdom/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [5.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.4...@thi.ng/hdom@5.0.5) (2018-09-28) + +**Note:** Version bump only for package @thi.ng/hdom + + + + + ## [5.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.3...@thi.ng/hdom@5.0.4) (2018-09-26) diff --git a/packages/hdom/package.json b/packages/hdom/package.json index a0414075f3..18a71ccda9 100644 --- a/packages/hdom/package.json +++ b/packages/hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom", - "version": "5.0.4", + "version": "5.0.5", "description": "Lightweight vanilla ES6 UI component trees with customizable branch-local behaviors", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index c219346b98..9bef17b8b1 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.7](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.6...@thi.ng/transducers-hdom@1.1.7) (2018-09-28) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [1.1.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.5...@thi.ng/transducers-hdom@1.1.6) (2018-09-26) diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index 994c363e3f..05c85a98fa 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "1.1.6", + "version": "1.1.7", "description": "Transducer based UI updater for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -29,7 +29,7 @@ }, "dependencies": { "@thi.ng/checks": "^1.5.11", - "@thi.ng/hdom": "^5.0.4", + "@thi.ng/hdom": "^5.0.5", "@thi.ng/transducers": "^2.1.6" }, "keywords": [ diff --git a/packages/vectors/CHANGELOG.md b/packages/vectors/CHANGELOG.md index 516ae5f978..f2b9bd50c1 100644 --- a/packages/vectors/CHANGELOG.md +++ b/packages/vectors/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [1.3.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@1.2.2...@thi.ng/vectors@1.3.0) (2018-09-28) + + +### Features + +* **vectors:** add vector ops codegen, update basic vec2/3/4 ops ([#51](https://github.com/thi-ng/umbrella/issues/51)) ([b5ed254](https://github.com/thi-ng/umbrella/commit/b5ed254)) + + + + + ## [1.2.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@1.2.1...@thi.ng/vectors@1.2.2) (2018-09-24) diff --git a/packages/vectors/package.json b/packages/vectors/package.json index faaea53cea..082489232e 100644 --- a/packages/vectors/package.json +++ b/packages/vectors/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/vectors", - "version": "1.2.2", + "version": "1.3.0", "description": "Vector algebra for fixed & variable sizes, memory mapped, flexible layouts", "main": "./index.js", "typings": "./index.d.ts", @@ -46,4 +46,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} From 5c44ad9896521da1c2d49bea2a1ef3f002d0c0d4 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 29 Sep 2018 18:36:25 +0100 Subject: [PATCH 37/77] feat(vectors): add operation specific interfaces, rename Vec3.toPolar() - update class wrappers w/ interface decls - rename toSpherical3() => toPolar3() - rename Vec3.toSpherical() => Vec3.toPolar() - add msub/msubN for all vec types --- packages/vectors/src/api.ts | 66 ++++++++++++++++++++++++++++++++++++ packages/vectors/src/gvec.ts | 37 ++++++++++++++++++-- packages/vectors/src/vec2.ts | 28 +++++++++++++++ packages/vectors/src/vec3.ts | 34 +++++++++++++++++-- packages/vectors/src/vec4.ts | 22 ++++++++++++ 5 files changed, 182 insertions(+), 5 deletions(-) diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 5f7dcc5f0f..4fb327896f 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -77,6 +77,72 @@ export interface IVec { s: number; } +export interface IAngleBetween { + angleBetween(v: Readonly, normalize?: boolean): number; +} + +export interface IDistance { + dist(v: Readonly): number; + distSq(v: Readonly): number; +} +export interface IDotProduct { + dot(v: Readonly): number; +} + +export interface ICrossProduct { + cross(v: Readonly): R; +} + +export interface IMagnitude<> { + mag(): number; + magSq(): number; +} + +export interface IMath { + add(v: Readonly): T; + sub(v: Readonly): T; + mul(v: Readonly): T; + div(v: Readonly): T; + addN(n: number): T; + subN(n: number): T; + mulN(n: number): T; + divN(n: number): T; + madd(v: Readonly, w: Readonly): T; + maddN(v: Readonly, n: number): T; + msub(v: Readonly, w: Readonly): T; + msubN(v: Readonly, n: number): T; +} + +export interface IMix { + mix(v: Readonly, t: Readonly): T; + mixN(v: Readonly, t: number): T; +} + +export interface INormalize { + /** + * Normalizes vector to given `length`. If omitted, target length + * will be 1.0. + * + * @param length + */ + normalize(length?: number): T; +} + +export interface IPolar { + /** + * Converts vector into polar coordinates. For the 3D case, these + * will be spherical coordinates. + */ + toPolar(): T; + /** + * Converts vector with polar coordinates into cartesian form. The + * optional `offset` will be added to the result. + * + * @param offset + */ + toCartesian(offset?: Readonly): T; +} + const min = Number.NEGATIVE_INFINITY; const max = Number.POSITIVE_INFINITY; export const MIN4 = Object.freeze([min, min, min, min]); diff --git a/packages/vectors/src/gvec.ts b/packages/vectors/src/gvec.ts index 50b2058b18..3ba088c39c 100644 --- a/packages/vectors/src/gvec.ts +++ b/packages/vectors/src/gvec.ts @@ -6,8 +6,16 @@ import { } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; - -import { IVec, ReadonlyVec, Vec } from "./api"; +import { + IDotProduct, + IMagnitude, + IMath, + IMix, + INormalize, + IVec, + ReadonlyVec, + Vec +} from "./api"; import { $iter, eqDelta, equiv } from "./common"; import { clamp1, @@ -18,6 +26,7 @@ import { step1 } from "./math"; + export const opg0 = (fn: () => number, a: Vec, num = a.length, i = 0, s = 1) => { i += num * s; while (i -= s, --num >= 0) { @@ -122,6 +131,12 @@ export const madd = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, num = a.length, ia export const maddN = (a: Vec, b: ReadonlyVec, n: number, num = a.length, ia = 0, ib = 0, sa = 1, sb = 1) => opg2((x, y) => x + y * n, a, b, num, ia, ib, sa, sb); +export const msub = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, num = a.length, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => + opg3((x, y, z) => x - y * z, a, b, c, num, ia, ib, ic, sa, sb, sc); + +export const msubN = (a: Vec, b: ReadonlyVec, n: number, num = a.length, ia = 0, ib = 0, sa = 1, sb = 1) => + opg2((x, y) => x + y * n, a, b, num, ia, ib, sa, sb); + export const mix = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, num = a.length, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => opg3((x, y, z) => x + (y - x) * z, a, b, c, num, ia, ib, ic, sa, sb, sc); @@ -204,9 +219,14 @@ export const gvec = (...coords: number[]) => export class GVec implements ICopy, + IDotProduct, IEqualsDelta, IEquiv, ILength, + IMagnitude, + IMath, + IMix, + INormalize, Iterable, IVec { @@ -358,6 +378,19 @@ export class GVec implements return this; } + msub(b: Readonly, c: Readonly) { + this.ensureSize(b); + this.ensureSize(c); + msub(this.buf, b.buf, c.buf, this.n, this.i, b.i, c.i, this.s, b.s, c.s); + return this; + } + + msubN(v: Readonly, n: number) { + this.ensureSize(v); + msubN(this.buf, v.buf, n, this.n, this.i, v.i, this.s, v.s); + return this; + } + mix(b: Readonly, c: Readonly) { this.ensureSize(b); this.ensureSize(c); diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index ca5ff9fa92..7a3320419b 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -6,6 +6,15 @@ import { } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { + IAngleBetween, + ICrossProduct, + IDistance, + IDotProduct, + IMagnitude, + IMath, + IMix, + INormalize, + IPolar, IVec, MAX4, MIN4, @@ -249,10 +258,19 @@ export const vec2 = (x = 0, y = 0) => new Vec2([x, y]); export class Vec2 implements + IAngleBetween, ICopy, + ICrossProduct, + IDistance, + IDotProduct, IEqualsDelta, IEquiv, ILength, + IMagnitude, + IMath, + IMix, + INormalize, + IPolar, Iterable, IVec { @@ -546,6 +564,16 @@ export class Vec2 implements return this; } + msub(b: Readonly, c: Readonly) { + msub2(this.buf, b.buf, c.buf, this.i, b.i, c.i, this.s, b.s, c.s); + return this; + } + + msubN(b: Readonly, n: number) { + msubN2(this.buf, b.buf, n, this.i, b.i, this.s, b.s); + return this; + } + mix(b: Readonly, c: Readonly) { mix2(this.buf, b.buf, c.buf, this.i, b.i, c.i, this.s, b.s, c.s); return this; diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 7ccc5337ce..62290968d9 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -6,6 +6,15 @@ import { } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { + IAngleBetween, + ICrossProduct, + IDistance, + IDotProduct, + IMagnitude, + IMath, + IMix, + INormalize, + IPolar, IVec, MAX4, MIN4, @@ -269,7 +278,7 @@ export const angleBetween3 = (a: ReadonlyVec, b: ReadonlyVec, normalize = false, angleBetween3(normalize3(get3(a, ia, sa)), normalize3(get3(b, ib, sb))) : Math.acos(dot3(a, b, ia, ib, sa, sb)); -export const toSpherical3 = (a: Vec, ia = 0, sa = 1) => { +export const toPolar3 = (a: Vec, ia = 0, sa = 1) => { const x = a[ia]; const y = a[ia + sa]; const z = a[ia + 2 * sa]; @@ -308,10 +317,19 @@ export const vec3 = (x = 0, y = 0, z = 0) => new Vec3([x, y, z]); export class Vec3 implements + IAngleBetween, ICopy, + ICrossProduct, + IDistance, + IDotProduct, IEqualsDelta, IEquiv, ILength, + IMagnitude, + IMath, + IMix, + INormalize, + IPolar, Iterable, IVec { @@ -610,6 +628,16 @@ export class Vec3 implements return this; } + msub(b: Readonly, c: Readonly) { + msub3(this.buf, b.buf, c.buf, this.i, b.i, c.i, this.s, b.s, c.s); + return this; + } + + msubN(b: Readonly, n: number) { + msubN3(this.buf, b.buf, n, this.i, b.i, this.s, b.s); + return this; + } + mix(b: Readonly, c: Readonly) { mix3(this.buf, b.buf, c.buf, this.i, b.i, c.i, this.s, b.s, c.s); return this; @@ -746,8 +774,8 @@ export class Vec3 implements return angleBetween3(this.buf, v.buf, normalize, this.i, v.i, this.s, v.s); } - toSpherical() { - toSpherical3(this.buf, this.i, this.s); + toPolar() { + toPolar3(this.buf, this.i, this.s); return this; } diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index 25fdd514dc..b3abde8c12 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -6,6 +6,12 @@ import { } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { + IDistance, + IDotProduct, + IMagnitude, + IMath, + IMix, + INormalize, IVec, MAX4, MIN4, @@ -226,9 +232,15 @@ export const vec4 = (x = 0, y = 0, z = 0, w = 0) => export class Vec4 implements ICopy, + IDistance, + IDotProduct, IEqualsDelta, IEquiv, ILength, + IMagnitude, + IMath, + IMix, + INormalize, Iterable, IVec { @@ -524,6 +536,16 @@ export class Vec4 implements return this; } + msub(b: Readonly, c: Readonly) { + msub4(this.buf, b.buf, c.buf, this.i, b.i, c.i, this.s, b.s, c.s); + return this; + } + + msubN(b: Readonly, n: number) { + msubN4(this.buf, b.buf, n, this.i, b.i, this.s, b.s); + return this; + } + mix(b: Readonly, c: Readonly) { mix4(this.buf, b.buf, c.buf, this.i, b.i, c.i, this.s, b.s, c.s); return this; From 9c27c77f847186ab68953d4fb5a43bec192f99ef Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 29 Sep 2018 18:46:14 +0100 Subject: [PATCH 38/77] feat(geom): update all shape types, add interfaces & ops, update tests --- packages/geom/package.json | 6 +- packages/geom/src/circle2.ts | 72 ++++++----------- packages/geom/src/common.ts | 43 +++++++--- packages/geom/src/container2.ts | 134 ++++++++++++-------------------- packages/geom/src/container3.ts | 129 ++++++++++++------------------ packages/geom/src/index.ts | 3 +- packages/geom/src/line2.ts | 32 -------- packages/geom/src/poly2.ts | 49 ++++++------ packages/geom/src/polyline2.ts | 34 ++++++++ packages/geom/test/index.ts | 19 ++--- 10 files changed, 229 insertions(+), 292 deletions(-) delete mode 100644 packages/geom/src/line2.ts create mode 100644 packages/geom/src/polyline2.ts diff --git a/packages/geom/package.json b/packages/geom/package.json index d3c42a63da..a291d71206 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.1.1", - "@thi.ng/transducers": "^2.1.1", - "@thi.ng/vectors": "^1.1.0" + "@thi.ng/api": "^4.2.1", + "@thi.ng/transducers": "^2.1.6", + "@thi.ng/vectors": "^1.3.0" }, "keywords": [ "ES6", diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index 80341d9a60..5e13b1d559 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -2,59 +2,41 @@ import { IObjectOf } from "@thi.ng/api/api"; import { normRange } from "@thi.ng/transducers/iter/norm-range"; import { Vec } from "@thi.ng/vectors/api"; import { mix1, PI, TAU } from "@thi.ng/vectors/math"; -import { - addN2o, - set2, - setS2, - subN2o, - toCartesian2, - Vec2 -} from "@thi.ng/vectors/vec2"; - +import { setS2, toCartesian2, Vec2 } from "@thi.ng/vectors/vec2"; import { Polygon2 } from "./poly2"; export class Circle2 { - buf: Vec; - offset: number; - attribs: any; + pos: Vec2; + r: number; + attribs: IObjectOf; - constructor(buf: Vec, attribs?: IObjectOf, offset = 0) { - this.buf = buf; + constructor(pos: Vec2, r = 1, attribs?: IObjectOf) { + this.pos = pos; + this.r = r; this.attribs = attribs; - this.offset = offset; - } - - get pos() { - return new Vec2(this.buf, this.offset); - } - - set pos(v: Readonly) { - set2(this.buf, v.buf, this.offset, v.i, 1, v.s); } - get r() { - return this.buf[this.offset + 2]; - } - - set r(r: number) { - this.buf[this.offset + 2] = r; - } - - verticesRaw(from: number, + verticesRaw( + from: number, to: number, res: number, inclLast: boolean, dest: Vec = [], destOffset = 0, cstride = 1, - estride = 2) { + estride = 2 + ) { - const buf = this.buf; - const o = this.offset; - const r = buf[o + 2]; + const pos = this.pos.buf; + const po = this.pos.i; + const ps = this.pos.s; + const r = this.r; for (let t of normRange(inclLast ? res - 1 : res, inclLast)) { - toCartesian2(setS2(dest, r, mix1(from, to, t), destOffset, cstride), buf, destOffset, o, cstride, 1); + toCartesian2( + setS2(dest, r, mix1(from, to, t), destOffset, cstride), + pos, destOffset, po, cstride, ps + ); destOffset += estride; } return dest; @@ -65,7 +47,7 @@ export class Circle2 { } area() { - return PI * Math.pow(this.r, 2); + return PI * this.r * this.r; } circumference() { @@ -73,15 +55,14 @@ export class Circle2 { } bounds() { - const buf = this.buf; return [ - new Vec2(subN2o([], buf, buf[2], 0, this.offset)), - new Vec2(addN2o([], buf, buf[2], 0, this.offset)) + Vec2.subN(this.pos, this.r), + Vec2.addN(this.pos, this.r) ]; } toPolygon(res = 20) { - return new Polygon2(this.verticesRaw(0, TAU, res, false), res); + return new Polygon2(this.vertices(res)); } toHiccup() { @@ -89,8 +70,5 @@ export class Circle2 { } } -export const circle2m = (buf: Vec, attribs?: IObjectOf, offset?: number) => - new Circle2(buf, attribs, offset); - -export const circle2 = (pos: Readonly, r = 1, attribs?: IObjectOf) => - new Circle2([pos.x, pos.y, r], attribs, 0); +export const circle2 = (pos: Vec2, r = 1, attribs?: IObjectOf) => + new Circle2(pos, r, attribs); diff --git a/packages/geom/src/common.ts b/packages/geom/src/common.ts index b390cb0353..3c1c9737a2 100644 --- a/packages/geom/src/common.ts +++ b/packages/geom/src/common.ts @@ -1,20 +1,45 @@ +import { peek } from "@thi.ng/transducers/func/peek"; import { wrap } from "@thi.ng/transducers/iter/wrap"; import { partition } from "@thi.ng/transducers/xform/partition"; -import { ReadonlyVec, ReadonlyVecOp2 } from "@thi.ng/vectors/api"; +import { IDistance } from "@thi.ng/vectors/api"; +import { SampleableVector } from "./api"; -export const arcLength = (dist: ReadonlyVecOp2, buf: ReadonlyVec, num: number, offset: number, stride: number, closed = false) => { - num--; +export const arcLength = >(pts: Readonly[], closed = false) => { + const num = pts.length; + if (num < 2) return 0; + let i = pts[0]; + let j = pts[1]; let res = 0; - for (let n = num, i = offset, j = i + stride; n > 0; n-- , i = j, j += stride) { - res += dist(buf, buf, i, j); - } - if (closed) { - res += dist(buf, buf, offset + num * stride, offset); + for (let k = 1; k < num; k++ , i = j, j = pts[k]) { + res += i.dist(j); } + closed && (res += i.dist(pts[0])); return res; } -export const resample = () => { }; +/** + * Re-samples given polyline at given uniform distance. Returns array of + * interpolated points (does not modify original). + * + * @param step sample distance + * @param pts + */ +export const sampleUniform = >(pts: T[], step: number) => { + if (!pts.length) return []; + let prev = pts[0]; + const res: T[] = [prev]; + for (let i = 1, n = pts.length; i < n; prev = peek(res), i++) { + const p = pts[i]; + let d = p.dist(prev); + while (d >= step) { + res.push(prev = prev.copy().mixN(p, step / d)); + d -= step; + } + } + res.push(peek(pts)); + return res; +}; + export function edges(vertices: T[], closed = false) { return partition(2, 1, closed ? wrap(vertices, 1, false, true) : vertices); diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts index fe4c179299..28d08a5e6f 100644 --- a/packages/geom/src/container2.ts +++ b/packages/geom/src/container2.ts @@ -1,32 +1,18 @@ import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; -import { Vec } from "@thi.ng/vectors/api"; -import { transformVectors1 } from "@thi.ng/vectors/common"; -import { Mat23, mulV23 } from "@thi.ng/vectors/mat23"; -import { - add2, - max2, - min2, - mul2, - set2, - swap2, - Vec2 -} from "@thi.ng/vectors/vec2"; +import { Mat23 } from "@thi.ng/vectors/mat23"; +import { Vec2, vec2 } from "@thi.ng/vectors/vec2"; +import { IBounds } from "./api"; -export class PointContainer2 { +export class PointContainer2 implements + IBounds { - buf: Vec; - length: number; - offset: number; - stride: number; + points: Vec2[]; attribs: IObjectOf; - constructor(buf: Vec, num?: number, attribs?: IObjectOf, offset = 0, stride = 2) { - this.buf = buf; - this.length = num != null ? num : buf.length / 2; + constructor(pts: Vec2[], attribs?: IObjectOf) { + this.points = pts; this.attribs = attribs; - this.offset = offset; - this.stride = stride; } *[Symbol.iterator]() { @@ -34,40 +20,44 @@ export class PointContainer2 { } vertices() { - return Vec2.mapBuffer(this.buf, this.length, this.offset, 1, this.stride); - } - - get(i: number, safe = true) { - safe && this.ensureIndex(i); - return new Vec2(this.buf, this.offset + i * this.stride); - } - - set(i: number, v: Readonly, safe = true) { - safe && this.ensureIndex(i); - set2(this.buf, v.buf, this.offset + i * this.stride, v.i, 1, v.s); + return this.points; } bounds() { - const s = this.stride; - const pts = this.buf; + const pts = this.points; const min = Vec2.MAX.copy(); const max = Vec2.MIN.copy(); - for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { - min2(min.buf, pts, 0, i, 1, 1); - max2(max.buf, pts, 0, i, 1, 1); + for (let i = pts.length; --i >= 0;) { + const p = pts[i]; + min.min(p); + max.max(p); } return [min, max]; } + width() { + const b = this.bounds(); + return b[1].x - b[0].x; + } + + height() { + const b = this.bounds(); + return b[1].y - b[0].y; + } + + depth() { + return 0; + } + centroid(c?: Vec2): Vec2 { - !this.length && illegalArgs("no points available"); - !c && (c = Vec2.ZERO.copy()); - const s = this.stride; - const pts = this.buf; - for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { - add2(c.buf, pts, c.i, i, c.s, 1); + const pts = this.points; + const num = pts.length; + !num && illegalArgs("no points available"); + !c && (c = vec2()); + for (let i = num; --i >= 0;) { + c.add(pts[i]); } - return c.divN(this.length); + return c.divN(num); } center(origin?: Readonly) { @@ -76,58 +66,30 @@ export class PointContainer2 { } flip() { - const s = this.stride; - for (let i = 0, j = (this.length - 1) * s; i < j; i += s, j -= s) { - swap2(this.buf, this.buf, i, j); - } + this.points.reverse(); } scale(v: Readonly) { - transformVectors1( - mul2, - this.buf, - v.buf, - this.length, - this.offset, - v.i, - 1, - v.s, - this.stride - ); + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + pts[i].mul(v); + } return this; } translate(v: Readonly) { - transformVectors1( - add2, - this.buf, - v.buf, - this.length, - this.offset, - v.i, - 1, - v.s, - this.stride - ); + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + pts[i].add(v); + } return this; } transform(mat: Readonly) { - transformVectors1( - mulV23, - this.buf, - mat.buf, - this.length, - this.offset, - mat.i, - 1, - 1, - this.stride - ); + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + mat.mulV(pts[i]); + } return this; } - - protected ensureIndex(i: number) { - (i < 0 && i >= this.length) && illegalArgs(`index out of bounds: ${i}`); - } } diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts index 11689c770c..07552455cf 100644 --- a/packages/geom/src/container3.ts +++ b/packages/geom/src/container3.ts @@ -1,31 +1,18 @@ import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; -import { Vec } from "@thi.ng/vectors/api"; -import { transformVectors1 } from "@thi.ng/vectors/common"; -import { Mat44, mulV344 } from "@thi.ng/vectors/mat44"; -import { - add3, - max3, - min3, - mul3, - set3, - swap3, - Vec3 -} from "@thi.ng/vectors/vec3"; +import { Mat44 } from "@thi.ng/vectors/mat44"; +import { Vec3, vec3 } from "@thi.ng/vectors/vec3"; +import { IBounds } from "./api"; -export class PointContainer3 { +export class PointContainer3 implements + IBounds { - buf: Vec; - length: number; - offset: number; - stride: number; + points: Vec3[]; attribs: IObjectOf; - constructor(buf: Vec, num: number, offset = 0, stride = 2) { - this.buf = buf; - this.length = num; - this.offset = offset; - this.stride = stride; + constructor(pts: Vec3[], attribs?: IObjectOf) { + this.points = pts; + this.attribs = attribs; } *[Symbol.iterator]() { @@ -33,40 +20,45 @@ export class PointContainer3 { } vertices() { - return Vec3.mapBuffer(this.buf, this.length, this.offset, 1, this.stride); - } - - get(i: number, safe = true) { - safe && this.ensureIndex(i); - return new Vec3(this.buf, this.offset + i * this.stride); - } - - set(i: number, v: Readonly, safe = false) { - safe && this.ensureIndex(i); - set3(this.buf, v.buf, this.offset + i * this.stride, v.i, 1, v.s); + return this.points; } bounds() { - const s = this.stride; - const pts = this.buf; + const pts = this.points; const min = Vec3.MAX.copy(); const max = Vec3.MIN.copy(); - for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { - min3(min.buf, pts, 0, i, 1, 1); - max3(max.buf, pts, 0, i, 1, 1); + for (let i = pts.length; --i >= 0;) { + const p = pts[i]; + min.min(p); + max.max(p); } return [min, max]; } + width() { + const b = this.bounds(); + return b[1].x - b[0].x; + } + + height() { + const b = this.bounds(); + return b[1].y - b[0].y; + } + + depth() { + const b = this.bounds(); + return b[1].z - b[0].z; + } + centroid(c?: Vec3): Vec3 { - !this.length && illegalArgs("no points available"); - !c && (c = Vec3.ZERO.copy()); - const s = this.stride; - const pts = this.buf; - for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { - add3(c.buf, pts, c.i, i, c.s, 1); + const pts = this.points; + const num = pts.length; + !num && illegalArgs("no points available"); + !c && (c = vec3()); + for (let i = num; --i >= 0;) { + c.add(pts[i]); } - return c.divN(this.length); + return c.divN(num); } center(p?: Readonly) { @@ -75,51 +67,30 @@ export class PointContainer3 { } flip() { - const s = this.stride; - for (let i = 0, j = (this.length - 1) * s; i < j; i += s, j -= s) { - swap3(this.buf, this.buf, i, j); - } + this.points.reverse(); } scale(v: Readonly) { - transformVectors1( - mul3, - this.buf, - v.buf, - this.length, - this.offset, - v.i, - 1, - v.s, - this.stride - ); + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + pts[i].mul(v); + } return this; } - translate(t: Readonly) { - transformVectors1( - add3, - this.buf, - t.buf, - this.length, - this.offset, - t.i, - 1, - t.s, - this.stride - ); + translate(v: Readonly) { + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + pts[i].add(v); + } return this; } transform(mat: Readonly) { - const s = this.stride; - for (let n = this.length, i = this.offset; n > 0; n-- , i += s) { - mulV344(mat.buf, this.buf, mat.i, i, 1); + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + mat.mulV3(pts[i]); } return this; } - - protected ensureIndex(i: number) { - (i < 0 && i >= this.length) && illegalArgs(`index out of bounds: ${i}`); - } } diff --git a/packages/geom/src/index.ts b/packages/geom/src/index.ts index 94b2161164..7b6476bb7f 100644 --- a/packages/geom/src/index.ts +++ b/packages/geom/src/index.ts @@ -1,6 +1,7 @@ +export * from "./api"; export * from "./container2"; export * from "./container3"; export * from "./circle2"; -export * from "./line2"; export * from "./poly2"; +export * from "./polyline2"; diff --git a/packages/geom/src/line2.ts b/packages/geom/src/line2.ts deleted file mode 100644 index 468ec1e9ce..0000000000 --- a/packages/geom/src/line2.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { IObjectOf } from "@thi.ng/api/api"; -import { Vec } from "@thi.ng/vectors/api"; -import { dist2 } from "@thi.ng/vectors/vec2"; - -import { arcLength, edges } from "./common"; -import { PointContainer2 } from "./container2"; - -export class Polyline2 extends PointContainer2 { - - constructor(points: Vec, num?: number, attribs?: IObjectOf, offset = 0, stride = 2) { - super(points, num, attribs, offset, stride); - } - - edges() { - return edges(this.vertices()); - } - - area() { - return 0; - } - - arcLength() { - return arcLength(dist2, this.buf, this.length, this.offset, this.stride); - } - - toHiccup() { - return ["polyline", this.attribs, this.vertices()]; - } -} - -export const polyline2 = (points: Vec, num?: number, attribs?: IObjectOf, offset?: number, stride?: number) => - new Polyline2(points, num, attribs, offset, stride); diff --git a/packages/geom/src/poly2.ts b/packages/geom/src/poly2.ts index 1b0ea6d98f..579a57c262 100644 --- a/packages/geom/src/poly2.ts +++ b/packages/geom/src/poly2.ts @@ -1,45 +1,45 @@ import { IObjectOf } from "@thi.ng/api/api"; -import { Vec } from "@thi.ng/vectors/api"; -import { cross2, dist2, Vec2 } from "@thi.ng/vectors/vec2"; - +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { IArcLength, IArea } from "./api"; import { arcLength, edges } from "./common"; import { PointContainer2 } from "./container2"; -export class Polygon2 extends PointContainer2 { +export class Polygon2 extends PointContainer2 implements + IArcLength, + IArea { - constructor(points: Vec, num?: number, attribs?: IObjectOf, offset = 0, stride = 2) { - super(points, num, attribs, offset, stride); + constructor(points: Vec2[], attribs?: IObjectOf) { + super(points, attribs); } edges() { return edges(this.vertices(), true); } - area() { - const s = this.stride; - const pts = this.buf; + area(unsigned = true) { + const pts = this.points; let res = 0; - for (let n = (this.length - 1) * s, i = this.offset + n, j = this.offset; n >= 0; i = j, j += s, n -= s) { - res += cross2(pts, pts, i, j); + for (let n = pts.length - 1, i = n, j = 0; n >= 0; i = j, j++ , n--) { + res += pts[i].cross(pts[j]); } - return res / 2; + res /= 2; + return unsigned ? res : Math.abs(res); } - circumference() { - return arcLength(dist2, this.buf, this.length, this.offset, this.stride, true); + arcLength() { + return arcLength(this.points, true); } centroid(c?: Vec2): Vec2 { - const s = this.stride; - const pts = this.buf; + const pts = this.points; let area = 0; let x = 0; let y = 0; - for (let n = (this.length - 1) * s, i = this.offset + n, j = this.offset; n >= 0; i = j, j += s, n -= s) { - const z = cross2(pts, pts, i, j); + for (let n = pts.length - 1, i = pts[n], j = pts[0], k = 0; k <= n; k++ , i = j, j = pts[k]) { + const z = i.cross(j); area += z; - x += (pts[i] + pts[j]) * z; - y += (pts[i + 1] + pts[j + 1]) * z; + x += (i.x + j.x) * z; + y += (i.y + j.y) * z; } area = 1 / (area * 3); x *= area; @@ -48,12 +48,9 @@ export class Polygon2 extends PointContainer2 { } toHiccup() { - return ["polygon", this.attribs, this.vertices()]; + return ["polygon", this.attribs || {}, this.vertices()]; } } -export const polygon2m = (points: Vec, num?: number, attribs?: IObjectOf, offset?: number, stride?: number) => - new Polygon2(points, num, attribs, offset, stride); - -export const polygon2 = (points: Iterable>, attribs?: IObjectOf) => - new Polygon2(Vec2.intoBuffer([], points), null, attribs); +export const polygon2 = (points: Vec2[], attribs?: IObjectOf) => + new Polygon2(points, attribs); diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts new file mode 100644 index 0000000000..6c702f4894 --- /dev/null +++ b/packages/geom/src/polyline2.ts @@ -0,0 +1,34 @@ +import { IObjectOf } from "@thi.ng/api/api"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { arcLength, edges, sampleUniform } from "./common"; +import { PointContainer2 } from "./container2"; + +export class Polyline2 extends PointContainer2 { + + constructor(points: Vec2[], attribs?: IObjectOf) { + super(points, attribs); + } + + edges() { + return edges(this.vertices()); + } + + area() { + return 0; + } + + arcLength() { + return arcLength(this.points); + } + + resample(dist: number) { + this.points = sampleUniform(this.points, dist); + } + + toHiccup() { + return ["polyline", this.attribs, this.vertices()]; + } +} + +export const polyline2 = (points: Vec2[], attribs?: IObjectOf) => + new Polyline2(points, attribs); diff --git a/packages/geom/test/index.ts b/packages/geom/test/index.ts index 6405093df4..c6806587c5 100644 --- a/packages/geom/test/index.ts +++ b/packages/geom/test/index.ts @@ -1,25 +1,26 @@ -import * as assert from "assert"; import { equiv } from "@thi.ng/equiv"; -import { polygon2m } from "../src/index"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import * as assert from "assert"; +import { polygon2 } from "../src/index"; describe("polygon2", () => { it("area", () => { - const a = polygon2m([0, 0, 100, 0, 100, 100, 0, 100], 4); + const a = polygon2(Vec2.mapBuffer([0, 0, 100, 0, 100, 100, 0, 100], 4)); assert.equal(a.area(), 100 * 100); - a.length = 3; + a.points.pop() assert.equal(a.area(), 100 * 100 / 2); }); it("circumference", () => { - const a = polygon2m([0, 0, 100, 0, 100, 100, 0, 100], 4); - assert.equal(a.circumference(), 400); - a.length = 3; - assert.equal(a.circumference(), 200 + Math.sqrt(2) * 100); + const a = polygon2(Vec2.mapBuffer([0, 0, 100, 0, 100, 100, 0, 100], 4)); + assert.equal(a.arcLength(), 400); + a.points.pop() + assert.equal(a.arcLength(), 200 + Math.sqrt(2) * 100); }); it("hiccup", () => { - const a = polygon2m([0, 0, 100, 0, 100, 100, 0, 100], 4, { fill: "red" }); + const a = polygon2(Vec2.mapBuffer([0, 0, 100, 0, 100, 100, 0, 100], 4), { fill: "red" }); assert( equiv( a.toHiccup(), From 34312d8f17bae21f3512c0e6ac270eee0947b231 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 29 Sep 2018 19:08:15 +0100 Subject: [PATCH 39/77] feat(vectors): add IMinMax interface --- packages/vectors/src/api.ts | 5 +++++ packages/vectors/src/gvec.ts | 2 ++ packages/vectors/src/vec2.ts | 2 ++ packages/vectors/src/vec3.ts | 2 ++ packages/vectors/src/vec4.ts | 2 ++ 5 files changed, 13 insertions(+) diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 4fb327896f..ee6b106df0 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -113,6 +113,11 @@ export interface IMath { msubN(v: Readonly, n: number): T; } +export interface IMinMax { + min(v: Readonly): T; + max(v: Readonly): T; +} + export interface IMix { mix(v: Readonly, t: Readonly): T; mixN(v: Readonly, t: number): T; diff --git a/packages/vectors/src/gvec.ts b/packages/vectors/src/gvec.ts index 3ba088c39c..aa6d30b949 100644 --- a/packages/vectors/src/gvec.ts +++ b/packages/vectors/src/gvec.ts @@ -10,6 +10,7 @@ import { IDotProduct, IMagnitude, IMath, + IMinMax, IMix, INormalize, IVec, @@ -225,6 +226,7 @@ export class GVec implements ILength, IMagnitude, IMath, + IMinMax, IMix, INormalize, Iterable, diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index 7a3320419b..0824240df8 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -12,6 +12,7 @@ import { IDotProduct, IMagnitude, IMath, + IMinMax, IMix, INormalize, IPolar, @@ -268,6 +269,7 @@ export class Vec2 implements ILength, IMagnitude, IMath, + IMinMax, IMix, INormalize, IPolar, diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 62290968d9..5db140ef3d 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -12,6 +12,7 @@ import { IDotProduct, IMagnitude, IMath, + IMinMax, IMix, INormalize, IPolar, @@ -327,6 +328,7 @@ export class Vec3 implements ILength, IMagnitude, IMath, + IMinMax, IMix, INormalize, IPolar, diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index b3abde8c12..435a8500da 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -10,6 +10,7 @@ import { IDotProduct, IMagnitude, IMath, + IMinMax, IMix, INormalize, IVec, @@ -239,6 +240,7 @@ export class Vec4 implements ILength, IMagnitude, IMath, + IMinMax, IMix, INormalize, Iterable, From 9fb2091a7cfac994da4ed9b8e9d1c10ec24524b6 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 29 Sep 2018 19:29:25 +0100 Subject: [PATCH 40/77] refactor(geom): add interfaces, split out common.ts into /func folder --- packages/geom/package.json | 2 +- packages/geom/src/api.ts | 61 +++++++++++++++++++ packages/geom/src/circle2.ts | 43 +++++++++++-- packages/geom/src/container2.ts | 17 ++---- packages/geom/src/container3.ts | 17 ++---- packages/geom/src/func/arc-length.ts | 14 +++++ packages/geom/src/func/bounds.ts | 10 +++ packages/geom/src/func/circumcenter.ts | 41 +++++++++++++ packages/geom/src/func/edges.ts | 6 ++ .../src/{common.ts => func/sample-uniform.ts} | 23 +------ packages/geom/src/poly2.ts | 11 ++-- packages/geom/src/polyline2.ts | 15 +++-- 12 files changed, 202 insertions(+), 58 deletions(-) create mode 100644 packages/geom/src/api.ts create mode 100644 packages/geom/src/func/arc-length.ts create mode 100644 packages/geom/src/func/bounds.ts create mode 100644 packages/geom/src/func/circumcenter.ts create mode 100644 packages/geom/src/func/edges.ts rename packages/geom/src/{common.ts => func/sample-uniform.ts} (50%) diff --git a/packages/geom/package.json b/packages/geom/package.json index a291d71206..e0f95663b7 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -13,7 +13,7 @@ "license": "Apache-2.0", "scripts": { "build": "yarn run clean && tsc --declaration", - "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc func", "cover": "yarn test && nyc report --reporter=lcov", "doc": "node_modules/.bin/typedoc --mode modules --out doc src", "pub": "yarn run build && yarn publish --access public", diff --git a/packages/geom/src/api.ts b/packages/geom/src/api.ts new file mode 100644 index 0000000000..e63ceb2d96 --- /dev/null +++ b/packages/geom/src/api.ts @@ -0,0 +1,61 @@ +import { ICopy } from "@thi.ng/api/api"; +import { IDistance, IMix } from "@thi.ng/vectors/api"; + +export type SampleableVector = ICopy & IDistance & IMix; + +export interface IArea { + /** + * Computes and returns area. For types where orientation is taken + * into account, setting `signed` to false will always return the + * absolute area (default is `true`). + * + * @param unsigned + */ + area(signed?: boolean): number; +} + +export interface IArcLength { + /** + * Returns arc length, or for closed shapes, circumference. + */ + arcLength(): number; +} + +export interface IBounds { + bounds(): T; + /** + * Dimension along x-axis. + */ + width(): number; + /** + * Dimension along y-axis. + */ + height(): number; + /** + * Dimension along z-axis. + */ + depth(): number; +} + +export interface ICentroid { + /** + * Computes & returns centroid. If `c` is given it MUST be a zero + * vector and will be used to store result. + * + * @param c + */ + centroid(c?: T): T; +} + +export interface IEdges { + edges(): Iterable; +} + +export interface IToPolygon2 { + // FIXME return type should be interface + toPolygon2(opts?: any): any; +} + +export interface IVertices { + vertices(opts?: any): Iterable; +} diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index 5e13b1d559..12095ce77b 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -1,11 +1,28 @@ -import { IObjectOf } from "@thi.ng/api/api"; +import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; +import { IToPolygon2, IVertices, IBounds, ICentroid, IArcLength } from "@thi.ng/geom/src/api"; import { normRange } from "@thi.ng/transducers/iter/norm-range"; import { Vec } from "@thi.ng/vectors/api"; import { mix1, PI, TAU } from "@thi.ng/vectors/math"; import { setS2, toCartesian2, Vec2 } from "@thi.ng/vectors/vec2"; +import { circumCenter } from "./func/circumcenter"; import { Polygon2 } from "./poly2"; -export class Circle2 { +export class Circle2 implements + IArcLength, + IBounds, + ICentroid, + IToHiccup, + IToPolygon2, + IVertices { + + static from3Points(a: Readonly, b: Readonly, c: Readonly) { + const o = circumCenter(a, b, c); + if (o) { + return new Circle2(o, a.dist(o)); + } + } + + static DEFAULT_RES = 20; pos: Vec2; r: number; @@ -42,7 +59,7 @@ export class Circle2 { return dest; } - vertices(res = 20) { + vertices(res = Circle2.DEFAULT_RES) { return Vec2.mapBuffer(this.verticesRaw(0, TAU, res, false), res); } @@ -50,7 +67,7 @@ export class Circle2 { return PI * this.r * this.r; } - circumference() { + arcLength() { return TAU * this.r; } @@ -61,7 +78,23 @@ export class Circle2 { ]; } - toPolygon(res = 20) { + width() { + return this.r * 2; + } + + height() { + return this.width(); + } + + depth() { + return 0; + } + + centroid(c?: Vec2) { + return c ? c.set(this.pos) : this.pos; + } + + toPolygon2(res = Circle2.DEFAULT_RES) { return new Polygon2(this.vertices(res)); } diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts index 28d08a5e6f..2be49bc950 100644 --- a/packages/geom/src/container2.ts +++ b/packages/geom/src/container2.ts @@ -2,10 +2,13 @@ import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { Mat23 } from "@thi.ng/vectors/mat23"; import { Vec2, vec2 } from "@thi.ng/vectors/vec2"; -import { IBounds } from "./api"; +import { IBounds, ICentroid, IVertices } from "./api"; +import { bounds } from "./func/bounds"; export class PointContainer2 implements - IBounds { + IBounds, + ICentroid, + IVertices { points: Vec2[]; attribs: IObjectOf; @@ -24,15 +27,7 @@ export class PointContainer2 implements } bounds() { - const pts = this.points; - const min = Vec2.MAX.copy(); - const max = Vec2.MIN.copy(); - for (let i = pts.length; --i >= 0;) { - const p = pts[i]; - min.min(p); - max.max(p); - } - return [min, max]; + return bounds(this.points, Vec2.MAX.copy(), Vec2.MIN.copy()); } width() { diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts index 07552455cf..91ac2e2bcd 100644 --- a/packages/geom/src/container3.ts +++ b/packages/geom/src/container3.ts @@ -2,10 +2,13 @@ import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { Mat44 } from "@thi.ng/vectors/mat44"; import { Vec3, vec3 } from "@thi.ng/vectors/vec3"; -import { IBounds } from "./api"; +import { IBounds, ICentroid, IVertices } from "./api"; +import { bounds } from "./func/bounds"; export class PointContainer3 implements - IBounds { + IBounds, + ICentroid, + IVertices { points: Vec3[]; attribs: IObjectOf; @@ -24,15 +27,7 @@ export class PointContainer3 implements } bounds() { - const pts = this.points; - const min = Vec3.MAX.copy(); - const max = Vec3.MIN.copy(); - for (let i = pts.length; --i >= 0;) { - const p = pts[i]; - min.min(p); - max.max(p); - } - return [min, max]; + return bounds(this.points, Vec3.MAX.copy(), Vec3.MIN.copy()); } width() { diff --git a/packages/geom/src/func/arc-length.ts b/packages/geom/src/func/arc-length.ts new file mode 100644 index 0000000000..6329bc11d8 --- /dev/null +++ b/packages/geom/src/func/arc-length.ts @@ -0,0 +1,14 @@ +import { IDistance } from "@thi.ng/vectors/api"; + +export const arcLength = >(pts: Readonly[], closed = false) => { + const num = pts.length; + if (num < 2) return 0; + let i = pts[0]; + let j = pts[1]; + let res = 0; + for (let k = 1; k < num; k++ , i = j, j = pts[k]) { + res += i.dist(j); + } + closed && (res += i.dist(pts[0])); + return res; +}; diff --git a/packages/geom/src/func/bounds.ts b/packages/geom/src/func/bounds.ts new file mode 100644 index 0000000000..864cd4a09d --- /dev/null +++ b/packages/geom/src/func/bounds.ts @@ -0,0 +1,10 @@ +import { IMinMax } from "@thi.ng/vectors/api"; + +export const bounds = >(pts: T[], vmin: T, vmax: T) => { + for (let i = pts.length; --i >= 0;) { + const p = pts[i]; + vmin.min(p); + vmax.max(p); + } + return [vmin, vmax]; +}; diff --git a/packages/geom/src/func/circumcenter.ts b/packages/geom/src/func/circumcenter.ts new file mode 100644 index 0000000000..ec9de80983 --- /dev/null +++ b/packages/geom/src/func/circumcenter.ts @@ -0,0 +1,41 @@ +import { Vec2 } from "@thi.ng/vectors/vec2"; + +export const circumCenter = (a: Readonly, b: Readonly, c: Readonly) => { + let m1, m2, mx1, mx2, my1, my2, xc, yc; + const deltaAB = Math.abs(a.y - b.y), + deltaBC = Math.abs(b.y - c.y); + + if (deltaAB < 1e-6 && deltaBC < 1e-6) { + return null; + } + const ax = a.x, ay = a.y, + bx = b.x, by = b.y, + cx = c.x, cy = c.y; + if (deltaAB < 1e-6) { + m2 = - (cx - bx) / (cy - by); + mx2 = (bx + cx) / 2; + my2 = (by + cy) / 2; + xc = (bx + ax) / 2; + yc = m2 * (xc - mx2) + my2; + } else if (deltaBC < 1e-6) { + m1 = - (bx - ax) / (by - ay); + mx1 = (ax + bx) / 2; + my1 = (ay + by) / 2; + xc = (cx + bx) / 2; + yc = m1 * (xc - mx1) + my1; + } else { + m1 = - (bx - ax) / (by - ay); + m2 = - (cx - bx) / (cy - by); + mx1 = (ax + bx) / 2; + my1 = (ay + by) / 2; + mx2 = (bx + cx) / 2; + my2 = (by + cy) / 2; + xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2); + if (deltaAB > deltaBC) { + yc = m1 * (xc - mx1) + my1; + } else { + yc = m2 * (xc - mx2) + my2; + } + } + return new Vec2(xc, yc); +} diff --git a/packages/geom/src/func/edges.ts b/packages/geom/src/func/edges.ts new file mode 100644 index 0000000000..73e7815e02 --- /dev/null +++ b/packages/geom/src/func/edges.ts @@ -0,0 +1,6 @@ +import { wrap } from "@thi.ng/transducers/iter/wrap"; +import { partition } from "@thi.ng/transducers/xform/partition"; + +export const edges = (vertices: T[], closed = false) => { + return partition(2, 1, closed ? wrap(vertices, 1, false, true) : vertices); +}; diff --git a/packages/geom/src/common.ts b/packages/geom/src/func/sample-uniform.ts similarity index 50% rename from packages/geom/src/common.ts rename to packages/geom/src/func/sample-uniform.ts index 3c1c9737a2..61d760150c 100644 --- a/packages/geom/src/common.ts +++ b/packages/geom/src/func/sample-uniform.ts @@ -1,21 +1,5 @@ import { peek } from "@thi.ng/transducers/func/peek"; -import { wrap } from "@thi.ng/transducers/iter/wrap"; -import { partition } from "@thi.ng/transducers/xform/partition"; -import { IDistance } from "@thi.ng/vectors/api"; -import { SampleableVector } from "./api"; - -export const arcLength = >(pts: Readonly[], closed = false) => { - const num = pts.length; - if (num < 2) return 0; - let i = pts[0]; - let j = pts[1]; - let res = 0; - for (let k = 1; k < num; k++ , i = j, j = pts[k]) { - res += i.dist(j); - } - closed && (res += i.dist(pts[0])); - return res; -} +import { SampleableVector } from "../api"; /** * Re-samples given polyline at given uniform distance. Returns array of @@ -39,8 +23,3 @@ export const sampleUniform = >(pts: T[], step: num res.push(peek(pts)); return res; }; - - -export function edges(vertices: T[], closed = false) { - return partition(2, 1, closed ? wrap(vertices, 1, false, true) : vertices); -} diff --git a/packages/geom/src/poly2.ts b/packages/geom/src/poly2.ts index 579a57c262..749c713979 100644 --- a/packages/geom/src/poly2.ts +++ b/packages/geom/src/poly2.ts @@ -1,12 +1,15 @@ -import { IObjectOf } from "@thi.ng/api/api"; +import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; -import { IArcLength, IArea } from "./api"; -import { arcLength, edges } from "./common"; +import { IArcLength, IArea, IEdges } from "./api"; import { PointContainer2 } from "./container2"; +import { arcLength } from "./func/arc-length"; +import { edges } from "./func/edges"; export class Polygon2 extends PointContainer2 implements IArcLength, - IArea { + IArea, + IEdges, + IToHiccup { constructor(points: Vec2[], attribs?: IObjectOf) { super(points, attribs); diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts index 6c702f4894..fd2eab5b9e 100644 --- a/packages/geom/src/polyline2.ts +++ b/packages/geom/src/polyline2.ts @@ -1,9 +1,16 @@ -import { IObjectOf } from "@thi.ng/api/api"; +import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; -import { arcLength, edges, sampleUniform } from "./common"; +import { IArcLength, IArea, IEdges } from "./api"; import { PointContainer2 } from "./container2"; - -export class Polyline2 extends PointContainer2 { +import { arcLength } from "./func/arc-length"; +import { edges } from "./func/edges"; +import { sampleUniform } from "./func/sample-uniform"; + +export class Polyline2 extends PointContainer2 implements + IArcLength, + IArea, + IEdges, + IToHiccup { constructor(points: Vec2[], attribs?: IObjectOf) { super(points, attribs); From 6a0f8aa9ffc6a4dbe6cb6d47745c7a82fe10bd18 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 29 Sep 2018 21:51:34 +0100 Subject: [PATCH 41/77] feat(vectors): add comparators & ICompare impls for vec2/3/4 --- packages/vectors/src/api.ts | 4 ++++ packages/vectors/src/vec2.ts | 28 +++++++++++++++++++++++++++ packages/vectors/src/vec3.ts | 34 ++++++++++++++++++++++++++++++++- packages/vectors/src/vec4.ts | 37 ++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 1 deletion(-) diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index ee6b106df0..73985762bb 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -70,6 +70,10 @@ export type ReadonlyVecOp1 = (v: ReadonlyVec, i?: number, s?: number) => T; */ export type ReadonlyVecOp2 = (a: ReadonlyVec, b: ReadonlyVec, ia?: number, ib?: number, sa?: number, sb?: number) => T; +export type Vec2Coord = 0 | 1; +export type Vec3Coord = 0 | 1 | 2; +export type Vec4Coord = 0 | 1 | 2 | 3; + export interface IVec { buf: Vec; length: number; diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index 0824240df8..649683f0be 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -1,4 +1,5 @@ import { + ICompare, ICopy, IEqualsDelta, IEquiv, @@ -22,6 +23,7 @@ import { ONE4, ReadonlyVec, Vec, + Vec2Coord, ZERO4 } from "./api"; import { declareIndices, defcommon } from "./codegen"; @@ -90,6 +92,23 @@ export const eqDelta2 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia], b[ib], eps) && eqDelta1(a[ia + sa], b[ib + sb], eps); +export const compare2 = ( + a: ReadonlyVec, + b: ReadonlyVec, + o1: Vec2Coord, o2: Vec2Coord, + ia = 0, ib = 0, sa = 1, sb = 1): number => { + + const ax = a[ia + o1 * sa]; + const ay = a[ia + o2 * sa]; + const bx = b[ib + o1 * sb]; + const by = b[ib + o2 * sb]; + return ax === bx ? + ay === by ? + 0 : + ay < by ? -2 : 2 : + ax < bx ? -1 : 1; +}; + export const [ set2, setN2, add2, sub2, mul2, div2, @@ -261,6 +280,7 @@ export const vec2 = (x = 0, y = 0) => export class Vec2 implements IAngleBetween, ICopy, + ICompare, ICrossProduct, IDistance, IDotProduct, @@ -385,6 +405,10 @@ export class Vec2 implements return out; } + static comparator(o1: Vec2Coord, o2: Vec2Coord) { + return (a: Readonly, b: Readonly) => a.compare(b, o1, o2); + } + static readonly ZERO = Object.freeze(new Vec2(ZERO4)); static readonly ONE = Object.freeze(new Vec2(ONE4)); static readonly MIN = Object.freeze(new Vec2(MIN4)); @@ -431,6 +455,10 @@ export class Vec2 implements return eqDelta2(this.buf, v.buf, eps, this.i, v.i, this.s, v.s); } + compare(v: Readonly, o1: Vec2Coord = 0, o2: Vec2Coord = 1) { + return compare2(this.buf, v.buf, o1, o2, this.i, v.i, this.s, v.s); + } + set(v: Readonly) { set2(this.buf, v.buf, this.i, v.i, this.s, v.s); return this; diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 5db140ef3d..fea0c18629 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -1,4 +1,5 @@ import { + ICompare, ICopy, IEqualsDelta, IEquiv, @@ -22,7 +23,8 @@ import { ONE4, ReadonlyVec, Vec, - ZERO4 + ZERO4, + Vec3Coord } from "./api"; import { declareIndices, defcommon } from "./codegen"; import { $iter } from "./common"; @@ -104,6 +106,27 @@ export const eqDelta3 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + sa], b[ib + sb], eps) && eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps); +export const compare3 = ( + a: ReadonlyVec, + b: ReadonlyVec, + o1: Vec3Coord, o2: Vec3Coord, o3: Vec3Coord, + ia = 0, ib = 0, sa = 1, sb = 1): number => { + + const ax = a[ia + o1 * sa]; + const ay = a[ia + o2 * sa]; + const az = a[ia + o3 * sa]; + const bx = b[ib + o1 * sb]; + const by = b[ib + o2 * sb]; + const bz = b[ib + o3 * sb]; + return ax === bx ? + ay === by ? + az === bz ? + 0 : + az < bz ? -3 : 3 : + ay < by ? -2 : 2 : + ax < bx ? -1 : 1; +}; + export const [ set3, setN3, add3, sub3, mul3, div3, @@ -320,6 +343,7 @@ export const vec3 = (x = 0, y = 0, z = 0) => export class Vec3 implements IAngleBetween, ICopy, + ICompare, ICrossProduct, IDistance, IDotProduct, @@ -448,6 +472,10 @@ export class Vec3 implements return out; } + static comparator(o1: Vec3Coord, o2: Vec3Coord, o3: Vec3Coord) { + return (a: Readonly, b: Readonly) => a.compare(b, o1, o2, o3); + } + static readonly ZERO = Object.freeze(new Vec3(ZERO4)); static readonly ONE = Object.freeze(new Vec3(ONE4)); static readonly MIN = Object.freeze(new Vec3(MIN4)); @@ -495,6 +523,10 @@ export class Vec3 implements return eqDelta3(this.buf, v.buf, eps, this.i, v.i, this.s, v.s); } + compare(v: Readonly, o1: Vec3Coord = 0, o2: Vec3Coord = 1, o3: Vec3Coord = 2) { + return compare3(this.buf, v.buf, o1, o2, o3, this.i, v.i, this.s, v.s); + } + set(v: Readonly) { set3(this.buf, v.buf, this.i, v.i, this.s, v.s); return this; diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index 435a8500da..7e507d944d 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -1,4 +1,5 @@ import { + ICompare, ICopy, IEqualsDelta, IEquiv, @@ -19,6 +20,7 @@ import { ONE4, ReadonlyVec, Vec, + Vec4Coord, ZERO4 } from "./api"; import { declareIndices, defcommon } from "./codegen"; @@ -106,6 +108,31 @@ export const eqDelta4 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps) && eqDelta1(a[ia + 3 * sa], b[ib + 3 * sb], eps); +export const compare4 = ( + a: ReadonlyVec, + b: ReadonlyVec, + o1: Vec4Coord, o2: Vec4Coord, o3: Vec4Coord, o4: Vec4Coord, + ia = 0, ib = 0, sa = 1, sb = 1): number => { + + const ax = a[ia + o1 * sa]; + const ay = a[ia + o2 * sa]; + const az = a[ia + o3 * sa]; + const aw = b[ia + o4 * sa]; + const bx = b[ib + o1 * sb]; + const by = b[ib + o2 * sb]; + const bz = b[ib + o3 * sb]; + const bw = b[ib + o4 * sb]; + return ax === bx ? + ay === by ? + az === bz ? + aw === bw ? + 0 : + aw < bw ? -4 : 4 : + az < bz ? -3 : 3 : + ay < by ? -2 : 2 : + ax < bx ? -1 : 1; +}; + export const [ set4, setN4, add4, sub4, mul4, div4, @@ -233,6 +260,7 @@ export const vec4 = (x = 0, y = 0, z = 0, w = 0) => export class Vec4 implements ICopy, + ICompare, IDistance, IDotProduct, IEqualsDelta, @@ -355,6 +383,10 @@ export class Vec4 implements return out; } + static comparator(o1: Vec4Coord, o2: Vec4Coord, o3: Vec4Coord, o4: Vec4Coord) { + return (a: Readonly, b: Readonly) => a.compare(b, o1, o2, o3, o4); + } + static readonly ZERO = Object.freeze(new Vec4(ZERO4)); static readonly ONE = Object.freeze(new Vec4(ONE4)); static readonly MIN = Object.freeze(new Vec4(MIN4)); @@ -403,6 +435,11 @@ export class Vec4 implements return eqDelta4(this.buf, v.buf, eps, this.i, v.i, this.s, v.s); } + compare(v: Readonly, o1: Vec4Coord = 0, o2: Vec4Coord = 1, o3: Vec4Coord = 2, o4: Vec4Coord = 3) { + return compare4(this.buf, v.buf, o1, o2, o3, o4, this.i, v.i, this.s, v.s); + } + + set(v: Readonly) { set4(this.buf, v.buf, this.i, v.i, this.s, v.s); return this; From 473ec8000146ea1503f89c01661ae09311c8c63f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 05:13:33 +0100 Subject: [PATCH 42/77] feat(vectors): add axis consts, add/update ops - add angleRatio2/3(), update angleBetween2/3() - add static X_AXIS, Y_AXIS, etc. consts - add static madd/maddN(), msub/msubN() methods - add static swizzle() methods - update GVec/Vec2/3/4.mixN() to use n=0.5 as default --- packages/vectors/src/api.ts | 5 ++++ packages/vectors/src/gvec.ts | 2 +- packages/vectors/src/vec2.ts | 44 ++++++++++++++++++++++++++++--- packages/vectors/src/vec3.ts | 50 +++++++++++++++++++++++++++++++----- packages/vectors/src/vec4.ts | 43 ++++++++++++++++++++++++++++--- 5 files changed, 129 insertions(+), 15 deletions(-) diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 73985762bb..5c97039504 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -158,3 +158,8 @@ export const MIN4 = Object.freeze([min, min, min, min]); export const MAX4 = Object.freeze([max, max, max, max]); export const ONE4 = Object.freeze([1, 1, 1, 1]); export const ZERO4 = Object.freeze([0, 0, 0, 0]); +export const X4 = Object.freeze([1, 0, 0, 0]); +export const Y4 = Object.freeze([0, 1, 0, 0]); +export const Z4 = Object.freeze([0, 0, 1, 0]); +export const W4 = Object.freeze([0, 0, 0, 1]); + diff --git a/packages/vectors/src/gvec.ts b/packages/vectors/src/gvec.ts index aa6d30b949..db9109c09c 100644 --- a/packages/vectors/src/gvec.ts +++ b/packages/vectors/src/gvec.ts @@ -400,7 +400,7 @@ export class GVec implements return this; } - mixN(v: Readonly, n: number) { + mixN(v: Readonly, n = 0.5) { this.ensureSize(v); mixN(this.buf, v.buf, n, this.n, this.i, v.i, this.s, v.s); return this; diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index 649683f0be..2ea4684217 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -24,6 +24,8 @@ import { ReadonlyVec, Vec, Vec2Coord, + X4, + Y4, ZERO4 } from "./api"; import { declareIndices, defcommon } from "./codegen"; @@ -243,9 +245,13 @@ export const rotateAroundPoint2 = (a: Vec, b: Vec, theta: number, ia = 0, ib = 0 export const heading2 = (a: ReadonlyVec, ia = 0, sa = 1) => atan2Abs1(a[ia + sa], a[ia]); +export const angleRatio2 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => + dot2(a, b, ia, ib, sa, sb) / (mag2(a, ia, sa) * mag2(b, ib, sb)); + export const angleBetween2 = (a: ReadonlyVec, b: ReadonlyVec, normalize = false, ia = 0, ib = 0, sa = 1, sb = 1): number => normalize ? - angleBetween2(normalize2(get2(a, ia, sa)), normalize2(get2(b, ib, sb))) : + (a[ia] * b[ib + sb] < a[ia + sa] * b[ib] ? -1 : 1) * + Math.acos(angleRatio2(a, b, ia, ib, sa, sb)) : Math.acos(dot2(a, b, ia, ib, sa, sb)); export const bisect2 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => { @@ -327,6 +333,10 @@ export class Vec2 implements return buf; } + static swizzle(v: IVec, x: number, y: number) { + return new Vec2([]).swizzle(v, x, y); + } + static mixBilinear(a: Readonly, b: Readonly, c: Readonly, d: Readonly, u: number, v: number) { return new Vec2( mixBilinear2( @@ -393,15 +403,39 @@ export class Vec2 implements return out; } + static madd(a: Readonly, b: Readonly, c: Readonly, out?: Vec2) { + out = out ? out.set(a) : a.copy(); + madd2(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + static maddN(a: Readonly, b: Readonly, n: number, out?: Vec2) { + out = out ? out.set(a) : a.copy(); + maddN2(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + static msub(a: Readonly, b: Readonly, c: Readonly, out?: Vec2) { + out = out ? out.set(a) : a.copy(); + msub2(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + static msubN(a: Readonly, b: Readonly, n: number, out?: Vec2) { + out = out ? out.set(a) : a.copy(); + msubN2(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + static mix(a: Readonly, b: Readonly, t: Readonly, out?: Vec2) { !out && (out = new Vec2([])); mix2o(out.buf, a.buf, b.buf, t.buf, out.i, a.i, b.i, t.i, out.s, a.s, b.s, t.s); return out; } - static mixN(a: Readonly, b: Readonly, t: number, out?: Vec2) { + static mixN(a: Readonly, b: Readonly, n = 0.5, out?: Vec2) { !out && (out = new Vec2([])); - mixN2o(out.buf, a.buf, b.buf, t, out.i, a.i, b.i, out.s, a.s, b.s); + mixN2o(out.buf, a.buf, b.buf, n, out.i, a.i, b.i, out.s, a.s, b.s); return out; } @@ -413,6 +447,8 @@ export class Vec2 implements static readonly ONE = Object.freeze(new Vec2(ONE4)); static readonly MIN = Object.freeze(new Vec2(MIN4)); static readonly MAX = Object.freeze(new Vec2(MAX4)); + static readonly X_AXIS = Object.freeze(new Vec2(X4)); + static readonly Y_AXIS = Object.freeze(new Vec2(Y4)); buf: Vec; i: number; @@ -609,7 +645,7 @@ export class Vec2 implements return this; } - mixN(b: Readonly, n: number) { + mixN(b: Readonly, n = 0.5) { mixN2(this.buf, b.buf, n, this.i, b.i, this.s, b.s); return this; } diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index fea0c18629..7481e75579 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -23,8 +23,11 @@ import { ONE4, ReadonlyVec, Vec, - ZERO4, - Vec3Coord + Vec3Coord, + X4, + Y4, + Z4, + ZERO4 } from "./api"; import { declareIndices, defcommon } from "./codegen"; import { $iter } from "./common"; @@ -297,9 +300,13 @@ export const headingXZ3 = (a: ReadonlyVec, ia = 0, sa = 1) => export const headingYZ3 = (a: ReadonlyVec, ia = 0, sa = 1) => atan2Abs1(a[ia + 2 * sa], a[ia + sa]); +export const angleRatio3 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => + dot3(a, b, ia, ib, sa, sb) / (mag3(a, ia, sa) * mag3(b, ib, sb)); + export const angleBetween3 = (a: ReadonlyVec, b: ReadonlyVec, normalize = false, ia = 0, ib = 0, sa = 1, sb = 1): number => normalize ? - angleBetween3(normalize3(get3(a, ia, sa)), normalize3(get3(b, ib, sb))) : + (a[ia] * b[ib + sb] < a[ia + sa] * b[ib] ? -1 : 1) * + Math.acos(angleRatio3(a, b, ia, ib, sa, sb)) : Math.acos(dot3(a, b, ia, ib, sa, sb)); export const toPolar3 = (a: Vec, ia = 0, sa = 1) => { @@ -390,6 +397,10 @@ export class Vec3 implements return buf; } + static swizzle(v: IVec, x: number, y: number, z: number) { + return new Vec3([]).swizzle(v, x, y, z); + } + static mixBilinear(a: Readonly, b: Readonly, c: Readonly, d: Readonly, u: number, v: number) { return new Vec3( mixBilinear3( @@ -460,15 +471,39 @@ export class Vec3 implements return out; } + static madd(a: Readonly, b: Readonly, c: Readonly, out?: Vec3) { + out = out ? out.set(a) : a.copy(); + madd3(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + static maddN(a: Readonly, b: Readonly, n: number, out?: Vec3) { + out = out ? out.set(a) : a.copy(); + maddN3(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + static msub(a: Readonly, b: Readonly, c: Readonly, out?: Vec3) { + out = out ? out.set(a) : a.copy(); + msub3(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + static msubN(a: Readonly, b: Readonly, n: number, out?: Vec3) { + out = out ? out.set(a) : a.copy(); + msubN3(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + static mix(a: Readonly, b: Readonly, t: Readonly, out?: Vec3) { !out && (out = new Vec3([])); mix3o(out.buf, a.buf, b.buf, t.buf, out.i, a.i, b.i, t.i, out.s, a.s, b.s, t.s); return out; } - static mixN(a: Readonly, b: Readonly, t: number, out?: Vec3) { + static mixN(a: Readonly, b: Readonly, n = 0.5, out?: Vec3) { !out && (out = new Vec3([])); - mixN3o(out.buf, a.buf, b.buf, t, out.i, a.i, b.i, out.s, a.s, b.s); + mixN3o(out.buf, a.buf, b.buf, n, out.i, a.i, b.i, out.s, a.s, b.s); return out; } @@ -480,6 +515,9 @@ export class Vec3 implements static readonly ONE = Object.freeze(new Vec3(ONE4)); static readonly MIN = Object.freeze(new Vec3(MIN4)); static readonly MAX = Object.freeze(new Vec3(MAX4)); + static readonly X_AXIS = Object.freeze(new Vec3(X4)); + static readonly Y_AXIS = Object.freeze(new Vec3(Y4)); + static readonly Z_AXIS = Object.freeze(new Vec3(Z4)); buf: Vec; i: number; @@ -677,7 +715,7 @@ export class Vec3 implements return this; } - mixN(b: Readonly, n: number) { + mixN(b: Readonly, n = 0.5) { mixN3(this.buf, b.buf, n, this.i, b.i, this.s, b.s); return this; } diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index 7e507d944d..a8caeaa783 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -21,6 +21,10 @@ import { ReadonlyVec, Vec, Vec4Coord, + W4, + X4, + Y4, + Z4, ZERO4 } from "./api"; import { declareIndices, defcommon } from "./codegen"; @@ -305,6 +309,10 @@ export class Vec4 implements return buf; } + static swizzle(v: IVec, x: number, y: number, z: number, w: number) { + return new Vec4([]).swizzle(v, x, y, z, w); + } + static mixBilinear(a: Readonly, b: Readonly, c: Readonly, d: Readonly, u: number, v: number) { return new Vec4( mixBilinear4( @@ -371,15 +379,39 @@ export class Vec4 implements return out; } + static madd(a: Readonly, b: Readonly, c: Readonly, out?: Vec4) { + out = out ? out.set(a) : a.copy(); + madd4(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + static maddN(a: Readonly, b: Readonly, n: number, out?: Vec4) { + out = out ? out.set(a) : a.copy(); + maddN4(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + static msub(a: Readonly, b: Readonly, c: Readonly, out?: Vec4) { + out = out ? out.set(a) : a.copy(); + msub4(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + static msubN(a: Readonly, b: Readonly, n: number, out?: Vec4) { + out = out ? out.set(a) : a.copy(); + msubN4(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + static mix(a: Readonly, b: Readonly, t: Readonly, out?: Vec4) { !out && (out = new Vec4([])); mix4o(out.buf, a.buf, b.buf, t.buf, out.i, a.i, b.i, t.i, out.s, a.s, b.s, t.s); return out; } - static mixN(a: Readonly, b: Readonly, t: number, out?: Vec4) { + static mixN(a: Readonly, b: Readonly, n = 0.5, out?: Vec4) { !out && (out = new Vec4([])); - mixN4o(out.buf, a.buf, b.buf, t, out.i, a.i, b.i, out.s, a.s, b.s); + mixN4o(out.buf, a.buf, b.buf, n, out.i, a.i, b.i, out.s, a.s, b.s); return out; } @@ -391,7 +423,10 @@ export class Vec4 implements static readonly ONE = Object.freeze(new Vec4(ONE4)); static readonly MIN = Object.freeze(new Vec4(MIN4)); static readonly MAX = Object.freeze(new Vec4(MAX4)); - + static readonly X_AXIS = Object.freeze(new Vec4(X4)); + static readonly Y_AXIS = Object.freeze(new Vec4(Y4)); + static readonly Z_AXIS = Object.freeze(new Vec4(Z4)); + static readonly W_AXIS = Object.freeze(new Vec4(W4)); buf: Vec; i: number; s: number; @@ -590,7 +625,7 @@ export class Vec4 implements return this; } - mixN(b: Readonly, n: number) { + mixN(b: Readonly, n = 0.5) { mixN4(this.buf, b.buf, n, this.i, b.i, this.s, b.s); return this; } From 2ba99311d1d865fe47a3666d841b1739a61ba47d Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 05:14:10 +0100 Subject: [PATCH 43/77] build(geom): update dev deps & yarn.lock --- packages/geom/package.json | 2 +- yarn.lock | 1635 +++++++++++++++++++----------------- 2 files changed, 880 insertions(+), 757 deletions(-) diff --git a/packages/geom/package.json b/packages/geom/package.json index e0f95663b7..b41acec59a 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -24,7 +24,7 @@ "@types/node": "^10.5.5", "mocha": "^5.2.0", "nyc": "^12.0.2", - "typedoc": "^0.11.1", + "typedoc": "^0.12.0", "typescript": "^3.0.1" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index 236c180185..066ff2d670 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,6 +8,31 @@ dependencies: "@babel/highlight" "7.0.0-beta.51" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.2.tgz#f8d2a9ceb6832887329a7b60f9d035791400ba4e" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.2" + "@babel/helpers" "^7.1.2" + "@babel/parser" "^7.1.2" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.1.2" + convert-source-map "^1.1.0" + debug "^3.1.0" + json5 "^0.5.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.51.tgz#6c7575ffde761d07485e04baedc0392c6d9e30f6" @@ -18,6 +43,59 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.0.0", "@babel/generator@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.2.tgz#fde75c072575ce7abbd97322e8fef5bae67e4630" + dependencies: + "@babel/types" "^7.1.2" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" + dependencies: + "@babel/types" "^7.0.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-function-name@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz#21b4874a227cf99ecafcc30a90302da5a2640561" @@ -26,18 +104,126 @@ "@babel/template" "7.0.0-beta.51" "@babel/types" "7.0.0-beta.51" +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz#3281b2d045af95c172ce91b20825d85ea4676411" dependencies: "@babel/types" "7.0.0-beta.51" +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-split-export-declaration@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz#8a6c3f66c4d265352fc077484f9f6e80a51ab978" dependencies: "@babel/types" "7.0.0-beta.51" +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.2.tgz#ab752e8c35ef7d39987df4e8586c63b8846234b5" + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.1.2" + "@babel/highlight@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.51.tgz#e8844ae25a1595ccfd42b89623b4376ca06d225d" @@ -46,10 +232,350 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@babel/parser@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.51.tgz#27cec2df409df60af58270ed8f6aa55409ea86f6" +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.2.tgz#85c5c47af6d244fab77bce6b9bd830e38c978409" + +"@babel/plugin-proposal-async-generator-functions@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + +"@babel/plugin-proposal-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0.tgz#70638aeaad9ee426bc532e51523cff8ff02f6f17" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.2.tgz#5fa77d473f5a0a3f5266ad7ce2e8c995a164d60a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0.tgz#c40ced34c2783985d90d9f9ac77a13e6fb396a01" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" + dependencies: + "@babel/helper-builder-react-jsx" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.1.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.1.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.1.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-duplicate-keys" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.1.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.1.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.1.0" + "@babel/plugin-transform-modules-commonjs" "^7.1.0" + "@babel/plugin-transform-modules-systemjs" "^7.0.0" + "@babel/plugin-transform-modules-umd" "^7.1.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.1.0" + "@babel/plugin-transform-parameters" "^7.1.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typeof-symbol" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + browserslist "^4.1.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/runtime@^7.0.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" + dependencies: + regenerator-runtime "^0.12.0" + "@babel/template@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.51.tgz#9602a40aebcf357ae9677e2532ef5fc810f5fbff" @@ -59,6 +585,14 @@ "@babel/types" "7.0.0-beta.51" lodash "^4.17.5" +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + "@babel/traverse@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.51.tgz#981daf2cec347a6231d3aa1d9e1803b03aaaa4a8" @@ -74,6 +608,20 @@ invariant "^2.2.0" lodash "^4.17.5" +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + debug "^3.1.0" + globals "^11.1.0" + lodash "^4.17.10" + "@babel/types@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.51.tgz#d802b7b543b5836c778aa691797abf00f3d97ea9" @@ -82,6 +630,14 @@ lodash "^4.17.5" to-fast-properties "^2.0.0" +"@babel/types@^7.0.0", "@babel/types@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.2.tgz#183e7952cf6691628afdc2e2b90d03240bac80c0" + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + "@lerna/add@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.3.2.tgz#767a879ecb117be06414e7e76d4d93bb9934fa57" @@ -622,8 +1178,8 @@ "@types/node" "*" "@types/glob@*": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.0.tgz#55ff6b216e9100b22eccec2cfe2e251ccb09a6ab" + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" dependencies: "@types/events" "*" "@types/minimatch" "*" @@ -654,8 +1210,8 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" "@types/node@*", "@types/node@^10.5.5": - version "10.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.10.3.tgz#09c75a4ad84d6a3d286790bdd9489a4f8ee9906c" + version "10.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.11.3.tgz#c055536ac8a5e871701aa01914be5731539d01ee" "@types/semver@^5.4.0": version "5.5.0" @@ -903,7 +1459,7 @@ aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -911,464 +1467,14 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.25.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.25.0, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.0: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.11.6, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.15.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.15.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -1385,10 +1491,6 @@ babylon-walk@^1.0.2: babel-types "^6.15.0" lodash.clone "^4.5.0" -babylon@^6.17.4, babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -1559,14 +1661,7 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -browserslist@^4.0.0: +browserslist@^4.0.0, browserslist@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" dependencies: @@ -1701,12 +1796,12 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000886" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000886.tgz#a0b962dbaccb6d2fc795541bb9ec524582bf433b" + version "1.0.30000888" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000888.tgz#38081675206f8856b648c1cd793a28a2c5762448" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000884: - version "1.0.30000886" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000886.tgz#2127186c4f57da10d3ba26fc3e87dce4a5ddd3ae" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000884: + version "1.0.30000888" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000888.tgz#22edb50d91dd70612b5898e3b36f460600c6492f" caseless@~0.12.0: version "0.12.0" @@ -2065,7 +2160,7 @@ conventional-recommended-bump@^2.0.6: meow "^4.0.0" q "^1.5.1" -convert-source-map@^1.5.1: +convert-source-map@^1.1.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" dependencies: @@ -2086,7 +2181,7 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" @@ -2175,11 +2270,11 @@ css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" -css-declaration-sorter@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-3.0.1.tgz#d0e3056b0fd88dc1ea9dceff435adbe9c702a7f8" +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" dependencies: - postcss "^6.0.0" + postcss "^7.0.1" timsort "^0.3.0" css-select-base-adapter@~0.1.0: @@ -2221,40 +2316,40 @@ css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" -cssnano-preset-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.0.tgz#c334287b4f7d49fb2d170a92f9214655788e3b6b" - dependencies: - css-declaration-sorter "^3.0.0" - cssnano-util-raw-cache "^4.0.0" - postcss "^6.0.0" - postcss-calc "^6.0.0" - postcss-colormin "^4.0.0" - postcss-convert-values "^4.0.0" - postcss-discard-comments "^4.0.0" - postcss-discard-duplicates "^4.0.0" - postcss-discard-empty "^4.0.0" - postcss-discard-overridden "^4.0.0" - postcss-merge-longhand "^4.0.0" - postcss-merge-rules "^4.0.0" - postcss-minify-font-values "^4.0.0" - postcss-minify-gradients "^4.0.0" - postcss-minify-params "^4.0.0" - postcss-minify-selectors "^4.0.0" - postcss-normalize-charset "^4.0.0" - postcss-normalize-display-values "^4.0.0" - postcss-normalize-positions "^4.0.0" - postcss-normalize-repeat-style "^4.0.0" - postcss-normalize-string "^4.0.0" - postcss-normalize-timing-functions "^4.0.0" - postcss-normalize-unicode "^4.0.0" - postcss-normalize-url "^4.0.0" - postcss-normalize-whitespace "^4.0.0" - postcss-ordered-values "^4.0.0" - postcss-reduce-initial "^4.0.0" - postcss-reduce-transforms "^4.0.0" - postcss-svgo "^4.0.0" - postcss-unique-selectors "^4.0.0" +cssnano-preset-default@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.2.tgz#1de3f27e73b7f0fbf87c1d7fd7a63ae980ac3774" + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^6.0.2" + postcss-colormin "^4.0.2" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.1" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.6" + postcss-merge-rules "^4.0.2" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.1" + postcss-minify-params "^4.0.1" + postcss-minify-selectors "^4.0.1" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.1" + postcss-normalize-positions "^4.0.1" + postcss-normalize-repeat-style "^4.0.1" + postcss-normalize-string "^4.0.1" + postcss-normalize-timing-functions "^4.0.1" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.1" + postcss-ordered-values "^4.1.1" + postcss-reduce-initial "^4.0.2" + postcss-reduce-transforms "^4.0.1" + postcss-svgo "^4.0.1" + postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: version "4.0.0" @@ -2264,19 +2359,19 @@ cssnano-util-get-match@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" -cssnano-util-raw-cache@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.0.tgz#be0a2856e25f185f5f7a2bcc0624e28b7f179a9f" +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" cssnano-util-same-parent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.0.tgz#d2a3de1039aa98bc4ec25001fa050330c2a16dac" + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" cssnano@^3.4.0: version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + resolved "http://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" dependencies: autoprefixer "^6.3.1" decamelize "^1.1.2" @@ -2312,13 +2407,13 @@ cssnano@^3.4.0: postcss-zindex "^2.0.1" cssnano@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.0.tgz#682c37b84b9b7df616450a5a8dc9269b9bd10734" + version "4.1.4" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.4.tgz#55b71e3d8f5451dd3edc7955673415c98795788f" dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.0" + cssnano-preset-default "^4.0.2" is-resolvable "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" csso@^3.5.0: version "3.5.1" @@ -2374,7 +2469,7 @@ debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -2493,12 +2588,6 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" @@ -2577,6 +2666,10 @@ dot-prop@^4.1.1, dot-prop@^4.2.0: dependencies: is-obj "^1.0.0" +dotenv-expand@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" + dotenv@^5.0.0: version "5.0.1" resolved "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" @@ -2622,9 +2715,9 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.62: - version "1.3.70" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.70.tgz#ded377256d92d81b4257d36c65aa890274afcfd2" +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.62: + version "1.3.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.72.tgz#b69683081d5b7eee6e1ea07b2f5fa30b3c72252d" elliptic@^6.0.0: version "6.4.1" @@ -2679,12 +2772,12 @@ es-abstract@^1.5.1, es-abstract@^1.6.1: is-regex "^1.0.4" es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" es6-promise@^4.0.3: version "4.2.5" @@ -2742,7 +2835,7 @@ estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2752,7 +2845,7 @@ etag@~1.8.1: events@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -3073,9 +3166,9 @@ fstream@^1.0.0, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -fswatcher-child@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fswatcher-child/-/fswatcher-child-1.1.0.tgz#af1650590f897532431731247fd6270f333912ff" +fswatcher-child@^1.0.5: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fswatcher-child/-/fswatcher-child-1.1.1.tgz#264dd95f9c4b5f8615327d7d7567884591846b9b" dependencies: chokidar "^2.0.3" @@ -3222,10 +3315,6 @@ globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - globby@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" @@ -3363,13 +3452,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -3618,7 +3700,7 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: +is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -3809,7 +3891,7 @@ is-svg@^3.0.0: dependencies: html-comment-regex "^1.1.0" -is-symbol@^1.0.1: +is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" dependencies: @@ -3931,11 +4013,15 @@ js-beautify@^1.7.5: mkdirp "~0.5.0" nopt "~4.0.1" +js-levenshtein@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" + js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3957,10 +4043,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -3985,13 +4067,13 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json5@^0.5.1: +json5@^0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" json5@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + resolved "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" dependencies: minimist "^1.2.0" @@ -4516,8 +4598,8 @@ mute-stream@0.0.7, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.0.7, nan@^2.9.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" nanomatch@^1.2.9: version "1.2.13" @@ -4536,8 +4618,8 @@ nanomatch@^1.2.9: to-regex "^3.0.1" needle@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -4620,8 +4702,8 @@ node-pre-gyp@^0.10.0: tar "^4" node-releases@^1.0.0-alpha.11: - version "1.0.0-alpha.11" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" + version "1.0.0-alpha.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.12.tgz#32e461b879ea76ac674e511d9832cf29da345268" dependencies: semver "^5.3.0" @@ -4918,7 +5000,7 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4939,7 +5021,7 @@ p-finally@^1.0.0: p-is-promise@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" p-limit@^1.1.0: version "1.3.0" @@ -5046,22 +5128,24 @@ parallel-transform@^1.1.0: readable-stream "^2.1.5" parcel-bundler@^1.9.7: - version "1.9.7" - resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.9.7.tgz#5cd00850dea0254d377005d55ab4bf60429ba2bc" - dependencies: + version "1.10.1" + resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.10.1.tgz#a37a040e79d4bbd2901e487097eee72a8ab8868a" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/preset-env" "^7.0.0" + "@babel/runtime" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" ansi-to-html "^0.6.4" - babel-code-frame "^6.26.0" - babel-core "^6.25.0" - babel-generator "^6.25.0" - babel-plugin-transform-es2015-modules-commonjs "^6.26.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-preset-env "^1.7.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.17.4" babylon-walk "^1.0.2" - browserslist "^3.2.6" + browserslist "^4.1.0" chalk "^2.1.0" clone "^2.1.1" command-exists "^1.2.6" @@ -5070,9 +5154,10 @@ parcel-bundler@^1.9.7: cssnano "^4.0.0" deasync "^0.1.13" dotenv "^5.0.0" + dotenv-expand "^4.2.0" fast-glob "^2.2.2" filesize "^3.6.0" - fswatcher-child "^1.0.3" + fswatcher-child "^1.0.5" get-port "^3.2.0" grapheme-breaker "^0.3.2" htmlnano "^0.1.9" @@ -5166,7 +5251,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5193,8 +5278,8 @@ path-type@^3.0.0: pify "^3.0.0" pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5254,18 +5339,18 @@ posix-character-classes@^0.1.0: postcss-calc@^5.2.0: version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + resolved "http://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" dependencies: postcss "^5.0.2" postcss-message-helpers "^2.0.0" reduce-css-calc "^1.2.6" -postcss-calc@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.1.tgz#3d24171bbf6e7629d422a436ebfe6dd9511f4330" +postcss-calc@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.2.tgz#4d9a43e27dbbf27d095fecb021ac6896e2318337" dependencies: css-unit-converter "^1.1.1" - postcss "^6.0.0" + postcss "^7.0.2" postcss-selector-parser "^2.2.2" reduce-css-calc "^2.0.0" @@ -5277,14 +5362,14 @@ postcss-colormin@^2.1.8: postcss "^5.0.13" postcss-value-parser "^3.2.3" -postcss-colormin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.1.tgz#6f1c18a0155bc69613f2ff13843e2e4ae8ff0bbe" +postcss-colormin@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.2.tgz#93cd1fa11280008696887db1a528048b18e7ed99" dependencies: browserslist "^4.0.0" color "^3.0.0" has "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-convert-values@^2.3.4: @@ -5294,24 +5379,24 @@ postcss-convert-values@^2.3.4: postcss "^5.0.11" postcss-value-parser "^3.1.2" -postcss-convert-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.0.tgz#77d77d9aed1dc4e6956e651cc349d53305876f62" +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-discard-comments@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + resolved "http://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" dependencies: postcss "^5.0.14" -postcss-discard-comments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.0.tgz#9684a299e76b3e93263ef8fd2adbf1a1c08fd88d" +postcss-discard-comments@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz#30697735b0c476852a7a11050eb84387a67ef55d" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" postcss-discard-duplicates@^2.0.1: version "2.1.0" @@ -5319,39 +5404,39 @@ postcss-discard-duplicates@^2.0.1: dependencies: postcss "^5.0.4" -postcss-discard-duplicates@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.0.tgz#42f3c267f85fa909e042c35767ecfd65cb2bd72c" +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" postcss-discard-empty@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + resolved "http://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" dependencies: postcss "^5.0.14" -postcss-discard-empty@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.0.tgz#55e18a59c74128e38c7d2804bcfa4056611fb97f" +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" postcss-discard-overridden@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + resolved "http://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" dependencies: postcss "^5.0.16" -postcss-discard-overridden@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.0.tgz#4a0bf85978784cf1f81ed2c1c1fd9d964a1da1fa" +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" postcss-discard-unused@^2.2.1: version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + resolved "http://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" dependencies: postcss "^5.0.14" uniqs "^2.0.0" @@ -5364,7 +5449,7 @@ postcss-filter-plugins@^2.0.0: postcss-merge-idents@^2.1.5: version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + resolved "http://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" dependencies: has "^1.0.1" postcss "^5.0.10" @@ -5376,12 +5461,12 @@ postcss-merge-longhand@^2.0.1: dependencies: postcss "^5.0.4" -postcss-merge-longhand@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.5.tgz#00898d72347fc7e40bb564b11bdc08119c599b59" +postcss-merge-longhand@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.6.tgz#2b938fa3529c3d1657e53dc7ff0fd604dbc85ff1" dependencies: css-color-names "0.0.4" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" stylehacks "^4.0.0" @@ -5395,14 +5480,14 @@ postcss-merge-rules@^2.0.3: postcss-selector-parser "^2.2.2" vendors "^1.0.0" -postcss-merge-rules@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.1.tgz#430fd59b3f2ed2e8afcd0b31278eda39854abb10" +postcss-merge-rules@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz#2be44401bf19856f27f32b8b12c0df5af1b88e74" dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" cssnano-util-same-parent "^4.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-selector-parser "^3.0.0" vendors "^1.0.0" @@ -5412,156 +5497,158 @@ postcss-message-helpers@^2.0.0: postcss-minify-font-values@^1.0.2: version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + resolved "http://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" dependencies: object-assign "^4.0.1" postcss "^5.0.4" postcss-value-parser "^3.0.2" -postcss-minify-font-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.0.tgz#4cc33d283d6a81759036e757ef981d92cbd85bed" +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-minify-gradients@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + resolved "http://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" dependencies: postcss "^5.0.12" postcss-value-parser "^3.3.0" -postcss-minify-gradients@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.0.tgz#3fc3916439d27a9bb8066db7cdad801650eb090e" +postcss-minify-gradients@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz#6da95c6e92a809f956bb76bf0c04494953e1a7dd" dependencies: cssnano-util-get-arguments "^4.0.0" is-color-stop "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-minify-params@^1.0.4: version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + resolved "http://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" dependencies: alphanum-sort "^1.0.1" postcss "^5.0.2" postcss-value-parser "^3.0.2" uniqs "^2.0.0" -postcss-minify-params@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.0.tgz#05e9166ee48c05af651989ce84d39c1b4d790674" +postcss-minify-params@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz#5b2e2d0264dd645ef5d68f8fec0d4c38c1cf93d2" dependencies: alphanum-sort "^1.0.0" + browserslist "^4.0.0" cssnano-util-get-arguments "^4.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" uniqs "^2.0.0" postcss-minify-selectors@^2.0.4: version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + resolved "http://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" dependencies: alphanum-sort "^1.0.2" has "^1.0.1" postcss "^5.0.14" postcss-selector-parser "^2.0.0" -postcss-minify-selectors@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.0.tgz#b1e9f6c463416d3fcdcb26e7b785d95f61578aad" +postcss-minify-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz#a891c197977cc37abf60b3ea06b84248b1c1e9cd" dependencies: alphanum-sort "^1.0.0" has "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-selector-parser "^3.0.0" postcss-normalize-charset@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + resolved "http://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" dependencies: postcss "^5.0.5" -postcss-normalize-charset@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.0.tgz#24527292702d5e8129eafa3d1de49ed51a6ab730" +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" -postcss-normalize-display-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz#950e0c7be3445770a160fffd6b6644c3c0cd8f89" +postcss-normalize-display-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz#d9a83d47c716e8a980f22f632c8b0458cfb48a4c" dependencies: cssnano-util-get-match "^4.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-positions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.0.tgz#ee9343ab981b822c63ab72615ecccd08564445a3" +postcss-normalize-positions@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz#ee2d4b67818c961964c6be09d179894b94fd6ba1" dependencies: cssnano-util-get-arguments "^4.0.0" has "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-repeat-style@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.0.tgz#b711c592cf16faf9ff575e42fa100b6799083eff" +postcss-normalize-repeat-style@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz#5293f234b94d7669a9f805495d35b82a581c50e5" dependencies: cssnano-util-get-arguments "^4.0.0" cssnano-util-get-match "^4.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.0.tgz#718cb6d30a6fac6ac6a830e32c06c07dbc66fe5d" +postcss-normalize-string@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz#23c5030c2cc24175f66c914fa5199e2e3c10fef3" dependencies: has "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-timing-functions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.0.tgz#0351f29886aa981d43d91b2c2bd1aea6d0af6d23" +postcss-normalize-timing-functions@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz#8be83e0b9cb3ff2d1abddee032a49108f05f95d7" dependencies: cssnano-util-get-match "^4.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-unicode@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.0.tgz#5acd5d47baea5d17674b2ccc4ae5166fa88cdf97" +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" dependencies: - postcss "^6.0.0" + browserslist "^4.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-normalize-url@^3.0.7: version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + resolved "http://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" dependencies: is-absolute-url "^2.0.0" normalize-url "^1.4.0" postcss "^5.0.14" postcss-value-parser "^3.2.3" -postcss-normalize-url@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.0.tgz#b7a9c8ad26cf26694c146eb2d68bd0cf49956f0d" +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" dependencies: is-absolute-url "^2.0.0" normalize-url "^3.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" -postcss-normalize-whitespace@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.0.tgz#1da7e76b10ae63c11827fa04fc3bb4a1efe99cc0" +postcss-normalize-whitespace@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz#d14cb639b61238418ac8bc8d3b7bdd65fc86575e" dependencies: - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-ordered-values@^2.1.0: @@ -5571,51 +5658,51 @@ postcss-ordered-values@^2.1.0: postcss "^5.0.4" postcss-value-parser "^3.0.1" -postcss-ordered-values@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.0.tgz#2c769d5d44aa3c7c907b8be2e997ed19dfd8d50a" +postcss-ordered-values@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz#2e3b432ef3e489b18333aeca1f1295eb89be9fc2" dependencies: cssnano-util-get-arguments "^4.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-reduce-idents@^2.2.2: version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + resolved "http://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.2" postcss-reduce-initial@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + resolved "http://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" dependencies: postcss "^5.0.4" -postcss-reduce-initial@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.1.tgz#f2d58f50cea2b0c5dc1278d6ea5ed0ff5829c293" +postcss-reduce-initial@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz#bac8e325d67510ee01fa460676dc8ea9e3b40f15" dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" has "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-reduce-transforms@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + resolved "http://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" dependencies: has "^1.0.1" postcss "^5.0.8" postcss-value-parser "^3.0.1" -postcss-reduce-transforms@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.0.tgz#f645fc7440c35274f40de8104e14ad7163edf188" +postcss-reduce-transforms@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz#8600d5553bdd3ad640f43bff81eb52f8760d4561" dependencies: cssnano-util-get-match "^4.0.0" has "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: @@ -5636,36 +5723,36 @@ postcss-selector-parser@^3.0.0: postcss-svgo@^2.1.1: version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + resolved "http://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" dependencies: is-svg "^2.0.0" postcss "^5.0.14" postcss-value-parser "^3.2.3" svgo "^0.7.0" -postcss-svgo@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.0.tgz#c0bbad02520fc636c9d78b0e8403e2e515c32285" +postcss-svgo@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.1.tgz#5628cdb38f015de6b588ce6d0bf0724b492b581d" dependencies: is-svg "^3.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" postcss-unique-selectors@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + resolved "http://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" dependencies: alphanum-sort "^1.0.1" postcss "^5.0.4" uniqs "^2.0.0" -postcss-unique-selectors@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.0.tgz#04c1e9764c75874261303402c41f0e9769fc5501" +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" dependencies: alphanum-sort "^1.0.0" - postcss "^6.0.0" + postcss "^7.0.0" uniqs "^2.0.0" postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: @@ -5674,7 +5761,7 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^ postcss-zindex@^2.0.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + resolved "http://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" dependencies: has "^1.0.1" postcss "^5.0.4" @@ -5689,7 +5776,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.0, postcss@^6.0.19: +postcss@^6.0.19: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" dependencies: @@ -5697,6 +5784,14 @@ postcss@^6.0.0, postcss@^6.0.19: source-map "^0.6.1" supports-color "^5.4.0" +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.4.tgz#b5a059597d2c1a8a9916cb6efb0b294f70b4f309" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.5.0" + posthtml-parser@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.3.3.tgz#3fe986fca9f00c0f109d731ba590b192f26e776d" @@ -5736,7 +5831,7 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -6033,7 +6128,13 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" -regenerate@^1.2.1: +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -6041,12 +6142,14 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" regex-cache@^0.4.2: @@ -6062,21 +6165,24 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" +regjsparser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" dependencies: jsesc "~0.5.0" @@ -6208,8 +6314,8 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.1.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" dependencies: tslib "^1.9.0" @@ -6427,12 +6533,6 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - source-map-support@~0.5.6: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" @@ -6448,7 +6548,7 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -6464,8 +6564,8 @@ spawn-wrap@^1.4.2: which "^1.3.0" spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.1.tgz#434434ff9d1726b4d9f4219d1004813d80639e30" dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -6627,7 +6727,7 @@ string_decoder@^1.0.0, string_decoder@~1.1.1: strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: ansi-regex "^2.0.0" @@ -6675,11 +6775,11 @@ strong-log-transformer@^2.0.0: through "^2.3.4" stylehacks@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.0.tgz#64b323951c4a24e5fc7b2ec06c137bf32d155e8a" + version "4.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.1.tgz#3186595d047ab0df813d213e51c8b94e0b9010f2" dependencies: browserslist "^4.0.0" - postcss "^6.0.0" + postcss "^7.0.0" postcss-selector-parser "^3.0.0" supports-color@5.4.0: @@ -6698,7 +6798,7 @@ supports-color@^3.1.2, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" dependencies: @@ -6771,8 +6871,8 @@ temp-write@^3.4.0: uuid "^3.0.1" terser@^3.7.3, terser@^3.8.1, terser@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.2.tgz#48b880f949f8d038aca4dfd00a37c53d96ecf9fb" + version "3.9.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.9.2.tgz#d139d8292eb3a23091304c934fb539d9f456fb19" dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -6971,10 +7071,14 @@ typedoc@^0.12.0: typedoc-default-themes "^0.5.0" typescript "3.0.x" -typescript@3.0.x, typescript@^3.0.1: +typescript@3.0.x: version "3.0.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" +typescript@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.1.tgz#3362ba9dd1e482ebb2355b02dfe8bcd19a2c7c96" + uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" @@ -6990,6 +7094,25 @@ umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + unicode-trie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" From 3b1bf647a211b8826b79ca0e0bf0d7e9705eb356 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 05:17:47 +0100 Subject: [PATCH 44/77] feat(geom): add ICollate & ICopy impls, re-add/update convexHull2 --- packages/geom/src/api.ts | 24 +++++++++++++++--- packages/geom/src/container2.ts | 35 ++++++++++++++++++++++++++- packages/geom/src/container3.ts | 30 ++++++++++++++++++++++- packages/geom/src/func/convex-hull.ts | 35 +++++++++++++++++++++++++++ packages/geom/src/func/corner.ts | 11 +++++++++ packages/geom/src/func/edges.ts | 4 +-- packages/geom/src/poly2.ts | 4 +++ packages/geom/src/polyline2.ts | 4 +++ 8 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 packages/geom/src/func/convex-hull.ts create mode 100644 packages/geom/src/func/corner.ts diff --git a/packages/geom/src/api.ts b/packages/geom/src/api.ts index e63ceb2d96..1130aaf6f4 100644 --- a/packages/geom/src/api.ts +++ b/packages/geom/src/api.ts @@ -1,7 +1,10 @@ import { ICopy } from "@thi.ng/api/api"; -import { IDistance, IMix } from "@thi.ng/vectors/api"; +import { IDistance, IMix, Vec } from "@thi.ng/vectors/api"; -export type SampleableVector = ICopy & IDistance & IMix; +export type SampleableVector = + ICopy & + IDistance & + IMix; export interface IArea { /** @@ -47,8 +50,23 @@ export interface ICentroid { centroid(c?: T): T; } +export interface ICollate { + /** + * Collates all points into a single buffer and remaps existing + * vertices (by default). Points will written from given `start` + * index, using layout defined by `cstride` and `estride`. + * + * @param remap + * @param buf + * @param start + * @param cstride + * @param estride + */ + collate(remap?: boolean, buf?: Vec, start?: number, cstride?: number, estride?: number): this; +} + export interface IEdges { - edges(): Iterable; + edges(opts?: any): Iterable; } export interface IToPolygon2 { diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts index 2be49bc950..e59e0550ba 100644 --- a/packages/geom/src/container2.ts +++ b/packages/geom/src/container2.ts @@ -2,12 +2,20 @@ import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { Mat23 } from "@thi.ng/vectors/mat23"; import { Vec2, vec2 } from "@thi.ng/vectors/vec2"; -import { IBounds, ICentroid, IVertices } from "./api"; +import { + IBounds, + ICentroid, + ICollate, + IVertices +} from "./api"; import { bounds } from "./func/bounds"; +import { convexHull2 } from "./func/convex-hull"; +import { Vec } from "@thi.ng/vectors/api"; export class PointContainer2 implements IBounds, ICentroid, + ICollate, IVertices { points: Vec2[]; @@ -22,6 +30,23 @@ export class PointContainer2 implements yield* this.vertices(); } + collate(remap = true, buf: Vec, start = 0, cstride = 1, estride = 2) { + if (!remap) { + this.points = this._copy(); + } else { + const pts = this.points; + const n = pts.length; + buf = Vec2.intoBuffer(buf || new Array(start + n * estride).fill(0), pts, start, cstride, estride); + for (let i = 0; i < n; i++) { + const p = pts[i]; + p.buf = buf; + p.i = start + i * estride; + p.s = cstride; + } + } + return this; + } + vertices() { return this.points; } @@ -44,6 +69,10 @@ export class PointContainer2 implements return 0; } + convextHull() { + return convexHull2(this.points); + } + centroid(c?: Vec2): Vec2 { const pts = this.points; const num = pts.length; @@ -87,4 +116,8 @@ export class PointContainer2 implements } return this; } + + protected _copy() { + return Vec2.mapBuffer(Vec2.intoBuffer([], this.points), this.points.length); + } } diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts index 91ac2e2bcd..c5c046a93d 100644 --- a/packages/geom/src/container3.ts +++ b/packages/geom/src/container3.ts @@ -1,13 +1,20 @@ import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; +import { Vec } from "@thi.ng/vectors/api"; import { Mat44 } from "@thi.ng/vectors/mat44"; import { Vec3, vec3 } from "@thi.ng/vectors/vec3"; -import { IBounds, ICentroid, IVertices } from "./api"; +import { + IBounds, + ICentroid, + ICollate, + IVertices +} from "./api"; import { bounds } from "./func/bounds"; export class PointContainer3 implements IBounds, ICentroid, + ICollate, IVertices { points: Vec3[]; @@ -22,6 +29,23 @@ export class PointContainer3 implements yield* this.vertices(); } + collate(remap = true, buf: Vec, start = 0, cstride = 1, estride = 3) { + if (!remap) { + this.points = this._copy(); + } else { + const pts = this.points; + const n = pts.length; + buf = Vec3.intoBuffer(buf || new Array(start + n * estride).fill(0), pts, start, cstride, estride); + for (let i = 0; i < n; i++) { + const p = pts[i]; + p.buf = buf; + p.i = start + i * estride; + p.s = cstride; + } + } + return this; + } + vertices() { return this.points; } @@ -88,4 +112,8 @@ export class PointContainer3 implements } return this; } + + protected _copy() { + return Vec3.mapBuffer(Vec3.intoBuffer([], this.points), this.points.length); + } } diff --git a/packages/geom/src/func/convex-hull.ts b/packages/geom/src/func/convex-hull.ts new file mode 100644 index 0000000000..e4f5b82298 --- /dev/null +++ b/packages/geom/src/func/convex-hull.ts @@ -0,0 +1,35 @@ +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { corner } from "./corner"; + +/** + * Returns array of points defining the Convex Hull of `pts` using + * Graham Scan method. + * + * https://en.wikipedia.org/wiki/Graham_scan + * + * @param pts + */ +export const convexHull2 = (pts: ReadonlyArray) => { + const num = pts.length; + const res: Vec2[] = []; + let h = 0, i; + pts = pts.slice().sort(Vec2.comparator(0, 1)); + const scan = (p: Vec2, thresh: number) => { + while (h >= thresh && corner(res[h - 2], res[h - 1], p) >= 0) { + res.pop(); + h--; + } + res[h++] = p; + }; + for (i = 0; i < num; i++) { + scan(pts[i], 2); + } + res.pop(); + h--; + const h2 = h + 2; + for (i = num - 1; i >= 0; i--) { + scan(pts[i], h2); + } + res.pop(); + return res; +} diff --git a/packages/geom/src/func/corner.ts b/packages/geom/src/func/corner.ts new file mode 100644 index 0000000000..894d5b0a02 --- /dev/null +++ b/packages/geom/src/func/corner.ts @@ -0,0 +1,11 @@ +import { EPS, sign1 } from "@thi.ng/vectors/math"; +import { Vec2 } from "@thi.ng/vectors/vec2"; + +export const corner = (a: Readonly, b: Readonly, c: Readonly) => { + const ax = a.x, + ay = a.y; + return (b.x - ax) * (c.y - ay) - (c.x - ax) * (b.y - ay); +}; + +export const classify = (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => + sign1(corner(a, b, c), eps); diff --git a/packages/geom/src/func/edges.ts b/packages/geom/src/func/edges.ts index 73e7815e02..aa6c8c447d 100644 --- a/packages/geom/src/func/edges.ts +++ b/packages/geom/src/func/edges.ts @@ -1,6 +1,6 @@ import { wrap } from "@thi.ng/transducers/iter/wrap"; import { partition } from "@thi.ng/transducers/xform/partition"; -export const edges = (vertices: T[], closed = false) => { - return partition(2, 1, closed ? wrap(vertices, 1, false, true) : vertices); +export const edges = (vertices: ReadonlyArray, closed = false) => { + return partition(2, 1, closed ? wrap(vertices, 1, false, true) : vertices); }; diff --git a/packages/geom/src/poly2.ts b/packages/geom/src/poly2.ts index 749c713979..d6567bd156 100644 --- a/packages/geom/src/poly2.ts +++ b/packages/geom/src/poly2.ts @@ -15,6 +15,10 @@ export class Polygon2 extends PointContainer2 implements super(points, attribs); } + copy() { + return new Polygon2(this._copy(), { ...this.attribs }); + } + edges() { return edges(this.vertices(), true); } diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts index fd2eab5b9e..e826fc2868 100644 --- a/packages/geom/src/polyline2.ts +++ b/packages/geom/src/polyline2.ts @@ -16,6 +16,10 @@ export class Polyline2 extends PointContainer2 implements super(points, attribs); } + copy() { + return new Polyline2(this._copy(), { ...this.attribs }); + } + edges() { return edges(this.vertices()); } From aa6b1206d6fe8e4a921b0e620c328de0e59b3d08 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 05:18:50 +0100 Subject: [PATCH 45/77] feat(geom): re-add Arc2, update Circle2, update helper fns --- packages/geom/src/arc2.ts | 88 ++++++++++++++++++++++++ packages/geom/src/circle2.ts | 4 ++ packages/geom/src/func/arc-length.ts | 12 ++-- packages/geom/src/func/bounds.ts | 2 +- packages/geom/src/func/circumcenter.ts | 22 +++--- packages/geom/src/func/sample-uniform.ts | 2 +- packages/geom/src/index.ts | 1 + 7 files changed, 112 insertions(+), 19 deletions(-) create mode 100644 packages/geom/src/arc2.ts diff --git a/packages/geom/src/arc2.ts b/packages/geom/src/arc2.ts new file mode 100644 index 0000000000..0504f7ae28 --- /dev/null +++ b/packages/geom/src/arc2.ts @@ -0,0 +1,88 @@ +import { TAU } from "@thi.ng/vectors/math"; +import { Vec2, setS2, mul2, rotate2, add2 } from "@thi.ng/vectors/vec2"; +import { IVertices, IEdges } from "./api"; +import { Vec } from "@thi.ng/vectors/api"; +import { edges } from "./func/edges"; + +export class Arc2 implements + IEdges, + IVertices { + + static from2Points( + a: Readonly, + b: Readonly, + radii: Readonly, + axisTheta = 0, + large = false, + clockwise = true) { + + const r = radii.copy().abs(); + const co = Math.cos(axisTheta); + const si = Math.sin(axisTheta); + const m = Vec2.sub(a, b).mulN(0.5); + const p = new Vec2([co * m.x + si * m.y, -si * m.x + co * m.y]); + const px2 = p.x * p.x; + const py2 = p.y * p.y; + const l = px2 / (r.x * r.x) + py2 / (r.y * r.y); + l > 1 && r.mulN(Math.sqrt(l)); + const rx2 = r.x * r.x; + const ry2 = r.y * r.y; + const rxpy = rx2 * py2; + const rypx = ry2 * px2; + const root = ((large === clockwise) ? -1 : 1) * + Math.sqrt(Math.abs((rx2 * ry2 - rxpy - rypx)) / (rxpy + rypx)); + const tc = new Vec2([r.x * p.y / r.y, -r.y * p.x / r.x]).mulN(root); + const c = new Vec2([co * tc.x - si * tc.y, si * tc.x + co * tc.y]).add(Vec2.mixN(a, b)); + const d1 = new Vec2([(p.x - tc.x) / r.x, (p.y - tc.y) / r.y]); + const d2 = new Vec2([(-p.x - tc.x) / r.x, (-p.y - tc.y) / r.y]); + const theta = Vec2.X_AXIS.angleBetween(d1, true); + let delta = d1.angleBetween(d2, true); + if (clockwise && delta < 0) { + delta += TAU; + } else if (!clockwise && delta > 0) { + delta -= TAU; + } + return new Arc2(c, r, axisTheta, theta, theta + delta, large, clockwise); + } + + static DEFAULT_RES = 20; + + pos: Vec2; + r: Vec2; + axis: number; + start: number; + end: number; + xl: boolean; + clockwise: boolean; + + constructor(pos: Vec2, r: Vec2, axis: number, start: number, end: number, xl = false, clockwise = false) { + this.pos = pos; + this.r = r; + this.axis = axis; + this.start = start; + this.end = end; + this.clockwise = clockwise; + this.xl = xl; + } + + edges(num = Arc2.DEFAULT_RES) { + return edges(this.vertices(num)); + } + + vertices(num = Arc2.DEFAULT_RES) { + const res: Vec = new Array(num * 2); + const start = this.start; + const delta = (this.end - start) / (num - 1); + const pos = this.pos; + const r = this.r; + const axis = this.axis; + for (let i = 0, j = 0; i < num; i++ , j += 2) { + const t = start + i * delta; + setS2(res, Math.cos(t), Math.sin(t), j); + mul2(res, r.buf, j, r.i, 1, r.s); + rotate2(res, axis, j); + add2(res, pos.buf, j, pos.i, 1, pos.s); + } + return Vec2.mapBuffer(res, num); + } +} \ No newline at end of file diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index 12095ce77b..5b15e95261 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -34,6 +34,10 @@ export class Circle2 implements this.attribs = attribs; } + copy() { + return new Circle2(this.pos.copy(), this.r, { ...this.attribs }); + } + verticesRaw( from: number, to: number, diff --git a/packages/geom/src/func/arc-length.ts b/packages/geom/src/func/arc-length.ts index 6329bc11d8..21cd100ab4 100644 --- a/packages/geom/src/func/arc-length.ts +++ b/packages/geom/src/func/arc-length.ts @@ -1,14 +1,14 @@ import { IDistance } from "@thi.ng/vectors/api"; -export const arcLength = >(pts: Readonly[], closed = false) => { +export const arcLength = >(pts: ReadonlyArray, closed = false) => { const num = pts.length; if (num < 2) return 0; - let i = pts[0]; - let j = pts[1]; + let p = pts[0]; + let q = pts[1]; let res = 0; - for (let k = 1; k < num; k++ , i = j, j = pts[k]) { - res += i.dist(j); + for (let i = 1; i < num; i++ , p = q, q = pts[i]) { + res += p.dist(q); } - closed && (res += i.dist(pts[0])); + closed && (res += p.dist(pts[0])); return res; }; diff --git a/packages/geom/src/func/bounds.ts b/packages/geom/src/func/bounds.ts index 864cd4a09d..d3c9aea378 100644 --- a/packages/geom/src/func/bounds.ts +++ b/packages/geom/src/func/bounds.ts @@ -1,6 +1,6 @@ import { IMinMax } from "@thi.ng/vectors/api"; -export const bounds = >(pts: T[], vmin: T, vmax: T) => { +export const bounds = >(pts: ReadonlyArray, vmin: T, vmax: T) => { for (let i = pts.length; --i >= 0;) { const p = pts[i]; vmin.min(p); diff --git a/packages/geom/src/func/circumcenter.ts b/packages/geom/src/func/circumcenter.ts index ec9de80983..f36143d406 100644 --- a/packages/geom/src/func/circumcenter.ts +++ b/packages/geom/src/func/circumcenter.ts @@ -1,23 +1,23 @@ import { Vec2 } from "@thi.ng/vectors/vec2"; +import { EPS } from "@thi.ng/vectors/math"; -export const circumCenter = (a: Readonly, b: Readonly, c: Readonly) => { - let m1, m2, mx1, mx2, my1, my2, xc, yc; - const deltaAB = Math.abs(a.y - b.y), - deltaBC = Math.abs(b.y - c.y); - - if (deltaAB < 1e-6 && deltaBC < 1e-6) { +export const circumCenter = (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => { + const deltaAB = Math.abs(a.y - b.y); + const deltaBC = Math.abs(b.y - c.y); + if (deltaAB < eps && deltaBC < eps) { return null; } - const ax = a.x, ay = a.y, - bx = b.x, by = b.y, - cx = c.x, cy = c.y; - if (deltaAB < 1e-6) { + const ax = a.x, ay = a.y; + const bx = b.x, by = b.y; + const cx = c.x, cy = c.y; + let m1, m2, mx1, mx2, my1, my2, xc, yc; + if (deltaAB < eps) { m2 = - (cx - bx) / (cy - by); mx2 = (bx + cx) / 2; my2 = (by + cy) / 2; xc = (bx + ax) / 2; yc = m2 * (xc - mx2) + my2; - } else if (deltaBC < 1e-6) { + } else if (deltaBC < eps) { m1 = - (bx - ax) / (by - ay); mx1 = (ax + bx) / 2; my1 = (ay + by) / 2; diff --git a/packages/geom/src/func/sample-uniform.ts b/packages/geom/src/func/sample-uniform.ts index 61d760150c..e6fd1abaa9 100644 --- a/packages/geom/src/func/sample-uniform.ts +++ b/packages/geom/src/func/sample-uniform.ts @@ -8,7 +8,7 @@ import { SampleableVector } from "../api"; * @param step sample distance * @param pts */ -export const sampleUniform = >(pts: T[], step: number) => { +export const sampleUniform = >(pts: ReadonlyArray, step: number) => { if (!pts.length) return []; let prev = pts[0]; const res: T[] = [prev]; diff --git a/packages/geom/src/index.ts b/packages/geom/src/index.ts index 7b6476bb7f..e791d15960 100644 --- a/packages/geom/src/index.ts +++ b/packages/geom/src/index.ts @@ -2,6 +2,7 @@ export * from "./api"; export * from "./container2"; export * from "./container3"; +export * from "./arc2"; export * from "./circle2"; export * from "./poly2"; export * from "./polyline2"; From 515e5ba509f3c1ee771f2b41db5101da46875553 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 05:20:18 +0100 Subject: [PATCH 46/77] feat(transducers): update wrap*() fns to accept iterables --- packages/transducers/src/iter/wrap-both.ts | 2 +- packages/transducers/src/iter/wrap-left.ts | 2 +- packages/transducers/src/iter/wrap-right.ts | 2 +- packages/transducers/src/iter/wrap.ts | 14 ++++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/transducers/src/iter/wrap-both.ts b/packages/transducers/src/iter/wrap-both.ts index 8ccc373dd1..791922d08b 100644 --- a/packages/transducers/src/iter/wrap-both.ts +++ b/packages/transducers/src/iter/wrap-both.ts @@ -7,6 +7,6 @@ import { wrap } from "./wrap"; * @param src * @param n */ -export function wrapBoth(src: T[], n = 1) { +export function wrapBoth(src: Iterable, n = 1) { return wrap(src, n); } diff --git a/packages/transducers/src/iter/wrap-left.ts b/packages/transducers/src/iter/wrap-left.ts index 57d9a7a7f0..17c3f027b9 100644 --- a/packages/transducers/src/iter/wrap-left.ts +++ b/packages/transducers/src/iter/wrap-left.ts @@ -7,6 +7,6 @@ import { wrap } from "./wrap"; * @param src * @param n */ -export function wrapLeft(src: T[], n = 1) { +export function wrapLeft(src: Iterable, n = 1) { return wrap(src, n, true, false); } diff --git a/packages/transducers/src/iter/wrap-right.ts b/packages/transducers/src/iter/wrap-right.ts index 50903dd153..d7a0ba8cdb 100644 --- a/packages/transducers/src/iter/wrap-right.ts +++ b/packages/transducers/src/iter/wrap-right.ts @@ -7,6 +7,6 @@ import { wrap } from "./wrap"; * @param src * @param n */ -export function wrapRight(src: T[], n = 1) { +export function wrapRight(src: Iterable, n = 1) { return wrap(src, n, false, true); } diff --git a/packages/transducers/src/iter/wrap.ts b/packages/transducers/src/iter/wrap.ts index 2504825470..b67d78c3e0 100644 --- a/packages/transducers/src/iter/wrap.ts +++ b/packages/transducers/src/iter/wrap.ts @@ -1,4 +1,5 @@ import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; +import { ensureArray } from "../func/ensure-array"; /** * Yields iterator of `src` with the last `n` values of `src` prepended @@ -11,17 +12,18 @@ import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; * @param left * @param right */ -export function* wrap(src: T[], n = 1, left = true, right = true) { - (n < 0 || n > src.length) && illegalArgs(`wrong number of wrap items: got ${n} max: ${src.length}`); +export function* wrap(src: Iterable, n = 1, left = true, right = true) { + const _src: T[] = ensureArray(src); + (n < 0 || n > _src.length) && illegalArgs(`wrong number of wrap items: got ${n}, but max: ${_src.length}`); if (left) { - for (let m = src.length, i = m - n; i < m; i++) { - yield src[i]; + for (let m = _src.length, i = m - n; i < m; i++) { + yield _src[i]; } } - yield* src; + yield* _src; if (right) { for (let i = 0; i < n; i++) { - yield src[i]; + yield _src[i]; } } } From 1ef23611fcfd358d029cd74addfcaf761f79d54d Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 05:23:45 +0100 Subject: [PATCH 47/77] fix(transducers): minor TS3.1 fixes --- packages/transducers/src/iterator.ts | 2 +- packages/transducers/src/xform/interleave.ts | 4 ++-- packages/transducers/src/xform/interpose.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/transducers/src/iterator.ts b/packages/transducers/src/iterator.ts index 43f32df6d3..22ddd8c6d6 100644 --- a/packages/transducers/src/iterator.ts +++ b/packages/transducers/src/iterator.ts @@ -38,7 +38,7 @@ export function* iterator(xform: Transducer, xs: Iterable): Itera * @param xs */ export function* iterator1(xform: Transducer, xs: Iterable): IterableIterator { - const reduce = (>xform([null, null, (acc, x) => (acc = x)]))[2]; + const reduce = (>xform([null, null, (_, x) => x]))[2]; for (let x of xs) { let y = reduce(SEMAPHORE, x); if (isReduced(y)) { diff --git a/packages/transducers/src/xform/interleave.ts b/packages/transducers/src/xform/interleave.ts index 526c1d2b18..0d773928fb 100644 --- a/packages/transducers/src/xform/interleave.ts +++ b/packages/transducers/src/xform/interleave.ts @@ -5,12 +5,12 @@ import { isReduced } from "../reduced"; export function interleave(sep: B | (() => B)): Transducer; export function interleave(sep: B | (() => B), src: Iterable): IterableIterator; -export function interleave(sep: B | (() => B), src?: Iterable): any { +export function interleave(sep: any, src?: Iterable): any { return src ? iterator(interleave(sep), src) : (rfn: Reducer) => { const r = rfn[2]; - const _sep = typeof sep === "function" ? sep : () => sep; + const _sep: () => B = typeof sep === "function" ? sep : () => sep; return compR(rfn, (acc, x: A) => { acc = r(acc, _sep()); diff --git a/packages/transducers/src/xform/interpose.ts b/packages/transducers/src/xform/interpose.ts index daab88ac73..200fb0ecb9 100644 --- a/packages/transducers/src/xform/interpose.ts +++ b/packages/transducers/src/xform/interpose.ts @@ -5,12 +5,12 @@ import { isReduced } from "../reduced"; export function interpose(sep: B | (() => B)): Transducer; export function interpose(sep: B | (() => B), src: Iterable): IterableIterator; -export function interpose(sep: B | (() => B), src?: Iterable): any { +export function interpose(sep: any, src?: Iterable): any { return src ? iterator(interpose(sep), src) : (rfn: Reducer) => { const r = rfn[2]; - const _sep = typeof sep === "function" ? sep : () => sep; + const _sep: () => B = typeof sep === "function" ? sep : () => sep; let first = true; return compR(rfn, (acc, x: A) => { From 775cc8a7c0a42719689c60a0c3a4a649cd5ef202 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 05:24:47 +0100 Subject: [PATCH 48/77] fix(hdom-components): add Canvas2DContextAttributes (removed in TS3.1) --- packages/hdom-components/src/canvas.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/hdom-components/src/canvas.ts b/packages/hdom-components/src/canvas.ts index 8e5adca876..5fd633245b 100644 --- a/packages/hdom-components/src/canvas.ts +++ b/packages/hdom-components/src/canvas.ts @@ -3,6 +3,13 @@ export type CanvasContext = WebGLRenderingContext | WebGL2RenderingContext; +interface Canvas2DContextAttributes { + alpha?: boolean; + storage?: boolean; + willReadFrequently?: boolean; + [attribute: string]: boolean | string | undefined; +} + /** * User provided canvas life cycle methods. These differ from the usual * @thi.ng/hdom life cycle methods and are always passed at least the From 2657df66675f07892e6e10ef618f97686ff2527b Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 30 Sep 2018 17:13:07 +0100 Subject: [PATCH 49/77] feat(geom): add/update interfaces & impls - add CollateOpts, update collate() in both containers - add generics for IVertices - add ArcSamplingOpts - update edges(), vertices() for Arc2 & Circle2 - add .toJSON() impls - add @thi.ng/checks dep --- packages/geom/package.json | 1 + packages/geom/src/api.ts | 49 +++++++++++++++++++++++----- packages/geom/src/arc2.ts | 58 ++++++++++++++++++++++++--------- packages/geom/src/circle2.ts | 45 ++++++++++++++++++++----- packages/geom/src/container2.ts | 53 +++++++++++++++++++++--------- packages/geom/src/container3.ts | 41 ++++++++++++++--------- packages/geom/src/poly2.ts | 6 +++- packages/geom/src/polyline2.ts | 6 +++- 8 files changed, 193 insertions(+), 66 deletions(-) diff --git a/packages/geom/package.json b/packages/geom/package.json index b41acec59a..abdc70f26c 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -29,6 +29,7 @@ }, "dependencies": { "@thi.ng/api": "^4.2.1", + "@thi.ng/checks": "^1.5.11", "@thi.ng/transducers": "^2.1.6", "@thi.ng/vectors": "^1.3.0" }, diff --git a/packages/geom/src/api.ts b/packages/geom/src/api.ts index 1130aaf6f4..f443441a99 100644 --- a/packages/geom/src/api.ts +++ b/packages/geom/src/api.ts @@ -24,6 +24,36 @@ export interface IArcLength { arcLength(): number; } +export interface ArcSamplingOpts { + /** + * Number of points to sample & return. Defaults to + * `Arc2.DEFAULT_RES` if neither this nor `theta` option is given. + */ + num: number; + /** + * Target angle between sampled points. If greater than the actual + * range of the arc, only the 2 end points will be returned. This + * option is used to derive a `num` value and will take priority if + * `num` is given as well. + * + * This option is useful to adapt the sampling based on actual angle + * range, rather than a fixed number of samples. + */ + theta: number; + /** + * If `false` (default), the arc's end point will be omitted from + * the result array and if `num` option was given, results in + * `num-1` points. However, this option has no influence on the + * angular resolution calculation. + * + * This option is useful when building paths of consecutive + * segments, where the end point of one segment coincides with the + * start point of the next segment and so can be used to avoid + * duplicate vertices in the concatenated result. + */ + includeLast: boolean; +} + export interface IBounds { bounds(): T; /** @@ -50,19 +80,22 @@ export interface ICentroid { centroid(c?: T): T; } +export interface CollateOpts { + buf: Vec; + start: number; + cstride: number; + estride: number; +} + export interface ICollate { /** * Collates all points into a single buffer and remaps existing * vertices (by default). Points will written from given `start` * index, using layout defined by `cstride` and `estride`. * - * @param remap - * @param buf - * @param start - * @param cstride - * @param estride + * @param opts */ - collate(remap?: boolean, buf?: Vec, start?: number, cstride?: number, estride?: number): this; + collate(opts?: Partial): Vec; } export interface IEdges { @@ -74,6 +107,6 @@ export interface IToPolygon2 { toPolygon2(opts?: any): any; } -export interface IVertices { - vertices(opts?: any): Iterable; +export interface IVertices { + vertices(opts?: O): Iterable; } diff --git a/packages/geom/src/arc2.ts b/packages/geom/src/arc2.ts index 0504f7ae28..6dc5940f5c 100644 --- a/packages/geom/src/arc2.ts +++ b/packages/geom/src/arc2.ts @@ -1,12 +1,18 @@ -import { TAU } from "@thi.ng/vectors/math"; -import { Vec2, setS2, mul2, rotate2, add2 } from "@thi.ng/vectors/vec2"; -import { IVertices, IEdges } from "./api"; +import { isNumber } from "@thi.ng/checks/is-number"; import { Vec } from "@thi.ng/vectors/api"; +import { TAU } from "@thi.ng/vectors/math"; +import { + add2, + rotate2, + setS2, + Vec2 +} from "@thi.ng/vectors/vec2"; +import { ArcSamplingOpts, IEdges, IVertices } from "./api"; import { edges } from "./func/edges"; export class Arc2 implements IEdges, - IVertices { + IVertices> { static from2Points( a: Readonly, @@ -65,24 +71,44 @@ export class Arc2 implements this.xl = xl; } - edges(num = Arc2.DEFAULT_RES) { - return edges(this.vertices(num)); + edges(opts?: Partial) { + return edges(this.vertices(opts)); } - vertices(num = Arc2.DEFAULT_RES) { - const res: Vec = new Array(num * 2); + vertices(opts?: number | Partial) { + opts = isNumber(opts) ? + { num: opts, includeLast: true } : + { num: Arc2.DEFAULT_RES, ...opts }; + let num: number; const start = this.start; - const delta = (this.end - start) / (num - 1); + let delta = this.end - start; + num = opts.theta ? + Math.max(Math.ceil(1 + delta / opts.theta), 2) : + opts.num; + delta /= (num - 1); + opts.includeLast !== true && num--; + const pts: Vec = new Array(num * 2); const pos = this.pos; - const r = this.r; + const [rx, ry] = this.r; const axis = this.axis; for (let i = 0, j = 0; i < num; i++ , j += 2) { const t = start + i * delta; - setS2(res, Math.cos(t), Math.sin(t), j); - mul2(res, r.buf, j, r.i, 1, r.s); - rotate2(res, axis, j); - add2(res, pos.buf, j, pos.i, 1, pos.s); + setS2(pts, Math.cos(t) * rx, Math.sin(t) * ry, j); + rotate2(pts, axis, j); + add2(pts, pos.buf, j, pos.i, 1, pos.s); } - return Vec2.mapBuffer(res, num); + return Vec2.mapBuffer(pts, num); + } + + toJSON() { + return { + type: "arc2", + pos: this.pos.toJSON(), + r: this.r.toJSON(), + start: this.start, + end: this.end, + xl: this.xl, + clockwise: this.clockwise + }; } -} \ No newline at end of file +} diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index 5b15e95261..c6dbac0c51 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -1,10 +1,19 @@ import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; -import { IToPolygon2, IVertices, IBounds, ICentroid, IArcLength } from "@thi.ng/geom/src/api"; +import { isNumber } from "@thi.ng/checks/is-number"; import { normRange } from "@thi.ng/transducers/iter/norm-range"; import { Vec } from "@thi.ng/vectors/api"; import { mix1, PI, TAU } from "@thi.ng/vectors/math"; import { setS2, toCartesian2, Vec2 } from "@thi.ng/vectors/vec2"; +import { + ArcSamplingOpts, + IArcLength, + IBounds, + ICentroid, + IToPolygon2, + IVertices +} from "./api"; import { circumCenter } from "./func/circumcenter"; +import { edges } from "./func/edges"; import { Polygon2 } from "./poly2"; export class Circle2 implements @@ -13,7 +22,7 @@ export class Circle2 implements ICentroid, IToHiccup, IToPolygon2, - IVertices { + IVertices> { static from3Points(a: Readonly, b: Readonly, c: Readonly) { const o = circumCenter(a, b, c); @@ -38,10 +47,14 @@ export class Circle2 implements return new Circle2(this.pos.copy(), this.r, { ...this.attribs }); } + edges(opts?: Partial) { + return edges(this.vertices(opts)); + } + verticesRaw( from: number, to: number, - res: number, + num: number, inclLast: boolean, dest: Vec = [], destOffset = 0, @@ -53,7 +66,7 @@ export class Circle2 implements const po = this.pos.i; const ps = this.pos.s; const r = this.r; - for (let t of normRange(inclLast ? res - 1 : res, inclLast)) { + for (let t of normRange(inclLast ? num - 1 : num, inclLast)) { toCartesian2( setS2(dest, r, mix1(from, to, t), destOffset, cstride), pos, destOffset, po, cstride, ps @@ -63,8 +76,16 @@ export class Circle2 implements return dest; } - vertices(res = Circle2.DEFAULT_RES) { - return Vec2.mapBuffer(this.verticesRaw(0, TAU, res, false), res); + vertices(opts?: number | Partial) { + const [num, last] = isNumber(opts) ? + [opts, true] : + [ + opts.theta ? + Math.max(Math.ceil(1 + TAU / opts.theta), 2) : + opts.num, + opts.includeLast === true + ]; + return Vec2.mapBuffer(this.verticesRaw(0, TAU, num, last), num); } area() { @@ -98,13 +119,21 @@ export class Circle2 implements return c ? c.set(this.pos) : this.pos; } - toPolygon2(res = Circle2.DEFAULT_RES) { - return new Polygon2(this.vertices(res)); + toPolygon2(opts?: Partial) { + return new Polygon2(this.vertices(opts)); } toHiccup() { return ["circle", this.attribs, this.pos, this.r]; } + + toJSON() { + return { + type: "circle2", + pos: this.pos.toJSON(), + r: this.r, + }; + } } export const circle2 = (pos: Vec2, r = 1, attribs?: IObjectOf) => diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts index e59e0550ba..df5f25588b 100644 --- a/packages/geom/src/container2.ts +++ b/packages/geom/src/container2.ts @@ -3,6 +3,7 @@ import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { Mat23 } from "@thi.ng/vectors/mat23"; import { Vec2, vec2 } from "@thi.ng/vectors/vec2"; import { + CollateOpts, IBounds, ICentroid, ICollate, @@ -10,13 +11,12 @@ import { } from "./api"; import { bounds } from "./func/bounds"; import { convexHull2 } from "./func/convex-hull"; -import { Vec } from "@thi.ng/vectors/api"; export class PointContainer2 implements IBounds, ICentroid, ICollate, - IVertices { + IVertices { points: Vec2[]; attribs: IObjectOf; @@ -30,21 +30,30 @@ export class PointContainer2 implements yield* this.vertices(); } - collate(remap = true, buf: Vec, start = 0, cstride = 1, estride = 2) { - if (!remap) { - this.points = this._copy(); - } else { - const pts = this.points; - const n = pts.length; - buf = Vec2.intoBuffer(buf || new Array(start + n * estride).fill(0), pts, start, cstride, estride); - for (let i = 0; i < n; i++) { - const p = pts[i]; - p.buf = buf; - p.i = start + i * estride; - p.s = cstride; - } + collate(opts?: Partial) { + opts = { + start: 0, + cstride: 1, + estride: 2, + ...opts + }; + const { start, cstride, estride } = opts; + const pts = this.points; + const n = pts.length; + const buf = Vec2.intoBuffer( + opts.buf || new Array(start + n * estride).fill(0), + pts, + start, + cstride, + estride + ); + for (let i = 0; i < n; i++) { + const p = pts[i]; + p.buf = buf; + p.i = start + i * estride; + p.s = cstride; } - return this; + return buf; } vertices() { @@ -120,4 +129,16 @@ export class PointContainer2 implements protected _copy() { return Vec2.mapBuffer(Vec2.intoBuffer([], this.points), this.points.length); } + + protected _toJSON(type: string) { + return { + type, + attribs: this.attribs, + points: this.points.map((p) => p.toJSON()) + }; + } + + protected _toHiccup(type: string) { + return [type, this.attribs, this.vertices()]; + } } diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts index c5c046a93d..7fde4c3828 100644 --- a/packages/geom/src/container3.ts +++ b/packages/geom/src/container3.ts @@ -1,9 +1,9 @@ import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; -import { Vec } from "@thi.ng/vectors/api"; import { Mat44 } from "@thi.ng/vectors/mat44"; import { Vec3, vec3 } from "@thi.ng/vectors/vec3"; import { + CollateOpts, IBounds, ICentroid, ICollate, @@ -15,7 +15,7 @@ export class PointContainer3 implements IBounds, ICentroid, ICollate, - IVertices { + IVertices { points: Vec3[]; attribs: IObjectOf; @@ -29,21 +29,30 @@ export class PointContainer3 implements yield* this.vertices(); } - collate(remap = true, buf: Vec, start = 0, cstride = 1, estride = 3) { - if (!remap) { - this.points = this._copy(); - } else { - const pts = this.points; - const n = pts.length; - buf = Vec3.intoBuffer(buf || new Array(start + n * estride).fill(0), pts, start, cstride, estride); - for (let i = 0; i < n; i++) { - const p = pts[i]; - p.buf = buf; - p.i = start + i * estride; - p.s = cstride; - } + collate(opts?: Partial) { + opts = { + start: 0, + cstride: 1, + estride: 3, + ...opts + }; + const { start, cstride, estride } = opts; + const pts = this.points; + const n = pts.length; + const buf = Vec3.intoBuffer( + opts.buf || new Array(start + n * estride).fill(0), + pts, + start, + cstride, + estride + ); + for (let i = 0; i < n; i++) { + const p = pts[i]; + p.buf = buf; + p.i = start + i * estride; + p.s = cstride; } - return this; + return buf; } vertices() { diff --git a/packages/geom/src/poly2.ts b/packages/geom/src/poly2.ts index d6567bd156..29ba13d21d 100644 --- a/packages/geom/src/poly2.ts +++ b/packages/geom/src/poly2.ts @@ -55,7 +55,11 @@ export class Polygon2 extends PointContainer2 implements } toHiccup() { - return ["polygon", this.attribs || {}, this.vertices()]; + return this._toHiccup("polygon"); + } + + toJSON() { + return this._toJSON("polygon2"); } } diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts index e826fc2868..1fefb3fb03 100644 --- a/packages/geom/src/polyline2.ts +++ b/packages/geom/src/polyline2.ts @@ -37,7 +37,11 @@ export class Polyline2 extends PointContainer2 implements } toHiccup() { - return ["polyline", this.attribs, this.vertices()]; + return this._toHiccup("polyline"); + } + + toJSON() { + return this._toJSON("polyline2"); } } From 6094738eff45dadd052e5fe5a890c3d1d3cfef3a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 3 Oct 2018 12:07:28 +0100 Subject: [PATCH 50/77] feat(defmulti): add varargs support --- packages/defmulti/src/index.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/defmulti/src/index.ts b/packages/defmulti/src/index.ts index 4971ec70ca..3c1f974da4 100644 --- a/packages/defmulti/src/index.ts +++ b/packages/defmulti/src/index.ts @@ -5,24 +5,24 @@ import { illegalArity } from "@thi.ng/errors/illegal-arity"; export const DEFAULT: unique symbol = Symbol(); export type DispatchFn = (...args) => PropertyKey; -export type DispatchFn1 = (a: A) => PropertyKey; -export type DispatchFn2 = (a: A, b: B) => PropertyKey; -export type DispatchFn3 = (a: A, b: B, c: C) => PropertyKey; -export type DispatchFn4 = (a: A, b: B, c: C, d: D) => PropertyKey; -export type DispatchFn5 = (a: A, b: B, c: C, d: D, e: E) => PropertyKey; -export type DispatchFn6 = (a: A, b: B, c: C, d: D, e: E, f: F) => PropertyKey; -export type DispatchFn7 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => PropertyKey; -export type DispatchFn8 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) => PropertyKey; +export type DispatchFn1 = (a: A, ...xs: any[]) => PropertyKey; +export type DispatchFn2 = (a: A, b: B, ...xs: any[]) => PropertyKey; +export type DispatchFn3 = (a: A, b: B, c: C, ...xs: any[]) => PropertyKey; +export type DispatchFn4 = (a: A, b: B, c: C, d: D, ...xs: any[]) => PropertyKey; +export type DispatchFn5 = (a: A, b: B, c: C, d: D, e: E, ...xs: any[]) => PropertyKey; +export type DispatchFn6 = (a: A, b: B, c: C, d: D, e: E, f: F, ...xs: any[]) => PropertyKey; +export type DispatchFn7 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, ...xs: any[]) => PropertyKey; +export type DispatchFn8 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, ...xs: any[]) => PropertyKey; export type Implementation = (...args: any[]) => T; -export type Implementation1 = (a: A) => T; -export type Implementation2 = (a: A, b: B) => T; -export type Implementation3 = (a: A, b: B, c: C) => T; -export type Implementation4 = (a: A, b: B, c: C, d: D) => T; -export type Implementation5 = (a: A, b: B, c: C, d: D, e: E) => T; -export type Implementation6 = (a: A, b: B, c: C, d: D, e: E, f: F) => T; -export type Implementation7 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => T; -export type Implementation8 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H) => T; +export type Implementation1 = (a: A, ...xs: any[]) => T; +export type Implementation2 = (a: A, b: B, ...xs: any[]) => T; +export type Implementation3 = (a: A, b: B, c: C, ...xs: any[]) => T; +export type Implementation4 = (a: A, b: B, c: C, d: D, ...xs: any[]) => T; +export type Implementation5 = (a: A, b: B, c: C, d: D, e: E, ...xs: any[]) => T; +export type Implementation6 = (a: A, b: B, c: C, d: D, e: E, f: F, ...xs: any[]) => T; +export type Implementation7 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, ...xs: any[]) => T; +export type Implementation8 = (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, ...xs: any[]) => T; export interface MultiFn extends Implementation { add: (id: PropertyKey, g: Implementation) => boolean; From 221fb7f632eb3be4a04db6d9fe34b1e69fc82bb9 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 6 Oct 2018 14:57:42 +0100 Subject: [PATCH 51/77] feat(vectors): add collate & eqDelta fns, update ctors - update mapBuffer()/intoBuffer() args - add collate2/3/4() - add asVec2/3/4() - add eqDelta2/3/4buf() & eqDelta2/3/4array() - update Vec2/3/4 & Mat23/33 ctors --- packages/vectors/src/gvec.ts | 2 +- packages/vectors/src/mat23.ts | 2 +- packages/vectors/src/mat33.ts | 2 +- packages/vectors/src/math.ts | 2 +- packages/vectors/src/vec2.ts | 55 ++++++++++++++++++++++++++++++--- packages/vectors/src/vec3.ts | 55 ++++++++++++++++++++++++++++++--- packages/vectors/src/vec4.ts | 58 +++++++++++++++++++++++++++++++---- 7 files changed, 158 insertions(+), 18 deletions(-) diff --git a/packages/vectors/src/gvec.ts b/packages/vectors/src/gvec.ts index db9109c09c..a2fc59ec60 100644 --- a/packages/vectors/src/gvec.ts +++ b/packages/vectors/src/gvec.ts @@ -241,7 +241,7 @@ export class GVec implements return res; } - static intoBuffer(buf: Vec, src: Iterable>, start: number, cstride: number, estride: number) { + static intoBuffer(buf: Vec, src: Iterable>, start = 0, cstride: number, estride: number) { for (let v of src) { set(buf, v.buf, v.n, start, v.i, cstride, v.s); start += estride; diff --git a/packages/vectors/src/mat23.ts b/packages/vectors/src/mat23.ts index f0e5dd16c6..94df858c9f 100644 --- a/packages/vectors/src/mat23.ts +++ b/packages/vectors/src/mat23.ts @@ -239,7 +239,7 @@ export class Mat23 implements [id: number]: number; constructor(buf?: Mat, i = 0) { - this.buf = buf || (new Array(6).fill(0)); + this.buf = buf || [0, 0, 0, 0, 0, 0]; this.i = i; } diff --git a/packages/vectors/src/mat33.ts b/packages/vectors/src/mat33.ts index 13e9ea5c12..65318f112b 100644 --- a/packages/vectors/src/mat33.ts +++ b/packages/vectors/src/mat33.ts @@ -276,7 +276,7 @@ export class Mat33 implements [id: number]: number; constructor(buf?: Mat, i = 0) { - this.buf = buf || (new Array(9).fill(0)); + this.buf = buf || [0, 0, 0, 0, 0, 0, 0, 0, 0]; this.i = i; } diff --git a/packages/vectors/src/math.ts b/packages/vectors/src/math.ts index 70cce557db..5b1a6a9da9 100644 --- a/packages/vectors/src/math.ts +++ b/packages/vectors/src/math.ts @@ -43,7 +43,7 @@ export const eqDelta1 = (a: number, b: number, eps = EPS) => { }; /** - * Returns `a - b * n` + * Returns `a - b * floor(a/b)` * * @param a * @param b diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index 2ea4684217..89150d9925 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -94,6 +94,28 @@ export const eqDelta2 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia], b[ib], eps) && eqDelta1(a[ia + sa], b[ib + sb], eps); +export const eqDelta2buf = (a: ReadonlyVec, b: ReadonlyVec, num: number, eps = EPS, ia = 0, ib = 0, sca = 1, scb = 1, sea = 2, seb = 2) => { + while (--num >= 0) { + if (!eqDelta2(a, b, eps, ia + num * sea, ib + num * seb, sca, scb)) { + return false; + } + } + return true; +}; + +export const eqDelta2array = (a: ReadonlyVec[], b: ReadonlyVec[], eps = EPS) => { + const na = a.length; + if (b.length !== na) { + return false; + } + for (let i = 0; i < na; i++) { + if (!eqDelta2(a[i], b[i], eps)) { + return false; + } + } + return true; +}; + export const compare2 = ( a: ReadonlyVec, b: ReadonlyVec, @@ -111,6 +133,14 @@ export const compare2 = ( ax < bx ? -1 : 1; }; +export const collate2 = (buf: Vec, src: Iterable, start = 0, cstride = 1, estride = 2) => { + for (let v of src) { + set2(buf, v, start, 0, cstride, 1); + start += estride; + } + return buf; +}; + export const [ set2, setN2, add2, sub2, mul2, div2, @@ -283,6 +313,9 @@ export const majorAxis2 = (a: Vec, ia = 0, sa = 1) => export const vec2 = (x = 0, y = 0) => new Vec2([x, y]); +export const asVec2 = (x: ReadonlyVec) => + x instanceof Vec2 ? x : new Vec2([x[0] || 0, x[1] || 0]); + export class Vec2 implements IAngleBetween, ICopy, @@ -305,7 +338,7 @@ export class Vec2 implements /** * Returns array of memory mapped `Vec2` instances using given * backing array and stride settings: The `cstride` is the step size - * between individual XYZ vector components. `estride` is the step + * between individual XY vector components. `estride` is the step * size between successive vectors. This arrangement allows for * different storage approaches, incl. SOA, AOS, striped / * interleaved etc. @@ -316,7 +349,7 @@ export class Vec2 implements * @param cstride component stride * @param estride element stride */ - static mapBuffer(buf: Vec, n: number, start = 0, cstride = 1, estride = 2) { + static mapBuffer(buf: Vec, n: number = buf.length >> 1, start = 0, cstride = 1, estride = 2) { const res: Vec2[] = []; while (--n >= 0) { res.push(new Vec2(buf, start, cstride)); @@ -325,6 +358,20 @@ export class Vec2 implements return res; } + /** + * Merges given `src` iterable of `Vec2`s into single array `buf`. + * Vectors will be arranged according to given component and element + * strides, starting at `start` index. It's the user's + * responsibility to ensure the target buffer has sufficient + * capacity to hold the input vectors. See `Vec2.mapBuffer` for the + * reverse operation. Returns buffer. + * + * @param buf + * @param src + * @param start + * @param cstride + * @param estride + */ static intoBuffer(buf: Vec, src: Iterable>, start = 0, cstride = 1, estride = 2) { for (let v of src) { set2(buf, v.buf, start, v.i, cstride, v.s); @@ -457,8 +504,8 @@ export class Vec2 implements y: number; [id: number]: number; - constructor(buf: Vec, index = 0, stride = 1) { - this.buf = buf; + constructor(buf?: Vec, index = 0, stride = 1) { + this.buf = buf || [0, 0]; this.i = index; this.s = stride; } diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 7481e75579..5d4418c7f7 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -109,6 +109,28 @@ export const eqDelta3 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + sa], b[ib + sb], eps) && eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps); +export const eqDelta3buf = (a: ReadonlyVec, b: ReadonlyVec, num: number, eps = EPS, ia = 0, ib = 0, sca = 1, scb = 1, sea = 3, seb = 3) => { + while (--num >= 0) { + if (!eqDelta3(a, b, eps, ia + num * sea, ib + num * seb, sca, scb)) { + return false; + } + } + return true; +}; + +export const eqDelta3array = (a: ReadonlyVec[], b: ReadonlyVec[], eps = EPS) => { + const na = a.length; + if (b.length !== na) { + return false; + } + for (let i = 0; i < na; i++) { + if (!eqDelta3(a[i], b[i], eps)) { + return false; + } + } + return true; +}; + export const compare3 = ( a: ReadonlyVec, b: ReadonlyVec, @@ -130,6 +152,14 @@ export const compare3 = ( ax < bx ? -1 : 1; }; +export const collate3 = (buf: Vec, src: Iterable, start = 0, cstride = 1, estride = 3) => { + for (let v of src) { + set3(buf, v, start, 0, cstride, 1); + start += estride; + } + return buf; +}; + export const [ set3, setN3, add3, sub3, mul3, div3, @@ -347,6 +377,9 @@ export const majorAxis3 = (a: Vec, ia = 0, sa = 1) => export const vec3 = (x = 0, y = 0, z = 0) => new Vec3([x, y, z]); +export const asVec3 = (x: ReadonlyVec) => + x instanceof Vec3 ? x : new Vec3([x[0] || 0, x[1] || 0, x[2] || 0]); + export class Vec3 implements IAngleBetween, ICopy, @@ -380,7 +413,7 @@ export class Vec3 implements * @param cstride component stride * @param estride element stride */ - static mapBuffer(buf: Vec, n: number, start = 0, cstride = 1, estride = 3) { + static mapBuffer(buf: Vec, n = (buf.length / 3) | 0, start = 0, cstride = 1, estride = 3) { const res: Vec3[] = []; while (--n >= 0) { res.push(new Vec3(buf, start, cstride)); @@ -389,7 +422,21 @@ export class Vec3 implements return res; } - static intoBuffer(buf: Vec, src: Iterable>, start = 0, cstride = 1, estride = 2) { + /** + * Merges given `src` iterable of `Vec3`s into single array `buf`. + * Vectors will be arranged according to given component and element + * strides, starting at `start` index. It's the user's + * responsibility to ensure the target buffer has sufficient + * capacity to hold the input vectors. See `Vec3.mapBuffer` for the + * reverse operation. Returns buffer. + * + * @param buf + * @param src + * @param start + * @param cstride + * @param estride + */ + static intoBuffer(buf: Vec, src: Iterable>, start = 0, cstride = 1, estride = 3) { for (let v of src) { set3(buf, v.buf, start, v.i, cstride, v.s); start += estride; @@ -527,8 +574,8 @@ export class Vec3 implements z: number; [id: number]: number; - constructor(buf: Vec, index = 0, stride = 1) { - this.buf = buf; + constructor(buf?: Vec, index = 0, stride = 1) { + this.buf = buf || [0, 0, 0]; this.i = index; this.s = stride; } diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index a8caeaa783..c72aaaf28e 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -112,6 +112,28 @@ export const eqDelta4 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps) && eqDelta1(a[ia + 3 * sa], b[ib + 3 * sb], eps); +export const eqDelta4buf = (a: ReadonlyVec, b: ReadonlyVec, num: number, eps = EPS, ia = 0, ib = 0, sca = 1, scb = 1, sea = 4, seb = 4) => { + while (--num >= 0) { + if (!eqDelta4(a, b, eps, ia + num * sea, ib + num * seb, sca, scb)) { + return false; + } + } + return true; +}; + +export const eqDelta4array = (a: ReadonlyVec[], b: ReadonlyVec[], eps = EPS) => { + const na = a.length; + if (b.length !== na) { + return false; + } + for (let i = 0; i < na; i++) { + if (!eqDelta4(a[i], b[i], eps)) { + return false; + } + } + return true; +}; + export const compare4 = ( a: ReadonlyVec, b: ReadonlyVec, @@ -137,6 +159,14 @@ export const compare4 = ( ax < bx ? -1 : 1; }; +export const collate4 = (buf: Vec, src: Iterable, start = 0, cstride = 1, estride = 4) => { + for (let v of src) { + set4(buf, v, start, 0, cstride, 1); + start += estride; + } + return buf; +}; + export const [ set4, setN4, add4, sub4, mul4, div4, @@ -262,6 +292,9 @@ export const majorAxis4 = (a: Vec, ia = 0, sa = 1) => export const vec4 = (x = 0, y = 0, z = 0, w = 0) => new Vec4([x, y, z, w]); +export const asVec4 = (x: ReadonlyVec) => + x instanceof Vec4 ? x : new Vec4([x[0] || 0, x[1] || 0, x[2] || 0, x[3] || 0]); + export class Vec4 implements ICopy, ICompare, @@ -281,7 +314,7 @@ export class Vec4 implements /** * Returns array of memory mapped `Vec4` instances using given * backing array and stride settings: The `cstride` is the step size - * between individual XYZ vector components. `estride` is the step + * between individual XYZW vector components. `estride` is the step * size between successive vectors. This arrangement allows for * different storage approaches, incl. SOA, AOS, striped / * interleaved etc. @@ -292,7 +325,7 @@ export class Vec4 implements * @param cstride component stride * @param estride element stride */ - static mapBuffer(buf: Vec, n: number, start = 0, cstride = 1, estride = 4) { + static mapBuffer(buf: Vec, n = buf.length >> 2, start = 0, cstride = 1, estride = 4) { const res: Vec4[] = []; while (--n >= 0) { res.push(new Vec4(buf, start, cstride)); @@ -301,7 +334,21 @@ export class Vec4 implements return res; } - static intoBuffer(buf: Vec, src: Iterable>, start = 0, cstride = 1, estride = 2) { + /** + * Merges given `src` iterable of `Vec4`s into single array `buf`. + * Vectors will be arranged according to given component and element + * strides, starting at `start` index. It's the user's + * responsibility to ensure the target buffer has sufficient + * capacity to hold the input vectors. See `Vec4.mapBuffer` for the + * reverse operation. Returns buffer. + * + * @param buf + * @param src + * @param start + * @param cstride + * @param estride + */ + static intoBuffer(buf: Vec, src: Iterable>, start = 0, cstride = 1, estride = 4) { for (let v of src) { set4(buf, v.buf, start, v.i, cstride, v.s); start += estride; @@ -436,8 +483,8 @@ export class Vec4 implements w: number; [id: number]: number; - constructor(buf: Vec, index = 0, stride = 1) { - this.buf = buf; + constructor(buf?: Vec, index = 0, stride = 1) { + this.buf = buf || [0, 0, 0, 0]; this.i = index; this.s = stride; } @@ -474,7 +521,6 @@ export class Vec4 implements return compare4(this.buf, v.buf, o1, o2, o3, o4, this.i, v.i, this.s, v.s); } - set(v: Readonly) { set4(this.buf, v.buf, this.i, v.i, this.s, v.s); return this; From b2f9af93486e9489de02854e1cb95f781d453336 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 7 Oct 2018 21:49:01 +0100 Subject: [PATCH 52/77] refactor(vectors): replace static Vec2/3/4 methods w/ IVector impls --- packages/vectors/src/api.ts | 48 ++++++++- packages/vectors/src/gvec.ts | 56 ++++++++++ packages/vectors/src/vec2.ts | 204 ++++++++++++++++------------------- packages/vectors/src/vec3.ts | 204 ++++++++++++++++------------------- packages/vectors/src/vec4.ts | 202 ++++++++++++++++------------------ 5 files changed, 373 insertions(+), 341 deletions(-) diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 5c97039504..8cef9e4a61 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -1,4 +1,12 @@ -import { NumericArray } from "@thi.ng/api/api"; +import { + ICopy, + IEqualsDelta, + IEquiv, + NumericArray, + IEmpty, + ILength, + ICompare +} from "@thi.ng/api/api"; export type Vec = NumericArray; export type ReadonlyVec = ArrayLike & Iterable; @@ -74,13 +82,32 @@ export type Vec2Coord = 0 | 1; export type Vec3Coord = 0 | 1 | 2; export type Vec4Coord = 0 | 1 | 2 | 3; -export interface IVec { +export interface IVec extends ILength { buf: Vec; - length: number; i: number; s: number; } +export interface IVector extends + Iterable, + IVec, + ICopy, + ICompare, + IEmpty, + IEquiv, + IEqualsDelta, + IDistance, + IDotProduct, + IMagnitude, + IMath, + IMinMax, + IMix, + INormalize { + + set(v: T): T; + setN(n: number): T; +} + export interface IAngleBetween { angleBetween(v: Readonly, normalize?: boolean): number; } @@ -115,16 +142,31 @@ export interface IMath { maddN(v: Readonly, n: number): T; msub(v: Readonly, w: Readonly): T; msubN(v: Readonly, n: number): T; + addNew(v: Readonly, out?: T): T; + subNew(v: Readonly, out?: T): T; + mulNew(v: Readonly, out?: T): T; + divNew(v: Readonly, out?: T): T; + addNewN(n: number, out?: T): T; + subNewN(n: number, out?: T): T; + mulNewN(n: number, out?: T): T; + divNewN(n: number, out?: T): T; + maddNew(v: Readonly, w: Readonly, out?: T): T; + maddNewN(v: Readonly, n: number, out?: T): T; + msubNew(v: Readonly, w: Readonly, out?: T): T; + msubNewN(v: Readonly, n: number, out?: T): T; } export interface IMinMax { min(v: Readonly): T; max(v: Readonly): T; + clamp(min: Readonly, max: Readonly): T; } export interface IMix { mix(v: Readonly, t: Readonly): T; mixN(v: Readonly, t: number): T; + mixNew(v: Readonly, t: Readonly, out?: T): T; + mixNewN(v: Readonly, t: number, out?: T): T; } export interface INormalize { diff --git a/packages/vectors/src/gvec.ts b/packages/vectors/src/gvec.ts index a2fc59ec60..5bb68ea984 100644 --- a/packages/vectors/src/gvec.ts +++ b/packages/vectors/src/gvec.ts @@ -406,6 +406,62 @@ export class GVec implements return this; } + mixNew(b: Readonly, c: Readonly, out?: GVec) { + return (out || this.copy()).mix(b, c); + } + + mixNewN(v: Readonly, n = 0.5, out?: GVec) { + return (out || this.copy()).mixN(v, n); + } + + addNew(v: Readonly, out?: GVec) { + return (out || this.copy()).add(v); + } + + subNew(v: Readonly, out?: GVec) { + return (out || this.copy()).sub(v); + } + + mulNew(v: Readonly, out?: GVec) { + return (out || this.copy()).mul(v); + } + + divNew(v: Readonly, out?: GVec) { + return (out || this.copy()).div(v); + } + + addNewN(n: number, out?: GVec) { + return (out || this.copy()).addN(n); + } + + subNewN(n: number, out?: GVec) { + return (out || this.copy()).subN(n); + } + + mulNewN(n: number, out?: GVec) { + return (out || this.copy()).mulN(n); + } + + divNewN(n: number, out?: GVec) { + return (out || this.copy()).divN(n); + } + + maddNew(v: Readonly, w: Readonly, out?: GVec) { + return (out || this.copy()).madd(v, w); + } + + maddNewN(v: Readonly, n: number, out?: GVec) { + return (out || this.copy()).maddN(v, n); + } + + msubNew(v: Readonly, w: Readonly, out?: GVec) { + return (out || this.copy()).msub(v, w); + } + + msubNewN(v: Readonly, n: number, out?: GVec) { + return (out || this.copy()).msubN(v, n); + } + magSq() { return magSq(this.buf, this.n, this.i, this.s); } diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index 89150d9925..d372079ff1 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -1,23 +1,10 @@ -import { - ICompare, - ICopy, - IEqualsDelta, - IEquiv, - ILength -} from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { IAngleBetween, ICrossProduct, - IDistance, - IDotProduct, - IMagnitude, - IMath, - IMinMax, - IMix, - INormalize, IPolar, IVec, + IVector, MAX4, MIN4, ONE4, @@ -317,23 +304,10 @@ export const asVec2 = (x: ReadonlyVec) => x instanceof Vec2 ? x : new Vec2([x[0] || 0, x[1] || 0]); export class Vec2 implements + IVector, IAngleBetween, - ICopy, - ICompare, ICrossProduct, - IDistance, - IDotProduct, - IEqualsDelta, - IEquiv, - ILength, - IMagnitude, - IMath, - IMinMax, - IMix, - INormalize, - IPolar, - Iterable, - IVec { + IPolar { /** * Returns array of memory mapped `Vec2` instances using given @@ -402,90 +376,6 @@ export class Vec2 implements return new Vec2(randMinMax2([], min, max)); } - static add(a: Readonly, b: Readonly, out?: Vec2) { - !out && (out = new Vec2([])); - add2o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static sub(a: Readonly, b: Readonly, out?: Vec2) { - !out && (out = new Vec2([])); - sub2o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static mul(a: Readonly, b: Readonly, out?: Vec2) { - !out && (out = new Vec2([])); - mul2o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static div(a: Readonly, b: Readonly, out?: Vec2) { - !out && (out = new Vec2([])); - div2o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static addN(a: Readonly, n: number, out?: Vec2) { - !out && (out = new Vec2([])); - addN2o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static subN(a: Readonly, n: number, out?: Vec2) { - !out && (out = new Vec2([])); - subN2o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static mulN(a: Readonly, n: number, out?: Vec2) { - !out && (out = new Vec2([])); - mulN2o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static divN(a: Readonly, n: number, out?: Vec2) { - !out && (out = new Vec2([])); - divN2o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static madd(a: Readonly, b: Readonly, c: Readonly, out?: Vec2) { - out = out ? out.set(a) : a.copy(); - madd2(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); - return out; - } - - static maddN(a: Readonly, b: Readonly, n: number, out?: Vec2) { - out = out ? out.set(a) : a.copy(); - maddN2(out.buf, b.buf, n, out.i, b.i, out.s, b.s); - return out; - } - - static msub(a: Readonly, b: Readonly, c: Readonly, out?: Vec2) { - out = out ? out.set(a) : a.copy(); - msub2(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); - return out; - } - - static msubN(a: Readonly, b: Readonly, n: number, out?: Vec2) { - out = out ? out.set(a) : a.copy(); - msubN2(out.buf, b.buf, n, out.i, b.i, out.s, b.s); - return out; - } - - static mix(a: Readonly, b: Readonly, t: Readonly, out?: Vec2) { - !out && (out = new Vec2([])); - mix2o(out.buf, a.buf, b.buf, t.buf, out.i, a.i, b.i, t.i, out.s, a.s, b.s, t.s); - return out; - } - - static mixN(a: Readonly, b: Readonly, n = 0.5, out?: Vec2) { - !out && (out = new Vec2([])); - mixN2o(out.buf, a.buf, b.buf, n, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - static comparator(o1: Vec2Coord, o2: Vec2Coord) { return (a: Readonly, b: Readonly) => a.compare(b, o1, o2); } @@ -526,6 +416,10 @@ export class Vec2 implements return new Vec2(get2(this.buf, this.i, this.s)); } + empty() { + return new Vec2(); + } + equiv(v: any) { return v instanceof Vec2 ? equiv2(this.buf, v.buf, this.i, v.i, this.s, v.s) : @@ -612,6 +506,90 @@ export class Vec2 implements return this; } + addNew(b: Readonly, out?: Vec2) { + !out && (out = new Vec2([])); + add2o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + subNew(b: Readonly, out?: Vec2) { + !out && (out = new Vec2([])); + sub2o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + mulNew(b: Readonly, out?: Vec2) { + !out && (out = new Vec2([])); + mul2o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + divNew(b: Readonly, out?: Vec2) { + !out && (out = new Vec2([])); + div2o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + addNewN(n: number, out?: Vec2) { + !out && (out = new Vec2([])); + addN2o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + subNewN(n: number, out?: Vec2) { + !out && (out = new Vec2([])); + subN2o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + mulNewN(n: number, out?: Vec2) { + !out && (out = new Vec2([])); + mulN2o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + divNewN(n: number, out?: Vec2) { + !out && (out = new Vec2([])); + divN2o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + maddNew(b: Readonly, c: Readonly, out?: Vec2) { + out = out ? out.set(this) : this.copy(); + madd2(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + maddNewN(b: Readonly, n: number, out?: Vec2) { + out = out ? out.set(this) : this.copy(); + maddN2(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + msubNew(b: Readonly, c: Readonly, out?: Vec2) { + out = out ? out.set(this) : this.copy(); + msub2(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + msubNewN(b: Readonly, n: number, out?: Vec2) { + out = out ? out.set(this) : this.copy(); + msubN2(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + mixNew(b: Readonly, t: Readonly, out?: Vec2) { + !out && (out = new Vec2([])); + mix2o(out.buf, this.buf, b.buf, t.buf, out.i, this.i, b.i, t.i, out.s, this.s, b.s, t.s); + return out; + } + + mixNewN(b: Readonly, n = 0.5, out?: Vec2) { + !out && (out = new Vec2([])); + mixN2o(out.buf, this.buf, b.buf, n, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + neg() { mulN2(this.buf, -1, this.i, this.s); return this; diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 5d4418c7f7..5cda1b7da1 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -1,23 +1,10 @@ -import { - ICompare, - ICopy, - IEqualsDelta, - IEquiv, - ILength -} from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { IAngleBetween, ICrossProduct, - IDistance, - IDotProduct, - IMagnitude, - IMath, - IMinMax, - IMix, - INormalize, IPolar, IVec, + IVector, MAX4, MIN4, ONE4, @@ -381,23 +368,10 @@ export const asVec3 = (x: ReadonlyVec) => x instanceof Vec3 ? x : new Vec3([x[0] || 0, x[1] || 0, x[2] || 0]); export class Vec3 implements + IVector, IAngleBetween, - ICopy, - ICompare, ICrossProduct, - IDistance, - IDotProduct, - IEqualsDelta, - IEquiv, - ILength, - IMagnitude, - IMath, - IMinMax, - IMix, - INormalize, - IPolar, - Iterable, - IVec { + IPolar { /** * Returns array of memory mapped `Vec3` instances using given @@ -470,90 +444,6 @@ export class Vec3 implements return new Vec3(randMinMax3([], min, max)); } - static add(a: Readonly, b: Readonly, out?: Vec3) { - !out && (out = new Vec3([])); - add3o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static sub(a: Readonly, b: Readonly, out?: Vec3) { - !out && (out = new Vec3([])); - sub3o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static mul(a: Readonly, b: Readonly, out?: Vec3) { - !out && (out = new Vec3([])); - mul3o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static div(a: Readonly, b: Readonly, out?: Vec3) { - !out && (out = new Vec3([])); - div3o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static addN(a: Readonly, n: number, out?: Vec3) { - !out && (out = new Vec3([])); - addN3o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static subN(a: Readonly, n: number, out?: Vec3) { - !out && (out = new Vec3([])); - subN3o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static mulN(a: Readonly, n: number, out?: Vec3) { - !out && (out = new Vec3([])); - mulN3o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static divN(a: Readonly, n: number, out?: Vec3) { - !out && (out = new Vec3([])); - divN3o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static madd(a: Readonly, b: Readonly, c: Readonly, out?: Vec3) { - out = out ? out.set(a) : a.copy(); - madd3(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); - return out; - } - - static maddN(a: Readonly, b: Readonly, n: number, out?: Vec3) { - out = out ? out.set(a) : a.copy(); - maddN3(out.buf, b.buf, n, out.i, b.i, out.s, b.s); - return out; - } - - static msub(a: Readonly, b: Readonly, c: Readonly, out?: Vec3) { - out = out ? out.set(a) : a.copy(); - msub3(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); - return out; - } - - static msubN(a: Readonly, b: Readonly, n: number, out?: Vec3) { - out = out ? out.set(a) : a.copy(); - msubN3(out.buf, b.buf, n, out.i, b.i, out.s, b.s); - return out; - } - - static mix(a: Readonly, b: Readonly, t: Readonly, out?: Vec3) { - !out && (out = new Vec3([])); - mix3o(out.buf, a.buf, b.buf, t.buf, out.i, a.i, b.i, t.i, out.s, a.s, b.s, t.s); - return out; - } - - static mixN(a: Readonly, b: Readonly, n = 0.5, out?: Vec3) { - !out && (out = new Vec3([])); - mixN3o(out.buf, a.buf, b.buf, n, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - static comparator(o1: Vec3Coord, o2: Vec3Coord, o3: Vec3Coord) { return (a: Readonly, b: Readonly) => a.compare(b, o1, o2, o3); } @@ -596,6 +486,10 @@ export class Vec3 implements return new Vec3(get3(this.buf, this.i, this.s)); } + empty() { + return new Vec3(); + } + equiv(v: any) { return v instanceof Vec3 ? equiv3(this.buf, v.buf, this.i, v.i, this.s, v.s) : @@ -682,6 +576,90 @@ export class Vec3 implements return this; } + addNew(b: Readonly, out?: Vec3) { + !out && (out = new Vec3([])); + add3o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + subNew(b: Readonly, out?: Vec3) { + !out && (out = new Vec3([])); + sub3o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + mulNew(b: Readonly, out?: Vec3) { + !out && (out = new Vec3([])); + mul3o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + divNew(b: Readonly, out?: Vec3) { + !out && (out = new Vec3([])); + div3o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + addNewN(n: number, out?: Vec3) { + !out && (out = new Vec3([])); + addN3o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + subNewN(n: number, out?: Vec3) { + !out && (out = new Vec3([])); + subN3o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + mulNewN(n: number, out?: Vec3) { + !out && (out = new Vec3([])); + mulN3o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + divNewN(n: number, out?: Vec3) { + !out && (out = new Vec3([])); + divN3o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + maddNew(b: Readonly, c: Readonly, out?: Vec3) { + out = out ? out.set(this) : this.copy(); + madd3(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + maddNewN(b: Readonly, n: number, out?: Vec3) { + out = out ? out.set(this) : this.copy(); + maddN3(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + msubNew(b: Readonly, c: Readonly, out?: Vec3) { + out = out ? out.set(this) : this.copy(); + msub3(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + msubNewN(b: Readonly, n: number, out?: Vec3) { + out = out ? out.set(this) : this.copy(); + msubN3(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + mixNew(b: Readonly, t: Readonly, out?: Vec3) { + !out && (out = new Vec3([])); + mix3o(out.buf, this.buf, b.buf, t.buf, out.i, this.i, b.i, t.i, out.s, this.s, b.s, t.s); + return out; + } + + mixNewN(b: Readonly, n = 0.5, out?: Vec3) { + !out && (out = new Vec3([])); + mixN3o(out.buf, this.buf, b.buf, n, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + neg() { mulN3(this.buf, -1, this.i, this.s); return this; diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index c72aaaf28e..1aace60104 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -1,20 +1,7 @@ -import { - ICompare, - ICopy, - IEqualsDelta, - IEquiv, - ILength -} from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { - IDistance, - IDotProduct, - IMagnitude, - IMath, - IMinMax, - IMix, - INormalize, IVec, + IVector, MAX4, MIN4, ONE4, @@ -296,20 +283,7 @@ export const asVec4 = (x: ReadonlyVec) => x instanceof Vec4 ? x : new Vec4([x[0] || 0, x[1] || 0, x[2] || 0, x[3] || 0]); export class Vec4 implements - ICopy, - ICompare, - IDistance, - IDotProduct, - IEqualsDelta, - IEquiv, - ILength, - IMagnitude, - IMath, - IMinMax, - IMix, - INormalize, - Iterable, - IVec { + IVector { /** * Returns array of memory mapped `Vec4` instances using given @@ -378,90 +352,6 @@ export class Vec4 implements return new Vec4(randMinMax4([], min, max)); } - static add(a: Readonly, b: Readonly, out?: Vec4) { - !out && (out = new Vec4([])); - add4o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static sub(a: Readonly, b: Readonly, out?: Vec4) { - !out && (out = new Vec4([])); - sub4o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static mul(a: Readonly, b: Readonly, out?: Vec4) { - !out && (out = new Vec4([])); - mul4o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static div(a: Readonly, b: Readonly, out?: Vec4) { - !out && (out = new Vec4([])); - div4o(out.buf, a.buf, b.buf, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - - static addN(a: Readonly, n: number, out?: Vec4) { - !out && (out = new Vec4([])); - addN4o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static subN(a: Readonly, n: number, out?: Vec4) { - !out && (out = new Vec4([])); - subN4o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static mulN(a: Readonly, n: number, out?: Vec4) { - !out && (out = new Vec4([])); - mulN4o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static divN(a: Readonly, n: number, out?: Vec4) { - !out && (out = new Vec4([])); - divN4o(out.buf, a.buf, n, out.i, a.i, out.s, a.s); - return out; - } - - static madd(a: Readonly, b: Readonly, c: Readonly, out?: Vec4) { - out = out ? out.set(a) : a.copy(); - madd4(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); - return out; - } - - static maddN(a: Readonly, b: Readonly, n: number, out?: Vec4) { - out = out ? out.set(a) : a.copy(); - maddN4(out.buf, b.buf, n, out.i, b.i, out.s, b.s); - return out; - } - - static msub(a: Readonly, b: Readonly, c: Readonly, out?: Vec4) { - out = out ? out.set(a) : a.copy(); - msub4(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); - return out; - } - - static msubN(a: Readonly, b: Readonly, n: number, out?: Vec4) { - out = out ? out.set(a) : a.copy(); - msubN4(out.buf, b.buf, n, out.i, b.i, out.s, b.s); - return out; - } - - static mix(a: Readonly, b: Readonly, t: Readonly, out?: Vec4) { - !out && (out = new Vec4([])); - mix4o(out.buf, a.buf, b.buf, t.buf, out.i, a.i, b.i, t.i, out.s, a.s, b.s, t.s); - return out; - } - - static mixN(a: Readonly, b: Readonly, n = 0.5, out?: Vec4) { - !out && (out = new Vec4([])); - mixN4o(out.buf, a.buf, b.buf, n, out.i, a.i, b.i, out.s, a.s, b.s); - return out; - } - static comparator(o1: Vec4Coord, o2: Vec4Coord, o3: Vec4Coord, o4: Vec4Coord) { return (a: Readonly, b: Readonly) => a.compare(b, o1, o2, o3, o4); } @@ -505,6 +395,10 @@ export class Vec4 implements return new Vec4(get4(this.buf, this.i, this.s)); } + empty() { + return new Vec4(); + } + equiv(v: any) { return v instanceof Vec4 ? equiv4(this.buf, v.buf, this.i, v.i, this.s, v.s) : @@ -591,6 +485,90 @@ export class Vec4 implements return this; } + addNew(b: Readonly, out?: Vec4) { + !out && (out = new Vec4([])); + add4o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + subNew(b: Readonly, out?: Vec4) { + !out && (out = new Vec4([])); + sub4o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + mulNew(b: Readonly, out?: Vec4) { + !out && (out = new Vec4([])); + mul4o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + divNew(b: Readonly, out?: Vec4) { + !out && (out = new Vec4([])); + div4o(out.buf, this.buf, b.buf, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + + addNewN(n: number, out?: Vec4) { + !out && (out = new Vec4([])); + addN4o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + subNewN(n: number, out?: Vec4) { + !out && (out = new Vec4([])); + subN4o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + mulNewN(n: number, out?: Vec4) { + !out && (out = new Vec4([])); + mulN4o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + divNewN(n: number, out?: Vec4) { + !out && (out = new Vec4([])); + divN4o(out.buf, this.buf, n, out.i, this.i, out.s, this.s); + return out; + } + + maddNew(b: Readonly, c: Readonly, out?: Vec4) { + out = out ? out.set(this) : this.copy(); + madd4(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + maddNewN(b: Readonly, n: number, out?: Vec4) { + out = out ? out.set(this) : this.copy(); + maddN4(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + msubNew(b: Readonly, c: Readonly, out?: Vec4) { + out = out ? out.set(this) : this.copy(); + msub4(out.buf, b.buf, c.buf, out.i, b.i, c.i, out.s, b.s, c.s); + return out; + } + + msubNewN(b: Readonly, n: number, out?: Vec4) { + out = out ? out.set(this) : this.copy(); + msubN4(out.buf, b.buf, n, out.i, b.i, out.s, b.s); + return out; + } + + mixNew(b: Readonly, t: Readonly, out?: Vec4) { + !out && (out = new Vec4([])); + mix4o(out.buf, this.buf, b.buf, t.buf, out.i, this.i, b.i, t.i, out.s, this.s, b.s, t.s); + return out; + } + + mixNewN(b: Readonly, n = 0.5, out?: Vec4) { + !out && (out = new Vec4([])); + mixN4o(out.buf, this.buf, b.buf, n, out.i, this.i, b.i, out.s, this.s, b.s); + return out; + } + neg() { mulN4(this.buf, -1, this.i, this.s); return this; From ff435be6a0bf9f1ed3c7472444892d7d596b231f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 7 Oct 2018 21:51:54 +0100 Subject: [PATCH 53/77] minor(hdom-canvas): rename arc() => circularArc() --- packages/hdom-canvas/src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/hdom-canvas/src/index.ts b/packages/hdom-canvas/src/index.ts index 051a2d8df2..8ba540746c 100644 --- a/packages/hdom-canvas/src/index.ts +++ b/packages/hdom-canvas/src/index.ts @@ -253,10 +253,10 @@ const walk = (ctx: CanvasRenderingContext2D, shape: any[], pstate: DrawState) => rect(ctx, attribs, shape[2], shape[3], shape[4], shape[5]); break; case "circle": - arc(ctx, attribs, shape[2], shape[3]); + circularArc(ctx, attribs, shape[2], shape[3]); break; case "arc": - arc(ctx, attribs, shape[2], shape[3], shape[4], shape[5]); + circularArc(ctx, attribs, shape[2], shape[3], shape[4], shape[5]); break; case "text": text(ctx, attribs, shape[2], shape[3]); @@ -556,7 +556,7 @@ const path = (ctx: CanvasRenderingContext2D, endShape(ctx, attribs); }; -const arc = (ctx: CanvasRenderingContext2D, +const circularArc = (ctx: CanvasRenderingContext2D, attribs: IObjectOf, pos: ReadonlyVec, r: number, From d655ec293c84787634f61a1926dbcf940855df5a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Mon, 8 Oct 2018 03:55:55 +0100 Subject: [PATCH 54/77] feat(geom): re-import & refactor partial port of thi.ng/geom (clojure) --- packages/geom/package.json | 2 +- packages/geom/src/api.ts | 220 +++++++-- packages/geom/src/arc2.ts | 156 +++++- packages/geom/src/bezier2.ts | 256 ++++++++++ packages/geom/src/circle2.ts | 155 +++--- packages/geom/src/container2.ts | 91 ++-- packages/geom/src/container3.ts | 56 +-- packages/geom/src/fit.ts | 42 ++ packages/geom/src/func/bounds.ts | 10 - packages/geom/src/func/sample-uniform.ts | 25 - packages/geom/src/index.ts | 12 +- .../geom/src/{func => internal}/arc-length.ts | 4 +- packages/geom/src/internal/bounds.ts | 31 ++ packages/geom/src/internal/centroid.ts | 28 ++ .../src/{func => internal}/circumcenter.ts | 0 packages/geom/src/internal/closest-point.ts | 99 ++++ packages/geom/src/internal/collate.ts | 37 ++ .../geom/src/{func => internal}/corner.ts | 0 .../internal/douglas\342\200\223peucker.ts" | 41 ++ packages/geom/src/{func => internal}/edges.ts | 2 +- .../graham-scan.ts} | 10 +- .../geom/src/internal/line-intersection.ts | 31 ++ .../geom/src/internal/sutherland-hodgeman.ts | 42 ++ packages/geom/src/line2.ts | 80 ++++ packages/geom/src/path2.ts | 444 ++++++++++++++++++ packages/geom/src/poly2.ts | 67 --- packages/geom/src/polygon2.ts | 125 +++++ packages/geom/src/polyline2.ts | 40 +- packages/geom/src/rect2.ts | 158 +++++++ packages/geom/src/sampler.ts | 72 +++ packages/geom/src/subdiv-curve.ts | 80 ++++ packages/geom/test/circle2.ts | 125 +++++ packages/geom/test/index.ts | 31 -- packages/geom/test/poly2.ts | 37 ++ packages/geom/tsconfig.json | 2 +- 35 files changed, 2233 insertions(+), 378 deletions(-) create mode 100644 packages/geom/src/bezier2.ts create mode 100644 packages/geom/src/fit.ts delete mode 100644 packages/geom/src/func/bounds.ts delete mode 100644 packages/geom/src/func/sample-uniform.ts rename packages/geom/src/{func => internal}/arc-length.ts (64%) create mode 100644 packages/geom/src/internal/bounds.ts create mode 100644 packages/geom/src/internal/centroid.ts rename packages/geom/src/{func => internal}/circumcenter.ts (100%) create mode 100644 packages/geom/src/internal/closest-point.ts create mode 100644 packages/geom/src/internal/collate.ts rename packages/geom/src/{func => internal}/corner.ts (100%) create mode 100644 "packages/geom/src/internal/douglas\342\200\223peucker.ts" rename packages/geom/src/{func => internal}/edges.ts (73%) rename packages/geom/src/{func/convex-hull.ts => internal/graham-scan.ts} (81%) create mode 100644 packages/geom/src/internal/line-intersection.ts create mode 100644 packages/geom/src/internal/sutherland-hodgeman.ts create mode 100644 packages/geom/src/line2.ts create mode 100644 packages/geom/src/path2.ts delete mode 100644 packages/geom/src/poly2.ts create mode 100644 packages/geom/src/polygon2.ts create mode 100644 packages/geom/src/rect2.ts create mode 100644 packages/geom/src/sampler.ts create mode 100644 packages/geom/src/subdiv-curve.ts create mode 100644 packages/geom/test/circle2.ts delete mode 100644 packages/geom/test/index.ts create mode 100644 packages/geom/test/poly2.ts diff --git a/packages/geom/package.json b/packages/geom/package.json index abdc70f26c..de2f784d71 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -13,7 +13,7 @@ "license": "Apache-2.0", "scripts": { "build": "yarn run clean && tsc --declaration", - "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc func", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc internal", "cover": "yarn test && nyc report --reporter=lcov", "doc": "node_modules/.bin/typedoc --mode modules --out doc src", "pub": "yarn run build && yarn publish --access public", diff --git a/packages/geom/src/api.ts b/packages/geom/src/api.ts index f443441a99..ef1b00faaa 100644 --- a/packages/geom/src/api.ts +++ b/packages/geom/src/api.ts @@ -1,10 +1,104 @@ -import { ICopy } from "@thi.ng/api/api"; -import { IDistance, IMix, Vec } from "@thi.ng/vectors/api"; +import { IObjectOf } from "@thi.ng/api/api"; +import { Vec, ReadonlyVec, IVector } from "@thi.ng/vectors/api"; +import { Vec2 } from "@thi.ng/vectors/vec2"; -export type SampleableVector = - ICopy & - IDistance & - IMix; +export const DEFAULT_SAMPLES = 32; + +export type Attribs = IObjectOf; + +export const enum LineIntersectionType { + PARALLEL, + COINCIDENT, + COINCIDENT_NO_INTERSECT, + INTERSECT, + INTERSECT_OUTSIDE, +} + +export const enum SegmentType { + MOVE, + LINE, + POLYLINE, + ARC, + CUBIC, + QUADRATIC, + CLOSE, +} + +export interface CollateOpts { + buf: Vec; + start: number; + cstride: number; + estride: number; +} + +export interface LineIntersection { + type: LineIntersectionType; + isec?: T; + det?: number; + alpha?: number; + beta?: number; +} + +export interface PathSegment { + type: SegmentType; + point?: Vec2; + geo?: IBoundsRaw & IVertices; +} + +export interface SamplingOpts { + /** + * Number of points to sample & return. Defaults to the implementing + * type's `DEFAULT_RES` if neither this nor `theta` option is given + * (see `ArcSamplingOpts`). + */ + num: number; + /** + * Approximate desired distance between sampled result points. If + * given, takes priority over the `num` option, but the latter MIGHT + * be used as part of the sampling process (implementation + * specific). Note: For circles this value is interpreted as arc + * length, not cartesian distance (error will be proportional to the + * given value relative to the circle's radius). + */ + dist: number; + /** + * Currently only used by these types: + * + * - Arc2 + * - Circle2 + * + * Defines the target angle between sampled points. If greater than + * the actual range of the arc, only the two end points will be + * returned at most. This option is used to derive a `num` value and + * takes priority if `num` is given as well. + * + * This option is useful to adapt the sampling based on angular + * resolution, rather than a fixed number of samples. + */ + theta: number; + /** + * If `true`, the shape's end point will be included in the result + * array. The default setting for open geometries is `true`, for + * closed ones `false`. This option has no influence on any internal + * resolution calculation. + * + * For open geometry this option is useful to when re-sampling paths + * of consecutive segments, where the end points of each segment + * coincide with the start points of the next segment. For all but + * the last segment, this option should be `false` and so can be + * used to avoid duplicate vertices in the concatenated result. + * + * When sampling closed shapes, enabling this option will include an + * extra point (start), i.e. if the `num` option was given, results + * in `num+1` points. + */ + last: boolean; +} + +export interface SubdivKernel> { + fn: (pts: T[], i: number, nump: number) => T[]; + size: number; +} export interface IArea { /** @@ -24,50 +118,18 @@ export interface IArcLength { arcLength(): number; } -export interface ArcSamplingOpts { +export interface IBoundsRaw { /** - * Number of points to sample & return. Defaults to - * `Arc2.DEFAULT_RES` if neither this nor `theta` option is given. + * @return min / max points */ - num: number; - /** - * Target angle between sampled points. If greater than the actual - * range of the arc, only the 2 end points will be returned. This - * option is used to derive a `num` value and will take priority if - * `num` is given as well. - * - * This option is useful to adapt the sampling based on actual angle - * range, rather than a fixed number of samples. - */ - theta: number; - /** - * If `false` (default), the arc's end point will be omitted from - * the result array and if `num` option was given, results in - * `num-1` points. However, this option has no influence on the - * angular resolution calculation. - * - * This option is useful when building paths of consecutive - * segments, where the end point of one segment coincides with the - * start point of the next segment and so can be used to avoid - * duplicate vertices in the concatenated result. - */ - includeLast: boolean; + boundsRaw(): [V, V]; } export interface IBounds { - bounds(): T; - /** - * Dimension along x-axis. - */ - width(): number; - /** - * Dimension along y-axis. - */ - height(): number; /** - * Dimension along z-axis. + * Bounding shape */ - depth(): number; + bounds(): T; } export interface ICentroid { @@ -80,13 +142,6 @@ export interface ICentroid { centroid(c?: T): T; } -export interface CollateOpts { - buf: Vec; - start: number; - cstride: number; - estride: number; -} - export interface ICollate { /** * Collates all points into a single buffer and remaps existing @@ -102,11 +157,72 @@ export interface IEdges { edges(opts?: any): Iterable; } -export interface IToPolygon2 { +export interface IToPolygon { // FIXME return type should be interface - toPolygon2(opts?: any): any; + toPolygon(opts?: O): any; +} + +export interface ITransformable { + transform(mat: M): this; +} + +export interface IUnion { + union(x: T): T; } export interface IVertices { vertices(opts?: O): Iterable; } + +export interface JsonShape { + type: string; + attribs?: Attribs; +} + +export interface JsonArc2 extends JsonShape { + pos: Vec; + r: Vec; + axis: number; + start: number; + end: number; + xl: boolean; + clockwise: boolean; +} + +export interface JsonCircle2 extends JsonShape { + pos: Vec; + r: number; +} + +export interface JsonPolygon2 extends JsonShape { + pos: Vec; + points: Vec[]; +} + +export interface JsonPolyline2 extends JsonShape { + pos: Vec; + points: Vec[]; +} + +export interface JsonRect2 extends JsonShape { + pos: Vec; + size: Vec[]; +} + +export type HiccupArc2 = + ["arc", Attribs, ReadonlyVec, ReadonlyVec, number, number, number, boolean, boolean]; + +export type HiccupCircle2 = + ["circle", Attribs, ReadonlyVec, number]; + +export type HiccupLine2 = + ["line", Attribs, ReadonlyVec, ReadonlyVec]; + +export type HiccupPolygon2 = + ["polygon", Attribs, number[] | number[][]]; + +export type HiccupPolyline2 = + ["polyline", Attribs, number[] | number[][]]; + +export type HiccupRect2 = + ["rect", Attribs, ReadonlyVec, number, number, number?]; diff --git a/packages/geom/src/arc2.ts b/packages/geom/src/arc2.ts index 6dc5940f5c..c832a73ab3 100644 --- a/packages/geom/src/arc2.ts +++ b/packages/geom/src/arc2.ts @@ -1,18 +1,70 @@ import { isNumber } from "@thi.ng/checks/is-number"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { range } from "@thi.ng/transducers/iter/range"; +import { push } from "@thi.ng/transducers/rfn/push"; +import { transduce } from "@thi.ng/transducers/transduce"; +import { filter } from "@thi.ng/transducers/xform/filter"; +import { map } from "@thi.ng/transducers/xform/map"; import { Vec } from "@thi.ng/vectors/api"; -import { TAU } from "@thi.ng/vectors/math"; +import { + HALF_PI, + inRange1, + mix1, + PI, + TAU +} from "@thi.ng/vectors/math"; import { add2, + asVec2, rotate2, setS2, Vec2 } from "@thi.ng/vectors/vec2"; -import { ArcSamplingOpts, IEdges, IVertices } from "./api"; -import { edges } from "./func/edges"; +import { + Attribs, + DEFAULT_SAMPLES, + HiccupArc2, + IBounds, + IEdges, + IVertices, + JsonArc2, + SamplingOpts +} from "./api"; +import { bounds } from "./internal/bounds"; +import { edges } from "./internal/edges"; +import { Rect2 } from "./rect2"; +import { Sampler } from "./sampler"; export class Arc2 implements + IBounds, IEdges, - IVertices> { + IVertices> { + + static fromJSON(spec: JsonArc2) { + return new Arc2( + new Vec2(spec.pos), + new Vec2(spec.r), + spec.axis, + spec.start, + spec.end, + spec.xl, + spec.clockwise, + spec.attribs + ); + } + + static fromHiccup(spec: HiccupArc2) { + return new Arc2( + asVec2(spec[2]), + asVec2(spec[3]), + spec[4], + spec[5], + spec[6], + spec[7], + spec[8], + spec[1] + ); + } static from2Points( a: Readonly, @@ -25,7 +77,7 @@ export class Arc2 implements const r = radii.copy().abs(); const co = Math.cos(axisTheta); const si = Math.sin(axisTheta); - const m = Vec2.sub(a, b).mulN(0.5); + const m = a.subNew(b).mulN(0.5); const p = new Vec2([co * m.x + si * m.y, -si * m.x + co * m.y]); const px2 = p.x * p.x; const py2 = p.y * p.y; @@ -38,7 +90,7 @@ export class Arc2 implements const root = ((large === clockwise) ? -1 : 1) * Math.sqrt(Math.abs((rx2 * ry2 - rxpy - rypx)) / (rxpy + rypx)); const tc = new Vec2([r.x * p.y / r.y, -r.y * p.x / r.x]).mulN(root); - const c = new Vec2([co * tc.x - si * tc.y, si * tc.x + co * tc.y]).add(Vec2.mixN(a, b)); + const c = new Vec2([co * tc.x - si * tc.y, si * tc.x + co * tc.y]).add(a.mixNewN(b)); const d1 = new Vec2([(p.x - tc.x) / r.x, (p.y - tc.y) / r.y]); const d2 = new Vec2([(-p.x - tc.x) / r.x, (-p.y - tc.y) / r.y]); const theta = Vec2.X_AXIS.angleBetween(d1, true); @@ -51,8 +103,6 @@ export class Arc2 implements return new Arc2(c, r, axisTheta, theta, theta + delta, large, clockwise); } - static DEFAULT_RES = 20; - pos: Vec2; r: Vec2; axis: number; @@ -60,8 +110,18 @@ export class Arc2 implements end: number; xl: boolean; clockwise: boolean; + attribs: Attribs; + + constructor( + pos: Vec2, + r: Vec2, + axis: number, + start: number, + end: number, + xl = false, + clockwise = false, + attribs?: Attribs) { - constructor(pos: Vec2, r: Vec2, axis: number, start: number, end: number, xl = false, clockwise = false) { this.pos = pos; this.r = r; this.axis = axis; @@ -69,24 +129,75 @@ export class Arc2 implements this.end = end; this.clockwise = clockwise; this.xl = xl; + this.attribs = attribs; } - edges(opts?: Partial) { + copy() { + return new Arc2( + this.pos.copy(), + this.r.copy(), + this.axis, + this.start, + this.end, + this.xl, + this.clockwise, + { ...this.attribs } + ); + } + + boundsRaw() { + // https://stackoverflow.com/a/1336739/294515 + const pts = transduce( + map(this.pointAtTheta.bind(this)), + push(), + [ + this.start, + this.end, + // multiples of HALF_PI in arc range + ...filter( + (t: number) => inRange1(t, this.start, this.end), + range(-3 * PI, 3.01 * PI, HALF_PI) + ) + ] + ); + return bounds(pts, Vec2.MAX.copy(), Vec2.MIN.copy()); + } + + bounds() { + return Rect2.fromMinMax(...this.boundsRaw()); + } + + edges(opts?: number | Partial) { return edges(this.vertices(opts)); } - vertices(opts?: number | Partial) { + pointAt(t: number) { + return this.pointAtTheta(mix1(this.start, this.end, t)); + } + + pointAtTheta(theta: number) { + return new Vec2([Math.cos(theta), Math.sin(theta)]) + .mul(this.r) + .rotate(this.axis) + .add(this.pos); + } + + vertices(opts?: number | Partial): Vec2[] { + if (isPlainObject(opts) && (opts).dist !== undefined) { + return new Sampler(this.vertices((opts).num || DEFAULT_SAMPLES)) + .sampleUniform((opts).dist, (opts).last !== false); + } opts = isNumber(opts) ? - { num: opts, includeLast: true } : - { num: Arc2.DEFAULT_RES, ...opts }; + { num: opts, last: true } : + { num: DEFAULT_SAMPLES, ...opts }; let num: number; const start = this.start; let delta = this.end - start; num = opts.theta ? - Math.max(Math.ceil(1 + delta / opts.theta), 2) : + Math.round(delta / opts.theta) : opts.num; - delta /= (num - 1); - opts.includeLast !== true && num--; + delta /= num; + opts.last !== false && num++; const pts: Vec = new Array(num * 2); const pos = this.pos; const [rx, ry] = this.r; @@ -100,15 +211,24 @@ export class Arc2 implements return Vec2.mapBuffer(pts, num); } - toJSON() { + toHiccup() { + return ["path", this.attribs, [ + ["M", this.pointAtTheta(this.start)], + ["A", this.r, this.axis, this.xl, this.clockwise, this.pointAtTheta(this.end)] + ]]; + } + + toJSON(): JsonArc2 { return { type: "arc2", pos: this.pos.toJSON(), r: this.r.toJSON(), start: this.start, end: this.end, + axis: this.axis, xl: this.xl, - clockwise: this.clockwise + clockwise: this.clockwise, + attribs: this.attribs, }; } } diff --git a/packages/geom/src/bezier2.ts b/packages/geom/src/bezier2.ts new file mode 100644 index 0000000000..72ead24645 --- /dev/null +++ b/packages/geom/src/bezier2.ts @@ -0,0 +1,256 @@ +import { ICopy } from "@thi.ng/api"; +import { isNumber } from "@thi.ng/checks/is-number"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { IMath } from "@thi.ng/vectors/api"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { + DEFAULT_SAMPLES, + IVertices, + SamplingOpts +} from "./api"; +import { PointContainer2 } from "./container2"; +import { Sampler } from "./sampler"; +import { clamp1 } from "@thi.ng/vectors/math"; + +export const mixQuadratic1 = (a: number, b: number, c: number, t: number) => { + const s = 1 - t; + return a * s * s + b * 2 * s * t + c * t * t; +}; + +export const mixCubic1 = (a: number, b: number, c: number, d: number, t: number) => { + const t2 = t * t; + const s = 1 - t; + const s2 = s * s; + return a * s2 * s + b * 3 * s2 * t + c * 3 * t2 * s + d * t2 * t; +}; + +export const mixQuadratic = & IMath>(a: T, b: T, c: T, t: number) => { + const s = 1 - t; + return a.copy().mulN(s * s) + .maddN(b, 2 * s * t) + .maddN(c, t * t); +}; + +export const mixCubic = & IMath>(a: T, b: T, c: T, d: T, t: number) => { + const t2 = t * t; + const s = 1 - t; + const s2 = s * s; + return a.copy().mulN(s2 * s) + .maddN(b, 3 * s2 * t) + .maddN(c, 3 * t2 * s) + .maddN(d, t2 * t); +}; + +const cubicAxisBounds = (pa: number, pb: number, pc: number, pd: number) => { + let a = 3 * pd - 9 * pc + 9 * pb - 3 * pa; + let b = 6 * pa - 12 * pb + 6 * pc; + let c = 3 * pb - 3 * pa; + let disc = b * b - 4 * a * c; + let l = pa; + let h = pa; + + const bounds = (t: number) => { + if (t > 0 && t < 1) { + const x = mixCubic1(pa, pb, pc, pd, t); + x < l && (l = x); + x > h && (h = x); + } + }; + + pd < l && (l = pd); + pd > h && (h = pd); + if (disc >= 0) { + disc = Math.sqrt(disc); + a *= 2; + bounds((-b + disc) / a); + bounds((-b - disc) / a); + } + return [l, h]; +}; + +export class Cubic2 extends PointContainer2 implements + IVertices> { + + copy() { + return new Cubic2(this._copy(), this.attribs); + } + + boundsRaw(): [Vec2, Vec2] { + // https://stackoverflow.com/a/24814530/294515 + // https://iquilezles.org/www/articles/bezierbbox/bezierbbox.htm + const [a, b, c, d] = this.points; + const x = cubicAxisBounds(a.x, b.x, c.x, d.x); + const y = cubicAxisBounds(a.y, b.y, c.y, d.y); + return Vec2.mapBuffer([x[0], y[0], x[1], y[1]], 2); + } + + pointAt(t: number) { + const pts = this.points; + return mixCubic(pts[0], pts[1], pts[2], pts[3], t); + } + + /** + * Splits curve into 2 sub-curves at position `t`. + * + * http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm + * + * @param t + */ + splitAt(t: number): [Cubic2, Cubic2] { + const [a, b, c, d] = this.points; + if (t <= 0 || t >= 1) { + const p = t <= 0 ? a : d; + const c1 = new Cubic2(Vec2.mapBuffer([p.x, p.y, p.x, p.y, p.x, p.y], 4)); + const c2 = new Cubic2(Vec2.mapBuffer([a.x, a.y, b.x, b.y, c.x, c.y, d.x, d.y], 4)); + return t <= 0 ? [c1, c2] : [c2, c1]; + } + const ab = a.mixNewN(b, t); + const bc = b.mixNewN(c, t); + const cd = c.mixNewN(d, t); + const abc = ab.mixNewN(bc, t); + const bcd = bc.mixNewN(cd, t); + const p = abc.mixNewN(bcd, t); + return [ + new Cubic2(Vec2.mapBuffer([a.x, a.y, ab.x, ab.y, abc.x, abc.y, p.x, p.y], 4)), + new Cubic2(Vec2.mapBuffer([p.x, p.y, bcd.x, bcd.y, cd.x, cd.y, d.x, d.y], 4)) + ]; + } + + vertices(opts?: Partial) { + if (isPlainObject(opts) && (opts).dist !== undefined) { + return new Sampler(this.vertices((opts).num || DEFAULT_SAMPLES)) + .sampleUniform((opts).dist, (opts).last !== false); + } + opts = isNumber(opts) ? + { + num: opts, + last: true + } : + { + num: DEFAULT_SAMPLES, + ...opts + }; + const res: number[] = []; + const [a, b, c, d] = this.points; + const delta = 1 / opts.num; + for (let t = 0; t < opts.num; t++) { + res.push( + mixCubic1(a.x, b.x, c.x, d.x, t * delta), + mixCubic1(a.y, b.y, c.y, d.y, t * delta) + ); + } + opts.last && res.push(d.x, d.y); + return Vec2.mapBuffer(res); + } + + toHiccup() { + const pts = this.points; + return ["path", this.attribs, [["M", pts[0]], ["C", pts[1], pts[2], pts[3]]]]; + } +} + +// https://github.com/uxebu/bonsai/blob/master/src/runner/path/curved_path.js +export class Quadratic2 extends PointContainer2 implements + IVertices> { + + copy() { + return new Quadratic2(this._copy(), this.attribs); + } + + boundsRaw(): [Vec2, Vec2] { + const [a, b, c] = this.points; + const mi = a.copy().min(c); + const ma = a.copy().max(c); + const solve = (a, b, c) => { + const t = clamp1((a - b) / (a - 2.0 * b + c), 0, 1); + const s = 1 - t; + return s * s * a + 2.0 * s * t * b + t * t * c; + }; + if (b.x < mi.x || b.x > ma.x || b.y < mi.y || b.y > ma.y) { + const q = new Vec2([ + solve(a.x, b.x, c.x), + solve(a.y, b.y, c.y), + ]); + mi.min(q); + ma.max(q); + } + return [mi, ma]; + } + + pointAt(t: number) { + const pts = this.points; + return mixQuadratic(pts[0], pts[1], pts[2], t); + } + + /** + * Splits curve into 2 sub-curves at position `t`. + * + * http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm + * + * @param t + */ + splitAt(t: number): [Quadratic2, Quadratic2] { + const [a, b, c] = this.points; + if (t == 0) { + return [ + new Quadratic2(this._copy([a, a, a])), + new Quadratic2(this._copy([a, b, c])) + ]; + } + if (t == 1) { + return [ + new Quadratic2(this._copy([a, b, c])), + new Quadratic2(this._copy([c, c, c])) + ]; + } + const ab = a.mixNewN(b, t); + const bc = b.mixNewN(c, t); + const p = ab.mixNewN(bc, t); + return [ + new Quadratic2([a.copy(), ab, p]), + new Quadratic2([p, bc, c.copy()]) + ]; + } + + vertices(opts?: number | Partial) { + if (isPlainObject(opts) && (opts).dist !== undefined) { + return new Sampler(this.vertices((opts).num || DEFAULT_SAMPLES)) + .sampleUniform((opts).dist, (opts).last !== false); + } + opts = isNumber(opts) ? + { + num: opts, + last: true + } : + { + num: DEFAULT_SAMPLES, + ...opts + }; + const res: number[] = []; + const delta = 1 / opts.num; + const [a, b, c] = this.points; + for (let t = 0; t < opts.num; t++) { + res.push( + mixQuadratic1(a.x, b.x, c.x, t * delta), + mixQuadratic1(a.y, b.y, c.y, t * delta) + ); + } + opts.last && res.push(c.x, c.y); + return Vec2.mapBuffer(res); + } + + toCubic() { + const [a, b, c] = this.points; + return new Cubic2([ + a.copy(), + a.mulNewN(1 / 3).maddN(b, 2 / 3), + c.mulNewN(1 / 3).maddN(b, 2 / 3), + c.copy() + ]); + } + + toHiccup() { + const pts = this.points; + return ["path", this.attribs, [["M", pts[0]], ["Q", pts[1], pts[2]]]]; + } +} diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index c6dbac0c51..15cbd296c3 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -1,28 +1,51 @@ import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; import { isNumber } from "@thi.ng/checks/is-number"; -import { normRange } from "@thi.ng/transducers/iter/norm-range"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { Vec } from "@thi.ng/vectors/api"; -import { mix1, PI, TAU } from "@thi.ng/vectors/math"; -import { setS2, toCartesian2, Vec2 } from "@thi.ng/vectors/vec2"; +import { PI, TAU } from "@thi.ng/vectors/math"; import { - ArcSamplingOpts, + asVec2, + setS2, + toCartesian2, + Vec2 +} from "@thi.ng/vectors/vec2"; +import { + DEFAULT_SAMPLES, + HiccupCircle2, IArcLength, IBounds, + IBoundsRaw, ICentroid, - IToPolygon2, - IVertices + IToPolygon, + IVertices, + JsonCircle2, + SamplingOpts } from "./api"; -import { circumCenter } from "./func/circumcenter"; -import { edges } from "./func/edges"; -import { Polygon2 } from "./poly2"; +import { circumCenter } from "./internal/circumcenter"; +import { edges } from "./internal/edges"; +import { Polygon2 } from "./polygon2"; +import { Rect2 } from "./rect2"; export class Circle2 implements IArcLength, - IBounds, + IBoundsRaw, + IBounds, ICentroid, IToHiccup, - IToPolygon2, - IVertices> { + IToPolygon>, + IVertices> { + + static fromJSON(spec: JsonCircle2) { + return new Circle2( + new Vec2(spec.pos), + spec.r, + spec.attribs + ); + } + + static fromHiccup(spec: HiccupCircle2) { + return new Circle2(asVec2(spec[2]), spec[3], spec[1]); + } static from3Points(a: Readonly, b: Readonly, c: Readonly) { const o = circumCenter(a, b, c); @@ -31,8 +54,6 @@ export class Circle2 implements } } - static DEFAULT_RES = 20; - pos: Vec2; r: number; attribs: IObjectOf; @@ -47,45 +68,35 @@ export class Circle2 implements return new Circle2(this.pos.copy(), this.r, { ...this.attribs }); } - edges(opts?: Partial) { + edges(opts?: Partial) { return edges(this.vertices(opts)); } - verticesRaw( - from: number, - to: number, - num: number, - inclLast: boolean, - dest: Vec = [], - destOffset = 0, - cstride = 1, - estride = 2 - ) { - + vertices(opts?: number | Partial) { + let [num, last] = isNumber(opts) ? + [opts, false] : + [ + opts.theta ? + Math.floor(TAU / opts.theta) : + opts.dist ? + Math.floor(TAU / (opts.dist / this.r)) : + opts.num || DEFAULT_SAMPLES, + opts.last === true + ]; + const buf: Vec = []; const pos = this.pos.buf; const po = this.pos.i; const ps = this.pos.s; const r = this.r; - for (let t of normRange(inclLast ? num - 1 : num, inclLast)) { + const delta = TAU / num; + last && num++; + for (let i = 0; i < num; i++) { toCartesian2( - setS2(dest, r, mix1(from, to, t), destOffset, cstride), - pos, destOffset, po, cstride, ps + setS2(buf, r, i * delta, i * 2), + pos, i * 2, po, 1, ps ); - destOffset += estride; } - return dest; - } - - vertices(opts?: number | Partial) { - const [num, last] = isNumber(opts) ? - [opts, true] : - [ - opts.theta ? - Math.max(Math.ceil(1 + TAU / opts.theta), 2) : - opts.num, - opts.includeLast === true - ]; - return Vec2.mapBuffer(this.verticesRaw(0, TAU, num, last), num); + return Vec2.mapBuffer(buf, num); } area() { @@ -96,35 +107,30 @@ export class Circle2 implements return TAU * this.r; } - bounds() { + boundsRaw(): [Vec2, Vec2] { return [ - Vec2.subN(this.pos, this.r), - Vec2.addN(this.pos, this.r) + this.pos.subNewN(this.r), + this.pos.addNewN(this.r) ]; } - width() { - return this.r * 2; - } - - height() { - return this.width(); - } - - depth() { - return 0; + bounds(): Rect2 { + return new Rect2( + this.pos.subNewN(this.r), + new Vec2([this.r, this.r]) + ); } centroid(c?: Vec2) { return c ? c.set(this.pos) : this.pos; } - toPolygon2(opts?: Partial) { + toPolygon(opts?: number | Partial) { return new Polygon2(this.vertices(opts)); } - toHiccup() { - return ["circle", this.attribs, this.pos, this.r]; + toHiccup(): HiccupCircle2 { + return ["circle", this.attribs || {}, this.pos, this.r]; } toJSON() { @@ -132,9 +138,36 @@ export class Circle2 implements type: "circle2", pos: this.pos.toJSON(), r: this.r, + attribs: this.attribs, }; } } -export const circle2 = (pos: Vec2, r = 1, attribs?: IObjectOf) => - new Circle2(pos, r, attribs); +export function circle2(r: number, attribs?: IObjectOf): Circle2; +export function circle2(x: number, y: number, attribs?: IObjectOf): Circle2; +export function circle2(x: number, y: number, r: number, attribs?: IObjectOf): Circle2; +export function circle2(pos: Vec2, attribs?: IObjectOf): Circle2; +export function circle2(pos: Vec2, r: number, attribs?: IObjectOf): Circle2; +export function circle2(...args: any[]) { + let attribs; + let n = args.length - 1; + if (isPlainObject(args[n]) || args[n] == null) { + attribs = args[n]; + n--; + } + if (args[0] instanceof Vec2) { + return new Circle2( + args[0], + n === 1 ? args[n] : 1, + attribs + ); + } + if (n > 0) { + return new Circle2( + new Vec2([args[0], args[1]]), + n === 2 ? args[n] : 1, + attribs + ); + } + return new Circle2(new Vec2([0, 0]), args[0], attribs); +} diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts index df5f25588b..e711649258 100644 --- a/packages/geom/src/container2.ts +++ b/packages/geom/src/container2.ts @@ -1,19 +1,23 @@ import { IObjectOf } from "@thi.ng/api/api"; -import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { Mat23 } from "@thi.ng/vectors/mat23"; -import { Vec2, vec2 } from "@thi.ng/vectors/vec2"; +import { Vec2 } from "@thi.ng/vectors/vec2"; import { CollateOpts, IBounds, + IBoundsRaw, ICentroid, ICollate, IVertices } from "./api"; -import { bounds } from "./func/bounds"; -import { convexHull2 } from "./func/convex-hull"; +import { bounds } from "./internal/bounds"; +import { centroid } from "./internal/centroid"; +import { collateWith } from "./internal/collate"; +import { convexHull } from "./internal/graham-scan"; +import { Rect2 } from "./rect2"; export class PointContainer2 implements - IBounds, + IBoundsRaw, + IBounds, ICentroid, ICollate, IVertices { @@ -31,66 +35,27 @@ export class PointContainer2 implements } collate(opts?: Partial) { - opts = { - start: 0, - cstride: 1, - estride: 2, - ...opts - }; - const { start, cstride, estride } = opts; - const pts = this.points; - const n = pts.length; - const buf = Vec2.intoBuffer( - opts.buf || new Array(start + n * estride).fill(0), - pts, - start, - cstride, - estride - ); - for (let i = 0; i < n; i++) { - const p = pts[i]; - p.buf = buf; - p.i = start + i * estride; - p.s = cstride; - } - return buf; + return collateWith(Vec2.intoBuffer, this.points, opts, 2); } vertices() { return this.points; } - bounds() { - return bounds(this.points, Vec2.MAX.copy(), Vec2.MIN.copy()); + boundsRaw() { + return bounds(this.points, Vec2.MAX.copy(), Vec2.MIN.copy()); } - width() { - const b = this.bounds(); - return b[1].x - b[0].x; - } - - height() { - const b = this.bounds(); - return b[1].y - b[0].y; - } - - depth() { - return 0; + bounds(): Rect2 { + return Rect2.fromMinMax(...this.boundsRaw()); } convextHull() { - return convexHull2(this.points); + return convexHull(this.points); } - centroid(c?: Vec2): Vec2 { - const pts = this.points; - const num = pts.length; - !num && illegalArgs("no points available"); - !c && (c = vec2()); - for (let i = num; --i >= 0;) { - c.add(pts[i]); - } - return c.divN(num); + centroid(c?: Vec2) { + return centroid(this.points, c || new Vec2()); } center(origin?: Readonly) { @@ -102,6 +67,14 @@ export class PointContainer2 implements this.points.reverse(); } + rotate(theta: number) { + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + pts[i].rotate(theta); + } + return this; + } + scale(v: Readonly) { const pts = this.points; for (let i = pts.length; --i >= 0;) { @@ -110,6 +83,14 @@ export class PointContainer2 implements return this; } + scaleN(n: number) { + const pts = this.points; + for (let i = pts.length; --i >= 0;) { + pts[i].mulN(n); + } + return this; + } + translate(v: Readonly) { const pts = this.points; for (let i = pts.length; --i >= 0;) { @@ -126,8 +107,8 @@ export class PointContainer2 implements return this; } - protected _copy() { - return Vec2.mapBuffer(Vec2.intoBuffer([], this.points), this.points.length); + protected _copy(pts = this.points) { + return Vec2.mapBuffer(Vec2.intoBuffer([], pts), pts.length); } protected _toJSON(type: string) { @@ -139,6 +120,6 @@ export class PointContainer2 implements } protected _toHiccup(type: string) { - return [type, this.attribs, this.vertices()]; + return [type, this.attribs, this.points]; } } diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts index 7fde4c3828..3a1de1d26f 100644 --- a/packages/geom/src/container3.ts +++ b/packages/geom/src/container3.ts @@ -5,14 +5,17 @@ import { Vec3, vec3 } from "@thi.ng/vectors/vec3"; import { CollateOpts, IBounds, + IBoundsRaw, ICentroid, ICollate, IVertices } from "./api"; -import { bounds } from "./func/bounds"; +import { bounds } from "./internal/bounds"; +import { collateWith } from "./internal/collate"; export class PointContainer3 implements - IBounds, + IBoundsRaw, + IBounds, // TODO ICentroid, ICollate, IVertices { @@ -30,52 +33,19 @@ export class PointContainer3 implements } collate(opts?: Partial) { - opts = { - start: 0, - cstride: 1, - estride: 3, - ...opts - }; - const { start, cstride, estride } = opts; - const pts = this.points; - const n = pts.length; - const buf = Vec3.intoBuffer( - opts.buf || new Array(start + n * estride).fill(0), - pts, - start, - cstride, - estride - ); - for (let i = 0; i < n; i++) { - const p = pts[i]; - p.buf = buf; - p.i = start + i * estride; - p.s = cstride; - } - return buf; + return collateWith(Vec3.intoBuffer, this.points, opts, 3); } vertices() { return this.points; } - bounds() { + boundsRaw() { return bounds(this.points, Vec3.MAX.copy(), Vec3.MIN.copy()); } - width() { - const b = this.bounds(); - return b[1].x - b[0].x; - } - - height() { - const b = this.bounds(); - return b[1].y - b[0].y; - } - - depth() { - const b = this.bounds(); - return b[1].z - b[0].z; + bounds() { + return this.boundsRaw(); } centroid(c?: Vec3): Vec3 { @@ -125,4 +95,12 @@ export class PointContainer3 implements protected _copy() { return Vec3.mapBuffer(Vec3.intoBuffer([], this.points), this.points.length); } + + protected _toJSON(type: string) { + return { + type, + attribs: this.attribs, + points: this.points.map((p) => p.toJSON()) + }; + } } diff --git a/packages/geom/src/fit.ts b/packages/geom/src/fit.ts new file mode 100644 index 0000000000..1a11bdaf3b --- /dev/null +++ b/packages/geom/src/fit.ts @@ -0,0 +1,42 @@ +import { Mat23 } from "@thi.ng/vectors/mat23"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { IBounds, ICentroid, ITransformable } from "./api"; +import { collBounds } from "./internal/bounds"; +import { Rect2 } from "./rect2"; + +const translateScale = (shape, c1, c2, smat) => + shape.transform( + Mat23.concat( + Mat23.translation(c1), + smat, + Mat23.translation(c2) + ) + ); + +export const fitIntoBounds2 = & ITransformable>(shape: T, bounds: Rect2) => { + const obounds = shape.bounds(); + const tscale = bounds.size.copy().divNew(obounds.size); + const scale = Math.min(tscale.x, tscale.y); + return translateScale( + shape, + bounds.centroid(), + obounds.centroid().neg(), + Mat23.scale(scale) + ); +} + +export const fitAllIntoBounds2 = & ICentroid & ITransformable>(shapes: T[], dest: Rect2) => { + const src: Rect2 = collBounds(shapes); + const w = dest.size.x / src.size.x; + const h = dest.size.y / src.size.y; + const s = w > 0 && h > 0 ? Math.min(w, h) : w > 0 ? w : h; + const b = src.copy().scaleN(s).center(dest.centroid()); + const smat = Mat23.scale(s); + for (let i = shapes.length; --i >= 0;) { + const s = shapes[i]; + const c1 = s.centroid(); + const c2 = b.unmapPoint(src.mapPoint(c1)); + translateScale(s, c2, c1.neg(), smat); + } + return shapes; +}; diff --git a/packages/geom/src/func/bounds.ts b/packages/geom/src/func/bounds.ts deleted file mode 100644 index d3c9aea378..0000000000 --- a/packages/geom/src/func/bounds.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IMinMax } from "@thi.ng/vectors/api"; - -export const bounds = >(pts: ReadonlyArray, vmin: T, vmax: T) => { - for (let i = pts.length; --i >= 0;) { - const p = pts[i]; - vmin.min(p); - vmax.max(p); - } - return [vmin, vmax]; -}; diff --git a/packages/geom/src/func/sample-uniform.ts b/packages/geom/src/func/sample-uniform.ts deleted file mode 100644 index e6fd1abaa9..0000000000 --- a/packages/geom/src/func/sample-uniform.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { peek } from "@thi.ng/transducers/func/peek"; -import { SampleableVector } from "../api"; - -/** - * Re-samples given polyline at given uniform distance. Returns array of - * interpolated points (does not modify original). - * - * @param step sample distance - * @param pts - */ -export const sampleUniform = >(pts: ReadonlyArray, step: number) => { - if (!pts.length) return []; - let prev = pts[0]; - const res: T[] = [prev]; - for (let i = 1, n = pts.length; i < n; prev = peek(res), i++) { - const p = pts[i]; - let d = p.dist(prev); - while (d >= step) { - res.push(prev = prev.copy().mixN(p, step / d)); - d -= step; - } - } - res.push(peek(pts)); - return res; -}; diff --git a/packages/geom/src/index.ts b/packages/geom/src/index.ts index e791d15960..04d8bf6df5 100644 --- a/packages/geom/src/index.ts +++ b/packages/geom/src/index.ts @@ -3,6 +3,16 @@ export * from "./container2"; export * from "./container3"; export * from "./arc2"; +export * from "./bezier2"; export * from "./circle2"; -export * from "./poly2"; +export * from "./container2"; +export * from "./container3"; +export * from "./line2"; +export * from "./path2"; +export * from "./polygon2"; export * from "./polyline2"; +export * from "./rect2"; +export * from "./sampler"; + +export * from "./fit"; +export * from "./subdiv-curve"; diff --git a/packages/geom/src/func/arc-length.ts b/packages/geom/src/internal/arc-length.ts similarity index 64% rename from packages/geom/src/func/arc-length.ts rename to packages/geom/src/internal/arc-length.ts index 21cd100ab4..d8f108749b 100644 --- a/packages/geom/src/func/arc-length.ts +++ b/packages/geom/src/internal/arc-length.ts @@ -1,6 +1,6 @@ -import { IDistance } from "@thi.ng/vectors/api"; +import { IVector } from "@thi.ng/vectors/api"; -export const arcLength = >(pts: ReadonlyArray, closed = false) => { +export const arcLength = >(pts: ReadonlyArray, closed = false) => { const num = pts.length; if (num < 2) return 0; let p = pts[0]; diff --git a/packages/geom/src/internal/bounds.ts b/packages/geom/src/internal/bounds.ts new file mode 100644 index 0000000000..297579fdd3 --- /dev/null +++ b/packages/geom/src/internal/bounds.ts @@ -0,0 +1,31 @@ +import { IVector } from "@thi.ng/vectors/api"; +import { IBounds, IUnion } from "../api"; + +export const axisBounds = >(points: ReadonlyArray, axis: number): [number, number] => { + let min = Number.POSITIVE_INFINITY, + max = Number.NEGATIVE_INFINITY; + for (let i = points.length; --i >= 0;) { + const x = points[i][axis]; + x < min && (min = x); + x > max && (max = x); + } + return [min, max]; +}; + +export const bounds = >(pts: ReadonlyArray, vmin: T, vmax: T): [T, T] => { + for (let i = pts.length; --i >= 0;) { + const p = pts[i]; + vmin.min(p); + vmax.max(p); + } + return [vmin, vmax]; +}; + +export const collBounds = , B extends IBounds & IUnion>(shapes: T[]) => { + let n = shapes.length - 1; + let res: B = n > 0 ? shapes[n].bounds() : undefined; + for (; --n >= 0;) { + res = res.union(shapes[n].bounds()); + } + return res; +}; diff --git a/packages/geom/src/internal/centroid.ts b/packages/geom/src/internal/centroid.ts new file mode 100644 index 0000000000..146b1ef4b0 --- /dev/null +++ b/packages/geom/src/internal/centroid.ts @@ -0,0 +1,28 @@ +import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; +import { IVector } from "@thi.ng/vectors/api"; +import { Vec2 } from "@thi.ng/vectors/vec2"; + +export const centroid = >(pts: T[], c: T) => { + const num = pts.length; + !num && illegalArgs("no points available"); + for (let i = num; --i >= 0;) { + c.add(pts[i]); + } + return c.divN(num); +}; + +export const centerOfWeight = (pts: Vec2[], c?: Vec2) => { + let area = 0; + let x = 0; + let y = 0; + for (let n = pts.length - 1, i = pts[n], j = pts[0], k = 0; k <= n; k++ , i = j, j = pts[k]) { + const z = i.cross(j); + area += z; + x += (i.x + j.x) * z; + y += (i.y + j.y) * z; + } + area = 1 / (area * 3); + x *= area; + y *= area; + return c ? c.setS(x, y) : new Vec2([x, y]); +}; diff --git a/packages/geom/src/func/circumcenter.ts b/packages/geom/src/internal/circumcenter.ts similarity index 100% rename from packages/geom/src/func/circumcenter.ts rename to packages/geom/src/internal/circumcenter.ts diff --git a/packages/geom/src/internal/closest-point.ts b/packages/geom/src/internal/closest-point.ts new file mode 100644 index 0000000000..9565f91a8d --- /dev/null +++ b/packages/geom/src/internal/closest-point.ts @@ -0,0 +1,99 @@ +import { IVector } from "@thi.ng/vectors/api"; + +export const closestPoint = + >(p: T, pts: T[]) => { + + let minD = Number.POSITIVE_INFINITY; + let closest: T; + for (let i = pts.length; --i >= 0;) { + const d = pts[i].distSq(p); + if (d < minD) { + minD = d; + closest = pts[i]; + } + } + return closest; + }; + +export const closestCoeff = + >(p: T, a: T, b: T) => { + + const d = b.subNew(a); + const l = d.magSq(); + if (l > 1e-6) { + return p.subNew(a).dot(d) / l; + } + }; + +export const closestPointSegment = + >(p: T, a: T, b: T, out: T) => { + + const t = closestCoeff(p, a, b); + if (t !== undefined) { + return t <= 0.0 ? + out.set(a) : + t >= 1.0 ? + out.set(b) : + a.mixNewN(b, t, out); + } + }; + +export const closestPointPolyline = + >(p: T, pts: T[], closed = false) => { + + const closest = pts[0].empty(); + const tmp = closest.empty(); + const n = pts.length - 1; + let minD = Number.POSITIVE_INFINITY, i, j; + if (closed) { + i = n; + j = 0; + } else { + i = 0; + j = 1; + } + for (; j <= n; i = j, j++) { + if (closestPointSegment(p, pts[i], pts[j], tmp)) { + const d = p.distSq(tmp); + if (d < minD) { + minD = d; + closest.set(tmp); + } + } + } + return closest; + }; + +/** + * Returns the index of the start point containing the segment in the + * polyline array `points` farthest away from `p` with regards to the + * line segment `a` to `b`. `points` is only checked between indices + * `from` and `to`. + * + * @param a + * @param b + * @param points + * @param from + * @param to + */ +export const farthestPointSegment = + >( + a: T, + b: T, + points: T[], + from = 0, + to = points.length) => { + + let maxD = -1; + let maxIdx; + const tmp = a.empty(); + for (let i = from; i < to; i++) { + const p = points[i]; + const d = p.distSq(closestPointSegment(p, a, b, tmp) || a); + if (d > maxD) { + maxD = d; + maxIdx = i; + } + } + return [maxIdx, Math.sqrt(maxD)]; + }; diff --git a/packages/geom/src/internal/collate.ts b/packages/geom/src/internal/collate.ts new file mode 100644 index 0000000000..c29f1e1a28 --- /dev/null +++ b/packages/geom/src/internal/collate.ts @@ -0,0 +1,37 @@ +import { Vec, IVec } from "@thi.ng/vectors/api"; +import { CollateOpts } from "../api"; + +export const remap = (buf: Vec, pts: IVec[], start: number, cstride: number, estride: number) => { + for (let i = pts.length; --i >= 0;) { + const p = pts[i]; + p.buf = buf; + p.i = start + i * estride; + p.s = cstride; + } + return buf; +}; + +export const collateWith = ( + fn: (buf: Vec, src: Iterable>, start, cstride, estride) => Vec, + pts: T[], + opts: Partial, + stride: number) => { + + opts = { + start: 0, + cstride: 1, + estride: stride, + ...opts + }; + const { start, cstride, estride } = opts; + return remap( + fn( + opts.buf || new Array(start + pts.length * estride).fill(0), + pts, + start, + cstride, + estride + ), + pts, start, cstride, estride + ); +}; diff --git a/packages/geom/src/func/corner.ts b/packages/geom/src/internal/corner.ts similarity index 100% rename from packages/geom/src/func/corner.ts rename to packages/geom/src/internal/corner.ts diff --git "a/packages/geom/src/internal/douglas\342\200\223peucker.ts" "b/packages/geom/src/internal/douglas\342\200\223peucker.ts" new file mode 100644 index 0000000000..2cca00d874 --- /dev/null +++ "b/packages/geom/src/internal/douglas\342\200\223peucker.ts" @@ -0,0 +1,41 @@ +import { IVector } from "@thi.ng/vectors/api"; +import { farthestPointSegment } from "./closest-point"; +import { peek } from "@thi.ng/transducers/func/peek"; + +// https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm + +export const simplify = >(pts: T[], eps = 0, closed = false) => { + let num = pts.length; + const res: T[] = []; + const visited: boolean[] = []; + if (num <= 2) { + return pts.slice(); + } + if (closed && !pts[0].eqDelta(peek(pts))) { + pts = pts.slice(); + pts.push(pts[0]); + num++; + } + + const $ = (from: number, to: number) => { + visited[from] = visited[to] = true; + if (to <= from + 1) { + return; + } + const [maxIdx, maxD] = farthestPointSegment(pts[from], pts[to], pts, from + 1, to); + if (maxD <= eps) { + return; + } + $(from, maxIdx); + $(maxIdx, to); + }; + + $(0, num - 1); + + for (let i = 0, n = closed ? num - 1 : num; i < n; i++) { + if (visited[i]) { + res.push(pts[i]); + } + } + return res; +}; diff --git a/packages/geom/src/func/edges.ts b/packages/geom/src/internal/edges.ts similarity index 73% rename from packages/geom/src/func/edges.ts rename to packages/geom/src/internal/edges.ts index aa6c8c447d..fe9bed6d49 100644 --- a/packages/geom/src/func/edges.ts +++ b/packages/geom/src/internal/edges.ts @@ -1,6 +1,6 @@ import { wrap } from "@thi.ng/transducers/iter/wrap"; import { partition } from "@thi.ng/transducers/xform/partition"; -export const edges = (vertices: ReadonlyArray, closed = false) => { +export const edges = (vertices: Iterable, closed = false) => { return partition(2, 1, closed ? wrap(vertices, 1, false, true) : vertices); }; diff --git a/packages/geom/src/func/convex-hull.ts b/packages/geom/src/internal/graham-scan.ts similarity index 81% rename from packages/geom/src/func/convex-hull.ts rename to packages/geom/src/internal/graham-scan.ts index e4f5b82298..eb446aa0b4 100644 --- a/packages/geom/src/func/convex-hull.ts +++ b/packages/geom/src/internal/graham-scan.ts @@ -2,18 +2,19 @@ import { Vec2 } from "@thi.ng/vectors/vec2"; import { corner } from "./corner"; /** - * Returns array of points defining the Convex Hull of `pts` using - * Graham Scan method. + * Returns array of points defining the 2D Convex Hull of `pts` using + * the Graham Scan method. * * https://en.wikipedia.org/wiki/Graham_scan * * @param pts */ -export const convexHull2 = (pts: ReadonlyArray) => { +export const convexHull = (pts: ReadonlyArray) => { const num = pts.length; const res: Vec2[] = []; let h = 0, i; pts = pts.slice().sort(Vec2.comparator(0, 1)); + const scan = (p: Vec2, thresh: number) => { while (h >= thresh && corner(res[h - 2], res[h - 1], p) >= 0) { res.pop(); @@ -21,6 +22,7 @@ export const convexHull2 = (pts: ReadonlyArray) => { } res[h++] = p; }; + for (i = 0; i < num; i++) { scan(pts[i], 2); } @@ -32,4 +34,4 @@ export const convexHull2 = (pts: ReadonlyArray) => { } res.pop(); return res; -} +}; diff --git a/packages/geom/src/internal/line-intersection.ts b/packages/geom/src/internal/line-intersection.ts new file mode 100644 index 0000000000..583a098dd4 --- /dev/null +++ b/packages/geom/src/internal/line-intersection.ts @@ -0,0 +1,31 @@ +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { LineIntersection, LineIntersectionType } from "../api"; + +export const intersectLines2 = (a: Vec2, b: Vec2, c: Vec2, d: Vec2) => { + const bax = b.x - a.x; + const bay = b.y - a.y; + const dcx = d.x - c.x; + const dcy = d.y - c.y; + const acx = a.x - c.x; + const acy = a.y - c.y; + const det = dcy * bax - dcx * bay; + let alpha = dcx * acy - dcy * acx; + let beta = bax * acy - bay * acx; + if (det === 0) { + if (alpha === 0 && beta === 0) { + return { type: LineIntersectionType.COINCIDENT }; + } + return { type: LineIntersectionType.PARALLEL }; + } + alpha /= det; + beta /= det; + return >{ + type: (0 <= alpha && alpha <= 1) && (0 <= beta && beta <= 1) ? + LineIntersectionType.INTERSECT : + LineIntersectionType.INTERSECT_OUTSIDE, + isec: a.mixNewN(b, alpha), + alpha, + beta, + det, + }; +}; diff --git a/packages/geom/src/internal/sutherland-hodgeman.ts b/packages/geom/src/internal/sutherland-hodgeman.ts new file mode 100644 index 0000000000..8517166b39 --- /dev/null +++ b/packages/geom/src/internal/sutherland-hodgeman.ts @@ -0,0 +1,42 @@ +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { classify } from "./corner"; +import { intersectLines2 } from "./line-intersection"; + +/** + * Sutherland-Hodgeman convex polygon clipping. + * Returns new array of clipped vertices. + * + * https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm + * + * @param poly subject poly + * @param bounds clipping boundary + * @param bc pre-computed boundary centroid + * @param eps edge classification tolerance + */ +export const clipConvex = (poly: Vec2[], bounds: Vec2[], bc: Vec2, eps = 1e-4) => { + for (let ne = bounds.length, j = ne - 1, i = 0; i < ne; j = i, i++) { + const clipped = []; + const ca = bounds[j]; + const cb = bounds[i]; + const sign = classify(ca, cb, bc, eps); + for (let np = poly.length, k = np - 1, l = 0; l < np; k = l, l++) { + const p = poly[k]; + const q = poly[l]; + const cqsign = classify(ca, cb, q, eps); + if (classify(ca, cb, p, eps) === sign) { + clipped.push( + cqsign !== sign ? + intersectLines2(ca, cb, p, q).isec : + q + ); + } else if (cqsign === sign) { + clipped.push(intersectLines2(ca, cb, p, q).isec, q); + } + } + if (clipped.length < 2) { + return []; + } + poly = clipped; + } + return poly; +}; diff --git a/packages/geom/src/line2.ts b/packages/geom/src/line2.ts new file mode 100644 index 0000000000..713bb4036a --- /dev/null +++ b/packages/geom/src/line2.ts @@ -0,0 +1,80 @@ +import { PointContainer2 } from "./container2"; +import { Attribs, SamplingOpts, HiccupLine2 } from "./api"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { Sampler } from "./sampler"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { intersectLines2 } from "./internal/line-intersection"; +import { Vec } from "@thi.ng/vectors/api"; +import { isNumber } from "@thi.ng/checks/is-number"; + +export class Line2 extends PointContainer2 { + + constructor(points: Vec2[], attribs?: Attribs) { + if (points.length > 2) { + points = points.slice(0, 2); + } + super(points, attribs); + } + + copy() { + return new Line2(this._copy(), { ...this.attribs }); + } + + edges() { + return this.points.slice(0, 2); + } + + area() { + return 0; + } + + arcLength() { + const pts = this.points; + return pts[0].dist(pts[1]); + } + + vertices(opts?: number | Partial) { + const sampler = new Sampler(this.points); + if (opts !== undefined) { + if (isPlainObject(opts)) { + return opts.dist ? + sampler.sampleUniform(opts.dist, opts.last !== false) : + sampler.sampleFixedNum(opts.num, opts.last !== false); + } + return sampler.sampleFixedNum(opts, true); + } else { + return this.points; + } + } + + intersectLine(l: Line2) { + return intersectLines2(this.points[0], this.points[1], l.points[0], l.points[1]); + } + + toHiccup(): HiccupLine2 { + return ["line", this.attribs || {}, this.points[0], this.points[1]]; + } + + toJSON() { + return this._toJSON("line2"); + } +} + +export function line2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Line2; +export function line2(x1: number, y1: number, x2: number, y2: number, attribs?: Attribs): Line2; +export function line2(a: Vec2, b: Vec2, attribs?: Attribs): Line2; +export function line2(...args: any[]) { + let attribs; + let n = args.length - 1; + if (isPlainObject(args[n]) || args[n] == null) { + attribs = args[n]; + n--; + } + if (isNumber(args[0])) { + return new Line2(Vec2.mapBuffer(args.slice(0, 4), 2), attribs); + } + if (args[0] instanceof Vec2) { + return new Line2([args[0], args[1]], attribs); + } + return new Line2(Vec2.mapBuffer(args[0], 2, args[1] || 0, args[2] || 1, args[3] || 2), attribs); +} \ No newline at end of file diff --git a/packages/geom/src/path2.ts b/packages/geom/src/path2.ts new file mode 100644 index 0000000000..39a204493c --- /dev/null +++ b/packages/geom/src/path2.ts @@ -0,0 +1,444 @@ +import { isNumber } from "@thi.ng/checks/is-number"; +import { ensureArray } from "@thi.ng/transducers/func/ensure-array"; +import { peek } from "@thi.ng/transducers/func/peek"; +import { eqDelta1, rad } from "@thi.ng/vectors/math"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { + IBounds, + IBoundsRaw, + IToPolygon, + IVertices, + PathSegment, + SamplingOpts, + SegmentType +} from "./api"; +import { Arc2 } from "./arc2"; +import { Cubic2, Quadratic2 } from "./bezier2"; +import { Line2 } from "./line2"; +import { Polygon2 } from "./polygon2"; +import { Polyline2 } from "./polyline2"; +import { Rect2 } from "./rect2"; + +export class Path2 implements + Iterable, + IBoundsRaw, + IBounds, + IToPolygon, + IVertices { + + segments: PathSegment[]; + closed: boolean; + + constructor(segments?: PathSegment[]) { + this.segments = segments || []; + this.closed = false; + } + + *[Symbol.iterator]() { + yield* (this.segments); + } + + add(s: PathSegment) { + this.segments.push(s); + } + + boundsRaw(): [Vec2, Vec2] { + const min = Vec2.MAX.copy(); + const max = Vec2.MIN.copy(); + for (let s of this.segments) { + if (s.geo) { + const b = s.geo.boundsRaw(); + min.min(b[0]); + max.max(b[1]); + } + } + return [min, max]; + } + + bounds() { + return Rect2.fromMinMax(...this.boundsRaw()); + } + + simplify(): Path2 { + const res: PathSegment[] = []; + const orig = this.segments; + const n = orig.length; + let points, lastP; + for (let i = 0; i < n; i++) { + const s = orig[i]; + if (s.type === SegmentType.LINE || s.type === SegmentType.POLYLINE) { + points = (points || []).concat(s.geo.vertices()); + lastP = peek(points); + } else if (points) { + points.push(lastP); + res.push({ + geo: new Polyline2(points), + type: SegmentType.POLYLINE, + }); + points = null; + } else { + res.push(s); + } + } + if (points) { + points.push(lastP); + res.push({ + geo: new Polyline2(points), + type: SegmentType.POLYLINE, + }); + } + this.segments = res; + return this; + } + + toPolygon(opts?: number | Partial) { + return new Polygon2(this.vertices(opts)); + } + + toPolyline(res = 10) { + return new Polyline2(this.vertices(res)); + } + + vertices(opts?: number | Partial) { + const _opts = isNumber(opts) ? { num: opts } : opts; + let verts: Vec2[] = []; + for (let segs = this.segments, n = segs.length - 1, i = 0; i <= n; i++) { + const s = segs[i]; + if (s.geo) { + const v = ensureArray(s.geo.vertices({ ..._opts, last: i === n && !this.closed })); + // console.log(i, SegmentType[s.type], v.toString()); + verts = verts.concat(v); + } + } + return verts; + } +} + +const CMD_RE = /[achlmqstvz]/i; + +export class PathBuilder { + + static roundedRect(pos: Vec2, size: Vec2, r: Vec2) { + const b = new PathBuilder(), + w = size.x - 2 * r.x, + h = size.y - 2 * r.y; + b.moveTo(new Vec2([pos.x + r.x, pos.y])); + b.hlineTo(w, true); + b.arcTo(r, r, 0, false, true, true); + b.vlineTo(h, true); + b.arcTo(new Vec2([-r.x, r.y]), r, 0, false, true, true); + b.hlineTo(-w, true); + b.arcTo(new Vec2([-r.x, -r.y]), r, 0, false, true, true); + b.vlineTo(-h, true); + b.arcTo(new Vec2([r.x, -r.y]), r, 0, false, true, true); + return b.curr; + } + + static fromSVG(svg: string) { + const b = new PathBuilder(); + try { + let cmd: string; + for (let n = svg.length, i = 0; i < n;) { + i = skipWS(svg, i); + const c = svg.charAt(i); + if (CMD_RE.test(c)) { + cmd = c; + i++; + } + let p, pa, pb, t1, t2, t3; + switch (cmd.toLowerCase()) { + case "m": + [p, i] = readPoint(svg, i); + b.moveTo(p, cmd === "m"); + break; + case "l": + [p, i] = readPoint(svg, i); + b.lineTo(p, cmd === "l"); + break; + case "h": + [p, i] = readFloat(svg, i); + b.hlineTo(p, cmd === "h"); + break; + case "v": + [p, i] = readFloat(svg, i); + b.vlineTo(p, cmd === "v"); + break; + case "q": + [pa, i] = readPoint(svg, i); + [p, i] = readPoint(svg, i); + // console.log("quadratic", pa.toString(), p.toString()); + b.quadraticTo(pa, p, cmd === "q"); + break; + case "c": + [pa, i] = readPoint(svg, i); + [pb, i] = readPoint(svg, i); + [p, i] = readPoint(svg, i); + // console.log("cubic", pa.toString(), pb.toString(), p.toString()); + b.cubicTo(pa, pb, p, cmd === "c"); + break; + case "s": + [pa, i] = readPoint(svg, i); + [p, i] = readPoint(svg, i); + // console.log("cubicChain", pa.toString(), p.toString()); + b.cubicChainTo(pa, p, cmd === "s"); + break; + case "t": + [p, i] = readPoint(svg, i); + // console.log("quadraticChain", p.toString()); + b.quadraticChainTo(p, cmd === "t"); + break; + case "a": { + [pa, i] = readPoint(svg, i); + [t1, i] = readFloat(svg, i); + [t2, i] = readFloat(svg, i); + [t3, i] = readFloat(svg, i); + [pb, i] = readPoint(svg, i); + // console.log("arc", pa.toString(), rad(t1), t2, t3, pb.toString()); + b.arcTo(pb, pa, rad(t1), !!t2, !!t3, cmd === "a"); + break; + } + case "z": + b.closePath(); + break; + default: + throw new Error(`unsupported segment type: ${c} @ pos ${i}`); + } + } + return b.paths; + } catch (e) { + throw e instanceof Error ? e : new Error(`illegal char '${svg.charAt(e)}' @ ${e}`); + } + } + + paths: Path2[]; + protected curr: Path2; + protected currP: Vec2; + protected bezierP: Vec2; + protected startP: Vec2; + + constructor() { + this.paths = []; + this.newPath(); + } + + *[Symbol.iterator]() { + yield* this.paths; + } + + newPath() { + this.curr = new Path2(); + this.paths.push(this.curr); + this.currP = new Vec2(); + this.bezierP = new Vec2(); + this.startP = new Vec2(); + } + + moveTo(p: Vec2, relative = false): PathBuilder { + if (this.curr.segments.length > 0) { + this.curr = new Path2(); + this.paths.push(this.curr); + } + p = this.updateCurrent(p, relative); + this.startP.set(p); + this.bezierP.set(p); + this.curr.add({ + point: p, + type: SegmentType.MOVE, + }); + return this; + } + + lineTo(p: Vec2, relative = false): PathBuilder { + this.curr.add({ + geo: new Line2([ + this.currP.copy(), + this.updateCurrent(p, relative) + ]), + type: SegmentType.LINE, + }); + this.bezierP.set(this.currP); + return this; + } + + hlineTo(x: number, relative = false): PathBuilder { + const prev = this.currP.copy(); + this.currP.x = relative ? this.currP.x + x : x; + this.bezierP.set(this.currP); + this.curr.add({ + geo: new Line2([prev, this.currP.copy()]), + type: SegmentType.LINE, + }); + return this; + } + + vlineTo(y: number, relative = false): PathBuilder { + const prev = this.currP.copy(); + this.currP.y = relative ? this.currP.y + y : y; + this.bezierP.set(this.currP); + this.curr.add({ + geo: new Line2([prev, this.currP.copy()]), + type: SegmentType.LINE, + }); + return this; + } + + cubicTo(cp1: Vec2, cp2: Vec2, p: Vec2, relative = false) { + const c2 = this.absPoint(cp2, relative); + this.bezierP.set(c2); + this.curr.add({ + geo: new Cubic2([ + this.currP.copy(), + this.absPoint(cp1, relative), + c2, + this.updateCurrent(p, relative), + ]), + type: SegmentType.CUBIC, + }); + return this; + } + + quadraticTo(cp: Vec2, p: Vec2, relative = false) { + const c1 = this.absPoint(cp, relative); + this.bezierP.set(c1); + this.curr.add({ + geo: new Quadratic2([ + this.currP.copy(), + c1, + this.updateCurrent(p, relative), + ]), + type: SegmentType.QUADRATIC, + }); + return this; + } + + cubicChainTo(cp2: Vec2, p: Vec2, relative = false) { + const prevMode = peek(this.curr.segments).type; + const c1 = this.currP.copy(); + if (prevMode === SegmentType.CUBIC) { + c1.add(c1.subNew(this.bezierP)); + } + const c2 = this.absPoint(cp2, relative); + this.bezierP.set(c2); + this.curr.add({ + geo: new Cubic2([ + this.currP.copy(), + c1, + c2, + this.updateCurrent(p, relative), + ]), + type: SegmentType.CUBIC, + }); + return this; + } + + quadraticChainTo(p: Vec2, relative = false) { + const prevMode = peek(this.curr.segments).type; + const c1 = this.currP.copy(); + if (prevMode === SegmentType.QUADRATIC) { + c1.mulN(2).sub(this.bezierP); + } + this.bezierP.set(c1); + this.curr.add({ + geo: new Quadratic2([ + this.currP.copy(), + c1, + this.updateCurrent(p, relative), + ]), + type: SegmentType.CUBIC, + }); + return this; + } + + arcTo(p: Vec2, r: Vec2, xaxis: number, xl: boolean, clockwise: boolean, relative = false) { + if (eqDelta1(r.x, 0) || eqDelta1(r.y, 0)) { + return this.lineTo(p, relative); + } + const prev = this.currP.copy(); + const arc = Arc2.from2Points(prev, this.updateCurrent(p, relative), r, xaxis, xl, clockwise); + this.curr.add({ + geo: arc, + type: SegmentType.ARC, + }); + this.bezierP.set(this.currP); + return this; + } + + closePath() { + this.curr.add({ + geo: new Line2([this.currP.copy(), this.startP.copy()]), + type: SegmentType.LINE, + }); + this.curr.closed = true; + return this; + } + + protected updateCurrent(p: Vec2, relative: boolean) { + p = (relative ? this.currP.add(p) : this.currP.set(p)).copy(); + return p; + } + + protected absPoint(p: Vec2, relative: boolean) { + return relative ? p.add(this.currP) : p; + } +} + +const readPoint = (src: string, index: number): [Vec2, number] => { + let x, y; + [x, index] = readFloat(src, index); + index = skipWS(src, index); + [y, index] = readFloat(src, index); + return [new Vec2([x, y]), index]; +}; + +const isWS = (c: string) => c === " " || c === "\n" || c === "\r" || c === "\t"; + +const skipWS = (src: string, i: number) => { + const n = src.length; + while (i < n && isWS(src.charAt(i))) i++; + return i; +}; + +const readFloat = (src: string, index: number) => { + index = skipWS(src, index); + let signOk = true; + let dotOk = true; + let expOk = false; + let commaOk = false; + let i = index; + for (let n = src.length; i < n; i++) { + const c = src.charAt(i); + // console.log("float", src.substring(index, i + 1)); + if ("0" <= c && c <= "9") { + expOk = true; + commaOk = true; + signOk = false; + continue; + } + if (c === "-" || c === "+") { + if (!signOk) break; + signOk = false; + continue; + } + if (c === ".") { + if (!dotOk) break; + dotOk = false; + continue; + } + if (c === "e") { + if (!expOk) throw i; + expOk = false; + dotOk = false; + signOk = true; + continue; + } + if (c === ",") { + if (!commaOk) throw i; + i++; + } + break; + } + if (i === index) { + throw new Error(`expected coordinate @ pos: ${i}`); + } + return [parseFloat(src.substring(index, i)), i]; +} diff --git a/packages/geom/src/poly2.ts b/packages/geom/src/poly2.ts deleted file mode 100644 index 29ba13d21d..0000000000 --- a/packages/geom/src/poly2.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; -import { Vec2 } from "@thi.ng/vectors/vec2"; -import { IArcLength, IArea, IEdges } from "./api"; -import { PointContainer2 } from "./container2"; -import { arcLength } from "./func/arc-length"; -import { edges } from "./func/edges"; - -export class Polygon2 extends PointContainer2 implements - IArcLength, - IArea, - IEdges, - IToHiccup { - - constructor(points: Vec2[], attribs?: IObjectOf) { - super(points, attribs); - } - - copy() { - return new Polygon2(this._copy(), { ...this.attribs }); - } - - edges() { - return edges(this.vertices(), true); - } - - area(unsigned = true) { - const pts = this.points; - let res = 0; - for (let n = pts.length - 1, i = n, j = 0; n >= 0; i = j, j++ , n--) { - res += pts[i].cross(pts[j]); - } - res /= 2; - return unsigned ? res : Math.abs(res); - } - - arcLength() { - return arcLength(this.points, true); - } - - centroid(c?: Vec2): Vec2 { - const pts = this.points; - let area = 0; - let x = 0; - let y = 0; - for (let n = pts.length - 1, i = pts[n], j = pts[0], k = 0; k <= n; k++ , i = j, j = pts[k]) { - const z = i.cross(j); - area += z; - x += (i.x + j.x) * z; - y += (i.y + j.y) * z; - } - area = 1 / (area * 3); - x *= area; - y *= area; - return c ? c.setS(x, y) : new Vec2([x, y]); - } - - toHiccup() { - return this._toHiccup("polygon"); - } - - toJSON() { - return this._toJSON("polygon2"); - } -} - -export const polygon2 = (points: Vec2[], attribs?: IObjectOf) => - new Polygon2(points, attribs); diff --git a/packages/geom/src/polygon2.ts b/packages/geom/src/polygon2.ts new file mode 100644 index 0000000000..6471012c09 --- /dev/null +++ b/packages/geom/src/polygon2.ts @@ -0,0 +1,125 @@ +import { IToHiccup } from "@thi.ng/api/api"; +import { isNumber } from "@thi.ng/checks/is-number"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { Vec } from "@thi.ng/vectors/api"; +import { asVec2, Vec2 } from "@thi.ng/vectors/vec2"; +import { + Attribs, + HiccupPolygon2, + IArcLength, + IArea, + IEdges, + SamplingOpts, + SubdivKernel +} from "./api"; +import { PointContainer2 } from "./container2"; +import { arcLength } from "./internal/arc-length"; +import { centerOfWeight, centroid } from "./internal/centroid"; +import { edges } from "./internal/edges"; +import { clipConvex } from "./internal/sutherland-hodgeman"; +import { Sampler } from "./sampler"; +import { subdivideCurve } from "./subdiv-curve"; +import { simplify } from "./internal/douglas–peucker"; + +export class Polygon2 extends PointContainer2 implements + IArcLength, + IArea, + IEdges, + IToHiccup { + + static fromHiccup([_, attribs, pts]: HiccupPolygon2) { + return new Polygon2( + isNumber(pts[0]) ? + Vec2.mapBuffer(pts) : + (pts).map(asVec2), + attribs + ); + } + + copy() { + return new Polygon2(this._copy(), { ...this.attribs }); + } + + edges() { + return edges(this.vertices(), true); + } + + area(unsigned = true) { + const pts = this.points; + let res = 0; + for (let n = pts.length - 1, i = n, j = 0; n >= 0; i = j, j++ , n--) { + res += pts[i].cross(pts[j]); + } + res /= 2; + return unsigned ? res : Math.abs(res); + } + + arcLength() { + return arcLength(this.points, true); + } + + centroid(c?: Vec2): Vec2 { + return centerOfWeight(this.points, c); + } + + simplify(eps: number) { + return new Polygon2(simplify(this.points, eps, true), { ...this.attribs }); + } + + vertices(opts?: number | Partial) { + const sampler = new Sampler(this.points, true); + if (opts !== undefined) { + if (isPlainObject(opts)) { + return opts.dist ? + sampler.sampleUniform(opts.dist, opts.last) : + sampler.sampleFixedNum(opts.num, opts.last); + } + return sampler.sampleFixedNum(opts, false); + } else { + return this.points; + } + } + + clipConvex(boundary: Polygon2 | Vec2[]) { + let bpts, bc; + if (boundary instanceof Polygon2) { + bpts = boundary.points; + bc = boundary.centroid(); + } else { + bpts = boundary; + bc = centroid(bpts, new Vec2()); + } + return new Polygon2(clipConvex(this.points, bpts, bc), { ...this.attribs }); + } + + subdivide(kernel: SubdivKernel, iter = 1) { + return new Polygon2(subdivideCurve(kernel, this.points, iter, true), { ...this.attribs }); + } + + toHiccup() { + return this._toHiccup("polygon"); + } + + toJSON() { + return this._toJSON("polygon2"); + } +} + +export function polygon2(points: Vec, num?: number, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Polygon2; +export function polygon2(points: Vec2[], attribs?: Attribs): Polygon2; +export function polygon2(points, ...args: any[]) { + let attribs; + if (isNumber(points[0])) { + points = Vec2.mapBuffer( + points, + args[1] || points.length / 2, + args[2] || 0, + args[3] || 1, + args[4] || 2 + ); + attribs = args[5]; + } else { + attribs = args[1]; + } + return new Polygon2(points, attribs); +} diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts index 1fefb3fb03..7cb127f29f 100644 --- a/packages/geom/src/polyline2.ts +++ b/packages/geom/src/polyline2.ts @@ -1,21 +1,27 @@ import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { Vec2 } from "@thi.ng/vectors/vec2"; -import { IArcLength, IArea, IEdges } from "./api"; +import { + IArcLength, + IArea, + IEdges, + IVertices, + SamplingOpts, + SubdivKernel +} from "./api"; import { PointContainer2 } from "./container2"; -import { arcLength } from "./func/arc-length"; -import { edges } from "./func/edges"; -import { sampleUniform } from "./func/sample-uniform"; +import { arcLength } from "./internal/arc-length"; +import { edges } from "./internal/edges"; +import { Sampler } from "./sampler"; +import { subdivideCurve } from "./subdiv-curve"; export class Polyline2 extends PointContainer2 implements IArcLength, IArea, IEdges, + IVertices>, IToHiccup { - constructor(points: Vec2[], attribs?: IObjectOf) { - super(points, attribs); - } - copy() { return new Polyline2(this._copy(), { ...this.attribs }); } @@ -32,8 +38,22 @@ export class Polyline2 extends PointContainer2 implements return arcLength(this.points); } - resample(dist: number) { - this.points = sampleUniform(this.points, dist); + subdivide(kernel: SubdivKernel, iter = 1) { + return new Polyline2(subdivideCurve(kernel, this.points, iter, false), { ...this.attribs }); + } + + vertices(opts?: number | Partial) { + const sampler = new Sampler(this.points); + if (opts !== undefined) { + if (isPlainObject(opts)) { + return opts.dist ? + sampler.sampleUniform(opts.dist, opts.last !== false) : + sampler.sampleFixedNum(opts.num, opts.last !== false); + } + return sampler.sampleFixedNum(opts, true); + } else { + return this.points; + } } toHiccup() { diff --git a/packages/geom/src/rect2.ts b/packages/geom/src/rect2.ts new file mode 100644 index 0000000000..8df28ee95e --- /dev/null +++ b/packages/geom/src/rect2.ts @@ -0,0 +1,158 @@ +import { IObjectOf } from "@thi.ng/api/api"; +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { + CollateOpts, + IBounds, + ICentroid, + ICollate, + IVertices, + IBoundsRaw +} from "./api"; +import { collateWith } from "./internal/collate"; +import { edges } from "./internal/edges"; + +export class Rect2 implements + ICollate, + IBoundsRaw, + IBounds, + ICentroid, + IVertices { + + static fromMinMax(min: Vec2, max: Vec2) { + return new Rect2(min, max.subNew(min)); + } + + pos: Vec2; + size: Vec2; + attribs: IObjectOf; + + constructor(pos: Vec2, size: Vec2, attribs?: any) { + this.pos = pos; + this.size = size; + this.attribs = attribs; + } + + copy() { + const buf = Vec2.intoBuffer([], [this.pos, this.size]); + return new Rect2(new Vec2(buf, 0), new Vec2(buf, 2), { ...this.attribs }) + } + + collate(opts?: Partial) { + return collateWith(Vec2.intoBuffer, [this.pos, this.size], opts, 2); + } + + boundsRaw(): [Vec2, Vec2] { + return [this.pos.copy(), this.pos.addNew(this.size)]; + } + + bounds() { + return this; + } + + centroid(c?: Vec2) { + return this.pos.maddNewN(this.size, 0.5, c); + } + + center(origin?: Readonly) { + const d = this.centroid().neg(); + this.pos.add(origin ? d.add(origin) : d); + return this; + } + + mapPoint(p: Vec2, out?: Vec2) { + return p.subNew(this.pos, out).div(this.size); + } + + unmapPoint(p: Vec2, out?: Vec2) { + return (out ? out.set(this.pos) : this.pos.copy()).madd(this.size, p); + } + + scale(v: Readonly) { + this.pos.mul(v); + this.size.mul(v); + return this; + } + + scaleN(n: number) { + this.pos.mulN(n); + this.size.mulN(n); + return this; + } + + translate(v: Readonly) { + this.pos.add(v); + return this; + } + + union(r: Rect2) { + const p = this.pos.addNew(this.size); + const q = r.pos.addNew(r.size); + this.pos.min(r.pos); + this.size.set(p.max(q).sub(this.pos)); + return this; + } + + edges() { + return edges(this.vertices(), true); + } + + vertices() { + const [x, y] = this.pos; + const [w, h] = this.size; + return Vec2.mapBuffer([x, y, x + w, y, x + w, y + h, x, y + h], 4); + } + + toHiccup() { + return ["rect", this.attribs, this.pos, this.size.x, this.size.y]; + } + + toJSON() { + return { + type: "rect2", + pos: this.pos.toJSON(), + size: this.size.toJSON(), + }; + } +} + +export function rect2(x: number, y: number, w: number, h: number, attribs?: IObjectOf): Rect2; +export function rect2(x: number, y: number, w: number, attribs?: IObjectOf): Rect2; +export function rect2(w: number, h: number, attribs?: IObjectOf): Rect2; +export function rect2(pos: Vec2, w: number, attribs?: IObjectOf): Rect2; +export function rect2(pos: Vec2, size: Vec2, attribs?: IObjectOf): Rect2; +export function rect2(w: number, attribs?: IObjectOf): Rect2; +export function rect2(...args: any[]) { + let attribs; + let n = args.length - 1; + if (isPlainObject(args[n]) || args[n] == null) { + attribs = args[n]; + n--; + } + if (args[0] instanceof Vec2) { + const size = args[1]; + return new Rect2( + args[0], + size instanceof Vec2 ? + size : + new Vec2([size, size]), + attribs + ); + } + if (n > 1) { + return new Rect2( + new Vec2([args[0], args[1]]), + new Vec2( + n === 2 ? + [args[2], args[2]] : + [args[2], args[3]] + ), + attribs + ); + } + return new Rect2( + new Vec2([0, 0]), + new Vec2(n > 0 ? [args[0], args[1]] : [args[0], args[0]]), + attribs + ); +}; diff --git a/packages/geom/src/sampler.ts b/packages/geom/src/sampler.ts new file mode 100644 index 0000000000..ad99e9cd49 --- /dev/null +++ b/packages/geom/src/sampler.ts @@ -0,0 +1,72 @@ +import { ICopy, IEqualsDelta } from "@thi.ng/api/api"; +import { IDistance, IMix } from "@thi.ng/vectors/api"; +import { peek } from "@thi.ng/transducers/func/peek"; + +export class Sampler & IEqualsDelta & IDistance & IMix> { + + points: T[]; + index: number[]; + + constructor(points: ReadonlyArray, closed = false) { + if (closed) { + this.points = points.slice(); + this.points.push(points[0]); + } else { + this.points = points; + } + this.buildIndex(); + } + + pointAt(t: number) { + const pts = this.points; + const n = pts.length - 1; + if (n < 0) { + return; + } + if (n === 0 || t <= 0) { + return pts[0]; + } + if (t >= 1) { + return pts[n]; + } + const idx = this.index; + const t0 = t * idx[n]; + for (let i = 1; i <= n; i++) { + if (idx[i] >= t0) { + return pts[i - 1].copy().mixN(pts[i], (t0 - idx[i - 1]) / (idx[i] - idx[i - 1])); + } + } + } + + sampleUniform(dist: number, includeLast = false, result: T[] = []) { + const index = this.index; + const total = peek(index); + const delta = dist / total; + const n = index.length; + for (let t = 0, i = 1; t < 1; t += delta) { + const ct = t * total; + while (ct >= index[i] && i < n) { i++; } + if (i >= n) break; + const p = index[i - 1]; + result.push(this.points[i - 1].copy().mixN(this.points[i], (ct - p) / (index[i] - p))); + } + if (includeLast) { + result.push(this.points[this.points.length - 1].copy()); + } + return result; + } + + sampleFixedNum(num: number, includeLast = false, result?: T[]) { + return this.sampleUniform(peek(this.index) / num, includeLast, result); + } + + protected buildIndex() { + const idx: number[] = [0]; + const pts = this.points; + const n = pts.length; + for (let i = 0, j = 1; j < n; i = j, j++) { + idx[j] = idx[i] + pts[i].dist(pts[j]); + } + this.index = idx; + } +} diff --git a/packages/geom/src/subdiv-curve.ts b/packages/geom/src/subdiv-curve.ts new file mode 100644 index 0000000000..d2bd8a98a0 --- /dev/null +++ b/packages/geom/src/subdiv-curve.ts @@ -0,0 +1,80 @@ +import { comp } from "@thi.ng/transducers/func/comp"; +import { wrap } from "@thi.ng/transducers/iter/wrap"; +import { push } from "@thi.ng/transducers/rfn/push"; +import { transduce } from "@thi.ng/transducers/transduce"; +import { indexed } from "@thi.ng/transducers/xform/indexed"; +import { mapcat } from "@thi.ng/transducers/xform/mapcat"; +import { partition } from "@thi.ng/transducers/xform/partition"; +import { IVector } from "@thi.ng/vectors/api"; +import { SubdivKernel } from "./api"; + +export const subdivKernel2 = + ([ua, ub]: number[], [va, vb]: number[]) => + >([a, b]: T[]) => [ + a.copy().mulN(ua).maddN(b, ub), + a.copy().mulN(va).maddN(b, vb) + ]; + +export const subdivKernel3 = + ([ua, ub, uc]: number[], [va, vb, vc]: number[]) => + >([a, b, c]: T[]) => [ + a.copy().mulN(ua).maddN(b, ub).maddN(c, uc), + a.copy().mulN(va).maddN(b, vb).maddN(c, vc) + ]; + +export const subdivKernel5 = + ([ua, ub, uc, ud, ue]: number[], [va, vb, vc, vd, ve]: number[]) => + >([a, b, c, d, e]: T[]) => [ + a.copy().mulN(ua).maddN(b, ub).maddN(c, uc).maddN(d, ud).maddN(e, ue), + a.copy().mulN(va).maddN(b, vb).maddN(c, vc).maddN(d, vd).maddN(e, ve) + ]; + +export const subdivideCurve = + >( + { fn, size }: SubdivKernel, + pts: T[], + iter = 1, + closed = false) => { + + while (--iter >= 0) { + const nump = pts.length; + pts = transduce( + comp( + partition(size, 1), + indexed(), + mapcat(([i, pts]) => fn(pts, i, nump)) + ), + push(), + closed ? + wrap(pts, size >> 1, true, true) : + pts + ); + } + return pts; + }; + +const CHAIKIN_FIRST = subdivKernel3([1 / 2, 1 / 2, 0], [0, 3 / 4, 1 / 4]); +const CHAIKIN_MAIN = subdivKernel3([1 / 4, 3 / 4, 0], [0, 3 / 4, 1 / 4]); +const CHAIKIN_LAST = subdivKernel3([1 / 4, 3 / 4, 0], [0, 1 / 2, 1 / 2]); + +const CUBIC_BEZIER_MAIN = subdivKernel3([1 / 8, 3 / 4, 1 / 8], [0, 1 / 2, 1 / 2]); + +export const CHAIKIN_CLOSED: SubdivKernel = { + fn: CHAIKIN_MAIN, + size: 3 +}; + +export const CHAIKIN_OPEN: SubdivKernel = { + fn: (pts, i, n) => + i == 0 ? + [pts[0], ...CHAIKIN_FIRST(pts)] : + i === n - 3 ? + [...CHAIKIN_LAST(pts), pts[2]] : + CHAIKIN_MAIN(pts), + size: 3 +}; + +export const CUBIC_BEZIER_CLOSED: SubdivKernel = { + fn: CUBIC_BEZIER_MAIN, + size: 3 +}; diff --git a/packages/geom/test/circle2.ts b/packages/geom/test/circle2.ts new file mode 100644 index 0000000000..6910fd5505 --- /dev/null +++ b/packages/geom/test/circle2.ts @@ -0,0 +1,125 @@ +import { equiv } from "@thi.ng/equiv"; +import { PI, TAU, HALF_PI } from "@thi.ng/vectors/math"; +import { eqDelta2array, vec2 } from "@thi.ng/vectors/vec2"; +import * as assert from "assert"; +import { circle2, Circle2, HiccupCircle2 } from "../src"; + +describe("circle2", () => { + + it("ctor1", () => { + const c = circle2(10, 20); + assert(c instanceof Circle2); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 1); + assert.strictEqual(c.attribs, undefined); + }); + + it("ctor2", () => { + const c = circle2(10, 20, 5); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 5); + assert.strictEqual(c.attribs, undefined); + }); + + it("ctor3", () => { + const c = circle2(10, 20, 5, { a: 1 }); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 5); + assert.deepEqual(c.attribs, { a: 1 }); + }); + + it("ctor4", () => { + const c = circle2(vec2(10, 20)); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 1); + assert.strictEqual(c.attribs, undefined); + }); + + it("ctor5", () => { + const c = circle2(vec2(10, 20), 5); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 5); + assert.strictEqual(c.attribs, undefined); + }); + + it("ctor6", () => { + const c = circle2(vec2(10, 20), { a: 1 }); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 1); + assert.deepEqual(c.attribs, { a: 1 }); + }); + + + it("ctor7", () => { + const c = circle2(vec2(10, 20), 5, { a: 1 }); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 5); + assert.deepEqual(c.attribs, { a: 1 }); + }); + + it("ctor8", () => { + const c = circle2(5); + assert(equiv(c.pos, [0, 0])); + assert.equal(c.r, 5); + assert.strictEqual(c.attribs, undefined); + }); + + it("ctor9", () => { + const c = circle2(5, { a: 1 }); + assert(equiv(c.pos, [0, 0])); + assert.equal(c.r, 5); + assert.deepEqual(c.attribs, { a: 1 }); + }); + + it("hiccup", () => { + const src: HiccupCircle2 = ["circle", { a: 1 }, [10, 20], 5]; + const c = Circle2.fromHiccup(src); + assert(equiv(c.pos, [10, 20])); + assert.equal(c.r, 5); + assert.deepEqual(c.attribs, { a: 1 }); + assert(equiv(c.toHiccup(), src)); + }); + + it("area", () => { + assert.equal(circle2(10).area(), PI * 100); + }); + + it("arclength", () => { + assert.equal(circle2(10).arcLength(), TAU * 10); + }); + + it("vertices (num)", () => { + assert(eqDelta2array( + circle2(10).vertices(4), + [[10, 0], [0, 10], [-10, 0], [0, -10]] + )) + }); + + it("vertices ({ num })", () => { + assert(eqDelta2array( + circle2(10).vertices({ num: 4 }), + [[10, 0], [0, 10], [-10, 0], [0, -10]] + )) + }); + + it("vertices ({ num, last: true })", () => { + assert(eqDelta2array( + circle2(10).vertices({ num: 4, last: true }), + [[10, 0], [0, 10], [-10, 0], [0, -10], [10, 0]] + )) + }); + + it("vertices ({ theta })", () => { + assert(eqDelta2array( + circle2(10).vertices({ theta: HALF_PI }), + [[10, 0], [0, 10], [-10, 0], [0, -10]] + )) + }); + + it("vertices ({ dist })", () => { + assert(eqDelta2array( + circle2(10).vertices({ dist: TAU * 10 / 4 }), + [[10, 0], [0, 10], [-10, 0], [0, -10]] + )) + }); +}); diff --git a/packages/geom/test/index.ts b/packages/geom/test/index.ts deleted file mode 100644 index c6806587c5..0000000000 --- a/packages/geom/test/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { equiv } from "@thi.ng/equiv"; -import { Vec2 } from "@thi.ng/vectors/vec2"; -import * as assert from "assert"; -import { polygon2 } from "../src/index"; - -describe("polygon2", () => { - - it("area", () => { - const a = polygon2(Vec2.mapBuffer([0, 0, 100, 0, 100, 100, 0, 100], 4)); - assert.equal(a.area(), 100 * 100); - a.points.pop() - assert.equal(a.area(), 100 * 100 / 2); - }); - - it("circumference", () => { - const a = polygon2(Vec2.mapBuffer([0, 0, 100, 0, 100, 100, 0, 100], 4)); - assert.equal(a.arcLength(), 400); - a.points.pop() - assert.equal(a.arcLength(), 200 + Math.sqrt(2) * 100); - }); - - it("hiccup", () => { - const a = polygon2(Vec2.mapBuffer([0, 0, 100, 0, 100, 100, 0, 100], 4), { fill: "red" }); - assert( - equiv( - a.toHiccup(), - ["polygon", { fill: "red" }, [[0, 0], [100, 0], [100, 100], [0, 100]]] - ) - ); - }); -}); diff --git a/packages/geom/test/poly2.ts b/packages/geom/test/poly2.ts new file mode 100644 index 0000000000..292b81f86e --- /dev/null +++ b/packages/geom/test/poly2.ts @@ -0,0 +1,37 @@ +import { equiv } from "@thi.ng/equiv"; +import * as assert from "assert"; +import { polygon2, Polygon2, HiccupPolygon2 } from "../src/index"; + +describe("polygon2", () => { + + it("area", () => { + const a = polygon2([0, 0, 100, 0, 100, 100, 0, 100]); + assert.equal(a.area(), 100 * 100); + a.points.pop() + assert.equal(a.area(), 100 * 100 / 2); + }); + + it("circumference", () => { + const a = polygon2([0, 0, 100, 0, 100, 100, 0, 100]); + assert.equal(a.arcLength(), 400); + a.points.pop() + assert.equal(a.arcLength(), 200 + Math.sqrt(2) * 100); + }); + + it("hiccup", () => { + const src: HiccupPolygon2 = ["polygon", { fill: "red" }, [[0, 0], [100, 0], [100, 100], [0, 100]]]; + const src2: HiccupPolygon2 = ["polygon", { fill: "red" }, [0, 0, 100, 0, 100, 100, 0, 100]]; + let a = Polygon2.fromHiccup(src); + assert(equiv(a.points, src[2])); + assert.deepEqual(a.attribs, src[1]); + a = Polygon2.fromHiccup(src2); + assert(equiv(a.points, src[2])); + assert.deepEqual(a.attribs, src2[1]); + assert( + equiv( + a.toHiccup(), + src + ) + ); + }); +}); diff --git a/packages/geom/tsconfig.json b/packages/geom/tsconfig.json index bd6481a5a6..f6c291a0a0 100644 --- a/packages/geom/tsconfig.json +++ b/packages/geom/tsconfig.json @@ -6,4 +6,4 @@ "include": [ "./src/**/*.ts" ] -} +} \ No newline at end of file From 296e1e074442f7147578cd5c2f2fc8abcecc62ba Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Mon, 8 Oct 2018 15:48:03 +0100 Subject: [PATCH 55/77] refactor: update Infinity consts in various packages --- packages/cache/src/lru.ts | 4 ++-- packages/iterators/src/consume.ts | 2 +- packages/iterators/src/range.ts | 2 +- packages/iterators/src/repeat.ts | 2 +- packages/iterators/src/repeatedly.ts | 2 +- packages/rstream/src/from/interval.ts | 2 +- packages/transducers/src/iter/range.ts | 2 +- packages/transducers/src/iter/repeat.ts | 2 +- packages/transducers/src/iter/repeatedly.ts | 2 +- packages/transducers/src/rfn/max.ts | 2 +- packages/transducers/src/rfn/min.ts | 2 +- packages/vectors/src/api.ts | 4 ++-- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/cache/src/lru.ts b/packages/cache/src/lru.ts index 4c03175270..8c9d18026a 100644 --- a/packages/cache/src/lru.ts +++ b/packages/cache/src/lru.ts @@ -12,8 +12,8 @@ export class LRUCache implements ICache { constructor(pairs?: Iterable<[K, V]>, opts?: Partial>) { const _opts = >Object.assign({ - maxlen: Number.POSITIVE_INFINITY, - maxsize: Number.POSITIVE_INFINITY, + maxlen: Infinity, + maxsize: Infinity, map: () => new Map(), ksize: () => 0, vsize: () => 0, diff --git a/packages/iterators/src/consume.ts b/packages/iterators/src/consume.ts index ed7ed0d143..37bc6f85dc 100644 --- a/packages/iterators/src/consume.ts +++ b/packages/iterators/src/consume.ts @@ -1,4 +1,4 @@ -export function consume(iter: Iterator, n = Number.POSITIVE_INFINITY) { +export function consume(iter: Iterator, n = Infinity) { while (n-- > 0 && !iter.next().done) { } return iter; } diff --git a/packages/iterators/src/range.ts b/packages/iterators/src/range.ts index 89db57e105..d98f310c30 100644 --- a/packages/iterators/src/range.ts +++ b/packages/iterators/src/range.ts @@ -5,7 +5,7 @@ export function range(from: number, to: number, step: number): IterableIterator< export function* range(from?: number, to?: number, step?: number) { if (from === undefined) { from = 0; - to = Number.POSITIVE_INFINITY; + to = Infinity; } else if (to === undefined) { to = from; from = 0; diff --git a/packages/iterators/src/repeat.ts b/packages/iterators/src/repeat.ts index cf4658e605..6afeb86f58 100644 --- a/packages/iterators/src/repeat.ts +++ b/packages/iterators/src/repeat.ts @@ -1,4 +1,4 @@ -export function* repeat(x: T, n = Number.POSITIVE_INFINITY) { +export function* repeat(x: T, n = Infinity) { while (n-- > 0) { yield x; } diff --git a/packages/iterators/src/repeatedly.ts b/packages/iterators/src/repeatedly.ts index 8e4117609a..6456d88f21 100644 --- a/packages/iterators/src/repeatedly.ts +++ b/packages/iterators/src/repeatedly.ts @@ -1,4 +1,4 @@ -export function* repeatedly(fn: () => T, n = Number.POSITIVE_INFINITY) { +export function* repeatedly(fn: () => T, n = Infinity) { while (n-- > 0) { yield fn(); } diff --git a/packages/rstream/src/from/interval.ts b/packages/rstream/src/from/interval.ts index d3f03f28ac..b92c6b2f56 100644 --- a/packages/rstream/src/from/interval.ts +++ b/packages/rstream/src/from/interval.ts @@ -10,7 +10,7 @@ import { Subscription } from "../subscription"; * @param delay * @param count */ -export function fromInterval(delay: number, count = Number.POSITIVE_INFINITY) { +export function fromInterval(delay: number, count = Infinity) { return new Stream((stream) => { let i = 0; stream.next(i++); diff --git a/packages/transducers/src/iter/range.ts b/packages/transducers/src/iter/range.ts index 89db57e105..d98f310c30 100644 --- a/packages/transducers/src/iter/range.ts +++ b/packages/transducers/src/iter/range.ts @@ -5,7 +5,7 @@ export function range(from: number, to: number, step: number): IterableIterator< export function* range(from?: number, to?: number, step?: number) { if (from === undefined) { from = 0; - to = Number.POSITIVE_INFINITY; + to = Infinity; } else if (to === undefined) { to = from; from = 0; diff --git a/packages/transducers/src/iter/repeat.ts b/packages/transducers/src/iter/repeat.ts index cf4658e605..6afeb86f58 100644 --- a/packages/transducers/src/iter/repeat.ts +++ b/packages/transducers/src/iter/repeat.ts @@ -1,4 +1,4 @@ -export function* repeat(x: T, n = Number.POSITIVE_INFINITY) { +export function* repeat(x: T, n = Infinity) { while (n-- > 0) { yield x; } diff --git a/packages/transducers/src/iter/repeatedly.ts b/packages/transducers/src/iter/repeatedly.ts index 8e4117609a..6456d88f21 100644 --- a/packages/transducers/src/iter/repeatedly.ts +++ b/packages/transducers/src/iter/repeatedly.ts @@ -1,4 +1,4 @@ -export function* repeatedly(fn: () => T, n = Number.POSITIVE_INFINITY) { +export function* repeatedly(fn: () => T, n = Infinity) { while (n-- > 0) { yield fn(); } diff --git a/packages/transducers/src/rfn/max.ts b/packages/transducers/src/rfn/max.ts index 8c5eeadb15..56658f82ef 100644 --- a/packages/transducers/src/rfn/max.ts +++ b/packages/transducers/src/rfn/max.ts @@ -6,5 +6,5 @@ export function max(xs: Iterable): number; export function max(xs?: Iterable): any { return xs ? reduce(max(), xs) : - reducer(() => Number.NEGATIVE_INFINITY, (acc, x: number) => Math.max(acc, x)); + reducer(() => -Infinity, (acc, x: number) => Math.max(acc, x)); } diff --git a/packages/transducers/src/rfn/min.ts b/packages/transducers/src/rfn/min.ts index b159c97cd1..f4fda255f2 100644 --- a/packages/transducers/src/rfn/min.ts +++ b/packages/transducers/src/rfn/min.ts @@ -6,5 +6,5 @@ export function min(xs: Iterable): number; export function min(xs?: Iterable): any { return xs ? reduce(min(), xs) : - reducer(() => Number.POSITIVE_INFINITY, (acc, x: number) => Math.min(acc, x)); + reducer(() => Infinity, (acc, x: number) => Math.min(acc, x)); } diff --git a/packages/vectors/src/api.ts b/packages/vectors/src/api.ts index 8cef9e4a61..c3ece347d7 100644 --- a/packages/vectors/src/api.ts +++ b/packages/vectors/src/api.ts @@ -194,8 +194,8 @@ export interface IPolar { toCartesian(offset?: Readonly): T; } -const min = Number.NEGATIVE_INFINITY; -const max = Number.POSITIVE_INFINITY; +const min = -Infinity; +const max = Infinity; export const MIN4 = Object.freeze([min, min, min, min]); export const MAX4 = Object.freeze([max, max, max, max]); export const ONE4 = Object.freeze([1, 1, 1, 1]); From 3a20ef34114061edfc995e112d3e03486f64c0df Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 10 Oct 2018 00:14:06 +0100 Subject: [PATCH 56/77] feat(geom): add/update various shape impls & ops --- packages/geom/src/api.ts | 28 +++- packages/geom/src/arc2.ts | 22 ++- packages/geom/src/bezier2.ts | 31 +++- packages/geom/src/circle2.ts | 42 +++-- packages/geom/src/container2.ts | 14 +- packages/geom/src/container3.ts | 8 +- packages/geom/src/fit.ts | 2 +- packages/geom/src/index.ts | 4 + packages/geom/src/internal/arc-length.ts | 2 +- packages/geom/src/internal/barycentric.ts | 25 +++ packages/geom/src/internal/bounds.ts | 61 ++++--- packages/geom/src/internal/centroid.ts | 3 +- packages/geom/src/internal/circumcenter.ts | 72 ++++---- packages/geom/src/internal/closest-point.ts | 6 +- packages/geom/src/internal/corner.ts | 42 ++++- .../internal/douglas\342\200\223peucker.ts" | 60 +++---- packages/geom/src/internal/eq-delta.ts | 11 ++ packages/geom/src/internal/liang-barsky.ts | 50 ++++++ .../geom/src/internal/sutherland-hodgeman.ts | 5 +- packages/geom/src/line2.ts | 29 +++- packages/geom/src/path2.ts | 48 ++++-- packages/geom/src/polygon2.ts | 58 +++++-- packages/geom/src/polyline2.ts | 41 ++++- packages/geom/src/quad2.ts | 82 +++++++++ packages/geom/src/rect2.ts | 56 +++++-- packages/geom/src/sampler.ts | 5 +- packages/geom/src/subdiv-curve.ts | 36 +++- packages/geom/src/tessellate.ts | 156 ++++++++++++++++++ packages/geom/src/triangle2.ts | 98 +++++++++++ packages/geom/src/warp.ts | 12 ++ 30 files changed, 908 insertions(+), 201 deletions(-) create mode 100644 packages/geom/src/internal/barycentric.ts create mode 100644 packages/geom/src/internal/eq-delta.ts create mode 100644 packages/geom/src/internal/liang-barsky.ts create mode 100644 packages/geom/src/quad2.ts create mode 100644 packages/geom/src/tessellate.ts create mode 100644 packages/geom/src/triangle2.ts create mode 100644 packages/geom/src/warp.ts diff --git a/packages/geom/src/api.ts b/packages/geom/src/api.ts index ef1b00faaa..8f320d7cb2 100644 --- a/packages/geom/src/api.ts +++ b/packages/geom/src/api.ts @@ -1,11 +1,14 @@ import { IObjectOf } from "@thi.ng/api/api"; -import { Vec, ReadonlyVec, IVector } from "@thi.ng/vectors/api"; +import { IVector, ReadonlyVec, Vec } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; export const DEFAULT_SAMPLES = 32; export type Attribs = IObjectOf; +export type Tessellator> = + (points: ReadonlyArray) => T[][]; + export const enum LineIntersectionType { PARALLEL, COINCIDENT, @@ -42,7 +45,7 @@ export interface LineIntersection { export interface PathSegment { type: SegmentType; point?: Vec2; - geo?: IBoundsRaw & IVertices; + geo?: IBoundsRaw & IVertices & IHiccupPathSegment; } export interface SamplingOpts { @@ -142,6 +145,18 @@ export interface ICentroid { centroid(c?: T): T; } +export interface ICenter { + center(origin?: Readonly): this; +} + +export interface IClassifyPoint { + classifyPoint(p: Readonly): number; +} + +export interface IPointInside { + pointInside(p: Readonly): boolean; +} + export interface ICollate { /** * Collates all points into a single buffer and remaps existing @@ -157,6 +172,15 @@ export interface IEdges { edges(opts?: any): Iterable; } +export interface IHiccupPathSegment { + toHiccupPathSegments(): any[]; +} + +export interface IPointMap { + mapPoint(p: Readonly, out?: B): B; + unmapPoint(p: Readonly, out?: A): A; +} + export interface IToPolygon { // FIXME return type should be interface toPolygon(opts?: O): any; diff --git a/packages/geom/src/arc2.ts b/packages/geom/src/arc2.ts index c832a73ab3..016cb01885 100644 --- a/packages/geom/src/arc2.ts +++ b/packages/geom/src/arc2.ts @@ -1,3 +1,4 @@ +import { ICopy } from "@thi.ng/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { range } from "@thi.ng/transducers/iter/range"; @@ -25,6 +26,7 @@ import { DEFAULT_SAMPLES, HiccupArc2, IBounds, + IBoundsRaw, IEdges, IVertices, JsonArc2, @@ -37,6 +39,8 @@ import { Sampler } from "./sampler"; export class Arc2 implements IBounds, + IBoundsRaw, + ICopy, IEdges, IVertices> { @@ -212,9 +216,21 @@ export class Arc2 implements } toHiccup() { - return ["path", this.attribs, [ - ["M", this.pointAtTheta(this.start)], - ["A", this.r, this.axis, this.xl, this.clockwise, this.pointAtTheta(this.end)] + return ["path", this.attribs, + [ + ["M", this.pointAtTheta(this.start)], + ...this.toHiccupPathSegments() + ] + ]; + } + + toHiccupPathSegments() { + return [["A", + this.r, + this.axis, + this.xl ? 1 : 0, + this.clockwise ? 1 : 0, + this.pointAtTheta(this.end) ]]; } diff --git a/packages/geom/src/bezier2.ts b/packages/geom/src/bezier2.ts index 72ead24645..2c1b5ab82e 100644 --- a/packages/geom/src/bezier2.ts +++ b/packages/geom/src/bezier2.ts @@ -2,15 +2,11 @@ import { ICopy } from "@thi.ng/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { IMath } from "@thi.ng/vectors/api"; +import { clamp1 } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; -import { - DEFAULT_SAMPLES, - IVertices, - SamplingOpts -} from "./api"; +import { DEFAULT_SAMPLES, IVertices, SamplingOpts } from "./api"; import { PointContainer2 } from "./container2"; import { Sampler } from "./sampler"; -import { clamp1 } from "@thi.ng/vectors/math"; export const mixQuadratic1 = (a: number, b: number, c: number, t: number) => { const s = 1 - t; @@ -144,12 +140,20 @@ export class Cubic2 extends PointContainer2 implements } toHiccup() { + return ["path", this.attribs, + [ + ["M", this.points[0]], + ...this.toHiccupPathSegments() + ] + ]; + } + + toHiccupPathSegments() { const pts = this.points; - return ["path", this.attribs, [["M", pts[0]], ["C", pts[1], pts[2], pts[3]]]]; + return [["C", pts[1], pts[2], pts[3]]]; } } -// https://github.com/uxebu/bonsai/blob/master/src/runner/path/curved_path.js export class Quadratic2 extends PointContainer2 implements IVertices> { @@ -250,7 +254,16 @@ export class Quadratic2 extends PointContainer2 implements } toHiccup() { + return ["path", this.attribs, + [ + ["M", this.points[0]], + ...this.toHiccupPathSegments() + ] + ]; + } + + toHiccupPathSegments() { const pts = this.points; - return ["path", this.attribs, [["M", pts[0]], ["Q", pts[1], pts[2]]]]; + return [["Q", pts[1], pts[2]]]; } } diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index 15cbd296c3..695eb6efbf 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -1,8 +1,8 @@ -import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; +import { IToHiccup } from "@thi.ng/api/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { Vec } from "@thi.ng/vectors/api"; -import { PI, TAU } from "@thi.ng/vectors/math"; +import { PI, TAU, eqDelta1 } from "@thi.ng/vectors/math"; import { asVec2, setS2, @@ -10,6 +10,7 @@ import { Vec2 } from "@thi.ng/vectors/vec2"; import { + Attribs, DEFAULT_SAMPLES, HiccupCircle2, IArcLength, @@ -19,7 +20,9 @@ import { IToPolygon, IVertices, JsonCircle2, - SamplingOpts + SamplingOpts, + IPointInside, + IClassifyPoint } from "./api"; import { circumCenter } from "./internal/circumcenter"; import { edges } from "./internal/edges"; @@ -31,6 +34,8 @@ export class Circle2 implements IBoundsRaw, IBounds, ICentroid, + IClassifyPoint, + IPointInside, IToHiccup, IToPolygon>, IVertices> { @@ -47,18 +52,21 @@ export class Circle2 implements return new Circle2(asVec2(spec[2]), spec[3], spec[1]); } - static from3Points(a: Readonly, b: Readonly, c: Readonly) { + static from2Points(a: Readonly, b: Readonly, attribs?: Attribs) { + return new Circle2(a.mixNewN(b), a.dist(b) / 2, attribs); + } + static from3Points(a: Readonly, b: Readonly, c: Readonly, attribs?: Attribs) { const o = circumCenter(a, b, c); if (o) { - return new Circle2(o, a.dist(o)); + return new Circle2(o, a.dist(o), attribs); } } pos: Vec2; r: number; - attribs: IObjectOf; + attribs: Attribs; - constructor(pos: Vec2, r = 1, attribs?: IObjectOf) { + constructor(pos: Vec2, r = 1, attribs?: Attribs) { this.pos = pos; this.r = r; this.attribs = attribs; @@ -125,6 +133,16 @@ export class Circle2 implements return c ? c.set(this.pos) : this.pos; } + classifyPoint(p: Readonly) { + const d = p.distSq(this.pos); + const r = this.r * this.r; + return eqDelta1(d, r) ? 0 : d < r ? 1 : -1; + } + + pointInside(p: Readonly) { + return this.classifyPoint(p) >= 0; + } + toPolygon(opts?: number | Partial) { return new Polygon2(this.vertices(opts)); } @@ -143,11 +161,11 @@ export class Circle2 implements } } -export function circle2(r: number, attribs?: IObjectOf): Circle2; -export function circle2(x: number, y: number, attribs?: IObjectOf): Circle2; -export function circle2(x: number, y: number, r: number, attribs?: IObjectOf): Circle2; -export function circle2(pos: Vec2, attribs?: IObjectOf): Circle2; -export function circle2(pos: Vec2, r: number, attribs?: IObjectOf): Circle2; +export function circle2(r: number, attribs?: Attribs): Circle2; +export function circle2(x: number, y: number, attribs?: Attribs): Circle2; +export function circle2(x: number, y: number, r: number, attribs?: Attribs): Circle2; +export function circle2(pos: Vec2, attribs?: Attribs): Circle2; +export function circle2(pos: Vec2, r: number, attribs?: Attribs): Circle2; export function circle2(...args: any[]) { let attribs; let n = args.length - 1; diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts index e711649258..f91037c8cb 100644 --- a/packages/geom/src/container2.ts +++ b/packages/geom/src/container2.ts @@ -1,14 +1,16 @@ -import { IObjectOf } from "@thi.ng/api/api"; import { Mat23 } from "@thi.ng/vectors/mat23"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { + Attribs, CollateOpts, IBounds, IBoundsRaw, + ICenter, ICentroid, ICollate, IVertices } from "./api"; +import { fitIntoBounds2 } from "./fit"; import { bounds } from "./internal/bounds"; import { centroid } from "./internal/centroid"; import { collateWith } from "./internal/collate"; @@ -19,13 +21,14 @@ export class PointContainer2 implements IBoundsRaw, IBounds, ICentroid, + ICenter, ICollate, IVertices { points: Vec2[]; - attribs: IObjectOf; + attribs: Attribs; - constructor(pts: Vec2[], attribs?: IObjectOf) { + constructor(pts: Vec2[], attribs?: Attribs) { this.points = pts; this.attribs = attribs; } @@ -67,6 +70,11 @@ export class PointContainer2 implements this.points.reverse(); } + fit(bounds: Rect2) { + fitIntoBounds2(this, bounds); + return this; + } + rotate(theta: number) { const pts = this.points; for (let i = pts.length; --i >= 0;) { diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts index 3a1de1d26f..4a57edf5f1 100644 --- a/packages/geom/src/container3.ts +++ b/packages/geom/src/container3.ts @@ -1,11 +1,12 @@ -import { IObjectOf } from "@thi.ng/api/api"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { Mat44 } from "@thi.ng/vectors/mat44"; import { Vec3, vec3 } from "@thi.ng/vectors/vec3"; import { + Attribs, CollateOpts, IBounds, IBoundsRaw, + ICenter, ICentroid, ICollate, IVertices @@ -17,13 +18,14 @@ export class PointContainer3 implements IBoundsRaw, IBounds, // TODO ICentroid, + ICenter, ICollate, IVertices { points: Vec3[]; - attribs: IObjectOf; + attribs: Attribs; - constructor(pts: Vec3[], attribs?: IObjectOf) { + constructor(pts: Vec3[], attribs?: Attribs) { this.points = pts; this.attribs = attribs; } diff --git a/packages/geom/src/fit.ts b/packages/geom/src/fit.ts index 1a11bdaf3b..2c7828dcbb 100644 --- a/packages/geom/src/fit.ts +++ b/packages/geom/src/fit.ts @@ -4,7 +4,7 @@ import { IBounds, ICentroid, ITransformable } from "./api"; import { collBounds } from "./internal/bounds"; import { Rect2 } from "./rect2"; -const translateScale = (shape, c1, c2, smat) => +const translateScale = (shape: ITransformable, c1: Vec2, c2: Vec2, smat: Mat23) => shape.transform( Mat23.concat( Mat23.translation(c1), diff --git a/packages/geom/src/index.ts b/packages/geom/src/index.ts index 04d8bf6df5..46762d01db 100644 --- a/packages/geom/src/index.ts +++ b/packages/geom/src/index.ts @@ -11,8 +11,12 @@ export * from "./line2"; export * from "./path2"; export * from "./polygon2"; export * from "./polyline2"; +export * from "./quad2"; export * from "./rect2"; export * from "./sampler"; +export * from "./triangle2"; export * from "./fit"; export * from "./subdiv-curve"; +export * from "./tessellate"; +export * from "./warp"; diff --git a/packages/geom/src/internal/arc-length.ts b/packages/geom/src/internal/arc-length.ts index d8f108749b..31ed1e0fbe 100644 --- a/packages/geom/src/internal/arc-length.ts +++ b/packages/geom/src/internal/arc-length.ts @@ -3,9 +3,9 @@ import { IVector } from "@thi.ng/vectors/api"; export const arcLength = >(pts: ReadonlyArray, closed = false) => { const num = pts.length; if (num < 2) return 0; + let res = 0; let p = pts[0]; let q = pts[1]; - let res = 0; for (let i = 1; i < num; i++ , p = q, q = pts[i]) { res += p.dist(q); } diff --git a/packages/geom/src/internal/barycentric.ts b/packages/geom/src/internal/barycentric.ts new file mode 100644 index 0000000000..0eb94072f0 --- /dev/null +++ b/packages/geom/src/internal/barycentric.ts @@ -0,0 +1,25 @@ +import { IVector } from "@thi.ng/vectors/api"; +import { Vec3 } from "@thi.ng/vectors/vec3"; + +export const toBarycentric = + > + (a: Readonly, b: Readonly, c: Readonly, p: Readonly, out = new Vec3()) => { + + const u = b.subNew(a); + const v = c.subNew(a); + const w = p.subNew(a); + const uu = u.magSq(); + const vv = v.magSq(); + const uv = u.dot(v); + const uw = u.dot(w); + const vw = v.dot(w); + const d = 1 / (uv * uv - uu * vv); + const s = d * (uv * vw - vv * uw); + const t = d * (uv * uw - uu * vw); + return out.setS(1 - (s + t), s, t); + }; + +export const fromBarycentric = + > + (a: Readonly, b: Readonly, c: Readonly, p: Readonly, out?: T) => + a.mulNewN(p.x, out).maddN(b, p.y).maddN(c, p.z); diff --git a/packages/geom/src/internal/bounds.ts b/packages/geom/src/internal/bounds.ts index 297579fdd3..5d4cb1118d 100644 --- a/packages/geom/src/internal/bounds.ts +++ b/packages/geom/src/internal/bounds.ts @@ -1,31 +1,40 @@ import { IVector } from "@thi.ng/vectors/api"; import { IBounds, IUnion } from "../api"; -export const axisBounds = >(points: ReadonlyArray, axis: number): [number, number] => { - let min = Number.POSITIVE_INFINITY, - max = Number.NEGATIVE_INFINITY; - for (let i = points.length; --i >= 0;) { - const x = points[i][axis]; - x < min && (min = x); - x > max && (max = x); - } - return [min, max]; -}; +export const axisBounds = + > + (points: ReadonlyArray, axis: number): [number, number] => { -export const bounds = >(pts: ReadonlyArray, vmin: T, vmax: T): [T, T] => { - for (let i = pts.length; --i >= 0;) { - const p = pts[i]; - vmin.min(p); - vmax.max(p); - } - return [vmin, vmax]; -}; + let min = Infinity; + let max = -Infinity; + for (let i = points.length; --i >= 0;) { + const x = points[i][axis]; + x < min && (min = x); + x > max && (max = x); + } + return [min, max]; + }; -export const collBounds = , B extends IBounds & IUnion>(shapes: T[]) => { - let n = shapes.length - 1; - let res: B = n > 0 ? shapes[n].bounds() : undefined; - for (; --n >= 0;) { - res = res.union(shapes[n].bounds()); - } - return res; -}; +export const bounds = + > + (pts: ReadonlyArray, vmin: T, vmax: T): [T, T] => { + + for (let i = pts.length; --i >= 0;) { + const p = pts[i]; + vmin.min(p); + vmax.max(p); + } + return [vmin, vmax]; + }; + +export const collBounds = + , B extends IBounds & IUnion> + (shapes: T[]) => { + + let n = shapes.length - 1; + let res: B = n > 0 ? shapes[n].bounds() : undefined; + for (; --n >= 0;) { + res = res.union(shapes[n].bounds()); + } + return res; + }; diff --git a/packages/geom/src/internal/centroid.ts b/packages/geom/src/internal/centroid.ts index 146b1ef4b0..e84643f1ef 100644 --- a/packages/geom/src/internal/centroid.ts +++ b/packages/geom/src/internal/centroid.ts @@ -2,9 +2,10 @@ import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { IVector } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; -export const centroid = >(pts: T[], c: T) => { +export const centroid = >(pts: ReadonlyArray, c?: T) => { const num = pts.length; !num && illegalArgs("no points available"); + !c && (c = pts[0].empty()); for (let i = num; --i >= 0;) { c.add(pts[i]); } diff --git a/packages/geom/src/internal/circumcenter.ts b/packages/geom/src/internal/circumcenter.ts index f36143d406..944b32b19b 100644 --- a/packages/geom/src/internal/circumcenter.ts +++ b/packages/geom/src/internal/circumcenter.ts @@ -1,41 +1,43 @@ import { Vec2 } from "@thi.ng/vectors/vec2"; import { EPS } from "@thi.ng/vectors/math"; -export const circumCenter = (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => { - const deltaAB = Math.abs(a.y - b.y); - const deltaBC = Math.abs(b.y - c.y); - if (deltaAB < eps && deltaBC < eps) { - return null; - } - const ax = a.x, ay = a.y; - const bx = b.x, by = b.y; - const cx = c.x, cy = c.y; - let m1, m2, mx1, mx2, my1, my2, xc, yc; - if (deltaAB < eps) { - m2 = - (cx - bx) / (cy - by); - mx2 = (bx + cx) / 2; - my2 = (by + cy) / 2; - xc = (bx + ax) / 2; - yc = m2 * (xc - mx2) + my2; - } else if (deltaBC < eps) { - m1 = - (bx - ax) / (by - ay); - mx1 = (ax + bx) / 2; - my1 = (ay + by) / 2; - xc = (cx + bx) / 2; - yc = m1 * (xc - mx1) + my1; - } else { - m1 = - (bx - ax) / (by - ay); - m2 = - (cx - bx) / (cy - by); - mx1 = (ax + bx) / 2; - my1 = (ay + by) / 2; - mx2 = (bx + cx) / 2; - my2 = (by + cy) / 2; - xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2); - if (deltaAB > deltaBC) { +export const circumCenter = + (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => { + + const deltaAB = Math.abs(a.y - b.y); + const deltaBC = Math.abs(b.y - c.y); + if (deltaAB < eps && deltaBC < eps) { + return null; + } + const ax = a.x, ay = a.y; + const bx = b.x, by = b.y; + const cx = c.x, cy = c.y; + let m1, m2, mx1, mx2, my1, my2, xc, yc; + if (deltaAB < eps) { + m2 = - (cx - bx) / (cy - by); + mx2 = (bx + cx) / 2; + my2 = (by + cy) / 2; + xc = (bx + ax) / 2; + yc = m2 * (xc - mx2) + my2; + } else if (deltaBC < eps) { + m1 = - (bx - ax) / (by - ay); + mx1 = (ax + bx) / 2; + my1 = (ay + by) / 2; + xc = (cx + bx) / 2; yc = m1 * (xc - mx1) + my1; } else { - yc = m2 * (xc - mx2) + my2; + m1 = - (bx - ax) / (by - ay); + m2 = - (cx - bx) / (cy - by); + mx1 = (ax + bx) / 2; + my1 = (ay + by) / 2; + mx2 = (bx + cx) / 2; + my2 = (by + cy) / 2; + xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2); + if (deltaAB > deltaBC) { + yc = m1 * (xc - mx1) + my1; + } else { + yc = m2 * (xc - mx2) + my2; + } } - } - return new Vec2(xc, yc); -} + return new Vec2(xc, yc); + }; diff --git a/packages/geom/src/internal/closest-point.ts b/packages/geom/src/internal/closest-point.ts index 9565f91a8d..ca8db6d33f 100644 --- a/packages/geom/src/internal/closest-point.ts +++ b/packages/geom/src/internal/closest-point.ts @@ -3,7 +3,7 @@ import { IVector } from "@thi.ng/vectors/api"; export const closestPoint = >(p: T, pts: T[]) => { - let minD = Number.POSITIVE_INFINITY; + let minD = Infinity; let closest: T; for (let i = pts.length; --i >= 0;) { const d = pts[i].distSq(p); @@ -39,12 +39,12 @@ export const closestPointSegment = }; export const closestPointPolyline = - >(p: T, pts: T[], closed = false) => { + >(p: Readonly, pts: ReadonlyArray, closed = false) => { const closest = pts[0].empty(); const tmp = closest.empty(); const n = pts.length - 1; - let minD = Number.POSITIVE_INFINITY, i, j; + let minD = Infinity, i, j; if (closed) { i = n; j = 0; diff --git a/packages/geom/src/internal/corner.ts b/packages/geom/src/internal/corner.ts index 894d5b0a02..4a03bab242 100644 --- a/packages/geom/src/internal/corner.ts +++ b/packages/geom/src/internal/corner.ts @@ -1,11 +1,37 @@ import { EPS, sign1 } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; -export const corner = (a: Readonly, b: Readonly, c: Readonly) => { - const ax = a.x, - ay = a.y; - return (b.x - ax) * (c.y - ay) - (c.x - ax) * (b.y - ay); -}; - -export const classify = (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => - sign1(corner(a, b, c), eps); +export const corner = + (a: Readonly, b: Readonly, c: Readonly) => { + const ax = a.x; + const ay = a.y; + return (b.x - ax) * (c.y - ay) - (c.x - ax) * (b.y - ay); + }; + +export const classify = + (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => + sign1(corner(a, b, c), eps); + +export const clockwise2 = + (a: Readonly, b: Readonly, c: Readonly) => + corner(a, b, c) < 0; + +export const classifyPointInTriangle2 = + (p: Readonly, a: Readonly, b: Readonly, c: Readonly) => { + const s = clockwise2(a, b, c) ? 1 : -1; + return sign1( + Math.min( + s * corner(a, c, p), + s * corner(b, a, p), + s * corner(c, b, p) + ) + ); + }; + +export const pointInTriangle2 = + (p: Readonly, a: Readonly, b: Readonly, c: Readonly) => { + const s = clockwise2(a, b, c) ? 1 : -1; + return s * corner(a, c, p) >= 0 && + s * corner(b, a, p) >= 0 && + s * corner(c, b, p) >= 0; + }; diff --git "a/packages/geom/src/internal/douglas\342\200\223peucker.ts" "b/packages/geom/src/internal/douglas\342\200\223peucker.ts" index 2cca00d874..47ba3f1336 100644 --- "a/packages/geom/src/internal/douglas\342\200\223peucker.ts" +++ "b/packages/geom/src/internal/douglas\342\200\223peucker.ts" @@ -4,38 +4,40 @@ import { peek } from "@thi.ng/transducers/func/peek"; // https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm -export const simplify = >(pts: T[], eps = 0, closed = false) => { - let num = pts.length; - const res: T[] = []; - const visited: boolean[] = []; - if (num <= 2) { - return pts.slice(); - } - if (closed && !pts[0].eqDelta(peek(pts))) { - pts = pts.slice(); - pts.push(pts[0]); - num++; - } +export const simplifyPolyline = + >(pts: T[], eps = 0, closed = false) => { - const $ = (from: number, to: number) => { - visited[from] = visited[to] = true; - if (to <= from + 1) { - return; + let num = pts.length; + const visited: boolean[] = []; + if (num <= 2) { + return pts.slice(); } - const [maxIdx, maxD] = farthestPointSegment(pts[from], pts[to], pts, from + 1, to); - if (maxD <= eps) { - return; + if (closed && !pts[0].eqDelta(peek(pts))) { + pts = pts.slice(); + pts.push(pts[0]); + num++; } - $(from, maxIdx); - $(maxIdx, to); - }; - $(0, num - 1); + const $ = (from: number, to: number) => { + visited[from] = visited[to] = true; + if (to <= from + 1) { + return; + } + const [maxIdx, maxD] = farthestPointSegment(pts[from], pts[to], pts, from + 1, to); + if (maxD <= eps) { + return; + } + $(from, maxIdx); + $(maxIdx, to); + }; + + $(0, num - 1); - for (let i = 0, n = closed ? num - 1 : num; i < n; i++) { - if (visited[i]) { - res.push(pts[i]); + const res: T[] = []; + for (let i = 0, n = closed ? num - 1 : num; i < n; i++) { + if (visited[i]) { + res.push(pts[i]); + } } - } - return res; -}; + return res; + }; diff --git a/packages/geom/src/internal/eq-delta.ts b/packages/geom/src/internal/eq-delta.ts new file mode 100644 index 0000000000..3f62634e13 --- /dev/null +++ b/packages/geom/src/internal/eq-delta.ts @@ -0,0 +1,11 @@ +import { IVector } from "@thi.ng/vectors/api"; +import { EPS } from "@thi.ng/vectors/math"; + +export const containsDelta = >(pts: Iterable, q: Readonly, eps = EPS) => { + for (let p of pts) { + if (p.eqDelta(q, eps)) { + return true; + } + } + return false; +}; diff --git a/packages/geom/src/internal/liang-barsky.ts b/packages/geom/src/internal/liang-barsky.ts new file mode 100644 index 0000000000..7885d72c4e --- /dev/null +++ b/packages/geom/src/internal/liang-barsky.ts @@ -0,0 +1,50 @@ +import { EPS } from "@thi.ng/vectors/math"; +import { Vec2 } from "@thi.ng/vectors/vec2"; + +// https://en.wikipedia.org/wiki/Liang%E2%80%93Barsky_algorithm +// https://github.com/thi-ng/c-thing/blob/master/src/geom/clip/liangbarsky.c + +export const liangBarsky2 = + (la: Vec2, lb: Vec2, tl: Vec2, br: Vec2, ca?: Vec2, cb?: Vec2): [Vec2, Vec2, number, number] => { + const [lax, lay] = la; + const dx = lb.x - lax; + const dy = lb.y - lay; + let a = 0; + let b = 1; + + const clip = (p: number, q: number) => { + if (q < 0 && Math.abs(p) < EPS) { + return 0; + } + const r = q / p; + if (p < 0) { + if (r > b) { + return false; + } else if (r > a) { + a = r; + } + } else if (p > 0) { + if (r < a) { + return false; + } else if (r < b) { + b = r; + } + } + return true; + }; + + if (!(clip(-dx, -(tl.x - lax)) && + clip(dx, br.x - lax) && + clip(-dy, -(tl.y - lay)) && + clip(dy, br.y - lay))) { + return; + } + + !ca && (ca = new Vec2()); + !cb && (cb = new Vec2()); + + ca.setS(a * dx + lax, a * dy + lay); + cb.setS(b * dx + lax, b * dy + lay); + + return [ca, cb, a, b]; + }; diff --git a/packages/geom/src/internal/sutherland-hodgeman.ts b/packages/geom/src/internal/sutherland-hodgeman.ts index 8517166b39..fe4b1ea771 100644 --- a/packages/geom/src/internal/sutherland-hodgeman.ts +++ b/packages/geom/src/internal/sutherland-hodgeman.ts @@ -3,8 +3,9 @@ import { classify } from "./corner"; import { intersectLines2 } from "./line-intersection"; /** - * Sutherland-Hodgeman convex polygon clipping. - * Returns new array of clipped vertices. + * Extended version of Sutherland-Hodgeman convex polygon clipping + * supporting any convex boundary (not only rects). Returns new array of + * clipped vertices. * * https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm * diff --git a/packages/geom/src/line2.ts b/packages/geom/src/line2.ts index 713bb4036a..a7f25d6bf7 100644 --- a/packages/geom/src/line2.ts +++ b/packages/geom/src/line2.ts @@ -1,11 +1,13 @@ -import { PointContainer2 } from "./container2"; -import { Attribs, SamplingOpts, HiccupLine2 } from "./api"; -import { Vec2 } from "@thi.ng/vectors/vec2"; -import { Sampler } from "./sampler"; +import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { intersectLines2 } from "./internal/line-intersection"; import { Vec } from "@thi.ng/vectors/api"; -import { isNumber } from "@thi.ng/checks/is-number"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { Attribs, HiccupLine2, SamplingOpts } from "./api"; +import { PointContainer2 } from "./container2"; +import { liangBarsky2 } from "./internal/liang-barsky"; +import { intersectLines2 } from "./internal/line-intersection"; +import { Rect2 } from "./rect2"; +import { Sampler } from "./sampler"; export class Line2 extends PointContainer2 { @@ -51,10 +53,23 @@ export class Line2 extends PointContainer2 { return intersectLines2(this.points[0], this.points[1], l.points[0], l.points[1]); } + clipRect(bounds: [Vec2, Vec2] | Rect2) { + const res = bounds instanceof Rect2 ? + liangBarsky2(this.points[0], this.points[1], bounds.pos, bounds.pos.addNew(bounds.size)) : + liangBarsky2(this.points[0], this.points[1], bounds[0], bounds[1]); + if (res) { + return new Line2([res[0], res[1]], { ...this.attribs }); + } + } + toHiccup(): HiccupLine2 { return ["line", this.attribs || {}, this.points[0], this.points[1]]; } + toHiccupPathSegments() { + return [["L", this.points[1]]]; + } + toJSON() { return this._toJSON("line2"); } @@ -77,4 +92,4 @@ export function line2(...args: any[]) { return new Line2([args[0], args[1]], attribs); } return new Line2(Vec2.mapBuffer(args[0], 2, args[1] || 0, args[2] || 1, args[3] || 2), attribs); -} \ No newline at end of file +} diff --git a/packages/geom/src/path2.ts b/packages/geom/src/path2.ts index 39a204493c..0ef55cdd97 100644 --- a/packages/geom/src/path2.ts +++ b/packages/geom/src/path2.ts @@ -4,6 +4,7 @@ import { peek } from "@thi.ng/transducers/func/peek"; import { eqDelta1, rad } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { + Attribs, IBounds, IBoundsRaw, IToPolygon, @@ -18,6 +19,7 @@ import { Line2 } from "./line2"; import { Polygon2 } from "./polygon2"; import { Polyline2 } from "./polyline2"; import { Rect2 } from "./rect2"; +import { simplifyPolyline } from "./internal/douglas–peucker"; export class Path2 implements Iterable, @@ -28,9 +30,11 @@ export class Path2 implements segments: PathSegment[]; closed: boolean; + attribs: Attribs; - constructor(segments?: PathSegment[]) { + constructor(segments?: PathSegment[], attribs?: Attribs) { this.segments = segments || []; + this.attribs = attribs; this.closed = false; } @@ -59,20 +63,21 @@ export class Path2 implements return Rect2.fromMinMax(...this.boundsRaw()); } - simplify(): Path2 { + simplify(eps = 0.01): Path2 { const res: PathSegment[] = []; const orig = this.segments; const n = orig.length; - let points, lastP; + let points: Vec2[]; + let lastP: Vec2; for (let i = 0; i < n; i++) { const s = orig[i]; if (s.type === SegmentType.LINE || s.type === SegmentType.POLYLINE) { - points = (points || []).concat(s.geo.vertices()); + points = (points || []).concat(ensureArray(s.geo.vertices())); lastP = peek(points); } else if (points) { points.push(lastP); res.push({ - geo: new Polyline2(points), + geo: new Polyline2(simplifyPolyline(points, eps)), type: SegmentType.POLYLINE, }); points = null; @@ -91,14 +96,6 @@ export class Path2 implements return this; } - toPolygon(opts?: number | Partial) { - return new Polygon2(this.vertices(opts)); - } - - toPolyline(res = 10) { - return new Polyline2(this.vertices(res)); - } - vertices(opts?: number | Partial) { const _opts = isNumber(opts) ? { num: opts } : opts; let verts: Vec2[] = []; @@ -112,6 +109,31 @@ export class Path2 implements } return verts; } + + toPolygon(opts?: number | Partial) { + return new Polygon2(this.vertices(opts)); + } + + toPolyline(res = 10) { + return new Polyline2(this.vertices(res)); + } + + toHiccup() { + const dest: any[] = []; + const res: any[] = ["path", this.attribs || {}, dest]; + const src = this.segments; + const n = src.length; + if (n > 1) { + dest.push(["M", src[0].point]); + for (let i = 1; i < n; i++) { + dest.push(...src[i].geo.toHiccupPathSegments()); + } + if (this.closed) { + dest.push(["Z"]); + } + } + return res; + } } const CMD_RE = /[achlmqstvz]/i; diff --git a/packages/geom/src/polygon2.ts b/packages/geom/src/polygon2.ts index 6471012c09..4f211917b4 100644 --- a/packages/geom/src/polygon2.ts +++ b/packages/geom/src/polygon2.ts @@ -1,4 +1,4 @@ -import { IToHiccup } from "@thi.ng/api/api"; +import { ICopy, IToHiccup } from "@thi.ng/api/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { Vec } from "@thi.ng/vectors/api"; @@ -9,22 +9,27 @@ import { IArcLength, IArea, IEdges, + IPointInside, SamplingOpts, SubdivKernel } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; import { centerOfWeight, centroid } from "./internal/centroid"; +import { closestPointPolyline } from "./internal/closest-point"; import { edges } from "./internal/edges"; +import { containsDelta } from "./internal/eq-delta"; import { clipConvex } from "./internal/sutherland-hodgeman"; import { Sampler } from "./sampler"; import { subdivideCurve } from "./subdiv-curve"; -import { simplify } from "./internal/douglas–peucker"; +import { simplifyPolyline } from "./internal/douglas–peucker"; export class Polygon2 extends PointContainer2 implements IArcLength, IArea, + ICopy, IEdges, + IPointInside, IToHiccup { static fromHiccup([_, attribs, pts]: HiccupPolygon2) { @@ -41,17 +46,17 @@ export class Polygon2 extends PointContainer2 implements } edges() { - return edges(this.vertices(), true); + return edges(this.points, true); } - area(unsigned = true) { + area(signed = true) { const pts = this.points; let res = 0; for (let n = pts.length - 1, i = n, j = 0; n >= 0; i = j, j++ , n--) { res += pts[i].cross(pts[j]); } res /= 2; - return unsigned ? res : Math.abs(res); + return signed ? res : Math.abs(res); } arcLength() { @@ -62,19 +67,38 @@ export class Polygon2 extends PointContainer2 implements return centerOfWeight(this.points, c); } + closestPoint(p: Readonly) { + return closestPointPolyline(p, this.points, true); + } + + pointInside(p: Readonly) { + const pts = this.points; + if (containsDelta(pts, p)) return true; + const px = p.x; + const py = p.y; + let inside = false; + for (let n = pts.length - 1, i = n, j = 0; j < n; i = j, j++) { + const [ax, ay] = pts[i]; + const [bx, by] = pts[j]; + (((by < py && ay >= py) || (ay < py && by >= py)) && + ((py - by) / (ay - by) * (ax - bx) + bx) < px) && + (inside = !inside); + } + return inside; + } + simplify(eps: number) { - return new Polygon2(simplify(this.points, eps, true), { ...this.attribs }); + return new Polygon2(simplifyPolyline(this.points, eps, true), { ...this.attribs }); } vertices(opts?: number | Partial) { const sampler = new Sampler(this.points, true); if (opts !== undefined) { - if (isPlainObject(opts)) { - return opts.dist ? + return isPlainObject(opts) ? + opts.dist ? sampler.sampleUniform(opts.dist, opts.last) : - sampler.sampleFixedNum(opts.num, opts.last); - } - return sampler.sampleFixedNum(opts, false); + sampler.sampleFixedNum(opts.num, opts.last) : + sampler.sampleFixedNum(opts, false); } else { return this.points; } @@ -112,14 +136,14 @@ export function polygon2(points, ...args: any[]) { if (isNumber(points[0])) { points = Vec2.mapBuffer( points, - args[1] || points.length / 2, - args[2] || 0, - args[3] || 1, - args[4] || 2 + args[0] || points.length / 2, + args[1] || 0, + args[2] || 1, + args[3] || 2 ); - attribs = args[5]; + attribs = args[4]; } else { - attribs = args[1]; + attribs = args[0]; } return new Polygon2(points, attribs); } diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts index 7cb127f29f..f77e4f7d9e 100644 --- a/packages/geom/src/polyline2.ts +++ b/packages/geom/src/polyline2.ts @@ -1,7 +1,10 @@ -import { IObjectOf, IToHiccup } from "@thi.ng/api/api"; +import { ICopy, IToHiccup } from "@thi.ng/api/api"; +import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { Vec } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { + Attribs, IArcLength, IArea, IEdges, @@ -11,6 +14,7 @@ import { } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; +import { closestPointPolyline } from "./internal/closest-point"; import { edges } from "./internal/edges"; import { Sampler } from "./sampler"; import { subdivideCurve } from "./subdiv-curve"; @@ -18,6 +22,7 @@ import { subdivideCurve } from "./subdiv-curve"; export class Polyline2 extends PointContainer2 implements IArcLength, IArea, + ICopy, IEdges, IVertices>, IToHiccup { @@ -27,7 +32,7 @@ export class Polyline2 extends PointContainer2 implements } edges() { - return edges(this.vertices()); + return edges(this.points); } area() { @@ -38,6 +43,10 @@ export class Polyline2 extends PointContainer2 implements return arcLength(this.points); } + closestPoint(p: Readonly) { + return closestPointPolyline(p, this.points, false); + } + subdivide(kernel: SubdivKernel, iter = 1) { return new Polyline2(subdivideCurve(kernel, this.points, iter, false), { ...this.attribs }); } @@ -60,10 +69,34 @@ export class Polyline2 extends PointContainer2 implements return this._toHiccup("polyline"); } + toHiccupPathSegments() { + const res: any[] = []; + for (let pts = this.points, n = pts.length, i = 1; i < n; i++) { + res.push(["L", pts[i]]); + } + return res; + } + toJSON() { return this._toJSON("polyline2"); } } -export const polyline2 = (points: Vec2[], attribs?: IObjectOf) => - new Polyline2(points, attribs); +export function polyline2(points: Vec, num?: number, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Polyline2; +export function polyline2(points: Vec2[], attribs?: Attribs): Polyline2; +export function polyline2(points, ...args: any[]) { + let attribs; + if (isNumber(points[0])) { + points = Vec2.mapBuffer( + points, + args[0] || points.length / 2, + args[1] || 0, + args[2] || 1, + args[3] || 2 + ); + attribs = args[4]; + } else { + attribs = args[0]; + } + return new Polyline2(points, attribs); +} diff --git a/packages/geom/src/quad2.ts b/packages/geom/src/quad2.ts new file mode 100644 index 0000000000..3ea740524f --- /dev/null +++ b/packages/geom/src/quad2.ts @@ -0,0 +1,82 @@ +import { ICopy } from "@thi.ng/api"; +import { Vec } from "@thi.ng/vectors/api"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { isNumber } from "util"; +import { + Attribs, + IArcLength, + IArea, + IPointMap, + IEdges +} from "./api"; +import { PointContainer2 } from "./container2"; +import { arcLength } from "./internal/arc-length"; +import { corner } from "./internal/corner"; +import { edges } from "./internal/edges"; + +export class Quad2 extends PointContainer2 implements + IArea, + IArcLength, + ICopy, + IEdges, + IPointMap { + + copy() { + return new Quad2(this._copy(), { ...this.attribs }); + } + + arcLength() { + return arcLength(this.points, true); + } + + area(signed = true) { + const [a, b, c, d] = this.points; + const area = 0.5 * (corner(a, b, c) + corner(a, c, d)); + return signed ? area : Math.abs(area); + } + + edges() { + return edges(this.points, true); + } + + mapPoint(_: Readonly, __?: Vec2): Vec2 { + throw new Error("TODO"); + } + + unmapPoint(q: Readonly, out?: Vec2) { + const p = this.points; + const res = Vec2.mixBilinear(p[0], p[1], p[3], p[2], q.x, q.y); + return out ? out.set(res) : res; + } + + toHiccup() { + return this._toHiccup("polygon"); + } + + toJSON() { + return this._toJSON("quad2"); + } +} + +export function quad2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Quad2; +export function quad2(a: Vec2, b: Vec2, c: Vec2, d: Vec2, attribs?: Attribs): Quad2; +export function quad2(points: Vec2[], attribs?: Attribs): Quad2; +export function quad2(points, ...args: any[]) { + let attribs; + if (points instanceof Vec2) { + points = [points, args[0], args[1], args[2]]; + attribs = args[3]; + } else if (isNumber(points[0])) { + points = Vec2.mapBuffer( + points, + 4, + args[0] || 0, + args[1] || 1, + args[2] || 2 + ); + attribs = args[3]; + } else { + attribs = args[0]; + } + return new Quad2(points, attribs); +} \ No newline at end of file diff --git a/packages/geom/src/rect2.ts b/packages/geom/src/rect2.ts index 8df28ee95e..e8a8211696 100644 --- a/packages/geom/src/rect2.ts +++ b/packages/geom/src/rect2.ts @@ -1,22 +1,34 @@ -import { IObjectOf } from "@thi.ng/api/api"; +import { ICopy } from "@thi.ng/api"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { + Attribs, CollateOpts, + IArcLength, + IArea, IBounds, + IBoundsRaw, + ICenter, ICentroid, ICollate, - IVertices, - IBoundsRaw + IPointInside, + IPointMap, + IVertices } from "./api"; import { collateWith } from "./internal/collate"; import { edges } from "./internal/edges"; export class Rect2 implements - ICollate, + IArea, + IArcLength, IBoundsRaw, IBounds, ICentroid, + ICenter, + ICollate, + ICopy, + IPointInside, + IPointMap, IVertices { static fromMinMax(min: Vec2, max: Vec2) { @@ -25,7 +37,7 @@ export class Rect2 implements pos: Vec2; size: Vec2; - attribs: IObjectOf; + attribs: Attribs; constructor(pos: Vec2, size: Vec2, attribs?: any) { this.pos = pos; @@ -42,6 +54,14 @@ export class Rect2 implements return collateWith(Vec2.intoBuffer, [this.pos, this.size], opts, 2); } + area() { + return this.size.x * this.size.y; + } + + arcLength() { + return 2 * (this.size.x + this.size.y); + } + boundsRaw(): [Vec2, Vec2] { return [this.pos.copy(), this.pos.addNew(this.size)]; } @@ -60,11 +80,21 @@ export class Rect2 implements return this; } - mapPoint(p: Vec2, out?: Vec2) { + pointInside(p: Readonly) { + const px = p.x; + const py = p.y; + const x1 = this.pos.x; + const y1 = this.pos.y; + const x2 = x1 + this.size.x; + const y2 = y1 + this.size.y; + return px >= x1 && px <= x2 && py >= y1 && py <= y2; + } + + mapPoint(p: Readonly, out?: Vec2) { return p.subNew(this.pos, out).div(this.size); } - unmapPoint(p: Vec2, out?: Vec2) { + unmapPoint(p: Readonly, out?: Vec2) { return (out ? out.set(this.pos) : this.pos.copy()).madd(this.size, p); } @@ -116,12 +146,12 @@ export class Rect2 implements } } -export function rect2(x: number, y: number, w: number, h: number, attribs?: IObjectOf): Rect2; -export function rect2(x: number, y: number, w: number, attribs?: IObjectOf): Rect2; -export function rect2(w: number, h: number, attribs?: IObjectOf): Rect2; -export function rect2(pos: Vec2, w: number, attribs?: IObjectOf): Rect2; -export function rect2(pos: Vec2, size: Vec2, attribs?: IObjectOf): Rect2; -export function rect2(w: number, attribs?: IObjectOf): Rect2; +export function rect2(x: number, y: number, w: number, h: number, attribs?: Attribs): Rect2; +export function rect2(x: number, y: number, w: number, attribs?: Attribs): Rect2; +export function rect2(w: number, h: number, attribs?: Attribs): Rect2; +export function rect2(pos: Vec2, w: number, attribs?: Attribs): Rect2; +export function rect2(pos: Vec2, size: Vec2, attribs?: Attribs): Rect2; +export function rect2(w: number, attribs?: Attribs): Rect2; export function rect2(...args: any[]) { let attribs; let n = args.length - 1; diff --git a/packages/geom/src/sampler.ts b/packages/geom/src/sampler.ts index ad99e9cd49..3ec4c15a39 100644 --- a/packages/geom/src/sampler.ts +++ b/packages/geom/src/sampler.ts @@ -1,8 +1,7 @@ -import { ICopy, IEqualsDelta } from "@thi.ng/api/api"; -import { IDistance, IMix } from "@thi.ng/vectors/api"; import { peek } from "@thi.ng/transducers/func/peek"; +import { IVector } from "@thi.ng/vectors/api"; -export class Sampler & IEqualsDelta & IDistance & IMix> { +export class Sampler> { points: T[]; index: number[]; diff --git a/packages/geom/src/subdiv-curve.ts b/packages/geom/src/subdiv-curve.ts index d2bd8a98a0..0f2305ee63 100644 --- a/packages/geom/src/subdiv-curve.ts +++ b/packages/geom/src/subdiv-curve.ts @@ -8,27 +8,51 @@ import { partition } from "@thi.ng/transducers/xform/partition"; import { IVector } from "@thi.ng/vectors/api"; import { SubdivKernel } from "./api"; +const madd2 = + > + (a: Readonly, b: Readonly, ua: number, ub: number) => + a.mulNewN(ua).maddN(b, ub); + +const madd3 = + > + (a: Readonly, b: Readonly, c: Readonly, ua: number, ub: number, uc: number) => + a.mulNewN(ua).maddN(b, ub).maddN(c, uc); + +const madd5 = + > + (a: Readonly, b: Readonly, c: Readonly, d: Readonly, e: Readonly, + ua: number, ub: number, uc: number, ud: number, ue: number) => + a.mulNewN(ua).maddN(b, ub).maddN(c, uc).maddN(d, ud).maddN(e, ue); + export const subdivKernel2 = ([ua, ub]: number[], [va, vb]: number[]) => >([a, b]: T[]) => [ - a.copy().mulN(ua).maddN(b, ub), - a.copy().mulN(va).maddN(b, vb) + madd2(a, b, ua, ub), + madd2(a, b, va, vb), ]; export const subdivKernel3 = ([ua, ub, uc]: number[], [va, vb, vc]: number[]) => >([a, b, c]: T[]) => [ - a.copy().mulN(ua).maddN(b, ub).maddN(c, uc), - a.copy().mulN(va).maddN(b, vb).maddN(c, vc) + madd3(a, b, c, ua, ub, uc), + madd3(a, b, c, va, vb, vc), ]; export const subdivKernel5 = ([ua, ub, uc, ud, ue]: number[], [va, vb, vc, vd, ve]: number[]) => >([a, b, c, d, e]: T[]) => [ - a.copy().mulN(ua).maddN(b, ub).maddN(c, uc).maddN(d, ud).maddN(e, ue), - a.copy().mulN(va).maddN(b, vb).maddN(c, vc).maddN(d, vd).maddN(e, ve) + madd5(a, b, c, d, e, ua, ub, uc, ud, ue), + madd5(a, b, c, d, e, va, vb, vc, vd, ve), ]; +/** + * http://algorithmicbotany.org/papers/subgpu.sig2003.pdf + * + * @param kernel subdivision scheme + * @param pts source points + * @param iter number of iterations + * @param closed true, if closed input geometry + */ export const subdivideCurve = >( { fn, size }: SubdivKernel, diff --git a/packages/geom/src/tessellate.ts b/packages/geom/src/tessellate.ts new file mode 100644 index 0000000000..f186658bfb --- /dev/null +++ b/packages/geom/src/tessellate.ts @@ -0,0 +1,156 @@ +import { comp } from "@thi.ng/transducers/func/comp"; +import { range } from "@thi.ng/transducers/iter/range"; +import { tuples } from "@thi.ng/transducers/iter/tuples"; +import { wrap } from "@thi.ng/transducers/iter/wrap"; +import { reducer } from "@thi.ng/transducers/reduce"; +import { last } from "@thi.ng/transducers/rfn/last"; +import { push } from "@thi.ng/transducers/rfn/push"; +import { transduce } from "@thi.ng/transducers/transduce"; +import { map } from "@thi.ng/transducers/xform/map"; +import { mapcat } from "@thi.ng/transducers/xform/mapcat"; +import { partition } from "@thi.ng/transducers/xform/partition"; +import { scan } from "@thi.ng/transducers/xform/scan"; +import { IVector } from "@thi.ng/vectors/api"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { Tessellator } from "./api"; +import { centroid } from "./internal/centroid"; +import { corner, pointInTriangle2 } from "./internal/corner"; + +const snip = (points: ReadonlyArray, u: number, v: number, w: number, n: number, ids: number[]) => { + const a = points[ids[u]]; + const b = points[ids[v]]; + const c = points[ids[w]]; + if (corner(a, b, c) > 0) { + for (let i = 0; i < n; i++) { + if (i !== u && i !== v && i !== w) { + if (pointInTriangle2(points[ids[i]], a, b, c)) { + return; + } + } + } + return [a, b, c]; + } +}; + +export const earCut = (points: ReadonlyArray, clockwise: boolean) => { + const tris: Vec2[][] = []; + let n = points.length; + const ids = [...clockwise ? range(n) : range(n - 1, -1, -1)]; + let count = 2 * n - 1; + let v = n - 1, u, w, t; + while (count > 0 && n > 2) { + u = n <= v ? 0 : v; + v = u + 1; + v = n <= v ? 0 : v; + w = v + 1; + w = n <= w ? 0 : w; + t = snip(points, u, v, w, n, ids); + if (t !== undefined) { + tris.push(t); + ids.splice(v, 1); + n--; + count = 2 * n; + } else { + count--; + } + } + return tris; +}; + +export const triFan = >(points: ReadonlyArray) => { + const c = centroid(points); + return transduce( + comp( + partition(2, 1), + map(([a, b]) => [a, b, c]) + ), + push(), + wrap(points, 1, false, true) + ); +}; + +export const quadFan = >(points: ReadonlyArray) => { + const p = centroid(points); + return transduce( + comp( + partition(3, 1), + map(([a, b, c]) => [a.mixNewN(b, 0.5), b, b.mixNewN(c, 0.5), p]) + ), + push(), + wrap(points, 1, true, true) + ); +}; + +export const edgeSplit = >(points: ReadonlyArray) => { + const c = centroid(points); + return transduce( + comp( + partition(2, 1), + mapcat(([a, b]) => { + const m = a.mixNewN(b, 0.5); + return [[a, m, c], [m, b, c]]; + })), + push(), + wrap(points, 1, false, true) + ); +}; + +export const rimTris = >(points: ReadonlyArray) => { + const edgeCentroids = transduce( + comp( + partition(2, 1), + map((e) => e[0].mixNewN(e[1], 0.5)) + ), + push(), + wrap(points, 1, false, true) + ); + return transduce( + comp( + partition(2, 1), + map((t) => [t[0][0], t[1][1], t[1][0]]) + ), + push(), + [edgeCentroids], + wrap([...tuples(edgeCentroids, points)], 1, true, false) + ); +}; + +export const inset = (inset = 0.5, keepInterior = false) => + >(points: ReadonlyArray) => { + const c = centroid(points); + const inner = points.map((p) => p.mixNewN(c, inset)); + return transduce( + comp( + partition(2, 1), + map(([[a, b], [c, d]]) => [a, b, d, c]) + ), + push(), + keepInterior ? [inner] : [], + wrap([...tuples(points, inner)], 1, false, true) + ); + }; + +export const tessellate = + >(tessFns: Iterable>, points: T[]) => + transduce( + scan( + reducer( + () => [points], + (acc: T[][], fn: Tessellator) => + transduce( + mapcat(fn), + push(), + acc + ) + ) + ), + last(), + tessFns + ); + +/* +v=require("@thi.ng/vectors"); g=require("@thi.ng/geom"); h=require("@thi.ng/hiccup"); svg=require("@thi.ng/hiccup-svg"); s=require("@thi.ng/strings"); tx=require("@thi.ng/transducers"); fs=require("fs"); + +res = h.serialize(svg.convertTree(g.tessellate([g.quadFan, g.edgeSplit, g.rimTris, g.quadFan, g.inset(), g.quadFan], g.circle2(100).vertices(6)).map(p=>g.polygon2(p).toHiccup()))) + +*/ \ No newline at end of file diff --git a/packages/geom/src/triangle2.ts b/packages/geom/src/triangle2.ts new file mode 100644 index 0000000000..2d5a88d655 --- /dev/null +++ b/packages/geom/src/triangle2.ts @@ -0,0 +1,98 @@ +import { ICopy } from "@thi.ng/api"; +import { isNumber } from "@thi.ng/checks/is-number"; +import { Vec } from "@thi.ng/vectors/api"; +import { PI } from "@thi.ng/vectors/math"; +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { Vec3 } from "@thi.ng/vectors/vec3"; +import { + Attribs, + IArcLength, + IArea, + IClassifyPoint, + IPointInside, + IPointMap +} from "./api"; +import { PointContainer2 } from "./container2"; +import { arcLength } from "./internal/arc-length"; +import { fromBarycentric, toBarycentric } from "./internal/barycentric"; +import { classifyPointInTriangle2, corner, pointInTriangle2 } from "./internal/corner"; + +export class Triangle2 extends PointContainer2 implements + IArea, + IArcLength, + IClassifyPoint, + ICopy, + IPointInside, + IPointMap { + + static equilateral(a: Vec2, b: Vec2) { + const dir = b.subNew(a); + const c = dir.perpendicularLeft().normalize(dir.mag() * Math.sin(PI / 3)); + return new Triangle2([a, b, c.maddN(dir, 0.5)]); + } + + copy() { + return new Triangle2(this._copy(), { ...this.attribs }); + } + + classifyPoint(p: Readonly): number { + const [a, b, c] = this.points; + return classifyPointInTriangle2(p, a, b, c); + } + + pointInside(p: Readonly): boolean { + const [a, b, c] = this.points; + return pointInTriangle2(p, a, b, c); + } + + arcLength(): number { + return arcLength(this.points, true); + } + + area(signed = true) { + const [a, b, c] = this.points; + const area = 0.5 * corner(a, b, c); + return signed ? area : Math.abs(area); + } + + mapPoint(p: Readonly, out?: Vec3): Vec3 { + const [a, b, c] = this.points; + return toBarycentric(a, b, c, p, out); + } + + unmapPoint(p: Readonly, out?: Vec2): Vec2 { + const [a, b, c] = this.points; + return fromBarycentric(a, b, c, p, out); + } + + toHiccup() { + return this._toHiccup("polygon"); + } + + toJSON() { + return this._toJSON("triangle2"); + } +} + +export function triangle2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Triangle2; +export function triangle2(a: Vec2, b: Vec2, c: Vec2, attribs?: Attribs): Triangle2; +export function triangle2(points: Vec2[], attribs?: Attribs): Triangle2; +export function triangle2(points, ...args: any[]) { + let attribs; + if (points instanceof Vec2) { + points = [points, args[0], args[1]]; + attribs = args[2]; + } else if (isNumber(points[0])) { + points = Vec2.mapBuffer( + points, + 3, + args[0] || 0, + args[1] || 1, + args[2] || 2 + ); + attribs = args[3]; + } else { + attribs = args[0]; + } + return new Triangle2(points, attribs); +} \ No newline at end of file diff --git a/packages/geom/src/warp.ts b/packages/geom/src/warp.ts new file mode 100644 index 0000000000..839d58c47d --- /dev/null +++ b/packages/geom/src/warp.ts @@ -0,0 +1,12 @@ +import { IPointMap } from "./api"; +import { IVector } from "@thi.ng/vectors/api"; + +export const warpPoints = + , V2 extends IVector, A extends IPointMap, B extends IPointMap> + (dest: B, src: ReadonlyArray, srcBounds: A) => { + const res: V[] = []; + for (let n = src.length, i = 0; i < n; i++) { + res.push(dest.unmapPoint(srcBounds.mapPoint(src[i]))); + } + return res; + }; From 555fc51561677ea4728e75ffab08754bf9a60dfb Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 10 Oct 2018 15:41:52 +0100 Subject: [PATCH 57/77] feat(geom): add/update factory fns, arg handling, tessel, poly area --- packages/geom/src/bezier2.ts | 26 ++++++++++++++++-- packages/geom/src/container2.ts | 1 + packages/geom/src/container3.ts | 1 + packages/geom/src/internal/area.ts | 9 +++++++ packages/geom/src/internal/args.ts | 42 ++++++++++++++++++++++++++++++ packages/geom/src/polygon2.ts | 29 +++++++++++++++------ packages/geom/src/quad2.ts | 27 +++++-------------- packages/geom/src/tessellate.ts | 9 +++++-- packages/geom/src/triangle2.ts | 21 +++------------ 9 files changed, 114 insertions(+), 51 deletions(-) create mode 100644 packages/geom/src/internal/area.ts create mode 100644 packages/geom/src/internal/args.ts diff --git a/packages/geom/src/bezier2.ts b/packages/geom/src/bezier2.ts index 2c1b5ab82e..f2a6b9d064 100644 --- a/packages/geom/src/bezier2.ts +++ b/packages/geom/src/bezier2.ts @@ -1,11 +1,17 @@ import { ICopy } from "@thi.ng/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { IMath } from "@thi.ng/vectors/api"; +import { IMath, Vec } from "@thi.ng/vectors/api"; import { clamp1 } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; -import { DEFAULT_SAMPLES, IVertices, SamplingOpts } from "./api"; +import { + Attribs, + DEFAULT_SAMPLES, + IVertices, + SamplingOpts +} from "./api"; import { PointContainer2 } from "./container2"; +import { args3, args4 } from "./internal/args"; import { Sampler } from "./sampler"; export const mixQuadratic1 = (a: number, b: number, c: number, t: number) => { @@ -267,3 +273,19 @@ export class Quadratic2 extends PointContainer2 implements return [["Q", pts[1], pts[2]]]; } } + +export function cubic2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Cubic2; +export function cubic2(a: Vec2, b: Vec2, c: Vec2, d: Vec2, attribs?: Attribs): Cubic2; +export function cubic2(points: Vec2[], attribs?: Attribs): Cubic2; +export function cubic2(...args: any[]) { + const [points, attribs] = args4(args); + return new Cubic2(points, attribs); +} + +export function quadratic2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Quadratic2; +export function quadratic2(a: Vec2, b: Vec2, c: Vec2, attribs?: Attribs): Quadratic2; +export function quadratic2(points: Vec2[], attribs?: Attribs): Quadratic2; +export function quadratic2(...args: any[]) { + const [points, attribs] = args3(args); + return new Quadratic2(points, attribs); +} diff --git a/packages/geom/src/container2.ts b/packages/geom/src/container2.ts index f91037c8cb..d3f8c066fa 100644 --- a/packages/geom/src/container2.ts +++ b/packages/geom/src/container2.ts @@ -68,6 +68,7 @@ export class PointContainer2 implements flip() { this.points.reverse(); + return this; } fit(bounds: Rect2) { diff --git a/packages/geom/src/container3.ts b/packages/geom/src/container3.ts index 4a57edf5f1..c8149bfad0 100644 --- a/packages/geom/src/container3.ts +++ b/packages/geom/src/container3.ts @@ -68,6 +68,7 @@ export class PointContainer3 implements flip() { this.points.reverse(); + return this; } scale(v: Readonly) { diff --git a/packages/geom/src/internal/area.ts b/packages/geom/src/internal/area.ts new file mode 100644 index 0000000000..73b8d795b9 --- /dev/null +++ b/packages/geom/src/internal/area.ts @@ -0,0 +1,9 @@ +import { Vec2 } from "@thi.ng/vectors/vec2"; + +export const polygonArea = (pts: ReadonlyArray) => { + let res = 0; + for (let n = pts.length - 1, i = n, j = 0; n >= 0; i = j, j++ , n--) { + res += pts[i].cross(pts[j]); + } + return res / 2; +}; diff --git a/packages/geom/src/internal/args.ts b/packages/geom/src/internal/args.ts new file mode 100644 index 0000000000..9e13f95f93 --- /dev/null +++ b/packages/geom/src/internal/args.ts @@ -0,0 +1,42 @@ +import { Vec2 } from "@thi.ng/vectors/vec2"; +import { isNumber } from "@thi.ng/checks/is-number"; + +export const args3 = (args: any[]) => { + let points = args[0], attribs; + if (points instanceof Vec2) { + points = [points, args[1], args[2]]; + attribs = args[3]; + } else if (isNumber(points[0])) { + points = Vec2.mapBuffer( + points, + 3, + args[1] || 0, + args[2] || 1, + args[3] || 2 + ); + attribs = args[4]; + } else { + attribs = args[1]; + } + return [points, attribs]; +}; + +export const args4 = (args: any[]) => { + let points = args[0], attribs; + if (points instanceof Vec2) { + points = [points, args[1], args[2], args[3]]; + attribs = args[4]; + } else if (isNumber(points[0])) { + points = Vec2.mapBuffer( + points, + 4, + args[1] || 0, + args[2] || 1, + args[3] || 2 + ); + attribs = args[4]; + } else { + attribs = args[1]; + } + return [points, attribs]; +}; diff --git a/packages/geom/src/polygon2.ts b/packages/geom/src/polygon2.ts index 4f211917b4..391f6bcbb4 100644 --- a/packages/geom/src/polygon2.ts +++ b/packages/geom/src/polygon2.ts @@ -1,8 +1,15 @@ import { ICopy, IToHiccup } from "@thi.ng/api/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { cycle } from "@thi.ng/transducers/iter/cycle"; +import { normRange } from "@thi.ng/transducers/iter/norm-range"; +import { tuples } from "@thi.ng/transducers/iter/tuples"; +import { push } from "@thi.ng/transducers/rfn/push"; +import { transduce } from "@thi.ng/transducers/transduce"; +import { map } from "@thi.ng/transducers/xform/map"; import { Vec } from "@thi.ng/vectors/api"; -import { asVec2, Vec2 } from "@thi.ng/vectors/vec2"; +import { TAU } from "@thi.ng/vectors/math"; +import { asVec2, toCartesian2, Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, HiccupPolygon2, @@ -15,6 +22,7 @@ import { } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; +import { polygonArea } from "./internal/area"; import { centerOfWeight, centroid } from "./internal/centroid"; import { closestPointPolyline } from "./internal/closest-point"; import { edges } from "./internal/edges"; @@ -41,6 +49,16 @@ export class Polygon2 extends PointContainer2 implements ); } + static star(r: number, n: number, profile: number[]) { + const total = n * profile.length; + const pts = transduce( + map(([i, p]) => new Vec2(toCartesian2([r * p, i * TAU]))), + push(), + tuples(normRange(total, false), cycle(profile)) + ); + return new Polygon2(pts); + } + copy() { return new Polygon2(this._copy(), { ...this.attribs }); } @@ -50,13 +68,8 @@ export class Polygon2 extends PointContainer2 implements } area(signed = true) { - const pts = this.points; - let res = 0; - for (let n = pts.length - 1, i = n, j = 0; n >= 0; i = j, j++ , n--) { - res += pts[i].cross(pts[j]); - } - res /= 2; - return signed ? res : Math.abs(res); + const area = polygonArea(this.points); + return signed ? area : Math.abs(area); } arcLength() { diff --git a/packages/geom/src/quad2.ts b/packages/geom/src/quad2.ts index 3ea740524f..b319b315d0 100644 --- a/packages/geom/src/quad2.ts +++ b/packages/geom/src/quad2.ts @@ -1,16 +1,16 @@ import { ICopy } from "@thi.ng/api"; import { Vec } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; -import { isNumber } from "util"; import { Attribs, IArcLength, IArea, - IPointMap, - IEdges + IEdges, + IPointMap } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; +import { args4 } from "./internal/args"; import { corner } from "./internal/corner"; import { edges } from "./internal/edges"; @@ -61,22 +61,7 @@ export class Quad2 extends PointContainer2 implements export function quad2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Quad2; export function quad2(a: Vec2, b: Vec2, c: Vec2, d: Vec2, attribs?: Attribs): Quad2; export function quad2(points: Vec2[], attribs?: Attribs): Quad2; -export function quad2(points, ...args: any[]) { - let attribs; - if (points instanceof Vec2) { - points = [points, args[0], args[1], args[2]]; - attribs = args[3]; - } else if (isNumber(points[0])) { - points = Vec2.mapBuffer( - points, - 4, - args[0] || 0, - args[1] || 1, - args[2] || 2 - ); - attribs = args[3]; - } else { - attribs = args[0]; - } +export function quad2(...args: any[]) { + const [points, attribs] = args4(args); return new Quad2(points, attribs); -} \ No newline at end of file +} diff --git a/packages/geom/src/tessellate.ts b/packages/geom/src/tessellate.ts index f186658bfb..ff5ef8f89b 100644 --- a/packages/geom/src/tessellate.ts +++ b/packages/geom/src/tessellate.ts @@ -13,6 +13,7 @@ import { scan } from "@thi.ng/transducers/xform/scan"; import { IVector } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Tessellator } from "./api"; +import { polygonArea } from "./internal/area"; import { centroid } from "./internal/centroid"; import { corner, pointInTriangle2 } from "./internal/corner"; @@ -32,10 +33,14 @@ const snip = (points: ReadonlyArray, u: number, v: number, w: number, n: n } }; -export const earCut = (points: ReadonlyArray, clockwise: boolean) => { +export const earCut = (points: ReadonlyArray) => { const tris: Vec2[][] = []; let n = points.length; - const ids = [...clockwise ? range(n) : range(n - 1, -1, -1)]; + const ids = [ + ...(polygonArea(points) > 0 ? + range(n) : + range(n - 1, -1, -1)) + ]; let count = 2 * n - 1; let v = n - 1, u, w, t; while (count > 0 && n > 2) { diff --git a/packages/geom/src/triangle2.ts b/packages/geom/src/triangle2.ts index 2d5a88d655..f0905bbca3 100644 --- a/packages/geom/src/triangle2.ts +++ b/packages/geom/src/triangle2.ts @@ -1,5 +1,4 @@ import { ICopy } from "@thi.ng/api"; -import { isNumber } from "@thi.ng/checks/is-number"; import { Vec } from "@thi.ng/vectors/api"; import { PI } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; @@ -14,6 +13,7 @@ import { } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; +import { args3 } from "./internal/args"; import { fromBarycentric, toBarycentric } from "./internal/barycentric"; import { classifyPointInTriangle2, corner, pointInTriangle2 } from "./internal/corner"; @@ -77,22 +77,7 @@ export class Triangle2 extends PointContainer2 implements export function triangle2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Triangle2; export function triangle2(a: Vec2, b: Vec2, c: Vec2, attribs?: Attribs): Triangle2; export function triangle2(points: Vec2[], attribs?: Attribs): Triangle2; -export function triangle2(points, ...args: any[]) { - let attribs; - if (points instanceof Vec2) { - points = [points, args[0], args[1]]; - attribs = args[2]; - } else if (isNumber(points[0])) { - points = Vec2.mapBuffer( - points, - 3, - args[0] || 0, - args[1] || 1, - args[2] || 2 - ); - attribs = args[3]; - } else { - attribs = args[0]; - } +export function triangle2(...args: any[]) { + const [points, attribs] = args3(args); return new Triangle2(points, attribs); } \ No newline at end of file From fa87f1e948c11276e1eb1d59dfe04827798328c5 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 11 Oct 2018 01:31:05 +0100 Subject: [PATCH 58/77] feat(geom): add/update tessellate() impls --- packages/geom/src/api.ts | 5 ++++ packages/geom/src/internal/args.ts | 17 +++++++++++++ packages/geom/src/polygon2.ts | 29 +++++++++++----------- packages/geom/src/polyline2.ts | 18 +++----------- packages/geom/src/quad2.ts | 14 +++++++++-- packages/geom/src/rect2.ts | 12 ++++++++- packages/geom/src/tessellate.ts | 40 +++++++++++++++++------------- packages/geom/src/triangle2.ts | 14 +++++++++-- 8 files changed, 97 insertions(+), 52 deletions(-) diff --git a/packages/geom/src/api.ts b/packages/geom/src/api.ts index 8f320d7cb2..e2e1a0fc52 100644 --- a/packages/geom/src/api.ts +++ b/packages/geom/src/api.ts @@ -186,6 +186,11 @@ export interface IToPolygon { toPolygon(opts?: O): any; } +export interface ITessellateable> { + tessellate(tessel: Tessellator, iter?: number): T[][]; + tessellate(tessel: Iterable>): T[][]; +} + export interface ITransformable { transform(mat: M): this; } diff --git a/packages/geom/src/internal/args.ts b/packages/geom/src/internal/args.ts index 9e13f95f93..96030f5b89 100644 --- a/packages/geom/src/internal/args.ts +++ b/packages/geom/src/internal/args.ts @@ -40,3 +40,20 @@ export const args4 = (args: any[]) => { } return [points, attribs]; }; + +export const argsN = (args: any[]) => { + let points = args[0], attribs; + if (isNumber(points[0])) { + points = Vec2.mapBuffer( + points, + args[1] || points.length / 2, + args[2] || 0, + args[3] || 1, + args[4] || 2 + ); + attribs = args[5]; + } else { + attribs = args[1]; + } + return [points, attribs]; +}; diff --git a/packages/geom/src/polygon2.ts b/packages/geom/src/polygon2.ts index 391f6bcbb4..b1ee3588ad 100644 --- a/packages/geom/src/polygon2.ts +++ b/packages/geom/src/polygon2.ts @@ -17,12 +17,15 @@ import { IArea, IEdges, IPointInside, + ITessellateable, SamplingOpts, - SubdivKernel + SubdivKernel, + Tessellator } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; import { polygonArea } from "./internal/area"; +import { argsN } from "./internal/args"; import { centerOfWeight, centroid } from "./internal/centroid"; import { closestPointPolyline } from "./internal/closest-point"; import { edges } from "./internal/edges"; @@ -30,6 +33,7 @@ import { containsDelta } from "./internal/eq-delta"; import { clipConvex } from "./internal/sutherland-hodgeman"; import { Sampler } from "./sampler"; import { subdivideCurve } from "./subdiv-curve"; +import { tessellate } from "./tessellate"; import { simplifyPolyline } from "./internal/douglas–peucker"; export class Polygon2 extends PointContainer2 implements @@ -38,6 +42,7 @@ export class Polygon2 extends PointContainer2 implements ICopy, IEdges, IPointInside, + ITessellateable, IToHiccup { static fromHiccup([_, attribs, pts]: HiccupPolygon2) { @@ -133,6 +138,12 @@ export class Polygon2 extends PointContainer2 implements return new Polygon2(subdivideCurve(kernel, this.points, iter, true), { ...this.attribs }); } + tessellate(tessel: Tessellator, iter?: number): Vec2[][]; + tessellate(tessel: Iterable>): Vec2[][]; + tessellate(...args: any[]) { + return tessellate.apply(null, [this.points, ...args]); + } + toHiccup() { return this._toHiccup("polygon"); } @@ -144,19 +155,7 @@ export class Polygon2 extends PointContainer2 implements export function polygon2(points: Vec, num?: number, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Polygon2; export function polygon2(points: Vec2[], attribs?: Attribs): Polygon2; -export function polygon2(points, ...args: any[]) { - let attribs; - if (isNumber(points[0])) { - points = Vec2.mapBuffer( - points, - args[0] || points.length / 2, - args[1] || 0, - args[2] || 1, - args[3] || 2 - ); - attribs = args[4]; - } else { - attribs = args[0]; - } +export function polygon2(...args: any[]) { + const [points, attribs] = argsN(args); return new Polygon2(points, attribs); } diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts index f77e4f7d9e..314088b2da 100644 --- a/packages/geom/src/polyline2.ts +++ b/packages/geom/src/polyline2.ts @@ -1,5 +1,4 @@ import { ICopy, IToHiccup } from "@thi.ng/api/api"; -import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { Vec } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; @@ -14,6 +13,7 @@ import { } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; +import { argsN } from "./internal/args"; import { closestPointPolyline } from "./internal/closest-point"; import { edges } from "./internal/edges"; import { Sampler } from "./sampler"; @@ -84,19 +84,7 @@ export class Polyline2 extends PointContainer2 implements export function polyline2(points: Vec, num?: number, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Polyline2; export function polyline2(points: Vec2[], attribs?: Attribs): Polyline2; -export function polyline2(points, ...args: any[]) { - let attribs; - if (isNumber(points[0])) { - points = Vec2.mapBuffer( - points, - args[0] || points.length / 2, - args[1] || 0, - args[2] || 1, - args[3] || 2 - ); - attribs = args[4]; - } else { - attribs = args[0]; - } +export function polyline2(...args: any[]) { + const [points, attribs] = argsN(args); return new Polyline2(points, attribs); } diff --git a/packages/geom/src/quad2.ts b/packages/geom/src/quad2.ts index b319b315d0..eb32808c54 100644 --- a/packages/geom/src/quad2.ts +++ b/packages/geom/src/quad2.ts @@ -6,20 +6,24 @@ import { IArcLength, IArea, IEdges, - IPointMap + IPointMap, + ITessellateable, + Tessellator } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; import { args4 } from "./internal/args"; import { corner } from "./internal/corner"; import { edges } from "./internal/edges"; +import { tessellate } from "./tessellate"; export class Quad2 extends PointContainer2 implements IArea, IArcLength, ICopy, IEdges, - IPointMap { + IPointMap, + ITessellateable { copy() { return new Quad2(this._copy(), { ...this.attribs }); @@ -49,6 +53,12 @@ export class Quad2 extends PointContainer2 implements return out ? out.set(res) : res; } + tessellate(tessel: Tessellator, iter?: number): Vec2[][]; + tessellate(tessel: Iterable>): Vec2[][]; + tessellate(...args: any[]) { + return tessellate.apply(null, [this.points, ...args]); + } + toHiccup() { return this._toHiccup("polygon"); } diff --git a/packages/geom/src/rect2.ts b/packages/geom/src/rect2.ts index e8a8211696..510cf5932a 100644 --- a/packages/geom/src/rect2.ts +++ b/packages/geom/src/rect2.ts @@ -13,10 +13,13 @@ import { ICollate, IPointInside, IPointMap, - IVertices + ITessellateable, + IVertices, + Tessellator } from "./api"; import { collateWith } from "./internal/collate"; import { edges } from "./internal/edges"; +import { tessellate } from "./tessellate"; export class Rect2 implements IArea, @@ -29,6 +32,7 @@ export class Rect2 implements ICopy, IPointInside, IPointMap, + ITessellateable, IVertices { static fromMinMax(min: Vec2, max: Vec2) { @@ -98,6 +102,12 @@ export class Rect2 implements return (out ? out.set(this.pos) : this.pos.copy()).madd(this.size, p); } + tessellate(tessel: Tessellator, iter?: number): Vec2[][]; + tessellate(tessel: Iterable>): Vec2[][]; + tessellate(...args: any[]) { + return tessellate.apply(null, [this.vertices(), ...args]); + } + scale(v: Readonly) { this.pos.mul(v); this.size.mul(v); diff --git a/packages/geom/src/tessellate.ts b/packages/geom/src/tessellate.ts index ff5ef8f89b..1cb6d7ea78 100644 --- a/packages/geom/src/tessellate.ts +++ b/packages/geom/src/tessellate.ts @@ -1,5 +1,7 @@ +import { isFunction } from "@thi.ng/checks/is-function"; import { comp } from "@thi.ng/transducers/func/comp"; import { range } from "@thi.ng/transducers/iter/range"; +import { repeat } from "@thi.ng/transducers/iter/repeat"; import { tuples } from "@thi.ng/transducers/iter/tuples"; import { wrap } from "@thi.ng/transducers/iter/wrap"; import { reducer } from "@thi.ng/transducers/reduce"; @@ -135,23 +137,27 @@ export const inset = (inset = 0.5, keepInterior = false) => ); }; -export const tessellate = - >(tessFns: Iterable>, points: T[]) => - transduce( - scan( - reducer( - () => [points], - (acc: T[][], fn: Tessellator) => - transduce( - mapcat(fn), - push(), - acc - ) - ) - ), - last(), - tessFns - ); +export function tessellate>(points: T[], tessFn: Tessellator, iter?: number): T[][]; +export function tessellate>(points: T[], tessFns: Iterable>): T[][]; +export function tessellate>(...args): T[][] { + return transduce( + scan( + reducer( + () => [args[0]], + (acc: T[][], fn: Tessellator) => + transduce( + mapcat(fn), + push(), + acc + ) + ) + ), + last(), + isFunction(args[1]) ? + repeat(args[1], args[2] || 1) : + args[1] + ); +} /* v=require("@thi.ng/vectors"); g=require("@thi.ng/geom"); h=require("@thi.ng/hiccup"); svg=require("@thi.ng/hiccup-svg"); s=require("@thi.ng/strings"); tx=require("@thi.ng/transducers"); fs=require("fs"); diff --git a/packages/geom/src/triangle2.ts b/packages/geom/src/triangle2.ts index f0905bbca3..1d61addedb 100644 --- a/packages/geom/src/triangle2.ts +++ b/packages/geom/src/triangle2.ts @@ -9,13 +9,16 @@ import { IArea, IClassifyPoint, IPointInside, - IPointMap + IPointMap, + ITessellateable, + Tessellator } from "./api"; import { PointContainer2 } from "./container2"; import { arcLength } from "./internal/arc-length"; import { args3 } from "./internal/args"; import { fromBarycentric, toBarycentric } from "./internal/barycentric"; import { classifyPointInTriangle2, corner, pointInTriangle2 } from "./internal/corner"; +import { tessellate } from "./tessellate"; export class Triangle2 extends PointContainer2 implements IArea, @@ -23,7 +26,8 @@ export class Triangle2 extends PointContainer2 implements IClassifyPoint, ICopy, IPointInside, - IPointMap { + IPointMap, + ITessellateable { static equilateral(a: Vec2, b: Vec2) { const dir = b.subNew(a); @@ -65,6 +69,12 @@ export class Triangle2 extends PointContainer2 implements return fromBarycentric(a, b, c, p, out); } + tessellate(tessel: Tessellator, iter?: number): Vec2[][]; + tessellate(tessel: Iterable>): Vec2[][]; + tessellate(...args: any[]) { + return tessellate.apply(null, [this.points, ...args]); + } + toHiccup() { return this._toHiccup("polygon"); } From 6a9747bf232bbb4393ef0f4677703a86230f582e Mon Sep 17 00:00:00 2001 From: Arthur Carabott Date: Sat, 13 Oct 2018 08:48:53 +0100 Subject: [PATCH 59/77] minor(hdom-canvas): baseLine -> baseline original api uses textBaseline, so use of baseLine is a surprise and not easy to guess. --- examples/hdom-canvas-clock/src/index.ts | 2 +- examples/hdom-canvas-shapes/src/index.ts | 4 ++-- packages/hdom-canvas/README.md | 2 +- packages/hdom-canvas/src/index.ts | 4 ++-- packages/hdom/README.md | 2 +- packages/hiccup-svg/src/convert.ts | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/hdom-canvas-clock/src/index.ts b/examples/hdom-canvas-clock/src/index.ts index 4b3feb3083..e310879045 100644 --- a/examples/hdom-canvas-clock/src/index.ts +++ b/examples/hdom-canvas-clock/src/index.ts @@ -50,7 +50,7 @@ const cancel = start(() => { { translate: [100, 100], stroke: "black", fill: "none", - align: "center", baseLine: "middle", + align: "center", baseline: "middle", __normalize: false }, // rim diff --git a/examples/hdom-canvas-shapes/src/index.ts b/examples/hdom-canvas-shapes/src/index.ts index 6c43014dda..cacd1843cf 100644 --- a/examples/hdom-canvas-shapes/src/index.ts +++ b/examples/hdom-canvas-shapes/src/index.ts @@ -122,7 +122,7 @@ const TESTS = { weight: 1, stroke: "#00f", align: "center", - baseLine: "middle", + baseline: "middle", font: "48px Menlo", __normalize: false }, @@ -211,7 +211,7 @@ const TESTS = { }, ["rect", { fill: "#ff0" }, [-50, -50], 100, 100], ["text", - { fill: "#00f", font: "18px Menlo", align: "center", baseLine: "middle" }, + { fill: "#00f", font: "18px Menlo", align: "center", baseline: "middle" }, [0, 0], new Date().toISOString() ] ]; diff --git a/packages/hdom-canvas/README.md b/packages/hdom-canvas/README.md index 38cf38a584..1f5b81a003 100644 --- a/packages/hdom-canvas/README.md +++ b/packages/hdom-canvas/README.md @@ -337,7 +337,7 @@ Some attributes use different names than their actual names in the |-------------|--------------------------| | align | textAlign | | alpha | globalAlpha | -| baseLine | textBaseline | +| baseline | textBaseline | | compose | globalCompositeOperation | | dash | setLineDash | | dashOffset | lineDashOffset | diff --git a/packages/hdom-canvas/src/index.ts b/packages/hdom-canvas/src/index.ts index 051a2d8df2..f60f4c83b9 100644 --- a/packages/hdom-canvas/src/index.ts +++ b/packages/hdom-canvas/src/index.ts @@ -20,7 +20,7 @@ const TAU = Math.PI * 2; const DEFAULTS = { align: "left", alpha: 1, - baseLine: "alphabetic", + baseline: "alphabetic", cap: "butt", comp: "source-over", dash: [], @@ -42,7 +42,7 @@ const DEFAULTS = { const CTX_ATTRIBS = { align: "textAlign", alpha: "globalAlpha", - baseLine: "textBaseline", + baseline: "textBaseline", clip: "clip", compose: "globalCompositeOperation", dash: "setLineDash", diff --git a/packages/hdom/README.md b/packages/hdom/README.md index 083679e1cf..23676d245d 100644 --- a/packages/hdom/README.md +++ b/packages/hdom/README.md @@ -286,7 +286,7 @@ start(() => ["g", { stroke: "none", translate: [50, 50] }, ["circle", { fill: "red" }, [0, 0], 25 + 25 * Math.sin(Date.now() * 0.001)], - ["text", { fill: "#fff", align: "center", baseLine: "middle" }, + ["text", { fill: "#fff", align: "center", baseline: "middle" }, [0, 0], "Hello"] ] ] diff --git a/packages/hiccup-svg/src/convert.ts b/packages/hiccup-svg/src/convert.ts index 907948ecec..0640ed26bd 100644 --- a/packages/hiccup-svg/src/convert.ts +++ b/packages/hiccup-svg/src/convert.ts @@ -148,7 +148,7 @@ const convertAttribs = (attribs: any) => { case "align": res["text-anchor"] = TEXT_ALIGN[v]; break; - case "baseLine": + case "baseline": // no SVG support? case "filter": // TODO needs to be translated into def first From 08372abd332d6013bb1a91eac554c913ac04d939 Mon Sep 17 00:00:00 2001 From: Arthur Carabott Date: Sat, 13 Oct 2018 13:54:40 +0100 Subject: [PATCH 60/77] minor(transducers): fix links to reducers in README --- packages/transducers/README.md | 50 +++++++++++++++++----------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/transducers/README.md b/packages/transducers/README.md index 9393285c8a..a52e724d4c 100644 --- a/packages/transducers/README.md +++ b/packages/transducers/README.md @@ -789,31 +789,31 @@ As with transducer functions, reducer functions can also given an optional input iterable. If done so, the function will consume the input and return a reduced result (as if it would be called via `reduce()`). -- [add](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/add) -- [assocMap](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/assoc-map) -- [assocObj](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/assoc-obj) -- [conj](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/conj) -- [count](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/count) -- [div](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/div) -- [every](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/every) -- [fill](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/fill) -- [frequencies](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/frequencies) -- [groupBinary](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/group-binary) -- [groupByMap](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/group-by-map) -- [groupByObj](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/group-by-obj) -- [last](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/last) -- [maxCompare](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/max-compare) -- [max](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/max) -- [mean](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/mean) -- [minCompare](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/min-compare) -- [min](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/min) -- [mul](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/mul) -- [pushCopy](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/push-copy) -- [push](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/push) -- [reductions](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/reductions) -- [some](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/some) -- [str](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/str) -- [sub](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/sub) +- [add](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/add.ts) +- [assocMap](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/assoc-map.ts) +- [assocObj](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/assoc-obj.ts) +- [conj](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/conj.ts) +- [count](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/count.ts) +- [div](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/div.ts) +- [every](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/every.ts) +- [fill](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/fill.ts) +- [frequencies](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/frequencies.ts) +- [groupBinary](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/group-binary.ts) +- [groupByMap](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/group-by-map.ts) +- [groupByObj](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/group-by-obj.ts) +- [last](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/last.ts) +- [maxCompare](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/max-compare.ts) +- [max](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/max.ts) +- [mean](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/mean.ts) +- [minCompare](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/min-compare.ts) +- [min](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/min.ts) +- [mul](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/mul.ts) +- [pushCopy](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/push-copy.ts) +- [push](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/push.ts) +- [reductions](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/reductions.ts) +- [some](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/some.ts) +- [str](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/str.ts) +- [sub](https://github.com/thi-ng/umbrella/tree/master/packages/transducers/src/rfn/sub.ts) ## Authors From 2e9f0486f4dfa19855754a70405cd85028c57ef7 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 13 Oct 2018 15:57:57 +0100 Subject: [PATCH 61/77] refactor(geom): update arg handling, update readme --- assets/geom-tessel.svg | 1 + packages/geom/README.md | 49 ++++++++++++++++++++++++++++-- packages/geom/src/api.ts | 10 ++++-- packages/geom/src/bezier2.ts | 36 +++++++++++++++++++--- packages/geom/src/circle2.ts | 21 +++++++------ packages/geom/src/internal/args.ts | 33 +++++++++++++++----- packages/geom/src/line2.ts | 17 ++++++----- packages/geom/src/polygon2.ts | 4 +-- packages/geom/src/polyline2.ts | 4 +-- packages/geom/src/quad2.ts | 6 ++-- packages/geom/src/rect2.ts | 19 +++++++----- packages/geom/src/subdiv-curve.ts | 6 ++-- packages/geom/src/tessellate.ts | 3 -- packages/geom/src/triangle2.ts | 6 ++-- 14 files changed, 156 insertions(+), 59 deletions(-) create mode 100644 assets/geom-tessel.svg diff --git a/assets/geom-tessel.svg b/assets/geom-tessel.svg new file mode 100644 index 0000000000..ba3ed411ad --- /dev/null +++ b/assets/geom-tessel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/geom/README.md b/packages/geom/README.md index 385773331b..57ab6a0a85 100644 --- a/packages/geom/README.md +++ b/packages/geom/README.md @@ -8,6 +8,7 @@ This project is part of the - [About](#about) +- [Status](#status) - [Installation](#installation) - [Usage examples](#usage-examples) - [Authors](#authors) @@ -17,6 +18,16 @@ This project is part of the ## About +This package is a partial WIP port of selected features of the +[Clojure/ClojureScript version of +thi.ng/geom](https://github.com/thi-ng/geom), as well as +[c.thi.ng](https://github.com/thi-ng/c-thing). Currently only 2D shapes +& operations are supported. + +## Status + +ALPHA - major breaking changes forthcoming... + ## Installation ```bash @@ -25,8 +36,42 @@ yarn add @thi.ng/geom ## Usage examples +![sample output](../../assets/geom-tessel.svg) + ```ts -import * as geom from "@thi.ng/geom"; +import * as g from "@thi.ng/geom"; +import * as v from "@thi.ng/vectors"; +import * as h from "@thi.ng/hiccup"; +import * as svg from "@thi.ng/hiccup-svg"; +import * as fs from "fs"; + +const tintedPoly = (points) => { + const p = g.polygon2(points); + const c = p.centroid().toPolar(); + p.attribs = { fill: `hsl(${v.deg(c.y)},${c.x}%,${100-c.x/2}%)` }; + return p; +}; + +fs.writeFileSync( + "tessel.svg", + h.serialize( + svg.svg( + { + width: 1000, height: 1000, + viewBox: "-100 -100 200 200", + fill: "none", + stroke: "#000", + "stroke-width": 0.5, + }, + svg.convertTree( + g.circle2(100) + .toPolygon(6) + .tessellate([g.quadFan, g.triFan, g.edgeSplit, g.quadFan]) + .map((pts) => tintedPoly(pts).toHiccup()) + ) + ) + ) +); ``` ## Authors @@ -35,4 +80,4 @@ import * as geom from "@thi.ng/geom"; ## License -© 2016 - 2018 Karsten Schmidt // Apache Software License 2.0 +© 2013 - 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/geom/src/api.ts b/packages/geom/src/api.ts index e2e1a0fc52..05e02f7306 100644 --- a/packages/geom/src/api.ts +++ b/packages/geom/src/api.ts @@ -223,13 +223,19 @@ export interface JsonCircle2 extends JsonShape { r: number; } +export interface JsonCubic2 extends JsonShape { + points: Vec[]; +} + +export interface JsonQuadratic2 extends JsonShape { + points: Vec[]; +} + export interface JsonPolygon2 extends JsonShape { - pos: Vec; points: Vec[]; } export interface JsonPolyline2 extends JsonShape { - pos: Vec; points: Vec[]; } diff --git a/packages/geom/src/bezier2.ts b/packages/geom/src/bezier2.ts index f2a6b9d064..06cf8aede0 100644 --- a/packages/geom/src/bezier2.ts +++ b/packages/geom/src/bezier2.ts @@ -1,13 +1,15 @@ import { ICopy } from "@thi.ng/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { IMath, Vec } from "@thi.ng/vectors/api"; +import { IMath, ReadonlyVec, Vec } from "@thi.ng/vectors/api"; import { clamp1 } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, DEFAULT_SAMPLES, IVertices, + JsonCubic2, + JsonQuadratic2, SamplingOpts } from "./api"; import { PointContainer2 } from "./container2"; @@ -73,6 +75,14 @@ const cubicAxisBounds = (pa: number, pb: number, pc: number, pd: number) => { export class Cubic2 extends PointContainer2 implements IVertices> { + static fromJSON(spec: JsonCubic2) { + return cubic2(spec.points, spec.attribs); + } + + static fromLine(a: Vec2, b: Vec2) { + return new Cubic2([a, a.mixNewN(b, 1 / 3), b.mixNewN(a, 1 / 3), b]); + } + copy() { return new Cubic2(this._copy(), this.attribs); } @@ -158,11 +168,23 @@ export class Cubic2 extends PointContainer2 implements const pts = this.points; return [["C", pts[1], pts[2], pts[3]]]; } + + toJSON() { + return this._toJSON("cubic2"); + } } export class Quadratic2 extends PointContainer2 implements IVertices> { + static fromJSON(spec: JsonQuadratic2) { + return quadratic2(spec.points, spec.attribs); + } + + static fromLine(a: Vec2, b: Vec2) { + return new Quadratic2([a, a.mixNewN(b), b]); + } + copy() { return new Quadratic2(this._copy(), this.attribs); } @@ -272,19 +294,23 @@ export class Quadratic2 extends PointContainer2 implements const pts = this.points; return [["Q", pts[1], pts[2]]]; } + + toJSON() { + return this._toJSON("quadratic2"); + } } export function cubic2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Cubic2; -export function cubic2(a: Vec2, b: Vec2, c: Vec2, d: Vec2, attribs?: Attribs): Cubic2; -export function cubic2(points: Vec2[], attribs?: Attribs): Cubic2; +export function cubic2(a: ReadonlyVec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, attribs?: Attribs): Cubic2; +export function cubic2(points: ReadonlyVec[], attribs?: Attribs): Cubic2; export function cubic2(...args: any[]) { const [points, attribs] = args4(args); return new Cubic2(points, attribs); } export function quadratic2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Quadratic2; -export function quadratic2(a: Vec2, b: Vec2, c: Vec2, attribs?: Attribs): Quadratic2; -export function quadratic2(points: Vec2[], attribs?: Attribs): Quadratic2; +export function quadratic2(a: Vec2 | ReadonlyVec, b: Vec2 | ReadonlyVec, c: Vec2 | ReadonlyVec, attribs?: Attribs): Quadratic2; +export function quadratic2(points: ReadonlyVec[], attribs?: Attribs): Quadratic2; export function quadratic2(...args: any[]) { const [points, attribs] = args3(args); return new Quadratic2(points, attribs); diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index 695eb6efbf..5b03d3eb17 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -1,8 +1,9 @@ import { IToHiccup } from "@thi.ng/api/api"; +import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { Vec } from "@thi.ng/vectors/api"; -import { PI, TAU, eqDelta1 } from "@thi.ng/vectors/math"; +import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; +import { eqDelta1, PI, TAU } from "@thi.ng/vectors/math"; import { asVec2, setS2, @@ -17,12 +18,12 @@ import { IBounds, IBoundsRaw, ICentroid, + IClassifyPoint, + IPointInside, IToPolygon, IVertices, JsonCircle2, - SamplingOpts, - IPointInside, - IClassifyPoint + SamplingOpts } from "./api"; import { circumCenter } from "./internal/circumcenter"; import { edges } from "./internal/edges"; @@ -164,8 +165,8 @@ export class Circle2 implements export function circle2(r: number, attribs?: Attribs): Circle2; export function circle2(x: number, y: number, attribs?: Attribs): Circle2; export function circle2(x: number, y: number, r: number, attribs?: Attribs): Circle2; -export function circle2(pos: Vec2, attribs?: Attribs): Circle2; -export function circle2(pos: Vec2, r: number, attribs?: Attribs): Circle2; +export function circle2(pos: ReadonlyVec, attribs?: Attribs): Circle2; +export function circle2(pos: ReadonlyVec, r: number, attribs?: Attribs): Circle2; export function circle2(...args: any[]) { let attribs; let n = args.length - 1; @@ -173,9 +174,9 @@ export function circle2(...args: any[]) { attribs = args[n]; n--; } - if (args[0] instanceof Vec2) { + if (isArrayLike(args[0])) { return new Circle2( - args[0], + asVec2(args[0]), n === 1 ? args[n] : 1, attribs ); @@ -187,5 +188,5 @@ export function circle2(...args: any[]) { attribs ); } - return new Circle2(new Vec2([0, 0]), args[0], attribs); + return new Circle2(new Vec2(), args[0], attribs); } diff --git a/packages/geom/src/internal/args.ts b/packages/geom/src/internal/args.ts index 96030f5b89..8d430d07b3 100644 --- a/packages/geom/src/internal/args.ts +++ b/packages/geom/src/internal/args.ts @@ -1,10 +1,19 @@ -import { Vec2 } from "@thi.ng/vectors/vec2"; +import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { isNumber } from "@thi.ng/checks/is-number"; +import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; +import { ReadonlyVec } from "@thi.ng/vectors/api"; +import { asVec2, Vec2 } from "@thi.ng/vectors/vec2"; export const args3 = (args: any[]) => { let points = args[0], attribs; - if (points instanceof Vec2) { - points = [points, args[1], args[2]]; + if (isArrayLike(points[0])) { + points = (points).map(asVec2); + attribs = args[1]; + } else if (args.length >= 3 && + isArrayLike(points) && + isArrayLike(args[1]) && + isArrayLike(args[2])) { + points = [asVec2(points), asVec2(args[1]), asVec2(args[2])]; attribs = args[3]; } else if (isNumber(points[0])) { points = Vec2.mapBuffer( @@ -16,15 +25,22 @@ export const args3 = (args: any[]) => { ); attribs = args[4]; } else { - attribs = args[1]; + illegalArgs(); } return [points, attribs]; }; export const args4 = (args: any[]) => { let points = args[0], attribs; - if (points instanceof Vec2) { - points = [points, args[1], args[2], args[3]]; + if (isArrayLike(points[0])) { + points = (points).map(asVec2); + attribs = args[1]; + } else if (args.length >= 4 && + isArrayLike(points) && + isArrayLike(args[1]) && + isArrayLike(args[2]) && + isArrayLike(args[3])) { + points = [asVec2(points), asVec2(args[1]), asVec2(args[2]), asVec2(args[3])]; attribs = args[4]; } else if (isNumber(points[0])) { points = Vec2.mapBuffer( @@ -36,7 +52,7 @@ export const args4 = (args: any[]) => { ); attribs = args[4]; } else { - attribs = args[1]; + illegalArgs(); } return [points, attribs]; }; @@ -52,7 +68,8 @@ export const argsN = (args: any[]) => { args[4] || 2 ); attribs = args[5]; - } else { + } else if (isArrayLike(points[0])) { + points = (points).map(asVec2); attribs = args[1]; } return [points, attribs]; diff --git a/packages/geom/src/line2.ts b/packages/geom/src/line2.ts index a7f25d6bf7..4c90fac069 100644 --- a/packages/geom/src/line2.ts +++ b/packages/geom/src/line2.ts @@ -1,7 +1,8 @@ +import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { Vec } from "@thi.ng/vectors/api"; -import { Vec2 } from "@thi.ng/vectors/vec2"; +import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; +import { asVec2, Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, HiccupLine2, SamplingOpts } from "./api"; import { PointContainer2 } from "./container2"; import { liangBarsky2 } from "./internal/liang-barsky"; @@ -77,19 +78,19 @@ export class Line2 extends PointContainer2 { export function line2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Line2; export function line2(x1: number, y1: number, x2: number, y2: number, attribs?: Attribs): Line2; -export function line2(a: Vec2, b: Vec2, attribs?: Attribs): Line2; +export function line2(a: ReadonlyVec, b: ReadonlyVec, attribs?: Attribs): Line2; export function line2(...args: any[]) { - let attribs; + let points = args[0], attribs; let n = args.length - 1; if (isPlainObject(args[n]) || args[n] == null) { attribs = args[n]; n--; } - if (isNumber(args[0])) { + if (isNumber(points)) { return new Line2(Vec2.mapBuffer(args.slice(0, 4), 2), attribs); } - if (args[0] instanceof Vec2) { - return new Line2([args[0], args[1]], attribs); + if (isArrayLike(points)) { + return new Line2([asVec2(points), asVec2(args[1])], attribs); } - return new Line2(Vec2.mapBuffer(args[0], 2, args[1] || 0, args[2] || 1, args[3] || 2), attribs); + return new Line2(Vec2.mapBuffer(points, 2, args[1] || 0, args[2] || 1, args[3] || 2), attribs); } diff --git a/packages/geom/src/polygon2.ts b/packages/geom/src/polygon2.ts index b1ee3588ad..097f2c2290 100644 --- a/packages/geom/src/polygon2.ts +++ b/packages/geom/src/polygon2.ts @@ -7,7 +7,7 @@ import { tuples } from "@thi.ng/transducers/iter/tuples"; import { push } from "@thi.ng/transducers/rfn/push"; import { transduce } from "@thi.ng/transducers/transduce"; import { map } from "@thi.ng/transducers/xform/map"; -import { Vec } from "@thi.ng/vectors/api"; +import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; import { TAU } from "@thi.ng/vectors/math"; import { asVec2, toCartesian2, Vec2 } from "@thi.ng/vectors/vec2"; import { @@ -154,7 +154,7 @@ export class Polygon2 extends PointContainer2 implements } export function polygon2(points: Vec, num?: number, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Polygon2; -export function polygon2(points: Vec2[], attribs?: Attribs): Polygon2; +export function polygon2(points: ReadonlyVec[], attribs?: Attribs): Polygon2; export function polygon2(...args: any[]) { const [points, attribs] = argsN(args); return new Polygon2(points, attribs); diff --git a/packages/geom/src/polyline2.ts b/packages/geom/src/polyline2.ts index 314088b2da..4f9853c27c 100644 --- a/packages/geom/src/polyline2.ts +++ b/packages/geom/src/polyline2.ts @@ -1,6 +1,6 @@ import { ICopy, IToHiccup } from "@thi.ng/api/api"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { Vec } from "@thi.ng/vectors/api"; +import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, @@ -83,7 +83,7 @@ export class Polyline2 extends PointContainer2 implements } export function polyline2(points: Vec, num?: number, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Polyline2; -export function polyline2(points: Vec2[], attribs?: Attribs): Polyline2; +export function polyline2(points: ReadonlyVec[], attribs?: Attribs): Polyline2; export function polyline2(...args: any[]) { const [points, attribs] = argsN(args); return new Polyline2(points, attribs); diff --git a/packages/geom/src/quad2.ts b/packages/geom/src/quad2.ts index eb32808c54..4a2c07dbbc 100644 --- a/packages/geom/src/quad2.ts +++ b/packages/geom/src/quad2.ts @@ -1,5 +1,5 @@ import { ICopy } from "@thi.ng/api"; -import { Vec } from "@thi.ng/vectors/api"; +import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, @@ -69,8 +69,8 @@ export class Quad2 extends PointContainer2 implements } export function quad2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Quad2; -export function quad2(a: Vec2, b: Vec2, c: Vec2, d: Vec2, attribs?: Attribs): Quad2; -export function quad2(points: Vec2[], attribs?: Attribs): Quad2; +export function quad2(a: ReadonlyVec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, attribs?: Attribs): Quad2; +export function quad2(points: ReadonlyVec[], attribs?: Attribs): Quad2; export function quad2(...args: any[]) { const [points, attribs] = args4(args); return new Quad2(points, attribs); diff --git a/packages/geom/src/rect2.ts b/packages/geom/src/rect2.ts index 510cf5932a..b6d3527645 100644 --- a/packages/geom/src/rect2.ts +++ b/packages/geom/src/rect2.ts @@ -1,6 +1,9 @@ import { ICopy } from "@thi.ng/api"; +import { isArrayLike } from "@thi.ng/checks/is-arraylike"; +import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; -import { Vec2 } from "@thi.ng/vectors/vec2"; +import { ReadonlyVec } from "@thi.ng/vectors/api"; +import { asVec2, Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, CollateOpts, @@ -159,8 +162,8 @@ export class Rect2 implements export function rect2(x: number, y: number, w: number, h: number, attribs?: Attribs): Rect2; export function rect2(x: number, y: number, w: number, attribs?: Attribs): Rect2; export function rect2(w: number, h: number, attribs?: Attribs): Rect2; -export function rect2(pos: Vec2, w: number, attribs?: Attribs): Rect2; -export function rect2(pos: Vec2, size: Vec2, attribs?: Attribs): Rect2; +export function rect2(pos: ReadonlyVec, w: number, attribs?: Attribs): Rect2; +export function rect2(pos: ReadonlyVec, size: ReadonlyVec, attribs?: Attribs): Rect2; export function rect2(w: number, attribs?: Attribs): Rect2; export function rect2(...args: any[]) { let attribs; @@ -169,13 +172,13 @@ export function rect2(...args: any[]) { attribs = args[n]; n--; } - if (args[0] instanceof Vec2) { + if (isArrayLike(args[0])) { const size = args[1]; return new Rect2( - args[0], - size instanceof Vec2 ? - size : - new Vec2([size, size]), + asVec2(args[0]), + isNumber(size) ? + new Vec2([size, size]) : + asVec2(size), attribs ); } diff --git a/packages/geom/src/subdiv-curve.ts b/packages/geom/src/subdiv-curve.ts index 0f2305ee63..31b3e93ebd 100644 --- a/packages/geom/src/subdiv-curve.ts +++ b/packages/geom/src/subdiv-curve.ts @@ -81,7 +81,7 @@ const CHAIKIN_FIRST = subdivKernel3([1 / 2, 1 / 2, 0], [0, 3 / 4, 1 / 4]); const CHAIKIN_MAIN = subdivKernel3([1 / 4, 3 / 4, 0], [0, 3 / 4, 1 / 4]); const CHAIKIN_LAST = subdivKernel3([1 / 4, 3 / 4, 0], [0, 1 / 2, 1 / 2]); -const CUBIC_BEZIER_MAIN = subdivKernel3([1 / 8, 3 / 4, 1 / 8], [0, 1 / 2, 1 / 2]); +const CUBIC_MAIN = subdivKernel3([1 / 8, 3 / 4, 1 / 8], [0, 1 / 2, 1 / 2]); export const CHAIKIN_CLOSED: SubdivKernel = { fn: CHAIKIN_MAIN, @@ -98,7 +98,7 @@ export const CHAIKIN_OPEN: SubdivKernel = { size: 3 }; -export const CUBIC_BEZIER_CLOSED: SubdivKernel = { - fn: CUBIC_BEZIER_MAIN, +export const CUBIC_CLOSED: SubdivKernel = { + fn: CUBIC_MAIN, size: 3 }; diff --git a/packages/geom/src/tessellate.ts b/packages/geom/src/tessellate.ts index 1cb6d7ea78..dc100dc8e8 100644 --- a/packages/geom/src/tessellate.ts +++ b/packages/geom/src/tessellate.ts @@ -161,7 +161,4 @@ export function tessellate>(...args): T[][] { /* v=require("@thi.ng/vectors"); g=require("@thi.ng/geom"); h=require("@thi.ng/hiccup"); svg=require("@thi.ng/hiccup-svg"); s=require("@thi.ng/strings"); tx=require("@thi.ng/transducers"); fs=require("fs"); - -res = h.serialize(svg.convertTree(g.tessellate([g.quadFan, g.edgeSplit, g.rimTris, g.quadFan, g.inset(), g.quadFan], g.circle2(100).vertices(6)).map(p=>g.polygon2(p).toHiccup()))) - */ \ No newline at end of file diff --git a/packages/geom/src/triangle2.ts b/packages/geom/src/triangle2.ts index 1d61addedb..12ce12507a 100644 --- a/packages/geom/src/triangle2.ts +++ b/packages/geom/src/triangle2.ts @@ -1,5 +1,5 @@ import { ICopy } from "@thi.ng/api"; -import { Vec } from "@thi.ng/vectors/api"; +import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; import { PI } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Vec3 } from "@thi.ng/vectors/vec3"; @@ -85,8 +85,8 @@ export class Triangle2 extends PointContainer2 implements } export function triangle2(points: Vec, start?: number, cstride?: number, estride?: number, attribs?: Attribs): Triangle2; -export function triangle2(a: Vec2, b: Vec2, c: Vec2, attribs?: Attribs): Triangle2; -export function triangle2(points: Vec2[], attribs?: Attribs): Triangle2; +export function triangle2(a: ReadonlyVec, b: ReadonlyVec, c: ReadonlyVec, attribs?: Attribs): Triangle2; +export function triangle2(points: ReadonlyVec[], attribs?: Attribs): Triangle2; export function triangle2(...args: any[]) { const [points, attribs] = args3(args); return new Triangle2(points, attribs); From 4af1fba3149c6532ca37d7441c09a8e9884b7a66 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 17:10:45 +0100 Subject: [PATCH 62/77] feat(math): extract maths fns from @thi.ng/vectors as new package --- packages/math/.npmignore | 10 ++ packages/math/LICENSE | 201 +++++++++++++++++++++++++++++++ packages/math/README.md | 47 ++++++++ packages/math/package.json | 44 +++++++ packages/math/src/abs.ts | 7 ++ packages/math/src/angle.ts | 35 ++++++ packages/math/src/api.ts | 14 +++ packages/math/src/eqdelta.ts | 13 ++ packages/math/src/fit.ts | 19 +++ packages/math/src/index.ts | 10 ++ packages/math/src/interval.ts | 133 ++++++++++++++++++++ packages/math/src/mix.ts | 90 ++++++++++++++ packages/math/src/prec.ts | 17 +++ packages/math/src/solve.ts | 106 ++++++++++++++++ packages/math/src/step.ts | 51 ++++++++ packages/math/test/index.ts | 6 + packages/math/test/tsconfig.json | 10 ++ packages/math/tsconfig.json | 9 ++ 18 files changed, 822 insertions(+) create mode 100644 packages/math/.npmignore create mode 100644 packages/math/LICENSE create mode 100644 packages/math/README.md create mode 100644 packages/math/package.json create mode 100644 packages/math/src/abs.ts create mode 100644 packages/math/src/angle.ts create mode 100644 packages/math/src/api.ts create mode 100644 packages/math/src/eqdelta.ts create mode 100644 packages/math/src/fit.ts create mode 100644 packages/math/src/index.ts create mode 100644 packages/math/src/interval.ts create mode 100644 packages/math/src/mix.ts create mode 100644 packages/math/src/prec.ts create mode 100644 packages/math/src/solve.ts create mode 100644 packages/math/src/step.ts create mode 100644 packages/math/test/index.ts create mode 100644 packages/math/test/tsconfig.json create mode 100644 packages/math/tsconfig.json diff --git a/packages/math/.npmignore b/packages/math/.npmignore new file mode 100644 index 0000000000..d703bda97a --- /dev/null +++ b/packages/math/.npmignore @@ -0,0 +1,10 @@ +build +coverage +dev +doc +src* +test +.nyc_output +tsconfig.json +*.tgz +*.html diff --git a/packages/math/LICENSE b/packages/math/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/math/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/math/README.md b/packages/math/README.md new file mode 100644 index 0000000000..a953590942 --- /dev/null +++ b/packages/math/README.md @@ -0,0 +1,47 @@ +# @thi.ng/math + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/math.svg)](https://www.npmjs.com/package/@thi.ng/math) +![npm downloads](https://img.shields.io/npm/dm/@thi.ng/math.svg) +[![Twitter Follow](https://img.shields.io/twitter/follow/thing_umbrella.svg?style=flat-square&label=twitter)](https://twitter.com/thing_umbrella) + +This project is part of the +[@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo. + + + +- [About](#about) +- [Installation](#installation) +- [Dependencies](#dependencies) +- [Usage examples](#usage-examples) +- [Authors](#authors) +- [License](#license) + + + +## About + +Assorted common math functions & utilities. + +## Installation + +```bash +yarn add @thi.ng/math +``` + +## Dependencies + +None. + +## Usage examples + +```ts +import * as m from "@thi.ng/math"; +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/math/package.json b/packages/math/package.json new file mode 100644 index 0000000000..aae653e9fd --- /dev/null +++ b/packages/math/package.json @@ -0,0 +1,44 @@ +{ + "name": "@thi.ng/math", + "version": "0.0.1", + "description": "TODO", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thi-ng/umbrella.git" + }, + "homepage": "https://github.com/thi-ng/umbrella/tree/master/packages/math", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc", + "cover": "yarn test && nyc report --reporter=lcov", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^5.2.5", + "@types/node": "^10.5.5", + "mocha": "^5.2.0", + "nyc": "^12.0.2", + "typedoc": "^0.11.1", + "typescript": "^3.0.1" + }, + "dependencies": {}, + "keywords": [ + "binary", + "ES6", + "gray codes", + "interpolation", + "math", + "solver", + "typescript", + "utilities" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/math/src/abs.ts b/packages/math/src/abs.ts new file mode 100644 index 0000000000..c173dcb4b4 --- /dev/null +++ b/packages/math/src/abs.ts @@ -0,0 +1,7 @@ +import { EPS } from "./api"; + +export const absDiff = (x: number, y: number) => + Math.abs(x - y); + +export const sign = (x: number, eps = EPS) => + x > eps ? 1 : x < -eps ? -1 : 0; diff --git a/packages/math/src/angle.ts b/packages/math/src/angle.ts new file mode 100644 index 0000000000..3dce9aa26b --- /dev/null +++ b/packages/math/src/angle.ts @@ -0,0 +1,35 @@ +import { + DEG2RAD, + HALF_PI, + PI, + RAD2DEG, + TAU +} from "./api"; + +export const absTheta = (theta: number) => + (theta %= TAU, theta < 0 ? TAU + theta : theta); + +export const angleDist = (a: number, b: number) => + (a = absTheta((b % TAU) - (a % TAU)), a > PI ? TAU - a : a); + +export const atan2Abs = (y: number, x: number) => + absTheta(Math.atan2(y, x)); + +export const quadrant = (theta: number) => + (absTheta(theta) / HALF_PI) | 0; + +/** + * Converts angle to degrees. + * + * @param x angle in radians + */ +export const deg = (x: number) => + x * RAD2DEG; + +/** + * Converts angle to radians. + * + * @param x angle in degrees + */ +export const rad = (x: number) => + x * DEG2RAD; diff --git a/packages/math/src/api.ts b/packages/math/src/api.ts new file mode 100644 index 0000000000..3382fb9122 --- /dev/null +++ b/packages/math/src/api.ts @@ -0,0 +1,14 @@ +export const PI = Math.PI; +export const TAU = PI * 2; +export const HALF_PI = PI / 2; +export const THIRD_PI = PI / 3; +export const QUARTER_PI = PI / 4; +export const SIXTH_PI = PI / 6; + +export const DEG2RAD = PI / 180; +export const RAD2DEG = 180 / PI; + +export const SQRT2 = Math.SQRT2; +export const SQRT3 = Math.sqrt(3); + +export let EPS = 1e-6; diff --git a/packages/math/src/eqdelta.ts b/packages/math/src/eqdelta.ts new file mode 100644 index 0000000000..50eb9c196e --- /dev/null +++ b/packages/math/src/eqdelta.ts @@ -0,0 +1,13 @@ +import { EPS } from "./api"; + +/** + * Checks if `|a - b| <= ε`. + * + * @param a left value + * @param b right value + * @param eps epsilon / tolerance + */ +export const eqDelta = (a: number, b: number, eps = EPS) => { + const d = a - b; + return (d < 0 ? -d : d) <= eps; +}; diff --git a/packages/math/src/fit.ts b/packages/math/src/fit.ts new file mode 100644 index 0000000000..19574eedb1 --- /dev/null +++ b/packages/math/src/fit.ts @@ -0,0 +1,19 @@ +import { clamp01, clamp11 } from "./interval"; + +export const norm = (x: number, a: number, b: number) => + (x - a) / (b - a); + +export const fit = (x: number, a: number, b: number, c: number, d: number) => + c + (d - c) * norm(x, a, b); + +export const fitClamped = (x: number, a: number, b: number, c: number, d: number) => + c + (d - c) * clamp01(norm(x, a, b)); + +export const fit01 = (x: number, a: number, b: number) => + a + (b - a) * clamp01(x); + +export const fit10 = (x: number, a: number, b: number) => + b + (a - b) * clamp01(x); + +export const fit11 = (x: number, a: number, b: number) => + a + (b - a) * (0.5 + 0.5 * clamp11(x)); \ No newline at end of file diff --git a/packages/math/src/index.ts b/packages/math/src/index.ts new file mode 100644 index 0000000000..53eb850ccf --- /dev/null +++ b/packages/math/src/index.ts @@ -0,0 +1,10 @@ +export * from "./api"; +export * from "./abs"; +export * from "./angle"; +export * from "./eqdelta"; +export * from "./fit"; +export * from "./interval"; +export * from "./mix"; +export * from "./prec"; +export * from "./solve"; +export * from "./step"; diff --git a/packages/math/src/interval.ts b/packages/math/src/interval.ts new file mode 100644 index 0000000000..cd4a6ebb8e --- /dev/null +++ b/packages/math/src/interval.ts @@ -0,0 +1,133 @@ +/** + * Clamps value `x` to given closed interval. + * + * @param x value to clamp + * @param min lower bound + * @param max upper bound + */ +export const clamp = (x: number, min: number, max: number) => + x < min ? min : x > max ? max : x; + +export const clamp01 = (x: number) => + x < 0 ? 0 : x > 1 ? 1 : x; + +export const clamp11 = (x: number) => + x < -1 ? -1 : x > 1 ? 1 : x; + +export const wrap = (x: number, min: number, max: number) => + x < min ? x - min + max : x >= max ? x - max + min : x; + +export const wrap01 = (x: number) => + x < 0 ? x + 1 : x >= 1 ? x - 1 : x; + +export const wrap11 = (x: number) => + x < -1 ? x + 2 : x >= 1 ? x - 2 : x; + +export const min2id = (a: number, b: number) => + a <= b ? 0 : 1; + +export const min3id = (a: number, b: number, c: number) => + (a <= b) ? + (a <= c ? 0 : 2) : + (b <= c ? 1 : 2); + +export const min4id = (a: number, b: number, c: number, d: number) => + a <= b ? + (a <= c ? + (a <= d ? 0 : 3) : + (c <= d ? 2 : 3)) : + (b <= c ? + (b <= d ? 1 : 3) : + (c <= d ? 2 : 3)); + +export const max2id = (a: number, b: number) => + a >= b ? 0 : 1; + +export const max3id = (a: number, b: number, c: number) => + (a >= b) ? + (a >= c ? 0 : 2) : + (b >= c ? 1 : 2); + +export const max4id = (a: number, b: number, c: number, d: number) => + a >= b ? + (a >= c ? + (a >= d ? 0 : 3) : + (c >= d ? 2 : 3)) : + (b >= c ? + (b >= d ? 1 : 3) : + (c >= d ? 2 : 3)); + +/** + * See `smax()`. + * + * @param a + * @param b + * @param k smooth exponent (MUST be > 0) + */ +export const smin = (a: number, b: number, k: number) => + smax(a, b, -k); + +/** + * Smooth maximum. Note: Result values will be slightly larger than max + * value near max(a,b) + eps due to exponential decay. Higher `k` values + * reduce the error, but also reduce the smoothing. Recommended k=16. + * + * https://en.wikipedia.org/wiki/Smooth_maximum + * + * @param a + * @param b + * @param k smooth exponent (MUST be > 0) + */ +export const smax = (a: number, b: number, k: number) => { + const ea = Math.exp(a * k); + const eb = Math.exp(b * k); + return (a * ea + b * eb) / (ea + eb); +}; + +/** + * Same as `smin(smax(x, min, k), max, k)`. + * + * @param x + * @param min + * @param max + * @param k + */ +export const sclamp = (x: number, min: number, max: number, k: number) => + smin(smax(x, min, k), max, k); + +export const absMin = (a: number, b: number) => + Math.abs(a) < Math.abs(b) ? a : b; + +export const absMax = (a: number, b: number) => + Math.abs(a) > Math.abs(b) ? a : b; + +/** + * http://www.musicdsp.org/showone.php?id=203 + * + * @param e + * @param x + */ +export const foldback = (e: number, x: number) => + (x < -e || x > e) ? + Math.abs(Math.abs((x - e) % (4 * e)) - 2 * e) - e : + x; + +/** + * Returns true iff `x` is in closed interval `[min .. max]` + * + * @param x + * @param min + * @param max + */ +export const inRange = (x: number, min: number, max: number) => + x >= min && x <= max; + +/** + * Returns true iff `x` is in open interval `(min .. max)` + * + * @param x + * @param min + * @param max + */ +export const inOpenRange = (x: number, min: number, max: number) => + x > min && x < max; diff --git a/packages/math/src/mix.ts b/packages/math/src/mix.ts new file mode 100644 index 0000000000..2d2bf719de --- /dev/null +++ b/packages/math/src/mix.ts @@ -0,0 +1,90 @@ +import { PI, HALF_PI } from "./api"; + +export const mix = (a: number, b: number, t: number) => + a + (b - a) * t; + +/** + * ``` + * c d + * +----+ + * | | + * +----+ + * a b + * ``` + * + * @param a BL value + * @param b BR value + * @param c TL value + * @param d TR value + * @param u 1st interpolation factor + * @param v 2nd interpolation factor + */ +export const mixBilinear = (a: number, b: number, c: number, d: number, u: number, v: number) => + mix(mix(a, b, u), mix(c, d, u), v); + +export const tween = (f: (t: number) => number, from: number, to: number) => + (t: number) => mix(from, to, f(t)); + +/** + * Circular interpolation: `sqrt(1 - (1 - t)^2)` + * + * @param t interpolation factor (0.0 .. 1.0) + */ +export const circular = (t: number) => { + t = 1 - t; + return Math.sqrt(1 - t * t); +}; + +export const cosine = (t: number): number => + 1 - (Math.cos(t * PI) * 0.5 + 0.5); + +export const decimated = (n: number, t: number) => + Math.floor(t * n) / n; + +export const bounce = (k: number, amp: number, t: number) => { + const tk = t * k; + return 1 - amp * Math.sin(tk) / tk * Math.cos(t * HALF_PI); +}; + +/** + * HOF exponential easing. + * + * - `ease = 1` -> linear + * - `ease > 1` -> ease in + * - `ease < 1` -> ease out + * + * @param ease easing behavior [0.0 .. ∞] + * @param t + */ +export const ease = (ease: number, t: number) => + Math.pow(t, ease); + +/** + * HOF impulse generator. Peaks at `t=1/k` + * + * @param k impulse width (higher values => shorter impulse) + */ +export const impulse = (k: number, t: number) => { + const h = k * t; + return h * Math.exp(1 - h); +}; + +export const gain = (k: number, t: number) => + t < 0.5 ? + 0.5 * Math.pow(2 * t, k) : + 1 - 0.5 * Math.pow(2 - 2 * t, k); + +export const parabola = (k: number, t: number) => + Math.pow(4.0 * t * (1.0 - t), k); + +export const cubicPulse = (w: number, c: number, t: number) => { + t = Math.abs(t - c); + return t > w ? + 0 : + (t /= w, 1 - t * t * (3 - 2 * t)); +}; + +export const sinc = (k: number, t: number) => { + t = PI * (k * t - 1.0); + return Math.sin(t) / t; +}; diff --git a/packages/math/src/prec.ts b/packages/math/src/prec.ts new file mode 100644 index 0000000000..9d05ccaf3a --- /dev/null +++ b/packages/math/src/prec.ts @@ -0,0 +1,17 @@ +/** + * Returns `a - b * floor(a/b)` + * + * @param a + * @param b + */ +export const fmod = (a: number, b: number) => + a - b * Math.floor(a / b); + +export const fract = (x: number) => + x - Math.floor(x); + +export const trunc = (x: number) => + x < 0 ? Math.ceil(x) : Math.floor(x); + +export const roundTo = (x: number, prec = 1) => + Math.round(x / prec) * prec; diff --git a/packages/math/src/solve.ts b/packages/math/src/solve.ts new file mode 100644 index 0000000000..fab6df7f0f --- /dev/null +++ b/packages/math/src/solve.ts @@ -0,0 +1,106 @@ +import { EPS } from "./api"; + +/** + * Produces a new function which computes derivative of the given + * single-arg function. The extra optional arg `eps` is used to + * define the step width for computing derived values: + * + * `f'(x) = (f(x + eps) - f(x)) / eps` + * + * The original function is assumed to be fully differentiable + * in the interval the returned function is going to be used. + * No validity checks of any form are done. + * + * https://en.wikipedia.org/wiki/Derivative#Continuity_and_differentiability + * + * @param fn + * @param eps + */ +export const derivative = (f: (x: number) => number, eps = EPS) => { + return (x: number) => (f(x + eps) - f(x)) / eps; +} + +/** + * Computes solution for linear equation: `ax + b = 0`. + * + * Note: `a` MUST NOT be zero. + * + * @param a slope + * @param b constant offset + */ +export const solveLinear = (a: number, b: number) => + -b / a; + +/** + * Computes solutions for quadratic equation: `ax^2 + bx + c = 0`. + * Returns array of real solutions. + * Note: `a` MUST NOT be zero. If the quadratic term is missing, + * use `solveLinear` instead. + * + * https://en.wikipedia.org/wiki/Quadratic_function + * https://en.wikipedia.org/wiki/Quadratic_equation + * + * @param a quadratic coefficient + * @param b linear coefficient + * @param c constant offset + * @param eps tolerance to determine multiple roots + */ +export const solveQuadratic = (a: number, b: number, c: number, eps = 1e-9) => { + const d = 2 * a; + let r = b * b - 4 * a * c; + return r < 0 ? + [] : + r < eps ? + [-b / d] : + (r = Math.sqrt(r), [(-b - r) / d, (-b + r) / d]); +}; + +/** + * Computes solutions for quadratic equation: `ax^3 + bx^2 + c*x + d = 0`. + * Returns array of solutions, both real & imaginary. + * Note: `a` MUST NOT be zero. If the cubic term is missing (i.e. zero), + * use `solveQuadratic` or `solveLinear` instead. + * + * https://en.wikipedia.org/wiki/Cubic_function + * + * @param a cubic coefficient + * @param b quadratic coefficient + * @param c linear coefficient + * @param d constant offset + * @param eps tolerance to determine multiple roots + */ +export const solveCubic = (a: number, b: number, c: number, d: number, eps = 1e-9) => { + const aa = a * a; + const bb = b * b; + const ba3 = b / (3 * a); + const p = (3 * a * c - bb) / (3 * aa); + const q = (2 * bb * b - 9 * a * b * c + 27 * aa * d) / (27 * aa * a); + + if (Math.abs(p) < eps) { + return [Math.cbrt(-q) - ba3]; + } else if (Math.abs(q) < eps) { + return p < 0 ? + [ + -Math.sqrt(-p) - ba3, + -ba3, Math.sqrt(-p) - ba3 + ] : + [-ba3]; + } else { + const denom = q * q / 4 + p * p * p / 27; + if (Math.abs(denom) < eps) { + return [-1.5 * q / p - ba3, 3 * q / p - ba3]; + } else if (denom > 0) { + const u = Math.cbrt(-q / 2 - Math.sqrt(denom)); + return [u - p / (3 * u) - ba3]; + } else { + const u = 2 * Math.sqrt(-p / 3), + t = Math.acos(3 * q / p / u) / 3, + k = 2 * Math.PI / 3; + return [ + u * Math.cos(t) - ba3, + u * Math.cos(t - k) - ba3, + u * Math.cos(t - 2 * k) - ba3 + ]; + } + } +} diff --git a/packages/math/src/step.ts b/packages/math/src/step.ts new file mode 100644 index 0000000000..292c302df2 --- /dev/null +++ b/packages/math/src/step.ts @@ -0,0 +1,51 @@ +import { clamp01 } from "./interval"; + +/** + * Step/threshold function. + * + * @param edge threshold + * @param x test value + * @returns 0, if `x < e`, else 1 + */ +export const step = (edge: number, x: number) => + x < edge ? 0 : 1; + +/** + * GLSL-style smoothStep threshold function. + * + * @param edge lower threshold + * @param edge2 upper threshold + * @param x test value + * @returns 0, if `x < edge1`, 1 if `x > edge2`, else sigmoid interpolation + */ +export const smoothStep = (edge: number, edge2: number, x: number) => { + x = clamp01((x - edge) / (edge2 - edge)); + return (3 - 2 * x) * x * x; +}; + +/** + * Similar to `smoothStep()` but using different polynomial. + * + * @param edge + * @param edge2 + * @param x + */ +export const smootherStep = (edge: number, edge2: number, x: number) => { + x = clamp01((x - edge) / (edge2 - edge)); + return x * x * x * (x * (x * 6 - 15) + 10); +}; + +/** + * Exponential ramp with variable shape, e.g. + * + * - S-curve: k=8, n=4 + * - Step near 1.0: k=8, n=20 + * - Pulse: k=0.005, n=-10 + * - Ease-in: k=0.5, n=0.25 + * + * @param k + * @param n + * @param x + */ +export const expStep = (k: number, n: number, x: number) => + 1 - Math.exp(-k * Math.pow(x, n)); diff --git a/packages/math/test/index.ts b/packages/math/test/index.ts new file mode 100644 index 0000000000..91beafe41b --- /dev/null +++ b/packages/math/test/index.ts @@ -0,0 +1,6 @@ +// import * as assert from "assert"; +// import * as m from "../src/index"; + +describe("math", () => { + it("tests pending"); +}); diff --git a/packages/math/test/tsconfig.json b/packages/math/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/math/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/math/tsconfig.json b/packages/math/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/math/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 889730f87ccf330152aa85b66fa753562d2335cf Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 17:22:29 +0100 Subject: [PATCH 63/77] feat(dsp): add oscillators as @thi.ng/dsp package (from synstack / VEX) --- packages/dsp/.npmignore | 10 ++ packages/dsp/LICENSE | 201 ++++++++++++++++++++++++++++++++ packages/dsp/README.md | 79 +++++++++++++ packages/dsp/package.json | 46 ++++++++ packages/dsp/src/api.ts | 1 + packages/dsp/src/index.ts | 3 + packages/dsp/src/osc.ts | 157 +++++++++++++++++++++++++ packages/dsp/test/index.ts | 6 + packages/dsp/test/tsconfig.json | 10 ++ packages/dsp/tsconfig.json | 9 ++ 10 files changed, 522 insertions(+) create mode 100644 packages/dsp/.npmignore create mode 100644 packages/dsp/LICENSE create mode 100644 packages/dsp/README.md create mode 100644 packages/dsp/package.json create mode 100644 packages/dsp/src/api.ts create mode 100644 packages/dsp/src/index.ts create mode 100644 packages/dsp/src/osc.ts create mode 100644 packages/dsp/test/index.ts create mode 100644 packages/dsp/test/tsconfig.json create mode 100644 packages/dsp/tsconfig.json diff --git a/packages/dsp/.npmignore b/packages/dsp/.npmignore new file mode 100644 index 0000000000..d703bda97a --- /dev/null +++ b/packages/dsp/.npmignore @@ -0,0 +1,10 @@ +build +coverage +dev +doc +src* +test +.nyc_output +tsconfig.json +*.tgz +*.html diff --git a/packages/dsp/LICENSE b/packages/dsp/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/dsp/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/dsp/README.md b/packages/dsp/README.md new file mode 100644 index 0000000000..efb553fcda --- /dev/null +++ b/packages/dsp/README.md @@ -0,0 +1,79 @@ +# @thi.ng/dsp + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/dsp.svg)](https://www.npmjs.com/package/@thi.ng/dsp) +![npm downloads](https://img.shields.io/npm/dm/@thi.ng/dsp.svg) +[![Twitter Follow](https://img.shields.io/twitter/follow/thing_umbrella.svg?style=flat-square&label=twitter)](https://twitter.com/thing_umbrella) + +This project is part of the +[@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo. + + + +- [About](#about) +- [Status](#status) +- [Installation](#installation) +- [Dependencies](#dependencies) +- [Usage examples](#usage-examples) +- [Authors](#authors) +- [License](#license) + + + +## About + +Assorted DSP utils collected & ported from other thi.ng projects (e.g. +[thi.ng/synstack](https://github.com/thi-ng/synstack)). Currently only +features various [stateless & stateful wave generators / +oscillators](https://github.com/thi-ng/umbrella/tree/master/packages/dsp/src/osc.ts), +which have been ported from thi.ng/vexed-generation. + +## Status + +ALPHA / WIP + +## Installation + +```bash +yarn add @thi.ng/dsp +``` + +## Dependencies + +- [@thi.ng/math](https://github.com/thi-ng/umbrella/tree/master/packages/math) + +## Usage examples + +```ts +import * as dsp from "@thi.ng/dsp"; +import { take } from "@thi.ng/transducers"; + +[...take(20, new dsp.Oscillator(dsp.mix(dsp.sin,dsp.rect), 1/20)] +// [ 0.5, +// 0.6545084971874737, +// 0.7938926261462366, +// 0.9045084971874737, +// 0.9755282581475768, +// 1, +// 0.9755282581475768, +// 0.9045084971874737, +// 0.7938926261462367, +// 0.654508497187474, +// 0.5000000000000003, +// -0.6545084971874735, +// -0.7938926261462365, +// -0.9045084971874737, +// -0.9755282581475768, +// -1, +// -0.9755282581475766, +// -0.9045084971874735, +// -0.793892626146236, +// -0.6545084971874731 ] +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/dsp/package.json b/packages/dsp/package.json new file mode 100644 index 0000000000..6238db4bde --- /dev/null +++ b/packages/dsp/package.json @@ -0,0 +1,46 @@ +{ + "name": "@thi.ng/dsp", + "version": "0.0.1", + "description": "Assorted DSP utils, oscillators etc.", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thi-ng/umbrella.git" + }, + "homepage": "https://github.com/thi-ng/umbrella/tree/master/packages/dsp", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc", + "cover": "yarn test && nyc report --reporter=lcov", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^5.2.5", + "@types/node": "^10.5.5", + "mocha": "^5.2.0", + "nyc": "^12.0.2", + "typedoc": "^0.11.1", + "typescript": "^3.0.1" + }, + "dependencies": { + "@thi.ng/math": "^0.0.1" + }, + "keywords": [ + "DSP", + "ES6", + "generator", + "math", + "oscillator", + "stateless", + "typescript", + "waveform" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/dsp/src/api.ts b/packages/dsp/src/api.ts new file mode 100644 index 0000000000..99bd50b70f --- /dev/null +++ b/packages/dsp/src/api.ts @@ -0,0 +1 @@ +export type StatelessOscillator = (phase: number, freq: number, amp?: number, dc?: number, opts?: any) => number; diff --git a/packages/dsp/src/index.ts b/packages/dsp/src/index.ts new file mode 100644 index 0000000000..fa97ae53fe --- /dev/null +++ b/packages/dsp/src/index.ts @@ -0,0 +1,3 @@ +export * from "./api"; + +export * from "./osc"; diff --git a/packages/dsp/src/osc.ts b/packages/dsp/src/osc.ts new file mode 100644 index 0000000000..ce932921eb --- /dev/null +++ b/packages/dsp/src/osc.ts @@ -0,0 +1,157 @@ +import { HALF_PI, TAU } from "@thi.ng/math/api"; +import { mix as _mix } from "@thi.ng/math/mix"; +import { wrap01 } from "@thi.ng/math/interval"; +import { fract } from "@thi.ng/math/prec"; +import { StatelessOscillator } from "./api"; + +export class Oscillator implements + Iterable { + + osc: StatelessOscillator; + phase: number; + freq: number; + amp: number; + dc: number; + opt: any; + + constructor(osc: StatelessOscillator, freq: number, amp = 1, dc = 0, opt?: any) { + this.osc = osc; + this.phase = 0; + this.freq = freq; + this.amp = amp; + this.dc = dc; + this.opt = opt; + } + + *[Symbol.iterator]() { + while (true) { + yield this.update(); + } + } + + update() { + const y = this.osc(this.phase, 1, this.amp, this.dc, this.opt); + this.phase = wrap01(this.phase + this.freq); + return y; + } +} + +export class AMFMOscillator extends Oscillator { + + osc: StatelessOscillator; + am: Oscillator; + fm: Oscillator; + + constructor( + osc: StatelessOscillator, + amod: Oscillator, + fmod: Oscillator, + freq: number, + amp = 1, + dc = 0, + opt?: any + ) { + super(osc, freq, amp, dc, opt); + this.am = amod; + this.fm = fmod; + } + + update() { + const y = this.osc( + this.phase, + 1, + this.am ? this.amp + this.am.update() : this.amp, + this.dc, + this.opt + ); + this.phase = wrap01(this.phase + this.freq + (this.fm ? this.fm.update() : 0)); + return y; + } +} + +export const sin = (phase: number, freq: number, amp = 1, dc = 0) => + dc + amp * Math.sin(phase * freq * TAU); + +export const tri = (phase: number, freq: number, amp = 1, dc = 0) => + dc + amp * (Math.abs((phase * freq * 4) % 4 - 2) - 1); + +export const triConcave = (phase: number, freq: number, amp = 1, dc = 0) => + dc + amp * (8 * Math.pow(fract(phase * freq) - 0.5, 2) - 1); + +export const rect = (phase: number, freq: number, amp = 1, dc = 0, duty = 0.5) => + dc + amp * (fract(phase * freq) < duty ? 1 : -1); + +export const saw = (phase: number, freq: number, amp = 1, dc = 0) => + dc + amp * (1 - 2 * fract(phase * freq)); + +export const wavetable = (table: number[]): StatelessOscillator => { + const n = table.length; + return (phase: number, freq: number, amp = 1, dc = 0) => { + const i = Math.round(phase * freq * n) % n; + return dc + amp * table[i < 0 ? i + n : i]; + }; +}; + +export const mix = (osc1: StatelessOscillator, osc2: StatelessOscillator): StatelessOscillator => + (phase: number, freq: number, amp = 1, dc = 0, t = 0.5) => + _mix(osc1(phase, freq, amp, dc), osc2(phase, freq, amp, dc), t); + +export const additive = ( + osc: StatelessOscillator, + freqFn: (i: number) => number, + ampFn: (i: number) => number, n: number) => + + (phase: number, freq: number, amp = 1, dc = 0) => { + let y = 0; + for (let i = 1; i <= n; i++) { + y += osc(phase, freq * freqFn(i), amp * ampFn(i)); + } + return dc + y; + }; + +/** + * Interactive graph of this oscillator: + * https://www.desmos.com/calculator/irugw6gnhy + * + * @param n + */ +export const squareAdditive = (n = 8) => + additive(sin, (i) => 2 * (i - 1) + 1, (i) => 1 / (2 * (i - 1) + 1) * gibbs(n, i), n); + +/** + * Interactive graph of this oscillator: + * https://www.desmos.com/calculator/irugw6gnhy + * + * @param n + */ +export const sawAdditive = (n = 8) => + additive(sin, (i) => i, (i) => 1 / i * gibbs(n, i), n); + +/** + * https://en.wikipedia.org/wiki/Gibbs_phenomenon + * http://www.musicdsp.org/files/bandlimited.pdf + * + * Interactive graph: + * https://www.desmos.com/calculator/irugw6gnhy + * + * @param n + * @param i + */ +export const gibbs = (n: number, i: number) => + Math.pow(Math.cos((i - 1) * HALF_PI / n), 2); + +/** + * Polynomial attenuation to create bandlimited version of a signal. + * + * - http://research.spa.aalto.fi/publications/papers/smc2010-phaseshaping/ + * - http://www.kvraudio.com/forum/viewtopic.php?t=375517 + * + * @param eps + * @param x + */ +export const polyBLEP = (eps: number, x: number) => + x < eps ? + (x /= eps, x + x - x * x - 1) : + x > 1 - eps ? + (x = (x - 1) / eps, x * x + x + x + 1) : + 0; diff --git a/packages/dsp/test/index.ts b/packages/dsp/test/index.ts new file mode 100644 index 0000000000..fcc7940253 --- /dev/null +++ b/packages/dsp/test/index.ts @@ -0,0 +1,6 @@ +// import * as assert from "assert"; +// import * as dsp from "../src/index"; + +describe("dsp", () => { + it("tests pending"); +}); diff --git a/packages/dsp/test/tsconfig.json b/packages/dsp/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/dsp/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/dsp/tsconfig.json b/packages/dsp/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/dsp/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 458d4a073fd2eea721f963729ab4fa3c6f806a37 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 23:09:30 +0100 Subject: [PATCH 64/77] feat(binary): add @thi.ng/binary package --- packages/binary/.npmignore | 10 ++ packages/binary/LICENSE | 201 +++++++++++++++++++++++++++++ packages/binary/README.md | 47 +++++++ packages/binary/package.json | 47 +++++++ packages/binary/src/align.ts | 17 +++ packages/binary/src/api.ts | 28 ++++ packages/binary/src/count.ts | 43 ++++++ packages/binary/src/edit.ts | 37 ++++++ packages/binary/src/float.ts | 30 +++++ packages/binary/src/gray.ts | 25 ++++ packages/binary/src/index.ts | 12 ++ packages/binary/src/logic.ts | 43 ++++++ packages/binary/src/mask.ts | 34 +++++ packages/binary/src/pow.ts | 24 ++++ packages/binary/src/rotate.ts | 19 +++ packages/binary/src/splat.ts | 55 ++++++++ packages/binary/src/swizzle.ts | 91 +++++++++++++ packages/binary/test/index.ts | 6 + packages/binary/test/tsconfig.json | 10 ++ packages/binary/tsconfig.json | 9 ++ 20 files changed, 788 insertions(+) create mode 100644 packages/binary/.npmignore create mode 100644 packages/binary/LICENSE create mode 100644 packages/binary/README.md create mode 100644 packages/binary/package.json create mode 100644 packages/binary/src/align.ts create mode 100644 packages/binary/src/api.ts create mode 100644 packages/binary/src/count.ts create mode 100644 packages/binary/src/edit.ts create mode 100644 packages/binary/src/float.ts create mode 100644 packages/binary/src/gray.ts create mode 100644 packages/binary/src/index.ts create mode 100644 packages/binary/src/logic.ts create mode 100644 packages/binary/src/mask.ts create mode 100644 packages/binary/src/pow.ts create mode 100644 packages/binary/src/rotate.ts create mode 100644 packages/binary/src/splat.ts create mode 100644 packages/binary/src/swizzle.ts create mode 100644 packages/binary/test/index.ts create mode 100644 packages/binary/test/tsconfig.json create mode 100644 packages/binary/tsconfig.json diff --git a/packages/binary/.npmignore b/packages/binary/.npmignore new file mode 100644 index 0000000000..d703bda97a --- /dev/null +++ b/packages/binary/.npmignore @@ -0,0 +1,10 @@ +build +coverage +dev +doc +src* +test +.nyc_output +tsconfig.json +*.tgz +*.html diff --git a/packages/binary/LICENSE b/packages/binary/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/binary/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/binary/README.md b/packages/binary/README.md new file mode 100644 index 0000000000..e5ea94fe48 --- /dev/null +++ b/packages/binary/README.md @@ -0,0 +1,47 @@ +# @thi.ng/binary + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/binary.svg)](https://www.npmjs.com/package/@thi.ng/binary) +![npm downloads](https://img.shields.io/npm/dm/@thi.ng/binary.svg) +[![Twitter Follow](https://img.shields.io/twitter/follow/thing_umbrella.svg?style=flat-square&label=twitter)](https://twitter.com/thing_umbrella) + +This project is part of the +[@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo. + + + +- [About](#about) +- [Installation](#installation) +- [Dependencies](#dependencies) +- [Usage examples](#usage-examples) +- [Authors](#authors) +- [License](#license) + + + +## About + +Collection of 50+ binary / bitwise operations, conversions, utilities. + +## Installation + +```bash +yarn add @thi.ng/binary +``` + +## Dependencies + +None. + +## Usage examples + +```ts +import * as b from "@thi.ng/binary"; +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/binary/package.json b/packages/binary/package.json new file mode 100644 index 0000000000..63a9081ffe --- /dev/null +++ b/packages/binary/package.json @@ -0,0 +1,47 @@ +{ + "name": "@thi.ng/binary", + "version": "0.0.1", + "description": "Assorted binary / bitwise operations, conversions, utilities.", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thi-ng/umbrella.git" + }, + "homepage": "https://github.com/thi-ng/umbrella/tree/master/packages/binary", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc", + "cover": "yarn test && nyc report --reporter=lcov", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^5.2.5", + "@types/node": "^10.5.5", + "mocha": "^5.2.0", + "nyc": "^12.0.2", + "typedoc": "^0.11.1", + "typescript": "^3.0.1" + }, + "dependencies": {}, + "keywords": [ + "alignment", + "binary", + "bitwise", + "conversion", + "ES6", + "gray code", + "logic", + "math", + "splat", + "swizzle", + "typescript" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/binary/src/align.ts b/packages/binary/src/align.ts new file mode 100644 index 0000000000..244e13c848 --- /dev/null +++ b/packages/binary/src/align.ts @@ -0,0 +1,17 @@ +import { Pow2 } from "./api"; + +/** + * Aligns `addr` to next multiple of `size`. The latter must be a power + * of 2. + * + * @param addr + * @param size + */ +export const align = (addr: number, size: Pow2) => + (size-- , (addr + size) & ~size); + +/** + * Returns true if `addr` is aligned to wordsize `size`. + */ +export const isAligned = (addr: number, size: Pow2) => + !(addr & (size - 1)); diff --git a/packages/binary/src/api.ts b/packages/binary/src/api.ts new file mode 100644 index 0000000000..c1ced3c2b3 --- /dev/null +++ b/packages/binary/src/api.ts @@ -0,0 +1,28 @@ +export type Lane8 = + 0 | 1 | 2 | 3; + +export type Lane4 = + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7; + +export type Lane2 = + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | + 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15; + +export type Bit = + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | + 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | + 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | + 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31; + +export type Pow2 = + 0x1 | 0x2 | 0x4 | 0x8 | + 0x10 | 0x20 | 0x40 | 0x80 | + 0x100 | 0x200 | 0x400 | 0x800 | + 0x1000 | 0x2000 | 0x4000 | 0x8000 | + 0x10000 | 0x20000 | 0x40000 | 0x80000 | + 0x100000 | 0x200000 | 0x400000 | 0x800000 | + 0x1000000 | 0x2000000 | 0x4000000 | 0x8000000 | + 0x10000000 | 0x20000000 | 0x40000000 | 0x80000000; + +export const MASKS = + new Array(33).fill(0).map((_, i) => Math.pow(2, i) - 1); diff --git a/packages/binary/src/count.ts b/packages/binary/src/count.ts new file mode 100644 index 0000000000..518ff022a1 --- /dev/null +++ b/packages/binary/src/count.ts @@ -0,0 +1,43 @@ +/** + * Returns number of 1 bits in `x`. + * + * @param x + */ +export const popCount = (x: number) => ( + x = x - ((x >>> 1) & 0x55555555), + x = (x & 0x33333333) + ((x >>> 2) & 0x33333333), + ((x + (x >>> 4) & 0xf0f0f0f) * 0x1010101) >>> 24 +); + +/** + * https://en.wikipedia.org/wiki/Hamming_distance + * + * @param x + * @param y + */ +export const hammingDist = (x: number, y: number) => + popCount(x ^ y); + +/** + * Math.clz32() polyfill (corrected). + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32$revision/1426816 + * + * @param x + */ +export const clz32 = (x: number) => + x !== 0 ? + 31 - ((Math.log(x >>> 0) / Math.LN2) | 0) : + 32; + +export const ctz32 = (x: number) => { + let c = 32; + x &= -x; + x && (c--); + (x & 0x0000ffff) && (c -= 16); + (x & 0x00ff00ff) && (c -= 8); + (x & 0x0f0f0f0f) && (c -= 4); + (x & 0x33333333) && (c -= 2); + (x & 0x55555555) && (c -= 1); + return c; +}; diff --git a/packages/binary/src/edit.ts b/packages/binary/src/edit.ts new file mode 100644 index 0000000000..733af78138 --- /dev/null +++ b/packages/binary/src/edit.ts @@ -0,0 +1,37 @@ +import { Bit } from "./api"; +import { defMask } from "./mask"; + +/** + * Clears bit in given uint `x`. + * + * @param x value + * @param bit bit number (0..31) + */ +export const bitClear = (x: number, bit: Bit) => + (x & ~(1 << bit)) >>> 0; + +/** + * Toggles bit in given uint `x`. + * + * @param x + * @param bit + */ +export const bitFlip = (x: number, bit: Bit) => + (x ^ (1 << bit)) >>> 0; + +/** + * Sets bit in given uint `x`. + * + * @param x value + * @param bit bit number (0..31) + */ +export const bitSet = (x: number, bit: Bit) => + (x | (1 << bit)) >>> 0; + +export const bitSetWindow = (x: number, y: number, from: number, to: number) => { + const m = defMask(from, to); + return (x & ~m) | ((y << (1 << from)) & m); +}; + +export const bitClearWindow = (x: number, from: number, to: number) => + (x & ~defMask(from, to)); diff --git a/packages/binary/src/float.ts b/packages/binary/src/float.ts new file mode 100644 index 0000000000..f6a204a7c2 --- /dev/null +++ b/packages/binary/src/float.ts @@ -0,0 +1,30 @@ +const F32 = new Float32Array(1); +const I32 = new Int32Array(F32.buffer); +const U32 = new Uint32Array(F32.buffer); + +export const floatToIntBits = (x: number) => + (F32[0] = x, I32[0]); + +export const floatToUintBits = (x: number) => + (F32[0] = x, U32[0]); + +export const intBitsToFloat = (x: number) => + (I32[0] = x, F32[0]); + +export const uintBitsToFloat = (x: number) => + (U32[0] = x, F32[0]); + +/** + * Converts given float into a sortable integer representation, using + * raw bitwise conversion via `floatToIntBits()`. + * + * https://github.com/tzaeschke/phtree/blob/master/PhTreeRevisited.pdf + * (page 3) + * + * @param x + */ +export const floatToSortableInt = (x: number) => { + if (x === -0) x = 0; + const i = floatToIntBits(x); + return x < 0 ? (~i) | (1 << 31) : i; +}; diff --git a/packages/binary/src/gray.ts b/packages/binary/src/gray.ts new file mode 100644 index 0000000000..abd891d4a4 --- /dev/null +++ b/packages/binary/src/gray.ts @@ -0,0 +1,25 @@ +/** + * Converts 32bit unsigned int to Gray code (reflected binary). Gray + * codes of successive values always have a Hamming distance of 1 (i.e. + * only 1 bit changes at a time). + * + * https://en.wikipedia.org/wiki/Gray_code + * + * @param x u32 + */ +export const encodeGray32 = (x: number) => + (x ^ (x >>> 1)) >>> 0; + +/** + * Converts 32bit Gray code to binary / unsigned int. + * + * https://en.wikipedia.org/wiki/Gray_code + */ +export const decodeGray32 = (x: number) => { + x = x ^ (x >>> 16); + x = x ^ (x >>> 8); + x = x ^ (x >>> 4); + x = x ^ (x >>> 2); + x = x ^ (x >>> 1); + return x >>> 0; +}; diff --git a/packages/binary/src/index.ts b/packages/binary/src/index.ts new file mode 100644 index 0000000000..06b4af8f41 --- /dev/null +++ b/packages/binary/src/index.ts @@ -0,0 +1,12 @@ +export * from "./api"; +export * from "./align"; +export * from "./count"; +export * from "./edit"; +export * from "./float"; +export * from "./gray"; +export * from "./logic"; +export * from "./mask"; +export * from "./pow"; +export * from "./rotate"; +export * from "./splat"; +export * from "./swizzle"; diff --git a/packages/binary/src/logic.ts b/packages/binary/src/logic.ts new file mode 100644 index 0000000000..4e9e03ee0e --- /dev/null +++ b/packages/binary/src/logic.ts @@ -0,0 +1,43 @@ +import { maskL } from "./mask"; + +export const bitNot = (n: number, x: number) => + maskL(n, ~x); + +export const bitAnd = (n: number, a: number, b: number) => + maskL(n, a & b); + +export const bitNand = (n: number, a: number, b: number) => + maskL(n, ~(a & b)); + +export const bitOr = (n: number, a: number, b: number) => + maskL(n, a | b); + +export const bitNor = (n: number, a: number, b: number) => + maskL(n, ~(a & b)); + +export const bitXor = (n: number, a: number, b: number) => + maskL(n, a ^ b); + +export const bitXnor = (n: number, a: number, b: number) => + maskL(n, ~(a ^ b)); + +export const bitImply = (n: number, a: number, b: number) => + maskL(n, (~a) | b); + +export const bitAoi21 = (n: number, a: number, b: number, c: number) => + maskL(n, ~(a | (b & c))); + +export const bitOai21 = (n: number, a: number, b: number, c: number) => + maskL(n, ~(a & (b | c))); + +export const bitAoi22 = (n: number, a: number, b: number, c: number, d: number) => + maskL(n, ~((a & b) | (c & d))); + +export const bitOai22 = (n: number, a: number, b: number, c: number, d: number) => + maskL(n, ~((a | b) & (c | d))); + +export const bitMux = (n: number, a: number, b: number, s: number) => + maskL(n, (a & ~s) | (b & s)); + +export const bitDemux = (n: number, a: number, b: number, s: number): [number, number] => + [maskL(n, a & ~s), maskL(n, b & s)]; diff --git a/packages/binary/src/mask.ts b/packages/binary/src/mask.ts new file mode 100644 index 0000000000..a929ea38af --- /dev/null +++ b/packages/binary/src/mask.ts @@ -0,0 +1,34 @@ +import { MASKS } from "./api"; + +/** + * Creates bit mask by enabling bit `a` to bit `b-1`, both in range + * 0-32. `b` MUST be >= `a`. + * + * ``` + * defMask(1,31).toString(16) // 7ffffffe + * defMask(3,8).toString(16) // f8 + * ``` + * + * @param a + * @param b + */ +export const defMask = (a: number, b: number) => + ((~MASKS[a]) & MASKS[b]) >>> 0; + +/** + * Returns unsigned version of `x` with only lowest `n` bits. + * + * @param n + * @param x + */ +export const maskL = (n: number, x: number) => + (x & MASKS[n]) >>> 0; + +/** + * Returns unsigned version of `x` with only highest `n` bits. + * + * @param n + * @param x + */ +export const maskH = (n: number, x: number) => + (x & ~MASKS[n]) >>> 0; diff --git a/packages/binary/src/pow.ts b/packages/binary/src/pow.ts new file mode 100644 index 0000000000..e69be6503d --- /dev/null +++ b/packages/binary/src/pow.ts @@ -0,0 +1,24 @@ +// http://graphics.stanford.edu/~seander/bithacks.html + +export const isPow2 = (x: number) => + (!!x) && !(x & (x - 1)); + +export const ceilPow2 = (x: number) => { + x += (x === 0); + --x; + x |= x >>> 1; + x |= x >>> 2; + x |= x >>> 4; + x |= x >>> 8; + x |= x >>> 16; + return x + 1; +}; + +export const floorPow2 = (x: number) => { + x |= x >>> 1; + x |= x >>> 2; + x |= x >>> 4; + x |= x >>> 8; + x |= x >>> 16; + return x - (x >>> 1); +}; diff --git a/packages/binary/src/rotate.ts b/packages/binary/src/rotate.ts new file mode 100644 index 0000000000..61bab66df9 --- /dev/null +++ b/packages/binary/src/rotate.ts @@ -0,0 +1,19 @@ +import { Bit } from "./api"; + +/** + * Rotates `x` `n` bits to the left. + * + * @param x + * @param n + */ +export const rotateLeft = (x: number, n: Bit) => + ((x << n) | (x >>> (32 - n))) >>> 0; + +/** + * Rotates `x` `n` bits to the right. + * + * @param x + * @param n + */ +export const rotateRight = (x: number, n: Bit) => + ((x >>> n) | (x << (32 - n))) >>> 0; diff --git a/packages/binary/src/splat.ts b/packages/binary/src/splat.ts new file mode 100644 index 0000000000..175e6c6dbc --- /dev/null +++ b/packages/binary/src/splat.ts @@ -0,0 +1,55 @@ +/** + * Repeats lowest nibble of `x` as 24 bit uint. + * + * @param x + */ +export const splat4_24 = (x: number) => + (x &= 0xf, splat8_24(x | x << 4)); + +/** + * Repeats lowest nibble of `x` as 32 bit uint. + * + * @param x + */ +export const splat4_32 = (x: number) => + (x &= 0xf, splat8_32(x | x << 4)); + +/** + * Repeats lowest byte of `x` as 24 bit uint. + * + * @param x + */ +export const splat8_24 = (x: number) => + (x & 0xff) * 0x010101; + +/** + * Repeats lowest byte of `x` as 32 bit uint. + * + * @param x + */ +export const splat8_32 = (x: number) => + ((x & 0xff) * 0x01010101) >>> 0; + +/** + * Repeats lowest 16bit of `x` as 32 bit uint. + * + * @param x + */ +export const splat16_32 = (x: number) => + (x &= 0xffff, ((x << 16) | x) >>> 0); + +/** + * Returns true if bits 0-3 are same as bits 4-7. + * + * @param x + */ +export const same4 = (x: number) => + (x >> 4 & 0xf) === (x & 0xf); + +/** + * Returns true if bits 0-7 are same as bits 8-15. + * + * @param x + */ +export const same8 = (x: number) => + (x >> 8 & 0xff) === (x & 0xff); diff --git a/packages/binary/src/swizzle.ts b/packages/binary/src/swizzle.ts new file mode 100644 index 0000000000..cb83e5eec0 --- /dev/null +++ b/packages/binary/src/swizzle.ts @@ -0,0 +1,91 @@ +import { Lane2, Lane4, Lane8 } from "./api"; + +/** + * Extracts 8-bit lane from given 32bit uint. + * + * - Lane #0: bits 24-31 + * - Lane #1: bits 16-23 + * - Lane #2: bits 8-15 + * - Lane #3: bits 0-7 + * + * @param x + * @param l + */ +export const lane8 = (x: number, l: Lane8) => + (x >>> ((3 - l) << 3)) & 0xff; + +/** + * Extracts 4-bit lane from given 32bit uint. + * + * - Lane #0: bits 28-31 + * - Lane #1: bits 24-27 + * - Lane #2: bits 20-23 + * - Lane #3: bits 16-19 + * - Lane #4: bits 12-15 + * - Lane #5: bits 8-11 + * - Lane #6: bits 4-7 + * - Lane #7: bits 0-3 + * + * @param x + * @param l + */ +export const lane4 = (x: number, l: Lane4) => + (x >>> ((7 - l) << 2)) & 0xf; + +export const lane2 = (x: number, l: Lane2) => + (x >>> ((15 - l) << 1)) & 0x3; + +/** + * Re-orders byte lanes in given order (MSB). + * + * ``` + * swizzle(0x12345678, 3, 2, 1, 0) // 0x78563412 + * swizzle(0x12345678, 1, 0, 3, 2) // 0x34127856 + * swizzle(0x12345678, 2, 2, 0, 0) // 0x56561212 + * ``` + * + * @param x + * @param a + * @param b + * @param c + * @param d + */ +export const swizzle8 = (x: number, a: Lane8, b: Lane8, c: Lane8, d: Lane8) => + ( + lane8(x, a) << 24 | + lane8(x, b) << 16 | + lane8(x, c) << 8 | + lane8(x, d) + ) >>> 0; + +/** + * + * @param x + * @param a + * @param b + * @param c + * @param d + * @param e + * @param f + * @param g + * @param h + */ +export const swizzle4 = (x: number, a: Lane4, b: Lane4, c: Lane4, d: Lane4, e: Lane4, f: Lane4, g: Lane4, h: Lane4) => + ( + lane4(x, a) << 28 | + lane4(x, b) << 24 | + lane4(x, c) << 20 | + lane4(x, d) << 16 | + lane4(x, e) << 12 | + lane4(x, f) << 8 | + lane4(x, g) << 4 | + lane4(x, h) + ) >>> 0; + +/** + * Same as `swizzle8(x, 3, 2, 1, 0)`, but faster. + * + * @param x + */ +export const flipBytes = (x: number) => + ((x >>> 24) | (x >> 8 & 0xff00) | (x & 0xff00) << 8 | x << 24) >>> 0; diff --git a/packages/binary/test/index.ts b/packages/binary/test/index.ts new file mode 100644 index 0000000000..9d0e8ad0f9 --- /dev/null +++ b/packages/binary/test/index.ts @@ -0,0 +1,6 @@ +// import * as assert from "assert"; +// import * as b from "../src/index"; + +describe("binary", () => { + it("tests pending"); +}); diff --git a/packages/binary/test/tsconfig.json b/packages/binary/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/binary/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/binary/tsconfig.json b/packages/binary/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/binary/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 405cf51ac083995ab5342bf36de19e2f7b9be8cf Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 23:11:51 +0100 Subject: [PATCH 65/77] feat(dlogic): add @thi.ng/dlogic package --- packages/dlogic/.npmignore | 10 + packages/dlogic/LICENSE | 201 ++++++++++++++++++++ packages/dlogic/README.md | 74 ++++++++ packages/dlogic/package.json | 44 +++++ packages/dlogic/src/index.ts | 286 +++++++++++++++++++++++++++++ packages/dlogic/test/index.ts | 6 + packages/dlogic/test/tsconfig.json | 10 + packages/dlogic/tsconfig.json | 9 + 8 files changed, 640 insertions(+) create mode 100644 packages/dlogic/.npmignore create mode 100644 packages/dlogic/LICENSE create mode 100644 packages/dlogic/README.md create mode 100644 packages/dlogic/package.json create mode 100644 packages/dlogic/src/index.ts create mode 100644 packages/dlogic/test/index.ts create mode 100644 packages/dlogic/test/tsconfig.json create mode 100644 packages/dlogic/tsconfig.json diff --git a/packages/dlogic/.npmignore b/packages/dlogic/.npmignore new file mode 100644 index 0000000000..d703bda97a --- /dev/null +++ b/packages/dlogic/.npmignore @@ -0,0 +1,10 @@ +build +coverage +dev +doc +src* +test +.nyc_output +tsconfig.json +*.tgz +*.html diff --git a/packages/dlogic/LICENSE b/packages/dlogic/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/dlogic/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/dlogic/README.md b/packages/dlogic/README.md new file mode 100644 index 0000000000..5b505d6d78 --- /dev/null +++ b/packages/dlogic/README.md @@ -0,0 +1,74 @@ +# @thi.ng/dlogic + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/dlogic.svg)](https://www.npmjs.com/package/@thi.ng/dlogic) +![npm downloads](https://img.shields.io/npm/dm/@thi.ng/dlogic.svg) +[![Twitter Follow](https://img.shields.io/twitter/follow/thing_umbrella.svg?style=flat-square&label=twitter)](https://twitter.com/thing_umbrella) + +This project is part of the +[@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo. + + + +- [About](#about) +- [Status](#status) +- [Installation](#installation) +- [Dependencies](#dependencies) +- [Usage examples](#usage-examples) +- [Authors](#authors) +- [License](#license) + + + +## About + +Assorted digital logic gates and ops for boolean values to compose +complex logic in a more functional manner, e.g. for DSL or simulation +purposes. Truth tables and references are provided in the doc strings of +each function. + +Also see +[@thi.ng/binary](https://github.com/thi-ng/umbrella/tree/master/packages/binary/src/logic.ts) +for binary versions of most of the ops provided by this package. + +## Status + +ALPHA + +## Installation + +```bash +yarn add @thi.ng/dlogic +``` + +## Dependencies + +None. + +## Usage examples + +```ts +import { nand } from "@thi.ng/dlogic"; + +// XOR construction only using NAND gates +const xor = (a: boolean, b: boolean) => { + const ab = nand(a,b); + return nand(nand(a, ab), nand(b, ab)); +}; + +xor(false, false) +// false +xor(false, true) +// true +xor(true, false) +// true +xor(true, true) +// false +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2017 - 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/dlogic/package.json b/packages/dlogic/package.json new file mode 100644 index 0000000000..1f88f53c0f --- /dev/null +++ b/packages/dlogic/package.json @@ -0,0 +1,44 @@ +{ + "name": "@thi.ng/dlogic", + "version": "0.0.1", + "description": "Assorted digital logic ops / constructs.", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thi-ng/umbrella.git" + }, + "homepage": "https://github.com/thi-ng/umbrella/tree/master/packages/logic", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc", + "cover": "yarn test && nyc report --reporter=lcov", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^5.2.5", + "@types/node": "^10.5.5", + "mocha": "^5.2.0", + "nyc": "^12.0.2", + "typedoc": "^0.11.1", + "typescript": "^3.0.1" + }, + "dependencies": {}, + "keywords": [ + "boolean", + "digital", + "ES6", + "functional", + "gates", + "logic", + "simulation", + "typescript" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/dlogic/src/index.ts b/packages/dlogic/src/index.ts new file mode 100644 index 0000000000..b8b09effc4 --- /dev/null +++ b/packages/dlogic/src/index.ts @@ -0,0 +1,286 @@ +export interface Sum { + s: T; + c: boolean; +} + + +/** + * https://en.wikipedia.org/wiki/Inverter_(logic_gate) + * + * | X | Q | + * |---|---| + * | 0 | 1 | + * | 1 | 0 | + * + * @param x + */ +export const not = (x: boolean) => !x; + +/** + * https://en.wikipedia.org/wiki/NAND_gate + * + * | A | B | Q | + * |---|---|---| + * | 0 | 0 | 1 | + * | 0 | 1 | 1 | + * | 1 | 0 | 1 | + * | 1 | 1 | 0 | + * + * @param a + * @param b + */ +export const nand = (a: boolean, b: boolean) => !(a && b); + +/** + * https://en.wikipedia.org/wiki/AND_gate + * + * | A | B | Q | + * |---|---|---| + * | 0 | 0 | 0 | + * | 0 | 1 | 0 | + * | 1 | 0 | 0 | + * | 1 | 1 | 1 | + * + * @param a + * @param b + */ +export const and = (a: boolean, b: boolean) => a && b; + +/** + * https://en.wikipedia.org/wiki/OR_gate + * + * | A | B | Q | + * |---|---|---| + * | 0 | 0 | 0 | + * | 0 | 1 | 1 | + * | 1 | 0 | 1 | + * | 1 | 1 | 1 | + * + * @param a + * @param b + */ +export const or = (a: boolean, b: boolean) => a || b; + +/** + * https://en.wikipedia.org/wiki/NOR_gate + * + * | A | B | Q | + * |---|---|---| + * | 0 | 0 | 1 | + * | 0 | 1 | 0 | + * | 1 | 0 | 0 | + * | 1 | 1 | 0 | + * + * @param a + * @param b + */ +export const nor = (a: boolean, b: boolean) => !(a || b); + +/** + * https://en.wikipedia.org/wiki/XOR_gate + * + * | A | B | Q | + * |---|---|---| + * | 0 | 0 | 0 | + * | 0 | 1 | 1 | + * | 1 | 0 | 1 | + * | 1 | 1 | 0 | + * + * @param a + * @param b + */ +export const xor = (a: boolean, b: boolean) => a !== b; + +/** + * https://en.wikipedia.org/wiki/XNOR_gate + * + * | A | B | Q | + * |---|---|---| + * | 0 | 0 | 1 | + * | 0 | 1 | 0 | + * | 1 | 0 | 0 | + * | 1 | 1 | 1 | + * + * @param a + * @param b + */ +export const xnor = (a: boolean, b: boolean) => a === b; + +/** + * https://web.archive.org/web/20160304050642/http://www.zigwap.com/digital/gates/imply_gate + * + * | A | B | Q | + * |---|---|---| + * | 0 | 0 | 1 | + * | 0 | 1 | 1 | + * | 1 | 0 | 0 | + * | 1 | 1 | 1 | + * @param a + * @param b + */ +export const imply = (a: boolean, b: boolean) => !a || b; + +/** + * https://en.wikipedia.org/wiki/AND-OR-Invert + * + * `q = nor(a, and(b, c))` + * + * | A | B | C | Q | + * |---|---|---|---| + * | 0 | 0 | 0 | 1 | + * | 0 | 0 | 1 | 1 | + * | 0 | 1 | 0 | 1 | + * | 0 | 1 | 1 | 0 | + * | 1 | 0 | 0 | 0 | + * | 1 | 0 | 1 | 0 | + * | 1 | 1 | 0 | 0 | + * | 1 | 1 | 1 | 0 | + * + * @param a + * @param b + * @param c + */ +export const aoi21 = (a: boolean, b: boolean, c: boolean) => + !(a || (b && c)); + +/** + * https://en.wikipedia.org/wiki/AND-OR-Invert + * + * `q = nor(and(a, b), and(c, d))` + * + * | A | B | C | D | Q | + * |---|---|---|---|---| + * | 0 | X | X | 0 | 1 | + * | X | 0 | X | 0 | 1 | + * | 0 | X | 0 | X | 1 | + * | X | 0 | 0 | X | 1 | + * | 1 | 1 | X | X | 0 | + * | X | X | 1 | 1 | 0 | + * + * @param a + * @param b + * @param c + */ +export const aoi22 = (a: boolean, b: boolean, c: boolean, d: boolean) => + !((a && b) || (c && d)); + +/** + * Complement logic of `aoi21`. + * + * `q = nand(a, or(b, c))` + * + * @param a + * @param b + * @param c + */ +export const oai21 = (a: boolean, b: boolean, c: boolean) => + !(a && (b || c)); + +/** + * Complement logic of `aoi22`. + * + * `q = nand(or(a, b), or(c, d))` + * + * @param a + * @param b + * @param c + * @param d + */ +export const oai22 = (a: boolean, b: boolean, c: boolean, d: boolean) => + !((a || b) && (c || d)); + +/** + * https://en.wikipedia.org/wiki/NAND_logic#MUX + * + * | A | B | S | Q | + * |---|---|---|---| + * | 0 | 0 | 0 | 0 | + * | 0 | 1 | 0 | 0 | + * | 1 | 0 | 0 | 1 | + * | 1 | 1 | 0 | 1 | + * | 0 | 0 | 1 | 0 | + * | 0 | 1 | 1 | 1 | + * | 1 | 0 | 1 | 0 | + * | 1 | 1 | 1 | 1 | + * + * @param a + * @param b + * @param s + */ +export const mux = (a: boolean, b: boolean, s: boolean) => + (a && !s) || (b && s); + +/** + * https://en.wikipedia.org/wiki/NAND_logic#DEMUX + * + * | I | S | A | B | + * |---|---|---|---| + * | 0 | 0 | 0 | 0 | + * | 1 | 0 | 1 | 0 | + * | 0 | 1 | 0 | 0 | + * | 1 | 1 | 0 | 1 | + * + * @param i + * @param s + */ +export const demux = (i: boolean, s: boolean): [boolean, boolean] => + [i && !s, i && s]; + +/** + * https://en.wikipedia.org/wiki/Adder_(electronics)#Half_adder + * + * @param a + * @param b + */ +export const hadd1 = (a: boolean, b: boolean): Sum => + ({ s: a !== b, c: a && b }); + +/** + * https://en.wikipedia.org/wiki/Adder_(electronics)#Full_adder + * + * @param a + * @param b + * @param c + */ +export const fadd1 = (a: boolean, b: boolean, c: boolean): Sum => + ({ + s: (a !== b) !== c, + c: ((a !== b) && c) || (a && b) + }); + +/** + * https://en.wikipedia.org/wiki/Adder_(electronics)#Ripple-carry_adder + * + * @param a + * @param b + * @param c + */ +export const rca = (a: boolean[], b: boolean[], c: boolean): Sum => { + const s: boolean[] = []; + for (let n = a.length, i = 0; i < n; i++) { + const r = fadd1(a[i], b[i], c); + s.push(r.s); + c = r.c; + } + return { s, c }; +}; + +/** + * HOF delay line generator. Returned function takes single boolean arg, + * buffers `n` values (ring buffer) and returns currently oldest. The + * first `n` results will always be `false`. + * + * @param n + */ +export const delay = (n: number) => { + const buf: boolean[] = new Array(n).fill(false); + let i = 0; + return n > 0 ? + (x: boolean) => { + const y = buf[i]; + buf[i++] = x; + i %= n; + return y; + } : + (x: boolean) => x; +}; diff --git a/packages/dlogic/test/index.ts b/packages/dlogic/test/index.ts new file mode 100644 index 0000000000..9739c69974 --- /dev/null +++ b/packages/dlogic/test/index.ts @@ -0,0 +1,6 @@ +// import * as assert from "assert"; +// import * as dl from "../src/index"; + +describe("dlogic", () => { + it("tests pending"); +}); diff --git a/packages/dlogic/test/tsconfig.json b/packages/dlogic/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/dlogic/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/dlogic/tsconfig.json b/packages/dlogic/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/dlogic/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 6851f2c47873274f6c1a794a90d849a0c24c88ac Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 23:13:20 +0100 Subject: [PATCH 66/77] feat(compose): add partial(), update readme --- packages/compose/README.md | 7 ++++--- packages/compose/src/index.ts | 1 + packages/compose/src/partial.ts | 35 +++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 packages/compose/src/partial.ts diff --git a/packages/compose/README.md b/packages/compose/README.md index accff7d6d9..f79e40b740 100644 --- a/packages/compose/README.md +++ b/packages/compose/README.md @@ -22,9 +22,10 @@ This project is part of the Functional composition helpers: -- [comp(...)](https://github.com/thi-ng/umbrella/tree/master/packages/compose/src/comp.ts) -- [compI(...)](https://github.com/thi-ng/umbrella/tree/master/packages/compose/src/comp.ts) -- [juxt(...)](https://github.com/thi-ng/umbrella/tree/master/packages/compose/src/juxt.ts) +- [comp()](https://github.com/thi-ng/umbrella/tree/master/packages/compose/src/comp.ts) +- [compI()](https://github.com/thi-ng/umbrella/tree/master/packages/compose/src/comp.ts) +- [juxt()](https://github.com/thi-ng/umbrella/tree/master/packages/compose/src/juxt.ts) +- [partial()](https://github.com/thi-ng/umbrella/tree/master/packages/compose/src/partial.ts) ## Installation diff --git a/packages/compose/src/index.ts b/packages/compose/src/index.ts index 99ae4c440f..ee645566d1 100644 --- a/packages/compose/src/index.ts +++ b/packages/compose/src/index.ts @@ -1,2 +1,3 @@ export * from "./comp"; export * from "./juxt"; +export * from "./partial"; diff --git a/packages/compose/src/partial.ts b/packages/compose/src/partial.ts new file mode 100644 index 0000000000..d8ba1c883d --- /dev/null +++ b/packages/compose/src/partial.ts @@ -0,0 +1,35 @@ +import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; + +export function partial(fn: (a: A, ...args: any[]) => T, a: A): (...args: any[]) => T; +export function partial(fn: (a: A, b: B, ...args: any[]) => T, a: A, b: B): (...args: any[]) => T; +export function partial(fn: (a: A, b: B, c: C, ...args: any[]) => T, a: A, b: B, c: C): (...args: any[]) => T; +export function partial(fn: (a: A, b: B, c: C, d: D, ...args: any[]) => T, a: A, b: B, c: C, d: D): (...args: any[]) => T; +export function partial(fn: (a: A, b: B, c: C, d: D, e: E, ...args: any[]) => T, a: A, b: B, c: C, d: D, e: E): (...args: any[]) => T; +export function partial(fn: (a: A, b: B, c: C, d: D, e: E, f: F, ...args: any[]) => T, a: A, b: B, c: C, d: D, e: E, f: F): (...args: any[]) => T; +export function partial(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, ...args: any[]) => T, a: A, b: B, c: C, d: D, e: E, f: F, g: G): (...args: any[]) => T; +export function partial(fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, ...args: any[]) => T, a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H): (...args: any[]) => T; +export function partial(fn, ...args: any[]) { + let [a, b, c, d, e, f, g, h] = args; + switch (args.length) { + case 1: + return (...xs: any[]) => fn(a, ...xs); + case 2: + return (...xs: any[]) => fn(a, b, ...xs); + case 3: + return (...xs: any[]) => fn(a, b, c, ...xs); + case 4: + return (...xs: any[]) => fn(a, b, c, d, ...xs); + case 5: + return (...xs: any[]) => fn(a, b, c, d, e, ...xs); + case 6: + return (...xs: any[]) => fn(a, b, c, d, e, f, ...xs); + case 7: + return (...xs: any[]) => fn(a, b, c, d, e, f, g, ...xs); + case 8: + return (...xs: any[]) => fn(a, b, c, d, e, f, g, h, ...xs); + default: + illegalArgs(); + } +} + +export const foo = partial((a: string, b: number) => a + b, "a"); From 501536b90b508738d8c4f32d29827a5e97b603b9 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 23:38:19 +0100 Subject: [PATCH 67/77] feat(morton): import & update @thi.ng/morton package (MBP2010) --- packages/morton/.npmignore | 10 ++ packages/morton/LICENSE | 201 +++++++++++++++++++++++++++++ packages/morton/README.md | 65 ++++++++++ packages/morton/package.json | 46 +++++++ packages/morton/src/index.ts | 161 +++++++++++++++++++++++ packages/morton/test/index.ts | 6 + packages/morton/test/tsconfig.json | 10 ++ packages/morton/tsconfig.json | 9 ++ 8 files changed, 508 insertions(+) create mode 100644 packages/morton/.npmignore create mode 100644 packages/morton/LICENSE create mode 100644 packages/morton/README.md create mode 100644 packages/morton/package.json create mode 100644 packages/morton/src/index.ts create mode 100644 packages/morton/test/index.ts create mode 100644 packages/morton/test/tsconfig.json create mode 100644 packages/morton/tsconfig.json diff --git a/packages/morton/.npmignore b/packages/morton/.npmignore new file mode 100644 index 0000000000..d703bda97a --- /dev/null +++ b/packages/morton/.npmignore @@ -0,0 +1,10 @@ +build +coverage +dev +doc +src* +test +.nyc_output +tsconfig.json +*.tgz +*.html diff --git a/packages/morton/LICENSE b/packages/morton/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/morton/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/morton/README.md b/packages/morton/README.md new file mode 100644 index 0000000000..bc390e153c --- /dev/null +++ b/packages/morton/README.md @@ -0,0 +1,65 @@ +# @thi.ng/morton + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/morton.svg)](https://www.npmjs.com/package/@thi.ng/morton) +![npm downloads](https://img.shields.io/npm/dm/@thi.ng/morton.svg) +[![Twitter Follow](https://img.shields.io/twitter/follow/thing_umbrella.svg?style=flat-square&label=twitter)](https://twitter.com/thing_umbrella) + +This project is part of the +[@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo. + + + +- [About](#about) +- [Installation](#installation) +- [Dependencies](#dependencies) +- [Usage examples](#usage-examples) +- [Authors](#authors) +- [License](#license) + + + +## About + +[Z-order-curve](https://en.wikipedia.org/wiki/Z-order_curve) / Morton +encoding & decoding for 1D, 2D, 3D. + +- https://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/ +- https://www.forceflow.be/2013/10/07/morton-encodingdecoding-through-bit-interleaving-implementations/ +- https://github.com/JaneliaSciComp/Morton.jl/blob/master/src/Morton.jl + +## Installation + +```bash +yarn add @thi.ng/morton +``` + +## Dependencies + +- [@thi.ng/binary](https://github.com/thi-ng/umbrella/tree/master/packages/binary) +- [@thi.ng/math](https://github.com/thi-ng/umbrella/tree/master/packages/math) + +## Usage examples + +```ts +import * as m from "@thi.ng/morton"; + +m.mux2(23, 42); +// 2461 + +m.demux2(2461) +// [ 23, 42 ] + +m.muxScaled2(0.25, 0.75) +// 2594876074 + +m.demuxScaled2(m.muxScaled2(0.25, 0.75)) +// [ 0.2500038147554742, 0.7499961852445258 ] +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2015 - 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/morton/package.json b/packages/morton/package.json new file mode 100644 index 0000000000..de327e57b2 --- /dev/null +++ b/packages/morton/package.json @@ -0,0 +1,46 @@ +{ + "name": "@thi.ng/morton", + "version": "0.0.1", + "description": "Z-order-curve / Morton encoding & decoding for 1D, 2D, 3D", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thi-ng/umbrella.git" + }, + "homepage": "https://github.com/thi-ng/umbrella/tree/master/packages/morton", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts .nyc_output build coverage doc", + "cover": "yarn test && nyc report --reporter=lcov", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^5.2.5", + "@types/node": "^10.5.5", + "mocha": "^5.2.0", + "nyc": "^12.0.2", + "typedoc": "^0.11.1", + "typescript": "^3.0.1" + }, + "dependencies": { + "@thi.ng/binary": "^0.0.1", + "@thi.ng/math": "^0.0.1" + }, + "keywords": [ + "binary", + "ES6", + "morton", + "spatial index", + "sorting", + "typescript", + "z-curve" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/morton/src/index.ts b/packages/morton/src/index.ts new file mode 100644 index 0000000000..0a60330259 --- /dev/null +++ b/packages/morton/src/index.ts @@ -0,0 +1,161 @@ +import { ceilPow2 } from "@thi.ng/binary/pow"; +import { fit, fit01 } from "@thi.ng/math/fit"; + +export const encode5 = (x: number) => { + x &= 0x0000001f; + x = (x * 0x01041041) & 0x10204081; + x = (x * 0x00108421) & 0x15500000; + return x >>> 20; +}; + +export const encode10 = (x: number) => { + x &= 0x000003ff; // ---- ---- ---- ---- ---- --98 7654 3210 + x = (x | x << 16) & 0xff0000ff; // ---- --98 ---- ---- ---- ---- 7654 3210 + x = (x | x << 8) & 0x0300f00f; // ---- --98 ---- ---- 7654 ---- ---- 3210 + x = (x | x << 4) & 0x030c30c3; // ---- --98 ---- 76-- --54 ---- 32-- --10 + x = (x | x << 2) & 0x09249249; // ---- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 + return x >>> 0; +}; + +export const encode16 = (x: number) => { + x &= 0x0000ffff; // ---- ---- ---- ---- fedc ba98 7654 3210 + x = (x | x << 8) & 0x00ff00ff; // ---- ---- fedc ba98 ---- ---- 7654 3210 + x = (x | x << 4) & 0x0f0f0f0f; // ---- fedc ---- ba98 ---- 7654 ---- 3210 + x = (x | x << 2) & 0x33333333; // --fe --dc --ba --98 --76 --54 --32 --10 + x = (x | x << 1) & 0x55555555; // -f-e -d-c -b-a -9-8 -7-6 -5-4 -3-2 -1-0 + return x >>> 0; +}; + +export const decode5 = (x: number) => { + x &= 0x00000155; + x = (x | x >> 1) & 0x00000133; + x = (x | x >> 2) & 0x0000010f; + x = (x | x >> 4) & 0x0000001f; + return x; +}; + +export const decode10 = (x: number) => { + x &= 0x09249249; + x = (x | x >> 2) & 0x030c30c3; + x = (x | x >> 4) & 0x0300f00f; + x = (x | x >> 8) & 0xff0000ff; + x = (x | x >> 16) & 0x000003ff; + return x; +}; + +export const decode16 = (x: number) => { + x &= 0x55555555; + x = (x | x >> 1) & 0x33333333; + x = (x | x >> 2) & 0x0f0f0f0f; + x = (x | x >> 4) & 0x00ff00ff; + x = (x | x >> 8) & 0x0000ffff; + return x; +}; + +export const encodeScaled5 = (x: number, min = 0, max = 1) => + encode5(Math.round(fit(x, min, max, 0, 0x1f))); + +export const encodeScaled10 = (x: number, min = 0, max = 1) => + encode10(Math.round(fit(x, min, max, 0, 0x3ff))); + +export const encodeScaled16 = (x: number, min = 0, max = 1) => + encode16(Math.round(fit(x, min, max, 0, 0xffff))); + +export const decodeScaled5 = (x: number, min = 0, max = 1) => + fit01(decode5(x) / 0x1f, min, max); + +export const decodeScaled10 = (x: number, min = 0, max = 1) => + fit01(decode10(x) / 0x3ff, min, max); + +export const decodeScaled16 = (x: number, min = 0, max = 1) => + fit01(decode16(x) / 0xffff, min, max); + +export const mux2 = (x: number, y: number) => + (encode16(x) | encode16(y) << 1) >>> 0; + +export const mux3 = (x: number, y: number, z: number) => + (encode10(x) | encode10(y) << 1 | encode10(z) << 2) >>> 0; + +export const demux2 = (n: number) => + [decode16(n), decode16(n >>> 1)]; + +export const demux3 = (n: number) => + [decode10(n), decode10(n >>> 1), decode10(n >>> 2)]; + +export const muxScaled2 = (x: number, y: number, min = 0, max = 1) => + ( + encodeScaled16(x, min, max) | + encodeScaled16(y, min, max) << 1 + ) >>> 0; + +export const muxScaled3 = (x: number, y: number, z: number, min = 0, max = 1) => + ( + encodeScaled10(x, min, max) | + encodeScaled10(y, min, max) << 1 | + encodeScaled10(z, min, max) << 2 + ) >>> 0; + +export const demuxScaled2 = (n: number, min = 0, max = 1) => + [ + decodeScaled16(n, min, max), + decodeScaled16(n >>> 1, min, max) + ]; + +export const demuxScaled3 = (n: number, min = 0, max = 1) => + [ + decodeScaled10(n, min, max), + decodeScaled10(n >>> 1, min, max), + decodeScaled10(n >>> 2, min, max) + ]; + +export const treeToMorton = (t: number[], dim: number) => { + let n = 0; + let m = 0; + let l = t.length; + dim = 1 << dim; + while (--l >= 0) { + m += t[l] * Math.pow(dim, n); + n++; + } + return m; +}; + +export const mortonToTree = (m: number, dim: number) => { + const t: number[] = []; + dim = 1 << dim; + while (true) { + const d = Math.floor(m / dim); + t.unshift(m % dim); + if (!d) break; + m = d; + } + return t; +}; + +export const treeToCartesian = (t: number[], dim: number) => { + const c: number[] = []; + for (let i = 0, x = t[0]; i < dim; i++) { + c[i] = (x >>> i) & 1; + } + if (t.length < 2) return c; + const cn = treeToCartesian(t.slice(1), 2); + const m = 1 << (t.length - 1); + const res: number[] = new Array(dim); + for (let i = 0; i < dim; i++) { + res[i] = m * c[i] + cn[i]; + } + return res; +}; + +export const cartesianToTree = (v: number[]) => { + const $ = (v: number[], half: number) => { + const t = v.reduce( + (t, x, i) => t + ((1 << i) * (x >= half)), + 0 + ); + return half > 1 ? + [t, ...$(v.map((x) => x % half), half >>> 1)] : + [t]; + }; + return $(v, Math.max(2, ceilPow2(Math.max(...v) + 1)) >> 1); +}; diff --git a/packages/morton/test/index.ts b/packages/morton/test/index.ts new file mode 100644 index 0000000000..5d3a16c374 --- /dev/null +++ b/packages/morton/test/index.ts @@ -0,0 +1,6 @@ +// import * as assert from "assert"; +// import * as m from "../src/index"; + +describe("morton", () => { + it("tests pending"); +}); diff --git a/packages/morton/test/tsconfig.json b/packages/morton/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/morton/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/morton/tsconfig.json b/packages/morton/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/morton/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 1bd9fd43f1575068ca15cb6f17cdddd2274062fb Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 23:38:53 +0100 Subject: [PATCH 68/77] docs(heaps): update readme --- packages/heaps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/heaps/README.md b/packages/heaps/README.md index fcc509ffd6..638b7969bc 100644 --- a/packages/heaps/README.md +++ b/packages/heaps/README.md @@ -11,7 +11,7 @@ This project is part of the Type agnostic binary heap & d-ary heap implementations with customizable ordering and fanout / tree arity (in case of `DHeap`). Both `Heap` and -`DHeap` have identical API. +`DHeap` have identical base API, however the former provides several additional operations. ## Installation From f257330e884ddfed9b961f5559309edb3c90c0bb Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 16 Oct 2018 23:40:15 +0100 Subject: [PATCH 69/77] refactor(transducers): add ensureArrayLike(), update permutations() --- packages/transducers/src/func/ensure-array.ts | 5 ++++ packages/transducers/src/iter/permutations.ts | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/transducers/src/func/ensure-array.ts b/packages/transducers/src/func/ensure-array.ts index cf3634d417..5928b40a58 100644 --- a/packages/transducers/src/func/ensure-array.ts +++ b/packages/transducers/src/func/ensure-array.ts @@ -1,4 +1,5 @@ import { isArray } from "@thi.ng/checks/is-array"; +import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { ensureIterable } from "./ensure-iterable"; /** @@ -12,3 +13,7 @@ import { ensureIterable } from "./ensure-iterable"; export function ensureArray(x: any): any[] { return isArray(x) ? x : [...ensureIterable(x)]; } + +export function ensureArrayLike(x: any): ArrayLike { + return isArrayLike(x) ? x : [...ensureIterable(x)]; +} diff --git a/packages/transducers/src/iter/permutations.ts b/packages/transducers/src/iter/permutations.ts index 4e27fee9d0..c0375cae68 100644 --- a/packages/transducers/src/iter/permutations.ts +++ b/packages/transducers/src/iter/permutations.ts @@ -1,7 +1,5 @@ -import { isArray } from "@thi.ng/checks/is-array"; -import { isString } from "@thi.ng/checks/is-string"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; - +import { ensureArrayLike } from "../func/ensure-array"; import { range } from "./range"; /** @@ -10,11 +8,11 @@ import { range } from "./range"; * empty the iterator yields no values. * * ``` - * [...permutations(range(3), "ab")] + * [...permutations("ab", range(3))] * // [ ['a', 0], ['a', 1], ['a', 2], * // ['b', 0], ['b', 1], ['b', 2] ] * - * [...iterator(map((x: any[]) => x.join("")), permutations("ab", "-", tx.range(3)))] + * [...map((x: any[]) => x.join(""), permutations("ab", "-", range(3)))] * // ['a-0', 'a-1', 'a-2', 'b-0', 'b-1', 'b-2'] * * [...permutations([], "", range(0))] @@ -27,13 +25,14 @@ export function permutations(a: Iterable): IterableIterator<[A]>; export function permutations(a: Iterable, b: Iterable): IterableIterator<[A, B]>; export function permutations(a: Iterable, b: Iterable, c: Iterable): IterableIterator<[A, B, C]>; export function permutations(a: Iterable, b: Iterable, c: Iterable, d: Iterable): IterableIterator<[A, B, C, D]>; -export function* permutations(...src: Iterable[]): IterableIterator { +export function permutations(...src: Iterable[]): IterableIterator; +export function* permutations(...src: any[]) { const n = src.length - 1; if (n < 0) { return; } const step = new Array(n + 1).fill(0); - const realized = src.map((s: any) => isArray(s) || isString(s) ? s : [...s]); + const realized = src.map(ensureArrayLike); const total = realized.reduce((acc, x) => acc * x.length, 1); for (let i = 0; i < total; i++) { const tuple = []; @@ -52,8 +51,10 @@ export function* permutations(...src: Iterable[]): IterableIterator } /** - * Iterator yielding the Cartesian Product for `n` items of `m` values each. - * If `m` is not given, defaults to value of `n`. The range of `m` is `0..m-1`. + * Iterator yielding the Cartesian Product for `n` items of `m` values + * each. If `m` is not given, defaults to value of `n`. The range of `m` + * is `0..m-1`. The optional `offsets` array can be used to define start + * values for each dimension. * * ``` * [...permutationsN(2)] @@ -63,14 +64,18 @@ export function* permutations(...src: Iterable[]): IterableIterator * // [ [0, 0], [0, 1], [0, 2], * // [1, 0], [1, 1], [1, 2], * // [2, 0], [2, 1], [2, 2] ] + * + * [...permutationsN(2, 3, [10, 20])] + * // [ [ 10, 20 ], [ 10, 21 ], [ 11, 20 ], [ 11, 21 ] ] * ``` * * @param n * @param m + * @param offsets */ export function permutationsN(n: number, m = n, offsets?: number[]): IterableIterator { if (offsets && offsets.length < n) { - illegalArgs(`insufficient offsets, got ${offsets.length}, but needed ${n}`); + illegalArgs(`insufficient offsets, got ${offsets.length}, needed ${n}`); } const seqs = []; while (--n >= 0) { From 0967929fa985ceb7599d6e0e35a593f9a629307e Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 02:37:10 +0100 Subject: [PATCH 70/77] feat(vectors): replace math.ts w/ imports from @thi.ng/maths package BREAKING CHANGES: re-use @thi.ng/maths functionality instead of internal maths functions. --- packages/vectors/package.json | 3 +- packages/vectors/src/common.ts | 5 +- packages/vectors/src/gvec.ts | 23 ++-- packages/vectors/src/index.ts | 1 - packages/vectors/src/mat23.ts | 2 +- packages/vectors/src/mat33.ts | 2 +- packages/vectors/src/mat44.ts | 4 +- packages/vectors/src/math.ts | 199 --------------------------------- packages/vectors/src/vec2.ts | 38 +++---- packages/vectors/src/vec3.ts | 48 ++++---- packages/vectors/src/vec4.ts | 50 ++++----- 11 files changed, 80 insertions(+), 295 deletions(-) delete mode 100644 packages/vectors/src/math.ts diff --git a/packages/vectors/package.json b/packages/vectors/package.json index 082489232e..6fa93f620b 100644 --- a/packages/vectors/package.json +++ b/packages/vectors/package.json @@ -32,6 +32,7 @@ "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", "@thi.ng/errors": "^0.1.9", + "@thi.ng/math": "^0.0.1", "@thi.ng/transducers": "^2.1.6" }, "keywords": [ @@ -46,4 +47,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/vectors/src/common.ts b/packages/vectors/src/common.ts index 7d27034bbb..1d6dd58ec9 100644 --- a/packages/vectors/src/common.ts +++ b/packages/vectors/src/common.ts @@ -1,3 +1,5 @@ +import { EPS } from "@thi.ng/math/api"; +import { eqDelta as _eqDelta } from "@thi.ng/math/eqdelta"; import { ReadonlyVec, ReadonlyVecOp1, @@ -5,7 +7,6 @@ import { VecOp2, VecOp2o } from "./api"; -import { EPS, eqDelta1 } from "./math"; export const x: ReadonlyVecOp1 = (v: ReadonlyVec, i = 0) => v[i]; export const y: ReadonlyVecOp1 = (v: ReadonlyVec, i = 0, s = 1) => v[i + s]; @@ -178,7 +179,7 @@ export const equiv = (a: ReadonlyVec, b: ReadonlyVec, n: number, ia = 0, ib = 0, */ export const eqDelta = (a: ReadonlyVec, b: ReadonlyVec, n: number, eps = EPS, ia = 0, ib = 0, sa = 1, sb = 1) => { for (; n > 0; n-- , ia += sa, ib += sb) { - if (!eqDelta1(a[ia], b[ib], eps)) { + if (!_eqDelta(a[ia], b[ib], eps)) { return false; } } diff --git a/packages/vectors/src/gvec.ts b/packages/vectors/src/gvec.ts index 5bb68ea984..c0a65e9cea 100644 --- a/packages/vectors/src/gvec.ts +++ b/packages/vectors/src/gvec.ts @@ -6,6 +6,11 @@ import { } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; +import { sign as _sign } from "@thi.ng/math/abs"; +import { EPS } from "@thi.ng/math/api"; +import { clamp as _clamp } from "@thi.ng/math/interval"; +import { fract as _fract } from "@thi.ng/math/prec"; +import { smoothStep as _smoothStep, step as _step } from "@thi.ng/math/step"; import { IDotProduct, IMagnitude, @@ -18,14 +23,6 @@ import { Vec } from "./api"; import { $iter, eqDelta, equiv } from "./common"; -import { - clamp1, - EPS, - fract1, - sign1, - smoothStep1, - step1 -} from "./math"; export const opg0 = (fn: () => number, a: Vec, num = a.length, i = 0, s = 1) => { @@ -174,7 +171,7 @@ export const abs = (a: Vec, num = a.length, i = 0, s = 1) => opg1(Math.abs, a, num, i, s); export const sign = (a: Vec, num = a.length, eps = EPS, i = 0, s = 1) => - opg1((x) => sign1(x, eps), a, num, i, s); + opg1((x) => _sign(x, eps), a, num, i, s); export const floor = (a: Vec, num = a.length, i = 0, s = 1) => opg1(Math.floor, a, num, i, s); @@ -183,7 +180,7 @@ export const ceil = (a: Vec, num = a.length, i = 0, s = 1) => opg1(Math.ceil, a, num, i, s); export const fract = (a: Vec, num = a.length, i = 0, s = 1) => - opg1(fract1, a, num, i, s); + opg1(_fract, a, num, i, s); export const sin = (a: Vec, num = a.length, i = 0, s = 1) => opg1(Math.sin, a, num, i, s); @@ -207,13 +204,13 @@ export const max = (a: Vec, b: ReadonlyVec, num = a.length, ia = 0, ib = 0, sa = opg2(Math.max, a, b, num, ia, ib, sa, sb); export const clamp = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, num = a.length, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => - opg3(clamp1, a, b, c, num, ia, ib, ic, sa, sb, sc); + opg3(_clamp, a, b, c, num, ia, ib, ic, sa, sb, sc); export const step = (a: Vec, b: ReadonlyVec, num = a.length, ia = 0, ib = 0, sa = 1, sb = 1) => - opg2((x, e) => step1(e, x), a, b, num, ia, ib, sa, sb); + opg2((x, e) => _step(e, x), a, b, num, ia, ib, sa, sb); export const smoothStep = (a: Vec, b: ReadonlyVec, c: ReadonlyVec, num = a.length, ia = 0, ib = 0, ic = 0, sa = 1, sb = 1, sc = 1) => - opg3((x, e1, e2) => smoothStep1(e1, e2, x), a, b, c, num, ia, ib, ic, sa, sb, sc); + opg3((x, e1, e2) => _smoothStep(e1, e2, x), a, b, c, num, ia, ib, ic, sa, sb, sc); export const gvec = (...coords: number[]) => new GVec(coords, coords.length); diff --git a/packages/vectors/src/index.ts b/packages/vectors/src/index.ts index 8c96810f59..921f2cba05 100644 --- a/packages/vectors/src/index.ts +++ b/packages/vectors/src/index.ts @@ -3,7 +3,6 @@ export * from "./common"; export * from "./mat23"; export * from "./mat33"; export * from "./mat44"; -export * from "./math"; export * from "./gvec"; export * from "./vec2"; export * from "./vec3"; diff --git a/packages/vectors/src/mat23.ts b/packages/vectors/src/mat23.ts index 94df858c9f..f7e3683be9 100644 --- a/packages/vectors/src/mat23.ts +++ b/packages/vectors/src/mat23.ts @@ -1,5 +1,6 @@ import { ICopy, IEqualsDelta } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; +import { EPS } from "@thi.ng/math/api"; import { Mat, ReadonlyMat, @@ -8,7 +9,6 @@ import { } from "./api"; import { declareIndices } from "./codegen"; import { $iter, eqDelta } from "./common"; -import { EPS } from "./math"; import { cross2, dot2, diff --git a/packages/vectors/src/mat33.ts b/packages/vectors/src/mat33.ts index 65318f112b..b4235482ef 100644 --- a/packages/vectors/src/mat33.ts +++ b/packages/vectors/src/mat33.ts @@ -1,5 +1,6 @@ import { ICopy, IEqualsDelta } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; +import { EPS } from "@thi.ng/math/api"; import { Mat, ReadonlyMat, @@ -8,7 +9,6 @@ import { } from "./api"; import { declareIndices } from "./codegen"; import { $iter, eqDelta } from "./common"; -import { EPS } from "./math"; import { dot3, set3, diff --git a/packages/vectors/src/mat44.ts b/packages/vectors/src/mat44.ts index 42805f13c2..fdb447d5a1 100644 --- a/packages/vectors/src/mat44.ts +++ b/packages/vectors/src/mat44.ts @@ -9,7 +9,6 @@ import { import { declareIndices } from "./codegen"; import { $iter, eqDelta } from "./common"; import { Mat33 } from "./mat33"; -import { EPS, rad } from "./math"; import { cross3, dot3, @@ -21,6 +20,7 @@ import { Vec3 } from "./vec3"; import { dot4, setS4, Vec4 } from "./vec4"; +import { EPS, DEG2RAD } from "@thi.ng/math/api"; export const get44 = (a: Mat, i = 0) => a.slice(i, i + 16); @@ -159,7 +159,7 @@ export const frustum = (m: Mat, left: number, right: number, bottom: number, top }; export const frustumBounds = (fovy: number, aspect: number, near: number, far: number) => { - const top = near * Math.tan(rad(fovy) / 2); + const top = near * Math.tan(fovy * DEG2RAD / 2); const right = top * aspect; return { left: -right, diff --git a/packages/vectors/src/math.ts b/packages/vectors/src/math.ts deleted file mode 100644 index 5b1a6a9da9..0000000000 --- a/packages/vectors/src/math.ts +++ /dev/null @@ -1,199 +0,0 @@ -export const PI = Math.PI; -export const TAU = PI * 2; -export const HALF_PI = PI / 2; -export const QUARTER_PI = PI / 4; - -export const DEG2RAD = PI / 180; -export const RAD2DEG = 180 / PI; - -export let EPS = 1e-6; - -export const absDiff1 = (x: number, y: number) => - Math.abs(x - y); - -export const atan2Abs1 = (y: number, x: number) => { - const theta = Math.atan2(y, x); - return theta < 0 ? TAU + theta : theta; -}; - -/** - * Converts angle to degrees. - * - * @param x angle in radians - */ -export const deg = (x: number) => x * RAD2DEG; - -/** - * Converts angle to radians. - * - * @param x angle in degrees - */ -export const rad = (x: number) => x * DEG2RAD; - -/** - * Checks if `|a - b| <= ε`. - * - * @param a left value - * @param b right value - * @param eps epsilon / tolerance - */ -export const eqDelta1 = (a: number, b: number, eps = EPS) => { - const d = a - b; - return (d < 0 ? -d : d) <= eps; -}; - -/** - * Returns `a - b * floor(a/b)` - * - * @param a - * @param b - */ -export const fmod1 = (a: number, b: number) => - a - b * Math.floor(a / b); - -/** - * Step/threshold function. - * - * @param edge threshold - * @param x test value - * @returns 0, if `x < e`, else 1 - */ -export const step1 = (edge: number, x: number) => - x < edge ? 0 : 1; - -/** - * GLSL-style smoothStep threshold function. - * - * @param edge lower threshold - * @param edge2 upper threshold - * @param x test value - * @returns 0, if `x < edge1`, 1 if `x > edge2`, else sigmoid interpolation - */ -export const smoothStep1 = (edge: number, edge2: number, x: number) => { - const t = clamp1((x - edge) / (edge2 - edge), 0, 1); - return (3 - 2 * t) * t * t; -}; - -export const expStep1 = (x: number, k: number, n: number) => - Math.exp(-k * Math.pow(x, n)); - -export const gain1 = (x: number, k: number) => - x < 0.5 ? - 0.5 * Math.pow(2 * x, k) : - 1 - 0.5 * Math.pow(2 - 2 * x, k); - -export const min2id = (a: number, b: number) => - a <= b ? 0 : 1; - -export const min3id = (a: number, b: number, c: number) => - (a <= b) ? - (a <= c ? 0 : 2) : - (b <= c ? 1 : 2); - -export const min4id = (a: number, b: number, c: number, d: number) => - a <= b ? - (a <= c ? - (a <= d ? 0 : 3) : - (c <= d ? 2 : 3)) : - (b <= c ? - (b <= d ? 1 : 3) : - (c <= d ? 2 : 3)); - -export const max2id = (a: number, b: number) => - a >= b ? 0 : 1; - -export const max3id = (a: number, b: number, c: number) => - (a >= b) ? - (a >= c ? 0 : 2) : - (b >= c ? 1 : 2); - -export const max4id = (a: number, b: number, c: number, d: number) => - a >= b ? - (a >= c ? - (a >= d ? 0 : 3) : - (c >= d ? 2 : 3)) : - (b >= c ? - (b >= d ? 1 : 3) : - (c >= d ? 2 : 3)); - -export const smin1 = (a: number, b: number, k: number) => - -Math.log(Math.exp(-k * a) + Math.exp(-k * b)) / k; - -export const smax1 = (a: number, b: number, k: number) => - Math.log(Math.exp(a) + Math.exp(b)) / k; - -/** -* Clamps value `x` to given closed interval. -* -* @param x value to clamp -* @param min lower bound -* @param max upper bound -*/ -export const clamp1 = (x: number, min: number, max: number) => - x < min ? min : x > max ? max : x; - -export const mix1 = (a: number, b: number, t: number) => - a + (b - a) * t; - -/** - * ``` - * c d - * +----+ - * | | - * +----+ - * a b - * ``` - * - * @param a BL value - * @param b BR value - * @param c TL value - * @param d TR value - * @param u 1st interpolation factor - * @param v 2nd interpolation factor - */ -export const mixBilinear1 = (a: number, b: number, c: number, d: number, u: number, v: number) => - mix1(mix1(a, b, u), mix1(c, d, u), v); - -export const norm1 = (x: number, a: number, b: number) => - (x - a) / (b - a); - -export const fit1 = (x: number, a: number, b: number, c: number, d: number) => - c + (d - c) * (x - a) / (b - a); - -export const fitClamped1 = (x: number, a: number, b: number, c: number, d: number) => - c + (d - c) * clamp1((x - a) / (b - a), 0, 1); - -export const sign1 = (x: number, eps = EPS) => - x > eps ? 1 : x < -eps ? -1 : 0; - -export const fract1 = (x: number) => - x - Math.floor(x); - -export const trunc1 = (x: number) => - x < 0 ? Math.ceil(x) : Math.floor(x); - -export const roundTo1 = (x: number, prec = 1) => - Math.round(x / prec) * prec; - -/** - * Returns true iff `x` is in closed interval `[min .. max]` - * - * @param x - * @param min - * @param max - */ -export const inRange1 = (x: number, min: number, max: number) => - x >= min && x <= max; - -/** - * Returns true iff `x` is in open interval `(min .. max)` - * - * @param x - * @param min - * @param max - */ -export const inOpenRange1 = (x: number, min: number, max: number) => - x > min && x < max; - -export const hash1 = (x: number) => - fract1(Math.sin(x) * 758.5453); diff --git a/packages/vectors/src/vec2.ts b/packages/vectors/src/vec2.ts index d372079ff1..d13aa63d09 100644 --- a/packages/vectors/src/vec2.ts +++ b/packages/vectors/src/vec2.ts @@ -1,4 +1,11 @@ import { isArrayLike } from "@thi.ng/checks/is-arraylike"; +import { atan2Abs } from "@thi.ng/math/angle"; +import { EPS, HALF_PI, PI } from "@thi.ng/math/api"; +import { eqDelta } from "@thi.ng/math/eqdelta"; +import { max2id, min2id } from "@thi.ng/math/interval"; +import { mixBilinear } from "@thi.ng/math/mix"; +import { fract } from "@thi.ng/math/prec"; +import { smoothStep, step } from "@thi.ng/math/step"; import { IAngleBetween, ICrossProduct, @@ -17,19 +24,6 @@ import { } from "./api"; import { declareIndices, defcommon } from "./codegen"; import { $iter } from "./common"; -import { - atan2Abs1, - EPS, - eqDelta1, - fract1, - HALF_PI, - max2id, - min2id, - mixBilinear1, - PI, - smoothStep1, - step1 -} from "./math"; export const op2 = (fn: (x: number) => number, a: Vec, ia = 0, sa = 1) => (a[ia] = fn(a[ia]), a[ia + sa] = fn(a[ia + sa]), a); @@ -78,8 +72,8 @@ export const equiv2 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, s a[ia + sa] === b[ib + sb]; export const eqDelta2 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = 0, sa = 1, sb = 1) => - eqDelta1(a[ia], b[ib], eps) && - eqDelta1(a[ia + sa], b[ib + sb], eps); + eqDelta(a[ia], b[ib], eps) && + eqDelta(a[ia + sa], b[ib + sb], eps); export const eqDelta2buf = (a: ReadonlyVec, b: ReadonlyVec, num: number, eps = EPS, ia = 0, ib = 0, sca = 1, scb = 1, sea = 2, seb = 2) => { while (--num >= 0) { @@ -144,7 +138,7 @@ export const neg2 = (a: Vec, ia = 0, sa = 1) => mulN2(a, -1, ia, sa); export const fract2 = (a: Vec, ia = 0, sa = 1) => - op2(fract1, a, ia, sa); + op2(fract, a, ia, sa); export const powN2 = (a: Vec, n: number, ia = 0, sa = 1) => op21(Math.pow, a, n, ia, sa); @@ -159,8 +153,8 @@ export const mixBilinear2 = ( a: Vec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, u: number, v: number, ia = 0, ib = 0, ic = 0, id = 0, sa = 1, sb = 1, sc = 1, sd = 1) => ( - a[ia] = mixBilinear1(a[ia], b[ib], c[ic], d[id], u, v), - a[ia + sa] = mixBilinear1(a[ia + sa], b[ib + sb], c[ic + sc], d[id + sd], u, v), + a[ia] = mixBilinear(a[ia], b[ib], c[ic], d[id], u, v), + a[ia + sa] = mixBilinear(a[ia + sa], b[ib + sb], c[ic + sc], d[id + sd], u, v), a ); @@ -168,11 +162,11 @@ export const clamp2 = (a: Vec, min: ReadonlyVec, max: ReadonlyVec, ia = 0, imin max2(min2(a, max, ia, imax, sa, smax), min, ia, imin, sa, smin); export const step2 = (a: Vec, e: ReadonlyVec, ia = 0, ie = 0, sa = 1, stridee = 1) => - (a[ia] = step1(e[ie], a[ia]), a[ia + sa] = step1(e[ie + stridee], a[ia + sa]), a); + (a[ia] = step(e[ie], a[ia]), a[ia + sa] = step(e[ie + stridee], a[ia + sa]), a); export const smoothStep2 = (a: Vec, e1: ReadonlyVec, e2: ReadonlyVec, ia = 0, ie1 = 0, ie2 = 0, sa = 1, se1 = 1, se2 = 1) => ( - a[ia] = smoothStep1(e1[ie1], e2[ie2], a[ia]), - a[ia + sa] = smoothStep1(e1[ie1 + se1], e2[ie2 + se2], a[ia + sa]), + a[ia] = smoothStep(e1[ie1], e2[ie2], a[ia]), + a[ia + sa] = smoothStep(e1[ie1 + se1], e2[ie2 + se2], a[ia + sa]), a ); @@ -260,7 +254,7 @@ export const rotateAroundPoint2 = (a: Vec, b: Vec, theta: number, ia = 0, ib = 0 }; export const heading2 = (a: ReadonlyVec, ia = 0, sa = 1) => - atan2Abs1(a[ia + sa], a[ia]); + atan2Abs(a[ia + sa], a[ia]); export const angleRatio2 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => dot2(a, b, ia, ib, sa, sb) / (mag2(a, ia, sa) * mag2(b, ib, sb)); diff --git a/packages/vectors/src/vec3.ts b/packages/vectors/src/vec3.ts index 5cda1b7da1..1ce2dfd6c4 100644 --- a/packages/vectors/src/vec3.ts +++ b/packages/vectors/src/vec3.ts @@ -1,4 +1,11 @@ import { isArrayLike } from "@thi.ng/checks/is-arraylike"; +import { atan2Abs } from "@thi.ng/math/angle"; +import { EPS } from "@thi.ng/math/api"; +import { eqDelta } from "@thi.ng/math/eqdelta"; +import { max3id, min3id } from "@thi.ng/math/interval"; +import { mixBilinear } from "@thi.ng/math/mix"; +import { fract } from "@thi.ng/math/prec"; +import { smoothStep, step } from "@thi.ng/math/step"; import { IAngleBetween, ICrossProduct, @@ -18,17 +25,6 @@ import { } from "./api"; import { declareIndices, defcommon } from "./codegen"; import { $iter } from "./common"; -import { - atan2Abs1, - EPS, - eqDelta1, - fract1, - max3id, - min3id, - mixBilinear1, - smoothStep1, - step1 -} from "./math"; import { heading2, rotate2, @@ -92,9 +88,9 @@ export const equiv3 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, s a[ia + 2 * sa] === b[ib + 2 * sb]; export const eqDelta3 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = 0, sa = 1, sb = 1) => - eqDelta1(a[ia], b[ib], eps) && - eqDelta1(a[ia + sa], b[ib + sb], eps) && - eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps); + eqDelta(a[ia], b[ib], eps) && + eqDelta(a[ia + sa], b[ib + sb], eps) && + eqDelta(a[ia + 2 * sa], b[ib + 2 * sb], eps); export const eqDelta3buf = (a: ReadonlyVec, b: ReadonlyVec, num: number, eps = EPS, ia = 0, ib = 0, sca = 1, scb = 1, sea = 3, seb = 3) => { while (--num >= 0) { @@ -163,7 +159,7 @@ export const neg3 = (a: Vec, ia = 0, sa = 1) => mulN3(a, -1, ia, sa); export const fract3 = (a: Vec, ia = 0, sa = 1) => - op3(fract1, a, ia, sa); + op3(fract, a, ia, sa); export const powN3 = (a: Vec, n: number, ia = 0, sa = 1) => op31(Math.pow, a, n, ia, sa); @@ -196,9 +192,9 @@ export const mixBilinear3 = ( a: Vec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, u: number, v: number, ia = 0, ib = 0, ic = 0, id = 0, sa = 1, sb = 1, sc = 1, sd = 1) => ( - a[ia] = mixBilinear1(a[ia], b[ib], c[ic], d[id], u, v), - a[ia + sa] = mixBilinear1(a[ia + sa], b[ib + sb], c[ic + sc], d[id + sd], u, v), - a[ia + 2 * sa] = mixBilinear1(a[ia + 2 * sa], b[ib + 2 * sb], c[ic + 2 * sc], d[id + 2 * sd], u, v), + a[ia] = mixBilinear(a[ia], b[ib], c[ic], d[id], u, v), + a[ia + sa] = mixBilinear(a[ia + sa], b[ib + sb], c[ic + sc], d[id + sd], u, v), + a[ia + 2 * sa] = mixBilinear(a[ia + 2 * sa], b[ib + 2 * sb], c[ic + 2 * sc], d[id + 2 * sd], u, v), a ); @@ -206,16 +202,16 @@ export const clamp3 = (a: Vec, min: ReadonlyVec, max: ReadonlyVec, ia = 0, imin max3(min3(a, max, ia, imax, sa, smax), min, ia, imin, sa, smin); export const step3 = (a: Vec, e: ReadonlyVec, ia = 0, ie = 0, sa = 1, se = 1) => ( - a[ia] = step1(e[ie], a[ia]), - a[ia + sa] = step1(e[ie + se], a[ia + sa]), - a[ia + 2 * sa] = step1(e[ie + 2 * se], a[ia + 2 * sa]), + a[ia] = step(e[ie], a[ia]), + a[ia + sa] = step(e[ie + se], a[ia + sa]), + a[ia + 2 * sa] = step(e[ie + 2 * se], a[ia + 2 * sa]), a ); export const smoothStep3 = (a: Vec, e1: ReadonlyVec, e2: ReadonlyVec, ia = 0, ie1 = 0, ie2 = 0, sa = 1, se1 = 1, se2 = 1) => ( - a[ia] = smoothStep1(e1[ie1], e2[ie2], a[ia]), - a[ia + sa] = smoothStep1(e1[ie1 + se1], e2[ie2 + se2], a[ia + sa]), - a[ia + 2 * sa] = smoothStep1(e1[ie1 + 2 * se1], e2[ie2 + 2 * se2], a[ia + 2 * sa]), + a[ia] = smoothStep(e1[ie1], e2[ie2], a[ia]), + a[ia + sa] = smoothStep(e1[ie1 + se1], e2[ie2 + se2], a[ia + sa]), + a[ia + 2 * sa] = smoothStep(e1[ie1 + 2 * se1], e2[ie2 + 2 * se2], a[ia + 2 * sa]), a ); @@ -312,10 +308,10 @@ export const rotateAroundAxis3 = (v: Vec, axis: Vec, theta: number, ia = 0, ib = export const headingXY3 = heading2; export const headingXZ3 = (a: ReadonlyVec, ia = 0, sa = 1) => - atan2Abs1(a[ia + 2 * sa], a[ia]); + atan2Abs(a[ia + 2 * sa], a[ia]); export const headingYZ3 = (a: ReadonlyVec, ia = 0, sa = 1) => - atan2Abs1(a[ia + 2 * sa], a[ia + sa]); + atan2Abs(a[ia + 2 * sa], a[ia + sa]); export const angleRatio3 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, sb = 1) => dot3(a, b, ia, ib, sa, sb) / (mag3(a, ia, sa) * mag3(b, ib, sb)); diff --git a/packages/vectors/src/vec4.ts b/packages/vectors/src/vec4.ts index 1aace60104..310f1ca4a8 100644 --- a/packages/vectors/src/vec4.ts +++ b/packages/vectors/src/vec4.ts @@ -1,4 +1,10 @@ import { isArrayLike } from "@thi.ng/checks/is-arraylike"; +import { EPS } from "@thi.ng/math/api"; +import { eqDelta } from "@thi.ng/math/eqdelta"; +import { max4id, min4id } from "@thi.ng/math/interval"; +import { mixBilinear } from "@thi.ng/math/mix"; +import { fract } from "@thi.ng/math/prec"; +import { smoothStep, step } from "@thi.ng/math/step"; import { IVec, IVector, @@ -16,16 +22,6 @@ import { } from "./api"; import { declareIndices, defcommon } from "./codegen"; import { $iter } from "./common"; -import { - EPS, - eqDelta1, - fract1, - max4id, - min4id, - mixBilinear1, - smoothStep1, - step1 -} from "./math"; export const op4 = (fn: (x: number) => number, a: Vec, ia = 0, sa = 1) => ( a[ia] = fn(a[ia]), @@ -94,10 +90,10 @@ export const equiv4 = (a: ReadonlyVec, b: ReadonlyVec, ia = 0, ib = 0, sa = 1, s a[ia + 3 * sa] === b[ib + 3 * sb]; export const eqDelta4 = (a: ReadonlyVec, b: ReadonlyVec, eps = EPS, ia = 0, ib = 0, sa = 1, sb = 1) => - eqDelta1(a[ia], b[ib], eps) && - eqDelta1(a[ia + sa], b[ib + sb], eps) && - eqDelta1(a[ia + 2 * sa], b[ib + 2 * sb], eps) && - eqDelta1(a[ia + 3 * sa], b[ib + 3 * sb], eps); + eqDelta(a[ia], b[ib], eps) && + eqDelta(a[ia + sa], b[ib + sb], eps) && + eqDelta(a[ia + 2 * sa], b[ib + 2 * sb], eps) && + eqDelta(a[ia + 3 * sa], b[ib + 3 * sb], eps); export const eqDelta4buf = (a: ReadonlyVec, b: ReadonlyVec, num: number, eps = EPS, ia = 0, ib = 0, sca = 1, scb = 1, sea = 4, seb = 4) => { while (--num >= 0) { @@ -170,7 +166,7 @@ export const neg4 = (a: Vec, ia = 0, sa = 1) => mulN4(a, -1, ia, sa); export const fract4 = (a: Vec, ia = 0, sa = 1) => - op4(fract1, a, ia, sa); + op4(fract, a, ia, sa); export const powN4 = (a: Vec, n: number, ia = 0, sa = 1) => op41(Math.pow, a, n, ia, sa); @@ -185,10 +181,10 @@ export const mixBilinear4 = ( a: Vec, b: ReadonlyVec, c: ReadonlyVec, d: ReadonlyVec, u: number, v: number, ia = 0, ib = 0, ic = 0, id = 0, sa = 1, sb = 1, sc = 1, sd = 1) => ( - a[ia] = mixBilinear1(a[ia], b[ib], c[ic], d[id], u, v), - a[ia + sa] = mixBilinear1(a[ia + sa], b[ib + sb], c[ic + sc], d[id + sd], u, v), - a[ia + 2 * sa] = mixBilinear1(a[ia + 2 * sa], b[ib + 2 * sb], c[ic + 2 * sc], d[id + 2 * sd], u, v), - a[ia + 3 * sa] = mixBilinear1(a[ia + 3 * sa], b[ib + 3 * sb], c[ic + 3 * sc], d[id + 3 * sd], u, v), + a[ia] = mixBilinear(a[ia], b[ib], c[ic], d[id], u, v), + a[ia + sa] = mixBilinear(a[ia + sa], b[ib + sb], c[ic + sc], d[id + sd], u, v), + a[ia + 2 * sa] = mixBilinear(a[ia + 2 * sa], b[ib + 2 * sb], c[ic + 2 * sc], d[id + 2 * sd], u, v), + a[ia + 3 * sa] = mixBilinear(a[ia + 3 * sa], b[ib + 3 * sb], c[ic + 3 * sc], d[id + 3 * sd], u, v), a ); @@ -196,18 +192,18 @@ export const clamp4 = (a: Vec, min: ReadonlyVec, max: ReadonlyVec, ia = 0, imin max4(min4(a, max, ia, imax, sa, smax), min, ia, imin, sa, smin); export const step4 = (a: Vec, e: ReadonlyVec, ia = 0, ie = 0, sa = 1, se = 1) => ( - a[ia] = step1(e[ie], a[ia]), - a[ia + sa] = step1(e[ie + se], a[ia + sa]), - a[ia + 2 * sa] = step1(e[ie + 2 * se], a[ia + 2 * sa]), - a[ia + 3 * sa] = step1(e[ie + 3 * se], a[ia + 3 * sa]), + a[ia] = step(e[ie], a[ia]), + a[ia + sa] = step(e[ie + se], a[ia + sa]), + a[ia + 2 * sa] = step(e[ie + 2 * se], a[ia + 2 * sa]), + a[ia + 3 * sa] = step(e[ie + 3 * se], a[ia + 3 * sa]), a ); export const smoothStep4 = (a: Vec, e1: ReadonlyVec, e2: ReadonlyVec, ia = 0, ie1 = 0, ie2 = 0, sa = 1, se1 = 1, se2 = 1) => ( - a[ia] = smoothStep1(e1[ie1], e2[ie2], a[ia]), - a[ia + sa] = smoothStep1(e1[ie1 + se1], e2[ie2 + se2], a[ia + sa]), - a[ia + 2 * sa] = smoothStep1(e1[ie1 + 2 * se1], e2[ie2 + 2 * se2], a[ia + 2 * sa]), - a[ia + 3 * sa] = smoothStep1(e1[ie1 + 3 * se1], e2[ie2 + 2 * se2], a[ia + 3 * sa]), + a[ia] = smoothStep(e1[ie1], e2[ie2], a[ia]), + a[ia + sa] = smoothStep(e1[ie1 + se1], e2[ie2 + se2], a[ia + sa]), + a[ia + 2 * sa] = smoothStep(e1[ie1 + 2 * se1], e2[ie2 + 2 * se2], a[ia + 2 * sa]), + a[ia + 3 * sa] = smoothStep(e1[ie1 + 3 * se1], e2[ie2 + 2 * se2], a[ia + 3 * sa]), a ); From ffea836f56ecdfca269e0fe83e62a0c0aff320fa Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 02:54:02 +0100 Subject: [PATCH 71/77] refactor(geom): update deps & @thi.ng/math imports --- packages/geom/package.json | 1 + packages/geom/src/arc2.ts | 14 +++++--------- packages/geom/src/bezier2.ts | 8 ++++---- packages/geom/src/circle2.ts | 5 +++-- packages/geom/src/internal/circumcenter.ts | 2 +- packages/geom/src/internal/corner.ts | 7 ++++--- .../src/internal/douglas\342\200\223peucker.ts" | 2 +- packages/geom/src/internal/eq-delta.ts | 2 +- packages/geom/src/internal/liang-barsky.ts | 2 +- packages/geom/src/path2.ts | 5 +++-- packages/geom/src/polygon2.ts | 2 +- packages/geom/src/sampler.ts | 4 ++-- packages/geom/src/triangle2.ts | 2 +- packages/geom/test/circle2.ts | 2 +- 14 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/geom/package.json b/packages/geom/package.json index de2f784d71..0df5f212f4 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -30,6 +30,7 @@ "dependencies": { "@thi.ng/api": "^4.2.1", "@thi.ng/checks": "^1.5.11", + "@thi.ng/math": "^0.0.1", "@thi.ng/transducers": "^2.1.6", "@thi.ng/vectors": "^1.3.0" }, diff --git a/packages/geom/src/arc2.ts b/packages/geom/src/arc2.ts index 016cb01885..6622b9f0ba 100644 --- a/packages/geom/src/arc2.ts +++ b/packages/geom/src/arc2.ts @@ -1,19 +1,15 @@ import { ICopy } from "@thi.ng/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { HALF_PI, PI, TAU } from "@thi.ng/math/api"; +import { inRange } from "@thi.ng/math/interval"; +import { mix } from "@thi.ng/math/mix"; import { range } from "@thi.ng/transducers/iter/range"; import { push } from "@thi.ng/transducers/rfn/push"; import { transduce } from "@thi.ng/transducers/transduce"; import { filter } from "@thi.ng/transducers/xform/filter"; import { map } from "@thi.ng/transducers/xform/map"; import { Vec } from "@thi.ng/vectors/api"; -import { - HALF_PI, - inRange1, - mix1, - PI, - TAU -} from "@thi.ng/vectors/math"; import { add2, asVec2, @@ -159,7 +155,7 @@ export class Arc2 implements this.end, // multiples of HALF_PI in arc range ...filter( - (t: number) => inRange1(t, this.start, this.end), + (t: number) => inRange(t, this.start, this.end), range(-3 * PI, 3.01 * PI, HALF_PI) ) ] @@ -176,7 +172,7 @@ export class Arc2 implements } pointAt(t: number) { - return this.pointAtTheta(mix1(this.start, this.end, t)); + return this.pointAtTheta(mix(this.start, this.end, t)); } pointAtTheta(theta: number) { diff --git a/packages/geom/src/bezier2.ts b/packages/geom/src/bezier2.ts index 06cf8aede0..4af770b8ea 100644 --- a/packages/geom/src/bezier2.ts +++ b/packages/geom/src/bezier2.ts @@ -2,7 +2,7 @@ import { ICopy } from "@thi.ng/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; import { IMath, ReadonlyVec, Vec } from "@thi.ng/vectors/api"; -import { clamp1 } from "@thi.ng/vectors/math"; +import { clamp01 } from "@thi.ng/math/interval"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, @@ -30,7 +30,7 @@ export const mixCubic1 = (a: number, b: number, c: number, d: number, t: number) export const mixQuadratic = & IMath>(a: T, b: T, c: T, t: number) => { const s = 1 - t; - return a.copy().mulN(s * s) + return a.mulNewN(s * s) .maddN(b, 2 * s * t) .maddN(c, t * t); }; @@ -39,7 +39,7 @@ export const mixCubic = & IMath>(a: T, b: T, c: T, d: T, const t2 = t * t; const s = 1 - t; const s2 = s * s; - return a.copy().mulN(s2 * s) + return a.mulNewN(s2 * s) .maddN(b, 3 * s2 * t) .maddN(c, 3 * t2 * s) .maddN(d, t2 * t); @@ -194,7 +194,7 @@ export class Quadratic2 extends PointContainer2 implements const mi = a.copy().min(c); const ma = a.copy().max(c); const solve = (a, b, c) => { - const t = clamp1((a - b) / (a - 2.0 * b + c), 0, 1); + const t = clamp01((a - b) / (a - 2.0 * b + c)); const s = 1 - t; return s * s * a + 2.0 * s * t * b + t * t * c; }; diff --git a/packages/geom/src/circle2.ts b/packages/geom/src/circle2.ts index 5b03d3eb17..edbec805e1 100644 --- a/packages/geom/src/circle2.ts +++ b/packages/geom/src/circle2.ts @@ -2,8 +2,9 @@ import { IToHiccup } from "@thi.ng/api/api"; import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { PI, TAU } from "@thi.ng/math/api"; +import { eqDelta } from "@thi.ng/math/eqdelta"; import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; -import { eqDelta1, PI, TAU } from "@thi.ng/vectors/math"; import { asVec2, setS2, @@ -137,7 +138,7 @@ export class Circle2 implements classifyPoint(p: Readonly) { const d = p.distSq(this.pos); const r = this.r * this.r; - return eqDelta1(d, r) ? 0 : d < r ? 1 : -1; + return eqDelta(d, r) ? 0 : d < r ? 1 : -1; } pointInside(p: Readonly) { diff --git a/packages/geom/src/internal/circumcenter.ts b/packages/geom/src/internal/circumcenter.ts index 944b32b19b..65517cf648 100644 --- a/packages/geom/src/internal/circumcenter.ts +++ b/packages/geom/src/internal/circumcenter.ts @@ -1,5 +1,5 @@ +import { EPS } from "@thi.ng/math/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; -import { EPS } from "@thi.ng/vectors/math"; export const circumCenter = (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => { diff --git a/packages/geom/src/internal/corner.ts b/packages/geom/src/internal/corner.ts index 4a03bab242..8bf3274009 100644 --- a/packages/geom/src/internal/corner.ts +++ b/packages/geom/src/internal/corner.ts @@ -1,4 +1,5 @@ -import { EPS, sign1 } from "@thi.ng/vectors/math"; +import { sign } from "@thi.ng/math/abs"; +import { EPS } from "@thi.ng/math/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; export const corner = @@ -10,7 +11,7 @@ export const corner = export const classify = (a: Readonly, b: Readonly, c: Readonly, eps = EPS) => - sign1(corner(a, b, c), eps); + sign(corner(a, b, c), eps); export const clockwise2 = (a: Readonly, b: Readonly, c: Readonly) => @@ -19,7 +20,7 @@ export const clockwise2 = export const classifyPointInTriangle2 = (p: Readonly, a: Readonly, b: Readonly, c: Readonly) => { const s = clockwise2(a, b, c) ? 1 : -1; - return sign1( + return sign( Math.min( s * corner(a, c, p), s * corner(b, a, p), diff --git "a/packages/geom/src/internal/douglas\342\200\223peucker.ts" "b/packages/geom/src/internal/douglas\342\200\223peucker.ts" index 47ba3f1336..b2a7061dc1 100644 --- "a/packages/geom/src/internal/douglas\342\200\223peucker.ts" +++ "b/packages/geom/src/internal/douglas\342\200\223peucker.ts" @@ -1,6 +1,6 @@ +import { peek } from "@thi.ng/transducers/func/peek"; import { IVector } from "@thi.ng/vectors/api"; import { farthestPointSegment } from "./closest-point"; -import { peek } from "@thi.ng/transducers/func/peek"; // https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm diff --git a/packages/geom/src/internal/eq-delta.ts b/packages/geom/src/internal/eq-delta.ts index 3f62634e13..657aea90b1 100644 --- a/packages/geom/src/internal/eq-delta.ts +++ b/packages/geom/src/internal/eq-delta.ts @@ -1,5 +1,5 @@ +import { EPS } from "@thi.ng/math/api"; import { IVector } from "@thi.ng/vectors/api"; -import { EPS } from "@thi.ng/vectors/math"; export const containsDelta = >(pts: Iterable, q: Readonly, eps = EPS) => { for (let p of pts) { diff --git a/packages/geom/src/internal/liang-barsky.ts b/packages/geom/src/internal/liang-barsky.ts index 7885d72c4e..9106f6faf3 100644 --- a/packages/geom/src/internal/liang-barsky.ts +++ b/packages/geom/src/internal/liang-barsky.ts @@ -1,4 +1,4 @@ -import { EPS } from "@thi.ng/vectors/math"; +import { EPS } from "@thi.ng/math/api"; import { Vec2 } from "@thi.ng/vectors/vec2"; // https://en.wikipedia.org/wiki/Liang%E2%80%93Barsky_algorithm diff --git a/packages/geom/src/path2.ts b/packages/geom/src/path2.ts index 0ef55cdd97..eedf1c3ab1 100644 --- a/packages/geom/src/path2.ts +++ b/packages/geom/src/path2.ts @@ -1,7 +1,8 @@ import { isNumber } from "@thi.ng/checks/is-number"; +import { rad } from "@thi.ng/math/angle"; +import { eqDelta } from "@thi.ng/math/eqdelta"; import { ensureArray } from "@thi.ng/transducers/func/ensure-array"; import { peek } from "@thi.ng/transducers/func/peek"; -import { eqDelta1, rad } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, @@ -372,7 +373,7 @@ export class PathBuilder { } arcTo(p: Vec2, r: Vec2, xaxis: number, xl: boolean, clockwise: boolean, relative = false) { - if (eqDelta1(r.x, 0) || eqDelta1(r.y, 0)) { + if (eqDelta(r.x, 0) || eqDelta(r.y, 0)) { return this.lineTo(p, relative); } const prev = this.currP.copy(); diff --git a/packages/geom/src/polygon2.ts b/packages/geom/src/polygon2.ts index 097f2c2290..3fbb535288 100644 --- a/packages/geom/src/polygon2.ts +++ b/packages/geom/src/polygon2.ts @@ -1,6 +1,7 @@ import { ICopy, IToHiccup } from "@thi.ng/api/api"; import { isNumber } from "@thi.ng/checks/is-number"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { TAU } from "@thi.ng/math/api"; import { cycle } from "@thi.ng/transducers/iter/cycle"; import { normRange } from "@thi.ng/transducers/iter/norm-range"; import { tuples } from "@thi.ng/transducers/iter/tuples"; @@ -8,7 +9,6 @@ import { push } from "@thi.ng/transducers/rfn/push"; import { transduce } from "@thi.ng/transducers/transduce"; import { map } from "@thi.ng/transducers/xform/map"; import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; -import { TAU } from "@thi.ng/vectors/math"; import { asVec2, toCartesian2, Vec2 } from "@thi.ng/vectors/vec2"; import { Attribs, diff --git a/packages/geom/src/sampler.ts b/packages/geom/src/sampler.ts index 3ec4c15a39..2f6a6a3c18 100644 --- a/packages/geom/src/sampler.ts +++ b/packages/geom/src/sampler.ts @@ -32,7 +32,7 @@ export class Sampler> { const t0 = t * idx[n]; for (let i = 1; i <= n; i++) { if (idx[i] >= t0) { - return pts[i - 1].copy().mixN(pts[i], (t0 - idx[i - 1]) / (idx[i] - idx[i - 1])); + return pts[i - 1].mixNewN(pts[i], (t0 - idx[i - 1]) / (idx[i] - idx[i - 1])); } } } @@ -47,7 +47,7 @@ export class Sampler> { while (ct >= index[i] && i < n) { i++; } if (i >= n) break; const p = index[i - 1]; - result.push(this.points[i - 1].copy().mixN(this.points[i], (ct - p) / (index[i] - p))); + result.push(this.points[i - 1].mixNewN(this.points[i], (ct - p) / (index[i] - p))); } if (includeLast) { result.push(this.points[this.points.length - 1].copy()); diff --git a/packages/geom/src/triangle2.ts b/packages/geom/src/triangle2.ts index 12ce12507a..faa20596c1 100644 --- a/packages/geom/src/triangle2.ts +++ b/packages/geom/src/triangle2.ts @@ -1,6 +1,6 @@ import { ICopy } from "@thi.ng/api"; +import { PI } from "@thi.ng/math/api"; import { ReadonlyVec, Vec } from "@thi.ng/vectors/api"; -import { PI } from "@thi.ng/vectors/math"; import { Vec2 } from "@thi.ng/vectors/vec2"; import { Vec3 } from "@thi.ng/vectors/vec3"; import { diff --git a/packages/geom/test/circle2.ts b/packages/geom/test/circle2.ts index 6910fd5505..4ab293f658 100644 --- a/packages/geom/test/circle2.ts +++ b/packages/geom/test/circle2.ts @@ -1,5 +1,5 @@ import { equiv } from "@thi.ng/equiv"; -import { PI, TAU, HALF_PI } from "@thi.ng/vectors/math"; +import { PI, TAU, HALF_PI } from "@thi.ng/math/api"; import { eqDelta2array, vec2 } from "@thi.ng/vectors/vec2"; import * as assert from "assert"; import { circle2, Circle2, HiccupCircle2 } from "../src"; From 83ef61a1ced80731113fc079043a0ba36448ebb1 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 03:16:54 +0100 Subject: [PATCH 72/77] docs(geom): update readme, add/move assets --- assets/geom-tessel.svg | 1 - assets/geom/chaikin-closed.svg | 72 ++++++++++++++++++++++++++++++++++ assets/geom/chaikin-open.svg | 58 +++++++++++++++++++++++++++ assets/geom/tessel.svg | 1 + packages/geom/README.md | 17 +++++++- 5 files changed, 147 insertions(+), 2 deletions(-) delete mode 100644 assets/geom-tessel.svg create mode 100644 assets/geom/chaikin-closed.svg create mode 100644 assets/geom/chaikin-open.svg create mode 100644 assets/geom/tessel.svg diff --git a/assets/geom-tessel.svg b/assets/geom-tessel.svg deleted file mode 100644 index ba3ed411ad..0000000000 --- a/assets/geom-tessel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/geom/chaikin-closed.svg b/assets/geom/chaikin-closed.svg new file mode 100644 index 0000000000..c439bcea88 --- /dev/null +++ b/assets/geom/chaikin-closed.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/geom/chaikin-open.svg b/assets/geom/chaikin-open.svg new file mode 100644 index 0000000000..04c207342d --- /dev/null +++ b/assets/geom/chaikin-open.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/geom/tessel.svg b/assets/geom/tessel.svg new file mode 100644 index 0000000000..ca7ab57ab7 --- /dev/null +++ b/assets/geom/tessel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/geom/README.md b/packages/geom/README.md index 57ab6a0a85..7107802064 100644 --- a/packages/geom/README.md +++ b/packages/geom/README.md @@ -11,6 +11,8 @@ This project is part of the - [Status](#status) - [Installation](#installation) - [Usage examples](#usage-examples) + - [Tessellations](#tessellations) + - [Subdivision curves](#subdivision-curves) - [Authors](#authors) - [License](#license) @@ -36,7 +38,9 @@ yarn add @thi.ng/geom ## Usage examples -![sample output](../../assets/geom-tessel.svg) +### Tessellations + +![sample output](../../assets/geom/tessel.svg) ```ts import * as g from "@thi.ng/geom"; @@ -74,6 +78,17 @@ fs.writeFileSync( ); ``` +### Subdivision curves + +| Chaikin (closed) | Chaikin (open) | +|---------------------------------------------------------|-----------------------------------------------------| +| ![chaikin closed](../../assets/geom/chaikin-closed.svg) | ![chaikin open](../../assets/geom/chaikin-open.svg) | + +```ts +g.polygon2([-100,-100, 0,100, 100,-100, 0,0]).subdivide(g.CHAIKIN_CLOSED, 4); +g.polyline2([-100,100, -100,-100, 0,0, 100,-100, 100,100]).subdivide(g.CHAIKIN_OPEN, 4); +``` + ## Authors - Karsten Schmidt From 10cf5646130a664c88efc786cb66ef2ac347fd18 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 03:20:24 +0100 Subject: [PATCH 73/77] build: update gitignore & yarn.lock --- .gitignore | 5 + yarn.lock | 1701 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 1446 insertions(+), 260 deletions(-) diff --git a/.gitignore b/.gitignore index 0ff6e4f073..73fe25942e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,12 @@ build dev doc docs +export examples/dataflow-scenegraph examples/hdc examples/hdom-class +examples/hdom-clj +examples/ts-parse .DS_Store tachyons.min.css bundle.* @@ -18,3 +21,5 @@ bundle.* *.bak* *.zip /.gtm/ + +packages/geom-accel diff --git a/yarn.lock b/yarn.lock index 066ff2d670..d97d9820b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,18 +5,21 @@ "@babel/code-frame@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz#bd71d9b192af978df915829d39d4094456439a0c" + integrity sha1-vXHZsZKvl435FYKdOdQJRFZDmgw= dependencies: "@babel/highlight" "7.0.0-beta.51" "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: "@babel/highlight" "^7.0.0" "@babel/core@^7.0.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.2.tgz#f8d2a9ceb6832887329a7b60f9d035791400ba4e" + integrity sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw== dependencies: "@babel/code-frame" "^7.0.0" "@babel/generator" "^7.1.2" @@ -36,6 +39,7 @@ "@babel/generator@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.51.tgz#6c7575ffde761d07485e04baedc0392c6d9e30f6" + integrity sha1-bHV1/952HQdIXgS67cA5LG2eMPY= dependencies: "@babel/types" "7.0.0-beta.51" jsesc "^2.5.1" @@ -43,11 +47,12 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.0.0", "@babel/generator@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.2.tgz#fde75c072575ce7abbd97322e8fef5bae67e4630" +"@babel/generator@^7.0.0", "@babel/generator@^7.1.2", "@babel/generator@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" + integrity sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ== dependencies: - "@babel/types" "^7.1.2" + "@babel/types" "^7.1.3" jsesc "^2.5.1" lodash "^4.17.10" source-map "^0.5.0" @@ -56,12 +61,14 @@ "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== dependencies: "@babel/types" "^7.0.0" "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== dependencies: "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" @@ -69,6 +76,7 @@ "@babel/helper-builder-react-jsx@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" + integrity sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw== dependencies: "@babel/types" "^7.0.0" esutils "^2.0.0" @@ -76,6 +84,7 @@ "@babel/helper-call-delegate@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== dependencies: "@babel/helper-hoist-variables" "^7.0.0" "@babel/traverse" "^7.1.0" @@ -84,6 +93,7 @@ "@babel/helper-define-map@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/types" "^7.0.0" @@ -92,6 +102,7 @@ "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== dependencies: "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" @@ -99,6 +110,7 @@ "@babel/helper-function-name@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz#21b4874a227cf99ecafcc30a90302da5a2640561" + integrity sha1-IbSHSiJ8+Z7K/MMKkDAtpaJkBWE= dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.51" "@babel/template" "7.0.0-beta.51" @@ -107,6 +119,7 @@ "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== dependencies: "@babel/helper-get-function-arity" "^7.0.0" "@babel/template" "^7.1.0" @@ -115,36 +128,42 @@ "@babel/helper-get-function-arity@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz#3281b2d045af95c172ce91b20825d85ea4676411" + integrity sha1-MoGy0EWvlcFyzpGyCCXYXqRnZBE= dependencies: "@babel/types" "7.0.0-beta.51" "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== dependencies: "@babel/types" "^7.0.0" "@babel/helper-hoist-variables@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== dependencies: "@babel/types" "^7.0.0" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== dependencies: "@babel/types" "^7.0.0" "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== dependencies: "@babel/types" "^7.0.0" "@babel/helper-module-transforms@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" + integrity sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" @@ -156,22 +175,26 @@ "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== dependencies: "@babel/types" "^7.0.0" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== "@babel/helper-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== dependencies: lodash "^4.17.10" "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-wrap-function" "^7.1.0" @@ -182,6 +205,7 @@ "@babel/helper-replace-supers@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + integrity sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" @@ -191,6 +215,7 @@ "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== dependencies: "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" @@ -198,18 +223,21 @@ "@babel/helper-split-export-declaration@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz#8a6c3f66c4d265352fc077484f9f6e80a51ab978" + integrity sha1-imw/ZsTSZTUvwHdIT59ugKUauXg= dependencies: "@babel/types" "7.0.0-beta.51" "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== dependencies: "@babel/types" "^7.0.0" "@babel/helper-wrap-function@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + integrity sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/template" "^7.1.0" @@ -219,6 +247,7 @@ "@babel/helpers@^7.1.2": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.2.tgz#ab752e8c35ef7d39987df4e8586c63b8846234b5" + integrity sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA== dependencies: "@babel/template" "^7.1.2" "@babel/traverse" "^7.1.0" @@ -227,6 +256,7 @@ "@babel/highlight@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.51.tgz#e8844ae25a1595ccfd42b89623b4376ca06d225d" + integrity sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0= dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -235,6 +265,7 @@ "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -243,14 +274,17 @@ "@babel/parser@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.51.tgz#27cec2df409df60af58270ed8f6aa55409ea86f6" + integrity sha1-J87C30Cd9gr1gnDtj2qlVAnqhvY= -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.2.tgz#85c5c47af6d244fab77bce6b9bd830e38c978409" +"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" + integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== "@babel/plugin-proposal-async-generator-functions@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" + integrity sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" @@ -259,6 +293,7 @@ "@babel/plugin-proposal-json-strings@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + integrity sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.0.0" @@ -266,6 +301,7 @@ "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + integrity sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.0.0" @@ -273,6 +309,7 @@ "@babel/plugin-proposal-optional-catch-binding@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + integrity sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" @@ -280,6 +317,7 @@ "@babel/plugin-proposal-unicode-property-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + integrity sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" @@ -288,48 +326,56 @@ "@babel/plugin-syntax-async-generators@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + integrity sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0.tgz#70638aeaad9ee426bc532e51523cff8ff02f6f17" + integrity sha512-zGcuZWiWWDa5qTZ6iAnpG0fnX/GOu49pGR5PFvkQ9GmKNaSphXQnlNXh/LG20sqWtNrx/eB6krzfEzcwvUyeFA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + integrity sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" + integrity sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + integrity sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + integrity sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-arrow-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + integrity sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-async-to-generator@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" + integrity sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -338,12 +384,14 @@ "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + integrity sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-block-scoping@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" + integrity sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.10" @@ -351,6 +399,7 @@ "@babel/plugin-transform-classes@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" + integrity sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-define-map" "^7.1.0" @@ -364,18 +413,21 @@ "@babel/plugin-transform-computed-properties@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + integrity sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-destructuring@^7.0.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.2.tgz#5fa77d473f5a0a3f5266ad7ce2e8c995a164d60a" + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz#e69ff50ca01fac6cb72863c544e516c2b193012f" + integrity sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-dotall-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + integrity sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" @@ -384,12 +436,14 @@ "@babel/plugin-transform-duplicate-keys@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" + integrity sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-exponentiation-operator@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" + integrity sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -397,6 +451,7 @@ "@babel/plugin-transform-flow-strip-types@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0.tgz#c40ced34c2783985d90d9f9ac77a13e6fb396a01" + integrity sha512-WhXUNb4It5a19RsgKKbQPrjmy4yWOY1KynpEbNw7bnd1QTcrT/EIl3MJvnGgpgvrKyKbqX7nUNOJfkpLOnoDKA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow" "^7.0.0" @@ -404,12 +459,14 @@ "@babel/plugin-transform-for-of@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + integrity sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" + integrity sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -417,12 +474,14 @@ "@babel/plugin-transform-literals@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + integrity sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-modules-amd@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" + integrity sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -430,14 +489,16 @@ "@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" + integrity sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" "@babel/plugin-transform-modules-systemjs@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.1.3.tgz#2119a3e3db612fd74a19d88652efbfe9613a5db0" + integrity sha512-PvTxgjxQAq4pvVUZF3mD5gEtVDuId8NtWkJsZLEJZMZAW3TvgQl1pmydLLN1bM8huHFVVU43lf0uvjQj9FRkKw== dependencies: "@babel/helper-hoist-variables" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -445,6 +506,7 @@ "@babel/plugin-transform-modules-umd@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" + integrity sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -452,12 +514,14 @@ "@babel/plugin-transform-new-target@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-object-super@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" + integrity sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" @@ -465,6 +529,7 @@ "@babel/plugin-transform-parameters@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" + integrity sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw== dependencies: "@babel/helper-call-delegate" "^7.1.0" "@babel/helper-get-function-arity" "^7.0.0" @@ -473,6 +538,7 @@ "@babel/plugin-transform-react-jsx@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" + integrity sha512-0TMP21hXsSUjIQJmu/r7RiVxeFrXRcMUigbKu0BLegJK9PkYodHstaszcig7zxXfaBji2LYUdtqIkHs+hgYkJQ== dependencies: "@babel/helper-builder-react-jsx" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -481,24 +547,28 @@ "@babel/plugin-transform-regenerator@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== dependencies: regenerator-transform "^0.13.3" "@babel/plugin-transform-shorthand-properties@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + integrity sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-spread@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + integrity sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-sticky-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + integrity sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" @@ -506,6 +576,7 @@ "@babel/plugin-transform-template-literals@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + integrity sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -513,12 +584,14 @@ "@babel/plugin-transform-typeof-symbol@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + integrity sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-unicode-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + integrity sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" @@ -527,6 +600,7 @@ "@babel/preset-env@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11" + integrity sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -573,12 +647,14 @@ "@babel/runtime@^7.0.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" + integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg== dependencies: regenerator-runtime "^0.12.0" "@babel/template@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.51.tgz#9602a40aebcf357ae9677e2532ef5fc810f5fbff" + integrity sha1-lgKkCuvPNXrpZ34lMu9fyBD1+/8= dependencies: "@babel/code-frame" "7.0.0-beta.51" "@babel/parser" "7.0.0-beta.51" @@ -588,6 +664,7 @@ "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== dependencies: "@babel/code-frame" "^7.0.0" "@babel/parser" "^7.1.2" @@ -596,6 +673,7 @@ "@babel/traverse@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.51.tgz#981daf2cec347a6231d3aa1d9e1803b03aaaa4a8" + integrity sha1-mB2vLOw0emIx06odnhgDsDqqpKg= dependencies: "@babel/code-frame" "7.0.0-beta.51" "@babel/generator" "7.0.0-beta.51" @@ -609,15 +687,16 @@ lodash "^4.17.5" "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" + version "7.1.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4" + integrity sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" + "@babel/generator" "^7.1.3" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.1.3" + "@babel/types" "^7.1.3" debug "^3.1.0" globals "^11.1.0" lodash "^4.17.10" @@ -625,27 +704,30 @@ "@babel/types@7.0.0-beta.51": version "7.0.0-beta.51" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.51.tgz#d802b7b543b5836c778aa691797abf00f3d97ea9" + integrity sha1-2AK3tUO1g2x3iqaReXq/APPZfqk= dependencies: esutils "^2.0.2" lodash "^4.17.5" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.2.tgz#183e7952cf6691628afdc2e2b90d03240bac80c0" +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" + integrity sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA== dependencies: esutils "^2.0.2" lodash "^4.17.10" to-fast-properties "^2.0.0" -"@lerna/add@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.3.2.tgz#767a879ecb117be06414e7e76d4d93bb9934fa57" +"@lerna/add@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.4.1.tgz#d41068317e30f530df48220d256b5e79690b1877" + integrity sha512-Vf54B42jlD6G52qnv/cAGH70cVQIa+LX//lfsbkxHvzkhIqBl5J4KsnTOPkA9uq3R+zP58ayicCHB9ReiEWGJg== dependencies: - "@lerna/bootstrap" "^3.3.2" + "@lerna/bootstrap" "^3.4.1" "@lerna/command" "^3.3.0" "@lerna/filter-options" "^3.3.2" - "@lerna/npm-conf" "^3.0.0" + "@lerna/npm-conf" "^3.4.1" "@lerna/validation-error" "^3.0.0" dedent "^0.7.0" npm-package-arg "^6.0.0" @@ -656,23 +738,25 @@ "@lerna/batch-packages@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@lerna/batch-packages/-/batch-packages-3.1.2.tgz#74b5312a01a8916204cbc71237ffbe93144b99df" + integrity sha512-HAkpptrYeUVlBYbLScXgeCgk6BsNVXxDd53HVWgzzTWpXV4MHpbpeKrByyt7viXlNhW0w73jJbipb/QlFsHIhQ== dependencies: "@lerna/package-graph" "^3.1.2" "@lerna/validation-error" "^3.0.0" npmlog "^4.1.2" -"@lerna/bootstrap@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.3.2.tgz#01e894295dea89dcc0c62ee188f49f78873e08c9" +"@lerna/bootstrap@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.4.1.tgz#10635e9b547fb7d685949ac78e0923f73da2f52a" + integrity sha512-yZDJgNm/KDoRH2klzmQGmpWMg/XMzWgeWvauXkrfW/mj1wwmufOuh5pN4fBFxVmUUa/RFZdfMeaaJt3+W3PPBw== dependencies: "@lerna/batch-packages" "^3.1.2" "@lerna/command" "^3.3.0" "@lerna/filter-options" "^3.3.2" "@lerna/has-npm-version" "^3.3.0" - "@lerna/npm-conf" "^3.0.0" + "@lerna/npm-conf" "^3.4.1" "@lerna/npm-install" "^3.3.0" "@lerna/rimraf-dir" "^3.3.0" - "@lerna/run-lifecycle" "^3.3.1" + "@lerna/run-lifecycle" "^3.4.1" "@lerna/run-parallel-batches" "^3.0.0" "@lerna/symlink-binary" "^3.3.0" "@lerna/symlink-dependencies" "^3.3.0" @@ -689,19 +773,21 @@ read-package-tree "^5.1.6" semver "^5.5.0" -"@lerna/changed@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.3.2.tgz#679c9fd353a82d00e2a27847c79f061d5abdea67" +"@lerna/changed@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.4.1.tgz#84a049359a53b8812c3a07a664bd41b1768f5938" + integrity sha512-gT7fhl4zQWyGETDO4Yy5wsFnqNlBSsezncS1nkMW1uO6jwnolwYqcr1KbrMR8HdmsZBn/00Y0mRnbtbpPPey8w== dependencies: "@lerna/collect-updates" "^3.3.2" "@lerna/command" "^3.3.0" "@lerna/listable" "^3.0.0" "@lerna/output" "^3.0.0" - "@lerna/version" "^3.3.2" + "@lerna/version" "^3.4.1" "@lerna/check-working-tree@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.3.0.tgz#2118f301f28ccb530812e5b27a341b1e6b3c84e2" + integrity sha512-oeEP1dNhiiKUaO0pmcIi73YXJpaD0n5JczNctvVNZ8fGZmrALZtEnmC28o6Z7JgQaqq5nd2kO7xbnjoitrC51g== dependencies: "@lerna/describe-ref" "^3.3.0" "@lerna/validation-error" "^3.0.0" @@ -709,6 +795,7 @@ "@lerna/child-process@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.3.0.tgz#71184a763105b6c8ece27f43f166498d90fe680f" + integrity sha512-q2d/OPlNX/cBXB6Iz1932RFzOmOHq6ZzPjqebkINNaTojHWuuRpvJJY4Uz3NGpJ3kEtPDvBemkZqUBTSO5wb1g== dependencies: chalk "^2.3.1" execa "^1.0.0" @@ -717,6 +804,7 @@ "@lerna/clean@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.3.2.tgz#9a7e8a1e400e580de260fa124945b2939a025069" + integrity sha512-mvqusgSp2ou5SGqQgTEoTvGJpGfH4+L6XSeN+Ims+eNFGXuMazmKCf+rz2PZBMFufaHJ/Os+JF0vPCcWI1Fzqg== dependencies: "@lerna/command" "^3.3.0" "@lerna/filter-options" "^3.3.2" @@ -729,6 +817,7 @@ "@lerna/cli@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.2.0.tgz#3ed25bcbc0b8f0878bc6a102ee0296f01476cfdf" + integrity sha512-JdbLyTxHqxUlrkI+Ke+ltXbtyA+MPu9zR6kg/n8Fl6uaez/2fZWtReXzYi8MgLxfUFa7+1OHWJv4eAMZlByJ+Q== dependencies: "@lerna/global-options" "^3.1.3" dedent "^0.7.0" @@ -738,6 +827,7 @@ "@lerna/collect-updates@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.3.2.tgz#54df5ce59ca05e8aa04ff8a9299f89cc253a9304" + integrity sha512-9WyBJI2S5sYgEZEScu525Lbi6nknNrdBKop35sCDIC9y6AIGvH6Dr5tkTd+Kg3n1dE+kHwW/xjERkx3+h7th3w== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/describe-ref" "^3.3.0" @@ -748,6 +838,7 @@ "@lerna/command@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.3.0.tgz#e81c4716a676b02dbe9d3f548d5f45b4ba32c25a" + integrity sha512-NTOkLEKlWcBLHSvUr9tzVpV7RJ4GROLeOuZ6RfztGOW/31JPSwVVBD2kPifEXNZunldOx5GVWukR+7+NpAWhsg== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/package-graph" "^3.1.2" @@ -760,15 +851,15 @@ lodash "^4.17.5" npmlog "^4.1.2" -"@lerna/conventional-commits@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.3.0.tgz#68302b6ca58b3ab7e91807664deeda2eac025ab0" +"@lerna/conventional-commits@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.4.1.tgz#0b47f9fc0c4a10951883e949d939188da1b527bc" + integrity sha512-3NETrA58aUkaEW3RdwdJ766Bg9NVpLzb26mtdlsJQcvB5sQBWH5dJSHIVQH1QsGloBeH2pE/mDUEVY8ZJXuR4w== dependencies: "@lerna/validation-error" "^3.0.0" - conventional-changelog-angular "^1.6.6" - conventional-changelog-core "^2.0.5" - conventional-recommended-bump "^2.0.6" - dedent "^0.7.0" + conventional-changelog-angular "^5.0.1" + conventional-changelog-core "^3.1.0" + conventional-recommended-bump "^4.0.1" fs-extra "^7.0.0" get-stream "^4.0.0" npm-package-arg "^6.0.0" @@ -778,18 +869,20 @@ "@lerna/create-symlink@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.3.0.tgz#91de00fd576018ba4251f0c6a5b4b7f768f22a82" + integrity sha512-0lb88Nnq1c/GG+fwybuReOnw3+ah4dB81PuWwWwuqUNPE0n50qUf/M/7FfSb5JEh/93fcdbZI0La8t3iysNW1w== dependencies: cmd-shim "^2.0.2" fs-extra "^7.0.0" npmlog "^4.1.2" -"@lerna/create@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.3.1.tgz#cfd7e0cb30d1f45133691165e103d26318d90ebf" +"@lerna/create@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.4.1.tgz#7cad78a5701d7666a0f5d0fe0e325acd8d8f5b63" + integrity sha512-l+4t2SRO5nvW0MNYY+EWxbaMHsAN8bkWH3nyt7EzhBjs4+TlRAJRIEqd8o9NWznheE3pzwczFz1Qfl3BWbyM5A== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/command" "^3.3.0" - "@lerna/npm-conf" "^3.0.0" + "@lerna/npm-conf" "^3.4.1" "@lerna/validation-error" "^3.0.0" camelcase "^4.1.0" dedent "^0.7.0" @@ -807,6 +900,7 @@ "@lerna/describe-ref@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.3.0.tgz#d373adb530d5428ab91e303ccbfcf51a98374a3a" + integrity sha512-4t7M4OupnYMSPNLrLUau8qkS+dgLEi4w+DkRkV0+A+KNYga1W0jVgNLPIIsxta7OHfodPkCNAqZCzNCw/dmAwA== dependencies: "@lerna/child-process" "^3.3.0" npmlog "^4.1.2" @@ -814,6 +908,7 @@ "@lerna/diff@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.3.0.tgz#c8130a5f508b47fad5fec81404498bc3acdf9cb5" + integrity sha512-sIoMjsm3NVxvmt6ofx8Uu/2fxgldQqLl0zmC9X1xW00j831o5hBffx1EoKj9CnmaEvoSP6j/KFjxy2RWjebCIg== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/command" "^3.3.0" @@ -823,6 +918,7 @@ "@lerna/exec@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.3.2.tgz#95ecaca617fd85abdb91e9a378ed06ec1763d665" + integrity sha512-mN6vGxNir7JOGvWLwKr3DW3LNy1ecCo2ziZj5rO9Mw5Rew3carUu1XLmhF/4judtsvXViUY+rvGIcqHe0vvb+w== dependencies: "@lerna/batch-packages" "^3.1.2" "@lerna/child-process" "^3.3.0" @@ -834,6 +930,7 @@ "@lerna/filter-options@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.3.2.tgz#ac90702b7876ff4980dcdeaeac049c433dd01773" + integrity sha512-0WHqdDgAnt5WKoByi1q+lFw8HWt5tEKP2DnLlGqWv3YFwVF5DsPRlO7xbzjY9sJgvyJtZcnkMtccdBPFhGGyIQ== dependencies: "@lerna/collect-updates" "^3.3.2" "@lerna/filter-packages" "^3.0.0" @@ -842,6 +939,7 @@ "@lerna/filter-packages@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.0.0.tgz#5eb25ad1610f3e2ab845133d1f8d7d40314e838f" + integrity sha512-zwbY1J4uRjWRZ/FgYbtVkq7I3Nduwsg2V2HwLKSzwV2vPglfGqgovYOVkND6/xqe2BHwDX4IyA2+e7OJmLaLSA== dependencies: "@lerna/validation-error" "^3.0.0" multimatch "^2.1.0" @@ -850,16 +948,19 @@ "@lerna/get-npm-exec-opts@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.0.0.tgz#8fc7866e8d8e9a2f2dc385287ba32eb44de8bdeb" + integrity sha512-arcYUm+4xS8J3Palhl+5rRJXnZnFHsLFKHBxznkPIxjwGQeAEw7df38uHdVjEQ+HNeFmHnBgSqfbxl1VIw5DHg== dependencies: npmlog "^4.1.2" "@lerna/global-options@^3.1.3": version "3.1.3" resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.1.3.tgz#cf85e24655a91d04d4efc9a80c1f83fc768d08ae" + integrity sha512-LVeZU/Zgc0XkHdGMRYn+EmHfDmmYNwYRv3ta59iCVFXLVp7FRFWF7oB1ss/WRa9x/pYU0o6L8as/5DomLUGASA== "@lerna/has-npm-version@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.3.0.tgz#8a73c2c437a0e1e68a19ccbd0dd3c014d4d39135" + integrity sha512-GX7omRep1eBRZHgjZLRw3MpBJSdA5gPZFz95P7rxhpvsiG384Tdrr/cKFMhm0A09yq27Tk/nuYTaZIj7HsVE6g== dependencies: "@lerna/child-process" "^3.3.0" semver "^5.5.0" @@ -867,6 +968,7 @@ "@lerna/import@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.3.1.tgz#deca8c93c9cc03c5844b975c6da9937dd7530440" + integrity sha512-2OzTQDkYKbBPpyP2iOI1sWfcvMjNLjjHjmREq/uOWJaSIk5J3Ukt71OPpcOHh4V2CBOlXidCcO+Hyb4FVIy8fw== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/command" "^3.3.0" @@ -879,6 +981,7 @@ "@lerna/init@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.3.0.tgz#998f3497da3d891867c593b808b6db4b8fc4ccb9" + integrity sha512-HvgRLkIG6nDIeAO6ix5sUVIVV+W9UMk2rSSmFT66CDOefRi7S028amiyYnFUK1QkIAaUbVUyOnYaErtbJwICuw== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/command" "^3.3.0" @@ -889,6 +992,7 @@ "@lerna/link@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.3.0.tgz#c0c05ff52d0f0c659fcf221627edfcd58e477a5c" + integrity sha512-8CeXzGL7okrsVXsy2sHXI2KuBaczw3cblAnA2+FJPUqSKMPNbUTRzeU3bOlCjYtK0LbxC4ngENJTL3jJ8RaYQQ== dependencies: "@lerna/command" "^3.3.0" "@lerna/package-graph" "^3.1.2" @@ -899,6 +1003,7 @@ "@lerna/list@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.3.2.tgz#1412b3cce2a83b1baa4ff6fb962d50b46c28ec98" + integrity sha512-XXEVy7w+i/xx8NeJmGirw4upEoEF9OfD6XPLjISNQc24VgQV+frXdVJ02QcP7Y/PkY1rdIVrOjvo3ipKVLUxaQ== dependencies: "@lerna/command" "^3.3.0" "@lerna/filter-options" "^3.3.2" @@ -908,6 +1013,7 @@ "@lerna/listable@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.0.0.tgz#27209b1382c87abdbc964220e75c247d803d4199" + integrity sha512-HX/9hyx1HLg2kpiKXIUc1EimlkK1T58aKQ7ovO7rQdTx9ForpefoMzyLnHE1n4XrUtEszcSWJIICJ/F898M6Ag== dependencies: chalk "^2.3.1" columnify "^1.5.4" @@ -915,15 +1021,17 @@ "@lerna/log-packed@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-3.0.4.tgz#6d1f6ce5ca68b9971f2a27f0ecf3c50684be174a" + integrity sha512-vVQHgMagE2wnbxhNY9nFkdu+Cx2TsyWalkJfkxbNzmo6gOCrDsxCBDj9vTEV8Q+4aWx0C0Bsc0sB2Eb8y/+ofA== dependencies: byte-size "^4.0.3" columnify "^1.5.4" has-unicode "^2.0.1" npmlog "^4.1.2" -"@lerna/npm-conf@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.0.0.tgz#7a4b8304a0ecd1e366208f656bd3d7f4dcb3b5e7" +"@lerna/npm-conf@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.4.1.tgz#859e931b0bc9a5eed86309cc09508810c1e7d121" + integrity sha512-i9G6DnbCqiAqxKx2rSXej/n14qxlV/XOebL6QZonxJKzNTB+Q2wglnhTXmfZXTPJfoqimLaY4NfAEtbOXRWOXQ== dependencies: config-chain "^1.1.11" pify "^3.0.0" @@ -931,6 +1039,7 @@ "@lerna/npm-dist-tag@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.3.0.tgz#e1c5ab67674216d901266a16846b21cc81ff6afd" + integrity sha512-EtZJXzh3w5tqXEev+EBBPrWKWWn0WgJfxm4FihfS9VgyaAW8udIVZHGkIQ3f+tBtupcAzA9Q8cQNUkGF2efwmA== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/get-npm-exec-opts" "^3.0.0" @@ -939,6 +1048,7 @@ "@lerna/npm-install@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.3.0.tgz#16d00ffd668d11b2386b3ac68bdac2cf8320e533" + integrity sha512-WoVvKdS8ltROTGSNQwo6NDq0YKnjwhvTG4li1okcN/eHKOS3tL9bxbgPx7No0wOq5DKBpdeS9KhAfee6LFAZ5g== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/get-npm-exec-opts" "^3.0.0" @@ -951,6 +1061,7 @@ "@lerna/npm-publish@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.3.1.tgz#30384665d7ee387343332ece62ca231207bbabea" + integrity sha512-bVTlWIcBL6Zpyzqvr9C7rxXYcoPw+l7IPz5eqQDNREj1R39Wj18OWB2KTJq8l7LIX7Wf4C2A1uT5hJaEf9BuvA== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/get-npm-exec-opts" "^3.0.0" @@ -963,6 +1074,7 @@ "@lerna/npm-run-script@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.3.0.tgz#3c79601c27c67121155b20e039be53130217db72" + integrity sha512-YqDguWZzp4jIomaE4aWMUP7MIAJAFvRAf6ziQLpqwoQskfWLqK5mW0CcszT1oLjhfb3cY3MMfSTFaqwbdKmICg== dependencies: "@lerna/child-process" "^3.3.0" "@lerna/get-npm-exec-opts" "^3.0.0" @@ -971,12 +1083,14 @@ "@lerna/output@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.0.0.tgz#4ed4a30ed2f311046b714b3840a090990ba3ce35" + integrity sha512-EFxnSbO0zDEVKkTKpoCUAFcZjc3gn3DwPlyTDxbeqPU7neCfxP4rA4+0a6pcOfTlRS5kLBRMx79F2TRCaMM3DA== dependencies: npmlog "^4.1.2" "@lerna/package-graph@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.1.2.tgz#b70298a3a8c82e12090da33233bf242223a38f20" + integrity sha512-9wIWb49I1IJmyjPdEVZQ13IAi9biGfH/OZHOC04U2zXGA0GLiY+B3CAx6FQvqkZ8xEGfqzmXnv3LvZ0bQfc1aQ== dependencies: "@lerna/validation-error" "^3.0.0" npm-package-arg "^6.0.0" @@ -985,6 +1099,7 @@ "@lerna/package@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.0.0.tgz#14afc9a6cb1f7f7b23c1d7c7aa81bdac7d44c0e5" + integrity sha512-djzEJxzn212wS8d9znBnlXkeRlPL7GqeAYBykAmsuq51YGvaQK67Umh5ejdO0uxexF/4r7yRwgrlRHpQs8Rfqg== dependencies: npm-package-arg "^6.0.0" write-pkg "^3.1.0" @@ -992,6 +1107,7 @@ "@lerna/project@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.0.0.tgz#4320d2a2b4080cabcf95161d9c48475217d8a545" + integrity sha512-XhDFVfqj79jG2Speggd15RpYaE8uiR25UKcQBDmumbmqvTS7xf2cvl2pq2UTvDafaJ0YwFF3xkxQZeZnFMwdkw== dependencies: "@lerna/package" "^3.0.0" "@lerna/validation-error" "^3.0.0" @@ -1009,13 +1125,15 @@ "@lerna/prompt@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.3.1.tgz#ec53f9034a7a02a671627241682947f65078ab88" + integrity sha512-eJhofrUCUaItMIH6et8kI7YqHfhjWqGZoTsE+40NRCfAraOMWx+pDzfRfeoAl3qeRAH2HhNj1bkYn70FbUOxuQ== dependencies: inquirer "^6.2.0" npmlog "^4.1.2" -"@lerna/publish@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.4.0.tgz#d2665f7b16eb3b2b8962c47fcf31fe901ff9a288" +"@lerna/publish@^3.4.3": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.4.3.tgz#fb956ca2a871729982022889f90d0e8eb8528340" + integrity sha512-baeRL8xmOR25p86cAaS9mL0jdRzdv4dUo04PlK2Wes+YlL705F55cSXeC9npNie+9rGwFyLzCTQe18WdbZyLuw== dependencies: "@lerna/batch-packages" "^3.1.2" "@lerna/check-working-tree" "^3.3.0" @@ -1024,15 +1142,15 @@ "@lerna/command" "^3.3.0" "@lerna/describe-ref" "^3.3.0" "@lerna/get-npm-exec-opts" "^3.0.0" - "@lerna/npm-conf" "^3.0.0" + "@lerna/npm-conf" "^3.4.1" "@lerna/npm-dist-tag" "^3.3.0" "@lerna/npm-publish" "^3.3.1" "@lerna/output" "^3.0.0" "@lerna/prompt" "^3.3.1" - "@lerna/run-lifecycle" "^3.3.1" + "@lerna/run-lifecycle" "^3.4.1" "@lerna/run-parallel-batches" "^3.0.0" "@lerna/validation-error" "^3.0.0" - "@lerna/version" "^3.3.2" + "@lerna/version" "^3.4.1" fs-extra "^7.0.0" libnpmaccess "^3.0.0" npm-package-arg "^6.0.0" @@ -1047,6 +1165,7 @@ "@lerna/resolve-symlink@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.3.0.tgz#c5d99a60cb17e2ea90b3521a0ba445478d194a44" + integrity sha512-KmoPDcFJ2aOK2inYHbrsiO9SodedUj0L1JDvDgirVNIjMUaQe2Q6Vi4Gh+VCJcyB27JtfHioV9R2NxU72Pk2hg== dependencies: fs-extra "^7.0.0" npmlog "^4.1.2" @@ -1055,23 +1174,26 @@ "@lerna/rimraf-dir@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.3.0.tgz#687e9bb3668a9e540e281302a52d9a573860f5db" + integrity sha512-vSqOcZ4kZduiSprbt+y40qziyN3VKYh+ygiCdnbBbsaxpdKB6CfrSMUtrLhVFrqUfBHIZRzHIzgjTdtQex1KLw== dependencies: "@lerna/child-process" "^3.3.0" npmlog "^4.1.2" path-exists "^3.0.0" rimraf "^2.6.2" -"@lerna/run-lifecycle@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.3.1.tgz#13a03f353aab6c1639bf8953f58f0c45585785ac" +"@lerna/run-lifecycle@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.4.1.tgz#6d7e44eada31cb4ec78b18ef050da0d86f6c892b" + integrity sha512-N/hi2srM9A4BWEkXccP7vCEbf4MmIuALF00DTBMvc0A/ccItwUpl3XNuM7+ADDRK0mkwE3hDw89lJ3A7f8oUQw== dependencies: - "@lerna/npm-conf" "^3.0.0" + "@lerna/npm-conf" "^3.4.1" npm-lifecycle "^2.0.0" npmlog "^4.1.2" "@lerna/run-parallel-batches@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz#468704934084c74991d3124d80607857d4dfa840" + integrity sha512-Mj1ravlXF7AkkewKd9YFq9BtVrsStNrvVLedD/b2wIVbNqcxp8lS68vehXVOzoL/VWNEDotvqCQtyDBilCodGw== dependencies: p-map "^1.2.0" p-map-series "^1.0.0" @@ -1079,6 +1201,7 @@ "@lerna/run@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.3.2.tgz#f521f4a22585c90758f34a584cb1871f8bb2a83e" + integrity sha512-cruwRGZZWnQ5I0M+AqcoT3Xpq2wj3135iVw4n59/Op6dZu50sMFXZNLiTTTZ15k8rTKjydcccJMdPSpTHbH7/A== dependencies: "@lerna/batch-packages" "^3.1.2" "@lerna/command" "^3.3.0" @@ -1092,6 +1215,7 @@ "@lerna/symlink-binary@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.3.0.tgz#99ea570b21baabd61ecab27582eeb1d7b2c5f9cf" + integrity sha512-zRo6CimhvH/VJqCFl9T4IC6syjpWyQIxEfO2sBhrapEcfwjtwbhoGgKwucsvt4rIpFazCw63jQ/AXMT27KUIHg== dependencies: "@lerna/create-symlink" "^3.3.0" "@lerna/package" "^3.0.0" @@ -1102,6 +1226,7 @@ "@lerna/symlink-dependencies@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.3.0.tgz#13bcaed3e37986ab01b13498a459c7f609397dc3" + integrity sha512-IRngSNCmuD5uBKVv23tHMvr7Mplti0lKHilFKcvhbvhAfu6m/Vclxhkfs/uLyHzG+DeRpl/9o86SQET3h4XDhg== dependencies: "@lerna/create-symlink" "^3.3.0" "@lerna/resolve-symlink" "^3.3.0" @@ -1114,22 +1239,24 @@ "@lerna/validation-error@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.0.0.tgz#a27e90051c3ba71995e2a800a43d94ad04b3e3f4" + integrity sha512-5wjkd2PszV0kWvH+EOKZJWlHEqCTTKrWsvfHnHhcUaKBe/NagPZFWs+0xlsDPZ3DJt5FNfbAPAnEBQ05zLirFA== dependencies: npmlog "^4.1.2" -"@lerna/version@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.3.2.tgz#b1f4be43f61edf97428efca09dddc47ffd769bb4" +"@lerna/version@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.4.1.tgz#029448cccd3ccefb4d5f666933bd13cfb37edab0" + integrity sha512-oefNaQLBJSI2WLZXw5XxDXk4NyF5/ct0V9ys/J308NpgZthPgwRPjk9ZR0o1IOxW1ABi6z3E317W/dxHDjvAkg== dependencies: "@lerna/batch-packages" "^3.1.2" "@lerna/check-working-tree" "^3.3.0" "@lerna/child-process" "^3.3.0" "@lerna/collect-updates" "^3.3.2" "@lerna/command" "^3.3.0" - "@lerna/conventional-commits" "^3.3.0" + "@lerna/conventional-commits" "^3.4.1" "@lerna/output" "^3.0.0" "@lerna/prompt" "^3.3.1" - "@lerna/run-lifecycle" "^3.3.1" + "@lerna/run-lifecycle" "^3.4.1" "@lerna/validation-error" "^3.0.0" chalk "^2.3.1" dedent "^0.7.0" @@ -1146,6 +1273,7 @@ "@lerna/write-log-file@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.0.0.tgz#2f95fee80c6821fe1ee6ccf8173d2b4079debbd2" + integrity sha512-SfbPp29lMeEVOb/M16lJwn4nnx5y+TwCdd7Uom9umd7KcZP0NOvpnX0PHehdonl7TyHZ1Xx2maklYuCLbQrd/A== dependencies: npmlog "^4.1.2" write-file-atomic "^2.3.0" @@ -1153,6 +1281,7 @@ "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== dependencies: call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" @@ -1160,66 +1289,108 @@ "@nodelib/fs.stat@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz#54c5a964462be3d4d78af631363c18d6fa91ac26" - -"@types/commander@^2.11.0": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@types/commander/-/commander-2.12.2.tgz#183041a23842d4281478fa5d23c5ca78e6fd08ae" - dependencies: - commander "*" + integrity sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw== "@types/events@*": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" + integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== + +"@types/fs-extra@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.1.tgz#cd856fbbdd6af2c11f26f8928fd8644c9e9616c9" + integrity sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw== + dependencies: + "@types/node" "*" "@types/fs-extra@^5.0.3": version "5.0.4" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.4.tgz#b971134d162cc0497d221adde3dbb67502225599" + integrity sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g== dependencies: "@types/node" "*" "@types/glob@*": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== dependencies: "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" +"@types/handlebars@4.0.36": + version "4.0.36" + resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.36.tgz#ff57c77fa1ab6713bb446534ddc4d979707a3a79" + integrity sha512-LjNiTX7TY7wtuC6y3QwC93hKMuqYhgV9A1uXBKNvZtVC8ZvyWAjZkJ5BvT0K7RKqORRYRLMrqCxpw5RgS+MdrQ== + "@types/handlebars@^4.0.38": version "4.0.39" resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.39.tgz#961fb54db68030890942e6aeffe9f93a957807bd" + integrity sha512-vjaS7Q0dVqFp85QhyPSZqDKnTTCemcSHNHFvDdalO1s0Ifz5KuE64jQD5xoUkfdWwF4WpqdJEl7LsWH8rzhKJA== + +"@types/highlight.js@9.12.2": + version "9.12.2" + resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.2.tgz#6ee7cd395effe5ec80b515d3ff1699068cd0cd1d" + integrity sha512-y5x0XD/WXDaGSyiTaTcKS4FurULJtSiYbGTeQd0m2LYZGBcZZ/7fM6t5H/DzeUF+kv8y6UfmF6yJABQsHcp9VQ== "@types/highlight.js@^9.12.3": version "9.12.3" resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.3.tgz#b672cfaac25cbbc634a0fd92c515f66faa18dbca" + integrity sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ== + +"@types/lodash@4.14.104": + version "4.14.104" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80" + integrity sha512-ufQcVg4daO8xQ5kopxRHanqFdL4AI7ondQkV+2f+7mz3gvp0LkBx2zBRC6hfs3T87mzQFmf5Fck7Fi145Ul6NQ== "@types/lodash@^4.14.110": - version "4.14.116" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" + version "4.14.117" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.117.tgz#695a7f514182771a1e0f4345d189052ee33c8778" + integrity sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw== + +"@types/marked@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.3.0.tgz#583c223dd33385a1dda01aaf77b0cd0411c4b524" + integrity sha512-CSf9YWJdX1DkTNu9zcNtdCcn6hkRtB5ILjbhRId4ZOQqx30fXmdecuaXhugQL6eyrhuXtaHJ7PHI+Vm7k9ZJjg== "@types/marked@^0.4.0": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.4.1.tgz#6595701c4d0dfde9d04894d3be04b8a97a49e0d7" + version "0.4.2" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.4.2.tgz#64a89e53ea37f61cc0f3ee1732c555c2dbf6452f" + integrity sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg== "@types/minimatch@*", "@types/minimatch@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/mocha@^5.2.5": version "5.2.5" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" + integrity sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww== -"@types/node@*", "@types/node@^10.5.5": - version "10.11.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.11.3.tgz#c055536ac8a5e871701aa01914be5731539d01ee" +"@types/node@*", "@types/node@^10.11.7", "@types/node@^10.5.5": + version "10.12.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" + integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ== -"@types/semver@^5.4.0": +"@types/semver@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" + integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== + +"@types/shelljs@0.7.8": + version "0.7.8" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.8.tgz#4b4d6ee7926e58d7bca448a50ba442fd9f6715bd" + integrity sha512-M2giRw93PxKS7YjU6GZjtdV9HASdB7TWqizBXe4Ju7AqbKlWvTr0gNO92XH56D/gMxqD/jNHLNfC5hA34yGqrQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" "@types/shelljs@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.0.tgz#0caa56b68baae4f68f44e0dd666ab30b098e3632" + integrity sha512-vs1hCC8RxLHRu2bwumNyYRNrU3o8BtZhLysH5A4I98iYmA2APl6R3uNQb5ihl+WiwH0xdC9LLO+vRrXLs/Kyxg== dependencies: "@types/glob" "*" "@types/node" "*" @@ -1227,10 +1398,12 @@ "@types/webgl2@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@types/webgl2/-/webgl2-0.0.4.tgz#c3b0f9d6b465c66138e84e64cb3bdf8373c2c279" + integrity sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw== JSONStream@^1.0.4, JSONStream@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.4.tgz#615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e" + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" @@ -1238,26 +1411,31 @@ JSONStream@^1.0.4, JSONStream@^1.3.4: abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== acorn@^5.0.0: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: es6-promisify "^5.0.0" agentkeepalive@^3.4.1: version "3.5.1" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.1.tgz#4eba75cf2ad258fc09efd506cdb8d8c2971d35a4" + integrity sha512-Cte/sTY9/XcygXjJ0q58v//SnEQ7ViWExKyJpLJlLqomDbQyMLh6Is4KuWJ/wmxzhiwkGRple7Gqv1zf6Syz5w== dependencies: humanize-ms "^1.2.1" ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -1267,38 +1445,46 @@ ajv@^5.3.0: alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-to-html@^0.6.4: version "0.6.6" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.6.tgz#58a8d04b87ec9a85e3ad273c12a5fbc7147b9c42" + integrity sha512-90M/2sZna3OsoOEbSyXK46poFnlClBC53Rx6etNKQK7iShsX5fI5E/M9Ld6FurtLaxAWLuAPi0Jp8p3y5oAkxg== dependencies: entities "^1.1.1" anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" @@ -1306,24 +1492,29 @@ anymatch@^2.0.0: append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= dependencies: default-require-extensions "^1.0.0" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== aproba@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -1331,68 +1522,83 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" @@ -1401,48 +1607,58 @@ asn1.js@^4.0.0: asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= dependencies: util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: lodash "^4.17.10" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^6.3.1: version "6.7.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= dependencies: browserslist "^1.7.6" caniuse-db "^1.0.30000634" @@ -1454,14 +1670,17 @@ autoprefixer@^6.3.1: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -1470,6 +1689,7 @@ babel-code-frame@^6.22.0: babel-runtime@^6.11.6, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -1477,6 +1697,7 @@ babel-runtime@^6.11.6, babel-runtime@^6.26.0: babel-types@^6.15.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -1486,6 +1707,7 @@ babel-types@^6.15.0: babylon-walk@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce" + integrity sha1-OxWl3btIKni0zpwByLoYFwLZ1s4= dependencies: babel-runtime "^6.11.6" babel-types "^6.15.0" @@ -1494,18 +1716,22 @@ babylon-walk@^1.0.2: balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1518,12 +1744,14 @@ base@^0.11.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" benchmark@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + integrity sha1-CfPeMckWQl1JjMLuVloOvzwqVik= dependencies: lodash "^4.17.4" platform "^1.3.3" @@ -1531,32 +1759,39 @@ benchmark@^2.1.4: binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== bindings@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" + integrity sha1-FK1hE4EtLTfXLme0ystLtyZQXxE= block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" bluebird@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1564,6 +1799,7 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1572,6 +1808,7 @@ braces@^1.8.2: braces@^2.3.0, braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1587,6 +1824,7 @@ braces@^2.3.0, braces@^2.3.1: brfs@^1.2.0: version "1.6.1" resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" + integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== dependencies: quote-stream "^1.0.1" resolve "^1.1.5" @@ -1596,14 +1834,17 @@ brfs@^1.2.0: brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" - resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1615,6 +1856,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" @@ -1623,6 +1865,7 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" @@ -1631,7 +1874,8 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" - resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1639,6 +1883,7 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1651,39 +1896,46 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= dependencies: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" browserslist@^4.0.0, browserslist@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.2.1.tgz#257a24c879d1cd4016348eee5c25de683260b21d" + integrity sha512-1oO0c7Zhejwd+LXihS89WqtKionSbz298rJZKJgfrHIZhrV8AC15gw553VcB0lcEugja7IhWD7iAlrsamfYVPA== dependencies: - caniuse-lite "^1.0.30000884" - electron-to-chromium "^1.3.62" - node-releases "^1.0.0-alpha.11" + caniuse-lite "^1.0.30000890" + electron-to-chromium "^1.3.79" + node-releases "^1.0.0-alpha.14" buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: version "4.9.1" - resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1692,26 +1944,32 @@ buffer@^4.3.0: builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= byte-size@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.3.tgz#b7c095efc68eadf82985fccd9a2df43a74fa2ccd" + integrity sha512-JGC3EV2bCzJH/ENSh3afyJrH4vwxbHTuO5ljLoI5+2iJOcEpMgP8T782jH9b5qGxf2mSUIp1lfGnfKNrRHpvVg== cacache@^11.0.1, cacache@^11.0.2: version "11.2.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" + integrity sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ== dependencies: bluebird "^3.5.1" chownr "^1.0.1" @@ -1731,6 +1989,7 @@ cacache@^11.0.1, cacache@^11.0.2: cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1745,6 +2004,7 @@ cache-base@^1.0.1: caching-transform@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= dependencies: md5-hex "^1.2.0" mkdirp "^0.5.1" @@ -1753,10 +2013,12 @@ caching-transform@^1.0.0: call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" @@ -1764,6 +2026,7 @@ camelcase-keys@^2.0.0: camelcase-keys@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= dependencies: camelcase "^4.1.0" map-obj "^2.0.0" @@ -1772,14 +2035,17 @@ camelcase-keys@^4.0.0: camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= dependencies: browserslist "^1.3.6" caniuse-db "^1.0.30000529" @@ -1789,6 +2055,7 @@ caniuse-api@^1.5.2: caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: browserslist "^4.0.0" caniuse-lite "^1.0.0" @@ -1796,20 +2063,24 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000888" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000888.tgz#38081675206f8856b648c1cd793a28a2c5762448" + version "1.0.30000892" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000892.tgz#3a03ecec4283caa5dac49facf024d13113c4499f" + integrity sha512-as/DXjiFJg051+GSJLmkY0hckkVsmTB4nuDUPLwK1sMHk94XsYuocNJuU0wdOpobwI/3sqNeW5ETebvdPGvwBQ== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000884: - version "1.0.30000888" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000888.tgz#22edb50d91dd70612b5898e3b36f460600c6492f" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000890: + version "1.0.30000892" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000892.tgz#344d2b51ee3ff5977537da4aa449c90eec40b759" + integrity sha512-X9rxMaWZNbJB5qjkDqPtNv/yfViTeUL6ILk0QJNxLV3OhKC5Acn5vxsuUvllR6B48mog8lmS+whwHq/QIYSL9w== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= chalk@^1.1.3: version "1.1.3" - resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1820,6 +2091,7 @@ chalk@^1.1.3: chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1828,10 +2100,12 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4 chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== chokidar@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -1851,14 +2125,17 @@ chokidar@^2.0.3: chownr@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -1866,12 +2143,14 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== dependencies: chalk "^1.1.3" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1881,20 +2160,24 @@ class-utils@^0.3.5: cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" @@ -1903,18 +2186,22 @@ cliui@^4.0.0: clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= clones@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/clones/-/clones-1.1.0.tgz#87e904132d6140c5c0b72006c08c0d05bd7b63b3" + integrity sha1-h+kEEy1hQMXAtyAGwIwNBb17Y7M= cmd-shim@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + integrity sha1-b8vamUg6j9FdfTChlspp1oii79s= dependencies: graceful-fs "^4.1.2" mkdirp "~0.5.0" @@ -1922,26 +2209,31 @@ cmd-shim@^2.0.2: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= coa@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= dependencies: q "^1.1.2" coa@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" + integrity sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ== dependencies: q "^1.1.2" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -1949,26 +2241,31 @@ collection-visit@^1.0.0: color-convert@^1.3.0, color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= dependencies: color-name "^1.0.0" color-string@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -1976,14 +2273,16 @@ color-string@^1.5.2: color@^0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= dependencies: clone "^1.0.2" color-convert "^1.3.0" color-string "^0.3.0" color@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + version "3.1.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" + integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg== dependencies: color-convert "^1.9.1" color-string "^1.5.2" @@ -1991,6 +2290,7 @@ color@^3.0.0: colormin@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= dependencies: color "^0.11.0" css-color-names "0.0.4" @@ -1999,49 +2299,59 @@ colormin@^1.0.5: colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= columnify@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= dependencies: strip-ansi "^3.0.0" wcwidth "^1.0.0" combined-stream@1.0.6: version "1.0.6" - resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= dependencies: delayed-stream "~1.0.0" combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.7.tgz#16828f0c3ff2b0c58805861ef211b64fc15692a8" - -commander@*, commander@^2.11.0, commander@^2.12.1: - version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" + version "1.2.8" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" + integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw== commander@2.15.1: version "2.15.1" - resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + +commander@^2.11.0, commander@^2.12.1, commander@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= compare-func@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= dependencies: array-ify "^1.0.0" dot-prop "^3.0.0" @@ -2049,14 +2359,17 @@ compare-func@^1.3.1: component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" @@ -2066,6 +2379,7 @@ concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@~1.6.0: config-chain@^1.1.11, config-chain@~1.1.5: version "1.1.12" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -2073,35 +2387,40 @@ config-chain@^1.1.11, config-chain@~1.1.5: console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -conventional-changelog-angular@^1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" +conventional-changelog-angular@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.1.tgz#f96431b76de453333a909decd02b15cb5bd2d364" + integrity sha512-q4ylJ68fWZDdrFC9z4zKcf97HW6hp7Mo2YlqD4owfXhecFKy/PJCU/1oVFF4TqochchChqmZ0Vb0e0g8/MKNlA== dependencies: compare-func "^1.3.1" q "^1.5.1" -conventional-changelog-core@^2.0.5: - version "2.0.11" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz#19b5fbd55a9697773ed6661f4e32030ed7e30287" +conventional-changelog-core@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.1.0.tgz#96a81bb3301b4b2a3dc2851cc54c5fb674ac1942" + integrity sha512-bcZkcFXkqVgG2W8m/1wjlp2wn/BKDcrPgw3/mvSEQtzs8Pax8JbAPFpEQReHY92+EKNNXC67wLA8y2xcNx0rDA== dependencies: - conventional-changelog-writer "^3.0.9" - conventional-commits-parser "^2.1.7" + conventional-changelog-writer "^4.0.0" + conventional-commits-parser "^3.0.0" dateformat "^3.0.0" get-pkg-repo "^1.0.0" - git-raw-commits "^1.3.6" + git-raw-commits "^2.0.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^1.3.6" + git-semver-tags "^2.0.0" lodash "^4.2.1" normalize-package-data "^2.3.5" q "^1.5.1" @@ -2109,16 +2428,18 @@ conventional-changelog-core@^2.0.5: read-pkg-up "^1.0.1" through2 "^2.0.0" -conventional-changelog-preset-loader@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz#40bb0f142cd27d16839ec6c74ee8db418099b373" +conventional-changelog-preset-loader@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.0.1.tgz#d134734e0cc1b91b88b30586c5991f31442029f1" + integrity sha512-HiSfhXNzAzG9klIqJaA97MMiNBR4js+53g4Px0k7tgKeCNVXmrDrm+CY+nIqcmG5NVngEPf8rAr7iji1TWW7zg== -conventional-changelog-writer@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz#4aecdfef33ff2a53bb0cf3b8071ce21f0e994634" +conventional-changelog-writer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.0.tgz#3ed983c8ef6a3aa51fe44e82c9c75e86f1b5aa42" + integrity sha512-hMZPe0AQ6Bi05epeK/7hz80xxk59nPA5z/b63TOHq2wigM0/akreOc8N4Jam5b9nFgKWX1e9PdPv2ewgW6bcfg== dependencies: compare-func "^1.3.1" - conventional-commits-filter "^1.1.6" + conventional-commits-filter "^2.0.0" dateformat "^3.0.0" handlebars "^4.0.2" json-stringify-safe "^5.0.1" @@ -2128,16 +2449,18 @@ conventional-changelog-writer@^3.0.9: split "^1.0.0" through2 "^2.0.0" -conventional-commits-filter@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz#4389cd8e58fe89750c0b5fb58f1d7f0cc8ad3831" +conventional-commits-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.0.tgz#a0ce1d1ff7a1dd7fab36bee8e8256d348d135651" + integrity sha512-Cfl0j1/NquB/TMVx7Wrmyq7uRM+/rPQbtVVGwzfkhZ6/yH6fcMmP0Q/9044TBZPTNdGzm46vXFXL14wbET0/Mg== dependencies: is-subset "^0.1.1" modify-values "^1.0.0" -conventional-commits-parser@^2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e" +conventional-commits-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz#7f604549a50bd8f60443fbe515484b1c2f06a5c4" + integrity sha512-GWh71U26BLWgMykCp+VghZ4s64wVbtseECcKQ/PvcPZR2cUnz+FUc2J9KjxNl7/ZbCxST8R03c9fc+Vi0umS9Q== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.0" @@ -2147,28 +2470,31 @@ conventional-commits-parser@^2.1.7: through2 "^2.0.0" trim-off-newlines "^1.0.0" -conventional-recommended-bump@^2.0.6: - version "2.0.9" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-2.0.9.tgz#7392421e7d0e3515f3df2040572a23cc73a68a93" +conventional-recommended-bump@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-4.0.1.tgz#304a45a412cfec050a10ea2e7e4a89320eaf3991" + integrity sha512-9waJvW01TUs4HQJ3khwGSSlTlKsY+5u7OrxHL+oWEoGNvaNO/0qL6qqnhS3J0Fq9fNKA9bmlf5cOXjCQoW+I4Q== dependencies: concat-stream "^1.6.0" - conventional-changelog-preset-loader "^1.1.8" - conventional-commits-filter "^1.1.6" - conventional-commits-parser "^2.1.7" - git-raw-commits "^1.3.6" - git-semver-tags "^1.3.6" + conventional-changelog-preset-loader "^2.0.1" + conventional-commits-filter "^2.0.0" + conventional-commits-parser "^3.0.0" + git-raw-commits "^2.0.0" + git-semver-tags "^2.0.0" meow "^4.0.0" q "^1.5.1" convert-source-map@^1.1.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== dependencies: safe-buffer "~5.1.1" copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" fs-write-stream-atomic "^1.0.8" @@ -2180,18 +2506,22 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.4.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cosmiconfig@^5.0.0, cosmiconfig@^5.0.2: version "5.0.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" + integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ== dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" @@ -2200,13 +2530,15 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.2: create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" - resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -2216,7 +2548,8 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" - resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -2228,6 +2561,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: cross-spawn@^4: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= dependencies: lru-cache "^4.0.1" which "^1.2.9" @@ -2235,6 +2569,7 @@ cross-spawn@^4: cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -2243,6 +2578,7 @@ cross-spawn@^5.0.1: cross-spawn@^6.0.0, cross-spawn@^6.0.4: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -2253,6 +2589,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.4: crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -2269,10 +2606,12 @@ crypto-browserify@^3.11.0: css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= css-declaration-sorter@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== dependencies: postcss "^7.0.1" timsort "^0.3.0" @@ -2280,10 +2619,12 @@ css-declaration-sorter@^4.0.1: css-select-base-adapter@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990" + integrity sha1-AQKz0UYw34bD65+p9UVicBBs+ZA= css-select@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.0.tgz#7aa2921392114831f68db175c0b6a555df74bbd5" + integrity sha512-MGhoq1S9EyPgZIGnts8Yz5WwUOyHmPMdlqeifsYs/xFX7AAm3hY0RJe1dqVlXtYPI66Nsk39R/sa5/ree6L2qg== dependencies: boolbase "^1.0.0" css-what "2.1" @@ -2293,6 +2634,7 @@ css-select@^2.0.0: css-tree@1.0.0-alpha.28: version "1.0.0-alpha.28" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== dependencies: mdn-data "~1.1.0" source-map "^0.5.3" @@ -2300,6 +2642,7 @@ css-tree@1.0.0-alpha.28: css-tree@1.0.0-alpha.29: version "1.0.0-alpha.29" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== dependencies: mdn-data "~1.1.0" source-map "^0.5.3" @@ -2307,18 +2650,22 @@ css-tree@1.0.0-alpha.29: css-unit-converter@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= css-url-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= cssnano-preset-default@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.2.tgz#1de3f27e73b7f0fbf87c1d7fd7a63ae980ac3774" + integrity sha512-zO9PeP84l1E4kbrdyF7NSLtA/JrJY1paX5FHy5+w/ziIXO2kDqDMfJ/mosXkaHHSa3RPiIY3eB6aEgwx3IiGqA== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -2354,24 +2701,29 @@ cssnano-preset-default@^4.0.2: cssnano-util-get-arguments@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= cssnano-util-get-match@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= cssnano-util-raw-cache@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== dependencies: postcss "^7.0.0" cssnano-util-same-parent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^3.4.0: version "3.10.0" - resolved "http://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= dependencies: autoprefixer "^6.3.1" decamelize "^1.1.2" @@ -2409,6 +2761,7 @@ cssnano@^3.4.0: cssnano@^4.0.0: version "4.1.4" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.4.tgz#55b71e3d8f5451dd3edc7955673415c98795788f" + integrity sha512-wP0wbOM9oqsek14CiNRYrK9N3w3jgadtGZKHXysgC/OMVpy0KZgWVPdNqODSZbz7txO9Gekr9taOfcCgL0pOOw== dependencies: cosmiconfig "^5.0.0" cssnano-preset-default "^4.0.2" @@ -2418,12 +2771,14 @@ cssnano@^4.0.0: csso@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== dependencies: css-tree "1.0.0-alpha.29" csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= dependencies: clap "^1.0.9" source-map "^0.5.3" @@ -2431,36 +2786,43 @@ csso@~2.3.1: currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= dargs@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= dependencies: number-is-nan "^1.0.0" dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== deasync@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.13.tgz#815c2b69bbd1117cae570152cd895661c09f20ea" + integrity sha512-/6ngYM7AapueqLtvOzjv9+11N2fHDSrkxeMF1YPE20WIfaaawiBg+HZH1E5lHrcJxlKR42t6XPOEmMmqcAsU1g== dependencies: bindings "~1.2.1" nan "^2.0.7" @@ -2468,32 +2830,38 @@ deasync@^0.1.13: debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" debug@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= decamelize-keys@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -2501,62 +2869,74 @@ decamelize-keys@^1.0.0: decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decamelize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== dependencies: xregexp "4.0.0" decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= dependencies: strip-bom "^2.0.0" defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: clone "^1.0.2" define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -2564,22 +2944,27 @@ define-property@^2.0.2: defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2587,18 +2972,22 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= dependencies: asap "^2.0.0" wrappy "1" @@ -2606,10 +2995,12 @@ dezalgo@^1.0.0: diff@3.5.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: version "5.0.3" - resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -2618,6 +3009,7 @@ diffie-hellman@^5.0.0: dir-glob@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== dependencies: arrify "^1.0.1" path-type "^3.0.0" @@ -2625,6 +3017,7 @@ dir-glob@^2.0.0: dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= dependencies: domelementtype "~1.1.1" entities "~1.1.1" @@ -2632,24 +3025,29 @@ dom-serializer@0: domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1, domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= domhandler@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== dependencies: domelementtype "1" domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: dom-serializer "0" domelementtype "1" @@ -2657,36 +3055,43 @@ domutils@^1.5.1, domutils@^1.7.0: dot-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= dependencies: is-obj "^1.0.0" dot-prop@^4.1.1, dot-prop@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" dotenv-expand@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" + integrity sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU= dotenv@^5.0.0: version "5.0.1" - resolved "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== duplexer2@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= dependencies: readable-stream "^2.0.2" duplexer@^0.1.1: version "0.1.1" - resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + version "3.6.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" + integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA== dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -2696,32 +3101,37 @@ duplexify@^3.4.2, duplexify@^3.6.0: ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" editorconfig@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.0.tgz#b6dd4a0b6b9e76ce48e066bdc15381aebb8804fd" + version "0.15.2" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.2.tgz#047be983abb9ab3c2eefe5199cb2b7c5689f0702" + integrity sha512-GWjSI19PVJAM9IZRGOS+YKI8LN+/sjkSjNyvxL5ucqP9/IqtYNXBaQ/6c/hkPNYQHyOHra2KoXZI/JVpuqwmcQ== dependencies: - "@types/commander" "^2.11.0" - "@types/semver" "^5.4.0" - commander "^2.11.0" - lru-cache "^4.1.1" - semver "^5.4.1" + "@types/node" "^10.11.7" + "@types/semver" "^5.5.0" + commander "^2.19.0" + lru-cache "^4.1.3" + semver "^5.6.0" sigmund "^1.0.1" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.62: - version "1.3.72" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.72.tgz#b69683081d5b7eee6e1ea07b2f5fa30b3c72252d" +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.79: + version "1.3.79" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.79.tgz#774718f06284a4bf8f578ac67e74508fe659f13a" + integrity sha512-LQdY3j4PxuUl6xfxiFruTSlCniTrTrzAd8/HfsLEMi0PUpaQ0Iy+Pr4N4VllDYjs0Hyu2lkTbvzqlG+PX9NsNw== elliptic@^6.0.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2734,36 +3144,43 @@ elliptic@^6.0.0: encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.5.1, es-abstract@^1.6.1: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -2774,6 +3191,7 @@ es-abstract@^1.5.1, es-abstract@^1.6.1: es-to-primitive@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" @@ -2782,24 +3200,29 @@ es-to-primitive@^1.1.1: es6-promise@^4.0.3: version "4.2.5" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== es6-promisify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: es6-promise "^4.0.3" escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.8.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2811,6 +3234,7 @@ escodegen@^1.8.1: escodegen@~1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2822,34 +3246,42 @@ escodegen@~1.9.0: esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= events@^1.0.0: version "1.1.1" - resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" @@ -2857,6 +3289,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== dependencies: cross-spawn "^6.0.0" get-stream "^3.0.0" @@ -2869,6 +3302,7 @@ execa@^0.10.0: execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2881,6 +3315,7 @@ execa@^0.7.0: execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" get-stream "^4.0.0" @@ -2893,12 +3328,14 @@ execa@^1.0.0: expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2911,18 +3348,21 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -2930,10 +3370,12 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -2942,12 +3384,14 @@ external-editor@^3.0.0: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -2961,14 +3405,17 @@ extglob@^2.0.4: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= falafel@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" + integrity sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw= dependencies: acorn "^5.0.0" foreach "^2.0.5" @@ -2978,10 +3425,12 @@ falafel@^2.1.0: fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= fast-glob@^2.0.2, fast-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" + version "2.2.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.3.tgz#d09d378e9ef6b0076a0fa1ba7519d9d4d9699c28" + integrity sha512-NiX+JXjnx43RzvVFwRWfPKo4U+1BrK5pJPsHQdKMlLoFHrrGktXglQhHliSihWAq+m1z6fHk3uwGHrtRbS9vLA== dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" "@nodelib/fs.stat" "^1.0.1" @@ -2993,32 +3442,39 @@ fast-glob@^2.0.2, fast-glob@^2.2.2: fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= figgy-pudding@^3.1.0, figgy-pudding@^3.2.1, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= filesize@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -3029,6 +3485,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -3038,6 +3495,7 @@ fill-range@^4.0.0: find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= dependencies: commondir "^1.0.1" mkdirp "^0.5.1" @@ -3046,6 +3504,7 @@ find-cache-dir@^0.1.1: find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -3053,22 +3512,26 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== dependencies: inherits "^2.0.1" readable-stream "^2.0.4" @@ -3076,20 +3539,24 @@ flush-write-stream@^1.0.0: for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= foreground-child@^1.5.3, foreground-child@^1.5.6: version "1.5.6" - resolved "http://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= dependencies: cross-spawn "^4" signal-exit "^3.0.0" @@ -3097,10 +3564,12 @@ foreground-child@^1.5.3, foreground-child@^1.5.6: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= dependencies: asynckit "^0.4.0" combined-stream "1.0.6" @@ -3109,23 +3578,36 @@ form-data@~2.3.2: fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" + integrity sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3134,12 +3616,14 @@ fs-extra@^7.0.0: fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" @@ -3149,10 +3633,12 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" @@ -3160,6 +3646,7 @@ fsevents@^1.2.2: fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -3169,16 +3656,19 @@ fstream@^1.0.0, fstream@^1.0.2: fswatcher-child@^1.0.5: version "1.1.1" resolved "https://registry.yarnpkg.com/fswatcher-child/-/fswatcher-child-1.1.1.tgz#264dd95f9c4b5f8615327d7d7567884591846b9b" + integrity sha512-FVDjVhR71TkJ+ud6vnRwCHvCgK9drGRdimWcTLqw8iN88uL5tTX+/xrwigJdcuQGrWYo3TRw9gRzk9xqR0UPPQ== dependencies: chokidar "^2.0.3" function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -3192,14 +3682,17 @@ gauge@~2.7.3: genfun@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" + integrity sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E= get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-pkg-repo@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" + integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= dependencies: hosted-git-info "^2.1.4" meow "^3.3.0" @@ -3210,34 +3703,41 @@ get-pkg-repo@^1.0.0: get-port@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-stream@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.0.0.tgz#9e074cb898bd2b9ebabb445a1766d7f43576d977" + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" -git-raw-commits@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff" +git-raw-commits@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" + integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== dependencies: dargs "^4.0.1" lodash.template "^4.0.2" @@ -3248,13 +3748,15 @@ git-raw-commits@^1.3.6: git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.6.tgz#357ea01f7280794fe0927f2806bee6414d2caba5" +git-semver-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.0.tgz#c218fd895bdf8e8e02f6bde555b2c3893ac73cd7" + integrity sha512-lSgFc3zQTul31nFje2Q8XdNcTOI6B4I3mJRPCgFzHQQLfxfqdWTYzdtCaynkK5Xmb2wQlSJoKolhXJ1VhKROnQ== dependencies: meow "^4.0.0" semver "^5.5.0" @@ -3262,12 +3764,14 @@ git-semver-tags@^1.3.6: gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= dependencies: ini "^1.3.2" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -3275,12 +3779,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -3288,10 +3794,12 @@ glob-parent@^3.1.0: glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3303,6 +3811,7 @@ glob@7.1.2: glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3312,12 +3821,14 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: path-is-absolute "^1.0.0" globals@^11.1.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + version "11.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" + integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== globby@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" + integrity sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw== dependencies: array-union "^1.0.1" dir-glob "^2.0.0" @@ -3330,10 +3841,12 @@ globby@^8.0.1: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= grapheme-breaker@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz#5b9e6b78c3832452d2ba2bb1cb830f96276410ac" + integrity sha1-W55reMODJFLSuiuxy4MPlidkEKw= dependencies: brfs "^1.2.0" unicode-trie "^0.3.1" @@ -3341,10 +3854,12 @@ grapheme-breaker@^0.3.2: growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== dependencies: async "^2.5.0" optimist "^0.6.1" @@ -3355,10 +3870,12 @@ handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA== dependencies: ajv "^5.3.0" har-schema "^2.0.0" @@ -3366,28 +3883,34 @@ har-validator@~5.1.0: has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3396,6 +3919,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3404,10 +3928,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -3415,12 +3941,14 @@ has-values@^1.0.0: has@^1.0.0, has@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -3428,6 +3956,7 @@ hash-base@^3.0.0: hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.5" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" + integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" @@ -3435,18 +3964,22 @@ hash.js@^1.0.0, hash.js@^1.0.3: he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= hex-color-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== highlight.js@^9.0.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" + version "9.13.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.0.tgz#ee96d5c5f4c456e440f2dbdb2752211dff56f671" + integrity sha512-2B90kcNnErqRTmzdZw6IPLEC9CdsiIMhj+r8L3LJKRCgtEJ+LY5yzWuQCVnADTI0wwocQinFzaaL/JjTQNqI/g== hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -3455,22 +3988,27 @@ hmac-drbg@^1.0.0: hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== hsl-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= hsla-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== htmlnano@^0.1.9: version "0.1.10" resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.1.10.tgz#a0a548eb4c76ae2cf2423ec7a25c881734d3dea6" + integrity sha512-eTEUzz8VdWYp+w/KUdb99kwao4reR64epUySyZkQeepcyzPQ2n2EPWzibf6QDxmkGy10Kr+CKxYqI3izSbmhJQ== dependencies: cssnano "^3.4.0" object-assign "^4.0.1" @@ -3482,6 +4020,7 @@ htmlnano@^0.1.9: htmlparser2@^3.9.2: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + integrity sha1-G9+HrMoPP55T+k/M6w9LTLsAszg= dependencies: domelementtype "^1.3.0" domhandler "^2.3.0" @@ -3493,10 +4032,12 @@ htmlparser2@^3.9.2: http-cache-semantics@^3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== http-errors@~1.6.2: version "1.6.3" - resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: depd "~1.1.2" inherits "2.0.3" @@ -3506,6 +4047,7 @@ http-errors@~1.6.2: http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== dependencies: agent-base "4" debug "3.1.0" @@ -3513,6 +4055,7 @@ http-proxy-agent@^2.1.0: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -3521,10 +4064,12 @@ http-signature@~1.2.0: https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= https-proxy-agent@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== dependencies: agent-base "^4.1.0" debug "^3.1.0" @@ -3532,36 +4077,43 @@ https-proxy-agent@^2.2.1: humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= dependencies: ms "^2.0.0" iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== dependencies: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" @@ -3569,28 +4121,34 @@ import-local@^1.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -3598,18 +4156,22 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== init-package-json@^1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" + integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== dependencies: glob "^7.1.1" npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" @@ -3623,6 +4185,7 @@ init-package-json@^1.10.3: inquirer@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -3641,78 +4204,94 @@ inquirer@^6.2.0: interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= invariant@^2.2.0, invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" - resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-ci@^1.0.10: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: ci-info "^1.5.0" is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= dependencies: css-color-names "^0.0.4" hex-color-regex "^1.1.0" @@ -3724,22 +4303,26 @@ is-color-stop@^1.0.0: is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -3748,6 +4331,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -3756,216 +4340,261 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= dependencies: is-extglob "^2.1.1" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== is-obj@^1.0.0: version "1.0.1" - resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-subset@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= dependencies: html-comment-regex "^1.1.0" is-svg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== dependencies: html-comment-regex "^1.1.0" is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== dependencies: has-symbols "^1.0.0" is-text-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= dependencies: text-extensions "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-url@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0, isobject@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== istanbul-lib-coverage@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" + integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA== istanbul-lib-hook@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== dependencies: append-transform "^0.4.0" istanbul-lib-instrument@^2.1.0: version "2.3.2" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-2.3.2.tgz#b287cbae2b5f65f3567b05e2e29b275eaf92d25e" + integrity sha512-l7TD/VnBsIB2OJvSyxaLW/ab1+92dxZNH9wLH7uHPPioy3JZ8tnx2UXUdKmdkgmP2EFPzg64CToUP6dAS3U32Q== dependencies: "@babel/generator" "7.0.0-beta.51" "@babel/parser" "7.0.0-beta.51" @@ -3978,6 +4607,7 @@ istanbul-lib-instrument@^2.1.0: istanbul-lib-report@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== dependencies: istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" @@ -3987,6 +4617,7 @@ istanbul-lib-report@^1.1.3: istanbul-lib-source-maps@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== dependencies: debug "^3.1.0" istanbul-lib-coverage "^1.2.1" @@ -3997,16 +4628,19 @@ istanbul-lib-source-maps@^1.2.5: istanbul-reports@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== dependencies: handlebars "^4.0.3" js-base64@^2.1.9: version "2.4.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" + integrity sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ== js-beautify@^1.7.5: - version "1.8.6" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.8.6.tgz#6a7e61e47a6e45fb58c5e22499eed350f8607d98" + version "1.8.7" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.8.7.tgz#d87100f714aeb3c388bce9ef011442fc07bda93a" + integrity sha512-yhAMCTv0L9GNg6Gql7i+g4C1z9rQhfHXy4J0TGYFoBzzHR4reWYS573gkRrPuE58dYOH451LmBeAb8L1pLEfdA== dependencies: config-chain "~1.1.5" editorconfig "^0.15.0" @@ -4016,18 +4650,22 @@ js-beautify@^1.7.5: js-levenshtein@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" + integrity sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow== js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4035,6 +4673,7 @@ js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= dependencies: argparse "^1.0.7" esprima "^2.6.0" @@ -4042,54 +4681,66 @@ js-yaml@~3.7.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@^0.5.0: version "0.5.1" - resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= json5@^1.0.1: version "1.0.1" - resolved "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: minimist "^1.2.0" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4099,60 +4750,68 @@ jsprim@^1.2.2: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: invert-kv "^2.0.0" lerna@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.4.0.tgz#c1403852b4b3fa986072de11d7f549604fd41775" + version "3.4.3" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.4.3.tgz#501454efb453c65c305802d370ee337f7298787e" + integrity sha512-tWq1LvpHqkyB+FaJCmkEweivr88yShDMmauofPVdh0M5gU1cVucszYnIgWafulKYu2LMQ3IfUMUU5Pp3+MvADQ== dependencies: - "@lerna/add" "^3.3.2" - "@lerna/bootstrap" "^3.3.2" - "@lerna/changed" "^3.3.2" + "@lerna/add" "^3.4.1" + "@lerna/bootstrap" "^3.4.1" + "@lerna/changed" "^3.4.1" "@lerna/clean" "^3.3.2" "@lerna/cli" "^3.2.0" - "@lerna/create" "^3.3.1" + "@lerna/create" "^3.4.1" "@lerna/diff" "^3.3.0" "@lerna/exec" "^3.3.2" "@lerna/import" "^3.3.1" "@lerna/init" "^3.3.0" "@lerna/link" "^3.3.0" "@lerna/list" "^3.3.2" - "@lerna/publish" "^3.4.0" + "@lerna/publish" "^3.4.3" "@lerna/run" "^3.3.2" - "@lerna/version" "^3.3.2" + "@lerna/version" "^3.4.1" import-local "^1.0.0" npmlog "^4.1.2" levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4160,6 +4819,7 @@ levn@~0.3.0: libnpmaccess@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-3.0.0.tgz#33cc9c8a5cb53e87d06bf2e547c2eba974f619af" + integrity sha512-SiE4AZAzMpD7pmmXHfgD7rof8QIQGoKaeyAS8exgx2CKA6tzRTbRljq1xM4Tgj8/tIg+KBJPJWkR0ifqKT3irQ== dependencies: aproba "^2.0.0" get-stream "^4.0.0" @@ -4168,7 +4828,8 @@ libnpmaccess@^3.0.0: load-json-file@^1.0.0: version "1.1.0" - resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4179,6 +4840,7 @@ load-json-file@^1.0.0: load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -4188,6 +4850,7 @@ load-json-file@^4.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4195,6 +4858,7 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" path-exists "^3.0.0" @@ -4202,26 +4866,32 @@ locate-path@^3.0.0: lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash.clone@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.template@^4.0.2: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" @@ -4229,58 +4899,68 @@ lodash.template@^4.0.2: lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: lodash._reinterpolate "~3.0.0" lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: +lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" magic-string@^0.22.4: version "0.22.5" - resolved "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== dependencies: vlq "^0.2.2" make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" make-fetch-happen@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" + integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ== dependencies: agentkeepalive "^3.4.1" cacache "^11.0.1" @@ -4297,69 +4977,89 @@ make-fetch-happen@^4.0.1: map-age-cleaner@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ== dependencies: p-defer "^1.0.0" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" +marked@^0.3.17: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== + marked@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/marked/-/marked-0.4.0.tgz#9ad2c2a7a1791f10a852e0112f77b571dce10c66" + integrity sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw== math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= md5-hex@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" mdn-data@~1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" mem@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== dependencies: map-age-cleaner "^0.1.1" mimic-fn "^1.0.0" @@ -4368,6 +5068,7 @@ mem@^4.0.0: meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -4383,6 +5084,7 @@ meow@^3.3.0: meow@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" + integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== dependencies: camelcase-keys "^4.0.0" decamelize-keys "^1.0.0" @@ -4397,22 +5099,26 @@ meow@^4.0.0: merge-source-map@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" + integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= dependencies: source-map "^0.5.6" merge-source-map@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== dependencies: source-map "^0.6.1" merge2@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -4431,6 +5137,7 @@ micromatch@^2.3.11: micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4449,6 +5156,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" @@ -4456,70 +5164,84 @@ miller-rabin@^4.0.0: mime-db@~1.36.0: version "1.36.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.20" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + integrity sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A== dependencies: mime-db "~1.36.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist-options@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" minimist@0.0.8: version "0.0.8" - resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" - resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" - resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= minipass@^2.2.1, minipass@^2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + integrity sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + version "1.1.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== dependencies: minipass "^2.2.1" mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -4535,19 +5257,22 @@ mississippi@^3.0.0: mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" - resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" mocha@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== dependencies: browser-stdout "1.3.1" commander "2.15.1" @@ -4564,10 +5289,12 @@ mocha@^5.2.0: modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" @@ -4579,14 +5306,17 @@ move-concurrently@^1.0.1: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.0.0, ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= dependencies: array-differ "^1.0.0" array-union "^1.0.1" @@ -4596,14 +5326,17 @@ multimatch@^2.1.0: mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= nan@^2.0.7, nan@^2.9.2: version "2.11.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4620,6 +5353,7 @@ nanomatch@^1.2.9: needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -4628,10 +5362,12 @@ needle@^2.2.1: nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" + integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== dependencies: encoding "^0.1.11" json-parse-better-errors "^1.0.0" @@ -4640,10 +5376,12 @@ node-fetch-npm@^2.0.2: node-forge@^0.7.1: version "0.7.6" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" + integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -4661,6 +5399,7 @@ node-gyp@^3.8.0: node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -4689,6 +5428,7 @@ node-libs-browser@^2.0.0: node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -4701,21 +5441,24 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.0.0-alpha.11: - version "1.0.0-alpha.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.12.tgz#32e461b879ea76ac674e511d9832cf29da345268" +node-releases@^1.0.0-alpha.14: + version "1.0.0-alpha.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.14.tgz#da9e2780add4bbb59ad890af9e2018a1d9c0034b" + integrity sha512-G8nnF9cP9QPP/jUmYWw/uUUhumHmkm+X/EarCugYFjYm2uXRMFeOD6CVT3RLdoyCvDUNy51nirGfUItKWs/S1g== dependencies: semver "^5.3.0" "nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1, nopt@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -4723,6 +5466,7 @@ nopt@^4.0.1, nopt@~4.0.1: normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -4732,16 +5476,19 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= normalize-url@^1.4.0: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= dependencies: object-assign "^4.0.1" prepend-http "^1.0.0" @@ -4751,14 +5498,17 @@ normalize-url@^1.4.0: normalize-url@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== npm-lifecycle@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz#1eda2eedb82db929e3a0c50341ab0aad140ed569" + integrity sha512-QbBfLlGBKsktwBZLj6AviHC6Q9Y3R/AY4a2PYSIRhSKSS0/CxRyD/PfxEX6tPeOCXQgMSNdwGeECacstgptc+g== dependencies: byline "^5.0.0" graceful-fs "^4.1.11" @@ -4772,6 +5522,7 @@ npm-lifecycle@^2.0.0: "npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" + integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== dependencies: hosted-git-info "^2.6.0" osenv "^0.1.5" @@ -4779,8 +5530,9 @@ npm-lifecycle@^2.0.0: validate-npm-package-name "^3.0.0" npm-packlist@^1.1.10, npm-packlist@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -4788,6 +5540,7 @@ npm-packlist@^1.1.10, npm-packlist@^1.1.6: npm-pick-manifest@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz#dc381bdd670c35d81655e1d5a94aa3dd4d87fce5" + integrity sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ== dependencies: npm-package-arg "^6.0.0" semver "^5.4.1" @@ -4795,6 +5548,7 @@ npm-pick-manifest@^2.1.0: npm-registry-fetch@^3.0.0, npm-registry-fetch@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz#aa7d9a7c92aff94f48dba0984bdef4bd131c88cc" + integrity sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" @@ -4806,12 +5560,14 @@ npm-registry-fetch@^3.0.0, npm-registry-fetch@^3.8.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -4821,20 +5577,24 @@ npm-run-path@^2.0.0: nth-check@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= dependencies: boolbase "~1.0.0" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nyc@^12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/nyc/-/nyc-12.0.2.tgz#8a4a4ed690966c11ec587ff87eea0c12c974ba99" + integrity sha1-ikpO1pCWbBHsWH/4fuoMEsl0upk= dependencies: archy "^1.0.0" arrify "^1.0.1" @@ -4867,14 +5627,17 @@ nyc@^12.0.2: oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -4883,20 +5646,24 @@ object-copy@^0.1.0: object-inspect@~1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" + integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== object-keys@^1.0.12, object-keys@^1.0.6: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= dependencies: define-properties "^1.1.2" es-abstract "^1.5.1" @@ -4904,6 +5671,7 @@ object.getownpropertydescriptors@^2.0.3: object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -4911,12 +5679,14 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" object.values@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" + integrity sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo= dependencies: define-properties "^1.1.2" es-abstract "^1.6.1" @@ -4926,30 +5696,35 @@ object.values@^1.0.4: on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" opn@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" + integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== dependencies: is-wsl "^1.1.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -4957,6 +5732,7 @@ optimist@^0.6.1: optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -4968,6 +5744,7 @@ optionator@^0.8.1: ora@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" + integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== dependencies: chalk "^2.3.1" cli-cursor "^2.1.0" @@ -4979,14 +5756,17 @@ ora@^2.1.0: os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" @@ -4995,6 +5775,7 @@ os-locale@^2.0.0: os-locale@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== dependencies: execa "^0.10.0" lcid "^2.0.0" @@ -5003,10 +5784,12 @@ os-locale@^3.0.0: os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@0, osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -5014,74 +5797,89 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5: p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-is-promise@^1.1.0: version "1.1.0" - resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== dependencies: p-try "^2.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-map-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" + integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= dependencies: p-reduce "^1.0.0" p-map@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== p-pipe@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" + integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== p-waterfall@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00" + integrity sha1-ftlLPOszMngjU69qrhGqn8I1uwA= dependencies: p-reduce "^1.0.0" pacote@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.1.0.tgz#59810859bbd72984dcb267269259375d32f391e5" + integrity sha512-AFXaSWhOtQf3jHqEvg+ZYH/dfT8TKq6TKspJ4qEFwVVuh5aGvMIk6SNF8vqfzz+cBceDIs9drOcpBbrPai7i+g== dependencies: bluebird "^3.5.1" cacache "^11.0.2" @@ -5114,22 +5912,26 @@ pacote@^9.1.0: pako@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= dependencies: cyclist "~0.2.2" inherits "^2.0.3" readable-stream "^2.1.5" parcel-bundler@^1.9.7: - version "1.10.1" - resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.10.1.tgz#a37a040e79d4bbd2901e487097eee72a8ab8868a" + version "1.10.3" + resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.10.3.tgz#8502b40d3f23139093b25e82658f6060f025c024" + integrity sha512-Lj31fr5o2AZFbazghL/MrubzvJEXLwx24rd3MiR3lncmqCXbd5q0hgl1kpV6X+vRaN9/cSDR8G0lotmgl5OyZg== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.0.0" @@ -5191,7 +5993,8 @@ parcel-bundler@^1.9.7: parse-asn1@^5.0.0: version "5.1.1" - resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -5202,10 +6005,12 @@ parse-asn1@^5.0.0: parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" + integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -5215,12 +6020,14 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -5228,44 +6035,54 @@ parse-json@^4.0.0: parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -5274,12 +6091,14 @@ path-type@^1.0.0: path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5289,57 +6108,69 @@ pbkdf2@^3.0.3: pegjs@^0.10.0: version "0.10.0" - resolved "http://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" + resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" + integrity sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0= performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= physical-cpu-count@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" + integrity sha1-GN4vl+S/epVRrXURlCtUlverpmA= pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= dependencies: find-up "^1.0.0" pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" platform@^1.3.3: version "1.3.5" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" + integrity sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-calc@^5.2.0: version "5.3.1" - resolved "http://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= dependencies: postcss "^5.0.2" postcss-message-helpers "^2.0.0" @@ -5348,6 +6179,7 @@ postcss-calc@^5.2.0: postcss-calc@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.2.tgz#4d9a43e27dbbf27d095fecb021ac6896e2318337" + integrity sha512-fiznXjEN5T42Qm7qqMCVJXS3roaj9r4xsSi+meaBVe7CJBl8t/QLOXu02Z2E6oWAMWIvCuF6JrvzFekmVEbOKA== dependencies: css-unit-converter "^1.1.1" postcss "^7.0.2" @@ -5357,6 +6189,7 @@ postcss-calc@^6.0.2: postcss-colormin@^2.1.8: version "2.2.2" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= dependencies: colormin "^1.0.5" postcss "^5.0.13" @@ -5365,6 +6198,7 @@ postcss-colormin@^2.1.8: postcss-colormin@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.2.tgz#93cd1fa11280008696887db1a528048b18e7ed99" + integrity sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw== dependencies: browserslist "^4.0.0" color "^3.0.0" @@ -5375,6 +6209,7 @@ postcss-colormin@^4.0.2: postcss-convert-values@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= dependencies: postcss "^5.0.11" postcss-value-parser "^3.1.2" @@ -5382,61 +6217,71 @@ postcss-convert-values@^2.3.4: postcss-convert-values@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== dependencies: postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-discard-comments@^2.0.4: version "2.0.4" - resolved "http://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= dependencies: postcss "^5.0.14" postcss-discard-comments@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz#30697735b0c476852a7a11050eb84387a67ef55d" + integrity sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ== dependencies: postcss "^7.0.0" postcss-discard-duplicates@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= dependencies: postcss "^5.0.4" postcss-discard-duplicates@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== dependencies: postcss "^7.0.0" postcss-discard-empty@^2.0.1: version "2.1.0" - resolved "http://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= dependencies: postcss "^5.0.14" postcss-discard-empty@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== dependencies: postcss "^7.0.0" postcss-discard-overridden@^0.1.1: version "0.1.1" - resolved "http://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= dependencies: postcss "^5.0.16" postcss-discard-overridden@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== dependencies: postcss "^7.0.0" postcss-discard-unused@^2.2.1: version "2.2.3" - resolved "http://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= dependencies: postcss "^5.0.14" uniqs "^2.0.0" @@ -5444,12 +6289,14 @@ postcss-discard-unused@^2.2.1: postcss-filter-plugins@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" + integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== dependencies: postcss "^5.0.4" postcss-merge-idents@^2.1.5: version "2.1.7" - resolved "http://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= dependencies: has "^1.0.1" postcss "^5.0.10" @@ -5458,12 +6305,14 @@ postcss-merge-idents@^2.1.5: postcss-merge-longhand@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= dependencies: postcss "^5.0.4" postcss-merge-longhand@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.6.tgz#2b938fa3529c3d1657e53dc7ff0fd604dbc85ff1" + integrity sha512-JavnI+V4IHWsaUAfOoKeMEiJQGXTraEy1nHM0ILlE6NIQPEZrJDAnPh3lNGZ5HAk2mSSrwp66JoGhvjp6SqShA== dependencies: css-color-names "0.0.4" postcss "^7.0.0" @@ -5473,6 +6322,7 @@ postcss-merge-longhand@^4.0.6: postcss-merge-rules@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= dependencies: browserslist "^1.5.2" caniuse-api "^1.5.2" @@ -5483,6 +6333,7 @@ postcss-merge-rules@^2.0.3: postcss-merge-rules@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz#2be44401bf19856f27f32b8b12c0df5af1b88e74" + integrity sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag== dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" @@ -5494,10 +6345,12 @@ postcss-merge-rules@^4.0.2: postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= postcss-minify-font-values@^1.0.2: version "1.0.5" - resolved "http://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= dependencies: object-assign "^4.0.1" postcss "^5.0.4" @@ -5506,13 +6359,15 @@ postcss-minify-font-values@^1.0.2: postcss-minify-font-values@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== dependencies: postcss "^7.0.0" postcss-value-parser "^3.0.0" postcss-minify-gradients@^1.0.1: version "1.0.5" - resolved "http://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= dependencies: postcss "^5.0.12" postcss-value-parser "^3.3.0" @@ -5520,6 +6375,7 @@ postcss-minify-gradients@^1.0.1: postcss-minify-gradients@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz#6da95c6e92a809f956bb76bf0c04494953e1a7dd" + integrity sha512-pySEW3E6Ly5mHm18rekbWiAjVi/Wj8KKt2vwSfVFAWdW6wOIekgqxKxLU7vJfb107o3FDNPkaYFCxGAJBFyogA== dependencies: cssnano-util-get-arguments "^4.0.0" is-color-stop "^1.0.0" @@ -5528,7 +6384,8 @@ postcss-minify-gradients@^4.0.1: postcss-minify-params@^1.0.4: version "1.2.2" - resolved "http://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= dependencies: alphanum-sort "^1.0.1" postcss "^5.0.2" @@ -5538,6 +6395,7 @@ postcss-minify-params@^1.0.4: postcss-minify-params@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz#5b2e2d0264dd645ef5d68f8fec0d4c38c1cf93d2" + integrity sha512-h4W0FEMEzBLxpxIVelRtMheskOKKp52ND6rJv+nBS33G1twu2tCyurYj/YtgU76+UDCvWeNs0hs8HFAWE2OUFg== dependencies: alphanum-sort "^1.0.0" browserslist "^4.0.0" @@ -5548,7 +6406,8 @@ postcss-minify-params@^4.0.1: postcss-minify-selectors@^2.0.4: version "2.1.1" - resolved "http://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= dependencies: alphanum-sort "^1.0.2" has "^1.0.1" @@ -5558,6 +6417,7 @@ postcss-minify-selectors@^2.0.4: postcss-minify-selectors@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz#a891c197977cc37abf60b3ea06b84248b1c1e9cd" + integrity sha512-8+plQkomve3G+CodLCgbhAKrb5lekAnLYuL1d7Nz+/7RANpBEVdgBkPNwljfSKvZ9xkkZTZITd04KP+zeJTJqg== dependencies: alphanum-sort "^1.0.0" has "^1.0.0" @@ -5566,19 +6426,22 @@ postcss-minify-selectors@^4.0.1: postcss-normalize-charset@^1.1.0: version "1.1.1" - resolved "http://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= dependencies: postcss "^5.0.5" postcss-normalize-charset@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== dependencies: postcss "^7.0.0" postcss-normalize-display-values@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz#d9a83d47c716e8a980f22f632c8b0458cfb48a4c" + integrity sha512-R5mC4vaDdvsrku96yXP7zak+O3Mm9Y8IslUobk7IMP+u/g+lXvcN4jngmHY5zeJnrQvE13dfAg5ViU05ZFDwdg== dependencies: cssnano-util-get-match "^4.0.0" postcss "^7.0.0" @@ -5587,6 +6450,7 @@ postcss-normalize-display-values@^4.0.1: postcss-normalize-positions@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz#ee2d4b67818c961964c6be09d179894b94fd6ba1" + integrity sha512-GNoOaLRBM0gvH+ZRb2vKCIujzz4aclli64MBwDuYGU2EY53LwiP7MxOZGE46UGtotrSnmarPPZ69l2S/uxdaWA== dependencies: cssnano-util-get-arguments "^4.0.0" has "^1.0.0" @@ -5596,6 +6460,7 @@ postcss-normalize-positions@^4.0.1: postcss-normalize-repeat-style@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz#5293f234b94d7669a9f805495d35b82a581c50e5" + integrity sha512-fFHPGIjBUyUiswY2rd9rsFcC0t3oRta4wxE1h3lpwfQZwFeFjXFSiDtdJ7APCmHQOnUZnqYBADNRPKPwFAONgA== dependencies: cssnano-util-get-arguments "^4.0.0" cssnano-util-get-match "^4.0.0" @@ -5605,6 +6470,7 @@ postcss-normalize-repeat-style@^4.0.1: postcss-normalize-string@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz#23c5030c2cc24175f66c914fa5199e2e3c10fef3" + integrity sha512-IJoexFTkAvAq5UZVxWXAGE0yLoNN/012v7TQh5nDo6imZJl2Fwgbhy3J2qnIoaDBrtUP0H7JrXlX1jjn2YcvCQ== dependencies: has "^1.0.0" postcss "^7.0.0" @@ -5613,6 +6479,7 @@ postcss-normalize-string@^4.0.1: postcss-normalize-timing-functions@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz#8be83e0b9cb3ff2d1abddee032a49108f05f95d7" + integrity sha512-1nOtk7ze36+63ONWD8RCaRDYsnzorrj+Q6fxkQV+mlY5+471Qx9kspqv0O/qQNMeApg8KNrRf496zHwJ3tBZ7w== dependencies: cssnano-util-get-match "^4.0.0" postcss "^7.0.0" @@ -5621,6 +6488,7 @@ postcss-normalize-timing-functions@^4.0.1: postcss-normalize-unicode@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== dependencies: browserslist "^4.0.0" postcss "^7.0.0" @@ -5628,7 +6496,8 @@ postcss-normalize-unicode@^4.0.1: postcss-normalize-url@^3.0.7: version "3.0.8" - resolved "http://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= dependencies: is-absolute-url "^2.0.0" normalize-url "^1.4.0" @@ -5638,6 +6507,7 @@ postcss-normalize-url@^3.0.7: postcss-normalize-url@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== dependencies: is-absolute-url "^2.0.0" normalize-url "^3.0.0" @@ -5647,6 +6517,7 @@ postcss-normalize-url@^4.0.1: postcss-normalize-whitespace@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz#d14cb639b61238418ac8bc8d3b7bdd65fc86575e" + integrity sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw== dependencies: postcss "^7.0.0" postcss-value-parser "^3.0.0" @@ -5654,6 +6525,7 @@ postcss-normalize-whitespace@^4.0.1: postcss-ordered-values@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.1" @@ -5661,6 +6533,7 @@ postcss-ordered-values@^2.1.0: postcss-ordered-values@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz#2e3b432ef3e489b18333aeca1f1295eb89be9fc2" + integrity sha512-PeJiLgJWPzkVF8JuKSBcylaU+hDJ/TX3zqAMIjlghgn1JBi6QwQaDZoDIlqWRcCAI8SxKrt3FCPSRmOgKRB97Q== dependencies: cssnano-util-get-arguments "^4.0.0" postcss "^7.0.0" @@ -5668,20 +6541,23 @@ postcss-ordered-values@^4.1.1: postcss-reduce-idents@^2.2.2: version "2.4.0" - resolved "http://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.2" postcss-reduce-initial@^1.0.0: version "1.0.1" - resolved "http://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= dependencies: postcss "^5.0.4" postcss-reduce-initial@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz#bac8e325d67510ee01fa460676dc8ea9e3b40f15" + integrity sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug== dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" @@ -5690,7 +6566,8 @@ postcss-reduce-initial@^4.0.2: postcss-reduce-transforms@^1.0.3: version "1.0.4" - resolved "http://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= dependencies: has "^1.0.1" postcss "^5.0.8" @@ -5699,6 +6576,7 @@ postcss-reduce-transforms@^1.0.3: postcss-reduce-transforms@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz#8600d5553bdd3ad640f43bff81eb52f8760d4561" + integrity sha512-sZVr3QlGs0pjh6JAIe6DzWvBaqYw05V1t3d9Tp+VnFRT5j+rsqoWsysh/iSD7YNsULjq9IAylCznIwVd5oU/zA== dependencies: cssnano-util-get-match "^4.0.0" has "^1.0.0" @@ -5708,6 +6586,7 @@ postcss-reduce-transforms@^4.0.1: postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= dependencies: flatten "^1.0.2" indexes-of "^1.0.1" @@ -5716,6 +6595,7 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: postcss-selector-parser@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= dependencies: dot-prop "^4.1.1" indexes-of "^1.0.1" @@ -5723,7 +6603,8 @@ postcss-selector-parser@^3.0.0: postcss-svgo@^2.1.1: version "2.1.6" - resolved "http://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= dependencies: is-svg "^2.0.0" postcss "^5.0.14" @@ -5733,6 +6614,7 @@ postcss-svgo@^2.1.1: postcss-svgo@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.1.tgz#5628cdb38f015de6b588ce6d0bf0724b492b581d" + integrity sha512-YD5uIk5NDRySy0hcI+ZJHwqemv2WiqqzDgtvgMzO8EGSkK5aONyX8HMVFRFJSdO8wUWTuisUFn/d7yRRbBr5Qw== dependencies: is-svg "^3.0.0" postcss "^7.0.0" @@ -5741,7 +6623,8 @@ postcss-svgo@^4.0.1: postcss-unique-selectors@^2.0.2: version "2.0.2" - resolved "http://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= dependencies: alphanum-sort "^1.0.1" postcss "^5.0.4" @@ -5750,18 +6633,21 @@ postcss-unique-selectors@^2.0.2: postcss-unique-selectors@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== dependencies: alphanum-sort "^1.0.0" postcss "^7.0.0" uniqs "^2.0.0" postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== postcss-zindex@^2.0.1: version "2.2.0" - resolved "http://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= dependencies: has "^1.0.1" postcss "^5.0.4" @@ -5770,6 +6656,7 @@ postcss-zindex@^2.0.1: postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== dependencies: chalk "^1.1.3" js-base64 "^2.1.9" @@ -5779,14 +6666,16 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 postcss@^6.0.19: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== dependencies: chalk "^2.4.1" source-map "^0.6.1" supports-color "^5.4.0" postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.4.tgz#b5a059597d2c1a8a9916cb6efb0b294f70b4f309" + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" + integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== dependencies: chalk "^2.4.1" source-map "^0.6.1" @@ -5795,6 +6684,7 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2: posthtml-parser@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.3.3.tgz#3fe986fca9f00c0f109d731ba590b192f26e776d" + integrity sha512-H/Z/yXGwl49A7hYQLV1iQ3h87NE0aZ/PMZhFwhw3lKeCAN+Ti4idrHvVvh4/GX10I7u77aQw+QB4vV5/Lzvv5A== dependencies: htmlparser2 "^3.9.2" isobject "^2.1.0" @@ -5803,6 +6693,7 @@ posthtml-parser@^0.3.3: posthtml-parser@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.1.tgz#95b78fef766fbbe0a6f861b6e95582bc3d1ff933" + integrity sha512-h7vXIQ21Ikz2w5wPClPakNP6mJeJCK6BT0GpqnQrNNABdR7/TchNlFyryL1Bz6Ww53YWCKkr6tdZuHlxY1AVdQ== dependencies: htmlparser2 "^3.9.2" object-assign "^4.1.1" @@ -5810,10 +6701,12 @@ posthtml-parser@^0.4.0: posthtml-render@^1.1.0, posthtml-render@^1.1.3, posthtml-render@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.1.4.tgz#95dac09892f4f183fad5ac823f08f42c0256551e" + integrity sha512-jL6eFIzoN3xUEvbo33OAkSDE2VIKU4JQ1wENOows1DpfnrdapR/K3Q1/fB43Mq7wQlcSgRm23nFrvoioufM7eA== posthtml@^0.11.2, posthtml@^0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.3.tgz#17ea2921b0555b7455f33c977bd16d8b8cb74f27" + integrity sha512-quMHnDckt2DQ9lRi6bYLnuyBDnVzK+McHa8+ar4kTdYbWEo/92hREOu3h70ZirudOOp/my2b3r0m5YtxY52yrA== dependencies: object-assign "^4.1.1" posthtml-parser "^0.3.3" @@ -5822,38 +6715,47 @@ posthtml@^0.11.2, posthtml@^0.11.3: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise-retry@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= dependencies: err-code "^1.0.0" retry "^0.10.0" @@ -5861,40 +6763,48 @@ promise-retry@^1.1.1: promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= dependencies: read "1" proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= protoduck@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.0.tgz#752145e6be0ad834cb25716f670a713c860dce70" + integrity sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ== dependencies: genfun "^4.0.1" pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: version "1.1.29" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== public-encrypt@^4.0.0: - version "4.0.2" - resolved "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" + safe-buffer "^5.1.2" pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -5902,6 +6812,7 @@ pump@^2.0.0: pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -5909,6 +6820,7 @@ pump@^3.0.0: pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: duplexify "^3.6.0" inherits "^2.0.3" @@ -5917,26 +6829,32 @@ pumpify@^1.3.3: punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= dependencies: object-assign "^4.1.0" strict-uri-encode "^1.0.0" @@ -5944,18 +6862,22 @@ query-string@^4.1.0: querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= quote-stream@^1.0.1, quote-stream@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" + integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= dependencies: buffer-equal "0.0.1" minimist "^1.1.3" @@ -5964,6 +6886,7 @@ quote-stream@^1.0.1, quote-stream@~1.0.2: randomatic@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" + integrity sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ== dependencies: is-number "^4.0.0" kind-of "^6.0.0" @@ -5972,12 +6895,14 @@ randomatic@^3.0.0: randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" @@ -5985,10 +6910,12 @@ randomfill@^1.0.3: range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" ini "~1.3.0" @@ -5998,12 +6925,14 @@ rc@^1.2.7: read-cmd-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs= dependencies: graceful-fs "^4.1.2" "read-package-json@1 || 2", read-package-json@^2.0.0: version "2.0.13" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + integrity sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg== dependencies: glob "^7.1.1" json-parse-better-errors "^1.0.1" @@ -6015,6 +6944,7 @@ read-cmd-shim@^1.0.1: read-package-tree@^5.1.6: version "5.2.1" resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63" + integrity sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA== dependencies: debuglog "^1.0.1" dezalgo "^1.0.0" @@ -6025,6 +6955,7 @@ read-package-tree@^5.1.6: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -6032,6 +6963,7 @@ read-pkg-up@^1.0.1: read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -6039,6 +6971,7 @@ read-pkg-up@^3.0.0: read-pkg@^1.0.0, read-pkg@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -6047,6 +6980,7 @@ read-pkg@^1.0.0, read-pkg@^1.1.0: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -6055,12 +6989,14 @@ read-pkg@^3.0.0: read@1, read@~1.0.1: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3: version "2.3.6" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6073,6 +7009,7 @@ read@1, read@~1.0.1: readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= dependencies: debuglog "^1.0.1" dezalgo "^1.0.0" @@ -6082,6 +7019,7 @@ readdir-scoped-modules@^1.0.0: readdirp@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" micromatch "^3.1.10" @@ -6090,12 +7028,14 @@ readdirp@^2.0.0: rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -6103,13 +7043,15 @@ redent@^1.0.0: redent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: indent-string "^3.0.0" strip-indent "^2.0.0" reduce-css-calc@^1.2.6: version "1.3.0" - resolved "http://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= dependencies: balanced-match "^0.4.2" math-expression-evaluator "^1.2.14" @@ -6118,6 +7060,7 @@ reduce-css-calc@^1.2.6: reduce-css-calc@^2.0.0: version "2.1.5" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.5.tgz#f283712f0c9708ef952d328f4b16112d57b03714" + integrity sha512-AybiBU03FKbjYzyvJvwkJZY6NLN+80Ufc2EqEs+41yQH+8wqBEslD6eGiS0oIeq5TNLA5PrhBeYHXWdn8gtW7A== dependencies: css-unit-converter "^1.1.1" postcss-value-parser "^3.3.0" @@ -6125,42 +7068,50 @@ reduce-css-calc@^2.0.0: reduce-function-call@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= dependencies: balanced-match "^0.4.2" regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== dependencies: regenerate "^1.4.0" regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.12.0: version "0.12.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== regenerator-transform@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== dependencies: private "^0.1.6" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -6168,6 +7119,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: regexpu-core@^4.1.3, regexpu-core@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" + integrity sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^7.0.0" @@ -6179,34 +7131,41 @@ regexpu-core@^4.1.3, regexpu-core@^4.2.0: regjsgen@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + integrity sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA== regjsparser@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" + integrity sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA== dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -6232,42 +7191,51 @@ request@^2.87.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@^1.1.5, resolve@^1.1.6, resolve@^1.3.2, resolve@^1.4.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -6275,28 +7243,34 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" @@ -6304,56 +7278,67 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: aproba "^1.1.1" rxjs@^6.1.0: version "6.3.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== dependencies: tslib "^1.9.0" safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== safer-eval@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/safer-eval/-/safer-eval-1.2.3.tgz#73ba74a34bc8a07d6a44135c815fd18a8eebe7a0" + integrity sha512-nDwXOhiheoaBT6op02n8wzsshjLXHhh4YAeqsDEoVmy1k2+lGv/ENLsGaWqkaKArUkUx48VO12/ZPa3sI/OEqQ== dependencies: clones "^1.1.0" sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -6372,6 +7357,7 @@ send@0.16.2: serialize-to-js@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-1.2.1.tgz#2e87f61f938826d24c463a7cbd0dd2929ec38008" + integrity sha512-TK6d30GNkOLeFDPuP6Jfy1Q1V31GxzppYTt2lzr8KWmIUKomFj+260QP5o4AhHLu0pr6urgyS8i/Z1PqurjBoA== dependencies: js-beautify "^1.7.5" safer-eval "^1.2.3" @@ -6379,6 +7365,7 @@ serialize-to-js@^1.1.1: serve-static@^1.12.4: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -6388,10 +7375,12 @@ serve-static@^1.12.4: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6401,6 +7390,7 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6410,14 +7400,17 @@ set-value@^2.0.0: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -6425,20 +7418,24 @@ sha.js@^2.4.0, sha.js@^2.4.8: shallow-copy@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shelljs@^0.8.2: +shelljs@^0.8.1, shelljs@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" + integrity sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -6447,32 +7444,39 @@ shelljs@^0.8.2: sigmund@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= dependencies: is-arrayish "^0.3.1" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slide@^1.1.5, slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= smart-buffer@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" + integrity sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg== snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -6481,12 +7485,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -6500,6 +7506,7 @@ snapdragon@^0.8.1: socks-proxy-agent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473" + integrity sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw== dependencies: agent-base "~4.2.0" socks "~2.2.0" @@ -6507,6 +7514,7 @@ socks-proxy-agent@^4.0.0: socks@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.1.tgz#68ad678b3642fbc5d99c64c165bc561eab0215f9" + integrity sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w== dependencies: ip "^1.1.5" smart-buffer "^4.0.1" @@ -6514,18 +7522,21 @@ socks@~2.2.0: sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= dependencies: is-plain-obj "^1.0.0" sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= dependencies: is-plain-obj "^1.0.0" source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: atob "^2.1.1" decode-uri-component "^0.2.0" @@ -6536,6 +7547,7 @@ source-map-resolve@^0.5.0: source-map-support@~0.5.6: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6543,18 +7555,22 @@ source-map-support@~0.5.6: source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= spawn-wrap@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" + integrity sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg== dependencies: foreground-child "^1.5.6" mkdirp "^0.5.0" @@ -6564,19 +7580,22 @@ spawn-wrap@^1.4.2: which "^1.3.0" spdx-correct@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.1.tgz#434434ff9d1726b4d9f4219d1004813d80639e30" + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -6584,63 +7603,72 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" + integrity sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" split2@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== dependencies: through2 "^2.0.2" split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: through "2" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + version "1.15.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.1.tgz#b79a089a732e346c6e0714830f36285cd38191a2" + integrity sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - safer-buffer "^2.0.2" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" ssri@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: figgy-pudding "^3.5.1" stable@~0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== static-eval@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.0.tgz#0e821f8926847def7b4b50cda5d55c04a9b13864" + integrity sha512-6flshd3F1Gwm+Ksxq463LtFd1liC77N/PX1FVVc3OzL3hAmo2fwHFbuArkcfi7s9rTNsLEhcRmXGFZhlgy40uw== dependencies: escodegen "^1.8.1" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -6648,6 +7676,7 @@ static-extend@^0.1.1: static-module@^2.2.0: version "2.2.5" resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" + integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== dependencies: concat-stream "~1.6.0" convert-source-map "^1.5.1" @@ -6667,14 +7696,17 @@ static-module@^2.2.0: "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= dependencies: inherits "~2.0.1" readable-stream "^2.0.2" @@ -6682,6 +7714,7 @@ stream-browserify@^2.0.1: stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" @@ -6689,6 +7722,7 @@ stream-each@^1.1.0: stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -6699,14 +7733,17 @@ stream-http@^2.7.2: stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -6715,6 +7752,7 @@ string-width@^1.0.1: "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -6722,52 +7760,62 @@ string-width@^1.0.1: string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= strong-log-transformer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.0.0.tgz#fa6d8e0a9e62b3c168c3cad5ae5d00dc97ba26cc" + integrity sha512-FQmNqAXJgOX8ygOcvPLlGWBNT41mvNJ9ALoYf0GTwVt9t30mGTqpmp/oJx5gLcu52DXK10kS7dVWhx8aPXDTlg== dependencies: byline "^5.0.0" duplexer "^0.1.1" @@ -6777,6 +7825,7 @@ strong-log-transformer@^2.0.0: stylehacks@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.1.tgz#3186595d047ab0df813d213e51c8b94e0b9010f2" + integrity sha512-TK5zEPeD9NyC1uPIdjikzsgWxdQQN/ry1X3d1iOz1UkYDCmcr928gWD1KHgyC27F50UnE0xCTrBOO1l6KR8M4w== dependencies: browserslist "^4.0.0" postcss "^7.0.0" @@ -6785,28 +7834,33 @@ stylehacks@^4.0.0: supports-color@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== dependencies: has-flag "^3.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.2, supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= dependencies: coa "~1.0.1" colors "~1.1.2" @@ -6819,6 +7873,7 @@ svgo@^0.7.0: svgo@^1.0.0, svgo@^1.0.5: version "1.1.1" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz#12384b03335bcecd85cfa5f4e3375fed671cb985" + integrity sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g== dependencies: coa "~2.0.1" colors "~1.1.2" @@ -6838,6 +7893,7 @@ svgo@^1.0.0, svgo@^1.0.5: tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" @@ -6846,6 +7902,7 @@ tar@^2.0.0: tar@^4, tar@^4.4.3: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + integrity sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg== dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -6858,10 +7915,12 @@ tar@^4, tar@^4.4.3: temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= temp-write@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" + integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI= dependencies: graceful-fs "^4.1.2" is-stream "^1.1.0" @@ -6871,8 +7930,9 @@ temp-write@^3.4.0: uuid "^3.0.1" terser@^3.7.3, terser@^3.8.1, terser@^3.8.2: - version "3.9.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.9.2.tgz#d139d8292eb3a23091304c934fb539d9f456fb19" + version "3.10.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.10.1.tgz#59c8cf87262d59e018ded4df30f834b602b1e232" + integrity sha512-GE0ShECt1/dZUZt9Kyr/IC6xXG46pTbm1C1WfzQbbnRB5LhdJlF8p5NBZ38RjspD7hEM9O5ud8aIcOFY6evl4A== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -6881,6 +7941,7 @@ terser@^3.7.3, terser@^3.8.1, terser@^3.8.2: test-exclude@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== dependencies: arrify "^1.0.1" micromatch "^2.3.11" @@ -6889,61 +7950,73 @@ test-exclude@^4.2.0: require-main-filename "^1.0.1" text-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.8.0.tgz#6f343c62268843019b21a616a003557bdb952d2b" + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== through2@^2.0.0, through2@^2.0.2, through2@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= dependencies: readable-stream "^2.1.5" xtend "~4.0.1" through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: version "2.3.8" - resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== dependencies: setimmediate "^1.0.4" timsort@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= tiny-inflate@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7" + integrity sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c= tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -6951,6 +8024,7 @@ to-regex-range@^2.1.0: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" @@ -6960,14 +8034,17 @@ to-regex@^3.0.1, to-regex@^3.0.2: toml@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb" + integrity sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA== tomlify-j0.4@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tomlify-j0.4/-/tomlify-j0.4-3.0.0.tgz#99414d45268c3a3b8bf38be82145b7bba34b7473" + integrity sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ== tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -6975,32 +8052,39 @@ tough-cookie@~2.4.3: tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-newlines@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= trim-off-newlines@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tslint@^5.11.0: version "5.11.0" resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" + integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= dependencies: babel-code-frame "^6.22.0" builtin-modules "^1.1.1" @@ -7018,40 +8102,71 @@ tslint@^5.11.0: tsutils@^2.27.2: version "2.29.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== dependencies: tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typedoc-default-themes@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz#6dc2433e78ed8bea8e887a3acde2f31785bd6227" + integrity sha1-bcJDPnjti+qOiHo6zeLzF4W9Yic= + +typedoc@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.11.1.tgz#9f033887fd2218c769e1045feb88a1efed9f12c9" + integrity sha512-jdNIoHm5wkZqxQTe/g9AQ3LKnZyrzHXqu6A/c9GUOeJyBWLxNr7/Dm3rwFvLksuxRNwTvY/0HRDU9sJTa9WQSg== + dependencies: + "@types/fs-extra" "5.0.1" + "@types/handlebars" "4.0.36" + "@types/highlight.js" "9.12.2" + "@types/lodash" "4.14.104" + "@types/marked" "0.3.0" + "@types/minimatch" "3.0.3" + "@types/shelljs" "0.7.8" + fs-extra "^5.0.0" + handlebars "^4.0.6" + highlight.js "^9.0.0" + lodash "^4.17.5" + marked "^0.3.17" + minimatch "^3.0.0" + progress "^2.0.0" + shelljs "^0.8.1" + typedoc-default-themes "^0.5.0" + typescript "2.7.2" typedoc@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.12.0.tgz#c5d606f52af29d841658e18d9faa1a72acf0e270" + integrity sha512-dsdlaYZ7Je8JC+jQ3j2Iroe4uyD0GhqzADNUVyBRgLuytQDP/g0dPkAw5PdM/4drnmmJjRzSWW97FkKo+ITqQg== dependencies: "@types/fs-extra" "^5.0.3" "@types/handlebars" "^4.0.38" @@ -7071,17 +8186,25 @@ typedoc@^0.12.0: typedoc-default-themes "^0.5.0" typescript "3.0.x" +typescript@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" + integrity sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw== + typescript@3.0.x: version "3.0.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" + integrity sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg== typescript@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.1.tgz#3362ba9dd1e482ebb2355b02dfe8bcd19a2c7c96" + version "3.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.3.tgz#01b70247a6d3c2467f70c45795ef5ea18ce191d5" + integrity sha512-+81MUSyX+BaSo+u2RbozuQk/UWx6hfG0a5gHu4ANEM4sU96XbuIyAB+rWBW1u70c6a5QuZfuYICn3s2UjuHUpA== uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -7089,18 +8212,22 @@ uglify-js@^3.1.4: uid-number@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== unicode-match-property-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== dependencies: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" @@ -7108,14 +8235,17 @@ unicode-match-property-ecmascript@^1.0.4: unicode-match-property-value-ecmascript@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== unicode-trie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" + integrity sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU= dependencies: pako "^0.2.5" tiny-inflate "^1.0.0" @@ -7123,6 +8253,7 @@ unicode-trie@^0.3.1: union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -7132,34 +8263,41 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= unique-filename@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== dependencies: imurmurhash "^0.1.4" universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unquote@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -7167,14 +8305,17 @@ unset-value@^1.0.0: upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" @@ -7182,14 +8323,17 @@ url@^0.11.0: use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== dependencies: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" @@ -7197,26 +8341,31 @@ util.promisify@~1.0.0: util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" util@^0.10.3: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" uuid@^3.0.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== v8-compile-cache@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -7224,16 +8373,19 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -7242,26 +8394,31 @@ verror@1.10.0: vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= dependencies: defaults "^1.0.3" webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== whatwg-url@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -7270,34 +8427,41 @@ whatwg-url@^7.0.0: whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= which@1, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wrap-ansi@^2.0.0: version "2.1.0" - resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -7305,10 +8469,12 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^1.1.4: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -7317,6 +8483,7 @@ write-file-atomic@^1.1.4: write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -7325,6 +8492,7 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: write-json-file@^2.2.0, write-json-file@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= dependencies: detect-indent "^5.0.0" graceful-fs "^4.1.2" @@ -7336,6 +8504,7 @@ write-json-file@^2.2.0, write-json-file@^2.3.0: write-pkg@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21" + integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== dependencies: sort-keys "^2.0.0" write-json-file "^2.2.0" @@ -7343,54 +8512,65 @@ write-pkg@^3.1.0: ws@^5.1.1: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" yargs-parser@^8.0.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== dependencies: camelcase "^4.1.0" yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= dependencies: camelcase "^4.1.0" yargs@11.1.0: version "11.1.0" - resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -7408,6 +8588,7 @@ yargs@11.1.0: yargs@^12.0.1: version "12.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== dependencies: cliui "^4.0.0" decamelize "^2.0.0" From 456a2ee37870344bb5788fa279a0113d30b82c10 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 03:44:47 +0100 Subject: [PATCH 74/77] build(math): update package desc --- packages/math/package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/math/package.json b/packages/math/package.json index aae653e9fd..e92e4811c0 100644 --- a/packages/math/package.json +++ b/packages/math/package.json @@ -1,7 +1,7 @@ { "name": "@thi.ng/math", "version": "0.0.1", - "description": "TODO", + "description": "Assorted common math functions & utilities", "main": "./index.js", "typings": "./index.d.ts", "repository": { @@ -29,10 +29,9 @@ }, "dependencies": {}, "keywords": [ - "binary", "ES6", - "gray codes", "interpolation", + "interval", "math", "solver", "typescript", From 940fc312fdd30fa0eecdb0cbbbe536d6762facb3 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 03:45:10 +0100 Subject: [PATCH 75/77] build(dsp): update package --- packages/dsp/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/dsp/package.json b/packages/dsp/package.json index 6238db4bde..7280194b24 100644 --- a/packages/dsp/package.json +++ b/packages/dsp/package.json @@ -31,12 +31,14 @@ "@thi.ng/math": "^0.0.1" }, "keywords": [ + "additive", "DSP", "ES6", "generator", "math", "oscillator", "stateless", + "synthesis", "typescript", "waveform" ], From 39d414f55cbe0f1d040f7ab4dd6f94cd34b3239f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 03:45:24 +0100 Subject: [PATCH 76/77] docs: update package list in main readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a4631f94e7..10565be7f0 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ All / most packages: - auto-generated online documentation at [docs.thi.ng](http://docs.thi.ng) - licensed under Apache Software License 2.0 -There's a steadily growing number (20+) of standalone examples +There's a steadily growing number (30+) of standalone examples (different difficulties, many combining functionality from several packages) in the [examples](./examples) directory. @@ -43,6 +43,7 @@ packages) in the [examples](./examples) directory. | [`@thi.ng/associative`](./packages/associative) | [![version](https://img.shields.io/npm/v/@thi.ng/associative.svg)](https://www.npmjs.com/package/@thi.ng/associative) | [changelog](./packages/associative/CHANGELOG.md) | Alt Set & Map implementations | | [`@thi.ng/atom`](./packages/atom) | [![version](https://img.shields.io/npm/v/@thi.ng/atom.svg)](https://www.npmjs.com/package/@thi.ng/atom) | [changelog](./packages/atom/CHANGELOG.md) | Immutable value wrappers, views, history | | [`@thi.ng/bench`](./packages/bench) | [![version](https://img.shields.io/npm/v/@thi.ng/bench.svg)](https://www.npmjs.com/package/@thi.ng/bench) | [changelog](./packages/bench/CHANGELOG.md) | Basic benchmarking helpers | +| [`@thi.ng/binary`](./packages/binary) | [![version](https://img.shields.io/npm/v/@thi.ng/binary.svg)](https://www.npmjs.com/package/@thi.ng/binary) | [changelog](./packages/binary/CHANGELOG.md) | Assorted binary / bitwise ops, utilities | | [`@thi.ng/bitstream`](./packages/bitstream) | [![version](https://img.shields.io/npm/v/@thi.ng/bitstream.svg)](https://www.npmjs.com/package/@thi.ng/bitstream) | [changelog](./packages/bitstream/CHANGELOG.md) | Bitwise input / output streams | | [`@thi.ng/cache`](./packages/cache) | [![version](https://img.shields.io/npm/v/@thi.ng/cache.svg)](https://www.npmjs.com/package/@thi.ng/cache) | [changelog](./packages/cache/CHANGELOG.md) | In-memory caches / strategies | | [`@thi.ng/checks`](./packages/checks) | [![version](https://img.shields.io/npm/v/@thi.ng/checks.svg)](https://www.npmjs.com/package/@thi.ng/checks) | [changelog](./packages/checks/CHANGELOG.md) | Type & value checks | @@ -52,9 +53,12 @@ packages) in the [examples](./examples) directory. | [`@thi.ng/defmulti`](./packages/defmulti) | [![version](https://img.shields.io/npm/v/@thi.ng/defmulti.svg)](https://www.npmjs.com/package/@thi.ng/defmulti) | [changelog](./packages/defmulti/CHANGELOG.md) | Dynamic multiple dispatch | | [`@thi.ng/dgraph`](./packages/dgraph) | [![version](https://img.shields.io/npm/v/@thi.ng/dgraph.svg)](https://www.npmjs.com/package/@thi.ng/dgraph) | [changelog](./packages/dgraph/CHANGELOG.md) | Dependency graph | | [`@thi.ng/diff`](./packages/diff) | [![version](https://img.shields.io/npm/v/@thi.ng/diff.svg)](https://www.npmjs.com/package/@thi.ng/diff) | [changelog](./packages/diff/CHANGELOG.md) | Array & object diffing | +| [`@thi.ng/dlogic`](./packages/dlogic) | [![version](https://img.shields.io/npm/v/@thi.ng/dlogic.svg)](https://www.npmjs.com/package/@thi.ng/dlogic) | [changelog](./packages/dlogic/CHANGELOG.md) | Digital logic ops / constructs | | [`@thi.ng/dot`](./packages/dot) | [![version](https://img.shields.io/npm/v/@thi.ng/dot.svg)](https://www.npmjs.com/package/@thi.ng/dot) | [changelog](./packages/dot/CHANGELOG.md) | Graphviz DOM & export | +| [`@thi.ng/dsp`](./packages/dsp) | [![version](https://img.shields.io/npm/v/@thi.ng/dsp.svg)](https://www.npmjs.com/package/@thi.ng/dsp) | [changelog](./packages/dsp/CHANGELOG.md) | DSP utils, oscillators | | [`@thi.ng/equiv`](./packages/equiv) | [![version](https://img.shields.io/npm/v/@thi.ng/equiv.svg)](https://www.npmjs.com/package/@thi.ng/equiv) | [changelog](./packages/equiv/CHANGELOG.md) | Deep value equivalence checking | | [`@thi.ng/errors`](./packages/errors) | [![version](https://img.shields.io/npm/v/@thi.ng/errors.svg)](https://www.npmjs.com/package/@thi.ng/errors) | [changelog](./packages/errors/CHANGELOG.md) | Custom error types | +| [`@thi.ng/geom`](./packages/geom) | [![version](https://img.shields.io/npm/v/@thi.ng/geom.svg)](https://www.npmjs.com/package/@thi.ng/geom) | [changelog](./packages/geom/CHANGELOG.md) | Hiccup based VDOM & diffing | | [`@thi.ng/hdom`](./packages/hdom) | [![version](https://img.shields.io/npm/v/@thi.ng/hdom.svg)](https://www.npmjs.com/package/@thi.ng/hdom) | [changelog](./packages/hdom/CHANGELOG.md) | Hiccup based VDOM & diffing | | [`@thi.ng/hdom-canvas`](./packages/hdom-canvas) | [![version](https://img.shields.io/npm/v/@thi.ng/hdom-canvas.svg)](https://www.npmjs.com/package/@thi.ng/hdom-canvas) | [changelog](./packages/hdom-canvas/CHANGELOG.md) | hdom based declarative canvas drawing | | [`@thi.ng/hdom-components`](./packages/hdom-components) | [![version](https://img.shields.io/npm/v/@thi.ng/hdom-components.svg)](https://www.npmjs.com/package/@thi.ng/hdom-components) | [changelog](./packages/hdom-components/CHANGELOG.md) | hdom based UI components | @@ -65,7 +69,9 @@ packages) in the [examples](./examples) directory. | [`@thi.ng/iges`](./packages/iges) | [![version](https://img.shields.io/npm/v/@thi.ng/iges.svg)](https://www.npmjs.com/package/@thi.ng/iges) | [changelog](./packages/iges/CHANGELOG.md) | IGES format geometry serialization | | [`@thi.ng/interceptors`](./packages/interceptors) | [![version](https://img.shields.io/npm/v/@thi.ng/interceptors.svg)](https://www.npmjs.com/package/@thi.ng/interceptors) | [changelog](./packages/interceptors/CHANGELOG.md) | Composable event handlers & processor | | [`@thi.ng/iterators`](./packages/iterators) | [![version](https://img.shields.io/npm/v/@thi.ng/iterators.svg)](https://www.npmjs.com/package/@thi.ng/iterators) | [changelog](./packages/iterators/CHANGELOG.md) | ES6 generators / iterators | +| [`@thi.ng/math`](./packages/math) | [![version](https://img.shields.io/npm/v/@thi.ng/math.svg)](https://www.npmjs.com/package/@thi.ng/math) | [changelog](./packages/math/CHANGELOG.md) | Assorted common math functions & utilities | | [`@thi.ng/memoize`](./packages/memoize) | [![version](https://img.shields.io/npm/v/@thi.ng/memoize.svg)](https://www.npmjs.com/package/@thi.ng/memoize) | [changelog](./packages/memoize/CHANGELOG.md) | Function memoization w/ customizable caching | +| [`@thi.ng/morton`](./packages/morton) | [![version](https://img.shields.io/npm/v/@thi.ng/morton.svg)](https://www.npmjs.com/package/@thi.ng/morton) | [changelog](./packages/morton/CHANGELOG.md) | Z-order-curve / Morton coding | | [`@thi.ng/paths`](./packages/paths) | [![version](https://img.shields.io/npm/v/@thi.ng/paths.svg)](https://www.npmjs.com/package/@thi.ng/paths) | [changelog](./packages/paths/CHANGELOG.md) | Immutable nested object accessors | | [`@thi.ng/pointfree`](./packages/pointfree) | [![version](https://img.shields.io/npm/v/@thi.ng/pointfree.svg)](https://www.npmjs.com/package/@thi.ng/pointfree) | [changelog](./packages/pointfree/CHANGELOG.md) | stack-based DSL & functional composition | | [`@thi.ng/pointfree-lang`](./packages/pointfree-lang) | [![version](https://img.shields.io/npm/v/@thi.ng/pointfree-lang.svg)](https://www.npmjs.com/package/@thi.ng/pointfree-lang) | [changelog](./packages/pointfree-lang/CHANGELOG.md) | Forth-like syntax layer for @thi.ng/pointfree | From 6e563377f8cdbdda904559c956a2a558eb9fed64 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 17 Oct 2018 03:48:49 +0100 Subject: [PATCH 77/77] Publish - @thi.ng/api@4.2.2 - @thi.ng/associative@0.6.12 - @thi.ng/atom@1.5.5 - @thi.ng/bench@0.2.4 - @thi.ng/binary@0.1.0 - @thi.ng/bitstream@0.4.19 - @thi.ng/cache@0.2.29 - @thi.ng/checks@1.5.12 - @thi.ng/compare@0.1.10 - @thi.ng/compose@0.2.0 - @thi.ng/csp@0.3.68 - @thi.ng/dcons@1.1.12 - @thi.ng/defmulti@0.4.0 - @thi.ng/dgraph@0.2.24 - @thi.ng/diff@1.1.3 - @thi.ng/dlogic@0.1.0 - @thi.ng/dot@0.1.16 - @thi.ng/dsp@0.1.0 - @thi.ng/equiv@0.1.12 - @thi.ng/errors@0.1.10 - @thi.ng/geom@0.1.0 - @thi.ng/hdom-canvas@0.1.6 - @thi.ng/hdom-components@2.2.11 - @thi.ng/hdom@5.0.6 - @thi.ng/heaps@0.2.20 - @thi.ng/hiccup-css@0.2.27 - @thi.ng/hiccup-svg@2.0.3 - @thi.ng/hiccup@2.4.2 - @thi.ng/iges@0.2.17 - @thi.ng/interceptors@1.8.16 - @thi.ng/iterators@4.1.33 - @thi.ng/math@0.1.0 - @thi.ng/memoize@0.2.4 - @thi.ng/morton@0.1.0 - @thi.ng/paths@1.6.4 - @thi.ng/pointfree-lang@0.2.23 - @thi.ng/pointfree@0.8.11 - @thi.ng/range-coder@0.1.17 - @thi.ng/resolve-map@3.0.14 - @thi.ng/rle-pack@1.0.6 - @thi.ng/router@0.1.26 - @thi.ng/rstream-csp@0.1.113 - @thi.ng/rstream-dot@0.2.52 - @thi.ng/rstream-gestures@0.5.14 - @thi.ng/rstream-graph@2.1.38 - @thi.ng/rstream-log@1.0.64 - @thi.ng/rstream-query@0.3.51 - @thi.ng/rstream@1.13.6 - @thi.ng/sax@0.5.2 - @thi.ng/strings@0.5.1 - @thi.ng/transducers-fsm@0.2.25 - @thi.ng/transducers-hdom@1.1.8 - @thi.ng/transducers-stats@0.4.12 - @thi.ng/transducers@2.2.0 - @thi.ng/unionstruct@0.1.17 - @thi.ng/vectors@1.4.0 --- packages/api/CHANGELOG.md | 8 ++++++++ packages/api/package.json | 4 ++-- packages/associative/CHANGELOG.md | 8 ++++++++ packages/associative/package.json | 16 ++++++++-------- packages/atom/CHANGELOG.md | 8 ++++++++ packages/atom/package.json | 12 ++++++------ packages/bench/CHANGELOG.md | 8 ++++++++ packages/bench/package.json | 2 +- packages/binary/CHANGELOG.md | 11 +++++++++++ packages/binary/package.json | 5 ++--- packages/bitstream/CHANGELOG.md | 8 ++++++++ packages/bitstream/package.json | 4 ++-- packages/cache/CHANGELOG.md | 8 ++++++++ packages/cache/package.json | 8 ++++---- packages/checks/CHANGELOG.md | 8 ++++++++ packages/checks/package.json | 2 +- packages/compare/CHANGELOG.md | 8 ++++++++ packages/compare/package.json | 2 +- packages/compose/CHANGELOG.md | 11 +++++++++++ packages/compose/package.json | 6 +++--- packages/csp/CHANGELOG.md | 8 ++++++++ packages/csp/package.json | 12 ++++++------ packages/dcons/CHANGELOG.md | 8 ++++++++ packages/dcons/package.json | 14 +++++++------- packages/defmulti/CHANGELOG.md | 11 +++++++++++ packages/defmulti/package.json | 6 +++--- packages/dgraph/CHANGELOG.md | 8 ++++++++ packages/dgraph/package.json | 12 ++++++------ packages/diff/CHANGELOG.md | 8 ++++++++ packages/diff/package.json | 6 +++--- packages/dlogic/CHANGELOG.md | 11 +++++++++++ packages/dlogic/package.json | 5 ++--- packages/dot/CHANGELOG.md | 8 ++++++++ packages/dot/package.json | 6 +++--- packages/dsp/CHANGELOG.md | 11 +++++++++++ packages/dsp/package.json | 6 +++--- packages/equiv/CHANGELOG.md | 8 ++++++++ packages/equiv/package.json | 2 +- packages/errors/CHANGELOG.md | 8 ++++++++ packages/errors/package.json | 2 +- packages/geom/CHANGELOG.md | 19 +++++++++++++++++++ packages/geom/package.json | 14 +++++++------- packages/hdom-canvas/CHANGELOG.md | 8 ++++++++ packages/hdom-canvas/package.json | 10 +++++----- packages/hdom-components/CHANGELOG.md | 11 +++++++++++ packages/hdom-components/package.json | 8 ++++---- packages/hdom/CHANGELOG.md | 8 ++++++++ packages/hdom/package.json | 14 +++++++------- packages/heaps/CHANGELOG.md | 8 ++++++++ packages/heaps/package.json | 6 +++--- packages/hiccup-css/CHANGELOG.md | 8 ++++++++ packages/hiccup-css/package.json | 10 +++++----- packages/hiccup-svg/CHANGELOG.md | 8 ++++++++ packages/hiccup-svg/package.json | 4 ++-- packages/hiccup/CHANGELOG.md | 8 ++++++++ packages/hiccup/package.json | 8 ++++---- packages/iges/CHANGELOG.md | 8 ++++++++ packages/iges/package.json | 10 +++++----- packages/interceptors/CHANGELOG.md | 8 ++++++++ packages/interceptors/package.json | 12 ++++++------ packages/iterators/CHANGELOG.md | 8 ++++++++ packages/iterators/package.json | 8 ++++---- packages/math/CHANGELOG.md | 11 +++++++++++ packages/math/package.json | 5 ++--- packages/memoize/CHANGELOG.md | 8 ++++++++ packages/memoize/package.json | 4 ++-- packages/morton/CHANGELOG.md | 11 +++++++++++ packages/morton/package.json | 8 ++++---- packages/paths/CHANGELOG.md | 8 ++++++++ packages/paths/package.json | 6 +++--- packages/pointfree-lang/CHANGELOG.md | 8 ++++++++ packages/pointfree-lang/package.json | 8 ++++---- packages/pointfree/CHANGELOG.md | 8 ++++++++ packages/pointfree/package.json | 10 +++++----- packages/range-coder/CHANGELOG.md | 8 ++++++++ packages/range-coder/package.json | 6 +++--- packages/resolve-map/CHANGELOG.md | 8 ++++++++ packages/resolve-map/package.json | 8 ++++---- packages/rle-pack/CHANGELOG.md | 8 ++++++++ packages/rle-pack/package.json | 6 +++--- packages/router/CHANGELOG.md | 8 ++++++++ packages/router/package.json | 10 +++++----- packages/rstream-csp/CHANGELOG.md | 8 ++++++++ packages/rstream-csp/package.json | 6 +++--- packages/rstream-dot/CHANGELOG.md | 8 ++++++++ packages/rstream-dot/package.json | 4 ++-- packages/rstream-gestures/CHANGELOG.md | 8 ++++++++ packages/rstream-gestures/package.json | 8 ++++---- packages/rstream-graph/CHANGELOG.md | 8 ++++++++ packages/rstream-graph/package.json | 16 ++++++++-------- packages/rstream-log/CHANGELOG.md | 8 ++++++++ packages/rstream-log/package.json | 12 ++++++------ packages/rstream-query/CHANGELOG.md | 8 ++++++++ packages/rstream-query/package.json | 18 +++++++++--------- packages/rstream/CHANGELOG.md | 8 ++++++++ packages/rstream/package.json | 16 ++++++++-------- packages/sax/CHANGELOG.md | 8 ++++++++ packages/sax/package.json | 8 ++++---- packages/strings/CHANGELOG.md | 8 ++++++++ packages/strings/package.json | 6 +++--- packages/transducers-fsm/CHANGELOG.md | 8 ++++++++ packages/transducers-fsm/package.json | 6 +++--- packages/transducers-hdom/CHANGELOG.md | 8 ++++++++ packages/transducers-hdom/package.json | 8 ++++---- packages/transducers-stats/CHANGELOG.md | 8 ++++++++ packages/transducers-stats/package.json | 8 ++++---- packages/transducers/CHANGELOG.md | 16 ++++++++++++++++ packages/transducers/package.json | 16 ++++++++-------- packages/unionstruct/CHANGELOG.md | 8 ++++++++ packages/unionstruct/package.json | 2 +- packages/vectors/CHANGELOG.md | 16 ++++++++++++++++ packages/vectors/package.json | 14 +++++++------- 112 files changed, 725 insertions(+), 229 deletions(-) create mode 100644 packages/binary/CHANGELOG.md create mode 100644 packages/dlogic/CHANGELOG.md create mode 100644 packages/dsp/CHANGELOG.md create mode 100644 packages/geom/CHANGELOG.md create mode 100644 packages/math/CHANGELOG.md create mode 100644 packages/morton/CHANGELOG.md diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 9ed7ea26dd..e94e220a40 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.2.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/api@4.2.1...@thi.ng/api@4.2.2) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/api + + + + + ## [4.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/api@4.2.0...@thi.ng/api@4.2.1) (2018-09-24) diff --git a/packages/api/package.json b/packages/api/package.json index 30720fcae4..cdb59f021a 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/api", - "version": "4.2.1", + "version": "4.2.2", "description": "Common, generic types & interfaces for thi.ng projects", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/errors": "^0.1.9" + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "compare", diff --git a/packages/associative/CHANGELOG.md b/packages/associative/CHANGELOG.md index e1bf036159..c16b614119 100644 --- a/packages/associative/CHANGELOG.md +++ b/packages/associative/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.6.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.11...@thi.ng/associative@0.6.12) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/associative + + + + + ## [0.6.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@0.6.10...@thi.ng/associative@0.6.11) (2018-09-26) diff --git a/packages/associative/package.json b/packages/associative/package.json index 67d1b02d5b..2f1968782a 100644 --- a/packages/associative/package.json +++ b/packages/associative/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/associative", - "version": "0.6.11", + "version": "0.6.12", "description": "Alternative Set & Map data type implementations with customizable equality semantics & supporting operations", "main": "./index.js", "typings": "./index.d.ts", @@ -28,13 +28,13 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/compare": "^0.1.9", - "@thi.ng/dcons": "^1.1.11", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/compare": "^0.1.10", + "@thi.ng/dcons": "^1.1.12", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "data structures", diff --git a/packages/atom/CHANGELOG.md b/packages/atom/CHANGELOG.md index efde5b5251..6e54d43fcc 100644 --- a/packages/atom/CHANGELOG.md +++ b/packages/atom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/atom@1.5.4...@thi.ng/atom@1.5.5) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/atom + + + + + ## [1.5.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/atom@1.5.3...@thi.ng/atom@1.5.4) (2018-09-24) diff --git a/packages/atom/package.json b/packages/atom/package.json index d1a9fa720d..d9b99bf035 100644 --- a/packages/atom/package.json +++ b/packages/atom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/atom", - "version": "1.5.4", + "version": "1.5.5", "description": "Mutable wrapper for immutable values", "main": "./index.js", "typings": "./index.d.ts", @@ -28,11 +28,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/paths": "^1.6.3" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/paths": "^1.6.4" }, "keywords": [ "cursor", diff --git a/packages/bench/CHANGELOG.md b/packages/bench/CHANGELOG.md index 6e7645f07a..d5fe017ad8 100644 --- a/packages/bench/CHANGELOG.md +++ b/packages/bench/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/bench@0.2.3...@thi.ng/bench@0.2.4) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/bench + + + + + ## [0.2.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/bench@0.2.2...@thi.ng/bench@0.2.3) (2018-09-24) diff --git a/packages/bench/package.json b/packages/bench/package.json index b85148ac32..4b201aa343 100644 --- a/packages/bench/package.json +++ b/packages/bench/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/bench", - "version": "0.2.3", + "version": "0.2.4", "description": "Basic benchmarking helpers", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/binary/CHANGELOG.md b/packages/binary/CHANGELOG.md new file mode 100644 index 0000000000..8176ab7399 --- /dev/null +++ b/packages/binary/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2018-10-17) + + +### Features + +* **binary:** add [@thi](https://github.com/thi).ng/binary package ([458d4a0](https://github.com/thi-ng/umbrella/commit/458d4a0)) diff --git a/packages/binary/package.json b/packages/binary/package.json index 63a9081ffe..52326e6b4b 100644 --- a/packages/binary/package.json +++ b/packages/binary/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/binary", - "version": "0.0.1", + "version": "0.1.0", "description": "Assorted binary / bitwise operations, conversions, utilities.", "main": "./index.js", "typings": "./index.d.ts", @@ -27,7 +27,6 @@ "typedoc": "^0.11.1", "typescript": "^3.0.1" }, - "dependencies": {}, "keywords": [ "alignment", "binary", @@ -44,4 +43,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/bitstream/CHANGELOG.md b/packages/bitstream/CHANGELOG.md index 6ecd1c5859..67c60cc29e 100644 --- a/packages/bitstream/CHANGELOG.md +++ b/packages/bitstream/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.4.19](https://github.com/thi-ng/umbrella/compare/@thi.ng/bitstream@0.4.18...@thi.ng/bitstream@0.4.19) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/bitstream + + + + + ## [0.4.18](https://github.com/thi-ng/umbrella/compare/@thi.ng/bitstream@0.4.17...@thi.ng/bitstream@0.4.18) (2018-09-24) diff --git a/packages/bitstream/package.json b/packages/bitstream/package.json index dfd2e59231..acfb75cff5 100644 --- a/packages/bitstream/package.json +++ b/packages/bitstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/bitstream", - "version": "0.4.18", + "version": "0.4.19", "description": "ES6 iterator based read/write bit streams & support for variable word widths", "main": "./index.js", "typings": "./index.d.ts", @@ -20,7 +20,7 @@ "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" }, "dependencies": { - "@thi.ng/errors": "^0.1.9" + "@thi.ng/errors": "^0.1.10" }, "devDependencies": { "@types/mocha": "^5.2.5", diff --git a/packages/cache/CHANGELOG.md b/packages/cache/CHANGELOG.md index 068111148d..40879ad787 100644 --- a/packages/cache/CHANGELOG.md +++ b/packages/cache/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.29](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.28...@thi.ng/cache@0.2.29) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/cache + + + + + ## [0.2.28](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@0.2.27...@thi.ng/cache@0.2.28) (2018-09-26) diff --git a/packages/cache/package.json b/packages/cache/package.json index 7174b9bc07..ed0722e992 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/cache", - "version": "0.2.28", + "version": "0.2.29", "description": "In-memory cache implementations with ES6 Map-like API and different eviction strategies", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.11", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/dcons": "^1.1.12", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "cache", diff --git a/packages/checks/CHANGELOG.md b/packages/checks/CHANGELOG.md index f796805803..473087d30b 100644 --- a/packages/checks/CHANGELOG.md +++ b/packages/checks/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/checks@1.5.11...@thi.ng/checks@1.5.12) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/checks + + + + + ## [1.5.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/checks@1.5.10...@thi.ng/checks@1.5.11) (2018-09-24) diff --git a/packages/checks/package.json b/packages/checks/package.json index 9aecbff357..31843c17ae 100644 --- a/packages/checks/package.json +++ b/packages/checks/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/checks", - "version": "1.5.11", + "version": "1.5.12", "description": "Single-function sub-modules for type, feature & value checks", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/compare/CHANGELOG.md b/packages/compare/CHANGELOG.md index a3a4bc7c6e..f59d04aa0c 100644 --- a/packages/compare/CHANGELOG.md +++ b/packages/compare/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/compare@0.1.9...@thi.ng/compare@0.1.10) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/compare + + + + + ## [0.1.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/compare@0.1.8...@thi.ng/compare@0.1.9) (2018-09-24) diff --git a/packages/compare/package.json b/packages/compare/package.json index a3540fa5bf..8f72bc4360 100644 --- a/packages/compare/package.json +++ b/packages/compare/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/compare", - "version": "0.1.9", + "version": "0.1.10", "description": "Comparator with optional delegation for types implementing @thi.ng/api/ICompare interface", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/compose/CHANGELOG.md b/packages/compose/CHANGELOG.md index 6301293c69..84734f0523 100644 --- a/packages/compose/CHANGELOG.md +++ b/packages/compose/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/compose@0.1.4...@thi.ng/compose@0.2.0) (2018-10-17) + + +### Features + +* **compose:** add partial(), update readme ([6851f2c](https://github.com/thi-ng/umbrella/commit/6851f2c)) + + + + + ## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/compose@0.1.3...@thi.ng/compose@0.1.4) (2018-09-24) diff --git a/packages/compose/package.json b/packages/compose/package.json index 3570ea9b12..dc00447700 100644 --- a/packages/compose/package.json +++ b/packages/compose/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/compose", - "version": "0.1.4", + "version": "0.2.0", "description": "Functional composition helpers", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/api": "^4.2.2", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "composition", diff --git a/packages/csp/CHANGELOG.md b/packages/csp/CHANGELOG.md index 2d2c9b244e..386b5c7789 100644 --- a/packages/csp/CHANGELOG.md +++ b/packages/csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.3.68](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.67...@thi.ng/csp@0.3.68) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/csp + + + + + ## [0.3.67](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.66...@thi.ng/csp@0.3.67) (2018-09-26) diff --git a/packages/csp/package.json b/packages/csp/package.json index a4eb966450..a38d0ade23 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/csp", - "version": "0.3.67", + "version": "0.3.68", "description": "ES6 promise based CSP implementation", "main": "./index.js", "typings": "./index.d.ts", @@ -32,11 +32,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/dcons": "^1.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/dcons": "^1.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "async", diff --git a/packages/dcons/CHANGELOG.md b/packages/dcons/CHANGELOG.md index 0bd8ed7abb..26b5c6d5d8 100644 --- a/packages/dcons/CHANGELOG.md +++ b/packages/dcons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.11...@thi.ng/dcons@1.1.12) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/dcons + + + + + ## [1.1.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@1.1.10...@thi.ng/dcons@1.1.11) (2018-09-26) diff --git a/packages/dcons/package.json b/packages/dcons/package.json index c03a714709..360262dbf1 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dcons", - "version": "1.1.11", + "version": "1.1.12", "description": "Comprehensive doubly linked list structure w/ iterator support", "main": "./index.js", "typings": "./index.d.ts", @@ -28,12 +28,12 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/compare": "^0.1.9", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/compare": "^0.1.10", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "datastructure", diff --git a/packages/defmulti/CHANGELOG.md b/packages/defmulti/CHANGELOG.md index b2bd426006..85c23a7fed 100644 --- a/packages/defmulti/CHANGELOG.md +++ b/packages/defmulti/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.4.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/defmulti@0.3.11...@thi.ng/defmulti@0.4.0) (2018-10-17) + + +### Features + +* **defmulti:** add varargs support ([6094738](https://github.com/thi-ng/umbrella/commit/6094738)) + + + + + ## [0.3.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/defmulti@0.3.10...@thi.ng/defmulti@0.3.11) (2018-09-24) diff --git a/packages/defmulti/package.json b/packages/defmulti/package.json index b94d32c73f..91f7cd4b63 100644 --- a/packages/defmulti/package.json +++ b/packages/defmulti/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/defmulti", - "version": "0.3.11", + "version": "0.4.0", "description": "Dynamically extensible multiple dispatch via user supplied dispatch function.", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/api": "^4.2.2", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "ES6", diff --git a/packages/dgraph/CHANGELOG.md b/packages/dgraph/CHANGELOG.md index e807ab275e..23d8d8675f 100644 --- a/packages/dgraph/CHANGELOG.md +++ b/packages/dgraph/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.24](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.23...@thi.ng/dgraph@0.2.24) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/dgraph + + + + + ## [0.2.23](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@0.2.22...@thi.ng/dgraph@0.2.23) (2018-09-26) diff --git a/packages/dgraph/package.json b/packages/dgraph/package.json index 5ebd4df11b..bf0e7ccbd4 100644 --- a/packages/dgraph/package.json +++ b/packages/dgraph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dgraph", - "version": "0.2.23", + "version": "0.2.24", "description": "Type-agnostic directed acyclic graph (DAG) & graph operations", "main": "./index.js", "typings": "./index.d.ts", @@ -28,11 +28,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.11", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/associative": "^0.6.12", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "data structure", diff --git a/packages/diff/CHANGELOG.md b/packages/diff/CHANGELOG.md index e72898ca1e..e516f9d532 100644 --- a/packages/diff/CHANGELOG.md +++ b/packages/diff/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/diff@1.1.2...@thi.ng/diff@1.1.3) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/diff + + + + + ## [1.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/diff@1.1.1...@thi.ng/diff@1.1.2) (2018-09-24) diff --git a/packages/diff/package.json b/packages/diff/package.json index f244daeb09..6d41d53107 100644 --- a/packages/diff/package.json +++ b/packages/diff/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/diff", - "version": "1.1.2", + "version": "1.1.3", "description": "Array & object Diff", "main": "./index.js", "typings": "./index.d.ts", @@ -26,8 +26,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/equiv": "^0.1.11" + "@thi.ng/api": "^4.2.2", + "@thi.ng/equiv": "^0.1.12" }, "keywords": [ "array", diff --git a/packages/dlogic/CHANGELOG.md b/packages/dlogic/CHANGELOG.md new file mode 100644 index 0000000000..b10dc857d2 --- /dev/null +++ b/packages/dlogic/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2018-10-17) + + +### Features + +* **dlogic:** add [@thi](https://github.com/thi).ng/dlogic package ([405cf51](https://github.com/thi-ng/umbrella/commit/405cf51)) diff --git a/packages/dlogic/package.json b/packages/dlogic/package.json index 1f88f53c0f..ea5ee60083 100644 --- a/packages/dlogic/package.json +++ b/packages/dlogic/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dlogic", - "version": "0.0.1", + "version": "0.1.0", "description": "Assorted digital logic ops / constructs.", "main": "./index.js", "typings": "./index.d.ts", @@ -27,7 +27,6 @@ "typedoc": "^0.11.1", "typescript": "^3.0.1" }, - "dependencies": {}, "keywords": [ "boolean", "digital", @@ -41,4 +40,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/dot/CHANGELOG.md b/packages/dot/CHANGELOG.md index 0c13cfa4d1..f5bc07e7b0 100644 --- a/packages/dot/CHANGELOG.md +++ b/packages/dot/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.16](https://github.com/thi-ng/umbrella/compare/@thi.ng/dot@0.1.15...@thi.ng/dot@0.1.16) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/dot + + + + + ## [0.1.15](https://github.com/thi-ng/umbrella/compare/@thi.ng/dot@0.1.14...@thi.ng/dot@0.1.15) (2018-09-24) diff --git a/packages/dot/package.json b/packages/dot/package.json index 0d0a4f4b9d..ec64aeae51 100644 --- a/packages/dot/package.json +++ b/packages/dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dot", - "version": "0.1.15", + "version": "0.1.16", "description": "Graphviz DOM abstraction as vanilla JS objects & serialization to DOT format", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12" }, "keywords": [ "ES6", diff --git a/packages/dsp/CHANGELOG.md b/packages/dsp/CHANGELOG.md new file mode 100644 index 0000000000..16ca7b8dd5 --- /dev/null +++ b/packages/dsp/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2018-10-17) + + +### Features + +* **dsp:** add oscillators as [@thi](https://github.com/thi).ng/dsp package (from synstack / VEX) ([889730f](https://github.com/thi-ng/umbrella/commit/889730f)) diff --git a/packages/dsp/package.json b/packages/dsp/package.json index 7280194b24..bed8f9d548 100644 --- a/packages/dsp/package.json +++ b/packages/dsp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dsp", - "version": "0.0.1", + "version": "0.1.0", "description": "Assorted DSP utils, oscillators etc.", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/math": "^0.0.1" + "@thi.ng/math": "^0.1.0" }, "keywords": [ "additive", @@ -45,4 +45,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/equiv/CHANGELOG.md b/packages/equiv/CHANGELOG.md index b0e21dacd9..7d6d945ab9 100644 --- a/packages/equiv/CHANGELOG.md +++ b/packages/equiv/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/equiv@0.1.11...@thi.ng/equiv@0.1.12) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/equiv + + + + + ## [0.1.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/equiv@0.1.10...@thi.ng/equiv@0.1.11) (2018-09-24) diff --git a/packages/equiv/package.json b/packages/equiv/package.json index 2d286d5ff4..686e6759c5 100644 --- a/packages/equiv/package.json +++ b/packages/equiv/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/equiv", - "version": "0.1.11", + "version": "0.1.12", "description": "Extensible deep equivalence checking for any data types", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index ca6bd52a00..9d665c30b7 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/errors@0.1.9...@thi.ng/errors@0.1.10) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/errors + + + + + ## [0.1.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/errors@0.1.8...@thi.ng/errors@0.1.9) (2018-09-24) diff --git a/packages/errors/package.json b/packages/errors/package.json index ec817aa873..d339952f10 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/errors", - "version": "0.1.9", + "version": "0.1.10", "description": "Custom error types and helper fns.", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/geom/CHANGELOG.md b/packages/geom/CHANGELOG.md new file mode 100644 index 0000000000..dd6f46e729 --- /dev/null +++ b/packages/geom/CHANGELOG.md @@ -0,0 +1,19 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2018-10-17) + + +### Features + +* **geom:** add ICollate & ICopy impls, re-add/update convexHull2 ([3b1bf64](https://github.com/thi-ng/umbrella/commit/3b1bf64)) +* **geom:** add/update factory fns, arg handling, tessel, poly area ([555fc51](https://github.com/thi-ng/umbrella/commit/555fc51)) +* **geom:** add/update interfaces & impls ([2657df6](https://github.com/thi-ng/umbrella/commit/2657df6)) +* **geom:** add/update tessellate() impls ([fa87f1e](https://github.com/thi-ng/umbrella/commit/fa87f1e)) +* **geom:** add/update various shape impls & ops ([3a20ef3](https://github.com/thi-ng/umbrella/commit/3a20ef3)) +* **geom:** import (updated) old thi.ng/geom package (minus vectors) ([c03259c](https://github.com/thi-ng/umbrella/commit/c03259c)) +* **geom:** re-add Arc2, update Circle2, update helper fns ([aa6b120](https://github.com/thi-ng/umbrella/commit/aa6b120)) +* **geom:** re-import & refactor partial port of thi.ng/geom (clojure) ([d655ec2](https://github.com/thi-ng/umbrella/commit/d655ec2)) +* **geom:** update all shape types, add interfaces & ops, update tests ([9c27c77](https://github.com/thi-ng/umbrella/commit/9c27c77)) diff --git a/packages/geom/package.json b/packages/geom/package.json index 0df5f212f4..5402cc43ce 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom", - "version": "0.0.1", + "version": "0.1.0", "description": "2D/3D geometry primitives", "main": "./index.js", "typings": "./index.d.ts", @@ -28,11 +28,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/math": "^0.0.1", - "@thi.ng/transducers": "^2.1.6", - "@thi.ng/vectors": "^1.3.0" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/math": "^0.1.0", + "@thi.ng/transducers": "^2.2.0", + "@thi.ng/vectors": "^1.4.0" }, "keywords": [ "ES6", @@ -46,4 +46,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/hdom-canvas/CHANGELOG.md b/packages/hdom-canvas/CHANGELOG.md index 91cca886f4..9a215f3d09 100644 --- a/packages/hdom-canvas/CHANGELOG.md +++ b/packages/hdom-canvas/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.5...@thi.ng/hdom-canvas@0.1.6) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/hdom-canvas + + + + + ## [0.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@0.1.4...@thi.ng/hdom-canvas@0.1.5) (2018-09-28) diff --git a/packages/hdom-canvas/package.json b/packages/hdom-canvas/package.json index e1fe846a80..4024e34d46 100644 --- a/packages/hdom-canvas/package.json +++ b/packages/hdom-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-canvas", - "version": "0.1.5", + "version": "0.1.6", "description": "Declarative canvas scenegraph & visualization for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -28,10 +28,10 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/diff": "^1.1.2", - "@thi.ng/hdom": "^5.0.5" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/diff": "^1.1.3", + "@thi.ng/hdom": "^5.0.6" }, "keywords": [ "ES6", diff --git a/packages/hdom-components/CHANGELOG.md b/packages/hdom-components/CHANGELOG.md index bc38bf9cde..5b0505aabc 100644 --- a/packages/hdom-components/CHANGELOG.md +++ b/packages/hdom-components/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.2.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.10...@thi.ng/hdom-components@2.2.11) (2018-10-17) + + +### Bug Fixes + +* **hdom-components:** add Canvas2DContextAttributes (removed in TS3.1) ([775cc8a](https://github.com/thi-ng/umbrella/commit/775cc8a)) + + + + + ## [2.2.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@2.2.9...@thi.ng/hdom-components@2.2.10) (2018-09-26) diff --git a/packages/hdom-components/package.json b/packages/hdom-components/package.json index 5693fd1d04..59604f4d9d 100644 --- a/packages/hdom-components/package.json +++ b/packages/hdom-components/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-components", - "version": "2.2.10", + "version": "2.2.11", "description": "Raw, skinnable UI & SVG components for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/transducers": "^2.1.6", + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/transducers": "^2.2.0", "@types/webgl2": "^0.0.4" }, "keywords": [ diff --git a/packages/hdom/CHANGELOG.md b/packages/hdom/CHANGELOG.md index f5d6a944f6..0231261b49 100644 --- a/packages/hdom/CHANGELOG.md +++ b/packages/hdom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.5...@thi.ng/hdom@5.0.6) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/hdom + + + + + ## [5.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@5.0.4...@thi.ng/hdom@5.0.5) (2018-09-28) diff --git a/packages/hdom/package.json b/packages/hdom/package.json index 18a71ccda9..98f2f2e3bc 100644 --- a/packages/hdom/package.json +++ b/packages/hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom", - "version": "5.0.5", + "version": "5.0.6", "description": "Lightweight vanilla ES6 UI component trees with customizable branch-local behaviors", "main": "./index.js", "typings": "./index.d.ts", @@ -20,7 +20,7 @@ "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" }, "devDependencies": { - "@thi.ng/atom": "^1.5.4", + "@thi.ng/atom": "^1.5.5", "@types/mocha": "^5.2.5", "@types/node": "^10.5.5", "mocha": "^5.2.0", @@ -29,11 +29,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/diff": "^1.1.2", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/hiccup": "^2.4.1" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/diff": "^1.1.3", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/hiccup": "^2.4.2" }, "keywords": [ "browser", diff --git a/packages/heaps/CHANGELOG.md b/packages/heaps/CHANGELOG.md index 87b30449d6..5c70162304 100644 --- a/packages/heaps/CHANGELOG.md +++ b/packages/heaps/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.20](https://github.com/thi-ng/umbrella/compare/@thi.ng/heaps@0.2.19...@thi.ng/heaps@0.2.20) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/heaps + + + + + ## [0.2.19](https://github.com/thi-ng/umbrella/compare/@thi.ng/heaps@0.2.18...@thi.ng/heaps@0.2.19) (2018-09-24) diff --git a/packages/heaps/package.json b/packages/heaps/package.json index c74b7c0b44..7a8cc8ec08 100644 --- a/packages/heaps/package.json +++ b/packages/heaps/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/heaps", - "version": "0.2.19", + "version": "0.2.20", "description": "Generic binary heap & d-ary heap implementations with customizable ordering", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/compare": "^0.1.9" + "@thi.ng/api": "^4.2.2", + "@thi.ng/compare": "^0.1.10" }, "keywords": [ "data structure", diff --git a/packages/hiccup-css/CHANGELOG.md b/packages/hiccup-css/CHANGELOG.md index 315209dbd1..6a080a6a9a 100644 --- a/packages/hiccup-css/CHANGELOG.md +++ b/packages/hiccup-css/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.27](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.26...@thi.ng/hiccup-css@0.2.27) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/hiccup-css + + + + + ## [0.2.26](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@0.2.25...@thi.ng/hiccup-css@0.2.26) (2018-09-26) diff --git a/packages/hiccup-css/package.json b/packages/hiccup-css/package.json index 97a22f7367..34e05c836b 100644 --- a/packages/hiccup-css/package.json +++ b/packages/hiccup-css/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-css", - "version": "0.2.26", + "version": "0.2.27", "description": "CSS from nested JS data structures", "main": "./index.js", "typings": "./index.d.ts", @@ -28,10 +28,10 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "clojure", diff --git a/packages/hiccup-svg/CHANGELOG.md b/packages/hiccup-svg/CHANGELOG.md index 1e0f5fed39..dd5ced73fe 100644 --- a/packages/hiccup-svg/CHANGELOG.md +++ b/packages/hiccup-svg/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-svg@2.0.2...@thi.ng/hiccup-svg@2.0.3) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/hiccup-svg + + + + + ## [2.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-svg@2.0.1...@thi.ng/hiccup-svg@2.0.2) (2018-09-24) diff --git a/packages/hiccup-svg/package.json b/packages/hiccup-svg/package.json index 75f92415d0..da2844e87f 100644 --- a/packages/hiccup-svg/package.json +++ b/packages/hiccup-svg/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-svg", - "version": "2.0.2", + "version": "2.0.3", "description": "SVG element functions for @thi.ng/hiccup & @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/hiccup": "^2.4.1" + "@thi.ng/hiccup": "^2.4.2" }, "keywords": [ "components", diff --git a/packages/hiccup/CHANGELOG.md b/packages/hiccup/CHANGELOG.md index d2d75155d5..d52a49af91 100644 --- a/packages/hiccup/CHANGELOG.md +++ b/packages/hiccup/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.4.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup@2.4.1...@thi.ng/hiccup@2.4.2) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/hiccup + + + + + ## [2.4.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup@2.4.0...@thi.ng/hiccup@2.4.1) (2018-09-24) diff --git a/packages/hiccup/package.json b/packages/hiccup/package.json index 78ea6154f3..d07c40c49d 100644 --- a/packages/hiccup/package.json +++ b/packages/hiccup/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup", - "version": "2.4.1", + "version": "2.4.2", "description": "HTML/SVG/XML serialization of nested data structures, iterables & closures", "main": "./index.js", "typings": "./index.d.ts", @@ -20,7 +20,7 @@ "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" }, "devDependencies": { - "@thi.ng/atom": "^1.5.4", + "@thi.ng/atom": "^1.5.5", "@types/mocha": "^5.2.5", "@types/node": "^10.5.5", "mocha": "^5.2.0", @@ -29,8 +29,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "clojure", diff --git a/packages/iges/CHANGELOG.md b/packages/iges/CHANGELOG.md index c4e5892942..f0372997c8 100644 --- a/packages/iges/CHANGELOG.md +++ b/packages/iges/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.17](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.16...@thi.ng/iges@0.2.17) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/iges + + + + + ## [0.2.16](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@0.2.15...@thi.ng/iges@0.2.16) (2018-09-26) diff --git a/packages/iges/package.json b/packages/iges/package.json index 20ef7e4c87..8fea94ae7c 100644 --- a/packages/iges/package.json +++ b/packages/iges/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iges", - "version": "0.2.16", + "version": "0.2.17", "description": "IGES 5.3 serializer for (currently only) polygonal geometry, both open & closed", "main": "./index.js", "typings": "./index.d.ts", @@ -28,10 +28,10 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/defmulti": "^0.3.11", - "@thi.ng/strings": "^0.5.0", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/defmulti": "^0.4.0", + "@thi.ng/strings": "^0.5.1", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "CAD", diff --git a/packages/interceptors/CHANGELOG.md b/packages/interceptors/CHANGELOG.md index ba0a5b36a0..25d6c8e6b7 100644 --- a/packages/interceptors/CHANGELOG.md +++ b/packages/interceptors/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.8.16](https://github.com/thi-ng/umbrella/compare/@thi.ng/interceptors@1.8.15...@thi.ng/interceptors@1.8.16) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/interceptors + + + + + ## [1.8.15](https://github.com/thi-ng/umbrella/compare/@thi.ng/interceptors@1.8.14...@thi.ng/interceptors@1.8.15) (2018-09-24) diff --git a/packages/interceptors/package.json b/packages/interceptors/package.json index 3d13177378..d2b8778123 100644 --- a/packages/interceptors/package.json +++ b/packages/interceptors/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/interceptors", - "version": "1.8.15", + "version": "1.8.16", "description": "Interceptor based event bus, side effect & immutable state handling", "main": "./index.js", "typings": "./index.d.ts", @@ -28,11 +28,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/atom": "^1.5.4", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/paths": "^1.6.3" + "@thi.ng/api": "^4.2.2", + "@thi.ng/atom": "^1.5.5", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/paths": "^1.6.4" }, "keywords": [ "ES6", diff --git a/packages/iterators/CHANGELOG.md b/packages/iterators/CHANGELOG.md index 0db42811e6..8534f87825 100644 --- a/packages/iterators/CHANGELOG.md +++ b/packages/iterators/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.1.33](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.32...@thi.ng/iterators@4.1.33) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/iterators + + + + + ## [4.1.32](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.1.31...@thi.ng/iterators@4.1.32) (2018-09-26) diff --git a/packages/iterators/package.json b/packages/iterators/package.json index 35891d2b95..e14f281a55 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iterators", - "version": "4.1.32", + "version": "4.1.33", "description": "clojure.core inspired, composable ES6 iterators & generators", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/dcons": "^1.1.11", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/api": "^4.2.2", + "@thi.ng/dcons": "^1.1.12", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "clojure", diff --git a/packages/math/CHANGELOG.md b/packages/math/CHANGELOG.md new file mode 100644 index 0000000000..f425c12867 --- /dev/null +++ b/packages/math/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2018-10-17) + + +### Features + +* **math:** extract maths fns from [@thi](https://github.com/thi).ng/vectors as new package ([4af1fba](https://github.com/thi-ng/umbrella/commit/4af1fba)) diff --git a/packages/math/package.json b/packages/math/package.json index e92e4811c0..7c5f11b8c0 100644 --- a/packages/math/package.json +++ b/packages/math/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/math", - "version": "0.0.1", + "version": "0.1.0", "description": "Assorted common math functions & utilities", "main": "./index.js", "typings": "./index.d.ts", @@ -27,7 +27,6 @@ "typedoc": "^0.11.1", "typescript": "^3.0.1" }, - "dependencies": {}, "keywords": [ "ES6", "interpolation", @@ -40,4 +39,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/memoize/CHANGELOG.md b/packages/memoize/CHANGELOG.md index e6cc190b8a..42dd65c985 100644 --- a/packages/memoize/CHANGELOG.md +++ b/packages/memoize/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/memoize@0.2.3...@thi.ng/memoize@0.2.4) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/memoize + + + + + ## [0.2.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/memoize@0.2.2...@thi.ng/memoize@0.2.3) (2018-09-24) diff --git a/packages/memoize/package.json b/packages/memoize/package.json index 9954aaefa7..fd57a25bdf 100644 --- a/packages/memoize/package.json +++ b/packages/memoize/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/memoize", - "version": "0.2.3", + "version": "0.2.4", "description": "Function memoization with configurable caches", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1" + "@thi.ng/api": "^4.2.2" }, "keywords": [ "cache", diff --git a/packages/morton/CHANGELOG.md b/packages/morton/CHANGELOG.md new file mode 100644 index 0000000000..5cb32bcb74 --- /dev/null +++ b/packages/morton/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2018-10-17) + + +### Features + +* **morton:** import & update [@thi](https://github.com/thi).ng/morton package (MBP2010) ([501536b](https://github.com/thi-ng/umbrella/commit/501536b)) diff --git a/packages/morton/package.json b/packages/morton/package.json index de327e57b2..561a8dcc76 100644 --- a/packages/morton/package.json +++ b/packages/morton/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/morton", - "version": "0.0.1", + "version": "0.1.0", "description": "Z-order-curve / Morton encoding & decoding for 1D, 2D, 3D", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/binary": "^0.0.1", - "@thi.ng/math": "^0.0.1" + "@thi.ng/binary": "^0.1.0", + "@thi.ng/math": "^0.1.0" }, "keywords": [ "binary", @@ -43,4 +43,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/paths/CHANGELOG.md b/packages/paths/CHANGELOG.md index 806ea73d63..d3df9264fb 100644 --- a/packages/paths/CHANGELOG.md +++ b/packages/paths/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.6.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/paths@1.6.3...@thi.ng/paths@1.6.4) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/paths + + + + + ## [1.6.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/paths@1.6.2...@thi.ng/paths@1.6.3) (2018-09-24) diff --git a/packages/paths/package.json b/packages/paths/package.json index 91108ab7d1..e32a3bbb92 100644 --- a/packages/paths/package.json +++ b/packages/paths/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/paths", - "version": "1.6.3", + "version": "1.6.4", "description": "immutable, optimized path-based object property / array accessors", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "accessors", diff --git a/packages/pointfree-lang/CHANGELOG.md b/packages/pointfree-lang/CHANGELOG.md index ea8b0a4e52..3a4574f8d2 100644 --- a/packages/pointfree-lang/CHANGELOG.md +++ b/packages/pointfree-lang/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.23](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree-lang@0.2.22...@thi.ng/pointfree-lang@0.2.23) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/pointfree-lang + + + + + ## [0.2.22](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree-lang@0.2.21...@thi.ng/pointfree-lang@0.2.22) (2018-09-24) diff --git a/packages/pointfree-lang/package.json b/packages/pointfree-lang/package.json index 4ea76dcc2f..eb7c0a1de2 100644 --- a/packages/pointfree-lang/package.json +++ b/packages/pointfree-lang/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/pointfree-lang", - "version": "0.2.22", + "version": "0.2.23", "description": "Forth style syntax layer/compiler for the @thi.ng/pointfree DSL", "main": "./index.js", "typings": "./index.d.ts", @@ -30,9 +30,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/pointfree": "^0.8.10" + "@thi.ng/api": "^4.2.2", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/pointfree": "^0.8.11" }, "keywords": [ "concatenative", diff --git a/packages/pointfree/CHANGELOG.md b/packages/pointfree/CHANGELOG.md index f57a86a635..b78f4c87f7 100644 --- a/packages/pointfree/CHANGELOG.md +++ b/packages/pointfree/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.8.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree@0.8.10...@thi.ng/pointfree@0.8.11) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/pointfree + + + + + ## [0.8.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree@0.8.9...@thi.ng/pointfree@0.8.10) (2018-09-24) diff --git a/packages/pointfree/package.json b/packages/pointfree/package.json index 9ccfa0414d..fd747c9b8e 100644 --- a/packages/pointfree/package.json +++ b/packages/pointfree/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/pointfree", - "version": "0.8.10", + "version": "0.8.11", "description": "Pointfree functional composition / Forth style stack execution engine", "main": "./index.js", "typings": "./index.d.ts", @@ -28,10 +28,10 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "composition", diff --git a/packages/range-coder/CHANGELOG.md b/packages/range-coder/CHANGELOG.md index 9c18605dde..db968f650c 100644 --- a/packages/range-coder/CHANGELOG.md +++ b/packages/range-coder/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.17](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.16...@thi.ng/range-coder@0.1.17) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/range-coder + + + + + ## [0.1.16](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@0.1.15...@thi.ng/range-coder@0.1.16) (2018-09-26) diff --git a/packages/range-coder/package.json b/packages/range-coder/package.json index da0c54cbb1..6b3170304e 100644 --- a/packages/range-coder/package.json +++ b/packages/range-coder/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/range-coder", - "version": "0.1.16", + "version": "0.1.17", "description": "Binary data range encoder / decoder", "main": "./index.js", "typings": "./index.d.ts", @@ -20,7 +20,7 @@ "test": "rm -rf build && tsc -p test && nyc mocha build/test/*.js" }, "devDependencies": { - "@thi.ng/transducers": "^2.1.6", + "@thi.ng/transducers": "^2.2.0", "@types/mocha": "^5.2.5", "@types/node": "^10.5.5", "mocha": "^5.2.0", @@ -29,7 +29,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/bitstream": "^0.4.18" + "@thi.ng/bitstream": "^0.4.19" }, "keywords": [ "ES6", diff --git a/packages/resolve-map/CHANGELOG.md b/packages/resolve-map/CHANGELOG.md index e90291fc0e..edb6934536 100644 --- a/packages/resolve-map/CHANGELOG.md +++ b/packages/resolve-map/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.14](https://github.com/thi-ng/umbrella/compare/@thi.ng/resolve-map@3.0.13...@thi.ng/resolve-map@3.0.14) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/resolve-map + + + + + ## [3.0.13](https://github.com/thi-ng/umbrella/compare/@thi.ng/resolve-map@3.0.12...@thi.ng/resolve-map@3.0.13) (2018-09-24) diff --git a/packages/resolve-map/package.json b/packages/resolve-map/package.json index 362dd0618e..fabe835df6 100644 --- a/packages/resolve-map/package.json +++ b/packages/resolve-map/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/resolve-map", - "version": "3.0.13", + "version": "3.0.14", "description": "DAG resolution of vanilla objects & arrays with internally linked values", "main": "./index.js", "typings": "./index.d.ts", @@ -26,9 +26,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/paths": "^1.6.3" + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/paths": "^1.6.4" }, "keywords": [ "configuration", diff --git a/packages/rle-pack/CHANGELOG.md b/packages/rle-pack/CHANGELOG.md index c25680b52d..14b43cc688 100644 --- a/packages/rle-pack/CHANGELOG.md +++ b/packages/rle-pack/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/rle-pack@1.0.5...@thi.ng/rle-pack@1.0.6) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rle-pack + + + + + ## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rle-pack@1.0.4...@thi.ng/rle-pack@1.0.5) (2018-09-24) diff --git a/packages/rle-pack/package.json b/packages/rle-pack/package.json index 7859f6e923..cb1de650f2 100644 --- a/packages/rle-pack/package.json +++ b/packages/rle-pack/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rle-pack", - "version": "1.0.5", + "version": "1.0.6", "description": "Binary run-length encoding packer w/ flexible repeat bit widths", "main": "./index.js", "typings": "./index.d.ts", @@ -29,8 +29,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/bitstream": "^0.4.18", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/bitstream": "^0.4.19", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "binary", diff --git a/packages/router/CHANGELOG.md b/packages/router/CHANGELOG.md index 5cd17f7255..d73a2ca4dc 100644 --- a/packages/router/CHANGELOG.md +++ b/packages/router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.26](https://github.com/thi-ng/umbrella/compare/@thi.ng/router@0.1.25...@thi.ng/router@0.1.26) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/router + + + + + ## [0.1.25](https://github.com/thi-ng/umbrella/compare/@thi.ng/router@0.1.24...@thi.ng/router@0.1.25) (2018-09-24) diff --git a/packages/router/package.json b/packages/router/package.json index 2dd801ca9d..c81bafafbf 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/router", - "version": "0.1.25", + "version": "0.1.26", "description": "Generic router for browser & non-browser based applications", "main": "./index.js", "typings": "./index.d.ts", @@ -27,10 +27,10 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10" }, "keywords": [ "declarative", diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index 6593d30001..79a271cf09 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.113](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.112...@thi.ng/rstream-csp@0.1.113) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rstream-csp + + + + + ## [0.1.112](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.111...@thi.ng/rstream-csp@0.1.112) (2018-09-26) diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 5e6634a219..21da7bf188 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "0.1.112", + "version": "0.1.113", "description": "@thi.ng/csp bridge module for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/csp": "^0.3.67", - "@thi.ng/rstream": "^1.13.5" + "@thi.ng/csp": "^0.3.68", + "@thi.ng/rstream": "^1.13.6" }, "keywords": [ "bridge", diff --git a/packages/rstream-dot/CHANGELOG.md b/packages/rstream-dot/CHANGELOG.md index ea4f1cd82e..47279dd95e 100644 --- a/packages/rstream-dot/CHANGELOG.md +++ b/packages/rstream-dot/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.52](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.51...@thi.ng/rstream-dot@0.2.52) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rstream-dot + + + + + ## [0.2.51](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@0.2.50...@thi.ng/rstream-dot@0.2.51) (2018-09-26) diff --git a/packages/rstream-dot/package.json b/packages/rstream-dot/package.json index c6279967b2..3a0f04826d 100644 --- a/packages/rstream-dot/package.json +++ b/packages/rstream-dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-dot", - "version": "0.2.51", + "version": "0.2.52", "description": "Graphviz DOT conversion of @thi.ng/rstream dataflow graph topologies", "main": "./index.js", "typings": "./index.d.ts", @@ -28,7 +28,7 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/rstream": "^1.13.5" + "@thi.ng/rstream": "^1.13.6" }, "keywords": [ "conversion", diff --git a/packages/rstream-gestures/CHANGELOG.md b/packages/rstream-gestures/CHANGELOG.md index 8e8c2b032d..310b2f1736 100644 --- a/packages/rstream-gestures/CHANGELOG.md +++ b/packages/rstream-gestures/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.5.14](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.13...@thi.ng/rstream-gestures@0.5.14) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rstream-gestures + + + + + ## [0.5.13](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@0.5.12...@thi.ng/rstream-gestures@0.5.13) (2018-09-26) diff --git a/packages/rstream-gestures/package.json b/packages/rstream-gestures/package.json index c92f5f8cff..7cf9c5d141 100644 --- a/packages/rstream-gestures/package.json +++ b/packages/rstream-gestures/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-gestures", - "version": "0.5.13", + "version": "0.5.14", "description": "Unified mouse, mouse wheel & single-touch event stream abstraction", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/rstream": "^1.13.5", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/rstream": "^1.13.6", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "dataflow", diff --git a/packages/rstream-graph/CHANGELOG.md b/packages/rstream-graph/CHANGELOG.md index 5f773165a0..38ff35453e 100644 --- a/packages/rstream-graph/CHANGELOG.md +++ b/packages/rstream-graph/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.1.38](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.37...@thi.ng/rstream-graph@2.1.38) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rstream-graph + + + + + ## [2.1.37](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@2.1.36...@thi.ng/rstream-graph@2.1.37) (2018-09-26) diff --git a/packages/rstream-graph/package.json b/packages/rstream-graph/package.json index 2a2d0fa43f..76761f03ff 100644 --- a/packages/rstream-graph/package.json +++ b/packages/rstream-graph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-graph", - "version": "2.1.37", + "version": "2.1.38", "description": "Declarative dataflow graph construction for @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -28,13 +28,13 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/paths": "^1.6.3", - "@thi.ng/resolve-map": "^3.0.13", - "@thi.ng/rstream": "^1.13.5", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/paths": "^1.6.4", + "@thi.ng/resolve-map": "^3.0.14", + "@thi.ng/rstream": "^1.13.6", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "compute", diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index 22eaa54abb..cd50df0b5b 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.64](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.63...@thi.ng/rstream-log@1.0.64) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rstream-log + + + + + ## [1.0.63](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@1.0.62...@thi.ng/rstream-log@1.0.63) (2018-09-26) diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index d3a5fb906c..abc555eb25 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "1.0.63", + "version": "1.0.64", "description": "Structured, multilevel & hierarchical loggers based on @thi.ng/rstream", "main": "./index.js", "typings": "./index.d.ts", @@ -28,11 +28,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.5", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/rstream": "^1.13.6", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "ES6", diff --git a/packages/rstream-query/CHANGELOG.md b/packages/rstream-query/CHANGELOG.md index 6ac40c981b..69ad98ca37 100644 --- a/packages/rstream-query/CHANGELOG.md +++ b/packages/rstream-query/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.3.51](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.50...@thi.ng/rstream-query@0.3.51) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rstream-query + + + + + ## [0.3.50](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@0.3.49...@thi.ng/rstream-query@0.3.50) (2018-09-26) diff --git a/packages/rstream-query/package.json b/packages/rstream-query/package.json index 459aeb661a..ea5ffba289 100644 --- a/packages/rstream-query/package.json +++ b/packages/rstream-query/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-query", - "version": "0.3.50", + "version": "0.3.51", "description": "@thi.ng/rstream based triple store & reactive query engine", "main": "./index.js", "typings": "./index.d.ts", @@ -28,14 +28,14 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.11", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/rstream": "^1.13.5", - "@thi.ng/rstream-dot": "^0.2.51", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/associative": "^0.6.12", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/rstream": "^1.13.6", + "@thi.ng/rstream-dot": "^0.2.52", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "dataflow", diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index 1b5f3125a0..441c74ad8a 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.13.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.5...@thi.ng/rstream@1.13.6) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/rstream + + + + + ## [1.13.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@1.13.4...@thi.ng/rstream@1.13.5) (2018-09-26) diff --git a/packages/rstream/package.json b/packages/rstream/package.json index d2d89aba3b..dd4f7cc4fb 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "1.13.5", + "version": "1.13.6", "description": "Reactive multi-tap streams, dataflow & transformation pipeline constructs", "main": "./index.js", "typings": "./index.d.ts", @@ -28,13 +28,13 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/associative": "^0.6.11", - "@thi.ng/atom": "^1.5.4", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/paths": "^1.6.3", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/associative": "^0.6.12", + "@thi.ng/atom": "^1.5.5", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/paths": "^1.6.4", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "datastructure", diff --git a/packages/sax/CHANGELOG.md b/packages/sax/CHANGELOG.md index 336cedb324..73a2649a45 100644 --- a/packages/sax/CHANGELOG.md +++ b/packages/sax/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.5.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.5.1...@thi.ng/sax@0.5.2) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/sax + + + + + ## [0.5.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@0.5.0...@thi.ng/sax@0.5.1) (2018-09-26) diff --git a/packages/sax/package.json b/packages/sax/package.json index 430a5d82c2..0341ec21ff 100644 --- a/packages/sax/package.json +++ b/packages/sax/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/sax", - "version": "0.5.1", + "version": "0.5.2", "description": "Transducer-based, SAX-like, non-validating, speedy & tiny XML parser", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.6", - "@thi.ng/transducers-fsm": "^0.2.24" + "@thi.ng/api": "^4.2.2", + "@thi.ng/transducers": "^2.2.0", + "@thi.ng/transducers-fsm": "^0.2.25" }, "keywords": [ "ES6", diff --git a/packages/strings/CHANGELOG.md b/packages/strings/CHANGELOG.md index 2b4afb89e7..903df26ca0 100644 --- a/packages/strings/CHANGELOG.md +++ b/packages/strings/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.5.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/strings@0.5.0...@thi.ng/strings@0.5.1) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/strings + + + + + # [0.5.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/strings@0.4.3...@thi.ng/strings@0.5.0) (2018-09-25) diff --git a/packages/strings/package.json b/packages/strings/package.json index 0d1b119eab..8a25a8d5c8 100644 --- a/packages/strings/package.json +++ b/packages/strings/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/strings", - "version": "0.5.0", + "version": "0.5.1", "description": "Various string formatting & utility functions", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/errors": "^0.1.9", - "@thi.ng/memoize": "^0.2.3" + "@thi.ng/errors": "^0.1.10", + "@thi.ng/memoize": "^0.2.4" }, "keywords": [ "ES6", diff --git a/packages/transducers-fsm/CHANGELOG.md b/packages/transducers-fsm/CHANGELOG.md index bc9d4050a9..5f0a18c89b 100644 --- a/packages/transducers-fsm/CHANGELOG.md +++ b/packages/transducers-fsm/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.25](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.24...@thi.ng/transducers-fsm@0.2.25) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/transducers-fsm + + + + + ## [0.2.24](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@0.2.23...@thi.ng/transducers-fsm@0.2.24) (2018-09-26) diff --git a/packages/transducers-fsm/package.json b/packages/transducers-fsm/package.json index 02a7ae4365..f937967790 100644 --- a/packages/transducers-fsm/package.json +++ b/packages/transducers-fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-fsm", - "version": "0.2.24", + "version": "0.2.25", "description": "Transducer-based Finite State Machine transformer", "main": "./index.js", "typings": "./index.d.ts", @@ -28,8 +28,8 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "ES6", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index 9bef17b8b1..93a537a140 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.8](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.7...@thi.ng/transducers-hdom@1.1.8) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [1.1.7](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@1.1.6...@thi.ng/transducers-hdom@1.1.7) (2018-09-28) diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index 05c85a98fa..7e6048a3e1 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "1.1.7", + "version": "1.1.8", "description": "Transducer based UI updater for @thi.ng/hdom", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/checks": "^1.5.11", - "@thi.ng/hdom": "^5.0.5", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/checks": "^1.5.12", + "@thi.ng/hdom": "^5.0.6", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "diff", diff --git a/packages/transducers-stats/CHANGELOG.md b/packages/transducers-stats/CHANGELOG.md index 15605a0f79..19d46fc347 100644 --- a/packages/transducers-stats/CHANGELOG.md +++ b/packages/transducers-stats/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.4.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.11...@thi.ng/transducers-stats@0.4.12) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/transducers-stats + + + + + ## [0.4.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@0.4.10...@thi.ng/transducers-stats@0.4.11) (2018-09-26) diff --git a/packages/transducers-stats/package.json b/packages/transducers-stats/package.json index 505e2ac4be..01764deedd 100644 --- a/packages/transducers-stats/package.json +++ b/packages/transducers-stats/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-stats", - "version": "0.4.11", + "version": "0.4.12", "description": "Transducers for statistical / technical analysis", "main": "./index.js", "typings": "./index.d.ts", @@ -28,9 +28,9 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/dcons": "^1.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/dcons": "^1.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "ES6", diff --git a/packages/transducers/CHANGELOG.md b/packages/transducers/CHANGELOG.md index 1d1d3b4ef8..b58a8defce 100644 --- a/packages/transducers/CHANGELOG.md +++ b/packages/transducers/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.6...@thi.ng/transducers@2.2.0) (2018-10-17) + + +### Bug Fixes + +* **transducers:** minor TS3.1 fixes ([1ef2361](https://github.com/thi-ng/umbrella/commit/1ef2361)) + + +### Features + +* **transducers:** update wrap*() fns to accept iterables ([515e5ba](https://github.com/thi-ng/umbrella/commit/515e5ba)) + + + + + ## [2.1.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@2.1.5...@thi.ng/transducers@2.1.6) (2018-09-26) diff --git a/packages/transducers/package.json b/packages/transducers/package.json index c288e794ee..c370d24cef 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers", - "version": "2.1.6", + "version": "2.2.0", "description": "Lightweight transducer implementations for ES6 / TypeScript", "main": "./index.js", "typings": "./index.d.ts", @@ -28,13 +28,13 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/compare": "^0.1.9", - "@thi.ng/compose": "^0.1.4", - "@thi.ng/equiv": "^0.1.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/strings": "^0.5.0" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/compare": "^0.1.10", + "@thi.ng/compose": "^0.2.0", + "@thi.ng/equiv": "^0.1.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/strings": "^0.5.1" }, "keywords": [ "ES6", diff --git a/packages/unionstruct/CHANGELOG.md b/packages/unionstruct/CHANGELOG.md index 9ab88c93b4..485e42cf47 100644 --- a/packages/unionstruct/CHANGELOG.md +++ b/packages/unionstruct/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.17](https://github.com/thi-ng/umbrella/compare/@thi.ng/unionstruct@0.1.16...@thi.ng/unionstruct@0.1.17) (2018-10-17) + +**Note:** Version bump only for package @thi.ng/unionstruct + + + + + ## [0.1.16](https://github.com/thi-ng/umbrella/compare/@thi.ng/unionstruct@0.1.15...@thi.ng/unionstruct@0.1.16) (2018-09-24) diff --git a/packages/unionstruct/package.json b/packages/unionstruct/package.json index 71c4af46dd..5c38cd9fc7 100644 --- a/packages/unionstruct/package.json +++ b/packages/unionstruct/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/unionstruct", - "version": "0.1.16", + "version": "0.1.17", "description": "C-style struct, union and bitfield views of ArrayBuffers", "main": "./index.js", "typings": "./index.d.ts", diff --git a/packages/vectors/CHANGELOG.md b/packages/vectors/CHANGELOG.md index f2b9bd50c1..820a915f40 100644 --- a/packages/vectors/CHANGELOG.md +++ b/packages/vectors/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.4.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@1.3.0...@thi.ng/vectors@1.4.0) (2018-10-17) + + +### Features + +* **vectors:** add axis consts, add/update ops ([473ec80](https://github.com/thi-ng/umbrella/commit/473ec80)) +* **vectors:** add collate & eqDelta fns, update ctors ([221fb7f](https://github.com/thi-ng/umbrella/commit/221fb7f)) +* **vectors:** add comparators & ICompare impls for vec2/3/4 ([6a0f8aa](https://github.com/thi-ng/umbrella/commit/6a0f8aa)) +* **vectors:** add IMinMax interface ([34312d8](https://github.com/thi-ng/umbrella/commit/34312d8)) +* **vectors:** add operation specific interfaces, rename Vec3.toPolar() ([5c44ad9](https://github.com/thi-ng/umbrella/commit/5c44ad9)) +* **vectors:** replace math.ts w/ imports from [@thi](https://github.com/thi).ng/maths package ([0967929](https://github.com/thi-ng/umbrella/commit/0967929)) + + + + + # [1.3.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@1.2.2...@thi.ng/vectors@1.3.0) (2018-09-28) diff --git a/packages/vectors/package.json b/packages/vectors/package.json index 6fa93f620b..e2910427f2 100644 --- a/packages/vectors/package.json +++ b/packages/vectors/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/vectors", - "version": "1.3.0", + "version": "1.4.0", "description": "Vector algebra for fixed & variable sizes, memory mapped, flexible layouts", "main": "./index.js", "typings": "./index.d.ts", @@ -29,11 +29,11 @@ "typescript": "^3.0.1" }, "dependencies": { - "@thi.ng/api": "^4.2.1", - "@thi.ng/checks": "^1.5.11", - "@thi.ng/errors": "^0.1.9", - "@thi.ng/math": "^0.0.1", - "@thi.ng/transducers": "^2.1.6" + "@thi.ng/api": "^4.2.2", + "@thi.ng/checks": "^1.5.12", + "@thi.ng/errors": "^0.1.10", + "@thi.ng/math": "^0.1.0", + "@thi.ng/transducers": "^2.2.0" }, "keywords": [ "ES6", @@ -47,4 +47,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +}