diff --git a/angular.json b/angular.json deleted file mode 100644 index 754f8c8..0000000 --- a/angular.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "frontcraft": { - "projectType": "application", - "schematics": {}, - "root": "", - "sourceRoot": "src/backend", - "prefix": "app", - "architect": { - "server": { - "builder": "@angular-devkit/build-angular:server", - "options": { - "outputPath": "dist/server", - "main": "src/backend/Launcher.ts", - "tsConfig": "tsconfig.json" - } - } - } - } - }, - "defaultProject": "frontcraft" -} diff --git a/guild.json b/guild.json deleted file mode 100644 index cd5b6bb..0000000 --- a/guild.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "AAA", - "realm": "Gandling EU", - "description": "Wee woo" -} \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index d54feac..0000000 --- a/index.html +++ /dev/null @@ -1 +0,0 @@ -
Spineshatter
Item Level 73

Binds when picked up
Unique
Main HandMace
99 - 184 Damage Speed 2.60
(54.42 damage per second)
+9 Strength
+16 Stamina
Durability 105 / 105
Requires Level 60
Equip: Increased Defense +5.
Sell Price: 12 88 25
Dropped by: Razorgore the Untamed
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3b5e900..d594e8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,9 @@ } }, "@angular/core": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.6.tgz", - "integrity": "sha512-l+BrvPGwtPUh/rQyB9mjtonMsFEAoRHgDYWeQu/QukIZbItNdFqrhewn2zQ8Skx75BpwFLAVIVXp9ioDyvP2eQ==", + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.14.tgz", + "integrity": "sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g==", "requires": { "tslib": "^1.9.0" } @@ -204,194 +204,6 @@ } } }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -406,12 +218,6 @@ "negotiator": "0.6.2" } }, - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -457,24 +263,13 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "app-module-path": { @@ -562,44 +357,6 @@ "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -624,12 +381,6 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -705,12 +456,6 @@ } } }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -726,9 +471,9 @@ "dev": true }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, "bluebird": { @@ -736,12 +481,6 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -810,89 +549,12 @@ } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, "bsert": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/bsert/-/bsert-0.0.10.tgz", @@ -906,35 +568,12 @@ "bsert": "~0.0.10" } }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -1038,25 +677,39 @@ } }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" }, "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1071,6 +724,21 @@ "requires": { "is-extglob": "^2.1.1" } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -1079,25 +747,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "circular-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-1.0.2.tgz", @@ -1231,26 +880,11 @@ "typedarray": "^0.0.6" } }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, "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=" }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -1328,43 +962,6 @@ } } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", @@ -1383,25 +980,6 @@ "which": "^1.2.8" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "crypto-js": { "version": "3.1.9-1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", @@ -1426,12 +1004,6 @@ "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==" }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1552,16 +1124,6 @@ "precinct": "^6.2.0" } }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -1685,17 +1247,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, "dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", @@ -1704,11 +1255,10 @@ "path-type": "^3.0.0" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true + "domino": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.4.tgz", + "integrity": "sha512-l70mlQ7IjPKC8kT7GljQXJZmt5OqFL+RE91ik5y5WWQtsd9wP8R7gpFnNu96fK5MqAAZRXfLLsnzKtkty5fWGQ==" }, "duplexify": { "version": "3.7.1", @@ -1736,21 +1286,6 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "elliptic": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", - "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -1848,16 +1383,6 @@ "source-map": "~0.6.1" } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", @@ -1870,15 +1395,6 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -1896,52 +1412,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2500,618 +1970,11 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": 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" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": false, - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -3188,15 +2051,6 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3260,13 +2114,12 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "^4.0.1" }, "dependencies": { "is-extglob": { @@ -3276,34 +2129,12 @@ "dev": true }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "is-extglob": "^2.1.1" } } } @@ -3437,43 +2268,12 @@ } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -3509,12 +2309,6 @@ "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3523,12 +2317,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", @@ -3558,16 +2346,6 @@ } } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3610,12 +2388,6 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", @@ -3649,12 +2421,12 @@ } }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-buffer": { @@ -3817,12 +2589,6 @@ "integrity": "sha1-CRtGoNZ8HtD+hfH4z93gBrslHUY=", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -3904,12 +2670,6 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3999,15 +2759,6 @@ } } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4033,12 +2784,6 @@ "resolve": "^1.1.7" } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", @@ -4080,12 +2825,12 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { - "chalk": "^2.0.1" + "chalk": "^2.4.2" } }, "log4js": { @@ -4238,21 +2983,6 @@ "kind-of": "^6.0.2" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -4266,33 +2996,11 @@ "object-visit": "^1.0.0" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -4333,16 +3041,6 @@ "to-regex": "^3.0.2" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -4367,18 +3065,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", @@ -4469,9 +3155,9 @@ } }, "mocha": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz", - "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.0.tgz", + "integrity": "sha512-MymHK8UkU0K15Q/zX7uflZgVoRWiTjy0fXE/QjKts6mowUvGxOdPhZ2qj3b0iZdUrNZlW9LAIMFHB4IW+2b3EQ==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -4485,7 +3171,7 @@ "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", - "log-symbols": "2.2.0", + "log-symbols": "3.0.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", @@ -4500,47 +3186,6 @@ "yargs-unparser": "1.6.0" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -4550,22 +3195,6 @@ "ms": "^2.1.1" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -4580,45 +3209,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4634,15 +3224,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", @@ -4651,33 +3232,6 @@ "requires": { "has-flag": "^3.0.0" } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "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.1" - } } } }, @@ -4836,22 +3390,15 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, "nested-error-stacks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "ngx-cookie-service": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-2.4.0.tgz", + "integrity": "sha512-uR/6mCQ1t+XY5G1/irqRhoEddx1PPtmz7JHM/2nn5yQmicnj+n48x8C2PMxwaYDHKRh7QPQ9G5scR36Mmdz09A==" }, "node-environment-flags": { "version": "1.0.6", @@ -4868,54 +3415,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, "node-pre-gyp": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", @@ -4995,15 +3494,6 @@ "npm-normalize-package-bin": "^1.0.1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -5308,28 +3798,11 @@ } } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5344,24 +3817,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", @@ -5390,12 +3845,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, "parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", @@ -5407,20 +3856,6 @@ "readable-stream": "^2.1.5" } }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -5461,18 +3896,6 @@ "util": "^0.10.3" } }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -5488,12 +3911,6 @@ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -5525,19 +3942,6 @@ "pify": "^3.0.0" } }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5707,20 +4111,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -5764,37 +4154,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -5837,14 +4196,12 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.0.4" } }, "rechoir": { @@ -5889,12 +4246,6 @@ "safe-regex": "^1.1.0" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -5976,15 +4327,6 @@ "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, "resolve-dependency-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz", @@ -6012,12 +4354,6 @@ } } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -6051,16 +4387,6 @@ "glob": "^7.1.3" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "rpclibrary": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-1.9.2.tgz", @@ -6226,42 +4552,11 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -6535,16 +4830,6 @@ "graceful-fs": "^4.1.3" } }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -6555,19 +4840,6 @@ "stream-shift": "^1.0.0" } }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", @@ -6773,21 +5045,6 @@ "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -6918,12 +5175,6 @@ "tslib": "^1.9.3" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -7053,12 +5304,6 @@ } } }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, "upgiter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/upgiter/-/upgiter-1.0.4.tgz", @@ -7095,24 +5340,6 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -7158,12 +5385,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, "v8flags": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", @@ -7187,29 +5408,12 @@ "extsprintf": "^1.2.0" } }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, "walkdir": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", "dev": true }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -7219,80 +5423,6 @@ "defaults": "^1.0.3" } }, - "webpack": { - "version": "4.39.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", - "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - } - }, - "webpack-cli": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.7.tgz", - "integrity": "sha512-OhTUCttAsr+IZSMVwGROGRHvT+QAs8H6/mHIl4SvhAwYywjiylYjpwybGx7WQ9Hkb45FhjtsymkwiRRbGJ1SZQ==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -7422,6 +5552,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -7440,22 +5575,21 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "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.0" + "yargs-parser": "^13.1.1" } }, "yargs-parser": { @@ -7477,26 +5611,6 @@ "flat": "^4.1.0", "lodash": "^4.17.15", "yargs": "^13.3.0" - }, - "dependencies": { - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "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.1" - } - } } } } diff --git a/package.json b/package.json index 464d29e..8a3ad01 100644 --- a/package.json +++ b/package.json @@ -4,19 +4,17 @@ "version": "1.0.0", "scripts": { "tsc": "tsc", - "launch": "node dist/server/main.js", + "launch": "node lib/src/backend/Launcher.js", "start": "npm run build && npm run launch", "start-backend": "npm run build-backend && npm run launch", "test": "rm -rf data && npm run build-backend && mocha lib/test/backendTest.js", - "build": "npm run build-backend && npm run build-frontend", - "build-backend": "npm run clean-backend && tsc", - "build-frontend": "npm run clean-frontend && (mkdir static || rm -rf static/*) && npm run build-dashboard", - "build-dashboard": "cd src/frontend && npm i && npm run build && cp -r dist/* ../../static", + "build": "npm run build-frontend && npm run build-backend", + "build-backend": "npm run clean-backend && npm run tsc", + "build-frontend": "npm run clean-frontend && (mkdir dist || rm -rf dist/*) && npm run build-dashboard", + "build-dashboard": "cd src/frontend && npm run build && cp -r dist/* ../../dist", "clean": "rm -rf data && npm run clean-backend && npm run clean-frontend", - "clean-backend": "rm -rf lib plugins config widget .rpt2_cache *.js *.ts", - "clean-frontend": "rm -rf src/frontend/dist static", - "webpack": "webpack --config src/backend/webpack.prod.js --progress --colors", - "setangular": "ng update @angular/cli@8.2.2 @angular/core@8.2.2 @angular/compiler-cli@8.2.2" + "clean-backend": "rm -rf lib plugins config widget .rpt2_cache ", + "clean-frontend": "rm -rf src/frontend/dist dist" }, "repository": { "type": "git", @@ -32,6 +30,7 @@ "circular-buffer": "^1.0.2", "crypto-js": "^3.1.9-1", "debug": "^4.1.1", + "domino": "^2.1.4", "express": "^4.16.4", "frontblock": "^0.15.2", "frontblock-generic": "^0.34.8", @@ -42,6 +41,7 @@ "loadson": "^1.0.0", "log4js": "^4.5.1", "lowdb": "^1.0.0", + "ngx-cookie-service": "^2.4.0", "node-fetch": "^2.6.0", "path": "^0.12.7", "reflect-metadata": "^0.1.13", @@ -54,16 +54,15 @@ "tsyringe": "^4.0.1", "upgiter": "^1.0.4", "uuid": "^3.3.3", - "xml2js": "^0.4.22" + "xml2js": "^0.4.22", + "xmlhttprequest": "^1.8.0" }, "devDependencies": { "madge": "^3.6.0", - "mocha": "^7.0.0", + "mocha": "^7.1.0", "terser-webpack-plugin": "^1.4.1", "ts-loader": "^5.3.3", - "typescript": "^3.5.3", - "webpack": "^4.39.2", - "webpack-cli": "^3.3.5" + "typescript": "^3.5.3" }, "files": [ "lib/**/*" diff --git a/src/backend/Admin/Admin.ts b/src/backend/Admin/Admin.ts index a1a15fe..a94a209 100644 --- a/src/backend/Admin/Admin.ts +++ b/src/backend/Admin/Admin.ts @@ -1,6 +1,6 @@ 'use strict' -import { getLogger } from 'frontblock-generic/Types'; +import { getLogger, Logger, } from "log4js"; import { promises as fs, mkdirSync } from "fs" import { RPCServer } from 'rpclibrary' import * as Path from 'path' @@ -22,12 +22,7 @@ import { Injector } from '../Injector/Injector'; import { Shoutbox } from '../Components/Shoutbox/Shoutbox'; import { PubSub } from '../Components/PubSub/PubSub'; -//import { ngExpressEngine } from '../../frontend/node_modules/@nguniversal/express-engine'; -//import { APP_BASE_HREF } from '../../frontend/'; -//import { AppServerModule } from './app.server.module'; - - -const logger = getLogger("admin", 'debug') +getLogger().level = 'debug' @RootComponent({ injectable: IAdmin, @@ -73,15 +68,15 @@ implements TableDefinitionExporter, IAdmin { await this.makeKnex() this.startWebsocket() await Promise.all( this.frontworkComponents.map(c => c.initialize?c.initialize():undefined )) - logger.debug(this.frontworkComponents.length+" components initialized") - this.startWebserver() + getLogger('Admin#start').debug(this.frontworkComponents.length+" components initialized") + await this.startWebserver() } stop(){ Promise.all([ ...this.frontworkComponents.map(c => c.stop?c.stop():undefined ), ]) - .catch(e => logger.warn(e)) + .catch(e => getLogger('Admin#stop').warn(e)) .finally(() => { this.rpcServer.destroy() process.exit(0) @@ -123,92 +118,56 @@ implements TableDefinitionExporter, IAdmin { ], { visibility: '0.0.0.0' }) - logger.debug("Websocket up on", 20000) + getLogger('Admin#startWebsocket').debug("Websocket up on", 20000) } - private startWebserver(){ + private async startWebserver(){ if(this.httpServer != null || this.express != null){ - logger.warn("Webserver is already running") + getLogger('Admin#startWebserver').warn("Webserver is already running") return } let port:number = this.config.getConfig().httpPort this.express = express() - /* - this.express.engine('html', ngExpressEngine({ - bootstrap: AppServerModule, - })); - - this.express.set('view engine', 'html'); - this.express.set('views', 'static'); - - // Serve static files from /browser - this.express.get('*.*', express.static('static', { - maxAge: '1y' - })); + const distFolder = "../../../../dist" + const ngExpressServer = Path.join(__dirname, distFolder, 'server.js') - this.express.get("/", (request, response) => { - response.status(200) - response.sendFile('index.html'); + this.express.get('*.*', (req, res)=>{ + //console.log('*.*', req.path); + res.sendFile(Path.join(__dirname, distFolder,'browser',decodeURIComponent(req.path))) }) - // All regular routes use the Universal engine - this.express.get('*', (req, res) => { - res.status(301) - res.redirect('/') - //res.render('index', { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] }); - }); -*/ -/* */ - // get the compiled FrontendPlugins.js - this.express.use('/', express.static('static')) + try{ + const req = require(distFolder+"/server.js") + await req.attachExpress(this.express) + getLogger('Admin#startWebserver').info('Frontend from '+ngExpressServer+" loaded") + }catch(e){ + getLogger('Admin#startWebserver').error(e) + getLogger('Admin#startWebserver').warn("No angular SSR module was provided in "+ngExpressServer) + getLogger('Admin#startWebserver').warn("This is not fatal, but your page will not render on *"+port) + } - this.express.get('/plugins/:id'+".js", async (request, response) => { - const pth = Path.resolve("plugins/"+request.params.id, "FrontendPlugin.js"); - const file = await fs.readFile(pth) - const frontend = file.toString() - - response.status(200) - response.set('Content-Type', 'application/javascript') - response.send(frontend) + this.express.listen(port, () => { + getLogger('Admin#startWebserver').info('Admin panel listening for HTTP on *'+port) }) - - // serve the index.html from the static folder - this.express.get("/", (request, response) => { - response.status(200) - response.sendFile('index.html'); - }) - - // redirect all the other traffic to the single page app - this.express.get("*", (request, response) => { - response.status(301) - response.redirect('/') - }) - - this.httpServer = new http.Server(this.express) - this.httpServer.listen(port, () => { - logger.info('Admin panel listening for HTTP on *'+port) - }) - -/* */ } private stopWebserver(){ if(this.httpServer == null || this.express == null){ - logger.warn("Webserver is not running") + getLogger('Admin#stopWebserver').warn("Webserver is not running") return } this.httpServer.close() this.httpServer = null this.express = null - logger.info("Webserver stopped") + getLogger('Admin#stopWebserver').info("Webserver stopped") } async makeKnex():Promise{ const conf:Knex.Config = this.config.getConfigKey("dbConf") - logger.debug("Making new knex:", conf) + getLogger('Admin#makeKnex').debug("Making new knex:", conf) if(conf.client === 'sqlite3'){ mkdirSync(Path.dirname((conf.connection).filename), {recursive: true}) } @@ -237,6 +196,6 @@ implements TableDefinitionExporter, IAdmin { } process.on( 'SIGINT', function() { - logger.info("Shutting down from SIGINT (Ctrl-C)" ); + getLogger('process#SIGINT').info("Shutting down from SIGINT (Ctrl-C)" ); Injector.resolve(FrontworkAdmin).stop() }) diff --git a/src/backend/Admin/app.server.module.ts b/src/backend/Admin/app.server.module.ts deleted file mode 100644 index b2b2f53..0000000 --- a/src/backend/Admin/app.server.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* -import { NgModule } from '../../frontend/node_modules/@angular/core'; -import { ServerModule } from '../../frontend/node_modules/@angular/platform-server'; -import { ModuleMapLoaderModule } from '../../frontend/node_modules/@nguniversal/module-map-ngfactory-loader'; - -import { AppModule } from '../../frontend/src/app/app.module'; -import { AppComponent } from '../../frontend/src/app/app.component'; - -@NgModule({ - imports: [ - AppModule, - ServerModule, - ModuleMapLoaderModule - ], - providers: [ - // Add universal-only providers here - ], - bootstrap: [ AppComponent ], -}) -export class AppServerModule {} -*/ \ No newline at end of file diff --git a/src/backend/Components/User/UserManager.ts b/src/backend/Components/User/UserManager.ts index e3f862b..8bdd9c1 100644 --- a/src/backend/Components/User/UserManager.ts +++ b/src/backend/Components/User/UserManager.ts @@ -17,40 +17,42 @@ import { IRaidManager } from "../Raid/Interface"; import { IItemManager } from "../Item/Interface"; import { IGuildManager } from "../Guild/Interface"; +getLogger().level = "debug" + const uuid = require('uuid/v4') const salt = "6pIbc6yjSN" -const ONE_WEEK = 604800000 +const ONE_WEEK = 604800000 type Serverstate = { server: RPCServer, - port : number, + port: number, }; @Injectable(IUserManager) export class UserManager -implements FrontworkComponent, IUserManager{ + implements FrontworkComponent, IUserManager { name = "UserManager" as "UserManager" @Inject(IAdmin) private admin: IAdmin @Inject(IGuildManager) - private guild : GuildManager - + private guild: GuildManager + @Inject(IItemManager) - private item : ItemManager - + private item: ItemManager + @Inject(IRaidManager) - private raid : RaidManager - + private raid: RaidManager + @Inject(ICharacterManager) - private character : CharacterManager - - exporters :any[] = [] - rankServer : Serverstate<{}, FrontcraftFeatureIfc> - userLogins : {[username in string] : UserRecord} = {} + private character: CharacterManager + + exporters: any[] = [] + rankServer: Serverstate<{}, FrontcraftFeatureIfc> + userLogins: { [username in string]: UserRecord } = {} allowed: string[] = [] exportRPCs = () => [ @@ -64,46 +66,46 @@ implements FrontworkComponent, IUserManag ] exportRPCFeatures = () => [ - { - name: 'manageUser' as 'manageUser', - exportRPCs: () => [ - this.adminLogout, - this.changeRank, - this.adminChangePassword - ] - },{ - name: 'modifyPermissions' as 'modifyPermissions', - exportRPCs: () => [ - this.getPermissions, - this.setPermission, - ] - },{ - name: 'softreserveCurrency' as 'softreserveCurrency', - exportRPCs: () => [ - this.incrementCurrency, - this.decrementCurrency, - this.setCurrency - ] - }] + { + name: 'manageUser' as 'manageUser', + exportRPCs: () => [ + this.adminLogout, + this.changeRank, + this.adminChangePassword + ] + }, { + name: 'modifyPermissions' as 'modifyPermissions', + exportRPCs: () => [ + this.getPermissions, + this.setPermission, + ] + }, { + name: 'softreserveCurrency' as 'softreserveCurrency', + exportRPCs: () => [ + this.incrementCurrency, + this.decrementCurrency, + this.setCurrency + ] + }] - changeRank = async (user:User, rank:Rank): Promise => { + changeRank = async (user: User, rank: Rank): Promise => { await this.admin - .knex('users') - .where({ - username: user.username - }).update({ - rank: rank - }) + .knex('users') + .where({ + username: user.username + }).update({ + rank: rank + }) await this.adminLogout(user.username) return await this.admin - .knex('users') - .where({ - username: user.username - }).first() + .knex('users') + .where({ + username: user.username + }).first() } - + getTableDefinitions = (): TableDefiniton[] => [ { name: 'users', @@ -116,40 +118,40 @@ implements FrontworkComponent, IUserManag table.integer(tier).defaultTo(1) }) } - },{ + }, { name: 'rpcpermissions', tableBuilder: (table) => { table.string("rpcname").primary().notNullable() _Rank.forEach(r => { - if(r === 'ADMIN') + if (r === 'ADMIN') table.boolean(r).defaultTo(true).notNullable() else table.boolean(r).defaultTo(false).notNullable() }) } } - ,...this.exporters.flatMap(exp => exp['getTableDefinitions']?exp['getTableDefinitions']():undefined) + , ...this.exporters.flatMap(exp => exp['getTableDefinitions'] ? exp['getTableDefinitions']() : undefined) ] initialize = async () => { - this.exporters = [this.guild, this.item, this.raid, this.character] + this.exporters = [this.guild, this.item, this.raid, this.character] //set up permissions - getLogger('UserManager').debug('setting up permissions') + getLogger('UserManager#initialize').debug('setting up permissions') - await Promise.all( + await Promise.all( [this, ...this.exporters].flatMap(exp => exp.exportRPCFeatures().map(async (feature) => { - try{ - await this.admin.knex.insert({ rpcname: feature.name }).into('rpcpermissions') - }catch(e){ - } - }))) + try { + await this.admin.knex.insert({ rpcname: feature.name }).into('rpcpermissions') + } catch (e) { + } + }))) const rankServer = await this.startRankServer(20001) this.rankServer = { server: rankServer, port: 20001 } - setInterval(this.checkExpiredSessions, 600_000) + setInterval(this.checkExpiredSessions, 600_000) } stop = async () => { @@ -157,115 +159,111 @@ implements FrontworkComponent, IUserManag Object.values(x.connections).forEach(c => c.destroy()) }) - try{ + try { return this.rankServer.server.destroy() - }catch(e){ - //getLogger('UserManager').warn(e) + } catch (e) { + getLogger('UserManager#stop').debug(String(e)) } } checkExpiredSessions = () => { Object.values(this.userLogins).map(userLogin => { const auth = userLogin.auth - if(!this.checkToken(auth.token.value)){ + if (!this.checkToken(auth.token.value)) { this.logout(auth.user.username, auth.token.value) } }) } - checkConnection = async (socket: Socket) => { - - let data : any - let tries = 0 - while(!data){ - tries ++ - if(tries === 5){ - getLogger('UserManager').debug('Connection check failed for connection *'+socket.port) - socket.destroy() - return false - } - data = await Promise.race([socket.call('getUserData'), new Promise((res, rej) => { setTimeout(res, 1000);})]) + checkConnection = async (socket: Socket, retries = 0) : Promise => { + if(retries < 0){ + return false } - if(!this.userLogins[data.user.username]){ + //give the client some time to bind its hooks + await new Promise((res, rej) => { setTimeout(res, 150);}) + + let data + try{ + data = await Promise.race([socket.call('getUserData'), new Promise((res, rej) => { setTimeout(res, 250);})]) + }catch(e){ + getLogger('UserManager#checkConnection').debug('Client didn\'t respond', e) + return false + } + + if(!data) { + if(retries > 0){ + return await this.checkConnection(socket, retries-1) + } + return false + } + + if (!this.userLogins[data.user.username]) { await this.logout(data.user.username, data.token.value) return false } this.userLogins[data.user.username].connections[socket.port] = socket - await socket.call('navigate', ["/frontcraft/dashboard"]) + getLogger('UserManager#checkConnection').debug(this.userLogins, this.allowed); + return true } - changePassword = async (userToken:string, pwHash:string) : Promise => { + changePassword = async (userToken: string, pwHash: string): Promise => { const record = this.getUserRecordByToken(userToken) - if(!record) return {} as User + if (!record) return {} as User return await this.adminChangePassword(record.user, pwHash) } - adminChangePassword = async(user:User, pwHash:string) : Promise => { + adminChangePassword = async (user: User, pwHash: string): Promise => { const salted = await saltedHash(pwHash, salt) await this.admin.knex('users') - .update({pwhash: salted}) - .where({ - username: user.username - }) + .update({ pwhash: salted }) + .where({ + username: user.username + }) const usr = await this.getUser(user.username) - if(!usr) return {} as any + if (!usr) return {} as any await this.adminLogout(usr.username) return usr } setPermission = async (permission: RPCPermission) => { await this.admin.knex('rpcpermissions') - .where('rpcname', '=', permission.rpcname) - .update(permission) + .where('rpcname', '=', permission.rpcname) + .update(permission) await Promise.all( Object.entries(this.userLogins).map(([username, record]) => { - if(record.user.rank === "ADMIN") return + if (record.user.rank === "ADMIN") return return this.adminLogout(username) }) ) } - getPermissions = async () : Promise => { + getPermissions = async (): Promise => { return await this.admin.knex.select('*').from('rpcpermissions') } - getPermission = async (feature: keyof FrontcraftFeatureIfc, rank:Rank) : Promise => { - const perm : RPCPermission = await this.admin.knex + getPermission = async (feature: keyof FrontcraftFeatureIfc, rank: Rank): Promise => { + const perm: RPCPermission = await this.admin.knex .select(rank) .from('rpcpermissions') .where('rpcname', '=', feature) .first() - if(!perm) return false + if (!perm) return false return perm[rank] } - getRPCForRank = async (rank: Rank): Promise => { - let rpcs = [ - ...this.exportRPCFeatures(), - ...this.exporters.flatMap((exp) => exp.exportRPCFeatures()) - ] - - const bits = await Promise.all(rpcs.map(async (feature) => { - const allowed = await this.getPermission( feature.name, rank) - return allowed - })) - - return rpcs.filter(entry => bits.shift()) - } - - createUser = async(user:User): Promise => { - if(user.rank === 'ADMIN'){ + createUser = async (user: User): Promise => { + if (user.rank === 'ADMIN') { const admins = await this.admin.knex .select("*") .from('users') - .where({rank: 'ADMIN'}) + .where({ rank: 'ADMIN' }) - if(admins.length > 0){ + if (admins.length > 0) { return {} as User } } @@ -273,128 +271,139 @@ implements FrontworkComponent, IUserManag user.pwhash = await saltedHash(user.pwhash, salt) await this.admin.knex('users') - .insert(user) + .insert(user) const userRecord = await this.admin.knex - .select("*") - .from('users') - .where(user) - .first() + .select("*") + .from('users') + .where(user) + .first() return userRecord } - getUser = async (username: string) : Promise => await this.admin - .knex('users') - .select('*') - .where({ - username: username.toLowerCase() - }) - .first() + getUser = async (username: string): Promise => await this.admin + .knex('users') + .select('*') + .where({ + username: username.toLowerCase() + }) + .first() - logout = async (username:string, tokenValue : string) : Promise => { - try{ - if(!this.checkTokenOwnedByUser(username, tokenValue)) return + logout = async (username: string, tokenValue: string): Promise => { + try { + if (!this.checkTokenOwnedByUser(username, tokenValue)) return return await this.adminLogout(username) - }catch(e){ + } catch (e) { } } - adminLogout = async(username: string) : Promise => { - try{ - if(this.userLogins[username]){ - await Promise.all (Object.values(this.userLogins[username].connections).map(async (sock) => { - await sock.call('kick') - })) - - this.allowed = this.allowed.filter(allowed => allowed !== this.userLogins[username].auth.token.value) + adminLogout = async (username: string): Promise => { + try { + if (this.userLogins[username]) { + const token = this.userLogins[username].auth.token.value + //doesn't matter if error or success + Object.values(this.userLogins[username].connections).forEach(async (sock) => { + try{ + await sock.call('kick') + }catch(e){ + //getLogger('UserManager#adminLogout#kick').debug(String(e)) + } + }) + this.allowed = this.allowed.filter(allowed => { + return allowed != token + }) delete this.userLogins[username] } - }catch(e){} + } catch (e) { + getLogger('UserManager#adminLogout').debug(String(e), this.userLogins) + } } wipeCurrency = async () => { await Promise.all(_Tiers.map(tier => { const update = {} update[tier] = 1 - + return this.admin.knex('users') - .update(update) + .update(update) })) } - login = async(username:string, pwHash:string) : Promise => { + login = async (username: string, pwHash: string): Promise => { username = username.toLowerCase() - const user:User = await this.admin.knex - .select('*') - .from('users') - .where({ username: username }) - .first() - + const user: User = await this.admin.knex + .select('*') + .from('users') + .where({ username: username }) + .first() + const salted = await saltedHash(pwHash, salt) - if(user && salted === user.pwhash){ + if (user && salted === user.pwhash) { delete user.pwhash //return existing auth - if(this.userLogins[username] != null){ + if (this.userLogins[username] != null) { return this.userLogins[username].auth } - + const token = this.createToken(user) - const userAuth : Auth = { + const userAuth: Auth = { token: token, user: user, port: this.rankServer.port } - this.userLogins[user.username] = {connections: {}, auth: userAuth, user:user} + this.userLogins[user.username] = { connections: {}, auth: userAuth, user: user } this.allowed.push(token.value) - return userAuth + + return userAuth } throw new Error('login failed') } - getUserRecordByToken(tokenValue: string){ + getUserRecordByToken(tokenValue: string) { return Object.values(this.userLogins).find(login => login.auth.token.value === tokenValue) } - getAuth = async (tokenValue:string) : Promise => { + getAuth = async (tokenValue: string): Promise => { const maybeAuth = this.getUserRecordByToken(tokenValue) - if(maybeAuth) + if (maybeAuth) return maybeAuth.auth return } - startRankServer = async (port: number) : Promise> => { + startRankServer = async (port: number): Promise> => { let rpcs = [ - ...this.exportRPCFeatures(), + ...this.exportRPCFeatures(), ...this.exporters.flatMap((exp) => exp.exportRPCFeatures()) ] - let rpcServer = new RPCServer<{},FrontcraftFeatureIfc>(port, rpcs, { + let rpcServer = new RPCServer<{}, FrontcraftFeatureIfc>(port, rpcs, { accessFilter: async (sesame, exporter) => { const record = this.getUserRecordByToken(sesame!) - if(!record) return false + if (!record) return false return await this.getPermission(exporter.name, record.user.rank) }, - closeHandler: (socket) => { - Object.values(this.userLogins) - .forEach(login => delete login.connections[socket.port]) - + closeHandler: (socket) => { + Object.values(this.userLogins).forEach(login => delete login.connections[socket.port]) + getLogger('UserManager#closeHandler').debug(this.userLogins, this.allowed) }, connectionHandler: (socket) => { - this.checkConnection(socket).then(res => { - if(!res){ + this.checkConnection(socket, 10).then(res => { + if (!res) { + getLogger('UserManager#connectionHandler').debug("Connection on "+socket.port+" failed to authenticate") socket.destroy(); } }).catch((e) => { + getLogger('UserManager#connectionHandler').debug(String(e)) socket.destroy(); }) }, errorHandler: (socket, e, rpcName, args) => { - getLogger('UserManager').error(rpcName, args, e); + getLogger('UserManager#errorHandler').error(rpcName, args, e); }, sesame: (sesame) => this.checkToken(sesame), visibility: '0.0.0.0' @@ -403,25 +412,27 @@ implements FrontworkComponent, IUserManag return rpcServer } - checkToken = (token: string) : boolean => this.allowed.includes(token) - && Object.values(this.userLogins).find(login => login.auth.token.value === token)!.auth.token.created > Date.now() - ONE_WEEK - + checkToken = (token: string): boolean => { + return this.allowed.includes(token) + && Object.values(this.userLogins).find(login => login.auth.token.value === token)!.auth.token.created > Date.now() - ONE_WEEK + } + checkTokenOwnedByUser = (username: string, tokenValue: string) => { username = username.toLowerCase() const maybeRecord = this.getUserRecordByToken(tokenValue) - if(!maybeRecord || maybeRecord.auth.user.username != username){ + if (!maybeRecord || maybeRecord.auth.user.username != username) { return false - } + } return true } - - createToken = (user:User): Token => { - - if(this.userLogins[user.username]){ + + createToken = (user: User): Token => { + + if (this.userLogins[user.username]) { return this.userLogins[user.username].auth.token } - const token:Token = { + const token: Token = { value: uuid(), user_id: user.id!, created: Date.now() @@ -430,47 +441,47 @@ implements FrontworkComponent, IUserManag return token } - getCurrency = async(user:User, tier?: Tiers) : Promise => { - if(!tier) return 0 - const usr : User = await this.admin - .knex('users') - .where('username', '=', user.username) - .select('*') - .first() + getCurrency = async (user: User, tier?: Tiers): Promise => { + if (!tier) return 0 + const usr: User = await this.admin + .knex('users') + .where('username', '=', user.username) + .select('*') + .first() return usr[tier]! } decrementCurrency = async (user: User, tier?: Tiers, value = 1) => { - if(!tier || value < 1) return + if (!tier || value < 1) return - const usr : User = await this.admin - .knex('users') - .where('id', '=', user.id) - .select('*') - .first() + const usr: User = await this.admin + .knex('users') + .where('id', '=', user.id) + .select('*') + .first() - if(!usr || usr[tier]! <= 0) return + if (!usr || usr[tier]! <= 0) return await this.admin - .knex('users') - .where('id', '=', user.id) - .decrement(tier, value) + .knex('users') + .where('id', '=', user.id) + .decrement(tier, value) } incrementCurrency = async (user: User, tier: Tiers, value = 1) => { - if(!tier || value < 1) return + if (!tier || value < 1) return await this.admin - .knex('users') - .where('id', '=', user.id) - .increment(tier, value) + .knex('users') + .where('id', '=', user.id) + .increment(tier, value) } - setCurrency = async (user: User, tier?:Tiers, value = 0) => { - if(!tier || value < 0) return + setCurrency = async (user: User, tier?: Tiers, value = 0) => { + if (!tier || value < 0) return await this.admin - .knex('users') - .where('id', '=', user.id) - .update(tier, value) + .knex('users') + .where('id', '=', user.id) + .update(tier, value) } } \ No newline at end of file diff --git a/src/backend/main.server.ts b/src/backend/main.server.ts deleted file mode 100644 index 110e942..0000000 --- a/src/backend/main.server.ts +++ /dev/null @@ -1,2 +0,0 @@ -//import { enableProdMode } from '../frontend/node_modules/@angular/core'; -//enableProdMode(); \ No newline at end of file diff --git a/src/backend/webpack.prod.js b/src/backend/webpack.prod.js deleted file mode 100644 index 07122d0..0000000 --- a/src/backend/webpack.prod.js +++ /dev/null @@ -1,68 +0,0 @@ -const path = require('path'); - -module.exports = [{ - mode: 'production', - target: "node", - node: { - global: true, - process: true, - __filename: false, - __dirname: false, - Buffer: true, - }, - - resolve: { - // Add `.ts` and `.tsx` as a resolvable extension. - - extensions: [".ts", ".tsx", ".js"] - }, - module: { - rules: [ - { test: /\.ts?$/, loader: "ts-loader" } - ] - }, - - externals: ['knex'], - optimization: { - minimize: false - }, - entry: path.resolve(__dirname, 'Installer.ts'), - output: { - path: path.resolve(__dirname, '../../dist'), - filename: 'Installer.js', - libraryTarget: 'commonjs', - } -},{ - mode: 'production', - target: "node", - node: { - global: true, - process: true, - __filename: false, - __dirname: false, - Buffer: true, - }, - - - resolve: { - // Add `.ts` and `.tsx` as a resolvable extension. - - extensions: [".ts", ".tsx", ".js"] - }, - module: { - rules: [ - { test: /\.ts?$/, loader: "ts-loader" } - ] - }, - - externals:["./Installer"], - optimization: { - minimize: false - }, - entry: path.resolve(__dirname, 'Launcher.ts'), - output: { - path: path.resolve(__dirname, '../../dist'), - filename: 'FrontblockAdmin.js', - libraryTarget: 'commonjs', - } -}] \ No newline at end of file diff --git a/src/frontend/angular.json b/src/frontend/angular.json index 9ae6d21..e01c8c6 100644 --- a/src/frontend/angular.json +++ b/src/frontend/angular.json @@ -13,10 +13,10 @@ "options": { "preserveSymlinks": true, "rebaseRootRelativeCssUrls": true, - "outputPath": "dist", + "outputPath": "dist/browser", "index": "src/index.html", "main": "src/main.ts", - "tsConfig": "src/tsconfig.app.json", + "tsConfig": "./tsconfig.app.json", "polyfills": "src/polyfills.ts", "assets": [ "src/assets", @@ -51,20 +51,13 @@ "node_modules/echarts/dist/echarts.min.js", "node_modules/echarts/dist/extension/bmap.min.js", "node_modules/chart.js/dist/Chart.min.js", - "node_modules/rpclibrary/js/browser/rpclibrary.browser.js" + "node_modules/rpclibrary/js/browser/rpclibrary.browser.js", + "node_modules/js-cookie/src/js.cookie.js" ] }, "configurations": { "production": { - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, "fileReplacements": [ { "replace": "src/environments/environment.ts", @@ -136,7 +129,7 @@ "builder": "@angular-devkit/build-angular:tslint", "options": { "tsConfig": [ - "src/tsconfig.app.json", + "./tsconfig.app.json", "src/tsconfig.spec.json" ], "typeCheck": true, @@ -167,6 +160,23 @@ } } } + }, + "frontcraft": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "", + "prefix": "app", + "architect": { + "server": { + "builder": "@angular-devkit/build-angular:server", + "options": { + "outputPath": "dist/server", + "main": "./src/main.server.ts", + "tsConfig": "./tsconfig.server.json" + } + } + } } }, "defaultProject": "ngx-admin-demo", diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 1686f42..501c496 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -425,6 +425,7 @@ "version": "8.2.14", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.14.tgz", "integrity": "sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw==", + "dev": true, "requires": { "tslib": "^1.9.0" } @@ -1350,6 +1351,16 @@ "tslib": "^1.9.0" } }, + "@angular/platform-server": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.2.14.tgz", + "integrity": "sha512-gGAgxMmac5CyLcwgB+qCD1o75An0NmpREh/lxPgz6n6Zs9JqdqpZROLSIHqGBaU6MWo1qiOfS6L08HwYPx7ipQ==", + "requires": { + "domino": "^2.1.2", + "tslib": "^1.9.0", + "xhr2": "^0.1.4" + } + }, "@angular/router": { "version": "8.2.14", "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.14.tgz", @@ -2511,11 +2522,11 @@ "integrity": "sha512-jX6R5lApSBtPHcZzgJ1+URxvJhmSodX+YcuDnuYsQJB1nkpC0Kjs6XL5OEONVg4NaoYcxMYmnxRe51lrlQdilg==" }, "@nebular/theme": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@nebular/theme/-/theme-4.4.0.tgz", - "integrity": "sha512-UcK1hwMvJXDROU9QiCfRq5LXRV9gB+K+AJtg1UYhvNJ+NzZkLyn+P+wFNX0StI91BjjNw3T699Xvz4B0grWhlA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@nebular/theme/-/theme-4.6.0.tgz", + "integrity": "sha512-S7topzx0Hf9D7YkQxKJ8UB1G2/sEN3o4eKjkRe8Xv5n7H3WqpKQ9Uef3oW2mTf75dmICBldhKXvopdr6TA5foA==", "requires": { - "intersection-observer": "0.5.0" + "intersection-observer": "0.7.0" } }, "@ngtools/webpack": { @@ -2542,6 +2553,24 @@ } } }, + "@nguniversal/common": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nguniversal/common/-/common-9.0.1.tgz", + "integrity": "sha512-AprW7oREmywDudrBI1auy4lB6AQFKHLeebdY7vAXjviIEzBDm9Zd1Z59SqFtp+H4Pce8R7tQ3zoXY1n7azCigg==" + }, + "@nguniversal/express-engine": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-9.0.1.tgz", + "integrity": "sha512-uICu/CVrKuRYKUhpn91tRoERRhorDH038zyUsQt3yqsKV5BXyclr+H0lHh94dXyi+W0RKmksvzGNshwc4IWnUA==", + "requires": { + "@nguniversal/common": "9.0.1" + } + }, + "@nguniversal/module-map-ngfactory-loader": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-8.2.6.tgz", + "integrity": "sha512-YcxXSrDZt6iDR+YbesJvprNpHd1nRLeThJwAFlcwvK/GVGSyKeWV6eqk3bRkBkgkw8OwaG/4lOQ4aofxQw+13w==" + }, "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", @@ -6490,6 +6519,12 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -6785,6 +6820,11 @@ "domelementtype": "1" } }, + "domino": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.4.tgz", + "integrity": "sha512-l70mlQ7IjPKC8kT7GljQXJZmt5OqFL+RE91ik5y5WWQtsd9wP8R7gpFnNu96fK5MqAAZRXfLLsnzKtkty5fWGQ==" + }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -7547,6 +7587,15 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -8011,6 +8060,18 @@ "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", "dev": true }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, "flat-cache": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", @@ -8907,6 +8968,41 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9610,10 +9706,16 @@ "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 + }, "intersection-observer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.5.0.tgz", - "integrity": "sha512-8Zgt4ijlyvIrQVTA7MPb2W9+KhoetrAbxlh0RmTGxpx0+ZsAXvy7IsbNnZIrqZ6TddAdWeQj49x7Ph7Ir6KRkA==" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz", + "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==" }, "intl": { "version": "1.2.5", @@ -10261,6 +10363,11 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -15544,6 +15651,29 @@ "resolve-from": "^3.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -18531,6 +18661,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, "v8flags": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", @@ -19409,6 +19545,234 @@ "webpack-sources": "^1.4.1" } }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "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 + }, + "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" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "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" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "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" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "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.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "webpack-core": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", @@ -20508,6 +20872,11 @@ "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", "dev": true }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index b477964..6db2b43 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -11,10 +11,11 @@ }, "scripts": { "ng": "ng", + "webpack:server": "webpack --config webpack.server.config.js", "conventional-changelog": "conventional-changelog", "start": "ng serve", - "build": "ng build", - "build:prod": "npm run build -- --prod --aot", + "build": "rm -rf dist serverBundle && npm run ngbuild && ng run frontcraft:server && webpack --config webpack.server.config", + "ngbuild": "ng build --prod", "test": "ng test", "test:coverage": "rimraf coverage && npm run test -- --code-coverage", "lint": "ng lint", @@ -26,25 +27,29 @@ "docs": "compodoc -p src/tsconfig.app.json -d docs", "docs:serve": "compodoc -p src/tsconfig.app.json -d docs -s", "prepush": "npm run lint:ci", - "release:changelog": "npm run conventional-changelog -- -p angular -i CHANGELOG.md -s" + "release:changelog": "npm run conventional-changelog -- -p angular -i CHANGELOG.md -s", + "add": "ng add @nguniversal/express-engine", + "tsc": "tsc --project src/tsconfig.server.json && webpack --config extra-webpack.config.js" }, "dependencies": { "@agm/core": "^1.0.0-beta.5", - "@angular-builders/custom-webpack": "^8.2.0", - "@angular/animations": "^8.0.0", - "@angular/cdk": "^8.0.0", - "@angular/common": "^8.0.0", - "@angular/compiler": "^8.0.0", - "@angular/core": "^8.0.0", + "@angular-builders/custom-webpack": "^8.4.1", + "@angular/animations": "^8.2.14", + "@angular/cdk": "^8.2.3", + "@angular/common": "^8.2.14", + "@angular/core": "^8.2.14", "@angular/forms": "^8.0.0", "@angular/platform-browser": "^8.0.0", - "@angular/platform-browser-dynamic": "^8.0.0", + "@angular/platform-browser-dynamic": "^8.2.14", + "@angular/platform-server": "^8.2.14", "@angular/router": "^8.0.0", "@asymmetrik/ngx-leaflet": "3.0.1", "@nebular/auth": "4.4.0", "@nebular/eva-icons": "4.4.0", "@nebular/security": "4.4.0", - "@nebular/theme": "^4.4.0", + "@nebular/theme": "^4.6.0", + "@nguniversal/express-engine": "^9.0.1", + "@nguniversal/module-map-ngfactory-loader": "^8.2.6", "@swimlane/ngx-charts": "^10.0.0", "angular-tree-component": "7.2.0", "angular2-chartjs": "0.4.1", @@ -58,6 +63,7 @@ "eva-icons": "^1.1.0", "intl": "1.2.5", "ionicons": "2.0.1", + "js-cookie": "^2.2.1", "leaflet": "1.2.0", "nebular-icons": "1.1.0", "ng2-ckeditor": "^1.2.2", @@ -81,8 +87,9 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~0.803.24", - "@angular/cli": "^8.0.2", - "@angular/compiler-cli": "^8.0.0", + "@angular/cli": "^8.3.25", + "@angular/compiler": "^8.2.14", + "@angular/compiler-cli": "^8.2.14", "@angular/language-service": "8.0.0", "@compodoc/compodoc": "^1.1.11", "@fortawesome/fontawesome-free": "^5.2.0", @@ -109,6 +116,7 @@ "ts-node": "3.2.2", "tslint": "^5.7.0", "tslint-language-service": "^0.9.9", - "typescript": "^3.5.1" + "typescript": "^3.5.1", + "webpack-cli": "^3.3.11" } } diff --git a/src/frontend/server.ts b/src/frontend/server.ts new file mode 100644 index 0000000..ba115a5 --- /dev/null +++ b/src/frontend/server.ts @@ -0,0 +1,47 @@ +import 'zone.js/dist/zone-node'; +import 'reflect-metadata'; + +import { ngExpressEngine } from '@nguniversal/express-engine'; +import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader'; +import { resolve } from 'path'; +import { enableProdMode } from '@angular/core'; +const domino = require('domino'); +const win = domino.createWindow(''); + +global['window'] = win; +global['document'] = win.document; +global['alert'] = console.log +global['XMLHttpRequest'] = require('xmlhttprequest').XMLHttpRequest; + +export async function attachExpress(app, staticDir = "./dist") { + const STATIC_FOLDER = resolve(process.cwd(), staticDir); + + enableProdMode(); + + const bundle = require(staticDir + '/server/main'); + + const ServerApiService = bundle.ServerApiService + const serviceObj = new ServerApiService() + await serviceObj.initialize() + + app.set('view engine', 'html'); + app.engine( + 'html', + ngExpressEngine({ + bootstrap: bundle.AppServerModuleNgFactory, + providers: [ + provideModuleMap(bundle.LAZY_MODULE_MAP), + { + provide: bundle.IApiService, + useValue: serviceObj, + deps: [] + } + ] + }) + ); + + app.get('*', (req, res) => { + //console.log('*', req.path); + res.render(resolve(STATIC_FOLDER, 'browser/index'), { req, res }) + }); +} diff --git a/src/frontend/src/app/@core/core.module.ts b/src/frontend/src/app/@core/core.module.ts index 015c387..3defac3 100644 --- a/src/frontend/src/app/@core/core.module.ts +++ b/src/frontend/src/app/@core/core.module.ts @@ -1,20 +1,11 @@ -import { ModuleWithProviders, NgModule, Optional, SkipSelf, APP_INITIALIZER } from '@angular/core'; +import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core'; import { CommonModule } from '@angular/common'; import { throwIfAlreadyLoaded } from './module-import-guard'; -import { ApiService, initializeLoginSvc } from '../frontcraft/services/login-api'; import { CookieService } from 'ngx-cookie-service'; import { LayoutService } from './utils'; const DATA_SERVICES = [ - {provide: ApiService, useClass: ApiService}, - {provide: CookieService, useClass: CookieService}, - { - provide: APP_INITIALIZER, - useFactory: initializeLoginSvc, - deps: [ApiService, CookieService], - multi: true - } ]; export const NB_CORE_PROVIDERS = [ diff --git a/src/frontend/src/app/@theme/components/header/chat.component.ts b/src/frontend/src/app/@theme/components/header/chat.component.ts index faac029..edd9ab8 100644 --- a/src/frontend/src/app/@theme/components/header/chat.component.ts +++ b/src/frontend/src/app/@theme/components/header/chat.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; -import { ApiService } from '../../../frontcraft/services/login-api'; import { ShoutMessage } from '../../../../../../backend/Components/Shoutbox/Interface'; +import { IApiService } from '../../../frontcraft/services/ApiService'; @Component({ selector: 'chat', @@ -31,7 +31,7 @@ export class ChatComponent { history constructor( - private api: ApiService + private api: IApiService ) {} submit(event){ diff --git a/src/frontend/src/app/@theme/components/header/header.component.ts b/src/frontend/src/app/@theme/components/header/header.component.ts index a618668..3e7b7b3 100644 --- a/src/frontend/src/app/@theme/components/header/header.component.ts +++ b/src/frontend/src/app/@theme/components/header/header.component.ts @@ -1,14 +1,14 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { NbMediaBreakpointsService, NbSidebarService, NbThemeService, NbMenuItem, NbDialogService } from '@nebular/theme'; +import { NbSidebarService, NbThemeService, NbMenuItem, NbDialogService } from '@nebular/theme'; import { LayoutService } from '../../../@core/utils'; import { map, takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; -import { ApiService } from '../../../frontcraft/services/login-api'; import { User } from '../../../../../../backend/Types/Types'; import { Router } from '@angular/router'; import { ChatComponent } from './chat.component'; import { ShoutMessage } from '../../../../../../backend/Components/Shoutbox/Interface'; +import { IApiService } from '../../../frontcraft/services/ApiService'; @Component({ selector: 'ngx-header', @@ -54,8 +54,7 @@ export class HeaderComponent implements OnInit, OnDestroy { private router: Router, private themeService: NbThemeService, private layoutService: LayoutService, - private breakpointService: NbMediaBreakpointsService, - private api: ApiService, + private api: IApiService, private dialogService : NbDialogService ) {} diff --git a/src/frontend/src/app/@theme/components/tiny-mce/tiny-mce.component.ts b/src/frontend/src/app/@theme/components/tiny-mce/tiny-mce.component.ts index fc7e2c0..3405066 100644 --- a/src/frontend/src/app/@theme/components/tiny-mce/tiny-mce.component.ts +++ b/src/frontend/src/app/@theme/components/tiny-mce/tiny-mce.component.ts @@ -17,21 +17,9 @@ export class TinyMCEComponent implements OnDestroy, AfterViewInit { ) { } ngAfterViewInit() { - tinymce.init({ - target: this.host.nativeElement, - plugins: ['link', 'paste', 'table'], - skin_url: `${this.locationStrategy.getBaseHref()}assets/skins/lightgray`, - setup: editor => { - this.editor = editor; - editor.on('keyup', () => { - this.editorKeyup.emit(editor.getContent()); - }); - }, - height: '320', - }); + } ngOnDestroy() { - tinymce.remove(this.editor); } } diff --git a/src/frontend/src/app/app-routing.module.ts b/src/frontend/src/app/app-routing.module.ts index 8183d0b..cf196c3 100644 --- a/src/frontend/src/app/app-routing.module.ts +++ b/src/frontend/src/app/app-routing.module.ts @@ -1,25 +1,94 @@ import { ExtraOptions, RouterModule, Routes } from '@angular/router'; import { NgModule } from '@angular/core'; +import { PagesLayoutComponent } from './frontcraft/pages/pages-layout.component'; +import { FrontcraftUserComponent } from './frontcraft/pages/user/user.component'; +import { FrontcraftRaidComponent } from './frontcraft/pages/raid/raid.component'; +import { FrontcraftArchiveComponent } from './frontcraft/pages/raid/archive.component'; +import { FrontcraftRaidsComponent } from './frontcraft/pages/raids/raids.component'; +import { FrontcraftCharacterComponent } from './frontcraft/pages/character/character.component'; +import { FrontcraftCharactersComponent } from './frontcraft/pages/characters/characters.component'; +import { FrontcraftRulesComponent } from './frontcraft/pages/rules/rules.component'; +import { FrontcraftArmoryComponent } from './frontcraft/pages/armory/armory.component'; +import { RegisterComponent } from './frontcraft/auth/register/register.component'; +import { LogoutComponent } from './frontcraft/auth/logout/logout.component'; +import { MyLoginComponent } from './frontcraft/auth/login/login.component'; +import { AuthComponent } from './frontcraft/auth/auth-layout.component'; +import { ChangePermissionsComponent } from './frontcraft/permissions/changePermissions/changePermissions.component'; +import { PermissionsComponent } from './frontcraft/permissions/permissions-layout.component'; const routes: Routes = [ { path: 'permissions', - loadChildren: () => import('./frontcraft/permissions/permissions.module') - .then(m => m.PermissionsModule), + component: PermissionsComponent, + children: [ + { + path: '**', + component: ChangePermissionsComponent, + }, + ] }, { path: 'auth', - loadChildren: () => import('./frontcraft/auth/auth.module') - .then(m => m.MyAuthModule), + component: AuthComponent, + children: [ + { + path: 'register', + component: RegisterComponent + }, + { + path: 'logout', + component: LogoutComponent, + }, + { + path: '**', + component: MyLoginComponent, + }, + ] }, { path: 'frontcraft', - loadChildren: () => import('./frontcraft/pages/pages.module') - .then(m => m.FrontcraftPagesModule), + component: PagesLayoutComponent, + children: [ + { + path: 'user/:name', + component: FrontcraftUserComponent + }, + { + path: 'raid/:id', + component: FrontcraftRaidComponent + }, + { + path: 'archive/:id', + component: FrontcraftArchiveComponent + }, + { + path: 'raids', + component: FrontcraftRaidsComponent + }, + { + path: 'character/:name', + component: FrontcraftCharacterComponent + }, + { + path: 'characters', + component: FrontcraftCharactersComponent + }, + { + path: 'rules', + component: FrontcraftRulesComponent + }, + { + path: 'armory', + component: FrontcraftArmoryComponent + }, + { + path: '**', + redirectTo: 'raids' + }, + ] }, - - { path: '', redirectTo: 'frontcraft', pathMatch: 'full' }, - { path: '**', redirectTo: 'frontcraft' }, + { path: '', redirectTo: 'frontcraft/raids', pathMatch: 'full' }, + { path: '**', redirectTo: 'frontcraft/raids' }, ]; const config: ExtraOptions = { diff --git a/src/frontend/src/app/app.component.ts b/src/frontend/src/app/app.component.ts index 6e93d0c..e8b735c 100644 --- a/src/frontend/src/app/app.component.ts +++ b/src/frontend/src/app/app.component.ts @@ -3,9 +3,7 @@ * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ -import { Component, OnInit, Inject, PLATFORM_ID, APP_ID } from '@angular/core'; -import { ApiService } from './frontcraft/services/login-api'; -import { isPlatformBrowser } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; @Component({ selector: 'ngx-app', @@ -13,17 +11,7 @@ import { isPlatformBrowser } from '@angular/common'; }) export class AppComponent implements OnInit { - constructor( - private loginSvc: ApiService, - @Inject(PLATFORM_ID) private platformId: Object, - @Inject(APP_ID) private appId: string - ) { - if(!isPlatformBrowser(platformId)){ - global['window'] = {} - } - } + constructor() { } - ngOnInit(): void { - - } + ngOnInit(): void { } } diff --git a/src/frontend/src/app/app.module.ts b/src/frontend/src/app/app.module.ts index 62daaf3..95b70f8 100644 --- a/src/frontend/src/app/app.module.ts +++ b/src/frontend/src/app/app.module.ts @@ -5,7 +5,7 @@ */ import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { NgModule, APP_INITIALIZER, NgZone, Injector } from '@angular/core'; import { HttpClientModule } from '@angular/common/http'; import { ThemeModule } from './@theme/theme.module'; import { AppComponent } from './app.component'; @@ -19,14 +19,17 @@ import { NbToastrModule, NbWindowModule, } from '@nebular/theme'; -import { ApiService, initializeLoginSvc } from './frontcraft/services/login-api'; -import { CookieService } from 'ngx-cookie-service'; import { CoreModule } from './@core/core.module'; +import { FrontcraftPagesModule } from './frontcraft/pages/pages.module'; +import { MyAuthModule } from './frontcraft/auth/auth.module'; +import { PermissionsModule } from './frontcraft/permissions/permissions.module'; @NgModule({ - declarations: [AppComponent], + declarations: [ + AppComponent + ], imports: [ - BrowserModule, + BrowserModule.withServerTransition({ appId: 'frontcraft' }), BrowserAnimationsModule, HttpClientModule, AppRoutingModule, @@ -41,17 +44,12 @@ import { CoreModule } from './@core/core.module'; messageGoogleMapKey: 'AIzaSyA_wNuCzia92MAmdLRzmqitRGvCF7wCZPY', }), CoreModule.forRoot(), + FrontcraftPagesModule, + MyAuthModule, + PermissionsModule ], bootstrap: [AppComponent], - providers: [ - ApiService, - { - provide: APP_INITIALIZER, - deps: [CookieService], - multi: true, - useFactory: initializeLoginSvc - }, - ] + providers: [] }) -export class AppModule { +export class FrontcraftAppModule { } diff --git a/src/frontend/src/app/app.server.module.ts b/src/frontend/src/app/app.server.module.ts new file mode 100644 index 0000000..396230d --- /dev/null +++ b/src/frontend/src/app/app.server.module.ts @@ -0,0 +1,18 @@ + +import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; +import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader'; + +import { FrontcraftAppModule } from './app.module'; +import { AppComponent } from './app.component'; + +@NgModule({ + imports: [ + FrontcraftAppModule, + ServerModule, + ModuleMapLoaderModule + ], + providers: [], + bootstrap: [ AppComponent ], +}) +export class AppServerModule {} \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/auth/auth-layout.component.ts b/src/frontend/src/app/frontcraft/auth/auth-layout.component.ts index a9d5cbc..9fb2fc8 100644 --- a/src/frontend/src/app/frontcraft/auth/auth-layout.component.ts +++ b/src/frontend/src/app/frontcraft/auth/auth-layout.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService } from '../services/login-api'; +import { ClientApiService } from '../services/client-login-api'; import { Router } from '@angular/router'; @Component({ @@ -13,8 +13,6 @@ import { Router } from '@angular/router'; export class AuthComponent implements OnInit{ constructor( - private loginSvc : ApiService, - private router: Router ){} ngOnInit(){ diff --git a/src/frontend/src/app/frontcraft/auth/auth-routing.module.ts b/src/frontend/src/app/frontcraft/auth/auth-routing.module.ts deleted file mode 100644 index 6cdfb1b..0000000 --- a/src/frontend/src/app/frontcraft/auth/auth-routing.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { MyLoginComponent } from './login/login.component'; -import { AuthComponent } from './auth-layout.component'; -import { LogoutComponent } from './logout/logout.component'; -import { RegisterComponent } from './register/register.component'; - -export const routes: Routes = [ - { - path: '', - component: AuthComponent, - children: [ - { - path: 'register', - component: RegisterComponent - }, - { - path: 'logout', - component: LogoutComponent, - }, - { - path: '**', - component: MyLoginComponent, - }, - ] - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class MyAuthRoutingModule { -} \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/auth/auth.module.ts b/src/frontend/src/app/frontcraft/auth/auth.module.ts index c286825..45baa90 100644 --- a/src/frontend/src/app/frontcraft/auth/auth.module.ts +++ b/src/frontend/src/app/frontcraft/auth/auth.module.ts @@ -12,7 +12,6 @@ import { NbCardModule, NbSelectModule } from '@nebular/theme'; -import { MyAuthRoutingModule } from './auth-routing.module'; import { MyLoginComponent } from './login/login.component'; import { AuthComponent } from './auth-layout.component'; import { ThemeModule } from '../../@theme/theme.module'; @@ -22,7 +21,6 @@ import { RegisterComponent } from './register/register.component'; @NgModule({ imports: [ - MyAuthRoutingModule, CommonModule, FormsModule, RouterModule, diff --git a/src/frontend/src/app/frontcraft/auth/login/login.component.html b/src/frontend/src/app/frontcraft/auth/login/login.component.html index ed64b5d..18b17a8 100644 --- a/src/frontend/src/app/frontcraft/auth/login/login.component.html +++ b/src/frontend/src/app/frontcraft/auth/login/login.component.html @@ -29,7 +29,7 @@ id="input-password" placeholder="Password" fieldSize="giant" - [status]="password.dirty ? (password.invalid ? 'danger' : 'success') : ''" + [status]="password.dirty ? (password.invalid ? 'danger' : 'success') : 'basic'" [required]="true" [minlength]="1" [maxlength]="15" diff --git a/src/frontend/src/app/frontcraft/auth/login/login.component.ts b/src/frontend/src/app/frontcraft/auth/login/login.component.ts index 3564636..afdc769 100644 --- a/src/frontend/src/app/frontcraft/auth/login/login.component.ts +++ b/src/frontend/src/app/frontcraft/auth/login/login.component.ts @@ -1,6 +1,8 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService } from '../../services/login-api'; +import { ClientApiService } from '../../services/client-login-api'; import { Router } from '@angular/router'; +import { IApiService } from '../../services/ApiService'; +import { NbToastrService } from '@nebular/theme'; @Component({ selector: 'mylogin', @@ -21,18 +23,26 @@ export class MyLoginComponent implements OnInit{ constructor( private router : Router, - private loginApi : ApiService + private api : IApiService, + private toastr: NbToastrService ){} ngOnInit(){ - this.loginApi.checkLogin().then(loggedin => { + this.api.checkLogin().then(loggedin => { if(loggedin){ this.router.navigateByUrl("/") } }); } - login(){ - this.loginApi.login(this.user.name, this.user.password) + async login(){ + const login = await this.api.login(this.user.name, this.user.password) + if(!login){ + this.toastr.danger("Login failed", "Error") + return + }else{ + window['r'] = this.router + this.router.navigate(["/froncraft"]) + } } } \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/auth/logout/logout.component.ts b/src/frontend/src/app/frontcraft/auth/logout/logout.component.ts index 96d1e08..de58500 100644 --- a/src/frontend/src/app/frontcraft/auth/logout/logout.component.ts +++ b/src/frontend/src/app/frontcraft/auth/logout/logout.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService } from '../../services/login-api'; +import { IApiService } from '../../services/ApiService'; import { Router } from '@angular/router'; @Component({ @@ -9,11 +9,13 @@ import { Router } from '@angular/router'; export class LogoutComponent implements OnInit{ constructor( - private api : ApiService + private api : IApiService, + private router: Router ){} ngOnInit(){ - this.api.logout() + this.api.logout().then(() => { + this.router.navigate(['/auth/login']) + }) } - } \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/auth/register/register.component.ts b/src/frontend/src/app/frontcraft/auth/register/register.component.ts index f3e8a41..b56f6f4 100644 --- a/src/frontend/src/app/frontcraft/auth/register/register.component.ts +++ b/src/frontend/src/app/frontcraft/auth/register/register.component.ts @@ -1,9 +1,10 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService as ApiService, hash } from '../../services/login-api'; +import { ClientApiService as ClientApiService } from '../../services/client-login-api'; import { Router } from '@angular/router'; import { _Rank, _Class, Class, User, _Race } from '../../../../../../backend/Types/Types' import { specs } from '../../../../../../backend/Types/PlayerSpecs' import { race } from 'rxjs'; +import { hash, IApiService } from '../../services/ApiService'; @Component({ @@ -33,7 +34,7 @@ export class RegisterComponent implements OnInit{ constructor( private router : Router, - private api : ApiService + private api : IApiService ){} ngOnInit(){ diff --git a/src/frontend/src/app/frontcraft/pages/armory/armory.component.html b/src/frontend/src/app/frontcraft/pages/armory/armory.component.html index ef0e237..6ce46a5 100644 --- a/src/frontend/src/app/frontcraft/pages/armory/armory.component.html +++ b/src/frontend/src/app/frontcraft/pages/armory/armory.component.html @@ -1,6 +1,5 @@ +class = "col-12 col-xl-9">

Armory diff --git a/src/frontend/src/app/frontcraft/pages/armory/armory.component.ts b/src/frontend/src/app/frontcraft/pages/armory/armory.component.ts index 8e1987a..d8b1437 100644 --- a/src/frontend/src/app/frontcraft/pages/armory/armory.component.ts +++ b/src/frontend/src/app/frontcraft/pages/armory/armory.component.ts @@ -2,7 +2,8 @@ import { Component, OnInit } from '@angular/core'; import { Item, Stats } from '../../../../../../backend/Types/Types'; import { NbToastrService } from '@nebular/theme'; -import { ApiService } from '../../services/login-api'; +import { ClientApiService } from '../../services/client-login-api'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'armory', @@ -18,7 +19,7 @@ export class FrontcraftArmoryComponent implements OnInit { gear: Item[] = [] constructor( - private api: ApiService, + private api: IApiService, private toastr: NbToastrService ) { } diff --git a/src/frontend/src/app/frontcraft/pages/character/character.component.html b/src/frontend/src/app/frontcraft/pages/character/character.component.html index 1402ab1..76218ec 100644 --- a/src/frontend/src/app/frontcraft/pages/character/character.component.html +++ b/src/frontend/src/app/frontcraft/pages/character/character.component.html @@ -1,6 +1,5 @@ +class = "col-12 col-xl-9">

diff --git a/src/frontend/src/app/frontcraft/pages/character/character.component.ts b/src/frontend/src/app/frontcraft/pages/character/character.component.ts index 3227312..9999a05 100644 --- a/src/frontend/src/app/frontcraft/pages/character/character.component.ts +++ b/src/frontend/src/app/frontcraft/pages/character/character.component.ts @@ -1,9 +1,10 @@ import { Component, OnInit, Input } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { ApiService as ApiService } from '../../services/login-api'; +import { ClientApiService as ClientApiService } from '../../services/client-login-api'; import { Spec, User, Character, Item } from '../../../../../../backend/Types/Types'; import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; import { _Tiers } from '../../../../../../backend/Types/Items'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'character', @@ -28,7 +29,7 @@ export class FrontcraftCharacterComponent implements OnInit{ gear2:string[] = [] constructor( - private api: ApiService, + private api: IApiService, private route: ActivatedRoute, ){} diff --git a/src/frontend/src/app/frontcraft/pages/characters/characters.component.ts b/src/frontend/src/app/frontcraft/pages/characters/characters.component.ts index f0908fe..21b427b 100644 --- a/src/frontend/src/app/frontcraft/pages/characters/characters.component.ts +++ b/src/frontend/src/app/frontcraft/pages/characters/characters.component.ts @@ -1,8 +1,8 @@ import { Component, AfterViewInit, OnDestroy } from '@angular/core'; import { NbThemeService } from '@nebular/theme'; -import { ApiService } from '../../services/login-api'; import { _Class } from '../../../../../../backend/Types/Types'; import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; +import { IApiService } from '../../services/ApiService'; @Component({ @@ -17,7 +17,7 @@ export class FrontcraftCharactersComponent implements AfterViewInit, OnDestroy{ allcharacters = [] displayedcharacters = [] - constructor(private theme: NbThemeService, private api:ApiService) { + constructor(private theme: NbThemeService, private api:IApiService) { } changeSearch(){ diff --git a/src/frontend/src/app/frontcraft/pages/pages-layout.component.ts b/src/frontend/src/app/frontcraft/pages/pages-layout.component.ts index 30c7e7b..8476eb4 100644 --- a/src/frontend/src/app/frontcraft/pages/pages-layout.component.ts +++ b/src/frontend/src/app/frontcraft/pages/pages-layout.component.ts @@ -1,7 +1,10 @@ -import { Component, AfterContentChecked, OnInit, AfterContentInit } from '@angular/core'; +import { Component, AfterContentInit, OnInit } from '@angular/core'; import { NbMenuItem } from '@nebular/theme'; -import { ApiService } from '../services/login-api'; +import { ClientApiService } from '../services/client-login-api'; import { Router } from '@angular/router'; +import { IApiService } from '../services/ApiService'; + +declare const Cookies @Component({ selector: 'page-layout', @@ -13,7 +16,8 @@ import { Router } from '@angular/router'; `, }) -export class PagesLayoutComponent implements AfterContentInit{ +export class PagesLayoutComponent implements OnInit{ + menu:NbMenuItem[] = [{ icon: 'image', title: 'Raids', @@ -33,15 +37,17 @@ export class PagesLayoutComponent implements AfterContentInit{ }] constructor( - private loginSvc : ApiService, + private api : IApiService, private router : Router ){} - ngAfterContentInit() : void { - this.loginSvc.checkLogin().then(loggedin => { - if(!loggedin){ - this.router.navigateByUrl("/auth") - } - }); + ngOnInit(): void { + /* + const u = this.api.getCurrentUser() + + if(!u){ + this.router.navigate(['/auth/login']) + } + */ } } \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/pages/pages-routing.module.ts b/src/frontend/src/app/frontcraft/pages/pages-routing.module.ts deleted file mode 100644 index 9372b3c..0000000 --- a/src/frontend/src/app/frontcraft/pages/pages-routing.module.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { PagesLayoutComponent } from './pages-layout.component'; -import { FrontcraftCharacterComponent } from './character/character.component'; -import { FrontcraftUserComponent } from './user/user.component'; -import { FrontcraftRaidsComponent } from './raids/raids.component'; -import { FrontcraftRaidComponent } from './raid/raid.component'; -import { FrontcraftArchiveComponent } from './raid/archive.component'; -import { FrontcraftRulesComponent } from './rules/rules.component'; -import { FrontcraftCharactersComponent } from './characters/characters.component'; -import { FrontcraftArmoryComponent } from './armory/armory.component'; - -export const routes: Routes = [ - { - path: '', - component: PagesLayoutComponent, - children: [ - { - path: 'user/:name', - component: FrontcraftUserComponent - }, - { - path: 'raid/:id', - component: FrontcraftRaidComponent - }, - { - path: 'archive/:id', - component: FrontcraftArchiveComponent - }, - { - path: 'raids', - component: FrontcraftRaidsComponent - }, - { - path: 'character/:name', - component: FrontcraftCharacterComponent - }, - { - path: 'characters', - component: FrontcraftCharactersComponent, - }, - { - path: 'rules', - component: FrontcraftRulesComponent - }, - { - path: 'armory', - component: FrontcraftArmoryComponent - }, - { - path: '**', - redirectTo: 'raids' - }, - ] - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class FrontcraftRoutingModule { -} \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/pages/pages.module.ts b/src/frontend/src/app/frontcraft/pages/pages.module.ts index 54dc347..d1c5135 100644 --- a/src/frontend/src/app/frontcraft/pages/pages.module.ts +++ b/src/frontend/src/app/frontcraft/pages/pages.module.ts @@ -18,7 +18,6 @@ import { NbDatepickerModule, NbSelectModule } from '@nebular/theme'; -import { FrontcraftRoutingModule } from './pages-routing.module'; import { PagesLayoutComponent } from './pages-layout.component'; import { ThemeModule } from '../../@theme/theme.module'; import { FrontcraftCharacterComponent } from './character/character.component'; @@ -42,7 +41,6 @@ import { FrontcraftArmoryComponent } from './armory/armory.component'; @NgModule({ imports: [ - FrontcraftRoutingModule, CommonModule, FormsModule, RouterModule, diff --git a/src/frontend/src/app/frontcraft/pages/raid/archive.component.ts b/src/frontend/src/app/frontcraft/pages/raid/archive.component.ts index 3cc85c4..40ad99c 100644 --- a/src/frontend/src/app/frontcraft/pages/raid/archive.component.ts +++ b/src/frontend/src/app/frontcraft/pages/raid/archive.component.ts @@ -1,8 +1,9 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { ApiService as ApiService } from '../../services/login-api'; +import { ClientApiService as ClientApiService } from '../../services/client-login-api'; import { RaidData } from '../../../../../../backend/Types/Types'; import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'archive', @@ -38,7 +39,7 @@ export class FrontcraftArchiveComponent implements OnInit{ search = "" constructor( - private api: ApiService, + private api: IApiService, private route: ActivatedRoute, ){ } @@ -60,7 +61,7 @@ export class FrontcraftArchiveComponent implements OnInit{ [ ...raiddata.tanks, ...raiddata.healers, - ...Object.values(raiddata.participants).flat() + ...Object.values(raiddata.participants).flat() ].forEach(p => { p['color'] = getClassColor(p.class) }) diff --git a/src/frontend/src/app/frontcraft/pages/raid/characterpicker.component.ts b/src/frontend/src/app/frontcraft/pages/raid/characterpicker.component.ts index c4c266e..2c752cb 100644 --- a/src/frontend/src/app/frontcraft/pages/raid/characterpicker.component.ts +++ b/src/frontend/src/app/frontcraft/pages/raid/characterpicker.component.ts @@ -1,8 +1,9 @@ import { OnInit, Component } from '@angular/core'; import { NbWindowRef, NbToastrService, NbDialogRef } from '@nebular/theme'; import { RaidData, Character } from '../../../../../../backend/Types/Types'; -import { ApiService } from '../../services/login-api'; +import { ClientApiService } from '../../services/client-login-api'; import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'characterpicker', @@ -15,7 +16,7 @@ export class FrontcraftCharacerpickerComponent implements OnInit{ constructor( protected dialogRef: NbDialogRef, - private api : ApiService, + private api : IApiService, private toast : NbToastrService ){} diff --git a/src/frontend/src/app/frontcraft/pages/raid/raid.component.html b/src/frontend/src/app/frontcraft/pages/raid/raid.component.html index 860db32..03cd5ab 100644 --- a/src/frontend/src/app/frontcraft/pages/raid/raid.component.html +++ b/src/frontend/src/app/frontcraft/pages/raid/raid.component.html @@ -1,6 +1,6 @@
@@ -97,9 +95,7 @@ [src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" /> {{ participant.charactername }} - + Trial
@@ -128,9 +124,7 @@ [src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" /> {{ participant.charactername }} - + Trial @@ -149,41 +143,52 @@
- + - + - + -
-
-
- - [ {{token.level}} ] - - {{token.charactername}} - - -   - -
- Becomes valid when promoted to Raider + + + + + + + +
+
+ +
+
+
+ + + [ {{token.level}} ]  + + {{token.charactername}} + + + + +
+ Becomes valid when promoted to Raider +
+
+ + Trial +
+
- - - Trial -
- - + +
diff --git a/src/frontend/src/app/frontcraft/pages/raid/raid.component.ts b/src/frontend/src/app/frontcraft/pages/raid/raid.component.ts index c969697..fd99314 100644 --- a/src/frontend/src/app/frontcraft/pages/raid/raid.component.ts +++ b/src/frontend/src/app/frontcraft/pages/raid/raid.component.ts @@ -1,12 +1,13 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { ActivatedRoute, Router, NavigationStart } from '@angular/router'; -import { ApiService as ApiService } from '../../services/login-api'; +import { ClientApiService as ClientApiService } from '../../services/client-login-api'; import { RaidData, Raid, Signup, Character, Spec, Item, SRToken } from '../../../../../../backend/Types/Types'; import { NbWindowService, NbToastrService, NbDialogService } from '@nebular/theme'; import { FrontcraftCharacerpickerComponent } from './characterpicker.component'; import { getClassColor, SpecT } from '../../../../../../backend/Types/PlayerSpecs'; import { FrontcraftBuyTokenComponent } from '../shop/buytoken.component'; import { allItems } from '../../../../../../backend/Types/Items'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'raid', @@ -45,7 +46,7 @@ export class FrontcraftRaidComponent implements OnInit, OnDestroy{ uuid constructor( - private api: ApiService, + private api: IApiService, private route: ActivatedRoute, private router: Router, private dialogService : NbDialogService, diff --git a/src/frontend/src/app/frontcraft/pages/raids/createraid.compontent.ts b/src/frontend/src/app/frontcraft/pages/raids/createraid.compontent.ts index 98dc41a..2bf9e91 100644 --- a/src/frontend/src/app/frontcraft/pages/raids/createraid.compontent.ts +++ b/src/frontend/src/app/frontcraft/pages/raids/createraid.compontent.ts @@ -1,8 +1,9 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService } from '../../services/login-api'; +import { ClientApiService } from '../../services/client-login-api'; import { Raid, RaidData } from '../../../../../../backend/Types/Types'; import { NbWindowRef, NbDialogRef } from '@nebular/theme'; import { Tiers, _Tiers } from '../../../../../../backend/Types/Items'; +import { IApiService } from '../../services/ApiService'; const ONE_MINUTE = 60000 const ONE_HOUR = 60 * ONE_MINUTE @@ -27,7 +28,7 @@ export class FrontcraftCreateRaidsComponent implements OnInit { constructor( protected dialogRef: NbDialogRef, - private api: ApiService + private api: IApiService ) {} loadNext(cardData) { diff --git a/src/frontend/src/app/frontcraft/pages/raids/raids.component.ts b/src/frontend/src/app/frontcraft/pages/raids/raids.component.ts index d8405f5..802e01e 100644 --- a/src/frontend/src/app/frontcraft/pages/raids/raids.component.ts +++ b/src/frontend/src/app/frontcraft/pages/raids/raids.component.ts @@ -1,8 +1,9 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; -import { ApiService } from '../../services/login-api'; +import { ClientApiService } from '../../services/client-login-api'; import { NbWindowService, NbDialogService } from '@nebular/theme'; import { FrontcraftCreateRaidsComponent } from './createraid.compontent'; import { Router, NavigationStart } from '@angular/router'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'raids', @@ -19,7 +20,7 @@ export class FrontcraftRaidsComponent implements OnInit, OnDestroy{ uuid constructor( - private api: ApiService, + private api: IApiService, private router: Router, private dialogService: NbDialogService ) { diff --git a/src/frontend/src/app/frontcraft/pages/rules/rules.component.html b/src/frontend/src/app/frontcraft/pages/rules/rules.component.html index a7b6eb8..60bf97c 100644 --- a/src/frontend/src/app/frontcraft/pages/rules/rules.component.html +++ b/src/frontend/src/app/frontcraft/pages/rules/rules.component.html @@ -60,14 +60,21 @@ -
-
-
- +{{rule.modifier}} {{rule.race}} {{rule.specname}} {{rule.class}} -
-
({{rule.description}})
-
-
+ + + + + + + + +
+ +
+ +{{rule.modifier}} {{rule.race}} {{rule.specname}} {{rule.class}} + +
({{rule.description}})
+
diff --git a/src/frontend/src/app/frontcraft/pages/rules/rules.component.ts b/src/frontend/src/app/frontcraft/pages/rules/rules.component.ts index cdc0afc..f6c3d81 100644 --- a/src/frontend/src/app/frontcraft/pages/rules/rules.component.ts +++ b/src/frontend/src/app/frontcraft/pages/rules/rules.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService as ApiService } from '../../services/login-api'; import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'rules', @@ -12,7 +12,7 @@ export class FrontcraftRulesComponent implements OnInit{ rules = {} constructor( - private api: ApiService, + private api: IApiService, ){ } diff --git a/src/frontend/src/app/frontcraft/pages/shop/buytoken.component.ts b/src/frontend/src/app/frontcraft/pages/shop/buytoken.component.ts index b413197..33dfec9 100644 --- a/src/frontend/src/app/frontcraft/pages/shop/buytoken.component.ts +++ b/src/frontend/src/app/frontcraft/pages/shop/buytoken.component.ts @@ -1,10 +1,11 @@ import { Component, OnInit, ContentChild, AfterContentInit, ViewChild, AfterViewInit, Input, Output, EventEmitter } from '@angular/core'; -import { ApiService as ApiService } from '../../services/login-api'; +import { ClientApiService as ClientApiService } from '../../services/client-login-api'; import { FrontcraftItemSelectComponent } from './itemselector.component'; import { NbWindowService, NbWindowRef, NbToastrService, NbDialogService, NbDialogRef } from '@nebular/theme'; import { Item, Character, SRToken, Signup } from '../../../../../../backend/Types/Types'; import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; import { _Tiers, allItems, Tiers } from '../../../../../../backend/Types/Items'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'buyToken', @@ -88,7 +89,7 @@ import { _Tiers, allItems, Tiers } from '../../../../../../backend/Types/Items'; constructor( private toastr: NbToastrService, protected dialogRef: NbDialogRef, - private api : ApiService + private api : IApiService ){} async ngOnInit() { diff --git a/src/frontend/src/app/frontcraft/pages/shop/item.component.ts b/src/frontend/src/app/frontcraft/pages/shop/item.component.ts index 6e5290f..4e66349 100644 --- a/src/frontend/src/app/frontcraft/pages/shop/item.component.ts +++ b/src/frontend/src/app/frontcraft/pages/shop/item.component.ts @@ -1,6 +1,4 @@ import { Component, OnInit, Input, } from '@angular/core'; -import { ApiService as ApiService } from '../../services/login-api'; -import { NbToastrService, } from '@nebular/theme'; import { Item, } from '../../../../../../backend/Types/Types'; import { _Tiers, } from '../../../../../../backend/Types/Items'; diff --git a/src/frontend/src/app/frontcraft/pages/shop/itemselector.component.ts b/src/frontend/src/app/frontcraft/pages/shop/itemselector.component.ts index d93d02f..ca5d986 100644 --- a/src/frontend/src/app/frontcraft/pages/shop/itemselector.component.ts +++ b/src/frontend/src/app/frontcraft/pages/shop/itemselector.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import { ApiService } from '../../services/login-api'; +import { ClientApiService } from '../../services/client-login-api'; import { Item, Character } from '../../../../../../backend/Types/Types'; +import { IApiService } from '../../services/ApiService'; @Component({ selector: 'itemselect', @@ -18,7 +19,7 @@ export class FrontcraftItemSelectComponent implements OnInit{ @Output() onSelect = new EventEmitter(); constructor( - private api: ApiService, + private api: IApiService, ){} async ngOnInit(){ diff --git a/src/frontend/src/app/frontcraft/pages/shop/shop.component.ts b/src/frontend/src/app/frontcraft/pages/shop/shop.component.ts index 75e72cf..9cb320d 100644 --- a/src/frontend/src/app/frontcraft/pages/shop/shop.component.ts +++ b/src/frontend/src/app/frontcraft/pages/shop/shop.component.ts @@ -1,9 +1,7 @@ -import { Component, OnInit, ContentChild, AfterContentInit, ViewChild, AfterViewInit, Input, Output, EventEmitter } from '@angular/core'; -import { ApiService as ApiService } from '../../services/login-api'; -import { FrontcraftItemSelectComponent } from './itemselector.component'; -import { NbWindowService, NbWindowRef, NbToastrService, NbDialogService, NbDialogRef } from '@nebular/theme'; -import { Item, Character, SRToken, Signup } from '../../../../../../backend/Types/Types'; -import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { ClientApiService as ClientApiService } from '../../services/client-login-api'; +import { NbDialogService } from '@nebular/theme'; +import { Item, Character, Signup } from '../../../../../../backend/Types/Types'; import { _Tiers, allItems } from '../../../../../../backend/Types/Items'; @Component({ @@ -20,8 +18,6 @@ export class FrontcraftShopComponent implements OnInit{ allItems = allItems constructor( - private api: ApiService, - private dialogService : NbDialogService ){ } diff --git a/src/frontend/src/app/frontcraft/pages/shop/wowhead.component.ts b/src/frontend/src/app/frontcraft/pages/shop/wowhead.component.ts index eb99e8f..5980fa4 100644 --- a/src/frontend/src/app/frontcraft/pages/shop/wowhead.component.ts +++ b/src/frontend/src/app/frontcraft/pages/shop/wowhead.component.ts @@ -1,6 +1,4 @@ import { Component, OnInit, Input } from '@angular/core'; -import { ApiService as ApiService } from '../../services/login-api'; -import { NbToastrService } from '@nebular/theme'; import { Item } from '../../../../../../backend/Types/Types'; import { _Tiers } from '../../../../../../backend/Types/Items'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; diff --git a/src/frontend/src/app/frontcraft/pages/user/user.component.ts b/src/frontend/src/app/frontcraft/pages/user/user.component.ts index 40a02d3..beca29e 100644 --- a/src/frontend/src/app/frontcraft/pages/user/user.component.ts +++ b/src/frontend/src/app/frontcraft/pages/user/user.component.ts @@ -1,11 +1,11 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService, hash } from '../../services/login-api'; -import { Router, ActivatedRoute } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { User, Spec, Character } from '../../../../../../backend/Types/Types'; import { getClassColor } from '../../../../../../backend/Types/PlayerSpecs'; import { _Tiers } from '../../../../../../backend/Types/Items'; import { _Rank } from '../../../../../../backend/Types/Types'; import { NbToastrService } from '@nebular/theme'; +import { hash, IApiService } from '../../services/ApiService'; @Component({ selector: 'user-component', @@ -19,12 +19,16 @@ export class FrontcraftUserComponent implements OnInit{ ranks = _Rank myProfile = false manageUser - user:User = {} as any + user:User = { + rank: 'Guest', + username: 'Guest', + pwhash: "" + } characters : (Character & Spec)[] = [] constructor( private route: ActivatedRoute, - private api : ApiService, + private api : IApiService, private toastr: NbToastrService ){} diff --git a/src/frontend/src/app/frontcraft/permissions/changePermissions/changePermissions.component.ts b/src/frontend/src/app/frontcraft/permissions/changePermissions/changePermissions.component.ts index a26c326..7a78365 100644 --- a/src/frontend/src/app/frontcraft/permissions/changePermissions/changePermissions.component.ts +++ b/src/frontend/src/app/frontcraft/permissions/changePermissions/changePermissions.component.ts @@ -1,8 +1,9 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService as ApiService } from '../../services/login-api'; +import { ClientApiService as ClientApiService } from '../../services/client-login-api'; import { Router } from '@angular/router'; import { _Rank, _Class, _Race, RPCPermission } from '../../../../../../backend/Types/Types' import { NbToastrService } from '@nebular/theme'; +import { IApiService } from '../../services/ApiService'; @Component({ @@ -15,8 +16,7 @@ export class ChangePermissionsComponent implements OnInit{ ranks = _Rank constructor( - private router : Router, - private api : ApiService, + private api : IApiService, private toastr: NbToastrService ){} @@ -32,9 +32,6 @@ export class ChangePermissionsComponent implements OnInit{ perm[key] = value - console.log(perm); - - await modify.setPermission(perm).catch(e => { }) diff --git a/src/frontend/src/app/frontcraft/permissions/permissions-layout.component.ts b/src/frontend/src/app/frontcraft/permissions/permissions-layout.component.ts index 9ad350b..6726450 100644 --- a/src/frontend/src/app/frontcraft/permissions/permissions-layout.component.ts +++ b/src/frontend/src/app/frontcraft/permissions/permissions-layout.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ApiService } from '../services/login-api'; +import { ClientApiService } from '../services/client-login-api'; import { Router } from '@angular/router'; @Component({ @@ -13,7 +13,6 @@ import { Router } from '@angular/router'; export class PermissionsComponent implements OnInit{ constructor( - private loginSvc : ApiService, private router: Router ){} diff --git a/src/frontend/src/app/frontcraft/permissions/permissions-routing.module.ts b/src/frontend/src/app/frontcraft/permissions/permissions-routing.module.ts deleted file mode 100644 index 5022ddf..0000000 --- a/src/frontend/src/app/frontcraft/permissions/permissions-routing.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { PermissionsComponent } from './permissions-layout.component'; -import { ChangePermissionsComponent } from './changePermissions/changePermissions.component'; - -export const routes: Routes = [ - { - path: '', - component: PermissionsComponent, - children: [ - { - path: '**', - component: ChangePermissionsComponent, - }, - ] - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class PermissionsRoutingModule { -} \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/permissions/permissions.module.ts b/src/frontend/src/app/frontcraft/permissions/permissions.module.ts index 961c1d1..524f3fb 100644 --- a/src/frontend/src/app/frontcraft/permissions/permissions.module.ts +++ b/src/frontend/src/app/frontcraft/permissions/permissions.module.ts @@ -15,13 +15,11 @@ import { } from '@nebular/theme'; import { PermissionsComponent } from './permissions-layout.component'; import { ThemeModule } from '../../@theme/theme.module'; -import { PermissionsRoutingModule } from './permissions-routing.module'; import { ChangePermissionsComponent } from './changePermissions/changePermissions.component'; @NgModule({ imports: [ NbToggleModule, - PermissionsRoutingModule, CommonModule, FormsModule, RouterModule, diff --git a/src/frontend/src/app/frontcraft/services/ApiService.ts b/src/frontend/src/app/frontcraft/services/ApiService.ts new file mode 100644 index 0000000..ee8875a --- /dev/null +++ b/src/frontend/src/app/frontcraft/services/ApiService.ts @@ -0,0 +1,23 @@ +import { Auth, FrontcraftIfc, FrontcraftFeatureIfc, User, SomeOf } from '../../../../../backend/Types/Types'; +import { saltedHash } from '../../../../../backend/Util/hash'; +import { RPCSocket } from 'rpclibrary'; + +export class IApiService{ + getUnprivilegedSocket: () => RPCSocket & FrontcraftIfc + getAuth: () => Auth | undefined + checkLogin: () => Promise + initialize: () => Promise + getCurrentUser: () => User | undefined + login: (username: string, password: string) => Promise> + connectShoutbox: (callback:Function) => Promise + kick: () => Promise + logout: () => Promise + get: (feature : K) => K extends keyof FrontcraftIfc?FrontcraftIfc[K]: + K extends keyof FrontcraftFeatureIfc?(FrontcraftFeatureIfc[K] | void): + never +} + +export async function hash(value:string) : Promise{ + return saltedHash(value, "") +} + diff --git a/src/frontend/src/app/frontcraft/services/login-api.ts b/src/frontend/src/app/frontcraft/services/client-login-api.ts similarity index 72% rename from src/frontend/src/app/frontcraft/services/login-api.ts rename to src/frontend/src/app/frontcraft/services/client-login-api.ts index efa0068..a5edbbb 100644 --- a/src/frontend/src/app/frontcraft/services/login-api.ts +++ b/src/frontend/src/app/frontcraft/services/client-login-api.ts @@ -1,31 +1,29 @@ -import { Injectable, Injector, NgZone } from "@angular/core"; +import { Injectable } from "@angular/core"; import {RPCSocket} from 'rpclibrary/js/src/Frontend' - import { Auth, User, _Class, FrontcraftFeatureIfc, SomeOf, FrontcraftIfc, } from '../../../../../backend/Types/Types' -import { CookieService } from 'ngx-cookie-service'; -import { Router } from '@angular/router'; import { ShoutMessage } from '../../../../../backend/Components/Shoutbox/Interface'; -import { saltedHash } from '../../../../../backend/Util/hash'; -import { NbToastrService } from '@nebular/theme'; +import { hash, IApiService } from './ApiService'; + +declare const Cookies @Injectable() -export class ApiService{ +export class ClientApiService implements IApiService{ private socket:RPCSocket & FrontcraftIfc; private auth:Auth private privSocket: RPCSocket & SomeOf - constructor( - private injector: Injector, - private cookieSvc : CookieService, - private ngZone : NgZone, - private toastr: NbToastrService - ){} + constructor(){ + window['s'] = this + } getUnprivilegedSocket = () : RPCSocket & FrontcraftIfc => this.socket private getPrivilegedSocket = async (auth:Auth) : Promise> => { - if(this.privSocket) return this.privSocket - if(auth == null) throw new Error("Bad Auth") + if(this.privSocket) { + return this.privSocket + } + if(auth == null) + throw new Error("Bad Auth") try{ const sock = new RPCSocket( @@ -38,24 +36,24 @@ export class ApiService{ }) sock.hook('getUserData', () => auth) - sock.hook('navigate', (where:string) => { - this.ngZone.run( () => { - this.injector.get(Router).navigateByUrl(where) - }) - }) sock.on('close', async () => { + console.log("priv#close"); + //handled via unprivileged socket }) sock.on('error', async (e) => { + console.log("priv#error", e); + //handled via unprivileged socket }) const authSock = await sock.connect>(auth.token.value) this.auth = auth this.privSocket = authSock - this.cookieSvc.set('token', JSON.stringify(auth)) + Cookies.set('token', JSON.stringify(auth)) +// document.cookie = JSON.stringify(auth) return authSock }catch(e){ if(this.privSocket) this.privSocket.destroy() @@ -86,13 +84,11 @@ export class ApiService{ try{ auth = await this.socket.UserManager.login(username, pwHash) }catch(e){ - this.toastr.danger("Login failed", "Error") return } if(!auth){ await this.logout() - this.toastr.danger("Login failed", "Error") throw new Error("Login failed") } @@ -105,8 +101,8 @@ export class ApiService{ return sock } - async connectShoutbox(handler) : Promise{ - const res = await this.get('Shoutbox').subscribe(handler) + async connectShoutbox(callback:Function) : Promise{ + const res = await this.get('Shoutbox').subscribe(callback) return async (msg: ShoutMessage) => await this.get('Shoutbox').shout(res.uuid, msg) } @@ -116,25 +112,21 @@ export class ApiService{ } logout = async () => { - this.cookieSvc.set('token', undefined) + Cookies.remove('token') if(this.auth){ try{ await this.socket.UserManager.logout(this.auth.user.username, this.auth.token.value) }catch(e){ - //socket is dead + console.warn(e); } } if(this.privSocket) this.privSocket.destroy() this.privSocket = null this.auth = null - - this.ngZone.run(() => { - this.injector.get(Router).navigate(['/auth']); - }) } - initialize = async () : Promise => { + initialize = async (force = false) : Promise => { if(this.socket){ this.socket.destroy() this.socket = null @@ -143,9 +135,7 @@ export class ApiService{ try{ let conn = new RPCSocket(20000, window.location.hostname) conn.on('close', async () => { - }) - - + }) this.socket = await conn.connect() }catch(e){ @@ -155,9 +145,9 @@ export class ApiService{ } try{ - const cookie = JSON.parse(this.cookieSvc.get('token')) + const cookie = JSON.parse(Cookies.get('token')) - if(cookie != null) { + if(cookie != null && cookie != "") { try{ const auth = await this.socket.UserManager.getAuth(cookie.token.value) if(!auth) return this.socket @@ -168,6 +158,7 @@ export class ApiService{ } } }catch(e){ + Cookies.remove('token') } } @@ -180,13 +171,4 @@ export class ApiService{ await this.logout() return false } -} - -export async function hash(value:string) : Promise{ - return saltedHash(value, "") -} - -//angular depenency manager requires this -export function initializeLoginSvc(svc: ApiService): () => Promise { - return ()=>svc.initialize?svc.initialize():undefined } \ No newline at end of file diff --git a/src/frontend/src/app/frontcraft/services/server-login-api.ts b/src/frontend/src/app/frontcraft/services/server-login-api.ts new file mode 100644 index 0000000..9916e66 --- /dev/null +++ b/src/frontend/src/app/frontcraft/services/server-login-api.ts @@ -0,0 +1,99 @@ +import { Injectable } from "@angular/core"; +import {RPCSocket} from 'rpclibrary/js/src/Frontend' +import { Auth, User, _Class, FrontcraftFeatureIfc, SomeOf, FrontcraftIfc, } from '../../../../../backend/Types/Types' +import { hash, IApiService } from './ApiService'; + +declare const Cookies + +@Injectable() +export class ServerApiService implements IApiService{ + private socket:RPCSocket & FrontcraftIfc; + private auth:Auth + private privSocket: RPCSocket & SomeOf + + constructor(){} + + getUnprivilegedSocket = () : RPCSocket & FrontcraftIfc => this.socket + + get = (feature : K) : K extends keyof FrontcraftIfc?FrontcraftIfc[K]: + K extends keyof FrontcraftFeatureIfc?(FrontcraftFeatureIfc[K] | void): + never => { + //@ts-ignore + return this.socket[feature] + } + + getCurrentUser = () : User | undefined => { + return this.auth?this.auth.user:undefined + } + + login = async (username: string, password: string) : Promise> => { + const pwHash = await hash(password) + let auth + try{ + auth = await this.socket.UserManager.login(username, pwHash) + }catch(e){ + return + } + + if(!auth){ + await this.logout() + throw new Error("Login failed") + } + + //attach error handler now so failed logins dont trigger reloads + this.socket.on('error', async (err) => { + console.log(err); + }) + + } + + async connectShoutbox(callback:Function) : Promise{ + return console.log + } + + kick = async () => { + } + + logout = async () => { + Cookies.remove('token') + if(this.auth){ + try{ + await this.socket.UserManager.logout(this.auth.user.username, this.auth.token.value) + }catch(e){ + console.warn(e); + } + } + + if(this.privSocket) this.privSocket.destroy() + this.privSocket = null + this.auth = null + } + + initialize = async () : Promise => { + if(this.socket){ + this.socket.destroy() + this.socket = null + } + + try{ + let conn = new RPCSocket(20000, window.location.hostname) + conn.on('close', async () => { + }) + + this.socket = await conn.connect() + }catch(e){ + console.log(e); + throw new Error("Websocket cannot connect") + } + } + + getAuth = () => this.auth + + async checkLogin() : Promise{ + if(!this.auth) return false + const valid = this.socket.UserManager.checkToken(this.auth.token.value, this.auth.user.rank) + if(valid) return true + await this.logout() + return false + } +} \ No newline at end of file diff --git a/src/frontend/src/main.server.ts b/src/frontend/src/main.server.ts new file mode 100644 index 0000000..e429066 --- /dev/null +++ b/src/frontend/src/main.server.ts @@ -0,0 +1,9 @@ +import { enableProdMode } from '@angular/core'; + +enableProdMode() + +export { AppServerModule } from './app/app.server.module'; +import { IApiService } from './app/frontcraft/services/ApiService'; +export { IApiService } +export { ServerApiService } from './app/frontcraft/services/server-login-api'; + diff --git a/src/frontend/src/main.ts b/src/frontend/src/main.ts index 8fd0e9d..c8b31f0 100644 --- a/src/frontend/src/main.ts +++ b/src/frontend/src/main.ts @@ -6,12 +6,23 @@ import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; +import { FrontcraftAppModule } from './app/app.module'; import { environment } from './environments/environment'; +import { IApiService } from "./app/frontcraft/services/ApiService" +import { ClientApiService } from './app/frontcraft/services/client-login-api'; if (environment.production) { enableProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); +const serviceObj = new ClientApiService() +serviceObj.initialize().then(_ => { + platformBrowserDynamic([ + { + provide: IApiService, + deps: [], + useValue: serviceObj + } + ]).bootstrapModule(FrontcraftAppModule) + .catch(err => console.error(err)); +}) diff --git a/src/frontend/src/tsconfig.app.json b/src/frontend/src/tsconfig.app.json deleted file mode 100644 index 86333d8..0000000 --- a/src/frontend/src/tsconfig.app.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "paths": { - "@angular/*": [ - "../node_modules/@angular/*" - ], - "@nebular/*": [ - "../node_modules/@nebular/*" - ] - } - }, - "exclude": [ - "test.ts", - "**/*.spec.ts", - "../node_modules/@nebular/**/*.spec.ts", - "../node_modules/rpclibrary/js/**/*" - ], - "include": [ - "../src/*.ts", - "../src/**/*.ts", - "../node_modules/@nebular/**/*.ts" - ] -} diff --git a/src/frontend/tsconfig.app.json b/src/frontend/tsconfig.app.json new file mode 100644 index 0000000..4dd64eb --- /dev/null +++ b/src/frontend/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "paths": { + "@angular/*": [ + "./node_modules/@angular/*" + ], + "@nebular/*": [ + "./node_modules/@nebular/*" + ] + } + }, + "exclude": [ + "test.ts", + "**/*.spec.ts", + "./node_modules/@nebular/**/*.spec.ts", + "./node_modules/rpclibrary/js/**/*" + ], + "include": [ + "./src/*.ts", + "./src/**/*.ts", + ] +} diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json index 370415c..67c0d79 100644 --- a/src/frontend/tsconfig.json +++ b/src/frontend/tsconfig.json @@ -1,15 +1,14 @@ { "compileOnSave": false, "compilerOptions": { - "importHelpers": true, - "module": "commonjs", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, + "outDir": "./out-tsc", + "baseUrl": "./", + "declaration": true, "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "target": "es5", + "importHelpers": true, + "target": "es2015", "typeRoots": [ "node_modules/@types" ], @@ -20,5 +19,8 @@ "plugins": [ { "name": "tslint-language-service"} ] - } + }, + "angularCompilerOptions": { + "enableIvy": false, + }, } diff --git a/src/frontend/tsconfig.server.json b/src/frontend/tsconfig.server.json new file mode 100644 index 0000000..992b1b2 --- /dev/null +++ b/src/frontend/tsconfig.server.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "outDir": "./out-tsc/app-server", + "module": "commonjs", + "types": ["node"] + }, + "files": [ + "src/main.server.ts", + "server.ts" + ], + "angularCompilerOptions": { + "entryModule": "./src/app/app.server.module#AppServerModule" + } +} diff --git a/src/frontend/webpack.server.config.js b/src/frontend/webpack.server.config.js new file mode 100644 index 0000000..b5b0e84 --- /dev/null +++ b/src/frontend/webpack.server.config.js @@ -0,0 +1,36 @@ +const path = require('path'); +const webpack = require('webpack'); + +module.exports = { + entry: { server: './server.ts' }, + resolve: { extensions: ['.js', '.ts'] }, + mode: 'none', + target: 'node', + externals: [/(node_modules|main(\\|\/)..*(\\|\/).js)/], + output: { + path: path.join(__dirname, `dist`), + filename: '[name].js', + libraryTarget: 'commonjs' + }, + module: { + rules: [ + { test: /\.ts$/, loader: 'ts-loader', exclude: /^(?!.*\.spec\.ts$).*\.ts$/ }, + { + test: /(\\|\/)@angular(\\|\/)core(\\|\/).+\.js$/, + parser: { system: true } + } + ] + }, + plugins: [ + new webpack.ContextReplacementPlugin( + /(.+)?angular(\\|\/)core(.+)?/, + path.join(__dirname, 'src'), // location of your src + {} // a map of your routes + ), + new webpack.ContextReplacementPlugin( + /(.+)?express(\\|\/)(.+)?/, + path.join(__dirname, 'src'), + {} + ) + ] +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index b39aea6..3b91d38 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,18 +9,12 @@ "strict": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - + "baseUrl": "./", "outDir": "./lib", - //"types": ["node"], + "types": ["node", "mocha"], "strictNullChecks": false }, - "include": ["src/backend/**/*"], - "exclude": [ - "./src/frontend/**/*", - "./node_modules/**/*", - "./src/frontend/node_modules/**/*", - "./test", - ], + "include": ["src", "test"], "angularCompilerOptions": { "enableIvy": false, "entryModule": "./src/backend/Admin/app.server.module#AppServerModule"