From 39f6e0e72852b22eed64b6af89f5d669068a489d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tadeusz=20So=C5=9Bnierz?= Date: Thu, 6 Aug 2020 18:19:12 +0200 Subject: [PATCH 1/2] build(xapian): Evict runbox7lib to runbox-searchindex --- package-lock.json | 1501 +---------------- package.json | 8 +- src/app/app.component.ts | 12 +- src/app/common/mailaddressinfo.spec.ts | 71 - src/app/common/mailaddressinfo.ts | 81 - src/app/compose/compose.component.ts | 7 +- src/app/compose/draftdesk.service.spec.ts | 2 +- src/app/compose/draftdesk.service.ts | 4 +- src/app/compose/emailvalidator.ts | 2 +- .../compose/mailrecipientinput.component.ts | 2 +- src/app/compose/recipients.service.spec.ts | 4 +- src/app/compose/recipients.service.ts | 2 +- src/app/lib.module.ts | 27 - .../popular-recipients.component.spec.ts | 2 +- src/app/rmmapi/messagelist.service.ts | 10 +- src/app/rmmapi/rbwebmail.ts | 12 +- .../downloadablesearchindexmap.class.ts | 35 - src/app/xapian/indexer.ts | 4 +- src/app/xapian/messageinfo.spec.ts | 77 - src/app/xapian/messageinfo.ts | 172 -- src/app/xapian/rmmxapianapi.ts | 273 --- src/app/xapian/searchservice.spec.ts | 2 +- src/app/xapian/searchservice.ts | 25 +- 23 files changed, 104 insertions(+), 2231 deletions(-) delete mode 100644 src/app/common/mailaddressinfo.spec.ts delete mode 100644 src/app/common/mailaddressinfo.ts delete mode 100644 src/app/lib.module.ts delete mode 100644 src/app/xapian/downloadablesearchindexmap.class.ts delete mode 100644 src/app/xapian/messageinfo.spec.ts delete mode 100644 src/app/xapian/messageinfo.ts delete mode 100644 src/app/xapian/rmmxapianapi.ts diff --git a/package-lock.json b/package-lock.json index 81067f782..fb0d438f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4793,12 +4793,6 @@ "through": ">=2.2.7 <3" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -4885,12 +4879,6 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "angular-calendar": { "version": "0.29.0-beta.1", "resolved": "https://registry.npmjs.org/angular-calendar/-/angular-calendar-0.29.0-beta.1.tgz", @@ -5026,16 +5014,6 @@ "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "arg": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", @@ -5079,12 +5057,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "array-flat-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz", @@ -5228,12 +5200,6 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -5403,24 +5369,6 @@ "object.assign": "^4.1.0" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -5547,15 +5495,6 @@ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "blocking-proxy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", @@ -5939,24 +5878,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -6537,12 +6458,6 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -7157,15 +7072,6 @@ } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -7581,12 +7487,6 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -8262,57 +8162,6 @@ } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -8643,12 +8492,6 @@ } } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", @@ -8768,12 +8611,6 @@ } } }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -8831,15 +8668,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -9493,86 +9321,12 @@ } } }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", @@ -9590,12 +9344,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -9651,42 +9399,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -9696,15 +9408,6 @@ "is-glob": "^4.0.1" } }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - } - }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -9742,17 +9445,6 @@ } } }, - "globule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.0.tgz", - "integrity": "sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", @@ -9840,12 +9532,6 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -10226,12 +9912,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -10368,12 +10048,6 @@ "ipaddr.js": "^1.9.0" } }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -10545,21 +10219,6 @@ "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -10571,12 +10230,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "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", @@ -10691,18 +10344,6 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -10754,12 +10395,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -11035,12 +10670,6 @@ } } }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11669,45 +11298,6 @@ } } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -11891,16 +11481,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -11971,12 +11551,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", @@ -11997,12 +11571,6 @@ "resolved": "https://registry.npmjs.org/material-design-icons/-/material-design-icons-3.0.1.tgz", "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78=" }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -12036,24 +11604,6 @@ "readable-stream": "^2.0.1" } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -12397,651 +11947,66 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "ngmakelib": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/ngmakelib/-/ngmakelib-0.2.6.tgz", - "integrity": "sha512-/osi6KbSCr+Tu3epUd+QOyUpYvLyqnhfcs3urunC8ceAt/zdrm9CxDSSc6yKbX4l+r04ZdT1XowNir4JgKvCAA==", - "dev": true, - "requires": { - "@angular/compiler-cli": "^9.1.7", - "cpx": "^1.5.0", - "node-sass": "^4.14.1", - "rollup": "^0.50.0", - "shelljs": "^0.7.8" - }, - "dependencies": { - "@angular/compiler-cli": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.7.tgz", - "integrity": "sha512-8HT8+UuSohrXlF90eewG2XuhtOEIfJ2UlijnSB10/+ZyroSdTKckoiFSps86nTd/EfrBblqNUMbwjOxIkzac3w==", - "dev": true, - "requires": { - "canonical-path": "1.0.0", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", - "source-map": "^0.6.1", - "sourcemap-codec": "^1.4.8", - "yargs": "15.3.0" - }, - "dependencies": { - "yargs": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", - "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.0" - } - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cpx": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", - "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.2", - "chokidar": "^1.6.0", - "duplexer": "^0.1.1", - "glob": "^7.0.5", - "glob2base": "^0.0.12", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "resolve": "^1.1.7", - "safe-buffer": "^5.0.1", - "shell-quote": "^1.6.1", - "subarg": "^1.0.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", - "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -13065,45 +12030,6 @@ "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - } - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -13160,15 +12086,6 @@ } } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -16819,18 +15736,6 @@ "path-key": "^2.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -17035,16 +15940,6 @@ "es-abstract": "^1.5.1" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -17400,35 +16295,6 @@ "safe-buffer": "^5.1.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -18311,12 +17177,6 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "pretty-bytes": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", @@ -18495,12 +17355,6 @@ "event-stream": "=3.3.4" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", @@ -18619,25 +17473,6 @@ "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", "dev": true }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -18734,67 +17569,6 @@ "util-promisify": "^2.1.0" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -18833,36 +17607,6 @@ "readable-stream": "^2.0.2" } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - } - } - }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -18899,15 +17643,6 @@ "private": "^0.1.8" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -19064,15 +17799,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -19240,12 +17966,6 @@ "inherits": "^2.0.1" } }, - "rollup": { - "version": "0.50.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.50.1.tgz", - "integrity": "sha512-XwrnqjSTk+yR8GbP6hiJuVe83MVmBw/gm4P3qP34A10fRXvv6ppl0ZUg1+Pj1tIZSR/aw5ZaILLEiVxwXIAdAw==", - "dev": true - }, "rrule": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.4.tgz", @@ -19277,9 +17997,7 @@ } }, "runbox-searchindex": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/runbox-searchindex/-/runbox-searchindex-0.1.0.tgz", - "integrity": "sha512-eTJQx6vMjr7yfu0zSfpAd3tJ/BF0ST0h8FtDtEBr5Ejhg/Dv5QlDi43FsdBhLp29lujcLH8d12wz9+S7KU/JpA==" + "version": "file:../runbox-searchindex/dist" }, "rxjs": { "version": "6.5.5", @@ -19389,27 +18107,6 @@ } } }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -19643,23 +18340,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -20394,15 +19074,6 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -20776,15 +19447,6 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, "style-loader": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", @@ -20869,15 +19531,6 @@ "when": "~3.6.x" } }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -21186,21 +19839,6 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, "ts-loader": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.2.tgz", @@ -22359,27 +20997,6 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } - } - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/package.json b/package.json index fed11858a..3fb6a5788 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,7 @@ "start-e2e-server": "start-test mockserver 15000 start-use-mockserver", "run-cypress-tests": "cypress run", "cypress-e2e": "start-test start-e2e-server 4201 run-cypress-tests", - "ci-tests": "node run-ci-tests.js", - "lib": "node ngmakelib-conf.js", - "libwatch": "node ngmakelib-conf.js --watch", - "publishlib": "cd .ngmakelibtmp/dist && npm publish" + "ci-tests": "node run-ci-tests.js" }, "dependencies": { "@angular/animations": "9.0.0", @@ -57,7 +54,7 @@ "moment-timezone": "^0.5.28", "npm": "^6.14.5", "rrule": "^2.6.4", - "runbox-searchindex": "^0.1.0", + "runbox-searchindex": "file:../runbox-searchindex/dist", "rxjs": "^6.5.5", "rxjs-compat": "^6.5.5", "tinymce": "^5.2.2", @@ -83,7 +80,6 @@ "karma-firefox-launcher": "^1.3.0", "karma-jasmine": "~2.0.1", "karma-jasmine-html-reporter": "^1.5.3", - "ngmakelib": "^0.2.6", "protractor": "^7.0.0", "start-server-and-test": "^1.11.0", "ts-loader": "^6.2.2", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 0c519a1cf..98a609f46 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -30,19 +30,17 @@ import { MatIconRegistry } from '@angular/material/icon'; import { MatSidenav } from '@angular/material/sidenav'; import { MatSnackBar } from '@angular/material/snack-bar'; import { MoveMessageDialogComponent } from './actions/movemessage.action'; -import { Router, RouterOutlet, ActivatedRoute, NavigationEnd } from '@angular/router'; +import { Router, ActivatedRoute, NavigationEnd } from '@angular/router'; import { DomSanitizer } from '@angular/platform-browser'; import { HttpClient } from '@angular/common/http'; -import { MessageTableRow, MessageTableRowTool } from './messagetable/messagetablerow'; import { MessageListService } from './rmmapi/messagelist.service'; -import { MessageInfo } from './xapian/messageinfo'; -import { InfoDialog, InfoParams } from './dialog/info.dialog'; -import { RunboxMe, RunboxWebmailAPI, FolderListEntry, MessageFlagChange } from './rmmapi/rbwebmail'; +import { MessageInfo } from 'runbox-searchindex/messageinfo'; +import { RunboxWebmailAPI, FolderListEntry, MessageFlagChange } from './rmmapi/rbwebmail'; import { DraftDeskService } from './compose/draftdesk.service'; import { RMM7MessageActions } from './mailviewer/rmm7messageactions'; import { FolderListComponent, CreateFolderEvent, RenameFolderEvent, MoveFolderEvent } from './folder/folder.module'; -import { SimpleInputDialog, SimpleInputDialogParams, ProgressDialog } from './dialog/dialog.module'; -import { map, first, take, skip, bufferCount, mergeMap, filter, tap, throttleTime , debounceTime } from 'rxjs/operators'; +import { ProgressDialog } from './dialog/dialog.module'; +import { map, take, skip, bufferCount, mergeMap, filter, tap, throttleTime , debounceTime } from 'rxjs/operators'; import { ConfirmDialog } from './dialog/confirmdialog.component'; import { WebSocketSearchService } from './websocketsearch/websocketsearch.service'; import { WebSocketSearchMailRow } from './websocketsearch/websocketsearchmailrow.class'; diff --git a/src/app/common/mailaddressinfo.spec.ts b/src/app/common/mailaddressinfo.spec.ts deleted file mode 100644 index d378aab79..000000000 --- a/src/app/common/mailaddressinfo.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -// --------- BEGIN RUNBOX LICENSE --------- -// Copyright (C) 2016-2020 Runbox Solutions AS (runbox.com). -// -// This file is part of Runbox 7. -// -// Runbox 7 is free software: You can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the -// Free Software Foundation, either version 3 of the License, or (at your -// option) any later version. -// -// Runbox 7 is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Runbox 7. If not, see . -// ---------- END RUNBOX LICENSE ---------- - -import { MailAddressInfo } from '../common/mailaddressinfo'; - -describe('MailAddressInfo', () => { - it('Construct with name and email', () => { - const ma = new MailAddressInfo('Test', 'test1@runbox.com'); - expect(ma.name).toBe('Test'); - expect(ma.address).toBe('test1@runbox.com'); - expect(ma.nameAndAddress).toBe('"Test" '); - }); - it('Parse single email address', () => { - const ma = MailAddressInfo.parse('test1@runbox.com'); - expect(ma[0].name).toBe(null); - expect(ma[0].address).toBe('test1@runbox.com'); - expect(ma[0].nameAndAddress).toBe('test1@runbox.com'); - }); - it('Parse full single address', () => { - const ma = MailAddressInfo.parse('"Test" '); - expect(ma[0].name).toBe('Test'); - expect(ma[0].address).toBe('test1@runbox.com'); - expect(ma[0].nameAndAddress).toBe('"Test" '); - }); - it('Parse full single address, no quotes', () => { - const ma = MailAddressInfo.parse('Test '); - expect(ma[0].name).toBe('Test'); - expect(ma[0].address).toBe('test1@runbox.com'); - expect(ma[0].nameAndAddress).toBe('"Test" '); - }); - it('Parse address list', () => { - const ma_list = MailAddressInfo.parse('test1@runbox.com,test2@runbox.com'); - expect(ma_list[0].name).toBe(null); - expect(ma_list[0].address).toBe('test1@runbox.com'); - expect(ma_list[0].nameAndAddress).toBe('test1@runbox.com'); - expect(ma_list[1].name).toBe(null); - expect(ma_list[1].address).toBe('test2@runbox.com'); - expect(ma_list[1].nameAndAddress).toBe('test2@runbox.com'); - }); - it('Parse empty names address', () => { - const ma_list = MailAddressInfo.parse('"" '); - expect(ma_list[0].name).toBe(''); - expect(ma_list[0].address).toBe('test1@runbox.com'); - expect(ma_list[0].nameAndAddress).toBe('test1@runbox.com'); - }); - it('Parse full address list', () => { - const ma_list = MailAddressInfo.parse('"Test1" , "Test2" '); - expect(ma_list[0].name).toBe('Test1'); - expect(ma_list[0].address).toBe('test1@runbox.com'); - expect(ma_list[0].nameAndAddress).toBe('"Test1" '); - expect(ma_list[1].name).toBe('Test2'); - expect(ma_list[1].address).toBe('test2@runbox.com'); - expect(ma_list[1].nameAndAddress).toBe('"Test2" '); - }); -}); diff --git a/src/app/common/mailaddressinfo.ts b/src/app/common/mailaddressinfo.ts deleted file mode 100644 index bcf8333ca..000000000 --- a/src/app/common/mailaddressinfo.ts +++ /dev/null @@ -1,81 +0,0 @@ -// --------- BEGIN RUNBOX LICENSE --------- -// Copyright (C) 2016-2018 Runbox Solutions AS (runbox.com). -// -// This file is part of Runbox 7. -// -// Runbox 7 is free software: You can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the -// Free Software Foundation, either version 3 of the License, or (at your -// option) any later version. -// -// Runbox 7 is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Runbox 7. If not, see . -// ---------- END RUNBOX LICENSE ---------- - -export class MailAddressInfo { - nameAndAddress: string; - - constructor(public name: string, public address: string) { - this.nameAndAddress = name ? `"${name}" <${address}>` : address; - } - - public static parse(mailaddr: string): MailAddressInfo[] { - const ret: MailAddressInfo[] = []; - let namePart = false; - let addrPart = false; - let lastStart = 0; - let name: string = null; - let addr: string = null; - for (let n = 0; n < mailaddr.length; n++) { - const ch = mailaddr.charAt(n); - - switch (ch) { - case '"': - namePart = !namePart; - - if (namePart) { - lastStart = n + 1; - } else { - name = mailaddr.substring(lastStart, n).trim(); - } - break; - case ',': - if (!namePart) { - if (!addr) { - addr = mailaddr.substring(lastStart, n).trim(); - } - ret.push(new MailAddressInfo(name, addr)); - addr = null; - name = null; - lastStart = n + 1; - } - break; - case '<': - if (!namePart) { - addrPart = true; - if (name == null) { - name = mailaddr.substring(lastStart, n).trim(); - } - lastStart = n + 1; - } - break; - case '>': - if (!namePart) { - addrPart = false; - addr = mailaddr.substring(lastStart, n).trim(); - } - break; - } - } - if (!addr) { - addr = mailaddr.substring(lastStart, mailaddr.length).trim(); - } - ret.push(new MailAddressInfo(name, addr)); - return ret; - } -} diff --git a/src/app/compose/compose.component.ts b/src/app/compose/compose.component.ts index c857a3674..5051dc79c 100644 --- a/src/app/compose/compose.component.ts +++ b/src/app/compose/compose.component.ts @@ -31,14 +31,13 @@ import { DraftDeskService, DraftFormModel } from './draftdesk.service'; import { HttpClient, HttpEventType, HttpHeaders, HttpRequest } from '@angular/common/http'; import { FormGroup, FormBuilder } from '@angular/forms'; -import { debounceTime, mergeMap, filter } from 'rxjs/operators'; +import { debounceTime, mergeMap } from 'rxjs/operators'; import { DialogService } from '../dialog/dialog.service'; import { TinyMCEPlugin } from '../rmm/plugin/tinymce.plugin'; import { RecipientsService } from './recipients.service'; import { isValidEmailArray } from './emailvalidator'; -import { MailAddressInfo } from '../common/mailaddressinfo'; -import { AppSettings, AppSettingsService } from '../app-settings'; -import { StorageService } from '../storage.service'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; +import { AppSettingsService } from '../app-settings'; declare const tinymce: any; declare const MailParser; diff --git a/src/app/compose/draftdesk.service.spec.ts b/src/app/compose/draftdesk.service.spec.ts index 2f8b74830..b80c700df 100644 --- a/src/app/compose/draftdesk.service.spec.ts +++ b/src/app/compose/draftdesk.service.spec.ts @@ -19,7 +19,7 @@ import {DraftFormModel} from './draftdesk.service'; import { FromAddress } from '../rmmapi/from_address'; -import { MailAddressInfo } from '../common/mailaddressinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; describe('DraftDesk', () => { diff --git a/src/app/compose/draftdesk.service.ts b/src/app/compose/draftdesk.service.ts index 91049255d..c6e11bfd2 100644 --- a/src/app/compose/draftdesk.service.ts +++ b/src/app/compose/draftdesk.service.ts @@ -20,8 +20,8 @@ import { Injectable } from '@angular/core'; import { RunboxWebmailAPI } from '../rmmapi/rbwebmail'; import { FromAddress } from '../rmmapi/from_address'; -import { MessageInfo } from '../xapian/messageinfo'; -import { MailAddressInfo } from '../common/mailaddressinfo'; +import { MessageInfo } from 'runbox-searchindex/messageinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; import { Observable, from, of, AsyncSubject } from 'rxjs'; import { map, mergeMap, bufferCount, take } from 'rxjs/operators'; diff --git a/src/app/compose/emailvalidator.ts b/src/app/compose/emailvalidator.ts index 84ca33ef4..fa5215726 100644 --- a/src/app/compose/emailvalidator.ts +++ b/src/app/compose/emailvalidator.ts @@ -17,7 +17,7 @@ // along with Runbox 7. If not, see . // ---------- END RUNBOX LICENSE ---------- -import { MailAddressInfo } from '../common/mailaddressinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; const EMAIL_REGEXP = // tslint:disable-next-line:max-line-length diff --git a/src/app/compose/mailrecipientinput.component.ts b/src/app/compose/mailrecipientinput.component.ts index dbf21d13f..5a487342c 100644 --- a/src/app/compose/mailrecipientinput.component.ts +++ b/src/app/compose/mailrecipientinput.component.ts @@ -27,7 +27,7 @@ import { ENTER } from '@angular/cdk/keycodes'; import { debounceTime } from 'rxjs/operators'; import { RecipientsService } from './recipients.service'; import { Recipient } from './recipient'; -import { MailAddressInfo } from '../common/mailaddressinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; import { isValidEmailArray } from './emailvalidator'; const COMMA = 188; diff --git a/src/app/compose/recipients.service.spec.ts b/src/app/compose/recipients.service.spec.ts index 21ddd79d6..de747f292 100644 --- a/src/app/compose/recipients.service.spec.ts +++ b/src/app/compose/recipients.service.spec.ts @@ -25,11 +25,11 @@ import { SearchService } from '../xapian/searchservice'; import { StorageService } from '../storage.service'; import { AsyncSubject, of, Subject } from 'rxjs'; import { take } from 'rxjs/operators'; -import { XapianAPI } from '../xapian/rmmxapianapi'; +import { XapianAPI } from 'runbox-searchindex/rmmxapianapi'; import { xapianLoadedSubject } from '../xapian/xapianwebloader'; import { Contact } from '../contacts-app/contact'; import { RunboxWebmailAPI } from '../rmmapi/rbwebmail'; -import { MailAddressInfo } from '../common/mailaddressinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; declare var FS; declare var MEMFS; diff --git a/src/app/compose/recipients.service.ts b/src/app/compose/recipients.service.ts index eed7278b8..e9d25c668 100644 --- a/src/app/compose/recipients.service.ts +++ b/src/app/compose/recipients.service.ts @@ -23,7 +23,7 @@ import { SearchService } from '../xapian/searchservice'; import { ContactsService } from '../contacts-app/contacts.service'; import { ContactKind, Contact } from '../contacts-app/contact'; import { isValidEmail } from './emailvalidator'; -import { MailAddressInfo } from '../common/mailaddressinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; import { Recipient } from './recipient'; import { RunboxWebmailAPI } from '../rmmapi/rbwebmail'; import * as moment from 'moment'; diff --git a/src/app/lib.module.ts b/src/app/lib.module.ts deleted file mode 100644 index 2fa4c2636..000000000 --- a/src/app/lib.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -// --------- BEGIN RUNBOX LICENSE --------- -// Copyright (C) 2016-2018 Runbox Solutions AS (runbox.com). -// -// This file is part of Runbox 7. -// -// Runbox 7 is free software: You can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the -// Free Software Foundation, either version 3 of the License, or (at your -// option) any later version. -// -// Runbox 7 is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Runbox 7. If not, see . -// ---------- END RUNBOX LICENSE ---------- - -/** - * Code for exporting to the library module (for reuse on the server) - */ - -export * from './xapian/downloadablesearchindexmap.class'; -export * from './xapian/messageinfo'; -export * from './messagetable/messagetablerow'; -export * from './xapian/rmmxapianapi'; diff --git a/src/app/popular-recipients/popular-recipients.component.spec.ts b/src/app/popular-recipients/popular-recipients.component.spec.ts index a974f755a..5d000e39c 100644 --- a/src/app/popular-recipients/popular-recipients.component.spec.ts +++ b/src/app/popular-recipients/popular-recipients.component.spec.ts @@ -25,7 +25,7 @@ import { MatIconModule } from '@angular/material/icon'; import { PopularRecipientsComponent } from './popular-recipients.component'; import { RecipientsService } from '../compose/recipients.service'; -import { MailAddressInfo } from '../common/mailaddressinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; import { of } from 'rxjs'; diff --git a/src/app/rmmapi/messagelist.service.ts b/src/app/rmmapi/messagelist.service.ts index c8033980a..0e5005ae3 100644 --- a/src/app/rmmapi/messagelist.service.ts +++ b/src/app/rmmapi/messagelist.service.ts @@ -17,16 +17,18 @@ // along with Runbox 7. If not, see . // ---------- END RUNBOX LICENSE ---------- -import {throwError as observableThrowError, BehaviorSubject , Observable, ReplaySubject } from 'rxjs'; -import { distinctUntilChanged } from 'rxjs/operators'; import { Injectable } from '@angular/core'; + +import { throwError as observableThrowError, BehaviorSubject, ReplaySubject } from 'rxjs'; +import { catchError, distinctUntilChanged, map, filter, take } from 'rxjs/operators'; + +import { MessageInfo } from 'runbox-searchindex/messageinfo'; + import { RunboxWebmailAPI, FolderListEntry } from './rbwebmail'; import { SearchService } from '../xapian/searchservice'; -import { MessageInfo } from '../xapian/messageinfo'; import { AppComponent } from '../app.component'; import { CanvasTableColumn } from '../canvastable/canvastable'; import { MessageTableRowTool } from '../messagetable/messagetablerow'; -import { catchError, map, filter, take } from 'rxjs/operators'; export class FolderMessageCountEntry { constructor( diff --git a/src/app/rmmapi/rbwebmail.ts b/src/app/rmmapi/rbwebmail.ts index adf8d7543..2f44a3aba 100644 --- a/src/app/rmmapi/rbwebmail.ts +++ b/src/app/rmmapi/rbwebmail.ts @@ -18,11 +18,10 @@ // ---------- END RUNBOX LICENSE ---------- import { Injectable, NgZone } from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable , of, from , Subject , AsyncSubject } from 'rxjs'; +import { Observable, of, Subject, AsyncSubject } from 'rxjs'; import { share } from 'rxjs/operators'; -import { MessageInfo } from '../xapian/messageinfo'; -import { MailAddressInfo } from './../common/mailaddressinfo'; +import { MessageInfo } from 'runbox-searchindex/messageinfo'; +import { MailAddressInfo } from 'runbox-searchindex/mailaddressinfo'; import { Contact } from '../contacts-app/contact'; import { RunboxCalendar } from '../calendar-app/runbox-calendar'; @@ -31,13 +30,10 @@ import { Product } from '../account-app/product'; import { DraftFormModel } from '../compose/draftdesk.service'; import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; -import { catchError, map, mergeMap, tap, bufferCount } from 'rxjs/operators'; +import { map, mergeMap, tap } from 'rxjs/operators'; -import { ProgressDialog } from '../dialog/dialog.module'; import { HttpClient, HttpResponse } from '@angular/common/http'; import { RunboxLocale } from '../rmmapi/rblocale'; -import { ProgressSnackbarComponent } from '../dialog/progresssnackbar.component'; -import { Profile } from '../profiles/profile'; import { RMM } from '../rmm'; import { FromAddress } from './from_address'; diff --git a/src/app/xapian/downloadablesearchindexmap.class.ts b/src/app/xapian/downloadablesearchindexmap.class.ts deleted file mode 100644 index feb3d30c0..000000000 --- a/src/app/xapian/downloadablesearchindexmap.class.ts +++ /dev/null @@ -1,35 +0,0 @@ -// --------- BEGIN RUNBOX LICENSE --------- -// Copyright (C) 2016-2018 Runbox Solutions AS (runbox.com). -// -// This file is part of Runbox 7. -// -// Runbox 7 is free software: You can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the -// Free Software Foundation, either version 3 of the License, or (at your -// option) any later version. -// -// Runbox 7 is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Runbox 7. If not, see . -// ---------- END RUNBOX LICENSE ---------- - -export class DownloadablePartitionFile { - filename: string; - compressedsize: number; - uncompressedsize: number; - downloaded?: number; -} - -export class DownloadablePartition { - numberOfMessages: number; - folder: string; - files: DownloadablePartitionFile[]; -} - -export class DownloadableSearchIndexMap { - partitions: DownloadablePartition[] = []; -} diff --git a/src/app/xapian/indexer.ts b/src/app/xapian/indexer.ts index 2f5b8794f..f42797e12 100644 --- a/src/app/xapian/indexer.ts +++ b/src/app/xapian/indexer.ts @@ -17,8 +17,8 @@ // along with Runbox 7. If not, see . // ---------- END RUNBOX LICENSE ---------- -import { XapianAPI } from './rmmxapianapi'; -import { MessageInfo, IndexingTools } from './messageinfo'; +import { XapianAPI } from 'runbox-searchindex/rmmxapianapi'; +import { MessageInfo, IndexingTools } from 'runbox-searchindex/messageinfo'; import { Subject } from 'rxjs'; declare var IDBFS; diff --git a/src/app/xapian/messageinfo.spec.ts b/src/app/xapian/messageinfo.spec.ts deleted file mode 100644 index 683a5f918..000000000 --- a/src/app/xapian/messageinfo.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -// --------- BEGIN RUNBOX LICENSE --------- -// Copyright (C) 2016-2018 Runbox Solutions AS (runbox.com). -// -// This file is part of Runbox 7. -// -// Runbox 7 is free software: You can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the -// Free Software Foundation, either version 3 of the License, or (at your -// option) any later version. -// -// Runbox 7 is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Runbox 7. If not, see . -// ---------- END RUNBOX LICENSE ---------- - -import { MessageInfo, IndexingTools } from './messageinfo'; -import { MailAddressInfo } from '../common/mailaddressinfo'; -import { XapianAPI } from './rmmxapianapi'; - -describe('MessageInfo', () => { - it('testGetSubjectWithoutAbbreviation', () => { - expect(MessageInfo.getSubjectWithoutAbbreviation('Re: Testing the subject')).toBe('Testing the subject'); - expect(MessageInfo.getSubjectWithoutAbbreviation('FWD: Testing the subject')).toBe('Testing the subject'); - expect(MessageInfo.getSubjectWithoutAbbreviation('Re: Fwd: Testing the subject')).toBe('Testing the subject'); - expect(MessageInfo.getSubjectWithoutAbbreviation('SV: Fwd: Test FWD: svar')).toBe('Test FWD: svar'); - expect(MessageInfo.getSubjectWithoutAbbreviation('')).toBe(''); - expect(MessageInfo.getSubjectWithoutAbbreviation(null)).toBe(''); - }); - - it('testAddMessageToIndexWithDeleteFolders', () => { - console.log(`Testing that messages added to specified folders will be deleted`); - const msg = new MessageInfo(1, - new Date(), - new Date(), - 'Spam', - false, - false, - false, - MailAddressInfo.parse('test@example.com'), - MailAddressInfo.parse('test2@example.com'), - [], - [], - 'Test subject', - 'The text', - 50, - false - ); - - let addCalled = false; - let removeCalled = false; - const indexingtools = new IndexingTools({ - addSortableEmailToXapianIndex: () => { - addCalled = true; - }, - - deleteDocumentByUniqueTerm: () => { - removeCalled = true; - } - } as any); - - indexingtools.addMessageToIndex(msg); - expect(addCalled).toBeTruthy(); - addCalled = false; - indexingtools.addMessageToIndex(msg, ['Trash', 'Spam']); - expect(removeCalled).toBeTruthy(); - removeCalled = false; - msg.folder = 'Inbox'; - - indexingtools.addMessageToIndex(msg, ['Trash', 'Spam']); - expect(removeCalled).toBeFalsy(); - expect(addCalled).toBeTruthy(); - }); -}); diff --git a/src/app/xapian/messageinfo.ts b/src/app/xapian/messageinfo.ts deleted file mode 100644 index 190c92f3b..000000000 --- a/src/app/xapian/messageinfo.ts +++ /dev/null @@ -1,172 +0,0 @@ -// --------- BEGIN RUNBOX LICENSE --------- -// Copyright (C) 2016-2018 Runbox Solutions AS (runbox.com). -// -// This file is part of Runbox 7. -// -// Runbox 7 is free software: You can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the -// Free Software Foundation, either version 3 of the License, or (at your -// option) any later version. -// -// Runbox 7 is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Runbox 7. If not, see . -// ---------- END RUNBOX LICENSE ---------- - -import { XapianAPI } from './rmmxapianapi'; -import { MailAddressInfo } from './../common/mailaddressinfo'; - -export class MessageInfo { - deletedFlag: boolean; - - constructor( - public id: number, - public changedDate: Date, - public messageDate: Date, - public folder: string, - public seenFlag: boolean, - public answeredFlag: boolean, - public flaggedFlag: boolean, - public from: MailAddressInfo[], - public to: MailAddressInfo[], - public cc: MailAddressInfo[], - public bcc: MailAddressInfo[], - public subject: string, - public plaintext: string, - public size: number, - public attachment: boolean) { - } - - static getSubjectWithoutAbbreviation(subject: string) { - const emailsubjectabbreviations = [ - 'RE:', - 'Re:', - 'FWD:', - 'Fwd:', - 'Fw:', - 'SV:', - 'VS:', - 'VB:' - ]; - const subjectparts = subject ? subject.split(' ') : []; - let subjectTextStart = 0; - while (emailsubjectabbreviations.find(abbr => abbr === subjectparts[subjectTextStart])) { - subjectTextStart ++; - } - return subjectparts.slice(subjectTextStart).join(' '); - } -} - -export class IndexingTools { - - constructor(private indexAPI: XapianAPI) { - - } - - public hashCode(str: string): number { - let hash = 0; - if (!str || str.length === 0) { - return hash; - } - - for (let i = 0; i < str.length; i++) { - const char = str.charCodeAt(i); - // tslint:disable-next-line:no-bitwise - hash = ((hash << 5) - hash) + char; - // tslint:disable-next-line:no-bitwise - hash = hash & hash; // Convert to 32bit integer - } - return hash; - } - - public markMessageSeen(messageId: number, seenFlag: boolean) { - try { - if (seenFlag === true) { - this.indexAPI.addTermToDocument(`Q${messageId}`, 'XFseen'); - } else if (seenFlag === false) { - this.indexAPI.removeTermFromDocument(`Q${messageId}`, 'XFseen'); - } - } catch (e) { - console.error(e); - } - } - - public flagMessage(messageId: number, flag: boolean) { - try { - if (flag === true) { - this.indexAPI.addTermToDocument(`Q${messageId}`, 'XFflagged'); - } else if (flag === false) { - this.indexAPI.removeTermFromDocument(`Q${messageId}`, 'XFflagged'); - } - } catch (e) { - console.error(e); - } - } - - public addMessageToIndex(msginfo: MessageInfo, - foldersNotToIndex?: string[] - ) { - if ( - foldersNotToIndex && foldersNotToIndex.find(foldername => - msginfo.folder === foldername) - ) { - this.indexAPI.deleteDocumentByUniqueTerm('Q' + msginfo.id); - console.log('Deleted msg id search index', msginfo.id); - return; - } - - let conversationId = msginfo.subject ? msginfo.subject.toUpperCase() : '0'; - - const beforeSubjectAbbreviationRemoval = conversationId; - - // Remove email subject abbreviation (Re fwd etc) - conversationId = MessageInfo.getSubjectWithoutAbbreviation(conversationId); - const afterSubjectAbbreviationRemoval: string = conversationId; - - let recipients = []; - - if (msginfo.to) { - recipients = recipients.concat(msginfo.to.map((mailAddr) => mailAddr.nameAndAddress.substr(0, 200))); - } - if (msginfo.cc) { - recipients = recipients.concat(msginfo.cc.map((mailAddr) => mailAddr.nameAndAddress.substr(0, 200))); - } - - // Remove non alphanumeric characters so that it's possible to use Xapian range processor - conversationId = conversationId.replace(/[^0-9A-Z]/g, ''); - - // Add last word hash to conversation id - const lastWordHash = msginfo.plaintext ? this.hashCode(msginfo.plaintext.split(/\s/) - .reverse() - .find((word) => word.replace(/[^a-z0-9]+/ig, '').trim().length >= 3)) : 0; - conversationId += '' + (0x100000000 + lastWordHash).toString(16).substr(1).toUpperCase(); - - const msgDateString = msginfo.messageDate.toJSON().substr(0, 'YYYY-MM-DD HH:mm'.length).replace(/[^0-9]/g, ''); - - const fromAddressInfo = msginfo.from && msginfo.from[0] ? msginfo.from[0] : new MailAddressInfo('', ''); - const visibleFrom = fromAddressInfo.name ? fromAddressInfo.name : fromAddressInfo.address ? fromAddressInfo.address : ''; - - // console.log(conversationId); - this.indexAPI.addSortableEmailToXapianIndex( - 'Q' + msginfo.id, - visibleFrom, - visibleFrom.toUpperCase(), - fromAddressInfo.address, - recipients, - msginfo.subject, - conversationId, - msgDateString, - msginfo.size, - msginfo.plaintext ? msginfo.plaintext : '', - msginfo.folder, - msginfo.seenFlag, - msginfo.flaggedFlag, - msginfo.answeredFlag, - msginfo.attachment - ); - } -} diff --git a/src/app/xapian/rmmxapianapi.ts b/src/app/xapian/rmmxapianapi.ts deleted file mode 100644 index 2d6cd5c0e..000000000 --- a/src/app/xapian/rmmxapianapi.ts +++ /dev/null @@ -1,273 +0,0 @@ -// --------- BEGIN RUNBOX LICENSE --------- -// Copyright (C) 2016-2018 Runbox Solutions AS (runbox.com). -// -// This file is part of Runbox 7. -// -// Runbox 7 is free software: You can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the -// Free Software Foundation, either version 3 of the License, or (at your -// option) any later version. -// -// Runbox 7 is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Runbox 7. If not, see . -// ---------- END RUNBOX LICENSE ---------- - -declare var Module; - -const emAllocateString = function (str) { - if (!str) { - str = ''; - } - - const $str = Module._malloc(str.length * 4 + 1); - Module.stringToUTF8(str, $str, str.length * 4 + 1); - return $str; -}; - -export class XapianAPI { - - public initXapianIndex: (path: string) => void = Module.cwrap('initXapianIndex', null, ['string']); - public initXapianIndexReadOnly: (path: string) => void = Module.cwrap('initXapianIndexReadOnly', null, ['string']); - public addSingleFileXapianIndex: (path: string) => void = Module.cwrap('addSingleFileXapianIndex', null, ['string']); - public addFolderXapianIndex: (path: string) => void = Module.cwrap('addFolderXapianIndex', null, ['string']); - public compactDatabase: () => void = Module.cwrap('compactDatabase', null, []); - public compactToWritableDatabase: (path: string) => void = Module.cwrap('compactToWritableDatabase', null, ['string']); - public addToXapianIndex: (id: string, val: string) => void = Module.cwrap('addToXapianIndex', null, ['string', 'string']); - public commitXapianUpdates: () => void = Module.cwrap('commitXapianUpdates', null, []); - public getXapianDocCount: () => number = Module.cwrap('getDocCount', 'number', []); - public getLastDocid: () => number = Module.cwrap('getLastDocid', 'number', []); - public reloadXapianDatabase: () => void = Module.cwrap('reloadDatabase', null, []); - public closeXapianDatabase: () => void = Module.cwrap('closeDatabase', null, []); - public setStringValueRange: (valuenumber: number, prefix: string) => - void = Module.cwrap('setStringValueRange', null, ['number', 'string']); - public clearValueRange: () => void = Module.cwrap('clearValueRange', null, []); - public getNumericValue: (docid: number, slot: number) => number = Module.cwrap('getNumericValue', 'number', ['number', 'number']); - public termlist: (prefix: string) => number = Module.cwrap('termlist', 'number', ['string']); - public documentTermList: (docid: number) => number = Module.cwrap('documentTermList', 'number', ['number']); - public documentXTermList: (docid: number) => number = Module.cwrap('documentXTermList', 'number', ['number']); - public deleteDocumentByUniqueTerm: (id: string) => void = Module.cwrap('deleteDocumentByUniqueTerm', null, ['string']); - public deleteDocumentFromAddedWritablesByUniqueTerm: (id: string) => number = - Module.cwrap('deleteDocumentFromAddedWritablesByUniqueTerm', 'number', ['string']); - public setStringValue: (docid: number, slot: number, val: string) => void = - Module.cwrap('setStringValue', null, ['number', 'number', 'string']); - public changeDocumentsFolder: (unique_term: string, folder: string) => - void = Module.cwrap('changeDocumentsFolder', null, ['string', 'string']); - public addTermToDocument: (idterm: string, termname: string) => void = Module.cwrap('addTermToDocument', null, ['string', 'string']); - public removeTermFromDocument: (idterm: string, termname: string) => void = - Module.cwrap('removeTermFromDocument', null, ['string', 'string']); - public addTextToDocument: (idterm: string, withoutpositions: boolean, text: string) => void = - Module.cwrap('addTextToDocument', null, ['string', 'boolean', 'string']); - public getDocIdFromUniqueIdTerm: (idterm: string) => number = - Module.cwrap('getDocIdFromUniqueIdTerm', 'number', ['string']); - - public getStringValue(docid, slot): string { - const $ret = Module._malloc(1024); - Module._getStringValue(docid, slot, $ret); - const ret = Module.UTF8ToString($ret); - Module._free($ret); - return ret; - } - - public listFolders(): any[] { - const $ret = Module._malloc(8192); - Module._listFolders($ret); - const cret = Module.UTF8ToString($ret); - Module._free($ret); - const ret: any[] = cret.split(','); - ret.forEach((r: string, ndx: number) => { - ret[ndx] = r.split(':'); - ret[ndx][1] = parseInt(ret[ndx][1], 10); - }); - return ret; - } - - public listUnreadFolders(): any[] { - const $ret = Module._malloc(8192); - const folderCount: number = Module._listUnreadFolders($ret); - if (folderCount > 0) { - const cret = Module.UTF8ToString($ret); - Module._free($ret); - const ret: any[] = cret.split(','); - ret.forEach((r: string, ndx: number) => { - ret[ndx] = r.split(':'); - ret[ndx][1] = parseInt(ret[ndx][1], 10); - }); - return ret; - } else { - return []; - } - } - - public queryXapianIndex(querystring, offset, maxresults): Array { - const $searchResults = Module._malloc(4 * maxresults); - Module.HEAP8.set(new Uint8Array(maxresults * 4), $searchResults); - - const $queryString = emAllocateString(querystring); - const $resultIdTerm = Module._malloc(128); - - const hits = Module._queryIndex($queryString, $searchResults, offset, maxresults); - // console.log(hits); - const results = new Array(hits); - for (let n = 0; n < hits; n++) { - const docid = Module.getValue($searchResults + (n * 4), 'i32'); - Module._getDocumentData(docid, $resultIdTerm); - results[n] = Module.UTF8ToString($resultIdTerm); - } - Module._free($searchResults); - Module._free($queryString); - Module._free($resultIdTerm); - return results; - - } - - public sortedXapianQuery(querystring: string, - sortcol: number, - reverse: number, - offset: number, - maxresults: number, - collapsecol: number): Array { - const $searchResults = Module._malloc(4 * maxresults); - const $collapseCount = Module._malloc(4 * maxresults); - - Module.HEAP8.set(new Uint8Array(maxresults * 4), $searchResults); - Module.HEAP8.set(new Uint8Array(maxresults * 4), $collapseCount); - - const $queryString = emAllocateString(querystring); - - const hits = Module._sortedXapianQuery($queryString, sortcol, reverse, $searchResults, offset, maxresults, collapsecol, $collapseCount); - // console.log("Sorted xapian query returned "+hits); - - const results = new Array(hits); - for (let n = 0; n < hits; n++) { - results[n] = [ - Module.getValue($searchResults + (n * 4), 'i32'), - Module.getValue($collapseCount + (n * 4), 'i32') - ]; - - } - Module._free($collapseCount); - Module._free($searchResults); - Module._free($queryString); - return results; - } - - public getDocumentData(docid) { - const $docdata = Module._malloc(1024); - Module._getDocumentData(docid, $docdata); - const ret = Module.UTF8ToString($docdata); - Module._free($docdata); - return ret; - } - - public addSortableEmailToXapianIndex( - idTerm, // Message id - sender, // from (name or email address if no name is present) - sortableFrom, // e.g. uppercase of the field above - fromEmailAddress, - recipients, // Array of strings with recipient email addresses - subject, - sortableSubject, // Uppercase of subject - dateString, // Datestring (YYYYMMDDHHmm) - messageSize, // mail message size in bytes - text, // mail text content (may also add attachment text here) - folder: string, - seen: boolean, // seen_flag (0 if unread, 1 if read) - flagged: boolean, // seen_flag (0 if unread, 1 if read) - answered: boolean, // seen_flag (0 if unread, 1 if read) - attachment: boolean // (0 if no attachments, 1 if message has attachments) - ) { - let $pointerPtr = 0; - - let pointers; - if (recipients) { - pointers = new Uint32Array(recipients.length); - for (let n = 0; n < recipients.length; n++) { - const recp = recipients[n]; - - const $recp = Module._malloc(recp.length * 4 + 1); - Module.stringToUTF8(recp, $recp, recp.length * 4 + 1); - pointers[n] = $recp; - } - - // Allocate bytes needed for the array of pointers - const nPointerBytes = pointers.length * pointers.BYTES_PER_ELEMENT; - $pointerPtr = Module._malloc(nPointerBytes); - - // Copy array of pointers to Emscripten heap - const pointerHeap = new Uint8Array(Module.HEAPU8.buffer, $pointerPtr, nPointerBytes); - pointerHeap.set(new Uint8Array(pointers.buffer)); - - } - - - const $idTerm = emAllocateString(idTerm); - const $sender = emAllocateString(sender); - const $sortableFrom = emAllocateString(sortableFrom); - const $fromEmailAddress = emAllocateString(fromEmailAddress); - const $subject = emAllocateString(subject); - const $sortableSubject = emAllocateString(sortableSubject); - const $dateString = emAllocateString(dateString); - const $text = emAllocateString(text); - const $folder = emAllocateString(folder); - - Module._addSortableEmailToXapianIndex( - $idTerm, - $sender, - $sortableFrom, - $fromEmailAddress, - recipients ? recipients.length : 0, - $pointerPtr, - $subject, - $sortableSubject, - $dateString, - messageSize, - $text, - $folder, - (seen ? 1 : 0) + - (flagged ? 2 : 0) + - (answered ? 4 : 0) + - (attachment ? 8 : 0) - ); - Module._free($folder); - Module._free($text); - Module._free($dateString); - Module._free($sortableSubject); - Module._free($subject); - Module._free($fromEmailAddress); - Module._free($sortableFrom); - Module._free($sender); - Module._free($idTerm); - - if (pointers) { - Module._free($pointerPtr); - - for (let n = pointers.length - 1; n >= 0; n--) { - Module._free(pointers[n]); - } - } - } - - hasMessageId(id: number): boolean { - window['termlistresult'] = []; - this.termlist('Q' + id); - return window['termlistresult'].findIndex(t => t === '') > -1; - } -} - -export class SearchParams { - constructor( - public querystring: string, - public sortcol: number, - public reverse: number, - public offset: number, - public maxresults: number, - public collapsecol: number - ) { - - } -} diff --git a/src/app/xapian/searchservice.spec.ts b/src/app/xapian/searchservice.spec.ts index ae099115c..54fbfc25b 100644 --- a/src/app/xapian/searchservice.spec.ts +++ b/src/app/xapian/searchservice.spec.ts @@ -26,7 +26,7 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MessageListService } from '../rmmapi/messagelist.service'; -import { XapianAPI } from './rmmxapianapi'; +import { XapianAPI } from 'runbox-searchindex/rmmxapianapi'; import { xapianLoadedSubject } from './xapianwebloader'; declare var FS; diff --git a/src/app/xapian/searchservice.ts b/src/app/xapian/searchservice.ts index 46e6636de..91c09e627 100644 --- a/src/app/xapian/searchservice.ts +++ b/src/app/xapian/searchservice.ts @@ -17,26 +17,27 @@ // along with Runbox 7. If not, see . // ---------- END RUNBOX LICENSE ---------- -import {Injectable, NgZone} from '@angular/core'; -import { Observable , AsyncSubject, Subject , of, from } from 'rxjs'; -import { XapianAPI } from './rmmxapianapi'; -import { RunboxWebmailAPI, FolderListEntry } from '../rmmapi/rbwebmail'; -import { MessageInfo, - IndexingTools } from './messageinfo'; +import { Injectable, NgZone } from '@angular/core'; +import { HttpClient, HttpRequest, HttpResponse, HttpEventType } from '@angular/common/http'; +import { MatDialog } from '@angular/material/dialog'; +import { MatSnackBar, MatSnackBarRef } from '@angular/material/snack-bar'; + +import { Observable, AsyncSubject, Subject, of, from } from 'rxjs'; +import { mergeMap, map, filter, catchError, tap, take, bufferCount } from 'rxjs/operators'; + +import { XapianAPI } from 'runbox-searchindex/rmmxapianapi'; +import { DownloadableSearchIndexMap, DownloadablePartition } from 'runbox-searchindex/downloadablesearchindexmap.class'; +import { MessageInfo, IndexingTools } from 'runbox-searchindex/messageinfo'; + +import { RunboxWebmailAPI } from '../rmmapi/rbwebmail'; import { CanvasTableColumn} from '../canvastable/canvastable'; import { AppComponent } from '../app.component'; import { MessageTableRowTool} from '../messagetable/messagetablerow'; -import { MatDialog } from '@angular/material/dialog'; -import { MatSnackBar, MatSnackBarRef } from '@angular/material/snack-bar'; import { ProgressDialog } from '../dialog/progress.dialog'; import { MessageListService, FolderMessageCountEntry } from '../rmmapi/messagelist.service'; -import { mergeMap, map, filter, catchError, tap, take, bufferCount } from 'rxjs/operators'; -import { HttpClient, HttpRequest, HttpResponse, HttpEventType } from '@angular/common/http'; import { ConfirmDialog } from '../dialog/confirmdialog.component'; -import { DownloadableSearchIndexMap, DownloadablePartition } from './downloadablesearchindexmap.class'; import { SyncProgressComponent } from './syncprogress.component'; import { xapianLoadedSubject } from './xapianwebloader'; -import { InfoDialog, InfoParams } from '../dialog/info.dialog'; declare var FS; declare var IDBFS; From af62c83063662288e058824cb59610298f23a16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tadeusz=20So=C5=9Bnierz?= Date: Thu, 6 Aug 2020 18:20:16 +0200 Subject: [PATCH 2/2] feat(folder): Speed up folder size calculations This uses a new, dedicated API from runbox-searchindex 0.2.0 --- package-lock.json | 3 ++- package.json | 2 +- src/app/rmmapi/messagelist.service.ts | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb0d438f0..5bb6bd97f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17997,7 +17997,8 @@ } }, "runbox-searchindex": { - "version": "file:../runbox-searchindex/dist" + "version": "https://registry.npmjs.org/@runbox-tadzik/runbox-searchindex/-/runbox-searchindex-0.2.0.tgz", + "integrity": "sha512-j5wFHYRKUmcAdoU/vMlTQHRbPAv/VjHl1bK2p2yQ5zYxMpuW/Pw7TU1twBciA0qHXlMrhGL0w+S89MkhyT4y0A==" }, "rxjs": { "version": "6.5.5", diff --git a/package.json b/package.json index 3fb6a5788..5615cc24b 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "moment-timezone": "^0.5.28", "npm": "^6.14.5", "rrule": "^2.6.4", - "runbox-searchindex": "file:../runbox-searchindex/dist", + "runbox-searchindex": "https://registry.npmjs.org/@runbox-tadzik/runbox-searchindex/-/runbox-searchindex-0.2.0.tgz", "rxjs": "^6.5.5", "rxjs-compat": "^6.5.5", "tinymce": "^5.2.2", diff --git a/src/app/rmmapi/messagelist.service.ts b/src/app/rmmapi/messagelist.service.ts index 0e5005ae3..7be7bda13 100644 --- a/src/app/rmmapi/messagelist.service.ts +++ b/src/app/rmmapi/messagelist.service.ts @@ -114,8 +114,11 @@ export class MessageListService { const folderCounts = {}; for (const folder of folders) { const path = folder.folderPath; + if (xapianFolders.has(path)) { - folderCounts[path] = this.searchservice.getMessageCountsForFolder(path); + const res = this.searchservice.api.getFolderMessageCounts(folder.folderName); + + folderCounts[path] = new FolderMessageCountEntry(res[1], res[0]); } else { folderCounts[path] = FolderMessageCountEntry.of(folder); }