diff --git a/examples/html-editor/index.html b/examples/html-editor/index.html index 8f44fda5..759cbdf4 100644 --- a/examples/html-editor/index.html +++ b/examples/html-editor/index.html @@ -1,9 +1,7 @@ - - - + diff --git a/examples/html-editor/index.js b/examples/html-editor/index.js deleted file mode 100644 index a13010a4..00000000 --- a/examples/html-editor/index.js +++ /dev/null @@ -1,29 +0,0 @@ -/* global Y */ - -window.onload = function () { - window.domBinding = new Y.DomBinding(window.yXmlType, document.body, { scrollingElement: document.scrollingElement }) -} - -let y = new Y('htmleditor', { - connector: { - name: 'websockets-client', - url: 'http://127.0.0.1:1234' - } -}) - -window.y = y -window.yXmlType = y.define('xml', Y.XmlFragment) -window.undoManager = new Y.utils.UndoManager(window.yXmlType, { - captureTimeout: 500 -}) - -document.onkeydown = function interceptUndoRedo (e) { - if (e.keyCode === 90 && (e.metaKey || e.ctrlKey)) { - if (!e.shiftKey) { - window.undoManager.undo() - } else { - window.undoManager.redo() - } - e.preventDefault() - } -} diff --git a/examples/html-editor/index.mjs b/examples/html-editor/index.mjs new file mode 100644 index 00000000..34642bd5 --- /dev/null +++ b/examples/html-editor/index.mjs @@ -0,0 +1,31 @@ + +import YWebsocketsConnector from '../../src/Connectors/WebsocketsConnector/WebsocketsConnector.mjs' +import Y from '../../src/Y.mjs' +import DomBinding from '../../src/Bindings/DomBinding/DomBinding.mjs' +import UndoManager from '../../src/Util/UndoManager.mjs' +import XmlFragment from '../../src/Types/YXml/YXmlFragment.mjs' + +const connector = new YWebsocketsConnector() +const y = new Y('html-editor') +connector.connectY('html-editor', y) + +window.onload = function () { + window.domBinding = new DomBinding(window.yXmlType, document.body, { scrollingElement: document.scrollingElement }) +} + +window.y = y +window.yXmlType = y.define('xml', XmlFragment) +window.undoManager = new UndoManager(window.yXmlType, { + captureTimeout: 500 +}) + +document.onkeydown = function interceptUndoRedo (e) { + if (e.keyCode === 90 && (e.metaKey || e.ctrlKey)) { + if (!e.shiftKey) { + window.undoManager.undo() + } else { + window.undoManager.redo() + } + e.preventDefault() + } +} diff --git a/examples/yjs-dist.mjs b/examples/yjs-dist.mjs index 885080bf..dd5671b3 100644 --- a/examples/yjs-dist.mjs +++ b/examples/yjs-dist.mjs @@ -1,7 +1,7 @@ -import Y from '../src/Y.js' -import yWebsocketsClient from '../../y-websockets-client/src/y-websockets-client.js' -import extendYIndexedDBPersistence from '../../y-indexeddb/src/y-indexeddb.js' +import Y from '../src/Y..mjs' +import yWebsocketsClient from '../../y-websockets-client/src/y-websockets-client.mjs' +import extendYIndexedDBPersistence from '../../y-indexeddb/src/y-indexeddb.mjs' Y.extend(yWebsocketsClient) extendYIndexedDBPersistence(Y) diff --git a/package-lock.json b/package-lock.json index a8c6dfc6..71577291 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,19 +76,21 @@ } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "align-text": { @@ -103,9 +105,9 @@ } }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -146,9 +148,9 @@ "dev": true }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "1.0.3" @@ -181,6 +183,16 @@ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0" + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -202,22 +214,18 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, - "array.prototype.find": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", - "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.7.0" - } - }, "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 + }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -1047,6 +1055,12 @@ } } }, + "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==", + "dev": true + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1136,6 +1150,12 @@ "integrity": "sha1-A1ALBK2U53jdKJGwnsc6ath7GZY=", "dev": true }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", @@ -1178,24 +1198,24 @@ } }, "circular-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", - "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "2.0.0" } }, "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "cliui": { @@ -1221,18 +1241,33 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "codemirror": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.37.0.tgz", + "integrity": "sha512-dQaayDJCLU4UJcwg2RM44oFrs0dMNndTp6qxQJF6XI71l1xN3RB4IqiKES0b0rccbARbrD/UBB4t8DNknfaOTw==", "dev": true }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, "color-logger": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/color-logger/-/color-logger-0.0.3.tgz", "integrity": "sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg=", "dev": true }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -1258,11 +1293,12 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "1.0.0", "inherits": "2.0.3", "readable-stream": "2.3.3", "typedarray": "0.0.6" @@ -1405,6 +1441,17 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.2.14" + } + }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -1481,15 +1528,6 @@ "stacktrace-js": "2.0.0" } }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.23" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1557,9 +1595,9 @@ "requires": { "find-root": "1.1.0", "glob": "7.1.2", - "ignore": "3.3.3", + "ignore": "3.3.8", "pkg-config": "1.1.1", - "run-parallel": "1.1.6", + "run-parallel": "1.1.9", "uniq": "1.0.1" } }, @@ -1571,11 +1609,11 @@ "requires": { "globby": "5.0.0", "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", "object-assign": "4.1.1", "pify": "2.3.0", "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" + "rimraf": "2.6.2" } }, "delayed-stream": { @@ -1606,13 +1644,12 @@ } }, "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "2.0.2" } }, "dom-serializer": { @@ -1686,6 +1723,15 @@ "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", "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.23" + } + }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -1711,13 +1757,14 @@ } }, "es-abstract": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", - "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", "dev": true, "requires": { "es-to-primitive": "1.1.1", - "function-bind": "1.1.0", + "function-bind": "1.1.1", + "has": "1.0.1", "is-callable": "1.1.3", "is-regex": "1.0.4" } @@ -1733,76 +1780,6 @@ "is-symbol": "1.0.1" } }, - "es5-ext": { - "version": "0.10.23", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.23.tgz", - "integrity": "sha1-dXi1G+l0IHpUh4IbVlOMIk5Oezg=", - "dev": true, - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.23", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.23", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.23", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.23" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.23", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1838,18 +1815,6 @@ } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, "esdoc": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/esdoc/-/esdoc-1.0.4.tgz", @@ -2104,86 +2069,163 @@ "dev": true }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz", + "integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==", "dev": true, "requires": { + "ajv": "5.5.2", "babel-code-frame": "6.22.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.8", - "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.4.3", - "esquery": "1.0.0", - "estraverse": "4.2.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", "esutils": "2.0.2", "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", + "globals": "11.5.0", + "ignore": "3.3.8", "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.8.4", - "json-stable-stringify": "1.0.1", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.11.0", + "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.4", + "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", + "pluralize": "7.0.0", + "progress": "2.0.0", "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", + "semver": "5.3.0", + "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "table": "4.0.2", + "text-table": "0.2.0" }, "dependencies": { - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "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": { - "os-homedir": "1.0.2" + "color-convert": "1.9.1" + } + }, + "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.4.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true + }, + "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" } } } }, "eslint-config-standard": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", - "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", + "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==", "dev": true }, "eslint-config-standard-jsx": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.1.tgz", - "integrity": "sha1-zU5GPQJo4tnnB/YfQvc/WzMzxkI=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz", + "integrity": "sha512-rLToPAEqLMPBfWnYTu6xRhm2OWziS2n40QFqJ8jAM8NSVzeVKTa3nclhsU4DpPJQRY60F34Oo1wi/71PN/eITg==", "dev": true }, "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "debug": "2.6.8", - "object-assign": "4.1.1", - "resolve": "1.3.3" + "debug": "2.6.9", + "resolve": "1.7.1" + }, + "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.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "dev": true, "requires": { "debug": "2.6.8", @@ -2191,21 +2233,21 @@ } }, "eslint-plugin-import": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz", + "integrity": "sha1-JgAu+/ylmJtyiKwEdQi9JPIXsWk=", "dev": true, "requires": { "builtin-modules": "1.1.1", "contains-path": "0.1.0", "debug": "2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.2.3", - "eslint-module-utils": "2.1.1", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.2.0", "has": "1.0.1", - "lodash.cond": "4.5.2", + "lodash": "4.17.4", "minimatch": "3.0.4", - "pkg-up": "1.0.0" + "read-pkg-up": "2.0.0" }, "dependencies": { "doctrine": { @@ -2217,51 +2259,84 @@ "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.3.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.4.0", + "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.1.0", + "read-pkg": "2.0.0" + } } } }, "eslint-plugin-node": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-4.2.2.tgz", - "integrity": "sha1-gpWcqa7Xn8vSi7GxiNBcrAT7M2M=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", + "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==", "dev": true, "requires": { - "ignore": "3.3.3", + "ignore": "3.3.8", "minimatch": "3.0.4", - "object-assign": "4.1.1", "resolve": "1.3.3", - "semver": "5.3.0" + "semver": "5.5.0" + }, + "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": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", - "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", + "integrity": "sha512-2WO+ZFh7vxUKRfR0cOIMrWgYKdR6S1AlOezw6pC52B6oYpd5WFghN+QHxvrRdZMtbo8h3dfUZ2o1rWb0UPbKtg==", "dev": true }, "eslint-plugin-react": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", - "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", + "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", "dev": true, "requires": { - "array.prototype.find": "2.0.4", - "doctrine": "1.5.0", + "doctrine": "2.1.0", "has": "1.0.1", - "jsx-ast-utils": "1.4.1", - "object.assign": "4.0.4" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - } + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.1" } }, "eslint-plugin-standard": { @@ -2270,20 +2345,36 @@ "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", "dev": true }, - "espree": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", - "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "acorn": "5.0.3", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "5.5.3", "acorn-jsx": "3.0.1" }, "dependencies": { "acorn": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", - "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", "dev": true } } @@ -2292,25 +2383,25 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true + "dev": true, + "optional": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { "estraverse": "4.2.0" } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "4.2.0" } }, "estraverse": { @@ -2331,28 +2422,12 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.23" - } - }, "eventemitter3": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=", "dev": true }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -2395,6 +2470,17 @@ "is-extendable": "0.1.1" } }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2420,8 +2506,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true, - "optional": true + "dev": true }, "fast-diff": { "version": "1.1.2", @@ -2433,8 +2518,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true, - "optional": true + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -2451,14 +2535,36 @@ "websocket-driver": "0.6.5" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.18" + }, + "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", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" } }, "file-entry-cache": { @@ -2467,7 +2573,7 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.2.2", + "flat-cache": "1.3.0", "object-assign": "4.1.1" } }, @@ -2537,12 +2643,12 @@ } }, "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.1", + "circular-json": "0.3.3", "del": "2.2.2", "graceful-fs": "4.1.11", "write": "0.2.1" @@ -3528,30 +3634,21 @@ } }, "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, "getpass": { @@ -3690,7 +3787,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.0" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -3891,10 +3988,19 @@ } } }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "imurmurhash": { @@ -3935,32 +4041,79 @@ "dev": true }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.1.0", - "figures": "1.7.0", + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", "through": "2.3.8" + }, + "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.1" + } + }, + "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.4.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" + } + } } }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, "invariant": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", @@ -4049,13 +4202,10 @@ } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-glob": { "version": "2.0.1", @@ -4072,18 +4222,6 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, - "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -4100,18 +4238,18 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "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": "1.0.1" } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "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.2" @@ -4129,10 +4267,10 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-regex": { @@ -4145,13 +4283,16 @@ } }, "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "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", @@ -4211,6 +4352,16 @@ "isarray": "1.0.0" } }, + "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.7.3", + "whatwg-fetch": "2.0.4" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -4225,13 +4376,21 @@ "dev": true }, "js-yaml": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", - "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "3.1.3" + "argparse": "1.0.10", + "esprima": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + } } }, "jsbn": { @@ -4280,6 +4439,12 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4291,17 +4456,13 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true, - "optional": true + "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -4325,18 +4486,6 @@ "graceful-fs": "4.1.11" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4351,10 +4500,13 @@ } }, "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "3.0.3" + } }, "kind-of": { "version": "3.2.2", @@ -4582,12 +4734,6 @@ "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", "dev": true }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -4673,6 +4819,16 @@ "signal-exit": "3.0.2" } }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, "magic-string": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.19.1.tgz", @@ -4779,6 +4935,12 @@ "mime-db": "1.27.0" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4823,9 +4985,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "nan": { @@ -4847,6 +5009,16 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "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.12", + "is-stream": "1.1.0" + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -4909,17 +5081,6 @@ "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, - "object.assign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", - "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.0", - "object-keys": "1.0.11" - } - }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -4955,10 +5116,13 @@ } }, "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } }, "optionator": { "version": "0.8.2", @@ -5006,10 +5170,13 @@ } }, "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true + "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==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } }, "p-locate": { "version": "2.0.0", @@ -5017,9 +5184,15 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "1.2.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "parchment": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.3.tgz", @@ -5142,13 +5315,13 @@ } }, "pkg-conf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", - "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", "dev": true, "requires": { "find-up": "2.1.0", - "load-json-file": "2.0.0" + "load-json-file": "4.0.0" }, "dependencies": { "find-up": { @@ -5159,6 +5332,34 @@ "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.11", + "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.2" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, @@ -5182,19 +5383,10 @@ "find-up": "1.1.2" } }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "prelude-ls": { @@ -5222,9 +5414,35 @@ "dev": true }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "2.0.6" + } + }, + "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" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "punycode": { @@ -5400,26 +5618,6 @@ "set-immediate-shim": "1.0.1" } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.3.3" - } - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -5616,13 +5814,13 @@ "dev": true }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, "right-align": { @@ -5635,9 +5833,9 @@ } }, "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "7.1.2" @@ -5778,18 +5976,18 @@ } }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "once": "1.4.0" + "is-promise": "2.1.0" } }, "run-parallel": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.6.tgz", - "integrity": "sha1-KQA8miFj4B4tLfyQV18sbB1hoDk=", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, "rx": { @@ -5799,17 +5997,32 @@ "dev": true }, "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -5853,23 +6066,33 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "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.0.3", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", "dev": true }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.0.3", - "rechoir": "0.6.2" + "shebang-regex": "1.0.0" } }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -5883,10 +6106,13 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } }, "sntp": { "version": "2.1.0", @@ -6009,32 +6235,32 @@ } }, "standard": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/standard/-/standard-10.0.2.tgz", - "integrity": "sha1-l0wcU8yGWwdaS1dueEQeFpXar3s=", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-11.0.1.tgz", + "integrity": "sha512-nu0jAcHiSc8H+gJCXeiziMVZNDYi8MuqrYJKxTgjP4xKXZMKm311boqQIzDrYI/ktosltxt2CbDjYQs9ANC8IA==", "dev": true, "requires": { - "eslint": "3.19.0", - "eslint-config-standard": "10.2.1", - "eslint-config-standard-jsx": "4.0.1", - "eslint-plugin-import": "2.2.0", - "eslint-plugin-node": "4.2.2", - "eslint-plugin-promise": "3.5.0", - "eslint-plugin-react": "6.10.3", + "eslint": "4.18.2", + "eslint-config-standard": "11.0.0", + "eslint-config-standard-jsx": "5.0.0", + "eslint-plugin-import": "2.9.0", + "eslint-plugin-node": "6.0.1", + "eslint-plugin-promise": "3.7.0", + "eslint-plugin-react": "7.7.0", "eslint-plugin-standard": "3.0.1", - "standard-engine": "7.0.0" + "standard-engine": "8.0.1" } }, "standard-engine": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz", - "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-8.0.1.tgz", + "integrity": "sha512-LA531C3+nljom/XRvdW/hGPXwmilRkaRkENhO3FAGF1Vtq/WtCXzgmnc5S6vUHHsgv534MRy02C1ikMwZXC+tw==", "dev": true, "requires": { "deglob": "2.1.0", - "get-stdin": "5.0.1", + "get-stdin": "6.0.0", "minimist": "1.2.0", - "pkg-conf": "2.0.0" + "pkg-conf": "2.1.0" }, "dependencies": { "minimist": { @@ -6061,14 +6287,30 @@ } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.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 + }, + "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": { @@ -6139,48 +6381,52 @@ "optional": true }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.4.1", "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.1.0" + "slice-ansi": "1.0.0", + "string-width": "2.1.1" }, "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 - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", - "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", + "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": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "color-convert": "1.9.1" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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-regex": "3.0.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.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" } } } @@ -6221,6 +6467,15 @@ "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", "dev": true }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -6270,12 +6525,6 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6308,6 +6557,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "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 + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -6368,6 +6623,12 @@ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true }, + "uws": { + "version": "10.148.0", + "resolved": "https://registry.npmjs.org/uws/-/uws-10.148.0.tgz", + "integrity": "sha512-aJpFgMMyxubiE/ll4nj9nWoQbv0HzZZDWXfwyu78nuFObX0Zoyv3TWjkqKPQ1vb2sMPZoz67tri7QNE6dybNmQ==", + "dev": true + }, "v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", @@ -6433,6 +6694,12 @@ "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", "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 + }, "whatwg-url-compat": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", @@ -6492,6 +6759,12 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", diff --git a/package.json b/package.json index cfa10fe4..004c5c64 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "test": "npm run lint", "debug": "concurrently 'rollup -wc rollup.test.js' 'cutest-serve y.test.js -o'", - "lint": "standard", + "lint": "standard src/**/*.mjs test/**/*.mjs tests-lib/**/*.mjs", "docs": "esdoc", "serve-docs": "npm run docs && serve ./docs/", "dist": "rollup -c rollup.browser.js; rollup -c rollup.node.js", @@ -55,6 +55,7 @@ "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-latest": "^6.24.1", "chance": "^1.0.9", + "codemirror": "^5.37.0", "concurrently": "^3.4.0", "cutest": "^0.1.9", "esdoc": "^1.0.4", @@ -70,7 +71,8 @@ "rollup-plugin-uglify": "^1.0.2", "rollup-regenerator-runtime": "^6.23.1", "rollup-watch": "^3.2.2", - "standard": "^10.0.2", - "tag-dist-files": "^0.1.6" + "standard": "^11.0.1", + "tag-dist-files": "^0.1.6", + "uws": "^10.148.0" } } diff --git a/rollup.browser.js b/rollup.browser.js index d5f6c137..5b66b6e1 100644 --- a/rollup.browser.js +++ b/rollup.browser.js @@ -5,7 +5,7 @@ import commonjs from 'rollup-plugin-commonjs' var pkg = require('./package.json') export default { - input: 'src/Y.dist.js', + input: 'src/Y.dist.mjs', name: 'Y', sourcemap: true, output: { diff --git a/rollup.node.js b/rollup.node.js index d80070a0..7207774a 100644 --- a/rollup.node.js +++ b/rollup.node.js @@ -3,7 +3,7 @@ import commonjs from 'rollup-plugin-commonjs' var pkg = require('./package.json') export default { - input: 'src/Y.dist.js', + input: 'src/Y.dist.mjs', nameame: 'Y', sourcemap: true, output: { diff --git a/rollup.test.js b/rollup.test.js index f4072276..8d96335a 100644 --- a/rollup.test.js +++ b/rollup.test.js @@ -3,7 +3,7 @@ import commonjs from 'rollup-plugin-commonjs' import multiEntry from 'rollup-plugin-multi-entry' export default { - input: 'test/index.js', + input: 'test/index.mjs', name: 'y-tests', sourcemap: true, output: { diff --git a/src/Bindings/Binding.js b/src/Bindings/Binding.mjs similarity index 94% rename from src/Bindings/Binding.js rename to src/Bindings/Binding.mjs index 195550b0..046930db 100644 --- a/src/Bindings/Binding.js +++ b/src/Bindings/Binding.mjs @@ -1,5 +1,5 @@ -import { createMutualExclude } from '../Util/mutualExclude.js' +import { createMutualExclude } from '../Util/mutualExclude.mjs' /** * Abstract class for bindings. diff --git a/src/Bindings/TextareaBinding/TextareaBinding.js b/src/Bindings/CodeMirrorBinding/CodeMirrorBinding.mjs similarity index 93% rename from src/Bindings/TextareaBinding/TextareaBinding.js rename to src/Bindings/CodeMirrorBinding/CodeMirrorBinding.mjs index e02edafe..142cd7b5 100644 --- a/src/Bindings/TextareaBinding/TextareaBinding.js +++ b/src/Bindings/CodeMirrorBinding/CodeMirrorBinding.mjs @@ -1,7 +1,7 @@ -import Binding from '../Binding.js' -import simpleDiff from '../../Util/simpleDiff.js' -import { getRelativePosition, fromRelativePosition } from '../../Util/relativePosition.js' +import Binding from '../Binding.mjs' +import simpleDiff from '../../Util/simpleDiff.mjs' +import { getRelativePosition, fromRelativePosition } from '../../Util/relativePosition.mjs' function typeObserver () { this._mutualExclude(() => { diff --git a/src/Bindings/DomBinding/DomBinding.js b/src/Bindings/DomBinding/DomBinding.mjs similarity index 94% rename from src/Bindings/DomBinding/DomBinding.js rename to src/Bindings/DomBinding/DomBinding.mjs index b3ecb625..42643111 100644 --- a/src/Bindings/DomBinding/DomBinding.js +++ b/src/Bindings/DomBinding/DomBinding.mjs @@ -1,11 +1,11 @@ /* global MutationObserver */ -import Binding from '../Binding.js' -import { createAssociation, removeAssociation } from './util.js' -import { beforeTransactionSelectionFixer, afterTransactionSelectionFixer } from './selection.js' -import { defaultFilter, applyFilterOnType } from './filter.js' -import typeObserver from './typeObserver.js' -import domObserver from './domObserver.js' +import Binding from '../Binding.mjs' +import { createAssociation, removeAssociation } from './util.mjs' +import { beforeTransactionSelectionFixer, afterTransactionSelectionFixer } from './selection.mjs' +import { defaultFilter, applyFilterOnType } from './filter.mjs' +import typeObserver from './typeObserver.mjs' +import domObserver from './domObserver.mjs' /** * A binding that binds the children of a YXmlFragment to a DOM element. diff --git a/src/Bindings/DomBinding/domObserver.js b/src/Bindings/DomBinding/domObserver.mjs similarity index 96% rename from src/Bindings/DomBinding/domObserver.js rename to src/Bindings/DomBinding/domObserver.mjs index 0dfb176e..201295cd 100644 --- a/src/Bindings/DomBinding/domObserver.js +++ b/src/Bindings/DomBinding/domObserver.mjs @@ -1,11 +1,11 @@ -import YXmlHook from '../../Types/YXml/YXmlHook.js' +import YXmlHook from '../../Types/YXml/YXmlHook.mjs' import { iterateUntilUndeleted, removeAssociation, - insertNodeHelper } from './util.js' -import diff from '../../Util/simpleDiff.js' -import YXmlFragment from '../../Types/YXml/YXmlFragment.js' + insertNodeHelper } from './util.mjs' +import diff from '../../Util/simpleDiff.mjs' +import YXmlFragment from '../../Types/YXml/YXmlFragment.mjs' /** * 1. Check if any of the nodes was deleted diff --git a/src/Bindings/DomBinding/domToType.js b/src/Bindings/DomBinding/domToType.mjs similarity index 86% rename from src/Bindings/DomBinding/domToType.js rename to src/Bindings/DomBinding/domToType.mjs index c1d81d2a..a6a9aa90 100644 --- a/src/Bindings/DomBinding/domToType.js +++ b/src/Bindings/DomBinding/domToType.mjs @@ -1,9 +1,9 @@ -import YXmlText from '../../Types/YXml/YXmlText.js' -import YXmlHook from '../../Types/YXml/YXmlHook.js' -import YXmlElement from '../../Types/YXml/YXmlElement.js' -import { createAssociation, domsToTypes } from './util.js' -import { filterDomAttributes, defaultFilter } from './filter.js' +import YXmlText from '../../Types/YXml/YXmlText.mjs' +import YXmlHook from '../../Types/YXml/YXmlHook.mjs' +import YXmlElement from '../../Types/YXml/YXmlElement.mjs' +import { createAssociation, domsToTypes } from './util.mjs' +import { filterDomAttributes, defaultFilter } from './filter.mjs' /** * Creates a Yjs type (YXml) based on the contents of a DOM Element. diff --git a/src/Bindings/DomBinding/filter.js b/src/Bindings/DomBinding/filter.mjs similarity index 97% rename from src/Bindings/DomBinding/filter.js rename to src/Bindings/DomBinding/filter.mjs index 08c208e7..82f6b6df 100644 --- a/src/Bindings/DomBinding/filter.js +++ b/src/Bindings/DomBinding/filter.mjs @@ -1,4 +1,4 @@ -import isParentOf from '../../Util/isParentOf.js' +import isParentOf from '../../Util/isParentOf.mjs' /** * Default filter method (does nothing). diff --git a/src/Bindings/DomBinding/selection.js b/src/Bindings/DomBinding/selection.mjs similarity index 98% rename from src/Bindings/DomBinding/selection.js rename to src/Bindings/DomBinding/selection.mjs index 366a1db9..59779ab1 100644 --- a/src/Bindings/DomBinding/selection.js +++ b/src/Bindings/DomBinding/selection.mjs @@ -1,6 +1,6 @@ /* globals getSelection */ -import { getRelativePosition, fromRelativePosition } from '../../Util/relativePosition.js' +import { getRelativePosition, fromRelativePosition } from '../../Util/relativePosition.mjs' let browserSelection = null let relativeSelection = null diff --git a/src/Bindings/DomBinding/typeObserver.js b/src/Bindings/DomBinding/typeObserver.mjs similarity index 95% rename from src/Bindings/DomBinding/typeObserver.js rename to src/Bindings/DomBinding/typeObserver.mjs index 762af70d..ade00be2 100644 --- a/src/Bindings/DomBinding/typeObserver.js +++ b/src/Bindings/DomBinding/typeObserver.mjs @@ -1,8 +1,8 @@ /* global getSelection */ -import YXmlText from '../../Types/YXml/YXmlText.js' -import YXmlHook from '../../Types/YXml/YXmlHook.js' -import { removeDomChildrenUntilElementFound } from './util.js' +import YXmlText from '../../Types/YXml/YXmlText.mjs' +import YXmlHook from '../../Types/YXml/YXmlHook.mjs' +import { removeDomChildrenUntilElementFound } from './util.mjs' function findScrollReference (scrollingElement) { if (scrollingElement !== null) { diff --git a/src/Bindings/DomBinding/util.js b/src/Bindings/DomBinding/util.mjs similarity index 98% rename from src/Bindings/DomBinding/util.js rename to src/Bindings/DomBinding/util.mjs index b4f6148d..9b964162 100644 --- a/src/Bindings/DomBinding/util.js +++ b/src/Bindings/DomBinding/util.mjs @@ -1,5 +1,5 @@ -import domToType from './domToType.js' +import domToType from './domToType.mjs' /** * Iterates items until an undeleted item is found. diff --git a/src/Bindings/QuillBinding/QuillBinding.js b/src/Bindings/QuillBinding/QuillBinding.mjs similarity index 97% rename from src/Bindings/QuillBinding/QuillBinding.js rename to src/Bindings/QuillBinding/QuillBinding.mjs index 02995ec9..391be5b8 100644 --- a/src/Bindings/QuillBinding/QuillBinding.js +++ b/src/Bindings/QuillBinding/QuillBinding.mjs @@ -1,4 +1,4 @@ -import Binding from '../Binding.js' +import Binding from '../Binding.mjs' function typeObserver (event) { const quill = this.target diff --git a/src/Bindings/TextareaBinding/TextareaBinding.mjs b/src/Bindings/TextareaBinding/TextareaBinding.mjs new file mode 100644 index 00000000..142cd7b5 --- /dev/null +++ b/src/Bindings/TextareaBinding/TextareaBinding.mjs @@ -0,0 +1,56 @@ + +import Binding from '../Binding.mjs' +import simpleDiff from '../../Util/simpleDiff.mjs' +import { getRelativePosition, fromRelativePosition } from '../../Util/relativePosition.mjs' + +function typeObserver () { + this._mutualExclude(() => { + const textarea = this.target + const textType = this.type + const relativeStart = getRelativePosition(textType, textarea.selectionStart) + const relativeEnd = getRelativePosition(textType, textarea.selectionEnd) + textarea.value = textType.toString() + const start = fromRelativePosition(textType._y, relativeStart) + const end = fromRelativePosition(textType._y, relativeEnd) + textarea.setSelectionRange(start, end) + }) +} + +function domObserver () { + this._mutualExclude(() => { + let diff = simpleDiff(this.type.toString(), this.target.value) + this.type.delete(diff.pos, diff.remove) + this.type.insert(diff.pos, diff.insert) + }) +} + +/** + * A binding that binds a YText to a dom textarea. + * + * This binding is automatically destroyed when its parent is deleted. + * + * @example + * const textare = document.createElement('textarea') + * const type = y.define('textarea', Y.Text) + * const binding = new Y.QuillBinding(type, textarea) + * + */ +export default class TextareaBinding extends Binding { + constructor (textType, domTextarea) { + // Binding handles textType as this.type and domTextarea as this.target + super(textType, domTextarea) + // set initial value + domTextarea.value = textType.toString() + // Observers are handled by this class + this._typeObserver = typeObserver.bind(this) + this._domObserver = domObserver.bind(this) + textType.observe(this._typeObserver) + domTextarea.addEventListener('input', this._domObserver) + } + destroy () { + // Remove everything that is handled by this class + this.type.unobserve(this._typeObserver) + this.target.unobserve(this._domObserver) + super.destroy() + } +} diff --git a/src/Connector.js b/src/Connector.mjs similarity index 97% rename from src/Connector.js rename to src/Connector.mjs index 654a2e9f..ea4eca91 100644 --- a/src/Connector.js +++ b/src/Connector.mjs @@ -1,9 +1,9 @@ -import BinaryEncoder from './Util/Binary/Encoder.js' -import BinaryDecoder from './Util/Binary/Decoder.js' +import BinaryEncoder from './Util/Binary/Encoder.mjs' +import BinaryDecoder from './Util/Binary/Decoder.mjs' -import { sendSyncStep1, readSyncStep1 } from './MessageHandler/syncStep1.js' -import { readSyncStep2 } from './MessageHandler/syncStep2.js' -import { integrateRemoteStructs } from './MessageHandler/integrateRemoteStructs.js' +import { sendSyncStep1, readSyncStep1 } from './MessageHandler/syncStep1.mjs' +import { readSyncStep2 } from './MessageHandler/syncStep2.mjs' +import { integrateRemoteStructs } from './MessageHandler/integrateRemoteStructs.mjs' import debug from 'debug' diff --git a/src/Connectors/WebsocketsConnector/WebsocketsConnector.mjs b/src/Connectors/WebsocketsConnector/WebsocketsConnector.mjs new file mode 100644 index 00000000..f44353e2 --- /dev/null +++ b/src/Connectors/WebsocketsConnector/WebsocketsConnector.mjs @@ -0,0 +1,114 @@ +import BinaryEncoder from '../../Util/Binary/Encoder.mjs' +/* global WebSocket */ +import NamedEventHandler from '../../Util/NamedEventHandler.mjs' +import decodeMessage, { messageSS, messageSubscribe, messageStructs, messageGetSS } from './decodeMessage.mjs' +import { createMutualExclude } from '../../Util/mutualExclude.mjs' + +export const STATE_CONNECTING = 0 +export const STATE_SYNCING = 1 +export const STATE_SYNCED = 2 +export const STATE_DISCONNECTED = 3 + +export default class WebsocketsConnector extends NamedEventHandler { + constructor (url = 'ws://localhost:1234') { + super() + this.url = url + this._state = STATE_DISCONNECTED + this._socket = null + this._rooms = new Map() + this._connectToServer = true + this._reconnectTimeout = 300 + this._mutualExclude = createMutualExclude() + this.connect() + } + + getRoom (roomName) { + return this._rooms.get(roomName) + } + + connectY (roomName, y) { + let room = this._rooms.get(roomName) + if (room !== undefined) { + throw new Error('Room is already taken! There can be only one Yjs instance per roomName!') + } + this._rooms.set(roomName, { + roomName, + y + }) + y.on('afterTransaction', (y, transaction) => { + this._mutualExclude(() => { + if (transaction.encodedStructsLen > 0) { + const encoder = new BinaryEncoder() + messageStructs(roomName, y, encoder, transaction.encodedStructs) + this.send(encoder) + } + }) + }) + } + + _setState (state) { + this.emit('stateChanged', { + state + }) + this._state = state + } + + get state () { + return this._state + } + + _onOpen () { + const encoder = new BinaryEncoder() + for (const [roomName, room] of this._rooms) { + const y = room.y + messageGetSS(roomName, y, encoder) + messageSS(roomName, y, encoder) + messageSubscribe(roomName, y, encoder) + } + this.send(encoder) + } + + send (encoder) { + if (encoder.length > 0) { + this._socket.send(encoder.createBuffer()) + } + } + + _onClose () { + this._socket = null + if (this._connectToServer) { + setTimeout(() => { + if (this._connectToServer) { + this.connect() + } + }, this._reconnectTimeout) + this.connect() + } + } + + _onMessage (message) { + if (message.data.byteLength > 0) { + const reply = decodeMessage(this, message.data, null) + this.send(reply) + } + } + + disconnect (code = 1000, reason = 'Client manually disconnected') { + const socket = this._socket + this._connectToServer = false + socket.close(code, reason) + } + + connect () { + if (this._socket === null) { + const socket = new WebSocket(this.url) + socket.binaryType = 'arraybuffer' + this._socket = socket + this._connectToServer = true + // Connection opened + socket.addEventListener('open', this._onOpen.bind(this)) + socket.addEventListener('close', this._onClose.bind(this)) + socket.addEventListener('message', this._onMessage.bind(this)) + } + } +} diff --git a/src/Connectors/WebsocketsConnector/decodeMessage.mjs b/src/Connectors/WebsocketsConnector/decodeMessage.mjs new file mode 100644 index 00000000..3dc9d4fb --- /dev/null +++ b/src/Connectors/WebsocketsConnector/decodeMessage.mjs @@ -0,0 +1,104 @@ +import BinaryDecoder from '../../Util/Binary/Decoder.mjs' +import BinaryEncoder from '../../Util/Binary/Encoder.mjs' +import { readStateSet, writeStateSet } from '../../MessageHandler/stateSet.mjs' +import { writeStructs } from '../../MessageHandler/syncStep1.mjs' +import { writeDeleteSet, readDeleteSet } from '../../MessageHandler/deleteSet.mjs' +import { integrateRemoteStructs } from '../../MessageHandler/integrateRemoteStructs.mjs' + +const CONTENT_GET_SS = 4 +export function messageGetSS (roomName, y, encoder) { + encoder.writeVarString(roomName) + encoder.writeVarUint(CONTENT_GET_SS) +} + +const CONTENT_SUBSCRIBE = 3 +export function messageSubscribe (roomName, y, encoder) { + encoder.writeVarString(roomName) + encoder.writeVarUint(CONTENT_SUBSCRIBE) +} + +const CONTENT_SS = 0 +/** + * Message the current state set. The other side must respond with CONTENT_STRUCTS_DSS + */ +export function messageSS (roomName, y, encoder) { + encoder.writeVarString(roomName) + encoder.writeVarUint(CONTENT_SS) + writeStateSet(y, encoder) +} + +const CONTENT_STRUCTS_DSS = 2 +export function messageStructsDSS (roomName, y, encoder, ss) { + encoder.writeVarString(roomName) + encoder.writeVarUint(CONTENT_STRUCTS_DSS) + writeStructs(y, encoder, ss) + writeDeleteSet(y, encoder) +} + +const CONTENT_STRUCTS = 5 +export function messageStructs (roomName, y, encoder, structsBinaryEncoder) { + encoder.writeVarString(roomName) + encoder.writeVarUint(CONTENT_STRUCTS) + encoder.writeBinaryEncoder(structsBinaryEncoder) +} + +/** + * Decodes a client-message. + * + * A client-message consists of multiple message-elements that are concatenated without delimiter. + * Each has the following structure: + * - roomName + * - content_type + * - content (additional info that is encoded based on the value of content_type) + * + * The message is encoded until no more message-elements are available. + * + * @param {*} connector The connector that handles the connections + * @param {*} message The binary encoded message + * @param {*} ws The connection object + */ +export default function decodeMessage (connector, message, ws) { + const decoder = new BinaryDecoder(message) + const encoder = new BinaryEncoder() + while (decoder.hasContent()) { + const roomName = decoder.readVarString() + const contentType = decoder.readVarUint() + const room = connector.getRoom(roomName) + const y = room.y + switch (contentType) { + case CONTENT_STRUCTS: + connector._mutualExclude(() => { + y.transact(() => { + integrateRemoteStructs(y, decoder) + }, true) + }) + break + case CONTENT_GET_SS: + messageSS(roomName, y, encoder) + break + case CONTENT_SUBSCRIBE: + room.connections.add(ws) + break + case CONTENT_SS: + // received state set + // reply with missing content + const ss = readStateSet(decoder) + messageStructsDSS(roomName, y, encoder, ss) + break + case CONTENT_STRUCTS_DSS: + connector._mutualExclude(() => { + y.transact(() => { + integrateRemoteStructs(y, decoder) + readDeleteSet(y, decoder) + }, true) + }) + break + default: + console.error('Unexpected content type!') + if (ws !== null) { + ws.close() // TODO: specify reason + } + } + } + return encoder +} diff --git a/src/Connectors/WebsocketsConnector/server.mjs b/src/Connectors/WebsocketsConnector/server.mjs new file mode 100644 index 00000000..0d0b7e4b --- /dev/null +++ b/src/Connectors/WebsocketsConnector/server.mjs @@ -0,0 +1,99 @@ +import Y from '../../Y.mjs' +import uws from 'uws' +import BinaryEncoder from '../../Util/Binary/Encoder.mjs' +import decodeMessage, { messageStructs } from './decodeMessage.mjs' + +const WebsocketsServer = uws.Server + +/** + * Maps from room-name to .. + * { + * connections, // Set of ws-clients that listen to the room + * y // Yjs instance that handles the room + * } + */ +const rooms = new Map() +/** + * Maps from ws-connection to Set - the set of connected roomNames + */ +const connections = new Map() +const wss = new WebsocketsServer({ port: 1234 }) + +/** + * Set of room names that are scheduled to be sweeped (destroyed because they don't have a connection anymore) + */ +const scheduledSweeps = new Set() +setInterval(function sweepRoomes () { + scheduledSweeps.forEach(roomName => { + const room = rooms.get(roomName) + if (room !== undefined) { + if (room.connections.size === 0) { + room.y.destroy() + } + rooms.delete(roomName) + } + }) +}, 5000) + +const wsConnector = { + _mutualExclude: f => { f() }, + subscribe: function subscribe (roomName, ws) { + let roomNames = connections.get(ws) + if (roomNames === undefined) { + roomNames = new Set() + connections.set(ws, roomNames) + } + roomNames.add(roomName) + }, + getRoom: function getRoom (roomName) { + let room = rooms.get(roomName) + if (room === undefined) { + const y = new Y(roomName) + y.on('afterTransaction', (y, transaction) => { + if (transaction.encodedStructsLen > 0) { + const encoder = new BinaryEncoder() + messageStructs(roomName, y, encoder, transaction.encodedStructs) + const message = encoder.createBuffer() + // when changed, broakcast update to all connections + room.connections.forEach(conn => { + conn.send(message) + }) + } + }) + room = { + name: roomName, + connections: new Set(), + y + } + rooms.set(roomName, room) + } + return room + } +} + +wss.on('connection', (ws) => { + ws.on('message', function onWSMessage (message) { + if (message.byteLength > 0) { + const reply = decodeMessage(wsConnector, message, ws) + if (reply.length > 0) { + ws.send(reply.createBuffer()) + } + } + }) + ws.on('close', function onWSClose () { + const roomNames = connections.get(ws) + if (roomNames !== undefined) { + roomNames.forEach(roomName => { + const room = rooms.get(roomName) + if (room !== undefined) { + const connections = room.connections + connections.delete(ws) + if (connections.size === 0) { + scheduledSweeps.add(roomName) + } + } + }) + connections.delete(ws) + } + }) +}) diff --git a/src/MessageHandler/binaryEncode.js b/src/MessageHandler/binaryEncode.mjs similarity index 81% rename from src/MessageHandler/binaryEncode.js rename to src/MessageHandler/binaryEncode.mjs index 27b69baa..edb25e11 100644 --- a/src/MessageHandler/binaryEncode.js +++ b/src/MessageHandler/binaryEncode.mjs @@ -1,8 +1,8 @@ -import { writeStructs } from './syncStep1.js' -import { integrateRemoteStructs } from './integrateRemoteStructs.js' -import { readDeleteSet, writeDeleteSet } from './deleteSet.js' -import BinaryEncoder from '../Util/Binary/Encoder.js' +import { writeStructs } from './syncStep1.mjs' +import { integrateRemoteStructs } from './integrateRemoteStructs.mjs' +import { readDeleteSet, writeDeleteSet } from './deleteSet.mjs' +import BinaryEncoder from '../Util/Binary/Encoder.mjs' /** * Read the Decoder and fill the Yjs instance with data in the decoder. diff --git a/src/MessageHandler/deleteSet.js b/src/MessageHandler/deleteSet.mjs similarity index 97% rename from src/MessageHandler/deleteSet.js rename to src/MessageHandler/deleteSet.mjs index 2b54abfc..334a9336 100644 --- a/src/MessageHandler/deleteSet.js +++ b/src/MessageHandler/deleteSet.mjs @@ -1,5 +1,5 @@ -import { deleteItemRange } from '../Struct/Delete.js' -import ID from '../Util/ID/ID.js' +import { deleteItemRange } from '../Struct/Delete.mjs' +import ID from '../Util/ID/ID.mjs' export function stringifyDeleteSet (y, decoder, strBuilder) { let dsLength = decoder.readUint32() diff --git a/src/MessageHandler/integrateRemoteStructs.js b/src/MessageHandler/integrateRemoteStructs.mjs similarity index 94% rename from src/MessageHandler/integrateRemoteStructs.js rename to src/MessageHandler/integrateRemoteStructs.mjs index 802c3af6..dde6ec3d 100644 --- a/src/MessageHandler/integrateRemoteStructs.js +++ b/src/MessageHandler/integrateRemoteStructs.mjs @@ -1,7 +1,7 @@ -import { getStruct } from '../Util/structReferences.js' -import BinaryDecoder from '../Util/Binary/Decoder.js' -import { logID } from './messageToString.js' -import GC from '../Struct/GC.js' +import { getStruct } from '../Util/structReferences.mjs' +import BinaryDecoder from '../Util/Binary/Decoder.mjs' +import { logID } from './messageToString.mjs' +import GC from '../Struct/GC.mjs' class MissingEntry { constructor (decoder, missing, struct) { diff --git a/src/MessageHandler/messageToString.js b/src/MessageHandler/messageToString.mjs similarity index 85% rename from src/MessageHandler/messageToString.js rename to src/MessageHandler/messageToString.mjs index de31a020..09af93d5 100644 --- a/src/MessageHandler/messageToString.js +++ b/src/MessageHandler/messageToString.mjs @@ -1,10 +1,10 @@ -import BinaryDecoder from '../Util/Binary/Decoder.js' -import { stringifyStructs } from './integrateRemoteStructs.js' -import { stringifySyncStep1 } from './syncStep1.js' -import { stringifySyncStep2 } from './syncStep2.js' -import ID from '../Util/ID/ID.js' -import RootID from '../Util/ID/RootID.js' -import Y from '../Y.js' +import BinaryDecoder from '../Util/Binary/Decoder.mjs' +import { stringifyStructs } from './integrateRemoteStructs.mjs' +import { stringifySyncStep1 } from './syncStep1.mjs' +import { stringifySyncStep2 } from './syncStep2.mjs' +import ID from '../Util/ID/ID.mjs' +import RootID from '../Util/ID/RootID.mjs' +import Y from '../Y.mjs' export function messageToString ([y, buffer]) { let decoder = new BinaryDecoder(buffer) diff --git a/src/MessageHandler/stateSet.js b/src/MessageHandler/stateSet.mjs similarity index 100% rename from src/MessageHandler/stateSet.js rename to src/MessageHandler/stateSet.mjs diff --git a/src/MessageHandler/syncStep1.js b/src/MessageHandler/syncStep1.mjs similarity index 91% rename from src/MessageHandler/syncStep1.js rename to src/MessageHandler/syncStep1.mjs index 046177c3..53c08080 100644 --- a/src/MessageHandler/syncStep1.js +++ b/src/MessageHandler/syncStep1.mjs @@ -1,8 +1,8 @@ -import BinaryEncoder from '../Util/Binary/Encoder.js' -import { readStateSet, writeStateSet } from './stateSet.js' -import { writeDeleteSet } from './deleteSet.js' -import ID from '../Util/ID/ID.js' -import { RootFakeUserID } from '../Util/ID/RootID.js' +import BinaryEncoder from '../Util/Binary/Encoder.mjs' +import { readStateSet, writeStateSet } from './stateSet.mjs' +import { writeDeleteSet } from './deleteSet.mjs' +import ID from '../Util/ID/ID.mjs' +import { RootFakeUserID } from '../Util/ID/RootID.mjs' export function stringifySyncStep1 (y, decoder, strBuilder) { let auth = decoder.readVarString() diff --git a/src/MessageHandler/syncStep2.js b/src/MessageHandler/syncStep2.mjs similarity index 92% rename from src/MessageHandler/syncStep2.js rename to src/MessageHandler/syncStep2.mjs index 2de4902a..fe017410 100644 --- a/src/MessageHandler/syncStep2.js +++ b/src/MessageHandler/syncStep2.mjs @@ -1,5 +1,5 @@ -import { stringifyStructs, integrateRemoteStructs } from './integrateRemoteStructs.js' -import { readDeleteSet } from './deleteSet.js' +import { stringifyStructs, integrateRemoteStructs } from './integrateRemoteStructs.mjs' +import { readDeleteSet } from './deleteSet.mjs' export function stringifySyncStep2 (y, decoder, strBuilder) { strBuilder.push(' - auth: ' + decoder.readVarString()) diff --git a/src/Persistence.js b/src/Persistence.mjs similarity index 93% rename from src/Persistence.js rename to src/Persistence.mjs index 20fc9178..2659a20c 100644 --- a/src/Persistence.js +++ b/src/Persistence.mjs @@ -1,8 +1,8 @@ -import BinaryEncoder from './Util/Binary/Encoder.js' -import BinaryDecoder from './Util/Binary/Decoder.js' -import { toBinary, fromBinary } from './MessageHandler/binaryEncode.js' -import { integrateRemoteStructs } from './MessageHandler/integrateRemoteStructs.js' -import { createMutualExclude } from './Util/mutualExclude.js' +import BinaryEncoder from './Util/Binary/Encoder.mjs' +import BinaryDecoder from './Util/Binary/Decoder.mjs' +import { toBinary, fromBinary } from './MessageHandler/binaryEncode.mjs' +import { integrateRemoteStructs } from './MessageHandler/integrateRemoteStructs.mjs' +import { createMutualExclude } from './Util/mutualExclude.mjs' function getFreshCnf () { let buffer = new BinaryEncoder() diff --git a/src/Persistences/AbstractPersistence.mjs b/src/Persistences/AbstractPersistence.mjs new file mode 100644 index 00000000..7407c21d --- /dev/null +++ b/src/Persistences/AbstractPersistence.mjs @@ -0,0 +1,2 @@ + +export default class AbstractPersistence {} diff --git a/src/Persistences/FilePersistence.mjs b/src/Persistences/FilePersistence.mjs new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/Persistences/FilePersistence.mjs @@ -0,0 +1 @@ + diff --git a/src/Persistences/IndexeddbPersistence.mjs b/src/Persistences/IndexeddbPersistence.mjs new file mode 100644 index 00000000..1798b54c --- /dev/null +++ b/src/Persistences/IndexeddbPersistence.mjs @@ -0,0 +1,174 @@ +/* global indexedDB, location, BroadcastChannel */ + +import Y from '../Y.mjs' + +/* + * Request to Promise transformer + */ +function rtop (request) { + return new Promise(function (resolve, reject) { + request.onerror = function (event) { + reject(new Error(event.target.error)) + } + request.onblocked = function () { + location.reload() + } + request.onsuccess = function (event) { + resolve(event.target.result) + } + }) +} + +function openDB (room) { + return new Promise(function (resolve, reject) { + let request = indexedDB.open(room) + window.r1 = request + request.onupgradeneeded = function (event) { + const db = event.target.result + if (db.objectStoreNames.contains('model')) { + db.deleteObjectStore('updates') + db.deleteObjectStore('model') + db.deleteObjectStore('custom') + } + db.createObjectStore('updates', {autoIncrement: true}) + db.createObjectStore('model') + db.createObjectStore('custom') + } + request.onerror = function (event) { + reject(new Error(event.target.error)) + } + request.onblocked = function () { + location.reload() + } + request.onsuccess = function (event) { + const db = event.target.result + db.onversionchange = function () { db.close() } + resolve(db) + } + }) +} + +const PREFERRED_TRIM_SIZE = 500 + +export default class IndexedDBPersistence extends Y.AbstractPersistence { + constructor (opts) { + super(opts) + window.addEventListener('unload', () => { + this.ys.forEach(function (cnf, y) { + if (cnf.db !== null) { + cnf.db.close() + } else { + cnf._db.then(db => db.close()) + } + }) + }) + } + init (y) { + let cnf = this.ys.get(y) + let room = y.room + cnf.db = null + const dbOpened = openDB(room) + dbOpened.then(db => { + cnf.db = db + }) + if (typeof BroadcastChannel !== 'undefined') { + cnf.channel = new BroadcastChannel('__yjs__' + room) + cnf.channel.addEventListener('message', e => { + cnf.mutualExclude(function () { + y.transact(function () { + Y.utils.integrateRemoteStructs(y, new Y.utils.BinaryDecoder(e.data)) + }) + }) + }) + } else { + cnf.channel = null + } + return dbOpened + } + + deinit (y) { + let cnf = this.ys.get(y) + cnf.db.close() + super.deinit(y) + } + + set (y, key, value) { + const cnf = this.ys.get(y) + const t = cnf.db.transaction(['custom'], 'readwrite') + const customStore = t.objectStore('custom') + return rtop(customStore.put(value, key)) + } + + get (y, key) { + const cnf = this.ys.get(y) + const t = cnf.db.transaction(['custom'], 'readwrite') + const customStore = t.objectStore('custom') + return rtop(customStore.get(key)) + } + + /** + * Remove all persisted data that belongs to a room. + * Automatically destroys all Yjs all Yjs instances that persist to + * the room. If `destroyYjsInstances = false` the persistence functionality + * will be removed from the Yjs instances. + */ + removePersistedData (room, destroyYjsInstances = true) { + super.removePersistedData(room, destroyYjsInstances) + return rtop(indexedDB.deleteDatabase(room)) + } + + saveUpdate (y, update) { + let cnf = this.ys.get(y) + if (cnf.channel !== null) { + cnf.channel.postMessage(update) + } + let t = cnf.db.transaction(['updates'], 'readwrite') + let updatesStore = t.objectStore('updates') + updatesStore.put(update) + let cntP = rtop(updatesStore.count()) + cntP.then(cnt => { + if (cnt >= PREFERRED_TRIM_SIZE) { + this.persist(y) + } + }) + } + + saveStruct (y, struct) { + super.saveStruct(y, struct) + } + + retrieve (y) { + let cnf = this.ys.get(y) + let t = cnf.db.transaction(['updates', 'model'], 'readonly') + let modelStore = t.objectStore('model') + let updatesStore = t.objectStore('updates') + return Promise.all([rtop(modelStore.get(0)), rtop(updatesStore.getAll())]) + .then(([model, updates]) => { + super.retrieve(y, model, updates) + }) + } + + persist (y) { + let cnf = this.ys.get(y) + let db = cnf.db + let t = db.transaction(['updates', 'model'], 'readwrite') + let updatesStore = t.objectStore('updates') + return rtop(updatesStore.getAll()) + .then(updates => { + // apply pending updates before deleting them + Y.AbstractPersistence.prototype.retrieve.call(this, y, null, updates) + // get binary model + let binaryModel = Y.AbstractPersistence.prototype.persist.call(this, y) + // delete all pending updates + if (updates.length > 0) { + let modelStore = t.objectStore('model') + modelStore.put(binaryModel, 0) + updatesStore.clear() + } + }) + } +} + +if (typeof Y !== 'undefined') { + extendYIndexedDBPersistence(Y) // eslint-disable-line +} diff --git a/src/Store/DeleteStore.js b/src/Store/DeleteStore.mjs similarity index 97% rename from src/Store/DeleteStore.js rename to src/Store/DeleteStore.mjs index f35bd928..119a44bc 100644 --- a/src/Store/DeleteStore.js +++ b/src/Store/DeleteStore.mjs @@ -1,6 +1,6 @@ -import Tree from '../Util/Tree.js' -import ID from '../Util/ID/ID.js' +import Tree from '../Util/Tree.mjs' +import ID from '../Util/ID/ID.mjs' class DSNode { constructor (id, len, gc) { diff --git a/src/Store/OperationStore.js b/src/Store/OperationStore.mjs similarity index 91% rename from src/Store/OperationStore.js rename to src/Store/OperationStore.mjs index 6ee790a6..242cff8d 100644 --- a/src/Store/OperationStore.js +++ b/src/Store/OperationStore.mjs @@ -1,8 +1,8 @@ -import Tree from '../Util/Tree.js' -import RootID from '../Util/ID/RootID.js' -import { getStruct } from '../Util/structReferences.js' -import { logID } from '../MessageHandler/messageToString.js' -import GC from '../Struct/GC.js' +import Tree from '../Util/Tree.mjs' +import RootID from '../Util/ID/RootID.mjs' +import { getStruct } from '../Util/structReferences.mjs' +import { logID } from '../MessageHandler/messageToString.mjs' +import GC from '../Struct/GC.mjs' export default class OperationStore extends Tree { constructor (y) { diff --git a/src/Store/StateStore.js b/src/Store/StateStore.mjs similarity index 96% rename from src/Store/StateStore.js rename to src/Store/StateStore.mjs index c46ad072..8e12674f 100644 --- a/src/Store/StateStore.js +++ b/src/Store/StateStore.mjs @@ -1,4 +1,4 @@ -import ID from '../Util/ID/ID.js' +import ID from '../Util/ID/ID.mjs' export default class StateStore { constructor (y) { diff --git a/src/Struct/Delete.js b/src/Struct/Delete.mjs similarity index 92% rename from src/Struct/Delete.js rename to src/Struct/Delete.mjs index 74bdbeb1..11da9fc3 100644 --- a/src/Struct/Delete.js +++ b/src/Struct/Delete.mjs @@ -1,6 +1,7 @@ -import { getStructReference } from '../Util/structReferences.js' -import ID from '../Util/ID/ID.js' -import { logID } from '../MessageHandler/messageToString.js' +import { getStructReference } from '../Util/structReferences.mjs' +import ID from '../Util/ID/ID.mjs' +import { logID } from '../MessageHandler/messageToString.mjs' +import { writeStructToTransaction } from '../Transaction.mjs' /** * @private @@ -108,6 +109,7 @@ export default class Delete { if (y.persistence !== null) { y.persistence.saveStruct(y, this) } + writeStructToTransaction(y._transaction, this) } /** diff --git a/src/Struct/GC.js b/src/Struct/GC.mjs similarity index 90% rename from src/Struct/GC.js rename to src/Struct/GC.mjs index 6db86017..9d5143bb 100644 --- a/src/Struct/GC.js +++ b/src/Struct/GC.mjs @@ -1,6 +1,7 @@ -import { getStructReference } from '../Util/structReferences.js' -import { RootFakeUserID } from '../Util/ID/RootID.js' -import ID from '../Util/ID/ID.js' +import { getStructReference } from '../Util/structReferences.mjs' +import { RootFakeUserID } from '../Util/ID/RootID.mjs' +import ID from '../Util/ID/ID.mjs' +import { writeStructToTransaction } from '../Transaction.mjs' // TODO should have the same base class as Item export default class GC { @@ -43,6 +44,7 @@ export default class GC { if (y.persistence !== null) { y.persistence.saveStruct(y, this) } + writeStructToTransaction(y._transaction, this) } } diff --git a/src/Struct/Item.js b/src/Struct/Item.mjs similarity index 97% rename from src/Struct/Item.js rename to src/Struct/Item.mjs index 9f17d1e7..baa3c23a 100644 --- a/src/Struct/Item.js +++ b/src/Struct/Item.mjs @@ -1,9 +1,9 @@ -import { getStructReference } from '../Util/structReferences.js' -import ID from '../Util/ID/ID.js' -import { default as RootID, RootFakeUserID } from '../Util/ID/RootID.js' -import Delete from './Delete.js' -import { transactionTypeChanged } from '../Transaction.js' -import GC from './GC.js' +import { getStructReference } from '../Util/structReferences.mjs' +import ID from '../Util/ID/ID.mjs' +import { default as RootID, RootFakeUserID } from '../Util/ID/RootID.mjs' +import Delete from './Delete.mjs' +import { transactionTypeChanged, writeStructToTransaction } from '../Transaction.mjs' +import GC from './GC.mjs' /** * @private @@ -385,6 +385,7 @@ export default class Item { if (y.persistence !== null) { y.persistence.saveStruct(y, this) } + writeStructToTransaction(y._transaction, this) } } diff --git a/src/Struct/ItemEmbed.js b/src/Struct/ItemEmbed.mjs similarity index 94% rename from src/Struct/ItemEmbed.js rename to src/Struct/ItemEmbed.mjs index e4972e56..8d91e626 100644 --- a/src/Struct/ItemEmbed.js +++ b/src/Struct/ItemEmbed.mjs @@ -1,5 +1,5 @@ -import { default as Item } from './Item.js' -import { logItemHelper } from '../MessageHandler/messageToString.js' +import Item from './Item.mjs' +import { logItemHelper } from '../MessageHandler/messageToString.mjs' export default class ItemEmbed extends Item { constructor () { diff --git a/src/Struct/ItemFormat.js b/src/Struct/ItemFormat.mjs similarity index 95% rename from src/Struct/ItemFormat.js rename to src/Struct/ItemFormat.mjs index 88094cfb..5fe0a624 100644 --- a/src/Struct/ItemFormat.js +++ b/src/Struct/ItemFormat.mjs @@ -1,5 +1,5 @@ -import { default as Item } from './Item.js' -import { logItemHelper } from '../MessageHandler/messageToString.js' +import Item from './Item.mjs' +import { logItemHelper } from '../MessageHandler/messageToString.mjs' export default class ItemFormat extends Item { constructor () { diff --git a/src/Struct/ItemJSON.js b/src/Struct/ItemJSON.mjs similarity index 96% rename from src/Struct/ItemJSON.js rename to src/Struct/ItemJSON.mjs index 177bdb2e..7e303c78 100644 --- a/src/Struct/ItemJSON.js +++ b/src/Struct/ItemJSON.mjs @@ -1,5 +1,5 @@ -import { splitHelper, default as Item } from './Item.js' -import { logItemHelper } from '../MessageHandler/messageToString.js' +import Item, { splitHelper } from './Item.mjs' +import { logItemHelper } from '../MessageHandler/messageToString.mjs' export default class ItemJSON extends Item { constructor () { diff --git a/src/Struct/ItemString.js b/src/Struct/ItemString.mjs similarity index 94% rename from src/Struct/ItemString.js rename to src/Struct/ItemString.mjs index 889b4f8e..aad8ea3e 100644 --- a/src/Struct/ItemString.js +++ b/src/Struct/ItemString.mjs @@ -1,5 +1,5 @@ -import { splitHelper, default as Item } from './Item.js' -import { logItemHelper } from '../MessageHandler/messageToString.js' +import Item, { splitHelper } from './Item.mjs' +import { logItemHelper } from '../MessageHandler/messageToString.mjs' export default class ItemString extends Item { constructor () { diff --git a/src/Struct/Type.js b/src/Struct/Type.mjs similarity index 97% rename from src/Struct/Type.js rename to src/Struct/Type.mjs index c8b63395..7898ed5a 100644 --- a/src/Struct/Type.js +++ b/src/Struct/Type.mjs @@ -1,6 +1,6 @@ -import Item from './Item.js' -import EventHandler from '../Util/EventHandler.js' -import ID from '../Util/ID/ID.js' +import Item from './Item.mjs' +import EventHandler from '../Util/EventHandler.mjs' +import ID from '../Util/ID/ID.mjs' // restructure children as if they were inserted one after another function integrateChildren (y, start) { diff --git a/src/Transaction.js b/src/Transaction.mjs similarity index 84% rename from src/Transaction.js rename to src/Transaction.mjs index 237ed166..298248d5 100644 --- a/src/Transaction.js +++ b/src/Transaction.mjs @@ -1,3 +1,4 @@ +import BinaryEncoder from './Util/Binary/Encoder.mjs' /** * A transaction is created for every change on the Yjs model. It is possible @@ -58,7 +59,19 @@ export default class Transaction { * @type {Map>} */ this.changedParentTypes = new Map() + this.encodedStructsLen = 0 + this._encodedStructs = new BinaryEncoder() + this._encodedStructs.writeUint32(0) } + get encodedStructs () { + this._encodedStructs.setUint32(0, this.encodedStructsLen) + return this._encodedStructs + } +} + +export function writeStructToTransaction (transaction, struct) { + transaction.encodedStructsLen++ + struct._toBinary(transaction._encodedStructs) } /** diff --git a/src/Types/YArray/YArray.js b/src/Types/YArray/YArray.mjs similarity index 97% rename from src/Types/YArray/YArray.js rename to src/Types/YArray/YArray.mjs index 5914dc7b..9dbd96ea 100644 --- a/src/Types/YArray/YArray.js +++ b/src/Types/YArray/YArray.mjs @@ -1,8 +1,8 @@ -import Type from '../../Struct/Type.js' -import ItemJSON from '../../Struct/ItemJSON.js' -import ItemString from '../../Struct/ItemString.js' -import { logID, logItemHelper } from '../../MessageHandler/messageToString.js' -import YEvent from '../../Util/YEvent.js' +import Type from '../../Struct/Type.mjs' +import ItemJSON from '../../Struct/ItemJSON.mjs' +import ItemString from '../../Struct/ItemString.mjs' +import { logID, logItemHelper } from '../../MessageHandler/messageToString.mjs' +import YEvent from '../../Util/YEvent.mjs' /** * Event that describes the changes on a YArray diff --git a/src/Types/YMap/YMap.js b/src/Types/YMap/YMap.mjs similarity index 95% rename from src/Types/YMap/YMap.js rename to src/Types/YMap/YMap.mjs index b204d52f..cd33ef00 100644 --- a/src/Types/YMap/YMap.js +++ b/src/Types/YMap/YMap.mjs @@ -1,8 +1,8 @@ -import Type from '../../Struct/Type.js' -import Item from '../../Struct/Item.js' -import ItemJSON from '../../Struct/ItemJSON.js' -import { logItemHelper } from '../../MessageHandler/messageToString.js' -import YEvent from '../../Util/YEvent.js' +import Item from '../../Struct/Item.mjs' +import Type from '../../Struct/Type.mjs' +import ItemJSON from '../../Struct/ItemJSON.mjs' +import { logItemHelper } from '../../MessageHandler/messageToString.mjs' +import YEvent from '../../Util/YEvent.mjs' /** * Event that describes the changes on a YMap. diff --git a/src/Types/YText/YText.js b/src/Types/YText/YText.mjs similarity index 99% rename from src/Types/YText/YText.js rename to src/Types/YText/YText.mjs index 42401f55..3a7e497c 100644 --- a/src/Types/YText/YText.js +++ b/src/Types/YText/YText.mjs @@ -1,8 +1,8 @@ -import ItemString from '../../Struct/ItemString.js' -import ItemEmbed from '../../Struct/ItemEmbed.js' -import ItemFormat from '../../Struct/ItemFormat.js' -import { logItemHelper } from '../../MessageHandler/messageToString.js' -import { YArrayEvent, default as YArray } from '../YArray/YArray.js' +import ItemEmbed from '../../Struct/ItemEmbed.mjs' +import ItemString from '../../Struct/ItemString.mjs' +import ItemFormat from '../../Struct/ItemFormat.mjs' +import { logItemHelper } from '../../MessageHandler/messageToString.mjs' +import { YArrayEvent, default as YArray } from '../YArray/YArray.mjs' /** * @private diff --git a/src/Types/YXml/YXmlElement.js b/src/Types/YXml/YXmlElement.mjs similarity index 98% rename from src/Types/YXml/YXmlElement.js rename to src/Types/YXml/YXmlElement.mjs index 9c7280f7..4e1c5875 100644 --- a/src/Types/YXml/YXmlElement.js +++ b/src/Types/YXml/YXmlElement.mjs @@ -1,6 +1,6 @@ -import YMap from '../YMap/YMap.js' -import YXmlFragment from './YXmlFragment.js' -import { createAssociation } from '../../Bindings/DomBinding/util.js' +import YMap from '../YMap/YMap.mjs' +import YXmlFragment from './YXmlFragment.mjs' +import { createAssociation } from '../../Bindings/DomBinding/util.mjs' /** * An YXmlElement imitates the behavior of a diff --git a/src/Types/YXml/YXmlEvent.js b/src/Types/YXml/YXmlEvent.mjs similarity index 96% rename from src/Types/YXml/YXmlEvent.js rename to src/Types/YXml/YXmlEvent.mjs index 49d8f680..3416725f 100644 --- a/src/Types/YXml/YXmlEvent.js +++ b/src/Types/YXml/YXmlEvent.mjs @@ -1,4 +1,4 @@ -import YEvent from '../../Util/YEvent.js' +import YEvent from '../../Util/YEvent.mjs' /** * An Event that describes changes on a YXml Element or Yxml Fragment diff --git a/src/Types/YXml/YXmlFragment.js b/src/Types/YXml/YXmlFragment.mjs similarity index 97% rename from src/Types/YXml/YXmlFragment.js rename to src/Types/YXml/YXmlFragment.mjs index 3c450756..af68e36c 100644 --- a/src/Types/YXml/YXmlFragment.js +++ b/src/Types/YXml/YXmlFragment.mjs @@ -1,9 +1,9 @@ -import { createAssociation } from '../../Bindings/DomBinding/util.js' -import YXmlTreeWalker from './YXmlTreeWalker.js' +import { createAssociation } from '../../Bindings/DomBinding/util.mjs' +import YXmlTreeWalker from './YXmlTreeWalker.mjs' -import YArray from '../YArray/YArray.js' -import YXmlEvent from './YXmlEvent.js' -import { logItemHelper } from '../../MessageHandler/messageToString.js' +import YArray from '../YArray/YArray.mjs' +import YXmlEvent from './YXmlEvent.mjs' +import { logItemHelper } from '../../MessageHandler/messageToString.mjs' /** * Dom filter function. diff --git a/src/Types/YXml/YXmlHook.js b/src/Types/YXml/YXmlHook.mjs similarity index 98% rename from src/Types/YXml/YXmlHook.js rename to src/Types/YXml/YXmlHook.mjs index 08ad5935..ac808587 100644 --- a/src/Types/YXml/YXmlHook.js +++ b/src/Types/YXml/YXmlHook.mjs @@ -1,5 +1,5 @@ -import YMap from '../YMap/YMap.js' -import { createAssociation } from '../../Bindings/DomBinding/util.js' +import YMap from '../YMap/YMap.mjs' +import { createAssociation } from '../../Bindings/DomBinding/util.mjs' /** * You can manage binding to a custom type with YXmlHook. diff --git a/src/Types/YXml/YXmlText.js b/src/Types/YXml/YXmlText.mjs similarity index 97% rename from src/Types/YXml/YXmlText.js rename to src/Types/YXml/YXmlText.mjs index 4c34c982..9402d8e7 100644 --- a/src/Types/YXml/YXmlText.js +++ b/src/Types/YXml/YXmlText.mjs @@ -1,5 +1,5 @@ -import YText from '../YText/YText.js' -import { createAssociation } from '../../Bindings/DomBinding/util.js' +import YText from '../YText/YText.mjs' +import { createAssociation } from '../../Bindings/DomBinding/util.mjs' /** * Represents text in a Dom Element. In the future this type will also handle diff --git a/src/Types/YXml/YXmlTreeWalker.js b/src/Types/YXml/YXmlTreeWalker.mjs similarity index 97% rename from src/Types/YXml/YXmlTreeWalker.js rename to src/Types/YXml/YXmlTreeWalker.mjs index 1ee724e6..866091d0 100644 --- a/src/Types/YXml/YXmlTreeWalker.js +++ b/src/Types/YXml/YXmlTreeWalker.mjs @@ -1,4 +1,4 @@ -import YXmlFragment from './YXmlFragment.js' +import YXmlFragment from './YXmlFragment.mjs' /** * Define the elements to which a set of CSS queries apply. diff --git a/src/Util/Binary/Decoder.js b/src/Util/Binary/Decoder.mjs similarity index 97% rename from src/Util/Binary/Decoder.js rename to src/Util/Binary/Decoder.mjs index f6761623..b9fca034 100644 --- a/src/Util/Binary/Decoder.js +++ b/src/Util/Binary/Decoder.mjs @@ -1,5 +1,5 @@ -import ID from '../ID/ID.js' -import { default as RootID, RootFakeUserID } from '../ID/RootID.js' +import ID from '../ID/ID.mjs' +import { default as RootID, RootFakeUserID } from '../ID/RootID.mjs' /** * A BinaryDecoder handles the decoding of an ArrayBuffer. @@ -25,6 +25,10 @@ export default class BinaryDecoder { this.pos = 0 } + hasContent () { + return this.pos !== this.uint8arr.length + } + /** * Clone this decoder instance. * Optionally set a new position parameter. diff --git a/src/Util/Binary/Encoder.js b/src/Util/Binary/Encoder.mjs similarity index 92% rename from src/Util/Binary/Encoder.js rename to src/Util/Binary/Encoder.mjs index 53e09260..57070972 100644 --- a/src/Util/Binary/Encoder.js +++ b/src/Util/Binary/Encoder.mjs @@ -1,4 +1,4 @@ -import { RootFakeUserID } from '../ID/RootID.js' +import { RootFakeUserID } from '../ID/RootID.mjs' const bits7 = 0b1111111 const bits8 = 0b11111111 @@ -127,6 +127,15 @@ export default class BinaryEncoder { } } + /** + * Write the content of another binary encoder. + * + * @param encoder The BinaryEncoder to be written. + */ + writeBinaryEncoder (encoder) { + this.data = this.data.concat(encoder.data) + } + /** * Write an ID at the current position. * diff --git a/src/Util/EventHandler.js b/src/Util/EventHandler.mjs similarity index 100% rename from src/Util/EventHandler.js rename to src/Util/EventHandler.mjs diff --git a/src/Util/ID/ID.js b/src/Util/ID/ID.mjs similarity index 100% rename from src/Util/ID/ID.js rename to src/Util/ID/ID.mjs diff --git a/src/Util/ID/RootID.js b/src/Util/ID/RootID.mjs similarity index 90% rename from src/Util/ID/RootID.js rename to src/Util/ID/RootID.mjs index 9e4672c5..4b2d8967 100644 --- a/src/Util/ID/RootID.js +++ b/src/Util/ID/RootID.mjs @@ -1,4 +1,4 @@ -import { getStructReference } from '../structReferences.js' +import { getStructReference } from '../structReferences.mjs' export const RootFakeUserID = 0xFFFFFF diff --git a/src/Util/NamedEventHandler.js b/src/Util/NamedEventHandler.mjs similarity index 100% rename from src/Util/NamedEventHandler.js rename to src/Util/NamedEventHandler.mjs diff --git a/src/Util/Tree.js b/src/Util/Tree.mjs similarity index 100% rename from src/Util/Tree.js rename to src/Util/Tree.mjs diff --git a/src/Util/UndoManager.js b/src/Util/UndoManager.mjs similarity index 98% rename from src/Util/UndoManager.js rename to src/Util/UndoManager.mjs index 0810ffc8..eacc8dad 100644 --- a/src/Util/UndoManager.js +++ b/src/Util/UndoManager.mjs @@ -1,5 +1,5 @@ -import ID from './ID/ID.js' -import isParentOf from './isParentOf.js' +import ID from './ID/ID.mjs' +import isParentOf from './isParentOf.mjs' class ReverseOperation { constructor (y, transaction) { diff --git a/src/Util/YEvent.js b/src/Util/YEvent.mjs similarity index 100% rename from src/Util/YEvent.js rename to src/Util/YEvent.mjs diff --git a/src/Util/defragmentItemContent.js b/src/Util/defragmentItemContent.mjs similarity index 91% rename from src/Util/defragmentItemContent.js rename to src/Util/defragmentItemContent.mjs index 586c33f1..cf2908f8 100644 --- a/src/Util/defragmentItemContent.js +++ b/src/Util/defragmentItemContent.mjs @@ -1,7 +1,7 @@ -import ID from '../Util/ID/ID.js' -import ItemJSON from '../Struct/ItemJSON.js' -import ItemString from '../Struct/ItemString.js' +import ID from '../Util/ID/ID.mjs' +import ItemJSON from '../Struct/ItemJSON.mjs' +import ItemString from '../Struct/ItemString.mjs' /** * Try to merge all items in os with their successors. diff --git a/src/Util/generateRandomUint32.js b/src/Util/generateRandomUint32.mjs similarity index 100% rename from src/Util/generateRandomUint32.js rename to src/Util/generateRandomUint32.mjs diff --git a/src/Util/isParentOf.js b/src/Util/isParentOf.mjs similarity index 100% rename from src/Util/isParentOf.js rename to src/Util/isParentOf.mjs diff --git a/src/Util/mutualExclude.js b/src/Util/mutualExclude.mjs similarity index 100% rename from src/Util/mutualExclude.js rename to src/Util/mutualExclude.mjs diff --git a/src/Util/relativePosition.js b/src/Util/relativePosition.mjs similarity index 96% rename from src/Util/relativePosition.js rename to src/Util/relativePosition.mjs index df85b00c..26c76863 100644 --- a/src/Util/relativePosition.js +++ b/src/Util/relativePosition.mjs @@ -1,6 +1,6 @@ -import ID from './ID/ID.js' -import RootID from './ID/RootID.js' -import GC from '../Struct/GC.js' +import ID from './ID/ID.mjs' +import RootID from './ID/RootID.mjs' +import GC from '../Struct/GC.mjs' // TODO: Implement function to describe ranges diff --git a/src/Util/simpleDiff.js b/src/Util/simpleDiff.mjs similarity index 100% rename from src/Util/simpleDiff.js rename to src/Util/simpleDiff.mjs diff --git a/src/Util/structReferences.js b/src/Util/structReferences.mjs similarity index 62% rename from src/Util/structReferences.js rename to src/Util/structReferences.mjs index 3f03c974..dee8ae76 100644 --- a/src/Util/structReferences.js +++ b/src/Util/structReferences.mjs @@ -1,17 +1,17 @@ -import YArray from '../Types/YArray/YArray.js' -import YMap from '../Types/YMap/YMap.js' -import YText from '../Types/YText/YText.js' -import YXmlText from '../Types/YXml/YXmlText.js' -import YXmlHook from '../Types/YXml/YXmlHook.js' -import YXmlFragment from '../Types/YXml/YXmlFragment.js' -import YXmlElement from '../Types/YXml/YXmlElement.js' +import Delete from '../Struct/Delete.mjs' +import ItemJSON from '../Struct/ItemJSON.mjs' +import ItemString from '../Struct/ItemString.mjs' +import ItemFormat from '../Struct/ItemFormat.mjs' +import ItemEmbed from '../Struct/ItemEmbed.mjs' +import GC from '../Struct/GC.mjs' -import Delete from '../Struct/Delete.js' -import ItemJSON from '../Struct/ItemJSON.js' -import ItemString from '../Struct/ItemString.js' -import ItemFormat from '../Struct/ItemFormat.js' -import ItemEmbed from '../Struct/ItemEmbed.js' -import GC from '../Struct/GC.js' +import YArray from '../Types/YArray/YArray.mjs' +import YMap from '../Types/YMap/YMap.mjs' +import YText from '../Types/YText/YText.mjs' +import YXmlText from '../Types/YXml/YXmlText.mjs' +import YXmlHook from '../Types/YXml/YXmlHook.mjs' +import YXmlFragment from '../Types/YXml/YXmlFragment.mjs' +import YXmlElement from '../Types/YXml/YXmlElement.mjs' const structs = new Map() const references = new Map() diff --git a/src/Y.dist.js b/src/Y.dist.mjs similarity index 56% rename from src/Y.dist.js rename to src/Y.dist.mjs index fbf2445a..a5445881 100644 --- a/src/Y.dist.js +++ b/src/Y.dist.mjs @@ -1,30 +1,30 @@ -import Y from './Y.js' -import UndoManager from './Util/UndoManager.js' -import { integrateRemoteStructs } from './MessageHandler/integrateRemoteStructs.js' +import Y from './Y.mjs' +import UndoManager from './Util/UndoManager.mjs' +import { integrateRemoteStructs } from './MessageHandler/integrateRemoteStructs.mjs' -import { messageToString, messageToRoomname } from './MessageHandler/messageToString.js' +import { messageToString, messageToRoomname } from './MessageHandler/messageToString.mjs' -import Connector from './Connector.js' -import Persistence from './Persistence.js' -import YArray from './Types/YArray/YArray.js' -import YMap from './Types/YMap/YMap.js' -import YText from './Types/YText/YText.js' -import YXmlText from './Types/YXml/YXmlText.js' -import YXmlHook from './Types/YXml/YXmlHook.js' -import YXmlFragment from './Types/YXml/YXmlFragment.js' -import YXmlElement from './Types/YXml/YXmlElement.js' -import BinaryDecoder from './Util/Binary/Decoder.js' -import { getRelativePosition, fromRelativePosition } from './Util/relativePosition.js' -import { registerStruct } from './Util/structReferences.js' -import TextareaBinding from './Bindings/TextareaBinding/TextareaBinding.js' -import QuillBinding from './Bindings/QuillBinding/QuillBinding.js' -import DomBinding from './Bindings/DomBinding/DomBinding.js' -import { toBinary, fromBinary } from './MessageHandler/binaryEncode.js' +import Connector from './Connector.mjs' +import Persistence from './Persistence.mjs' +import YArray from './Types/YArray/YArray.mjs' +import YMap from './Types/YMap/YMap.mjs' +import YText from './Types/YText/YText.mjs' +import YXmlText from './Types/YXml/YXmlText.mjs' +import YXmlHook from './Types/YXml/YXmlHook.mjs' +import YXmlFragment from './Types/YXml/YXmlFragment.mjs' +import YXmlElement from './Types/YXml/YXmlElement.mjs' +import BinaryDecoder from './Util/Binary/Decoder.mjs' +import { getRelativePosition, fromRelativePosition } from './Util/relativePosition.mjs' +import { registerStruct } from './Util/structReferences.mjs' +import TextareaBinding from './Bindings/TextareaBinding/TextareaBinding.mjs' +import QuillBinding from './Bindings/QuillBinding/QuillBinding.mjs' +import DomBinding from './Bindings/DomBinding/DomBinding.mjs' +import { toBinary, fromBinary } from './MessageHandler/binaryEncode.mjs' import debug from 'debug' -import domToType from './Bindings/DomBinding/domToType.js' -import { domsToTypes, switchAssociation } from './Bindings/DomBinding/util.js' +import domToType from './Bindings/DomBinding/domToType.mjs' +import { domsToTypes, switchAssociation } from './Bindings/DomBinding/util.mjs' // TODO: The following assignments should be moved to yjs-dist Y.AbstractConnector = Connector diff --git a/src/Y.js b/src/Y.mjs similarity index 90% rename from src/Y.js rename to src/Y.mjs index 0279cf17..6f74c237 100644 --- a/src/Y.js +++ b/src/Y.mjs @@ -1,12 +1,12 @@ -import DeleteStore from './Store/DeleteStore.js' -import OperationStore from './Store/OperationStore.js' -import StateStore from './Store/StateStore.js' -import { generateRandomUint32 } from './Util/generateRandomUint32.js' -import RootID from './Util/ID/RootID.js' -import NamedEventHandler from './Util/NamedEventHandler.js' -import Transaction from './Transaction.js' +import DeleteStore from './Store/DeleteStore.mjs' +import OperationStore from './Store/OperationStore.mjs' +import StateStore from './Store/StateStore.mjs' +import { generateRandomUint32 } from './Util/generateRandomUint32.mjs' +import RootID from './Util/ID/RootID.mjs' +import NamedEventHandler from './Util/NamedEventHandler.mjs' +import Transaction from './Transaction.mjs' -export { default as DomBinding } from './Bindings/DomBinding/DomBinding.js' +export { default as DomBinding } from './Bindings/DomBinding/DomBinding.mjs' /** * Anything that can be encoded with `JSON.stringify` and can be decoded with @@ -28,7 +28,7 @@ export { default as DomBinding } from './Bindings/DomBinding/DomBinding.js' * @param {AbstractPersistence} persistence Persistence adapter instance */ export default class Y extends NamedEventHandler { - constructor (room, opts, persistence, conf = {}) { + constructor (room, connector, persistence, conf = {}) { super() this.gcEnabled = conf.gc || false /** @@ -36,16 +36,8 @@ export default class Y extends NamedEventHandler { * @type {String} */ this.room = room - if (opts != null) { - opts.connector.room = room - } this._contentReady = false - this._opts = opts - if (typeof opts.userID !== 'number') { - this.userID = generateRandomUint32() - } else { - this.userID = opts.userID - } + this.userID = generateRandomUint32() // TODO: This should be a Map so we can use encodables as keys this.share = {} this.ds = new DeleteStore(this) @@ -61,10 +53,13 @@ export default class Y extends NamedEventHandler { this.connector = null this.connected = false let initConnection = () => { - if (opts != null) { - this.connector = new Y[opts.connector.name](this, opts.connector) - this.connected = true - this.emit('connectorReady') + if (connector != null) { + if (connector.constructor === Object) { + connector.connector.room = room + this.connector = new Y[connector.connector.name](this, connector.connector) + this.connected = true + this.emit('connectorReady') + } } } /** diff --git a/test/DeleteStore.tests.js b/test/DeleteStore.tests.mjs similarity index 96% rename from test/DeleteStore.tests.js rename to test/DeleteStore.tests.mjs index 5f5c3a7a..c916ce7d 100644 --- a/test/DeleteStore.tests.js +++ b/test/DeleteStore.tests.mjs @@ -1,7 +1,7 @@ import { test } from '../node_modules/cutest/cutest.mjs' import Chance from 'chance' -import DeleteStore from '../src/Store/DeleteStore.js' -import ID from '../src/Util/ID/ID.js' +import DeleteStore from '../src/Store/DeleteStore.mjs' +import ID from '../src/Util/ID/ID.mjs' /** * Converts a DS to an array of length 10. diff --git a/test/diff.tests.js b/test/diff.tests.mjs similarity index 95% rename from test/diff.tests.js rename to test/diff.tests.mjs index 5afba426..2ed266c3 100644 --- a/test/diff.tests.js +++ b/test/diff.tests.mjs @@ -1,5 +1,5 @@ import { test } from '../node_modules/cutest/cutest.mjs' -import simpleDiff from '../src/Util/simpleDiff.js' +import simpleDiff from '../src/Util/simpleDiff.mjs' import Chance from 'chance' function runDiffTest (t, a, b, expected) { diff --git a/test/encode-decode.tests.js b/test/encode-decode.tests.mjs similarity index 95% rename from test/encode-decode.tests.js rename to test/encode-decode.tests.mjs index e032d06b..a05b98ce 100644 --- a/test/encode-decode.tests.js +++ b/test/encode-decode.tests.mjs @@ -1,7 +1,7 @@ import { test } from '../node_modules/cutest/cutest.mjs' -import BinaryEncoder from '../src/Util/Binary/Encoder.js' -import BinaryDecoder from '../src/Util/Binary/Decoder.js' -import { generateRandomUint32 } from '../src/Util/generateRandomUint32.js' +import BinaryEncoder from '../src/Util/Binary/Encoder.mjs' +import BinaryDecoder from '../src/Util/Binary/Decoder.mjs' +import { generateRandomUint32 } from '../src/Util/generateRandomUint32.mjs' import Chance from 'chance' function testEncoding (t, write, read, val) { diff --git a/test/index.js b/test/index.js deleted file mode 100644 index 1ef3afc8..00000000 --- a/test/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import './red-black-tree.js' -import './y-array.tests.js' -import './y-text.tests.js' -import './y-map.tests.js' -import './y-xml.tests.js' -import './encode-decode.tests.js' -import './diff.tests.js' diff --git a/test/index.mjs b/test/index.mjs new file mode 100644 index 00000000..7c0de996 --- /dev/null +++ b/test/index.mjs @@ -0,0 +1,7 @@ +import './red-black-tree.mjs' +import './y-array.tests.mjs' +import './y-text.tests.mjs' +import './y-map.tests.mjs' +import './y-xml.tests.mjs' +import './encode-decode.tests.mjs' +import './diff.tests.mjs' diff --git a/test/red-black-tree.js b/test/red-black-tree.mjs similarity index 98% rename from test/red-black-tree.js rename to test/red-black-tree.mjs index 05ac3599..c7823783 100644 --- a/test/red-black-tree.js +++ b/test/red-black-tree.mjs @@ -1,5 +1,5 @@ -import RedBlackTree from '../src/Util/Tree.js' -import ID from '../src/Util/ID/ID.js' +import RedBlackTree from '../src/Util/Tree.mjs' +import ID from '../src/Util/ID/ID.mjs' import Chance from 'chance' import { test, proxyConsole } from 'cutest' diff --git a/test/y-array.tests.js b/test/y-array.tests.mjs similarity index 99% rename from test/y-array.tests.js rename to test/y-array.tests.mjs index 26647338..4b296884 100644 --- a/test/y-array.tests.js +++ b/test/y-array.tests.mjs @@ -1,4 +1,4 @@ -import { wait, initArrays, compareUsers, Y, flushAll, applyRandomTests } from '../tests-lib/helper.js' +import { wait, initArrays, compareUsers, Y, flushAll, applyRandomTests } from '../tests-lib/helper.mjs' import { test, proxyConsole } from 'cutest' proxyConsole() diff --git a/test/y-map.tests.js b/test/y-map.tests.mjs similarity index 99% rename from test/y-map.tests.js rename to test/y-map.tests.mjs index efebdc10..0b955b3e 100644 --- a/test/y-map.tests.js +++ b/test/y-map.tests.mjs @@ -1,4 +1,4 @@ -import { initArrays, compareUsers, Y, flushAll, applyRandomTests } from '../tests-lib/helper.js' +import { initArrays, compareUsers, Y, flushAll, applyRandomTests } from '../tests-lib/helper.mjs' import { test, proxyConsole } from 'cutest' proxyConsole() diff --git a/test/y-text.tests.js b/test/y-text.tests.mjs similarity index 99% rename from test/y-text.tests.js rename to test/y-text.tests.mjs index 4b73ec11..ecb3bcd3 100644 --- a/test/y-text.tests.js +++ b/test/y-text.tests.mjs @@ -1,4 +1,4 @@ -import { initArrays, compareUsers, flushAll } from '../tests-lib/helper.js' +import { initArrays, compareUsers, flushAll } from '../tests-lib/helper.mjs' import { test, proxyConsole } from 'cutest' proxyConsole() diff --git a/test/y-xml.tests.js b/test/y-xml.tests.mjs similarity index 99% rename from test/y-xml.tests.js rename to test/y-xml.tests.mjs index 6d77515c..fede4c34 100644 --- a/test/y-xml.tests.js +++ b/test/y-xml.tests.mjs @@ -1,4 +1,4 @@ -import { wait, initArrays, compareUsers, Y, flushAll, applyRandomTests } from '../../yjs/tests-lib/helper.js' +import { wait, initArrays, compareUsers, Y, flushAll, applyRandomTests } from '../../yjs/tests-lib/helper.mjs' import { test } from 'cutest' test('set property', async function xml0 (t) { diff --git a/tests-lib/helper.js b/tests-lib/helper.mjs similarity index 96% rename from tests-lib/helper.js rename to tests-lib/helper.mjs index fe59c55f..07681b51 100644 --- a/tests-lib/helper.js +++ b/tests-lib/helper.mjs @@ -1,14 +1,14 @@ -import _Y from '../src/Y.dist.js' -import { DomBinding } from '../src/Y.js' -import TestConnector from './test-connector.js' +import _Y from '../src/Y.dist.mjs' +import { DomBinding } from '../src/Y.mjs' +import TestConnector from './test-connector.mjs' import Chance from 'chance' -import ItemJSON from '../src/Struct/ItemJSON.js' -import ItemString from '../src/Struct/ItemString.js' -import { defragmentItemContent } from '../src/Util/defragmentItemContent.js' +import ItemJSON from '../src/Struct/ItemJSON.mjs' +import ItemString from '../src/Struct/ItemString.mjs' +import { defragmentItemContent } from '../src/Util/defragmentItemContent.mjs' import Quill from 'quill' -import GC from '../src/Struct/GC.js' +import GC from '../src/Struct/GC.mjs' export const Y = _Y diff --git a/tests-lib/test-connector.js b/tests-lib/test-connector.mjs similarity index 98% rename from tests-lib/test-connector.js rename to tests-lib/test-connector.mjs index b83f2777..923f4120 100644 --- a/tests-lib/test-connector.js +++ b/tests-lib/test-connector.mjs @@ -1,6 +1,6 @@ import { wait } from './helper' import { messageToString } from '../src/MessageHandler/messageToString' -import AbstractConnector from '../src/Connector.js' +import AbstractConnector from '../src/Connector.mjs' var rooms = {}