From 2192aa5821bc2526601dd993f3fa7f88044a2327 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Tue, 28 May 2019 14:18:20 +0200 Subject: [PATCH] Use generic Item with typed content to reduce cache misses --- package-lock.json | 2053 +++++++--------------- package.json | 4 +- rollup.config.js | 34 +- src/index.js | 16 +- src/internals.js | 16 +- src/structs/AbstractStruct.js | 16 +- src/structs/ContentBinary.js | 92 + src/structs/ContentDeleted.js | 98 ++ src/structs/ContentEmbed.js | 92 + src/structs/ContentFormat.js | 95 + src/structs/ContentJSON.js | 113 ++ src/structs/ContentString.js | 96 + src/structs/ContentType.js | 161 ++ src/structs/GC.js | 30 +- src/structs/{AbstractItem.js => Item.js} | 428 ++--- src/structs/ItemBinary.js | 99 -- src/structs/ItemDeleted.js | 155 -- src/structs/ItemEmbed.js | 95 - src/structs/ItemFormat.js | 103 -- src/structs/ItemJSON.js | 153 -- src/structs/ItemString.js | 138 -- src/structs/ItemType.js | 199 --- src/types/AbstractType.js | 86 +- src/types/YArray.js | 16 +- src/types/YMap.js | 22 +- src/types/YText.js | 256 ++- src/types/YXmlElement.js | 19 +- src/types/YXmlFragment.js | 29 +- src/utils/DeleteSet.js | 11 +- src/utils/Doc.js | 4 +- src/utils/RelativePosition.js | 15 +- src/utils/Snapshot.js | 4 +- src/utils/StructStore.js | 47 +- src/utils/Transaction.js | 33 +- src/utils/UndoManager.js | 1 - src/utils/encoding.js | 47 +- tests/encoding.tests.js | 42 +- tests/testHelper.js | 25 +- tests/y-array.tests.js | 4 +- tests/y-map.tests.js | 4 +- tests/y-text.tests.js | 8 +- tsconfig.json | 6 +- 42 files changed, 1958 insertions(+), 3007 deletions(-) create mode 100644 src/structs/ContentBinary.js create mode 100644 src/structs/ContentDeleted.js create mode 100644 src/structs/ContentEmbed.js create mode 100644 src/structs/ContentFormat.js create mode 100644 src/structs/ContentJSON.js create mode 100644 src/structs/ContentString.js create mode 100644 src/structs/ContentType.js rename src/structs/{AbstractItem.js => Item.js} (68%) delete mode 100644 src/structs/ItemBinary.js delete mode 100644 src/structs/ItemDeleted.js delete mode 100644 src/structs/ItemEmbed.js delete mode 100644 src/structs/ItemFormat.js delete mode 100644 src/structs/ItemJSON.js delete mode 100644 src/structs/ItemString.js delete mode 100644 src/structs/ItemType.js diff --git a/package-lock.json b/package-lock.json index a9f79bfe..3432a73b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,67 +4,10 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "@babel/parser": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", - "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", "dev": true }, "@types/estree": { @@ -74,9 +17,9 @@ "dev": true }, "@types/node": { - "version": "11.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.10.tgz", - "integrity": "sha512-leUNzbFTMX94TWaIKz8N15Chu55F9QSH+INKayQr5xpkasBQBRF3qQXfo3/dOnMU/dEIit+Y/SU8HyOjq++GwA==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", + "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==", "dev": true }, "@types/resolve": { @@ -89,13 +32,13 @@ } }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { @@ -140,9 +83,9 @@ "dev": true }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -152,10 +95,13 @@ "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "anymatch": { "version": "2.0.0", @@ -230,39 +176,12 @@ "es-abstract": "^1.7.0" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -282,14 +201,50 @@ "dev": true }, "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.0", + "chalk": "^1.1.3", "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "balanced-match": { @@ -350,18 +305,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -372,14 +315,6 @@ "dev": true, "requires": { "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } } }, "batch": { @@ -401,9 +336,9 @@ "dev": true }, "bluebird": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, "boolbase": { @@ -413,9 +348,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -452,15 +387,15 @@ } }, "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, "cache-base": { @@ -478,14 +413,6 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } } }, "caller-path": { @@ -513,16 +440,25 @@ } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "chardet": { @@ -556,9 +492,9 @@ } }, "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -601,12 +537,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true } } }, @@ -642,12 +572,12 @@ } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -656,6 +586,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "dev": true + }, "commander": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", @@ -663,9 +599,9 @@ "dev": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "concat-map": { @@ -701,67 +637,17 @@ "spawn-command": "^0.0.2-1", "supports-color": "^3.2.3", "tree-kill": "^1.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - } - } - } } }, "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "requires": { "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, @@ -783,6 +669,16 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -807,9 +703,9 @@ } }, "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, "date-fns": { @@ -846,13 +742,12 @@ "dev": true }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "object-keys": "^1.0.12" } }, "define-property": { @@ -893,25 +788,13 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, "deglob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", - "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", "dev": true, "requires": { "find-root": "^1.0.0", @@ -922,21 +805,6 @@ "uniq": "^1.0.1" } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -959,33 +827,25 @@ } }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } + "domelementtype": "^1.3.0", + "entities": "^1.1.1" } }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { "domelementtype": "1" @@ -1019,52 +879,44 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "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" } }, "escape-html": { @@ -1124,70 +976,26 @@ "text-table": "~0.2.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -1211,36 +1019,16 @@ "requires": { "debug": "^2.6.9", "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - } } }, "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", "dev": true, "requires": { "debug": "^2.6.8", - "pkg-dir": "^1.0.0" + "pkg-dir": "^2.0.0" } }, "eslint-plugin-import": { @@ -1261,6 +1049,12 @@ "read-pkg-up": "^2.0.0" }, "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -1270,45 +1064,6 @@ "esutils": "^2.0.2", "isarray": "^1.0.0" } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } } } }, @@ -1322,14 +1077,6 @@ "minimatch": "^3.0.4", "resolve": "^1.3.3", "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - } } }, "eslint-plugin-promise": { @@ -1357,9 +1104,9 @@ "dev": true }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1383,13 +1130,19 @@ }, "dependencies": { "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true } } }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", @@ -1414,12 +1167,6 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, - "estree-walker": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", - "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", - "dev": true - }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -1576,12 +1323,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -1612,29 +1353,6 @@ "websocket-driver": ">=0.5.1" } }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "dev": true, - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - } - } - }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -1678,17 +1396,17 @@ } }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, @@ -1699,24 +1417,23 @@ "dev": true }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, @@ -1726,12 +1443,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -1779,7 +1490,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -1800,12 +1512,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1820,17 +1534,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1947,7 +1664,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1959,6 +1677,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1973,6 +1692,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1980,12 +1700,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2004,6 +1726,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2084,7 +1807,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2096,6 +1820,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2181,7 +1906,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2217,6 +1943,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2236,6 +1963,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2279,12 +2007,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2313,9 +2043,9 @@ "dev": true }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2347,33 +2077,25 @@ } } }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -2391,6 +2113,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2400,14 +2128,6 @@ "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } } }, "has-values": { @@ -2420,26 +2140,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -2452,23 +2152,36 @@ } }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "^1.3.0", + "domelementtype": "^1.3.1", "domhandler": "^2.3.0", "domutils": "^1.5.1", "entities": "^1.1.1", "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "http-auth": { @@ -2484,23 +2197,16 @@ } }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-parser-js": { @@ -2510,18 +2216,18 @@ "dev": true }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "imurmurhash": { @@ -2566,58 +2272,6 @@ "string-width": "^2.1.0", "strip-ansi": "^4.0.0", "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "is-accessor-descriptor": { @@ -2627,6 +2281,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-arrayish": { @@ -2645,24 +2310,15 @@ } }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-data-descriptor": { @@ -2672,6 +2328,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-date-object": { @@ -2739,30 +2406,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-plain-object": { @@ -2772,14 +2426,6 @@ "dev": true, "requires": { "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } } }, "is-promise": { @@ -2803,17 +2449,14 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-windows": { "version": "1.0.2", @@ -2845,37 +2488,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "jest-worker": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.0.0.tgz", - "integrity": "sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg==", - "dev": true, - "requires": { - "merge-stream": "^1.0.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -2890,14 +2502,6 @@ "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } } }, "js2xmlparser": { @@ -2936,12 +2540,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true } } }, @@ -2964,22 +2562,19 @@ "dev": true }, "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", + "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", "dev": true, "requires": { "array-includes": "^3.0.3" } }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true }, "klaw": { "version": "3.0.0", @@ -3033,120 +2628,17 @@ "proxy-middleware": "^0.15.0", "send": "^0.17.1", "serve-index": "^1.9.1" - }, - "dependencies": { - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "opn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", - "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "proxy-middleware": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } } }, "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" } }, @@ -3158,14 +2650,6 @@ "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "lodash": { @@ -3247,33 +2731,24 @@ "dev": true }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, - "magic-string": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", - "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3309,9 +2784,9 @@ } }, "markdown-it-anchor": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.0.2.tgz", - "integrity": "sha512-AFM/woBI8QDJMS/9+MmsBMT5/AR+ImfOsunQZTZhzcTmna3rIzAzbOh5E0l6mlFM/i9666BpUtkqQ9bS7WApCg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.1.0.tgz", + "integrity": "sha512-wJOmyXzDUxI8iuowEsaQAKMQBButhSw8j64SpgcaL75QZYC/OSZV66Fnr50lfMLYNGtV0rJdw2fmLwXCT6T+bw==", "dev": true }, "marked": { @@ -3326,15 +2801,6 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -3354,16 +2820,14 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", @@ -3479,26 +2943,6 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } } }, "natural-compare": { @@ -3508,29 +2952,19 @@ "dev": true }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -3542,9 +2976,9 @@ "dev": true }, "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { "boolbase": "~1.0.0" @@ -3575,13 +3009,22 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { @@ -3591,14 +3034,6 @@ "dev": true, "requires": { "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } } }, "object.pick": { @@ -3608,14 +3043,6 @@ "dev": true, "requires": { "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } } }, "on-finished": { @@ -3651,6 +3078,15 @@ "mimic-fn": "^1.0.0" } }, + "opn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -3663,14 +3099,6 @@ "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } } }, "os-tmpdir": { @@ -3680,9 +3108,9 @@ "dev": true }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -3704,12 +3132,13 @@ "dev": true }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "parseurl": { @@ -3731,13 +3160,10 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -3752,9 +3178,9 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { @@ -3764,14 +3190,6 @@ "dev": true, "requires": { "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "pause-stream": { @@ -3784,26 +3202,11 @@ } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", @@ -3812,45 +3215,6 @@ "requires": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "pkg-config": { @@ -3865,12 +3229,12 @@ } }, "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "^2.1.0" } }, "pluralize": { @@ -3892,36 +3256,33 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "dev": true, "requires": { - "asap": "~2.0.3" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, - "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", + "dev": true }, "pseudomap": { "version": "1.0.2", @@ -3929,6 +3290,18 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -3938,50 +3311,79 @@ "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", + "parse-json": "^2.2.0", + "pify": "^2.0.0", "strip-bom": "^3.0.0" } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" } }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } } } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, @@ -4013,9 +3415,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -4044,12 +3446,12 @@ } }, "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-from": { @@ -4081,22 +3483,22 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "rollup": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.11.3.tgz", - "integrity": "sha512-81MR7alHcFKxgWzGfG7jSdv+JQxSOIOD/Fa3iNUmpzbd7p+V19e1l9uffqT8/7YAHgGOzmoPGN3Fx3L2ptOf5g==", + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.12.4.tgz", + "integrity": "sha512-sHg0F05oTMJzM592MWU8irsPx8LIFMKSCnEkcp6vp/gnj+oJ9GJEBW9hl8jUqy2L6Q2uUxFzPgvoExLbfuSODA==", "dev": true, "requires": { "@types/estree": "0.0.39", - "@types/node": "^11.13.9", + "@types/node": "^12.0.2", "acorn": "^6.1.1" } }, @@ -4106,35 +3508,6 @@ "integrity": "sha1-N/ShwgYxHikuMpfql3eduKIduZQ=", "dev": true }, - "rollup-plugin-commonjs": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", - "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", - "dev": true, - "requires": { - "estree-walker": "^0.6.0", - "magic-string": "^0.25.2", - "resolve": "^1.10.0", - "rollup-pluginutils": "^2.6.0" - }, - "dependencies": { - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, "rollup-plugin-node-resolve": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz", @@ -4145,51 +3518,6 @@ "builtin-modules": "^3.1.0", "is-module": "^1.0.0", "resolve": "^1.10.0" - }, - "dependencies": { - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "rollup-plugin-terser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-4.0.4.tgz", - "integrity": "sha512-wPANT5XKVJJ8RDUN0+wIr7UPd0lIXBo4UdJ59VmlPCtlFsE20AM+14pe+tk7YunCsWEiuzkDBY3QIkSCjtrPXg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "jest-worker": "^24.0.0", - "serialize-javascript": "^1.6.1", - "terser": "^3.14.1" - } - }, - "rollup-pluginutils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", - "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.0", - "micromatch": "^3.1.10" } }, "run-async": { @@ -4229,9 +3557,9 @@ } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { @@ -4250,16 +3578,39 @@ "dev": true }, "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, - "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", - "dev": true + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } }, "serve-index": { "version": "1.9.1", @@ -4274,6 +3625,26 @@ "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } } }, "set-value": { @@ -4299,16 +3670,10 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "shebang-command": { @@ -4425,18 +3790,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -4447,12 +3800,23 @@ "dev": true, "requires": { "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { @@ -4474,12 +3838,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "sourcemap-codec": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", - "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", - "dev": true - }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -4487,24 +3845,35 @@ "dev": true }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-license-ids": "^1.0.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, "split": { @@ -4590,9 +3959,9 @@ } }, "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, "stream-combiner": { @@ -4612,6 +3981,24 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -4619,36 +4006,9 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -4656,16 +4016,27 @@ "dev": true }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + } + } }, "table": { "version": "4.0.2", @@ -4679,43 +4050,6 @@ "lodash": "^4.17.4", "slice-ansi": "1.0.0", "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "taffydb": { @@ -4724,41 +4058,6 @@ "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true }, - "terser": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", - "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1", - "source-map-support": "~0.5.9" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4787,6 +4086,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-regex": { @@ -4809,17 +4119,6 @@ "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } } }, "toidentifier": { @@ -4864,12 +4163,6 @@ "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", "dev": true }, - "ua-parser-js": { - "version": "0.7.18", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", - "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==", - "dev": true - }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -4972,12 +4265,6 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true } } }, @@ -5018,13 +4305,13 @@ "dev": true }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vary": { @@ -5049,21 +4336,21 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true - }, "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 603d39a8..03d2c4d9 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "lint": "standard && tsc", "docs": "rm -rf docs; jsdoc --configure ./.jsdoc.json --verbose --readme ./README.v13.md --package ./package.json || true", "serve-docs": "npm run docs && serve ./docs/", - "preversion": "PRODUCTION=1 npm run dist && npm run docs && node ./dist/tests.js --repitition-time 1000", + "preversion": "npm run lint && PRODUCTION=1 npm run dist && npm run docs && node ./dist/tests.js --repitition-time 1000", "postversion": "git push && git push --tags", "debug": "concurrently 'live-server --port=3443 --entry-file=test.html' 'npm run watch'", "trace-deopt": "clear && rollup -c && node --trace-deopt dist/test.js", @@ -59,9 +59,7 @@ "live-server": "^1.2.1", "rollup": "^1.11.3", "rollup-cli": "^1.0.9", - "rollup-plugin-commonjs": "^9.3.4", "rollup-plugin-node-resolve": "^4.2.4", - "rollup-plugin-terser": "^4.0.4", "standard": "^11.0.1", "tui-jsdoc-template": "^1.2.2", "typescript": "^3.4.5", diff --git a/rollup.config.js b/rollup.config.js index 16fdc00a..3846c107 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,6 +1,6 @@ import nodeResolve from 'rollup-plugin-node-resolve' -import commonjs from 'rollup-plugin-commonjs' -import { terser } from 'rollup-plugin-terser' + +const localImports = process.env.LOCALIMPORTS const customModules = new Set([ 'y-websocket', @@ -23,33 +23,18 @@ const debugResolve = { if (importee === 'yjs') { return `${process.cwd()}/src/index.js` } - /* - if (customModules.has(importee.split('/')[0])) { - return `${process.cwd()}/../${importee}/src/${importee}.js` + if (localImports) { + if (customModules.has(importee.split('/')[0])) { + return `${process.cwd()}/../${importee}/src/${importee}.js` + } + if (customLibModules.has(importee.split('/')[0])) { + return `${process.cwd()}/../${importee}` + } } - if (customLibModules.has(importee.split('/')[0])) { - return `${process.cwd()}/../${importee}` - } - */ return null } } -const minificationPlugins = process.env.PRODUCTION ? [terser({ - module: true, - compress: { - hoist_vars: true, - module: true, - passes: 5, - pure_getters: true, - unsafe_comps: true, - unsafe_undefined: true - }, - mangle: { - toplevel: true - } -})] : [] - export default [{ input: './src/index.js', output: [{ @@ -84,6 +69,5 @@ export default [{ sourcemap: true, mainFields: ['module', 'browser', 'main'] }) - // commonjs() ] }] diff --git a/src/index.js b/src/index.js index 3cdf2454..8df553ed 100644 --- a/src/index.js +++ b/src/index.js @@ -13,16 +13,16 @@ export { YMapEvent, YArrayEvent, YEvent, - AbstractItem, + Item, AbstractStruct, GC, - ItemBinary, - ItemDeleted, - ItemEmbed, - ItemFormat, - ItemJSON, - ItemString, - ItemType, + ContentBinary, + ContentDeleted, + ContentEmbed, + ContentFormat, + ContentJSON, + ContentString, + ContentType, AbstractType, RelativePosition, createRelativePositionFromTypeIndex, diff --git a/src/internals.js b/src/internals.js index ed0cced1..78d22105 100644 --- a/src/internals.js +++ b/src/internals.js @@ -21,14 +21,14 @@ export * from './types/YXmlHook.js' export * from './types/YXmlText.js' export * from './structs/AbstractStruct.js' -export * from './structs/AbstractItem.js' export * from './structs/GC.js' -export * from './structs/ItemBinary.js' -export * from './structs/ItemDeleted.js' -export * from './structs/ItemEmbed.js' -export * from './structs/ItemFormat.js' -export * from './structs/ItemJSON.js' -export * from './structs/ItemString.js' -export * from './structs/ItemType.js' +export * from './structs/ContentBinary.js' +export * from './structs/ContentDeleted.js' +export * from './structs/ContentEmbed.js' +export * from './structs/ContentFormat.js' +export * from './structs/ContentJSON.js' +export * from './structs/ContentString.js' +export * from './structs/ContentType.js' +export * from './structs/Item.js' export * from './utils/encoding.js' diff --git a/src/structs/AbstractStruct.js b/src/structs/AbstractStruct.js index 3572b44d..e4c580dc 100644 --- a/src/structs/AbstractStruct.js +++ b/src/structs/AbstractStruct.js @@ -12,14 +12,16 @@ import * as error from 'lib0/error.js' export class AbstractStruct { /** * @param {ID} id + * @param {number} length */ - constructor (id) { + constructor (id, length) { /** * The uniqe identifier of this struct. * @type {ID} * @readonly */ this.id = id + this.length = length this.deleted = false } /** @@ -32,12 +34,6 @@ export class AbstractStruct { mergeWith (right) { return false } - /** - * @type {number} - */ - get length () { - throw error.methodUnimplemented() - } /** * @param {encoding.Encoder} encoder The encoder to write data to. * @param {number} offset @@ -89,10 +85,4 @@ export class AbstractStructRef { toStruct (transaction, store, offset) { throw error.methodUnimplemented() } - /** - * @type {number} - */ - get length () { - return 1 - } } diff --git a/src/structs/ContentBinary.js b/src/structs/ContentBinary.js new file mode 100644 index 00000000..254737a5 --- /dev/null +++ b/src/structs/ContentBinary.js @@ -0,0 +1,92 @@ +import { + StructStore, Item, Transaction // eslint-disable-line +} from '../internals.js' + +import * as encoding from 'lib0/encoding.js' +import * as decoding from 'lib0/decoding.js' +import * as buffer from 'lib0/buffer.js' +import * as error from 'lib0/error.js' + +/** + * @private + */ +export class ContentBinary { + /** + * @param {Uint8Array} content + */ + constructor (content) { + this.content = content + } + /** + * @return {number} + */ + getLength () { + return 1 + } + /** + * @return {Array} + */ + getContent () { + return [this.content] + } + /** + * @return {boolean} + */ + isCountable () { + return true + } + /** + * @return {ContentBinary} + */ + copy () { + return new ContentBinary(this.content) + } + /** + * @param {number} offset + * @return {ContentBinary} + */ + splice (offset) { + throw error.methodUnimplemented() + } + /** + * @param {ContentBinary} right + * @return {boolean} + */ + mergeWith (right) { + return false + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) {} + /** + * @param {Transaction} transaction + */ + delete (transaction) {} + /** + * @param {StructStore} store + */ + gc (store) {} + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + encoding.writeVarUint8Array(encoder, this.content) + } + /** + * @return {number} + */ + getRef () { + return 3 + } +} + +/** + * @private + * + * @param {decoding.Decoder} decoder + * @return {ContentBinary} + */ +export const readContentBinary = decoder => new ContentBinary(buffer.copyUint8Array(decoding.readVarUint8Array(decoder))) diff --git a/src/structs/ContentDeleted.js b/src/structs/ContentDeleted.js new file mode 100644 index 00000000..ae4e8086 --- /dev/null +++ b/src/structs/ContentDeleted.js @@ -0,0 +1,98 @@ + +import { + addToDeleteSet, + StructStore, Item, Transaction // eslint-disable-line +} from '../internals.js' + +import * as encoding from 'lib0/encoding.js' +import * as decoding from 'lib0/decoding.js' + +/** + * @private + */ +export class ContentDeleted { + /** + * @param {number} len + */ + constructor (len) { + this.len = len + } + /** + * @return {number} + */ + getLength () { + return this.len + } + /** + * @return {Array} + */ + getContent () { + return [] + } + /** + * @return {boolean} + */ + isCountable () { + return false + } + /** + * @return {ContentDeleted} + */ + copy () { + return new ContentDeleted(this.len) + } + /** + * @param {number} offset + * @return {ContentDeleted} + */ + splice (offset) { + const right = new ContentDeleted(this.len - offset) + this.len = offset + return right + } + /** + * @param {ContentDeleted} right + * @return {boolean} + */ + mergeWith (right) { + this.len += right.len + return true + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) { + addToDeleteSet(transaction.deleteSet, item.id, this.len) + item.deleted = true + } + /** + * @param {Transaction} transaction + */ + delete (transaction) {} + /** + * @param {StructStore} store + */ + gc (store) {} + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + encoding.writeVarUint(encoder, this.len - offset) + } + /** + * @return {number} + */ + getRef () { + return 1 + } +} + +/** + * @private + * + * @param {decoding.Decoder} decoder + * @return {ContentDeleted} + */ +export const readContentDeleted = decoder => new ContentDeleted(decoding.readVarUint(decoder)) diff --git a/src/structs/ContentEmbed.js b/src/structs/ContentEmbed.js new file mode 100644 index 00000000..f504bd3f --- /dev/null +++ b/src/structs/ContentEmbed.js @@ -0,0 +1,92 @@ + +import { + StructStore, Item, Transaction // eslint-disable-line +} from '../internals.js' + +import * as encoding from 'lib0/encoding.js' +import * as decoding from 'lib0/decoding.js' +import * as error from 'lib0/error.js' + +/** + * @private + */ +export class ContentEmbed { + /** + * @param {Object} embed + */ + constructor (embed) { + this.embed = embed + } + /** + * @return {number} + */ + getLength () { + return 1 + } + /** + * @return {Array} + */ + getContent () { + return [this.embed] + } + /** + * @return {boolean} + */ + isCountable () { + return true + } + /** + * @return {ContentEmbed} + */ + copy () { + return new ContentEmbed(this.embed) + } + /** + * @param {number} offset + * @return {ContentEmbed} + */ + splice (offset) { + throw error.methodUnimplemented() + } + /** + * @param {ContentEmbed} right + * @return {boolean} + */ + mergeWith (right) { + return false + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) {} + /** + * @param {Transaction} transaction + */ + delete (transaction) {} + /** + * @param {StructStore} store + */ + gc (store) {} + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + encoding.writeVarString(encoder, JSON.stringify(this.embed)) + } + /** + * @return {number} + */ + getRef () { + return 5 + } +} + +/** + * @private + * + * @param {decoding.Decoder} decoder + * @return {ContentEmbed} + */ +export const readContentEmbed = decoder => new ContentEmbed(JSON.parse(decoding.readVarString(decoder))) diff --git a/src/structs/ContentFormat.js b/src/structs/ContentFormat.js new file mode 100644 index 00000000..141cbd35 --- /dev/null +++ b/src/structs/ContentFormat.js @@ -0,0 +1,95 @@ + +import { + Item, StructStore, Transaction // eslint-disable-line +} from '../internals.js' + +import * as encoding from 'lib0/encoding.js' +import * as decoding from 'lib0/decoding.js' +import * as error from 'lib0/error.js' + +/** + * @private + */ +export class ContentFormat { + /** + * @param {string} key + * @param {Object} value + */ + constructor (key, value) { + this.key = key + this.value = value + } + /** + * @return {number} + */ + getLength () { + return 1 + } + /** + * @return {Array} + */ + getContent () { + return [] + } + /** + * @return {boolean} + */ + isCountable () { + return false + } + /** + * @return {ContentFormat} + */ + copy () { + return new ContentFormat(this.key, this.value) + } + /** + * @param {number} offset + * @return {ContentFormat} + */ + splice (offset) { + throw error.methodUnimplemented() + } + /** + * @param {ContentFormat} right + * @return {boolean} + */ + mergeWith (right) { + return false + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) {} + /** + * @param {Transaction} transaction + */ + delete (transaction) {} + /** + * @param {StructStore} store + */ + gc (store) {} + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + encoding.writeVarString(encoder, this.key) + encoding.writeVarString(encoder, JSON.stringify(this.value)) + } + /** + * @return {number} + */ + getRef () { + return 6 + } +} + +/** + * @private + * + * @param {decoding.Decoder} decoder + * @return {ContentFormat} + */ +export const readContentFormat = decoder => new ContentFormat(decoding.readVarString(decoder), JSON.parse(decoding.readVarString(decoder))) diff --git a/src/structs/ContentJSON.js b/src/structs/ContentJSON.js new file mode 100644 index 00000000..6bb018cd --- /dev/null +++ b/src/structs/ContentJSON.js @@ -0,0 +1,113 @@ +import { + Transaction, Item, StructStore // eslint-disable-line +} from '../internals.js' + +import * as encoding from 'lib0/encoding.js' +import * as decoding from 'lib0/decoding.js' + +/** + * @private + */ +export class ContentJSON { + /** + * @param {Array} arr + */ + constructor (arr) { + /** + * @type {Array} + */ + this.arr = arr + } + /** + * @return {number} + */ + getLength () { + return this.arr.length + } + /** + * @return {Array} + */ + getContent () { + return this.arr + } + /** + * @return {boolean} + */ + isCountable () { + return true + } + /** + * @return {ContentJSON} + */ + copy () { + return new ContentJSON(this.arr) + } + /** + * @param {number} offset + * @return {ContentJSON} + */ + splice (offset) { + const right = new ContentJSON(this.arr.slice(offset)) + this.arr = this.arr.slice(0, offset) + return right + } + /** + * @param {ContentJSON} right + * @return {boolean} + */ + mergeWith (right) { + this.arr = this.arr.concat(right.arr) + return true + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) {} + /** + * @param {Transaction} transaction + */ + delete (transaction) {} + /** + * @param {StructStore} store + */ + gc (store) {} + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + const len = this.arr.length + encoding.writeVarUint(encoder, len - offset) + for (let i = offset; i < len; i++) { + const c = this.arr[i] + encoding.writeVarString(encoder, c === undefined ? 'undefined' : JSON.stringify(c)) + } + } + /** + * @return {number} + */ + getRef () { + return 2 + } +} + +/** + * @private + * + * @param {decoding.Decoder} decoder + * @return {ContentJSON} + */ +export const readContentJSON = decoder => { + const len = decoding.readVarUint(decoder) + const cs = [] + for (let i = 0; i < len; i++) { + const c = decoding.readVarString(decoder) + if (c === 'undefined') { + cs.push(undefined) + } else { + cs.push(JSON.parse(c)) + } + } + return new ContentJSON(cs) +} diff --git a/src/structs/ContentString.js b/src/structs/ContentString.js new file mode 100644 index 00000000..89e71cf2 --- /dev/null +++ b/src/structs/ContentString.js @@ -0,0 +1,96 @@ +import { + Transaction, Item, StructStore // eslint-disable-line +} from '../internals.js' + +import * as encoding from 'lib0/encoding.js' +import * as decoding from 'lib0/decoding.js' + +/** + * @private + */ +export class ContentString { + /** + * @param {string} str + */ + constructor (str) { + /** + * @type {string} + */ + this.str = str + } + /** + * @return {number} + */ + getLength () { + return this.str.length + } + /** + * @return {Array} + */ + getContent () { + return this.str.split('') + } + /** + * @return {boolean} + */ + isCountable () { + return true + } + /** + * @return {ContentString} + */ + copy () { + return new ContentString(this.str) + } + /** + * @param {number} offset + * @return {ContentString} + */ + splice (offset) { + const right = new ContentString(this.str.slice(offset)) + this.str = this.str.slice(0, offset) + return right + } + /** + * @param {ContentString} right + * @return {boolean} + */ + mergeWith (right) { + this.str += right.str + return true + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) {} + /** + * @param {Transaction} transaction + */ + delete (transaction) {} + /** + * @param {StructStore} store + */ + gc (store) {} + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + encoding.writeVarString(encoder, offset === 0 ? this.str : this.str.slice(offset)) + } + /** + * @return {number} + */ + getRef () { + return 4 + } +} + +/** + * @private + * + * @param {decoding.Decoder} decoder + * @return {ContentString} + */ +export const readContentString = decoder => new ContentString(decoding.readVarString(decoder)) diff --git a/src/structs/ContentType.js b/src/structs/ContentType.js new file mode 100644 index 00000000..6d2f4fcb --- /dev/null +++ b/src/structs/ContentType.js @@ -0,0 +1,161 @@ + +import { + readYArray, + readYMap, + readYText, + readYXmlElement, + readYXmlFragment, + readYXmlHook, + readYXmlText, + StructStore, Transaction, Item, YEvent, AbstractType // eslint-disable-line +} from '../internals.js' + +import * as encoding from 'lib0/encoding.js' // eslint-disable-line +import * as decoding from 'lib0/decoding.js' +import * as error from 'lib0/error.js' + +/** + * @type {Array>} + * @private + */ +export const typeRefs = [ + readYArray, + readYMap, + readYText, + readYXmlElement, + readYXmlFragment, + readYXmlHook, + readYXmlText +] + +export const YArrayRefID = 0 +export const YMapRefID = 1 +export const YTextRefID = 2 +export const YXmlElementRefID = 3 +export const YXmlFragmentRefID = 4 +export const YXmlHookRefID = 5 +export const YXmlTextRefID = 6 + +/** + * @private + */ +export class ContentType { + /** + * @param {AbstractType} type + */ + constructor (type) { + this.type = type + } + /** + * @return {number} + */ + getLength () { + return 1 + } + /** + * @return {Array} + */ + getContent () { + return [this.type] + } + /** + * @return {boolean} + */ + isCountable () { + return true + } + /** + * @return {ContentType} + */ + copy () { + return new ContentType(this.type._copy()) + } + /** + * @param {number} offset + * @return {ContentType} + */ + splice (offset) { + throw error.methodUnimplemented() + } + /** + * @param {ContentType} right + * @return {boolean} + */ + mergeWith (right) { + return false + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) { + this.type._integrate(transaction.doc, item) + } + /** + * @param {Transaction} transaction + */ + delete (transaction) { + let item = this.type._start + while (item !== null) { + if (!item.deleted) { + item.delete(transaction) + } else { + // Whis will be gc'd later and we want to merge it if possible + // We try to merge all deleted items after each transaction, + // but we have no knowledge about that this needs to be merged + // since it is not in transaction.ds. Hence we add it to transaction._mergeStructs + transaction._mergeStructs.add(item.id) + } + item = item.right + } + this.type._map.forEach(item => { + if (!item.deleted) { + item.delete(transaction) + } else { + // same as above + transaction._mergeStructs.add(item.id) + } + }) + transaction.changed.delete(this.type) + transaction.changedParentTypes.delete(this.type) + } + /** + * @param {StructStore} store + */ + gc (store) { + let item = this.type._start + while (item !== null) { + item.gc(store, true) + item = item.right + } + this.type._start = null + this.type._map.forEach(/** @param {Item | null} item */ (item) => { + while (item !== null) { + item.gc(store, true) + item = item.left + } + }) + this.type._map = new Map() + } + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + this.type._write(encoder) + } + /** + * @return {number} + */ + getRef () { + return 7 + } +} + +/** + * @private + * + * @param {decoding.Decoder} decoder + * @return {ContentType} + */ +export const readContentType = decoder => new ContentType(typeRefs[decoding.readVarUint(decoder)](decoder)) diff --git a/src/structs/GC.js b/src/structs/GC.js index a35a8334..1f88ee0b 100644 --- a/src/structs/GC.js +++ b/src/structs/GC.js @@ -21,26 +21,18 @@ export class GC extends AbstractStruct { * @param {number} length */ constructor (id, length) { - super(id) - /** - * @type {number} - */ - this._len = length + super(id, length) this.deleted = true } - get length () { - return this._len - } - delete () {} /** - * @param {AbstractStruct} right + * @param {GC} right * @return {boolean} */ mergeWith (right) { - this._len += right.length + this.length += right.length return true } @@ -57,7 +49,7 @@ export class GC extends AbstractStruct { */ write (encoder, offset) { encoding.writeUint8(encoder, structGCRefNumber) - encoding.writeVarUint(encoder, this._len - offset) + encoding.writeVarUint(encoder, this.length - offset) } } @@ -75,15 +67,7 @@ export class GCRef extends AbstractStructRef { /** * @type {number} */ - this._len = decoding.readVarUint(decoder) - } - get length () { - return this._len - } - missing () { - return [ - createID(this.id.client, this.id.clock - 1) - ] + this.length = decoding.readVarUint(decoder) } /** * @param {Transaction} transaction @@ -95,11 +79,11 @@ export class GCRef extends AbstractStructRef { if (offset > 0) { // @ts-ignore this.id = createID(this.id.client, this.id.clock + offset) - this._len = this._len - offset + this.length -= offset } return new GC( this.id, - this._len + this.length ) } } diff --git a/src/structs/AbstractItem.js b/src/structs/Item.js similarity index 68% rename from src/structs/AbstractItem.js rename to src/structs/Item.js index e28ce546..aafd6c0c 100644 --- a/src/structs/AbstractItem.js +++ b/src/structs/Item.js @@ -10,14 +10,19 @@ import { replaceStruct, addStruct, addToDeleteSet, - ItemDeleted, findRootTypeKey, compareIDs, getItem, - getItemType, getItemCleanEnd, getItemCleanStart, - YEvent, StructStore, ID, AbstractType, Transaction // eslint-disable-line + readContentDeleted, + readContentBinary, + readContentJSON, + readContentString, + readContentEmbed, + readContentFormat, + readContentType, + ContentType, ContentDeleted, StructStore, ID, AbstractType, Transaction // eslint-disable-line } from '../internals.js' import * as error from 'lib0/error.js' @@ -27,28 +32,12 @@ import * as maplib from 'lib0/map.js' import * as set from 'lib0/set.js' import * as binary from 'lib0/binary.js' -/** - * @param {AbstractItem} left - * @param {AbstractItem} right - * @return {boolean} If true, right is removed from the linked list and should be discarded - */ -export const mergeItemWith = (left, right) => { - if (compareIDs(right.origin, left.lastId) && left.right === right && compareIDs(left.rightOrigin, right.rightOrigin)) { - left.right = right.right - if (left.right !== null) { - left.right.left = left - } - return true - } - return false -} - /** * Split leftItem into two items * @param {Transaction} transaction - * @param {AbstractItem} leftItem + * @param {Item} leftItem * @param {number} diff - * @return {AbstractItem} + * @return {Item} * * @function * @private @@ -56,14 +45,15 @@ export const mergeItemWith = (left, right) => { export const splitItem = (transaction, leftItem, diff) => { const id = leftItem.id // create rightItem - const rightItem = leftItem.copy( + const rightItem = new Item( createID(id.client, id.clock + diff), leftItem, createID(id.client, id.clock + diff - 1), leftItem.right, leftItem.rightOrigin, leftItem.parent, - leftItem.parentSub + leftItem.parentSub, + leftItem.content.splice(diff) ) if (leftItem.deleted) { rightItem.deleted = true @@ -80,24 +70,26 @@ export const splitItem = (transaction, leftItem, diff) => { if (rightItem.parentSub !== null && rightItem.right === null) { rightItem.parent._map.set(rightItem.parentSub, rightItem) } + leftItem.length = diff return rightItem } /** * Abstract class that represents any content. */ -export class AbstractItem extends AbstractStruct { +export class Item extends AbstractStruct { /** * @param {ID} id - * @param {AbstractItem | null} left + * @param {Item | null} left * @param {ID | null} origin - * @param {AbstractItem | null} right + * @param {Item | null} right * @param {ID | null} rightOrigin * @param {AbstractType} parent * @param {string | null} parentSub + * @param {AbstractContent} content */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub) { - super(id) + constructor (id, left, origin, right, rightOrigin, parent, parentSub, content) { + super(id, content.getLength()) /** * The item that was originally to the left of this item. * @type {ID | null} @@ -106,12 +98,12 @@ export class AbstractItem extends AbstractStruct { this.origin = origin /** * The item that is currently to the left of this item. - * @type {AbstractItem | null} + * @type {Item | null} */ this.left = left /** * The item that is currently to the right of this item. - * @type {AbstractItem | null} + * @type {Item | null} */ this.right = right /** @@ -143,9 +135,12 @@ export class AbstractItem extends AbstractStruct { /** * If this type's effect is reundone this type refers to the type that undid * this operation. - * @type {AbstractItem | null} + * @type {Item | null} */ this.redone = null + this.content = content + this.length = content.getLength() + this.countable = content.isCountable() } /** @@ -159,7 +154,7 @@ export class AbstractItem extends AbstractStruct { const parentSub = this.parentSub const length = this.length /** - * @type {AbstractItem|null} + * @type {Item|null} */ let o // set o to the first conflicting item @@ -175,11 +170,11 @@ export class AbstractItem extends AbstractStruct { } // TODO: use something like DeleteSet here (a tree implementation would be best) /** - * @type {Set} + * @type {Set} */ const conflictingItems = new Set() /** - * @type {Set} + * @type {Set} */ const itemsBeforeOrigin = new Set() // Let c in conflictingItems, b in itemsBeforeOrigin @@ -238,8 +233,8 @@ export class AbstractItem extends AbstractStruct { parent._length += length } addStruct(store, this) + this.content.integrate(transaction, this) maplib.setIfUndefined(transaction.changed, parent, set.create).add(parentSub) - // @ts-ignore if ((parent._item !== null && parent._item.deleted) || (this.right !== null && parentSub !== null)) { // delete if parent is deleted or if this is not the current attribute value of parent this.delete(transaction) @@ -270,29 +265,11 @@ export class AbstractItem extends AbstractStruct { return n } - /** - * Creates an Item with the same effect as this Item (without position effect) - * - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @return {AbstractItem} - * - * @private - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - throw error.methodUnimplemented() - } - /** * Redoes the effect of this operation. * * @param {Transaction} transaction The Yjs instance. - * @param {Set} redoitems + * @param {Set} redoitems * * @private */ @@ -343,7 +320,7 @@ export class AbstractItem extends AbstractStruct { right = right.right } } - this.redone = this.copy(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, this.parentSub) + this.redone = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, this.parentSub, this.content.copy()) this.redone.integrate(transaction) return true } @@ -354,46 +331,31 @@ export class AbstractItem extends AbstractStruct { get lastId () { return createID(this.id.client, this.id.clock + this.length - 1) } - /** - * Computes the length of this Item. + * Try to merge two items + * + * @param {Item} right + * @return {boolean} */ - get length () { - return 1 - } - - /** - * Should return false if this Item is some kind of meta information - * (e.g. format information). - * - * * Whether this Item should be addressable via `yarray.get(i)` - * * Whether this Item should be counted when computing yarray.length - */ - get countable () { - return true - } - - /** - * Do not call directly. Always split via StructStore! - * - * Splits this Item so that another Item can be inserted in-between. - * This must be overwritten if _length > 1 - * Returns right part after split - * - * (see {@link ItemJSON}/{@link ItemString} for implementation) - * - * Does not integrate the struct, nor store it in struct store. - * - * This method should only be cally by StructStore. - * - * @param {Transaction} transaction - * @param {number} diff - * @return {AbstractItem} - * - * @private - */ - splitAt (transaction, diff) { - throw error.methodUnimplemented() + mergeWith (right) { + if ( + compareIDs(right.origin, this.lastId) && + this.right === right && + compareIDs(this.rightOrigin, right.rightOrigin) && + this.id.client === right.id.client && + this.id.clock + this.length === right.id.clock && + this.deleted === right.deleted && + this.content.constructor === right.content.constructor && + this.content.mergeWith(right.content) + ) { + this.right = right.right + if (this.right !== null) { + this.right.left = this + } + this.length += right.length + return true + } + return false } /** @@ -411,16 +373,10 @@ export class AbstractItem extends AbstractStruct { this.deleted = true addToDeleteSet(transaction.deleteSet, this.id, this.length) maplib.setIfUndefined(transaction.changed, parent, set.create).add(this.parentSub) + this.content.delete(transaction) } } - /** - * @param {StructStore} store - * - * @private - */ - gcChildren (store) { } - /** * @param {StructStore} store * @param {boolean} parentGCd @@ -431,30 +387,12 @@ export class AbstractItem extends AbstractStruct { if (!this.deleted) { throw error.unexpectedCase() } - let r + this.content.gc(store) if (parentGCd) { - r = new GC(this.id, this.length) + replaceStruct(store, this, new GC(this.id, this.length)) } else { - r = new ItemDeleted(this.id, this.left, this.origin, this.right, this.rightOrigin, this.parent, this.parentSub, this.length) - if (r.right !== null) { - r.right.left = r - } else if (r.parentSub !== null) { - r.parent._map.set(r.parentSub, r) - } - if (r.left !== null) { - r.left.right = r - } else if (r.parentSub === null) { - r.parent._start = r - } + this.content = new ContentDeleted(this.length) } - replaceStruct(store, this, r) - } - - /** - * @return {Array} - */ - getContent () { - throw error.methodUnimplemented() } /** @@ -465,15 +403,14 @@ export class AbstractItem extends AbstractStruct { * * @param {encoding.Encoder} encoder The encoder to write data to. * @param {number} offset - * @param {number} encodingRef * * @private */ - write (encoder, offset, encodingRef) { + write (encoder, offset) { const origin = offset > 0 ? createID(this.id.client, this.id.clock + offset - 1) : this.origin const rightOrigin = this.rightOrigin const parentSub = this.parentSub - const info = (encodingRef & binary.BITS5) | + const info = (this.content.getRef() & binary.BITS5) | (origin === null ? 0 : binary.BIT8) | // origin is defined (rightOrigin === null ? 0 : binary.BIT7) | // right origin is defined (parentSub === null ? 0 : binary.BIT6) // parentSub is non-null @@ -489,26 +426,129 @@ export class AbstractItem extends AbstractStruct { if (parent._item === null) { // parent type on y._map // find the correct key - // @ts-ignore we know that y exists const ykey = findRootTypeKey(parent) encoding.writeVarUint(encoder, 1) // write parentYKey encoding.writeVarString(encoder, ykey) } else { encoding.writeVarUint(encoder, 0) // write parent id - // @ts-ignore _item is defined because parent is integrated writeID(encoder, parent._item.id) } if (parentSub !== null) { encoding.writeVarString(encoder, parentSub) } } + this.content.write(encoder, offset) + } +} + +/** + * @param {decoding.Decoder} decoder + * @param {number} info + */ +const readItemContent = (decoder, info) => contentRefs[info & binary.BITS5](decoder) + +/** + * A lookup map for reading Item content. + * + * @type {Array} + */ +export const contentRefs = [ + () => { throw error.unexpectedCase() }, // GC is not ItemContent + readContentDeleted, + readContentJSON, + readContentBinary, + readContentString, + readContentEmbed, + readContentFormat, + readContentType +] + +/** + * Do not implement this class! + */ +export class AbstractContent { + /** + * @return {number} + */ + getLength () { + throw error.methodUnimplemented() + } + /** + * @return {Array} + */ + getContent () { + throw error.methodUnimplemented() + } + /** + * Should return false if this Item is some kind of meta information + * (e.g. format information). + * + * * Whether this Item should be addressable via `yarray.get(i)` + * * Whether this Item should be counted when computing yarray.length + * + * @return {boolean} + */ + isCountable () { + throw error.methodUnimplemented() + } + /** + * @return {AbstractContent} + */ + copy () { + throw error.methodUnimplemented() + } + /** + * @param {number} offset + * @return {AbstractContent} + */ + splice (offset) { + throw error.methodUnimplemented() + } + /** + * @param {AbstractContent} right + * @return {boolean} + */ + mergeWith (right) { + throw error.methodUnimplemented() + } + /** + * @param {Transaction} transaction + * @param {Item} item + */ + integrate (transaction, item) { + throw error.methodUnimplemented() + } + /** + * @param {Transaction} transaction + */ + delete (transaction) { + throw error.methodUnimplemented() + } + /** + * @param {StructStore} store + */ + gc (store) { + throw error.methodUnimplemented() + } + /** + * @param {encoding.Encoder} encoder + * @param {number} offset + */ + write (encoder, offset) { + throw error.methodUnimplemented() + } + /** + * @return {number} + */ + getRef () { + throw error.methodUnimplemented() } } /** * @private */ -export class AbstractItemRef extends AbstractStructRef { +export class ItemRef extends AbstractStructRef { /** * @param {decoding.Decoder} decoder * @param {ID} id @@ -558,85 +598,69 @@ export class AbstractItemRef extends AbstractStructRef { if (this.parent !== null) { missing.push(this.parent) } + /** + * @type {AbstractContent} + */ + this.content = readItemContent(decoder, info) + this.length = this.content.getLength() } -} - -/** - * @param {AbstractItemRef} item - * @param {number} offset - * - * @function - * @private - */ -export const changeItemRefOffset = (item, offset) => { - item.id = createID(item.id.client, item.id.clock + offset) - item.left = createID(item.id.client, item.id.clock - 1) -} - -export class ItemParams { /** - * @param {AbstractItem?} left - * @param {AbstractItem?} right - * @param {AbstractType?} parent - * @param {string|null} parentSub + * @param {Transaction} transaction + * @param {StructStore} store + * @param {number} offset + * @return {Item|GC} */ - constructor (left, right, parent, parentSub) { - this.left = left - this.right = right - this.parent = parent - this.parentSub = parentSub - } -} + toStruct (transaction, store, offset) { + if (offset > 0) { + /** + * @type {ID} + */ + const id = this.id + this.id = createID(id.client, id.clock + offset) + this.left = createID(this.id.client, this.id.clock - 1) + this.content = this.content.splice(offset) + } -/** - * Outsourcing some of the logic of computing the item params from a received struct. - * If parent === null, it is expected to gc the read struct. Otherwise apply it. - * - * @param {Transaction} transaction - * @param {StructStore} store - * @param {ID|null} leftid - * @param {ID|null} rightid - * @param {ID|null} parentid - * @param {string|null} parentSub - * @param {string|null} parentYKey - * @return {ItemParams} - * - * @private - * @function - */ -export const computeItemParams = (transaction, store, leftid, rightid, parentid, parentSub, parentYKey) => { - const left = leftid === null ? null : getItemCleanEnd(transaction, store, leftid) - const right = rightid === null ? null : getItemCleanStart(transaction, store, rightid) - let parent = null - if (parentid !== null) { - const parentItem = getItemType(store, parentid) - switch (parentItem.constructor) { - case ItemDeleted: - case GC: - break - default: - // Edge case: toStruct is called with an offset > 0. In this case left is defined. - // Depending in which order structs arrive, left may be GC'd and the parent not - // deleted. This is why we check if left is GC'd. Strictly we probably don't have - // to check if right is GC'd, but we will in case we run into future issues - if (!parentItem.deleted && (left === null || left.constructor !== GC) && (right === null || right.constructor !== GC)) { - parent = parentItem.type - } + const left = this.left === null ? null : getItemCleanEnd(transaction, store, this.left) + const right = this.right === null ? null : getItemCleanStart(transaction, store, this.right) + let parent = null + let parentSub = this.parentSub + if (this.parent !== null) { + const parentItem = getItem(store, this.parent) + // Edge case: toStruct is called with an offset > 0. In this case left is defined. + // Depending in which order structs arrive, left may be GC'd and the parent not + // deleted. This is why we check if left is GC'd. Strictly we don't have + // to check if right is GC'd, but we will in case we run into future issues + if (!parentItem.deleted && (left === null || left.constructor !== GC) && (right === null || right.constructor !== GC)) { + parent = /** @type {ContentType} */ (parentItem.content).type + } + } else if (this.parentYKey !== null) { + parent = transaction.doc.get(this.parentYKey) + } else if (left !== null) { + if (left.constructor !== GC) { + parent = left.parent + parentSub = left.parentSub + } + } else if (right !== null) { + if (right.constructor !== GC) { + parent = right.parent + parentSub = right.parentSub + } + } else { + throw error.unexpectedCase() } - } else if (parentYKey !== null) { - parent = transaction.doc.get(parentYKey) - } else if (left !== null) { - if (left.constructor !== GC) { - parent = left.parent - parentSub = left.parentSub - } - } else if (right !== null) { - if (right.constructor !== GC) { - parent = right.parent - parentSub = right.parentSub - } - } else { - throw error.unexpectedCase() + + return parent === null + ? new GC(this.id, this.length) + : new Item( + this.id, + left, + this.left, + right, + this.right, + parent, + parentSub, + this.content + ) } - return new ItemParams(left, right, parent, parentSub) } diff --git a/src/structs/ItemBinary.js b/src/structs/ItemBinary.js deleted file mode 100644 index 3640d9b7..00000000 --- a/src/structs/ItemBinary.js +++ /dev/null @@ -1,99 +0,0 @@ - -import { - AbstractItem, - AbstractItemRef, - computeItemParams, - GC, - StructStore, Transaction, AbstractType, ID // eslint-disable-line -} from '../internals.js' - -import * as encoding from 'lib0/encoding.js' -import * as decoding from 'lib0/decoding.js' -import * as buffer from 'lib0/buffer.js' - -/** - * @private - */ -export const structBinaryRefNumber = 1 - -/** - * @private - */ -export class ItemBinary extends AbstractItem { - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @param {Uint8Array} content - */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub, content) { - super(id, left, origin, right, rightOrigin, parent, parentSub) - this.content = content - } - getContent () { - return [this.content] - } - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - return new ItemBinary(id, left, origin, right, rightOrigin, parent, parentSub, this.content) - } - /** - * @param {encoding.Encoder} encoder - * @param {number} offset - */ - write (encoder, offset) { - super.write(encoder, offset, structBinaryRefNumber) - encoding.writeVarUint8Array(encoder, this.content) - } -} - -/** - * @private - */ -export class ItemBinaryRef extends AbstractItemRef { - /** - * @param {decoding.Decoder} decoder - * @param {ID} id - * @param {number} info - */ - constructor (decoder, id, info) { - super(decoder, id, info) - /** - * @type {Uint8Array} - */ - this.content = buffer.copyUint8Array(decoding.readVarUint8Array(decoder)) - } - /** - * @param {Transaction} transaction - * @param {StructStore} store - * @param {number} offset - * @return {ItemBinary|GC} - */ - toStruct (transaction, store, offset) { - const { left, right, parent, parentSub } = computeItemParams(transaction, store, this.left, this.right, this.parent, this.parentSub, this.parentYKey) - return parent === null - ? new GC(this.id, this.length) - : new ItemBinary( - this.id, - left, - this.left, - right, - this.right, - parent, - parentSub, - this.content - ) - } -} diff --git a/src/structs/ItemDeleted.js b/src/structs/ItemDeleted.js deleted file mode 100644 index 71497137..00000000 --- a/src/structs/ItemDeleted.js +++ /dev/null @@ -1,155 +0,0 @@ - -import { - AbstractItem, - AbstractItemRef, - computeItemParams, - changeItemRefOffset, - GC, - splitItem, - addToDeleteSet, - mergeItemWith, - StructStore, Transaction, ID, AbstractType // eslint-disable-line -} from '../internals.js' - -import * as encoding from 'lib0/encoding.js' -import * as decoding from 'lib0/decoding.js' - -/** - * @private - */ -export const structDeletedRefNumber = 2 - -/** - * @private - */ -export class ItemDeleted extends AbstractItem { - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @param {number} length - */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub, length) { - super(id, left, origin, right, rightOrigin, parent, parentSub) - this._len = length - this.deleted = true - } - get length () { - return this._len - } - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - return new ItemDeleted(id, left, origin, right, rightOrigin, parent, parentSub, this.length) - } - /** - * @param {Transaction} transaction - */ - integrate (transaction) { - super.integrate(transaction) - addToDeleteSet(transaction.deleteSet, this.id, this.length) - } - /** - * @param {Transaction} transaction - * @param {number} diff - */ - splitAt (transaction, diff) { - /** - * @type {ItemDeleted} - */ - // @ts-ignore - const right = splitItem(transaction, this, diff) - right._len -= diff - this._len = diff - return right - } - /** - * @param {ItemDeleted} right - * @return {boolean} - */ - mergeWith (right) { - if (mergeItemWith(this, right)) { - this._len += right._len - return true - } - return false - } - - /** - * @param {StructStore} store - * @param {boolean} parentGCd - * - * @private - */ - gc (store, parentGCd) { - if (parentGCd) { - super.gc(store, parentGCd) - } - } - /** - * @param {encoding.Encoder} encoder - * @param {number} offset - */ - write (encoder, offset) { - super.write(encoder, offset, structDeletedRefNumber) - encoding.writeVarUint(encoder, this.length - offset) - } -} - -/** - * @private - */ -export class ItemDeletedRef extends AbstractItemRef { - /** - * @param {decoding.Decoder} decoder - * @param {ID} id - * @param {number} info - */ - constructor (decoder, id, info) { - super(decoder, id, info) - /** - * @type {number} - */ - this.len = decoding.readVarUint(decoder) - } - get length () { - return this.len - } - /** - * @param {Transaction} transaction - * @param {StructStore} store - * @param {number} offset - * @return {ItemDeleted|GC} - */ - toStruct (transaction, store, offset) { - if (offset > 0) { - changeItemRefOffset(this, offset) - this.len = this.len - offset - } - - const { left, right, parent, parentSub } = computeItemParams(transaction, store, this.left, this.right, this.parent, this.parentSub, this.parentYKey) - return parent === null - ? new GC(this.id, this.length) - : new ItemDeleted( - this.id, - left, - this.left, - right, - this.right, - parent, - parentSub, - this.len - ) - } -} diff --git a/src/structs/ItemEmbed.js b/src/structs/ItemEmbed.js deleted file mode 100644 index e30fb426..00000000 --- a/src/structs/ItemEmbed.js +++ /dev/null @@ -1,95 +0,0 @@ - -import { - AbstractItem, - AbstractItemRef, - computeItemParams, - GC, - Transaction, StructStore, ID, AbstractType // eslint-disable-line -} from '../internals.js' - -import * as encoding from 'lib0/encoding.js' -import * as decoding from 'lib0/decoding.js' - -/** - * @private - */ -export const structEmbedRefNumber = 3 - -/** - * @private - */ -export class ItemEmbed extends AbstractItem { - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @param {Object} embed - */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub, embed) { - super(id, left, origin, right, rightOrigin, parent, parentSub) - this.embed = embed - } - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - return new ItemEmbed(id, left, origin, right, rightOrigin, parent, parentSub, this.embed) - } - /** - * @param {encoding.Encoder} encoder - * @param {number} offset - */ - write (encoder, offset) { - super.write(encoder, offset, structEmbedRefNumber) - encoding.writeVarString(encoder, JSON.stringify(this.embed)) - } -} - -/** - * @private - */ -export class ItemEmbedRef extends AbstractItemRef { - /** - * @param {decoding.Decoder} decoder - * @param {ID} id - * @param {number} info - */ - constructor (decoder, id, info) { - super(decoder, id, info) - /** - * @type {Object} - */ - this.embed = JSON.parse(decoding.readVarString(decoder)) - } - /** - * @param {Transaction} transaction - * @param {StructStore} store - * @param {number} offset - * @return {ItemEmbed|GC} - */ - toStruct (transaction, store, offset) { - const { left, right, parent, parentSub } = computeItemParams(transaction, store, this.left, this.right, this.parent, this.parentSub, this.parentYKey) - return parent === null - ? new GC(this.id, this.length) - : new ItemEmbed( - this.id, - left, - this.left, - right, - this.right, - parent, - parentSub, - this.embed - ) - } -} diff --git a/src/structs/ItemFormat.js b/src/structs/ItemFormat.js deleted file mode 100644 index 2a523a5e..00000000 --- a/src/structs/ItemFormat.js +++ /dev/null @@ -1,103 +0,0 @@ - -import { - AbstractItem, - AbstractItemRef, - computeItemParams, - GC, - Transaction, StructStore, ID, AbstractType // eslint-disable-line -} from '../internals.js' - -import * as encoding from 'lib0/encoding.js' -import * as decoding from 'lib0/decoding.js' - -/** - * @private - */ -export const structFormatRefNumber = 4 - -/** - * @private - */ -export class ItemFormat extends AbstractItem { - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @param {string} key - * @param {any} value - */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub, key, value) { - super(id, left, origin, right, rightOrigin, parent, parentSub) - this.key = key - this.value = value - } - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - return new ItemFormat(id, left, origin, right, rightOrigin, parent, parentSub, this.key, this.value) - } - get countable () { - return false - } - /** - * @param {encoding.Encoder} encoder - * @param {number} offset - */ - write (encoder, offset) { - super.write(encoder, offset, structFormatRefNumber) - encoding.writeVarString(encoder, this.key) - encoding.writeVarString(encoder, JSON.stringify(this.value)) - } -} - -/** - * @private - */ -export class ItemFormatRef extends AbstractItemRef { - /** - * @param {decoding.Decoder} decoder - * @param {ID} id - * @param {number} info - */ - constructor (decoder, id, info) { - super(decoder, id, info) - /** - * @type {string} - */ - this.key = decoding.readVarString(decoder) - this.value = JSON.parse(decoding.readVarString(decoder)) - } - /** - * @param {Transaction} transaction - * @param {StructStore} store - * @param {number} offset - * @return {ItemFormat|GC} - */ - toStruct (transaction, store, offset) { - const { left, right, parent, parentSub } = computeItemParams(transaction, store, this.left, this.right, this.parent, this.parentSub, this.parentYKey) - return parent === null - ? new GC(this.id, this.length) - : new ItemFormat( - this.id, - left, - this.left, - right, - this.right, - parent, - parentSub, - this.key, - this.value - ) - } -} diff --git a/src/structs/ItemJSON.js b/src/structs/ItemJSON.js deleted file mode 100644 index 837ff401..00000000 --- a/src/structs/ItemJSON.js +++ /dev/null @@ -1,153 +0,0 @@ - -import { - AbstractItem, - AbstractItemRef, - computeItemParams, - splitItem, - changeItemRefOffset, - GC, - mergeItemWith, - Transaction, StructStore, ID, AbstractType // eslint-disable-line -} from '../internals.js' - -import * as encoding from 'lib0/encoding.js' -import * as decoding from 'lib0/decoding.js' - -/** - * @private - */ -export const structJSONRefNumber = 5 - -/** - * @private - */ -export class ItemJSON extends AbstractItem { - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @param {Array} content - */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub, content) { - super(id, left, origin, right, rightOrigin, parent, parentSub) - /** - * @type {Array} - */ - this.content = content - } - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - return new ItemJSON(id, left, origin, right, rightOrigin, parent, parentSub, this.content) - } - get length () { - return this.content.length - } - getContent () { - return this.content - } - /** - * @param {Transaction} transaction - * @param {number} diff - */ - splitAt (transaction, diff) { - /** - * @type {ItemJSON} - */ - // @ts-ignore - const right = splitItem(transaction, this, diff) - right.content = this.content.splice(diff) - return right - } - /** - * @param {ItemJSON} right - * @return {boolean} - */ - mergeWith (right) { - if (mergeItemWith(this, right)) { - this.content = this.content.concat(right.content) - return true - } - return false - } - /** - * @param {encoding.Encoder} encoder - * @param {number} offset - */ - write (encoder, offset) { - super.write(encoder, offset, structJSONRefNumber) - const len = this.content.length - encoding.writeVarUint(encoder, len - offset) - for (let i = offset; i < len; i++) { - const c = this.content[i] - encoding.writeVarString(encoder, c === undefined ? 'undefined' : JSON.stringify(c)) - } - } -} - -/** - * @private - */ -export class ItemJSONRef extends AbstractItemRef { - /** - * @param {decoding.Decoder} decoder - * @param {ID} id - * @param {number} info - */ - constructor (decoder, id, info) { - super(decoder, id, info) - const len = decoding.readVarUint(decoder) - const cs = [] - for (let i = 0; i < len; i++) { - const c = decoding.readVarString(decoder) - if (c === 'undefined') { - cs.push(undefined) - } else { - cs.push(JSON.parse(c)) - } - } - /** - * @type {Array} - */ - this.content = cs - } - get length () { - return this.content.length - } - /** - * @param {Transaction} transaction - * @param {StructStore} store - * @param {number} offset - * @return {ItemJSON|GC} - */ - toStruct (transaction, store, offset) { - if (offset > 0) { - changeItemRefOffset(this, offset) - this.content = this.content.slice(offset) - } - const { left, right, parent, parentSub } = computeItemParams(transaction, store, this.left, this.right, this.parent, this.parentSub, this.parentYKey) - return parent === null - ? new GC(this.id, this.length) - : new ItemJSON( - this.id, - left, - this.left, - right, - this.right, - parent, - parentSub, - this.content - ) - } -} diff --git a/src/structs/ItemString.js b/src/structs/ItemString.js deleted file mode 100644 index bbaee867..00000000 --- a/src/structs/ItemString.js +++ /dev/null @@ -1,138 +0,0 @@ - -import { - AbstractItem, - AbstractItemRef, - computeItemParams, - splitItem, - changeItemRefOffset, - GC, - mergeItemWith, - Transaction, StructStore, ID, AbstractType // eslint-disable-line -} from '../internals.js' - -import * as encoding from 'lib0/encoding.js' -import * as decoding from 'lib0/decoding.js' - -export const structStringRefNumber = 6 - -/** - * @private - */ -export class ItemString extends AbstractItem { - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @param {string} string - */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub, string) { - super(id, left, origin, right, rightOrigin, parent, parentSub) - /** - * @type {string} - */ - this.string = string - } - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - return new ItemString(id, left, origin, right, rightOrigin, parent, parentSub, this.string) - } - getContent () { - return this.string.split('') - } - get length () { - return this.string.length - } - /** - * @param {Transaction} transaction - * @param {number} diff - * @return {ItemString} - */ - splitAt (transaction, diff) { - /** - * @type {ItemString} - */ - // @ts-ignore - const right = splitItem(transaction, this, diff) - right.string = this.string.slice(diff) - this.string = this.string.slice(0, diff) - return right - } - /** - * @param {ItemString} right - * @return {boolean} - */ - mergeWith (right) { - if (mergeItemWith(this, right)) { - this.string += right.string - return true - } - return false - } - /** - * @param {encoding.Encoder} encoder - * @param {number} offset - */ - write (encoder, offset) { - super.write(encoder, offset, structStringRefNumber) - encoding.writeVarString(encoder, offset === 0 ? this.string : this.string.slice(offset)) - } -} - -/** - * @private - */ -export class ItemStringRef extends AbstractItemRef { - /** - * @param {decoding.Decoder} decoder - * @param {ID} id - * @param {number} info - */ - constructor (decoder, id, info) { - super(decoder, id, info) - /** - * @type {string} - */ - this.string = decoding.readVarString(decoder) - } - get length () { - return this.string.length - } - /** - * @param {Transaction} transaction - * @param {StructStore} store - * @param {number} offset - * @return {ItemString|GC} - */ - toStruct (transaction, store, offset) { - if (offset > 0) { - changeItemRefOffset(this, offset) - this.string = this.string.slice(offset) - } - - const { left, right, parent, parentSub } = computeItemParams(transaction, store, this.left, this.right, this.parent, this.parentSub, this.parentYKey) - return parent === null - ? new GC(this.id, this.length) - : new ItemString( - this.id, - left, - this.left, - right, - this.right, - parent, - parentSub, - this.string - ) - } -} diff --git a/src/structs/ItemType.js b/src/structs/ItemType.js deleted file mode 100644 index 61ecf5df..00000000 --- a/src/structs/ItemType.js +++ /dev/null @@ -1,199 +0,0 @@ - -import { - AbstractItem, - AbstractItemRef, - computeItemParams, - readYArray, - readYMap, - readYText, - readYXmlElement, - readYXmlFragment, - readYXmlHook, - readYXmlText, - StructStore, GC, Transaction, ID, AbstractType // eslint-disable-line -} from '../internals.js' - -import * as encoding from 'lib0/encoding.js' // eslint-disable-line -import * as decoding from 'lib0/decoding.js' - -/** - * @private - */ -export const structTypeRefNumber = 7 - -/** - * @type {Array>} - * @private - */ -export const typeRefs = [ - readYArray, - readYMap, - readYText, - readYXmlElement, - readYXmlFragment, - readYXmlHook, - readYXmlText -] - -export const YArrayRefID = 0 -export const YMapRefID = 1 -export const YTextRefID = 2 -export const YXmlElementRefID = 3 -export const YXmlFragmentRefID = 4 -export const YXmlHookRefID = 5 -export const YXmlTextRefID = 6 - -/** - * @private - */ -export class ItemType extends AbstractItem { - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @param {AbstractType} type - */ - constructor (id, left, origin, right, rightOrigin, parent, parentSub, type) { - super(id, left, origin, right, rightOrigin, parent, parentSub) - this.type = type - } - - getContent () { - return [this.type] - } - /** - * @param {ID} id - * @param {AbstractItem | null} left - * @param {ID | null} origin - * @param {AbstractItem | null} right - * @param {ID | null} rightOrigin - * @param {AbstractType} parent - * @param {string | null} parentSub - * @return {ItemType} - */ - copy (id, left, origin, right, rightOrigin, parent, parentSub) { - return new ItemType(id, left, origin, right, rightOrigin, parent, parentSub, this.type._copy()) - } - /** - * @param {Transaction} transaction - */ - integrate (transaction) { - super.integrate(transaction) - this.type._integrate(transaction.doc, this) - } - /** - * @param {encoding.Encoder} encoder - * @param {number} offset - */ - write (encoder, offset) { - super.write(encoder, offset, structTypeRefNumber) - this.type._write(encoder) - } - /** - * Mark this Item as deleted. - * - * @param {Transaction} transaction The Yjs instance - * @private - */ - delete (transaction) { - if (!this.deleted) { - super.delete(transaction) - let item = this.type._start - while (item !== null) { - if (!item.deleted) { - item.delete(transaction) - } else { - // Whis will be gc'd later and we want to merge it if possible - // We try to merge all deleted items after each transaction, - // but we have no knowledge about that this needs to be merged - // since it is not in transaction.ds. Hence we add it to transaction._mergeStructs - transaction._mergeStructs.add(item.id) - } - item = item.right - } - this.type._map.forEach(item => { - if (!item.deleted) { - item.delete(transaction) - } else { - // same as above - transaction._mergeStructs.add(item.id) - } - }) - transaction.changed.delete(this.type) - transaction.changedParentTypes.delete(this.type) - } - } - - /** - * @param {StructStore} store - */ - gcChildren (store) { - let item = this.type._start - while (item !== null) { - item.gc(store, true) - item = item.right - } - this.type._start = null - this.type._map.forEach(item => { - while (item !== null) { - item.gc(store, true) - // @ts-ignore - item = item.left - } - }) - this._map = new Map() - } - - /** - * @param {StructStore} store - * @param {boolean} parentGCd - */ - gc (store, parentGCd) { - this.gcChildren(store) - super.gc(store, parentGCd) - } -} - -/** - * @private - */ -export class ItemTypeRef extends AbstractItemRef { - /** - * @param {decoding.Decoder} decoder - * @param {ID} id - * @param {number} info - */ - constructor (decoder, id, info) { - super(decoder, id, info) - const typeRef = decoding.readVarUint(decoder) - /** - * @type {AbstractType} - */ - this.type = typeRefs[typeRef](decoder) - } - /** - * @param {Transaction} transaction - * @param {StructStore} store - * @param {number} offset - * @return {ItemType|GC} - */ - toStruct (transaction, store, offset) { - const { left, right, parent, parentSub } = computeItemParams(transaction, store, this.left, this.right, this.parent, this.parentSub, this.parentYKey) - return parent === null - ? new GC(this.id, this.length) - : new ItemType( - this.id, - left, - this.left, - right, - this.right, - parent, - parentSub, - this.type - ) - } -} diff --git a/src/types/AbstractType.js b/src/types/AbstractType.js index d16ca9dd..dd4ae2cd 100644 --- a/src/types/AbstractType.js +++ b/src/types/AbstractType.js @@ -4,14 +4,14 @@ import { callEventHandlerListeners, addEventHandlerListener, createEventHandler, - ItemType, nextID, isVisible, - ItemJSON, - ItemBinary, + ContentType, + ContentJSON, + ContentBinary, createID, getItemCleanStart, - Doc, Snapshot, Transaction, EventHandler, YEvent, AbstractItem, // eslint-disable-line + Doc, Snapshot, Transaction, EventHandler, YEvent, Item, // eslint-disable-line } from '../internals.js' import * as map from 'lib0/map.js' @@ -49,17 +49,17 @@ export const callTypeObservers = (type, transaction, event) => { export class AbstractType { constructor () { /** - * @type {ItemType|null} + * @type {Item|null} */ this._item = null /** * @private - * @type {Map} + * @type {Map} */ this._map = new Map() /** * @private - * @type {AbstractItem|null} + * @type {Item|null} */ this._start = null /** @@ -88,7 +88,7 @@ export class AbstractType { * * Observer functions are fired * * @param {Doc} y The Yjs instance - * @param {ItemType|null} item + * @param {Item|null} item * @private */ _integrate (y, item) { @@ -187,7 +187,7 @@ export const typeListToArray = type => { let n = type._start while (n !== null) { if (n.countable && !n.deleted) { - const c = n.getContent() + const c = n.content.getContent() for (let i = 0; i < c.length; i++) { cs.push(c[i]) } @@ -210,7 +210,7 @@ export const typeListToArraySnapshot = (type, snapshot) => { let n = type._start while (n !== null) { if (n.countable && isVisible(n, snapshot)) { - const c = n.getContent() + const c = n.content.getContent() for (let i = 0; i < c.length; i++) { cs.push(c[i]) } @@ -234,7 +234,7 @@ export const typeListForEach = (type, f) => { let n = type._start while (n !== null) { if (n.countable && !n.deleted) { - const c = n.getContent() + const c = n.content.getContent() for (let i = 0; i < c.length; i++) { f(c[i], index++, type) } @@ -295,7 +295,7 @@ export const typeListCreateIterator = type => { } } // we found n, so we can set currentContent - currentContent = n.getContent() + currentContent = n.content.getContent() currentContentIndex = 0 n = n.right // we used the content of n, now iterate to next } @@ -328,7 +328,7 @@ export const typeListForEachSnapshot = (type, f, snapshot) => { let n = type._start while (n !== null) { if (n.countable && isVisible(n, snapshot)) { - const c = n.getContent() + const c = n.content.getContent() for (let i = 0; i < c.length; i++) { f(c[i], index++, type) } @@ -349,7 +349,7 @@ export const typeListGet = (type, index) => { for (let n = type._start; n !== null; n = n.right) { if (!n.deleted && n.countable) { if (index < n.length) { - return n.getContent()[index] + return n.content.getContent()[index] } index -= n.length } @@ -359,7 +359,7 @@ export const typeListGet = (type, index) => { /** * @param {Transaction} transaction * @param {AbstractType} parent - * @param {AbstractItem?} referenceItem + * @param {Item?} referenceItem * @param {Array|Array|boolean|number|string|Uint8Array>} content * * @private @@ -374,7 +374,7 @@ export const typeListInsertGenericsAfter = (transaction, parent, referenceItem, let jsonContent = [] const packJsonContent = () => { if (jsonContent.length > 0) { - left = new ItemJSON(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, jsonContent) + left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentJSON(jsonContent)) left.integrate(transaction) jsonContent = [] } @@ -393,12 +393,12 @@ export const typeListInsertGenericsAfter = (transaction, parent, referenceItem, switch (c.constructor) { case Uint8Array: case ArrayBuffer: - left = new ItemBinary(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new Uint8Array(/** @type {Uint8Array} */ (c))) + left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentBinary(new Uint8Array(/** @type {Uint8Array} */ (c)))) left.integrate(transaction) break default: if (c instanceof AbstractType) { - left = new ItemType(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, c) + left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentType(c)) left.integrate(transaction) } else { throw new Error('Unexpected content type in insert operation') @@ -501,28 +501,30 @@ export const typeMapDelete = (transaction, parent, key) => { */ export const typeMapSet = (transaction, parent, key, value) => { const left = parent._map.get(key) || null + let content if (value == null) { - new ItemJSON(nextID(transaction), left, left === null ? null : left.lastId, null, null, parent, key, [value]).integrate(transaction) - return - } - switch (value.constructor) { - case Number: - case Object: - case Boolean: - case Array: - case String: - new ItemJSON(nextID(transaction), left, left === null ? null : left.lastId, null, null, parent, key, [value]).integrate(transaction) - break - case Uint8Array: - new ItemBinary(nextID(transaction), left, left === null ? null : left.lastId, null, null, parent, key, value).integrate(transaction) - break - default: - if (value instanceof AbstractType) { - new ItemType(nextID(transaction), left, left === null ? null : left.lastId, null, null, parent, key, value).integrate(transaction) - } else { - throw new Error('Unexpected content type') - } + content = new ContentJSON([value]) + } else { + switch (value.constructor) { + case Number: + case Object: + case Boolean: + case Array: + case String: + content = new ContentJSON([value]) + break + case Uint8Array: + content = new ContentBinary(value) + break + default: + if (value instanceof AbstractType) { + content = new ContentType(value) + } else { + throw new Error('Unexpected content type') + } + } } + new Item(nextID(transaction), left, left === null ? null : left.lastId, null, null, parent, key, content).integrate(transaction) } /** @@ -535,7 +537,7 @@ export const typeMapSet = (transaction, parent, key, value) => { */ export const typeMapGet = (parent, key) => { const val = parent._map.get(key) - return val !== undefined && !val.deleted ? val.getContent()[0] : undefined + return val !== undefined && !val.deleted ? val.content.getContent()[val.length - 1] : undefined } /** @@ -552,7 +554,7 @@ export const typeMapGetAll = (parent) => { let res = {} for (const [key, value] of parent._map) { if (!value.deleted) { - res[key] = value.getContent()[value.length - 1] + res[key] = value.content.getContent()[value.length - 1] } } return res @@ -585,11 +587,11 @@ export const typeMapGetSnapshot = (parent, key, snapshot) => { while (v !== null && (!snapshot.sm.has(v.id.client) || v.id.clock >= (snapshot.sm.get(v.id.client) || 0))) { v = v.left } - return v !== null && isVisible(v, snapshot) ? v.getContent()[v.length - 1] : undefined + return v !== null && isVisible(v, snapshot) ? v.content.getContent()[v.length - 1] : undefined } /** - * @param {Map} map + * @param {Map} map * @return {IterableIterator>} * * @private diff --git a/src/types/YArray.js b/src/types/YArray.js index 38dfeb02..660659b9 100644 --- a/src/types/YArray.js +++ b/src/types/YArray.js @@ -15,7 +15,7 @@ import { YArrayRefID, callTypeObservers, transact, - Doc, Transaction, ItemType, // eslint-disable-line + Doc, Transaction, Item // eslint-disable-line } from '../internals.js' import * as decoding from 'lib0/decoding.js' // eslint-disable-line @@ -59,14 +59,13 @@ export class YArray extends AbstractType { * * Observer functions are fired * * @param {Doc} y The Yjs instance - * @param {ItemType} item + * @param {Item} item * * @private */ _integrate (y, item) { super._integrate(y, item) - // @ts-ignore - this.insert(0, this._prelimContent) + this.insert(0, /** @type {Array} */ (this._prelimContent)) this._prelimContent = null } get length () { @@ -106,8 +105,7 @@ export class YArray extends AbstractType { typeListInsertGenerics(transaction, this, index, content) }) } else { - // @ts-ignore _prelimContent is defined because this is not yet integrated - this._prelimContent.splice(index, 0, ...content) + /** @type {Array} */ (this._prelimContent).splice(index, 0, ...content) } } @@ -132,8 +130,7 @@ export class YArray extends AbstractType { typeListDelete(transaction, this, index, length) }) } else { - // @ts-ignore _prelimContent is defined because this is not yet integrated - this._prelimContent.splice(index, length) + /** @type {Array} */ (this._prelimContent).splice(index, length) } } @@ -175,8 +172,7 @@ export class YArray extends AbstractType { * callback function */ map (f) { - // @ts-ignore - return typeListMap(this, f) + return typeListMap(this, /** @type {any} */ (f)) } /** diff --git a/src/types/YMap.js b/src/types/YMap.js index 34efbe03..afd085cf 100644 --- a/src/types/YMap.js +++ b/src/types/YMap.js @@ -14,7 +14,7 @@ import { YMapRefID, callTypeObservers, transact, - Doc, Transaction, ItemType, // eslint-disable-line + Doc, Transaction, Item // eslint-disable-line } from '../internals.js' import * as encoding from 'lib0/encoding.js' @@ -61,14 +61,13 @@ export class YMap extends AbstractType { * * Observer functions are fired * * @param {Doc} y The Yjs instance - * @param {ItemType} item + * @param {Item} item * * @private */ _integrate (y, item) { super._integrate(y, item) - // @ts-ignore - for (let [key, value] of this._prelimContent) { + for (let [key, value] of /** @type {Map} */ (this._prelimContent)) { this.set(key, value) } this._prelimContent = null @@ -97,7 +96,7 @@ export class YMap extends AbstractType { const map = {} for (let [key, item] of this._map) { if (!item.deleted) { - const v = item.getContent()[0] + const v = item.content.getContent()[item.length - 1] map[key] = v instanceof AbstractType ? v.toJSON() : v } } @@ -119,7 +118,7 @@ export class YMap extends AbstractType { * @return {Iterator} */ values () { - return iterator.iteratorMap(createMapIterator(this._map), /** @param {any} v */ v => v[1].getContent()[v[1].length - 1]) + return iterator.iteratorMap(createMapIterator(this._map), /** @param {any} v */ v => v[1].content.getContent()[v[1].length - 1]) } /** @@ -128,7 +127,7 @@ export class YMap extends AbstractType { * @return {IterableIterator} */ entries () { - return iterator.iteratorMap(createMapIterator(this._map), /** @param {any} v */ v => [v[0], v[1].getContent()[v[1].length - 1]]) + return iterator.iteratorMap(createMapIterator(this._map), /** @param {any} v */ v => [v[0], v[1].content.getContent()[v[1].length - 1]]) } /** @@ -149,8 +148,7 @@ export class YMap extends AbstractType { typeMapDelete(transaction, this, key) }) } else { - // @ts-ignore - this._prelimContent.delete(key) + /** @type {Map} */ (this._prelimContent).delete(key) } } @@ -166,8 +164,7 @@ export class YMap extends AbstractType { typeMapSet(transaction, this, key, value) }) } else { - // @ts-ignore - this._prelimContent.set(key, value) + /** @type {Map} */ (this._prelimContent).set(key, value) } return value } @@ -179,8 +176,7 @@ export class YMap extends AbstractType { * @return {T|undefined} */ get (key) { - // @ts-ignore - return typeMapGet(this, key) + return /** @type {any} */ (typeMapGet(this, key)) } /** diff --git a/src/types/YText.js b/src/types/YText.js index 1617641a..6c9c2657 100644 --- a/src/types/YText.js +++ b/src/types/YText.js @@ -5,9 +5,6 @@ import { YEvent, - ItemEmbed, - ItemString, - ItemFormat, AbstractType, nextID, createID, @@ -16,7 +13,10 @@ import { YTextRefID, callTypeObservers, transact, - Doc, ItemType, AbstractItem, Snapshot, StructStore, Transaction // eslint-disable-line + ContentEmbed, + ContentFormat, + ContentString, + Doc, Item, Snapshot, StructStore, Transaction // eslint-disable-line } from '../internals.js' import * as decoding from 'lib0/decoding.js' // eslint-disable-line @@ -24,8 +24,8 @@ import * as encoding from 'lib0/encoding.js' export class ItemListPosition { /** - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right */ constructor (left, right) { this.left = left @@ -35,8 +35,8 @@ export class ItemListPosition { export class ItemTextListPosition extends ItemListPosition { /** - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} currentAttributes */ constructor (left, right, currentAttributes) { @@ -47,8 +47,8 @@ export class ItemTextListPosition extends ItemListPosition { export class ItemInsertionResult extends ItemListPosition { /** - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} negatedAttributes */ constructor (left, right, negatedAttributes) { @@ -61,8 +61,8 @@ export class ItemInsertionResult extends ItemListPosition { * @param {Transaction} transaction * @param {StructStore} store * @param {Map} currentAttributes - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {number} count * @return {ItemTextListPosition} * @@ -71,9 +71,9 @@ export class ItemInsertionResult extends ItemListPosition { */ const findNextPosition = (transaction, store, currentAttributes, left, right, count) => { while (right !== null && count > 0) { - switch (right.constructor) { - case ItemEmbed: - case ItemString: + switch (right.content.constructor) { + case ContentEmbed: + case ContentString: if (!right.deleted) { if (count < right.length) { // split right @@ -82,10 +82,9 @@ const findNextPosition = (transaction, store, currentAttributes, left, right, co count -= right.length } break - case ItemFormat: + case ContentFormat: if (!right.deleted) { - // @ts-ignore right is ItemFormat - updateCurrentAttributes(currentAttributes, right) + updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (right.content)) } break } @@ -117,8 +116,8 @@ const findPosition = (transaction, store, parent, index) => { * * @param {Transaction} transaction * @param {AbstractType} parent - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} negatedAttributes * @return {ItemListPosition} * @@ -130,21 +129,19 @@ const insertNegatedAttributes = (transaction, parent, left, right, negatedAttrib while ( right !== null && ( right.deleted === true || ( - right.constructor === ItemFormat && - // @ts-ignore right is ItemFormat - (negatedAttributes.get(right.key) === right.value) + right.content.constructor === ContentFormat && + (negatedAttributes.get(/** @type {ContentFormat} */ (right.content).key) === /** @type {ContentFormat} */ (right.content).value) ) ) ) { if (!right.deleted) { - // @ts-ignore right is ItemFormat - negatedAttributes.delete(right.key) + negatedAttributes.delete(/** @type {ContentFormat} */ (right.content).key) } left = right right = right.right } for (let [key, val] of negatedAttributes) { - left = new ItemFormat(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, key, val) + left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentFormat(key, val)) left.integrate(transaction) } return { left, right } @@ -152,14 +149,13 @@ const insertNegatedAttributes = (transaction, parent, left, right, negatedAttrib /** * @param {Map} currentAttributes - * @param {ItemFormat} item + * @param {ContentFormat} format * * @private * @function */ -const updateCurrentAttributes = (currentAttributes, item) => { - const value = item.value - const key = item.key +const updateCurrentAttributes = (currentAttributes, format) => { + const { key, value } = format if (value === null) { currentAttributes.delete(key) } else { @@ -168,8 +164,8 @@ const updateCurrentAttributes = (currentAttributes, item) => { } /** - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} currentAttributes * @param {Object} attributes * @return {ItemListPosition} @@ -184,11 +180,9 @@ const minimizeAttributeChanges = (left, right, currentAttributes, attributes) => break } else if (right.deleted) { // continue - // @ts-ignore right is ItemFormat - } else if (right.constructor === ItemFormat && (attributes[right.key] || null) === right.value) { + } else if (right.content.constructor === ContentFormat && (attributes[(/** @type {ContentFormat} */ (right.content)).key] || null) === /** @type {ContentFormat} */ (right.content).value) { // found a format, update currentAttributes and continue - // @ts-ignore right is ItemFormat - updateCurrentAttributes(currentAttributes, right) + updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (right.content)) } else { break } @@ -201,8 +195,8 @@ const minimizeAttributeChanges = (left, right, currentAttributes, attributes) => /** * @param {Transaction} transaction * @param {AbstractType} parent - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} currentAttributes * @param {Object} attributes * @return {ItemInsertionResult} @@ -219,7 +213,7 @@ const insertAttributes = (transaction, parent, left, right, currentAttributes, a if (currentVal !== val) { // save negated attribute (set null if currentVal undefined) negatedAttributes.set(key, currentVal) - left = new ItemFormat(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, key, val) + left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentFormat(key, val)) left.integrate(transaction) } } @@ -229,8 +223,8 @@ const insertAttributes = (transaction, parent, left, right, currentAttributes, a /** * @param {Transaction} transaction * @param {AbstractType} parent - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} currentAttributes * @param {string} text * @param {Object} attributes @@ -250,11 +244,8 @@ const insertText = (transaction, parent, left, right, currentAttributes, text, a left = insertPos.left right = insertPos.right // insert content - if (text.constructor === String) { - left = new ItemString(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, text) - } else { - left = new ItemEmbed(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, text) - } + const content = text.constructor === String ? new ContentString(text) : new ContentEmbed(text) + left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, content) left.integrate(transaction) return insertNegatedAttributes(transaction, parent, left, insertPos.right, insertPos.negatedAttributes) } @@ -262,8 +253,8 @@ const insertText = (transaction, parent, left, right, currentAttributes, text, a /** * @param {Transaction} transaction * @param {AbstractType} parent - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} currentAttributes * @param {number} length * @param {Object} attributes @@ -282,26 +273,22 @@ const formatText = (transaction, parent, left, right, currentAttributes, length, // delete all formats with attributes[format.key] != null while (length > 0 && right !== null) { if (right.deleted === false) { - switch (right.constructor) { - case ItemFormat: - // @ts-ignore right is ItemFormat - const attr = attributes[right.key] + switch (right.content.constructor) { + case ContentFormat: + const { key, value } = /** @type {ContentFormat} */ (right.content) + const attr = attributes[key] if (attr !== undefined) { - // @ts-ignore right is ItemFormat - if (attr === right.value) { - // @ts-ignore right is ItemFormat - negatedAttributes.delete(right.key) + if (attr === value) { + negatedAttributes.delete(key) } else { - // @ts-ignore right is ItemFormat - negatedAttributes.set(right.key, right.value) + negatedAttributes.set(key, value) } right.delete(transaction) } - // @ts-ignore right is ItemFormat - updateCurrentAttributes(currentAttributes, right) + updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (right.content)) break - case ItemEmbed: - case ItemString: + case ContentEmbed: + case ContentString: if (length < right.length) { getItemCleanStart(transaction, transaction.doc.store, createID(right.id.client, right.id.clock + length)) } @@ -317,8 +304,8 @@ const formatText = (transaction, parent, left, right, currentAttributes, length, /** * @param {Transaction} transaction - * @param {AbstractItem|null} left - * @param {AbstractItem|null} right + * @param {Item|null} left + * @param {Item|null} right * @param {Map} currentAttributes * @param {number} length * @return {ItemListPosition} @@ -329,13 +316,12 @@ const formatText = (transaction, parent, left, right, currentAttributes, length, const deleteText = (transaction, left, right, currentAttributes, length) => { while (length > 0 && right !== null) { if (right.deleted === false) { - switch (right.constructor) { - case ItemFormat: - // @ts-ignore right is ItemFormat - updateCurrentAttributes(currentAttributes, right) + switch (right.content.constructor) { + case ContentFormat: + updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (right.content)) break - case ItemEmbed: - case ItemString: + case ContentEmbed: + case ContentString: if (length < right.length) { getItemCleanStart(transaction, transaction.doc.store, createID(right.id.client, right.id.clock + length)) } @@ -411,13 +397,10 @@ export class YTextEvent extends YEvent { */ get delta () { if (this._delta === null) { - const y = this.target.doc - // @ts-ignore + const y = /** @type {Doc} */ (this.target.doc) + this._delta = [] transact(y, transaction => { - /** - * @type {Array} - */ - const delta = [] + const delta = /** @type {Array} */ (this._delta) const currentAttributes = new Map() // saves all current attributes for insert const oldAttributes = new Map() let item = this.target._start @@ -432,7 +415,6 @@ export class YTextEvent extends YEvent { let insert = '' let retain = 0 let deleteLen = 0 - this._delta = delta const addOp = () => { if (action !== null) { /** @@ -472,14 +454,13 @@ export class YTextEvent extends YEvent { } } while (item !== null) { - switch (item.constructor) { - case ItemEmbed: + switch (item.content.constructor) { + case ContentEmbed: if (this.adds(item)) { if (!this.deletes(item)) { addOp() action = 'insert' - // @ts-ignore item is ItemFormat - insert = item.embed + insert = /** @type {ContentEmbed} */ (item.content).embed addOp() } } else if (this.deletes(item)) { @@ -496,15 +477,14 @@ export class YTextEvent extends YEvent { retain += 1 } break - case ItemString: + case ContentString: if (this.adds(item)) { if (!this.deletes(item)) { if (action !== 'insert') { addOp() action = 'insert' } - // @ts-ignore - insert += item.string + insert += /** @type {ContentString} */ (item.content).str } } else if (this.deletes(item)) { if (action !== 'delete') { @@ -520,59 +500,45 @@ export class YTextEvent extends YEvent { retain += item.length } break - case ItemFormat: + case ContentFormat: + const { key, value } = /** @type {ContentFormat} */ (item.content) if (this.adds(item)) { if (!this.deletes(item)) { - // @ts-ignore item is ItemFormat - const curVal = currentAttributes.get(item.key) || null - // @ts-ignore item is ItemFormat - if (curVal !== item.value) { + const curVal = currentAttributes.get(key) || null + if (curVal !== value) { if (action === 'retain') { addOp() } - // @ts-ignore item is ItemFormat - if (item.value === (oldAttributes.get(item.key) || null)) { - // @ts-ignore item is ItemFormat - delete attributes[item.key] + if (value === (oldAttributes.get(key) || null)) { + delete attributes[key] } else { - // @ts-ignore item is ItemFormat - attributes[item.key] = item.value + attributes[key] = value } } else { item.delete(transaction) } } } else if (this.deletes(item)) { - // @ts-ignore item is ItemFormat - oldAttributes.set(item.key, item.value) - // @ts-ignore item is ItemFormat - const curVal = currentAttributes.get(item.key) || null - // @ts-ignore item is ItemFormat - if (curVal !== item.value) { + oldAttributes.set(key, value) + const curVal = currentAttributes.get(key) || null + if (curVal !== value) { if (action === 'retain') { addOp() } - // @ts-ignore item is ItemFormat - attributes[item.key] = curVal + attributes[key] = curVal } } else if (!item.deleted) { - // @ts-ignore item is ItemFormat - oldAttributes.set(item.key, item.value) - // @ts-ignore item is ItemFormat - const attr = attributes[item.key] + oldAttributes.set(key, value) + const attr = attributes[key] if (attr !== undefined) { - // @ts-ignore item is ItemFormat - if (attr !== item.value) { + if (attr !== value) { if (action === 'retain') { addOp() } - // @ts-ignore item is ItemFormat - if (item.value === null) { - // @ts-ignore item is ItemFormat - attributes[item.key] = item.value + if (value === null) { + attributes[key] = value } else { - // @ts-ignore item is ItemFormat - delete attributes[item.key] + delete attributes[key] } } else { item.delete(transaction) @@ -583,26 +549,24 @@ export class YTextEvent extends YEvent { if (action === 'insert') { addOp() } - // @ts-ignore item is ItemFormat - updateCurrentAttributes(currentAttributes, item) + updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (item.content)) } break } item = item.right } addOp() - while (this._delta.length > 0) { - let lastOp = this._delta[this._delta.length - 1] + while (delta.length > 0) { + let lastOp = delta[delta.length - 1] if (lastOp.retain !== undefined && lastOp.attributes === undefined) { // retain delta's if they don't assign attributes - this._delta.pop() + delta.pop() } else { break } } }) } - // @ts-ignore _delta is defined above return this._delta } } @@ -636,15 +600,14 @@ export class YText extends AbstractType { /** * @param {Doc} y - * @param {ItemType} item + * @param {Item} item * * @private */ _integrate (y, item) { super._integrate(y, item) try { - // @ts-ignore this._prelimContent is still defined - this._pending.forEach(f => f()) + /** @type {Array} */ (this._pending).forEach(f => f()) } catch (e) { console.error(e) } @@ -671,13 +634,12 @@ export class YText extends AbstractType { toString () { let str = '' /** - * @type {AbstractItem|null} + * @type {Item|null} */ let n = this._start while (n !== null) { - if (!n.deleted && n.countable && n.constructor === ItemString) { - // @ts-ignore - str += n.string + if (!n.deleted && n.countable && n.content.constructor === ContentString) { + str += /** @type {ContentString} */ (n.content).str } n = n.right } @@ -711,8 +673,7 @@ export class YText extends AbstractType { } }) } else { - // @ts-ignore - this._pending.push(() => this.applyDelta(delta)) + /** @type {Array} */ (this._pending).push(() => this.applyDelta(delta)) } } @@ -732,10 +693,6 @@ export class YText extends AbstractType { const ops = [] const currentAttributes = new Map() let str = '' - /** - * @type {AbstractItem|null} - */ - // @ts-ignore let n = this._start function packStr () { if (str.length > 0) { @@ -762,8 +719,8 @@ export class YText extends AbstractType { } while (n !== null) { if (isVisible(n, snapshot) || (prevSnapshot !== undefined && isVisible(n, prevSnapshot))) { - switch (n.constructor) { - case ItemString: + switch (n.content.constructor) { + case ContentString: const cur = currentAttributes.get('ychange') if (snapshot !== undefined && !isVisible(n, snapshot)) { if (cur === undefined || cur.user !== n.id.client || cur.state !== 'removed') { @@ -779,20 +736,17 @@ export class YText extends AbstractType { packStr() currentAttributes.delete('ychange') } - // @ts-ignore - str += n.string + str += /** @type {ContentString} */ (n.content).str break - case ItemEmbed: + case ContentEmbed: packStr() ops.push({ - // @ts-ignore item is ItemFormat - insert: n.embed + insert: /** @type {ContentEmbed} */ (n.content).embed }) - break - case ItemFormat: + break + case ContentFormat: packStr() - // @ts-ignore - updateCurrentAttributes(currentAttributes, n) + updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (n.content)) break } } @@ -823,8 +777,7 @@ export class YText extends AbstractType { insertText(transaction, this, left, right, currentAttributes, text, attributes) }) } else { - // @ts-ignore - this._pending.push(() => this.insert(index, text, attributes)) + /** @type {Array} */ (this._pending).push(() => this.insert(index, text, attributes)) } } @@ -849,8 +802,7 @@ export class YText extends AbstractType { insertText(transaction, this, left, right, currentAttributes, embed, attributes) }) } else { - // @ts-ignore - this._pending.push(() => this.insertEmbed(index, embed, attributes)) + /** @type {Array} */ (this._pending).push(() => this.insertEmbed(index, embed, attributes)) } } @@ -873,8 +825,7 @@ export class YText extends AbstractType { deleteText(transaction, left, right, currentAttributes, length) }) } else { - // @ts-ignore - this._pending.push(() => this.delete(index, length)) + /** @type {Array} */ (this._pending).push(() => this.delete(index, length)) } } @@ -899,8 +850,7 @@ export class YText extends AbstractType { formatText(transaction, this, left, right, currentAttributes, length, attributes) }) } else { - // @ts-ignore - this._pending.push(() => this.format(index, length, attributes)) + /** @type {Array} */ (this._pending).push(() => this.format(index, length, attributes)) } } diff --git a/src/types/YXmlElement.js b/src/types/YXmlElement.js index a70ec1e2..76c21298 100644 --- a/src/types/YXmlElement.js +++ b/src/types/YXmlElement.js @@ -8,7 +8,7 @@ import { typeMapGetAll, typeListForEach, YXmlElementRefID, - Snapshot, Doc, ItemType // eslint-disable-line + Snapshot, Doc, Item // eslint-disable-line } from '../internals.js' import * as encoding from 'lib0/encoding.js' @@ -40,16 +40,14 @@ export class YXmlElement extends YXmlFragment { * * Observer functions are fired * * @param {Doc} y The Yjs instance - * @param {ItemType} item + * @param {Item} item * @private */ _integrate (y, item) { super._integrate(y, item) - // @ts-ignore - this.insert(0, this._prelimContent) + this.insert(0, /** @type {Array} */ (this._prelimContent)) this._prelimContent = null - // @ts-ignore - this._prelimAttrs.forEach((value, key) => { + ;(/** @type {Map} */ (this._prelimAttrs)).forEach((value, key) => { this.setAttribute(key, value) }) this._prelimContent = null @@ -105,8 +103,7 @@ export class YXmlElement extends YXmlFragment { typeMapDelete(transaction, this, attributeName) }) } else { - // @ts-ignore - this._prelimAttrs.delete(attributeName) + /** @type {Map} */ (this._prelimAttrs).delete(attributeName) } } @@ -124,8 +121,7 @@ export class YXmlElement extends YXmlFragment { typeMapSet(transaction, this, attributeName, attributeValue) }) } else { - // @ts-ignore - this._prelimAttrs.set(attributeName, attributeValue) + /** @type {Map} */ (this._prelimAttrs).set(attributeName, attributeValue) } } @@ -139,8 +135,7 @@ export class YXmlElement extends YXmlFragment { * @public */ getAttribute (attributeName) { - // @ts-ignore - return typeMapGet(this, attributeName) + return /** @type {any} */ (typeMapGet(this, attributeName)) } /** diff --git a/src/types/YXmlFragment.js b/src/types/YXmlFragment.js index a49e5b6f..a66282cd 100644 --- a/src/types/YXmlFragment.js +++ b/src/types/YXmlFragment.js @@ -14,7 +14,7 @@ import { YXmlFragmentRefID, callTypeObservers, transact, - Transaction, ItemType, YXmlText, YXmlHook, Snapshot // eslint-disable-line + ContentType, Transaction, Item, YXmlText, YXmlHook, Snapshot // eslint-disable-line } from '../internals.js' import * as encoding from 'lib0/encoding.js' @@ -59,10 +59,9 @@ export class YXmlTreeWalker { this._filter = f this._root = root /** - * @type {ItemType | null} + * @type {Item} */ - // @ts-ignore - this._currentNode = root._start + this._currentNode = /** @type {Item} */ (root._start) this._firstCall = true } @@ -77,18 +76,21 @@ export class YXmlTreeWalker { * @public */ next () { + /** + * @type {Item|null} + */ let n = this._currentNode - if (n !== null && (!this._firstCall || n.deleted || !this._filter(n.type))) { // if first call, we check if we can use the first item + let type = /** @type {ContentType} */ (n.content).type + if (n !== null && (!this._firstCall || n.deleted || !this._filter(type))) { // if first call, we check if we can use the first item do { - if (!n.deleted && (n.type.constructor === YXmlElement || n.type.constructor === YXmlFragment) && n.type._start !== null) { + type = /** @type {ContentType} */ (n.content).type + if (!n.deleted && (type.constructor === YXmlElement || type.constructor === YXmlFragment) && type._start !== null) { // walk down in the tree - // @ts-ignore - n = n.type._start + n = type._start } else { // walk right or up in the tree while (n !== null) { if (n.right !== null) { - // @ts-ignore n = n.right break } else if (n.parent === this._root) { @@ -98,16 +100,15 @@ export class YXmlTreeWalker { } } } - } while (n !== null && (n.deleted || !this._filter(n.type))) + } while (n !== null && (n.deleted || !this._filter(/** @type {ContentType} */ (n.content).type))) } this._firstCall = false - this._currentNode = n if (n === null) { - // @ts-ignore return undefined if done=true (the expected result) + // @ts-ignore return { value: undefined, done: true } } - // @ts-ignore - return { value: n.type, done: false } + this._currentNode = n + return { value: /** @type {any} */ (n.content).type, done: false } } } diff --git a/src/utils/DeleteSet.js b/src/utils/DeleteSet.js index 95db50f3..669a6907 100644 --- a/src/utils/DeleteSet.js +++ b/src/utils/DeleteSet.js @@ -3,7 +3,8 @@ import { findIndexSS, createID, getState, - AbstractStruct, AbstractItem, StructStore, Transaction, ID // eslint-disable-line + splitItem, + Item, AbstractStruct, StructStore, Transaction, ID // eslint-disable-line } from '../internals.js' import * as math from 'lib0/math.js' @@ -11,7 +12,7 @@ import * as map from 'lib0/map.js' import * as encoding from 'lib0/encoding.js' import * as decoding from 'lib0/decoding.js' -class DeleteItem { +export class DeleteItem { /** * @param {number} clock * @param {number} len @@ -235,13 +236,13 @@ export const readDeleteSet = (decoder, transaction, store) => { let index = findIndexSS(structs, clock) /** * We can ignore the case of GC and Delete structs, because we are going to skip them - * @type {AbstractItem} + * @type {Item} */ // @ts-ignore let struct = structs[index] // split the first item if necessary if (!struct.deleted && struct.id.clock < clock) { - structs.splice(index + 1, 0, struct.splitAt(transaction, clock - struct.id.clock)) + structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock)) index++ // increase we now want to use the next struct } while (index < structs.length) { @@ -250,7 +251,7 @@ export const readDeleteSet = (decoder, transaction, store) => { if (struct.id.clock < clock + len) { if (!struct.deleted) { if (clock + len < struct.id.clock + struct.length) { - structs.splice(index, 0, struct.splitAt(transaction, clock + len - struct.id.clock)) + structs.splice(index, 0, splitItem(transaction, struct, clock + len - struct.id.clock)) } struct.delete(transaction) } diff --git a/src/utils/Doc.js b/src/utils/Doc.js index cc45af19..40d5b4a1 100644 --- a/src/utils/Doc.js +++ b/src/utils/Doc.js @@ -10,7 +10,7 @@ import { YMap, YXmlFragment, transact, - AbstractItem, Transaction, YEvent // eslint-disable-line + Item, Transaction, YEvent // eslint-disable-line } from '../internals.js' import { Observable } from 'lib0/observable.js' @@ -97,7 +97,7 @@ export class Doc extends Observable { // @ts-ignore const t = new TypeConstructor() t._map = type._map - type._map.forEach(/** @param {AbstractItem?} n */ n => { + type._map.forEach(/** @param {Item?} n */ n => { for (; n !== null; n = n.left) { n.parent = t } diff --git a/src/utils/RelativePosition.js b/src/utils/RelativePosition.js index 25522078..24f30b96 100644 --- a/src/utils/RelativePosition.js +++ b/src/utils/RelativePosition.js @@ -1,16 +1,15 @@ import { getItem, - getItemType, createID, writeID, readID, compareIDs, getState, findRootTypeKey, - AbstractItem, - ItemType, - ID, StructStore, Doc, AbstractType // eslint-disable-line + Item, + ContentType, + ID, Doc, AbstractType // eslint-disable-line } from '../internals.js' import * as encoding from 'lib0/encoding.js' @@ -224,7 +223,7 @@ export const createAbsolutePositionFromRelativePosition = (rpos, doc) => { return null } const right = getItem(store, rightID) - if (!(right instanceof AbstractItem)) { + if (!(right instanceof Item)) { return null } index = right.deleted || !right.countable ? 0 : rightID.clock - right.id.clock @@ -244,9 +243,9 @@ export const createAbsolutePositionFromRelativePosition = (rpos, doc) => { // type does not exist yet return null } - const struct = getItemType(store, typeID) - if (struct instanceof ItemType) { - type = struct.type + const struct = getItem(store, typeID) + if (struct instanceof Item && struct.content instanceof ContentType) { + type = struct.content.type } else { // struct is garbage collected return null diff --git a/src/utils/Snapshot.js b/src/utils/Snapshot.js index 92e2f0ec..2d33941f 100644 --- a/src/utils/Snapshot.js +++ b/src/utils/Snapshot.js @@ -1,7 +1,7 @@ import { isDeleted, - DeleteSet, AbstractItem // eslint-disable-line + DeleteSet, Item // eslint-disable-line } from '../internals.js' export class Snapshot { @@ -31,7 +31,7 @@ export class Snapshot { export const createSnapshot = (ds, sm) => new Snapshot(ds, sm) /** - * @param {AbstractItem} item + * @param {Item} item * @param {Snapshot|undefined} snapshot * * @protected diff --git a/src/utils/StructStore.js b/src/utils/StructStore.js index 2a9bb27d..9b14d2fd 100644 --- a/src/utils/StructStore.js +++ b/src/utils/StructStore.js @@ -1,7 +1,8 @@ import { GC, - Transaction, AbstractStructRef, ID, ItemType, AbstractItem, AbstractStruct // eslint-disable-line + splitItem, + GCRef, ItemRef, Transaction, ID, Item, AbstractStruct // eslint-disable-line } from '../internals.js' import * as math from 'lib0/math.js' @@ -21,14 +22,14 @@ export class StructStore { * We could shift the array of refs instead, but shift is incredible * slow in Chrome for arrays with more than 100k elements * @see tryResumePendingStructRefs - * @type {Map}>} + * @type {Map}>} * @private */ this.pendingClientsStructRefs = new Map() /** * Stack of pending structs waiting for struct dependencies * Maximum length of stack is structReaders.size - * @type {Array} + * @type {Array} * @private */ this.pendingStack = [] @@ -169,7 +170,7 @@ export const find = (store, id) => { * * @param {StructStore} store * @param {ID} id - * @return {AbstractItem} + * @return {Item} * * @private * @function @@ -177,43 +178,23 @@ export const find = (store, id) => { // @ts-ignore export const getItem = (store, id) => find(store, id) -/** - * Expects that id is actually in store. This function throws or is an infinite loop otherwise. - * - * @param {StructStore} store - * @param {ID} id - * @return {ItemType} - * - * @private - * @function - */ -// @ts-ignore -export const getItemType = (store, id) => find(store, id) - /** * Expects that id is actually in store. This function throws or is an infinite loop otherwise. * * @param {Transaction} transaction * @param {StructStore} store * @param {ID} id - * @return {AbstractItem} + * @return {Item} * * @private * @function */ export const getItemCleanStart = (transaction, store, id) => { - /** - * @type {Array} - */ - // @ts-ignore - const structs = store.clients.get(id.client) + const structs = /** @type {Array} */ (store.clients.get(id.client)) const index = findIndexSS(structs, id.clock) - /** - * @type {AbstractItem} - */ let struct = structs[index] if (struct.id.clock < id.clock && struct.constructor !== GC) { - struct = struct.splitAt(transaction, id.clock - struct.id.clock) + struct = splitItem(transaction, struct, id.clock - struct.id.clock) structs.splice(index + 1, 0, struct) } return struct @@ -225,21 +206,21 @@ export const getItemCleanStart = (transaction, store, id) => { * @param {Transaction} transaction * @param {StructStore} store * @param {ID} id - * @return {AbstractItem} + * @return {Item} * * @private * @function */ export const getItemCleanEnd = (transaction, store, id) => { /** - * @type {Array} + * @type {Array} */ // @ts-ignore const structs = store.clients.get(id.client) const index = findIndexSS(structs, id.clock) const struct = structs[index] if (id.clock !== struct.id.clock + struct.length - 1 && struct.constructor !== GC) { - structs.splice(index + 1, 0, struct.splitAt(transaction, id.clock - struct.id.clock + 1)) + structs.splice(index + 1, 0, splitItem(transaction, struct, id.clock - struct.id.clock + 1)) } return struct } @@ -254,10 +235,6 @@ export const getItemCleanEnd = (transaction, store, id) => { * @function */ export const replaceStruct = (store, struct, newStruct) => { - /** - * @type {Array} - */ - // @ts-ignore - const structs = store.clients.get(struct.id.client) + const structs = /** @type {Array} */ (store.clients.get(struct.id.client)) structs[findIndexSS(structs, struct.id.clock)] = newStruct } diff --git a/src/utils/Transaction.js b/src/utils/Transaction.js index d8ae1c80..905f6723 100644 --- a/src/utils/Transaction.js +++ b/src/utils/Transaction.js @@ -9,7 +9,7 @@ import { getStateVector, findIndexSS, callEventHandlerListeners, - AbstractItem, + Item, ID, AbstractType, AbstractStruct, YEvent, Doc // eslint-disable-line } from '../internals.js' @@ -179,20 +179,15 @@ export const transact = (doc, f, origin = null) => { if (left.deleted === right.deleted && left.constructor === right.constructor) { if (left.mergeWith(right)) { structs.splice(pos, 1) - if (right instanceof AbstractItem && right.parentSub !== null && right.parent._map.get(right.parentSub) === right) { - // @ts-ignore we already did a constructor check above - right.parent._map.set(right.parentSub, left) + if (right instanceof Item && right.parentSub !== null && right.parent._map.get(right.parentSub) === right) { + right.parent._map.set(right.parentSub, /** @type {Item} */ (left)) } } } } // replace deleted items with ItemDeleted / GC for (const [client, deleteItems] of ds.clients) { - /** - * @type {Array} - */ - // @ts-ignore - const structs = store.clients.get(client) + const structs = /** @type {Array} */ (store.clients.get(client)) for (let di = deleteItems.length - 1; di >= 0; di--) { const deleteItem = deleteItems[di] const endDeleteItemClock = deleteItem.clock + deleteItem.len @@ -205,7 +200,7 @@ export const transact = (doc, f, origin = null) => { if (deleteItem.clock + deleteItem.len <= struct.id.clock) { break } - if (struct.deleted && struct instanceof AbstractItem) { + if (struct.deleted && struct instanceof Item) { struct.gc(store, false) } } @@ -214,11 +209,7 @@ export const transact = (doc, f, origin = null) => { // try to merge deleted / gc'd items // merge from right to left for better efficiecy and so we don't miss any merge targets for (const [client, deleteItems] of ds.clients) { - /** - * @type {Array} - */ - // @ts-ignore - const structs = store.clients.get(client) + const structs = /** @type {Array} */ (store.clients.get(client)) for (let di = deleteItems.length - 1; di >= 0; di--) { const deleteItem = deleteItems[di] // start with merging the item next to the last deleted item @@ -237,11 +228,7 @@ export const transact = (doc, f, origin = null) => { for (const [client, clock] of transaction.afterState) { const beforeClock = transaction.beforeState.get(client) || 0 if (beforeClock !== clock) { - /** - * @type {Array} - */ - // @ts-ignore - const structs = store.clients.get(client) + const structs = /** @type {Array} */ (store.clients.get(client)) // we iterate from right to left so we can safely remove entries const firstChangePos = math.max(findIndexSS(structs, beforeClock), 1) for (let i = structs.length - 1; i >= firstChangePos; i--) { @@ -255,11 +242,7 @@ export const transact = (doc, f, origin = null) => { for (const mid of transaction._mergeStructs) { const client = mid.client const clock = mid.clock - /** - * @type {Array} - */ - // @ts-ignore - const structs = store.clients.get(client) + const structs = /** @type {Array} */ (store.clients.get(client)) const replacedStructPos = findIndexSS(structs, clock) if (replacedStructPos + 1 < structs.length) { tryToMergeWithLeft(structs, replacedStructPos + 1) diff --git a/src/utils/UndoManager.js b/src/utils/UndoManager.js index d2e19797..3d7984c6 100644 --- a/src/utils/UndoManager.js +++ b/src/utils/UndoManager.js @@ -200,4 +200,3 @@ export class UndoManager { return performedRedo } } -} diff --git a/src/utils/encoding.js b/src/utils/encoding.js index 0778a2ac..c4ee0d2a 100644 --- a/src/utils/encoding.js +++ b/src/utils/encoding.js @@ -1,18 +1,23 @@ /** * @module encoding + * + * We use the first five bits in the info flag for determining the type of the struct. + * + * 0: GC + * 1: Item with Deleted content + * 2: Item with JSON content + * 3: Item with Binary content + * 4: Item with String content + * 5: Item with Embed content (for richtext content) + * 6: Item with Format content (a formatting marker for richtext content) + * 7: Item with Type */ import { findIndexSS, GCRef, - ItemBinaryRef, - ItemDeletedRef, - ItemEmbedRef, - ItemFormatRef, - ItemJSONRef, - ItemStringRef, - ItemTypeRef, + ItemRef, writeID, createID, readID, @@ -21,27 +26,13 @@ import { readDeleteSet, writeDeleteSet, createDeleteSetFromStructStore, - Doc, Transaction, AbstractStruct, AbstractStructRef, StructStore, ID // eslint-disable-line + Doc, Transaction, AbstractStruct, StructStore, ID // eslint-disable-line } from '../internals.js' import * as encoding from 'lib0/encoding.js' import * as decoding from 'lib0/decoding.js' import * as binary from 'lib0/binary.js' -/** - * @private - */ -export const structRefs = [ - GCRef, - ItemBinaryRef, - ItemDeletedRef, - ItemEmbedRef, - ItemFormatRef, - ItemJSONRef, - ItemStringRef, - ItemTypeRef -] - /** * @param {encoding.Encoder} encoder * @param {Array} structs All structs by `client` @@ -68,19 +59,19 @@ const writeStructs = (encoder, structs, client, clock) => { * @param {decoding.Decoder} decoder * @param {number} numOfStructs * @param {ID} nextID - * @return {Array} + * @return {Array} * * @private * @function */ const readStructRefs = (decoder, numOfStructs, nextID) => { /** - * @type {Array} + * @type {Array} */ const refs = [] for (let i = 0; i < numOfStructs; i++) { const info = decoding.readUint8(decoder) - const ref = new structRefs[binary.BITS5 & info](decoder, nextID, info) + const ref = (binary.BITS5 & info) === 0 ? new GCRef(decoder, nextID, info) : new ItemRef(decoder, nextID, info) nextID = createID(nextID.client, nextID.clock + ref.length) refs.push(ref) } @@ -119,14 +110,14 @@ export const writeClientsStructs = (encoder, store, _sm) => { /** * @param {decoding.Decoder} decoder The decoder object to read data from. - * @return {Map>} + * @return {Map>} * * @private * @function */ export const readClientsStructRefs = decoder => { /** - * @type {Map>} + * @type {Map>} */ const clientRefs = new Map() const numOfStateUpdates = decoding.readVarUint(decoder) @@ -254,7 +245,7 @@ export const writeStructsFromTransaction = (encoder, transaction) => writeClient /** * @param {StructStore} store - * @param {Map>} clientsStructsRefs + * @param {Map>} clientsStructsRefs * * @private * @function diff --git a/tests/encoding.tests.js b/tests/encoding.tests.js index 45d2e5e7..387c385d 100644 --- a/tests/encoding.tests.js +++ b/tests/encoding.tests.js @@ -1,36 +1,26 @@ import * as t from 'lib0/testing.js' import { - structRefs, - structGCRefNumber, - structBinaryRefNumber, - structDeletedRefNumber, - structEmbedRefNumber, - structFormatRefNumber, - structJSONRefNumber, - structStringRefNumber, - structTypeRefNumber, - GCRef, - ItemBinaryRef, - ItemDeletedRef, - ItemEmbedRef, - ItemFormatRef, - ItemJSONRef, - ItemStringRef, - ItemTypeRef + contentRefs, + readContentBinary, + readContentDeleted, + readContentString, + readContentJSON, + readContentEmbed, + readContentType, + readContentFormat } from '../src/internals.js' /** * @param {t.TestCase} tc */ export const testStructReferences = tc => { - t.assert(structRefs.length === 8) - t.assert(structRefs[structGCRefNumber] === GCRef) - t.assert(structRefs[structBinaryRefNumber] === ItemBinaryRef) - t.assert(structRefs[structDeletedRefNumber] === ItemDeletedRef) - t.assert(structRefs[structEmbedRefNumber] === ItemEmbedRef) - t.assert(structRefs[structFormatRefNumber] === ItemFormatRef) - t.assert(structRefs[structJSONRefNumber] === ItemJSONRef) - t.assert(structRefs[structStringRefNumber] === ItemStringRef) - t.assert(structRefs[structTypeRefNumber] === ItemTypeRef) + t.assert(contentRefs.length === 8) + t.assert(contentRefs[1] === readContentDeleted) + t.assert(contentRefs[2] === readContentJSON) + t.assert(contentRefs[3] === readContentBinary) + t.assert(contentRefs[4] === readContentString) + t.assert(contentRefs[5] === readContentEmbed) + t.assert(contentRefs[6] === readContentFormat) + t.assert(contentRefs[7] === readContentType) } diff --git a/tests/testHelper.js b/tests/testHelper.js index fc410676..2a8d4d40 100644 --- a/tests/testHelper.js +++ b/tests/testHelper.js @@ -3,8 +3,8 @@ import * as Y from '../src/index.js' import { createDeleteSetFromStructStore, getStateVector, - AbstractItem, - DeleteSet, StructStore, Doc // eslint-disable-line + Item, + DeleteItem, DeleteSet, StructStore, Doc // eslint-disable-line } from '../src/internals.js' import * as t from 'lib0/testing.js' @@ -12,6 +12,7 @@ import * as prng from 'lib0/prng.js' import * as encoding from 'lib0/encoding.js' import * as decoding from 'lib0/decoding.js' import * as syncProtocol from 'y-protocols/sync.js' +export * from '../src/internals.js' /** * @param {TestYInstance} y // publish message created by `y` to all other online clients @@ -240,8 +241,7 @@ export const init = (tc, { users = 5 } = {}, initTestObject) => { } testConnector.syncAll() result.testObjects = result.users.map(initTestObject || (() => null)) - // @ts-ignore - return result + return /** @type {any} */ (result) } /** @@ -282,8 +282,7 @@ export const compare = users => { t.compare(userArrayValues[i], userArrayValues[i + 1]) t.compare(userMapValues[i], userMapValues[i + 1]) t.compare(userXmlValues[i], userXmlValues[i + 1]) - // @ts-ignore - t.compare(userTextValues[i].map(a => a.insert).join('').length, users[i].getText('text').length) + t.compare(userTextValues[i].map(/** @param {any} a */ a => a.insert).join('').length, users[i].getText('text').length) t.compare(userTextValues[i], userTextValues[i + 1]) t.compare(getStateVector(users[i].store), getStateVector(users[i + 1].store)) compareDS(createDeleteSetFromStructStore(users[i].store), createDeleteSetFromStructStore(users[i + 1].store)) @@ -293,8 +292,8 @@ export const compare = users => { } /** - * @param {AbstractItem?} a - * @param {AbstractItem?} b + * @param {Item?} a + * @param {Item?} b * @return {boolean} */ export const compareItemIDs = (a, b) => a === b || (a !== null && b != null && Y.compareIDs(a.id, b.id)) @@ -306,11 +305,10 @@ export const compareItemIDs = (a, b) => a === b || (a !== null && b != null && Y export const compareStructStores = (ss1, ss2) => { t.assert(ss1.clients.size === ss2.clients.size) for (const [client, structs1] of ss1.clients) { - const structs2 = ss2.clients.get(client) + const structs2 = /** @type {Array} */ (ss2.clients.get(client)) t.assert(structs2 !== undefined && structs1.length === structs2.length) for (let i = 0; i < structs1.length; i++) { const s1 = structs1[i] - // @ts-ignore const s2 = structs2[i] // checks for abstract struct if ( @@ -321,9 +319,9 @@ export const compareStructStores = (ss1, ss2) => { ) { t.fail('Structs dont match') } - if (s1 instanceof AbstractItem) { + if (s1 instanceof Item) { if ( - !(s2 instanceof AbstractItem) || + !(s2 instanceof Item) || !((s1.left === null && s2.left === null) || (s1.left !== null && s2.left !== null && Y.compareIDs(s1.left.lastId, s2.left.lastId))) || !compareItemIDs(s1.right, s2.right) || !Y.compareIDs(s1.origin, s2.origin) || @@ -349,11 +347,10 @@ export const compareStructStores = (ss1, ss2) => { export const compareDS = (ds1, ds2) => { t.assert(ds1.clients.size === ds2.clients.size) for (const [client, deleteItems1] of ds1.clients) { - const deleteItems2 = ds2.clients.get(client) + const deleteItems2 = /** @type {Array} */ (ds2.clients.get(client)) t.assert(deleteItems2 !== undefined && deleteItems1.length === deleteItems2.length) for (let i = 0; i < deleteItems1.length; i++) { const di1 = deleteItems1[i] - // @ts-ignore const di2 = deleteItems2[i] if (di1.clock !== di2.clock || di1.len !== di2.len) { t.fail('DeleteSets dont match') diff --git a/tests/y-array.tests.js b/tests/y-array.tests.js index 0b68532c..16321f0d 100644 --- a/tests/y-array.tests.js +++ b/tests/y-array.tests.js @@ -1,4 +1,4 @@ -import { init, compare, applyRandomTests, TestYInstance } from './testHelper.js' // eslint-disable-line +import { init, compare, applyRandomTests, Doc } from './testHelper.js' // eslint-disable-line import * as Y from '../src/index.js' import * as t from 'lib0/testing.js' @@ -282,7 +282,7 @@ let _uniqueNumber = 0 const getUniqueNumber = () => _uniqueNumber++ /** - * @type {Array} + * @type {Array} */ const arrayTransactions = [ function insert (user, gen) { diff --git a/tests/y-map.tests.js b/tests/y-map.tests.js index 8d5bec82..c47c9e46 100644 --- a/tests/y-map.tests.js +++ b/tests/y-map.tests.js @@ -1,4 +1,4 @@ -import { init, compare, applyRandomTests, TestYInstance } from './testHelper.js' // eslint-disable-line +import { init, compare, applyRandomTests, Doc } from './testHelper.js' // eslint-disable-line import { compareIDs @@ -328,7 +328,7 @@ export const testYmapEventHasCorrectValueWhenSettingAPrimitiveFromOtherUser = tc } /** - * @type {Array} + * @type {Array} */ const mapTransactions = [ function set (user, gen) { diff --git a/tests/y-text.tests.js b/tests/y-text.tests.js index efdbfd6e..2e860a79 100644 --- a/tests/y-text.tests.js +++ b/tests/y-text.tests.js @@ -63,7 +63,7 @@ export const testBasicFormat = tc => { t.compare(text0.toDelta(), [{ insert: 'zb', attributes: { bold: true } }]) t.compare(delta, [{ insert: 'z', attributes: { bold: true } }]) // @ts-ignore - t.assert(text0._start.right.right.right.string === 'b', 'Does not insert duplicate attribute marker') + t.assert(text0._start.right.right.right.content.str === 'b', 'Does not insert duplicate attribute marker') text0.insert(0, 'y') t.assert(text0.toString() === 'yzb') t.compare(text0.toDelta(), [{ insert: 'y' }, { insert: 'zb', attributes: { bold: true } }]) @@ -79,11 +79,11 @@ export const testBasicFormat = tc => { * @param {t.TestCase} tc */ export const testGetDeltaWithEmbeds = tc => { - const { users, text0 } = init(tc, { users: 1 }) + const { text0 } = init(tc, { users: 1 }) text0.applyDelta([{ - insert: {linebreak: "s"} + insert: {linebreak: 's'} }]) t.compare(text0.toDelta(), [{ - insert: {linebreak: "s"} + insert: {linebreak: 's'} }]) } diff --git a/tsconfig.json b/tsconfig.json index ab9813e6..45859200 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -36,8 +36,10 @@ /* Module Resolution Options */ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + "paths": { + "yjs": ["./src/index.js"] + }, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */