Browse Source

Added dependency injection

master
peter 5 years ago
parent
commit
78ad241526

+ 89
- 26
package-lock.json View File

506
     "ansi-colors": {
506
     "ansi-colors": {
507
       "version": "3.2.3",
507
       "version": "3.2.3",
508
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
508
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
509
-      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw=="
509
+      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
510
+      "dev": true
510
     },
511
     },
511
     "ansi-regex": {
512
     "ansi-regex": {
512
       "version": "4.1.0",
513
       "version": "4.1.0",
513
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
514
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
514
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
515
+      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
516
+      "dev": true
515
     },
517
     },
516
     "ansi-styles": {
518
     "ansi-styles": {
517
       "version": "3.2.1",
519
       "version": "3.2.1",
518
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
520
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
519
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
521
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
522
+      "dev": true,
520
       "requires": {
523
       "requires": {
521
         "color-convert": "^1.9.0"
524
         "color-convert": "^1.9.0"
522
       }
525
       }
566
       "version": "1.0.10",
569
       "version": "1.0.10",
567
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
570
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
568
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
571
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
572
+      "dev": true,
569
       "requires": {
573
       "requires": {
570
         "sprintf-js": "~1.0.2"
574
         "sprintf-js": "~1.0.2"
571
       }
575
       }
883
     "browser-stdout": {
887
     "browser-stdout": {
884
       "version": "1.3.1",
888
       "version": "1.3.1",
885
       "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
889
       "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
886
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
890
+      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
891
+      "dev": true
887
     },
892
     },
888
     "browserify-aes": {
893
     "browserify-aes": {
889
       "version": "1.2.0",
894
       "version": "1.2.0",
1071
     "camelcase": {
1076
     "camelcase": {
1072
       "version": "5.3.1",
1077
       "version": "5.3.1",
1073
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
1078
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
1074
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
1079
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
1080
+      "dev": true
1075
     },
1081
     },
1076
     "caseless": {
1082
     "caseless": {
1077
       "version": "0.12.0",
1083
       "version": "0.12.0",
1082
       "version": "2.4.2",
1088
       "version": "2.4.2",
1083
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
1089
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
1084
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
1090
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
1091
+      "dev": true,
1085
       "requires": {
1092
       "requires": {
1086
         "ansi-styles": "^3.2.1",
1093
         "ansi-styles": "^3.2.1",
1087
         "escape-string-regexp": "^1.0.5",
1094
         "escape-string-regexp": "^1.0.5",
1199
       "version": "5.0.0",
1206
       "version": "5.0.0",
1200
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
1207
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
1201
       "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
1208
       "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
1209
+      "dev": true,
1202
       "requires": {
1210
       "requires": {
1203
         "string-width": "^3.1.0",
1211
         "string-width": "^3.1.0",
1204
         "strip-ansi": "^5.2.0",
1212
         "strip-ansi": "^5.2.0",
1229
       "version": "1.9.3",
1237
       "version": "1.9.3",
1230
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1238
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1231
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1239
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1240
+      "dev": true,
1232
       "requires": {
1241
       "requires": {
1233
         "color-name": "1.1.3"
1242
         "color-name": "1.1.3"
1234
       }
1243
       }
1236
     "color-name": {
1245
     "color-name": {
1237
       "version": "1.1.3",
1246
       "version": "1.1.3",
1238
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1247
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1239
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
1248
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
1249
+      "dev": true
1240
     },
1250
     },
1241
     "colorette": {
1251
     "colorette": {
1242
       "version": "1.0.8",
1252
       "version": "1.0.8",
1491
     "decamelize": {
1501
     "decamelize": {
1492
       "version": "1.2.0",
1502
       "version": "1.2.0",
1493
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
1503
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
1494
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
1504
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
1505
+      "dev": true
1495
     },
1506
     },
1496
     "decode-uri-component": {
1507
     "decode-uri-component": {
1497
       "version": "0.2.0",
1508
       "version": "0.2.0",
1729
     "diff": {
1740
     "diff": {
1730
       "version": "3.5.0",
1741
       "version": "3.5.0",
1731
       "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
1742
       "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
1732
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
1743
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
1744
+      "dev": true
1733
     },
1745
     },
1734
     "diffie-hellman": {
1746
     "diffie-hellman": {
1735
       "version": "5.0.3",
1747
       "version": "5.0.3",
1800
     "emoji-regex": {
1812
     "emoji-regex": {
1801
       "version": "7.0.3",
1813
       "version": "7.0.3",
1802
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
1814
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
1803
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
1815
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
1816
+      "dev": true
1804
     },
1817
     },
1805
     "emojis-list": {
1818
     "emojis-list": {
1806
       "version": "2.1.0",
1819
       "version": "2.1.0",
1877
     "escape-string-regexp": {
1890
     "escape-string-regexp": {
1878
       "version": "1.0.5",
1891
       "version": "1.0.5",
1879
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1892
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1880
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
1893
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1894
+      "dev": true
1881
     },
1895
     },
1882
     "escodegen": {
1896
     "escodegen": {
1883
       "version": "1.13.0",
1897
       "version": "1.13.0",
1911
     "esprima": {
1925
     "esprima": {
1912
       "version": "4.0.1",
1926
       "version": "4.0.1",
1913
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1927
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1914
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
1928
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1929
+      "dev": true
1915
     },
1930
     },
1916
     "esrecurse": {
1931
     "esrecurse": {
1917
       "version": "4.2.1",
1932
       "version": "4.2.1",
2301
       "version": "3.0.0",
2316
       "version": "3.0.0",
2302
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2317
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2303
       "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2318
       "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2319
+      "dev": true,
2304
       "requires": {
2320
       "requires": {
2305
         "locate-path": "^3.0.0"
2321
         "locate-path": "^3.0.0"
2306
       }
2322
       }
2352
       "version": "4.1.0",
2368
       "version": "4.1.0",
2353
       "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
2369
       "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
2354
       "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
2370
       "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
2371
+      "dev": true,
2355
       "requires": {
2372
       "requires": {
2356
         "is-buffer": "~2.0.3"
2373
         "is-buffer": "~2.0.3"
2357
       },
2374
       },
2359
         "is-buffer": {
2376
         "is-buffer": {
2360
           "version": "2.0.4",
2377
           "version": "2.0.4",
2361
           "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
2378
           "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
2362
-          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
2379
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
2380
+          "dev": true
2363
         }
2381
         }
2364
       }
2382
       }
2365
     },
2383
     },
3219
     "get-caller-file": {
3237
     "get-caller-file": {
3220
       "version": "2.0.5",
3238
       "version": "2.0.5",
3221
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
3239
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
3222
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
3240
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
3241
+      "dev": true
3223
     },
3242
     },
3224
     "get-own-enumerable-property-symbols": {
3243
     "get-own-enumerable-property-symbols": {
3225
       "version": "3.0.2",
3244
       "version": "3.0.2",
3406
     "growl": {
3425
     "growl": {
3407
       "version": "1.10.5",
3426
       "version": "1.10.5",
3408
       "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
3427
       "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
3409
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
3428
+      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
3429
+      "dev": true
3410
     },
3430
     },
3411
     "har-schema": {
3431
     "har-schema": {
3412
       "version": "2.0.0",
3432
       "version": "2.0.0",
3433
     "has-flag": {
3453
     "has-flag": {
3434
       "version": "3.0.0",
3454
       "version": "3.0.0",
3435
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
3455
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
3436
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
3456
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
3457
+      "dev": true
3437
     },
3458
     },
3438
     "has-symbols": {
3459
     "has-symbols": {
3439
       "version": "1.0.0",
3460
       "version": "1.0.0",
3497
     "he": {
3518
     "he": {
3498
       "version": "1.2.0",
3519
       "version": "1.2.0",
3499
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
3520
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
3500
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
3521
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
3522
+      "dev": true
3501
     },
3523
     },
3502
     "hmac-drbg": {
3524
     "hmac-drbg": {
3503
       "version": "1.0.1",
3525
       "version": "1.0.1",
3929
       "version": "3.13.1",
3951
       "version": "3.13.1",
3930
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
3952
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
3931
       "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
3953
       "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
3954
+      "dev": true,
3932
       "requires": {
3955
       "requires": {
3933
         "argparse": "^1.0.7",
3956
         "argparse": "^1.0.7",
3934
         "esprima": "^4.0.0"
3957
         "esprima": "^4.0.0"
4103
       "version": "3.0.0",
4126
       "version": "3.0.0",
4104
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
4127
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
4105
       "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
4128
       "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
4129
+      "dev": true,
4106
       "requires": {
4130
       "requires": {
4107
         "p-locate": "^3.0.0",
4131
         "p-locate": "^3.0.0",
4108
         "path-exists": "^3.0.0"
4132
         "path-exists": "^3.0.0"
4117
       "version": "2.2.0",
4141
       "version": "2.2.0",
4118
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
4142
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
4119
       "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
4143
       "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
4144
+      "dev": true,
4120
       "requires": {
4145
       "requires": {
4121
         "chalk": "^2.0.1"
4146
         "chalk": "^2.0.1"
4122
       }
4147
       }
4505
       "version": "7.0.0",
4530
       "version": "7.0.0",
4506
       "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz",
4531
       "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz",
4507
       "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==",
4532
       "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==",
4533
+      "dev": true,
4508
       "requires": {
4534
       "requires": {
4509
         "ansi-colors": "3.2.3",
4535
         "ansi-colors": "3.2.3",
4510
         "browser-stdout": "1.3.1",
4536
         "browser-stdout": "1.3.1",
4536
           "version": "3.1.1",
4562
           "version": "3.1.1",
4537
           "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
4563
           "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
4538
           "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
4564
           "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
4565
+          "dev": true,
4539
           "requires": {
4566
           "requires": {
4540
             "normalize-path": "^3.0.0",
4567
             "normalize-path": "^3.0.0",
4541
             "picomatch": "^2.0.4"
4568
             "picomatch": "^2.0.4"
4544
         "binary-extensions": {
4571
         "binary-extensions": {
4545
           "version": "2.0.0",
4572
           "version": "2.0.0",
4546
           "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
4573
           "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
4547
-          "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
4574
+          "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
4575
+          "dev": true
4548
         },
4576
         },
4549
         "braces": {
4577
         "braces": {
4550
           "version": "3.0.2",
4578
           "version": "3.0.2",
4551
           "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
4579
           "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
4552
           "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
4580
           "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
4581
+          "dev": true,
4553
           "requires": {
4582
           "requires": {
4554
             "fill-range": "^7.0.1"
4583
             "fill-range": "^7.0.1"
4555
           }
4584
           }
4558
           "version": "3.3.0",
4587
           "version": "3.3.0",
4559
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
4588
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
4560
           "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
4589
           "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
4590
+          "dev": true,
4561
           "requires": {
4591
           "requires": {
4562
             "anymatch": "~3.1.1",
4592
             "anymatch": "~3.1.1",
4563
             "braces": "~3.0.2",
4593
             "braces": "~3.0.2",
4573
           "version": "3.2.6",
4603
           "version": "3.2.6",
4574
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
4604
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
4575
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
4605
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
4606
+          "dev": true,
4576
           "requires": {
4607
           "requires": {
4577
             "ms": "^2.1.1"
4608
             "ms": "^2.1.1"
4578
           }
4609
           }
4581
           "version": "7.0.1",
4612
           "version": "7.0.1",
4582
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
4613
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
4583
           "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
4614
           "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
4615
+          "dev": true,
4584
           "requires": {
4616
           "requires": {
4585
             "to-regex-range": "^5.0.1"
4617
             "to-regex-range": "^5.0.1"
4586
           }
4618
           }
4589
           "version": "2.1.2",
4621
           "version": "2.1.2",
4590
           "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
4622
           "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
4591
           "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
4623
           "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
4624
+          "dev": true,
4592
           "optional": true
4625
           "optional": true
4593
         },
4626
         },
4594
         "glob": {
4627
         "glob": {
4595
           "version": "7.1.3",
4628
           "version": "7.1.3",
4596
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
4629
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
4597
           "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
4630
           "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
4631
+          "dev": true,
4598
           "requires": {
4632
           "requires": {
4599
             "fs.realpath": "^1.0.0",
4633
             "fs.realpath": "^1.0.0",
4600
             "inflight": "^1.0.4",
4634
             "inflight": "^1.0.4",
4608
           "version": "5.1.0",
4642
           "version": "5.1.0",
4609
           "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
4643
           "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
4610
           "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
4644
           "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
4645
+          "dev": true,
4611
           "requires": {
4646
           "requires": {
4612
             "is-glob": "^4.0.1"
4647
             "is-glob": "^4.0.1"
4613
           }
4648
           }
4616
           "version": "2.1.0",
4651
           "version": "2.1.0",
4617
           "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
4652
           "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
4618
           "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
4653
           "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
4654
+          "dev": true,
4619
           "requires": {
4655
           "requires": {
4620
             "binary-extensions": "^2.0.0"
4656
             "binary-extensions": "^2.0.0"
4621
           }
4657
           }
4623
         "is-extglob": {
4659
         "is-extglob": {
4624
           "version": "2.1.1",
4660
           "version": "2.1.1",
4625
           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
4661
           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
4626
-          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
4662
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
4663
+          "dev": true
4627
         },
4664
         },
4628
         "is-glob": {
4665
         "is-glob": {
4629
           "version": "4.0.1",
4666
           "version": "4.0.1",
4630
           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
4667
           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
4631
           "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
4668
           "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
4669
+          "dev": true,
4632
           "requires": {
4670
           "requires": {
4633
             "is-extglob": "^2.1.1"
4671
             "is-extglob": "^2.1.1"
4634
           }
4672
           }
4636
         "is-number": {
4674
         "is-number": {
4637
           "version": "7.0.0",
4675
           "version": "7.0.0",
4638
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
4676
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
4639
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
4677
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
4678
+          "dev": true
4640
         },
4679
         },
4641
         "minimatch": {
4680
         "minimatch": {
4642
           "version": "3.0.4",
4681
           "version": "3.0.4",
4643
           "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
4682
           "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
4644
           "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
4683
           "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
4684
+          "dev": true,
4645
           "requires": {
4685
           "requires": {
4646
             "brace-expansion": "^1.1.7"
4686
             "brace-expansion": "^1.1.7"
4647
           }
4687
           }
4649
         "ms": {
4689
         "ms": {
4650
           "version": "2.1.1",
4690
           "version": "2.1.1",
4651
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4691
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4652
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
4692
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
4693
+          "dev": true
4653
         },
4694
         },
4654
         "readdirp": {
4695
         "readdirp": {
4655
           "version": "3.2.0",
4696
           "version": "3.2.0",
4656
           "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
4697
           "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
4657
           "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
4698
           "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
4699
+          "dev": true,
4658
           "requires": {
4700
           "requires": {
4659
             "picomatch": "^2.0.4"
4701
             "picomatch": "^2.0.4"
4660
           }
4702
           }
4663
           "version": "6.0.0",
4705
           "version": "6.0.0",
4664
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
4706
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
4665
           "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
4707
           "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
4708
+          "dev": true,
4666
           "requires": {
4709
           "requires": {
4667
             "has-flag": "^3.0.0"
4710
             "has-flag": "^3.0.0"
4668
           }
4711
           }
4671
           "version": "5.0.1",
4714
           "version": "5.0.1",
4672
           "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
4715
           "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
4673
           "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
4716
           "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
4717
+          "dev": true,
4674
           "requires": {
4718
           "requires": {
4675
             "is-number": "^7.0.0"
4719
             "is-number": "^7.0.0"
4676
           }
4720
           }
4679
           "version": "13.3.0",
4723
           "version": "13.3.0",
4680
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
4724
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
4681
           "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
4725
           "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
4726
+          "dev": true,
4682
           "requires": {
4727
           "requires": {
4683
             "cliui": "^5.0.0",
4728
             "cliui": "^5.0.0",
4684
             "find-up": "^3.0.0",
4729
             "find-up": "^3.0.0",
4870
       "version": "1.0.6",
4915
       "version": "1.0.6",
4871
       "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
4916
       "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
4872
       "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
4917
       "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
4918
+      "dev": true,
4873
       "requires": {
4919
       "requires": {
4874
         "object.getownpropertydescriptors": "^2.0.3",
4920
         "object.getownpropertydescriptors": "^2.0.3",
4875
         "semver": "^5.7.0"
4921
         "semver": "^5.7.0"
4981
     "normalize-path": {
5027
     "normalize-path": {
4982
       "version": "3.0.0",
5028
       "version": "3.0.0",
4983
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
5029
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
4984
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
5030
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
5031
+      "dev": true
4985
     },
5032
     },
4986
     "npm-bundled": {
5033
     "npm-bundled": {
4987
       "version": "1.0.6",
5034
       "version": "1.0.6",
5082
       "version": "4.1.0",
5129
       "version": "4.1.0",
5083
       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
5130
       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
5084
       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
5131
       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
5132
+      "dev": true,
5085
       "requires": {
5133
       "requires": {
5086
         "define-properties": "^1.1.2",
5134
         "define-properties": "^1.1.2",
5087
         "function-bind": "^1.1.1",
5135
         "function-bind": "^1.1.1",
5367
       "version": "2.2.1",
5415
       "version": "2.2.1",
5368
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
5416
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
5369
       "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
5417
       "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
5418
+      "dev": true,
5370
       "requires": {
5419
       "requires": {
5371
         "p-try": "^2.0.0"
5420
         "p-try": "^2.0.0"
5372
       }
5421
       }
5375
       "version": "3.0.0",
5424
       "version": "3.0.0",
5376
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5425
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5377
       "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5426
       "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5427
+      "dev": true,
5378
       "requires": {
5428
       "requires": {
5379
         "p-limit": "^2.0.0"
5429
         "p-limit": "^2.0.0"
5380
       }
5430
       }
5550
     "picomatch": {
5600
     "picomatch": {
5551
       "version": "2.2.1",
5601
       "version": "2.2.1",
5552
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
5602
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
5553
-      "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA=="
5603
+      "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
5604
+      "dev": true
5554
     },
5605
     },
5555
     "pify": {
5606
     "pify": {
5556
       "version": "3.0.0",
5607
       "version": "3.0.0",
5940
     "require-directory": {
5991
     "require-directory": {
5941
       "version": "2.1.1",
5992
       "version": "2.1.1",
5942
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
5993
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
5943
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
5994
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
5995
+      "dev": true
5944
     },
5996
     },
5945
     "require-main-filename": {
5997
     "require-main-filename": {
5946
       "version": "2.0.0",
5998
       "version": "2.0.0",
5947
       "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
5999
       "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
5948
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
6000
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
6001
+      "dev": true
5949
     },
6002
     },
5950
     "requirejs": {
6003
     "requirejs": {
5951
       "version": "2.3.6",
6004
       "version": "2.3.6",
6461
     "sprintf-js": {
6514
     "sprintf-js": {
6462
       "version": "1.0.3",
6515
       "version": "1.0.3",
6463
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
6516
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
6464
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
6517
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
6518
+      "dev": true
6465
     },
6519
     },
6466
     "sqlite3": {
6520
     "sqlite3": {
6467
       "version": "4.1.0",
6521
       "version": "4.1.0",
6605
       "version": "3.1.0",
6659
       "version": "3.1.0",
6606
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
6660
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
6607
       "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
6661
       "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
6662
+      "dev": true,
6608
       "requires": {
6663
       "requires": {
6609
         "emoji-regex": "^7.0.1",
6664
         "emoji-regex": "^7.0.1",
6610
         "is-fullwidth-code-point": "^2.0.0",
6665
         "is-fullwidth-code-point": "^2.0.0",
6652
       "version": "5.2.0",
6707
       "version": "5.2.0",
6653
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
6708
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
6654
       "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
6709
       "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
6710
+      "dev": true,
6655
       "requires": {
6711
       "requires": {
6656
         "ansi-regex": "^4.1.0"
6712
         "ansi-regex": "^4.1.0"
6657
       }
6713
       }
6680
       "version": "5.5.0",
6736
       "version": "5.5.0",
6681
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6737
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6682
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6738
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6739
+      "dev": true,
6683
       "requires": {
6740
       "requires": {
6684
         "has-flag": "^3.0.0"
6741
         "has-flag": "^3.0.0"
6685
       }
6742
       }
7306
     "which-module": {
7363
     "which-module": {
7307
       "version": "2.0.0",
7364
       "version": "2.0.0",
7308
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
7365
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
7309
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
7366
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
7367
+      "dev": true
7310
     },
7368
     },
7311
     "wide-align": {
7369
     "wide-align": {
7312
       "version": "1.1.3",
7370
       "version": "1.1.3",
7359
       "version": "5.1.0",
7417
       "version": "5.1.0",
7360
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
7418
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
7361
       "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
7419
       "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
7420
+      "dev": true,
7362
       "requires": {
7421
       "requires": {
7363
         "ansi-styles": "^3.2.0",
7422
         "ansi-styles": "^3.2.0",
7364
         "string-width": "^3.0.0",
7423
         "string-width": "^3.0.0",
7421
     "y18n": {
7480
     "y18n": {
7422
       "version": "4.0.0",
7481
       "version": "4.0.0",
7423
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
7482
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
7424
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
7483
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
7484
+      "dev": true
7425
     },
7485
     },
7426
     "yallist": {
7486
     "yallist": {
7427
       "version": "2.1.2",
7487
       "version": "2.1.2",
7451
       "version": "13.1.1",
7511
       "version": "13.1.1",
7452
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
7512
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
7453
       "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
7513
       "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
7514
+      "dev": true,
7454
       "requires": {
7515
       "requires": {
7455
         "camelcase": "^5.0.0",
7516
         "camelcase": "^5.0.0",
7456
         "decamelize": "^1.2.0"
7517
         "decamelize": "^1.2.0"
7460
       "version": "1.6.0",
7521
       "version": "1.6.0",
7461
       "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
7522
       "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
7462
       "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
7523
       "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
7524
+      "dev": true,
7463
       "requires": {
7525
       "requires": {
7464
         "flat": "^4.1.0",
7526
         "flat": "^4.1.0",
7465
         "lodash": "^4.17.15",
7527
         "lodash": "^4.17.15",
7470
           "version": "13.3.0",
7532
           "version": "13.3.0",
7471
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
7533
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
7472
           "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
7534
           "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
7535
+          "dev": true,
7473
           "requires": {
7536
           "requires": {
7474
             "cliui": "^5.0.0",
7537
             "cliui": "^5.0.0",
7475
             "find-up": "^3.0.0",
7538
             "find-up": "^3.0.0",

+ 3
- 2
package.json View File

4
   "version": "1.0.0",
4
   "version": "1.0.0",
5
   "scripts": {
5
   "scripts": {
6
     "tsc": "tsc",
6
     "tsc": "tsc",
7
-    "start": "npm run build; node lib/src/Launcher.js",
7
+    "start": "npm run build; node lib/src/backend/Launcher.js",
8
+    "start-backend": "npm run build-backend; node lib/src/backend/Launcher.js",
8
     "build": "npm run clean; npm run build-backend; npm run build-frontend",
9
     "build": "npm run clean; npm run build-backend; npm run build-frontend",
9
     "test": "npm run clean && npm run build-backend && mocha lib/test/backendTest.js",
10
     "test": "npm run clean && npm run build-backend && mocha lib/test/backendTest.js",
10
     "build-backend": "tsc;",
11
     "build-backend": "tsc;",
36
     "loadson": "^1.0.0",
37
     "loadson": "^1.0.0",
37
     "log4js": "^4.5.1",
38
     "log4js": "^4.5.1",
38
     "lowdb": "^1.0.0",
39
     "lowdb": "^1.0.0",
39
-    "mocha": "^7.0.0",
40
     "node-fetch": "^2.6.0",
40
     "node-fetch": "^2.6.0",
41
     "path": "^0.12.7",
41
     "path": "^0.12.7",
42
     "reflect-metadata": "^0.1.13",
42
     "reflect-metadata": "^0.1.13",
56
     "@types/node": "^11.13.19",
56
     "@types/node": "^11.13.19",
57
     "@types/semver": "^6.0.1",
57
     "@types/semver": "^6.0.1",
58
     "madge": "^3.6.0",
58
     "madge": "^3.6.0",
59
+    "mocha": "^7.0.0",
59
     "terser-webpack-plugin": "^1.4.1",
60
     "terser-webpack-plugin": "^1.4.1",
60
     "ts-loader": "^5.3.3",
61
     "ts-loader": "^5.3.3",
61
     "typescript": "^3.5.3",
62
     "typescript": "^3.5.3",

+ 11
- 5
src/backend/Admin/Admin.ts View File

10
 import { GuildManager } from '../Components/Guild/GuildManager';
10
 import { GuildManager } from '../Components/Guild/GuildManager';
11
 import { ItemManager } from '../Components/Item/ItemManager';
11
 import { ItemManager } from '../Components/Item/ItemManager';
12
 import { RaidManager } from '../Components/Raid/RaidManager';
12
 import { RaidManager } from '../Components/Raid/RaidManager';
13
-import { CharacterManager } from '../Components/User/CharacterManager';
14
-import { LoginManager } from '../Components/User/LoginManager';
13
+import { CharacterManager } from '../Components/Character/CharacterManager';
14
+import { LoginManager } from '../Components/Login/LoginManager';
15
 import { RootComponent } from '../Injector/ServiceDecorator';
15
 import { RootComponent } from '../Injector/ServiceDecorator';
16
 import { TableDefinitionExporter } from '../Types/Interfaces';
16
 import { TableDefinitionExporter } from '../Types/Interfaces';
17
 import { AdminConf, TableDefiniton } from '../Types/Types';
17
 import { AdminConf, TableDefiniton } from '../Types/Types';
18
 import { RPCConfigLoader } from '../Components/RPCConfigLoader';
18
 import { RPCConfigLoader } from '../Components/RPCConfigLoader';
19
 import { FrontworkComponent } from '../Types/FrontworkComponent';
19
 import { FrontworkComponent } from '../Types/FrontworkComponent';
20
 import { IAdmin } from './Interface';
20
 import { IAdmin } from './Interface';
21
+import { Injector } from '../Injector/Injector';
21
 
22
 
22
 
23
 
23
 const logger = getLogger("admin", 'debug') 
24
 const logger = getLogger("admin", 'debug') 
64
         await this.makeKnex()
65
         await this.makeKnex()
65
         this.startWebsocket()
66
         this.startWebsocket()
66
         await Promise.all( this.frontworkComponents.map(c => c.initialize?c.initialize():undefined ))
67
         await Promise.all( this.frontworkComponents.map(c => c.initialize?c.initialize():undefined ))
68
+        logger.debug(this.frontworkComponents.length+" components initialized")
67
         this.startWebserver()
69
         this.startWebserver()
68
     }
70
     }
69
 
71
 
70
     stop(){
72
     stop(){
71
-        process.exit(0);
73
+        Promise.race([
74
+            Promise.all( this.frontworkComponents.map(c => c.stop?c.stop():undefined )),
75
+            new Promise((res, rej) => { setTimeout(res, 250);})
76
+        ]).catch(e => logger.warn(e))
77
+        .finally(() => { process.exit(0) })
72
     }
78
     }
73
 
79
 
74
     protected configChangeHandler = (conf:AdminConf, key?:string) => {
80
     protected configChangeHandler = (conf:AdminConf, key?:string) => {
95
         this.rpcServer = new RPCServer(20000, [
101
         this.rpcServer = new RPCServer(20000, [
96
             ...this.frontworkComponents,
102
             ...this.frontworkComponents,
97
         ])
103
         ])
104
+        logger.debug("Websocket up on", 20000)
98
     }
105
     }
99
 
106
 
100
     private startWebserver(){
107
     private startWebserver(){
183
 
190
 
184
 process.on( 'SIGINT', function() {
191
 process.on( 'SIGINT', function() {
185
     logger.info("Shutting down from SIGINT (Ctrl-C)" );
192
     logger.info("Shutting down from SIGINT (Ctrl-C)" );
186
-    // some other closing procedures go here
187
-    process.exit(0);
193
+    Injector.resolve<FrontworkAdmin>(FrontworkAdmin).stop()
188
 })
194
 })

src/backend/Components/User/CharacterManager.ts → src/backend/Components/Character/CharacterManager.ts View File

3
 import { TableDefiniton, Character } from "../../Types/Types";
3
 import { TableDefiniton, Character } from "../../Types/Types";
4
 import { CharacterManagerIfc } from "./RPCInterface";
4
 import { CharacterManagerIfc } from "./RPCInterface";
5
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
5
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
6
-import { FrontworkAdmin } from "../../Admin/Admin";
7
-import { LoginManager } from "./LoginManager";
8
 import { getSpecTableData, SpecT } from "../../Types/PlayerSpecs";
6
 import { getSpecTableData, SpecT } from "../../Types/PlayerSpecs";
9
 import { IAdmin } from "../../Admin/Interface";
7
 import { IAdmin } from "../../Admin/Interface";
8
+import { ILoginManager } from "../Login/Interface";
9
+import { ICharacterManager } from "./Interface";
10
+import { getLogger } from "log4js";
10
 
11
 
11
-@Module()
12
+@Module(ICharacterManager)
12
 export class CharacterManager
13
 export class CharacterManager
13
-implements FrontworkComponent<CharacterManagerIfc, RPCInterface>{
14
+implements FrontworkComponent<CharacterManagerIfc, RPCInterface>, ICharacterManager{
14
     name = "CharacterManager" as "CharacterManager";   
15
     name = "CharacterManager" as "CharacterManager";   
15
     
16
     
16
     @Inject(IAdmin)
17
     @Inject(IAdmin)
17
     private admin: IAdmin   
18
     private admin: IAdmin   
18
 
19
 
19
-    private loginManager : LoginManager
20
+    @Inject(ILoginManager)
21
+    private loginManager : any
20
 
22
 
21
     exportRPCs = () => [
23
     exportRPCs = () => [
22
         {
24
         {
60
     ]
62
     ]
61
 
63
 
62
     private initialized = false
64
     private initialized = false
65
+    
63
     initialize = async () => {
66
     initialize = async () => {
64
-
65
         if(!this.initialized)
67
         if(!this.initialized)
66
             this.initialized = true
68
             this.initialized = true
67
         //initialize spec table
69
         //initialize spec table
70
+
71
+        getLogger('CharacterManager').debug('inserting specs')
72
+
68
         await this.admin.knex('specs').insert(getSpecTableData()).catch(e => { console.log("skipping spec insertion") })
73
         await this.admin.knex('specs').insert(getSpecTableData()).catch(e => { console.log("skipping spec insertion") })
69
     }
74
     }
70
 
75
 
71
     createCharacter = async (userToken: string, character : Character) : Promise<Character> => {
76
     createCharacter = async (userToken: string, character : Character) : Promise<Character> => {
72
         try{
77
         try{
73
-
78
+            const user = this.loginManager.getUserRecordByToken(userToken)
74
             await this.admin.knex('characters').insert(character)
79
             await this.admin.knex('characters').insert(character)
75
             const char : Character = await this.admin.knex.select('*').from('characters').where(character).first()
80
             const char : Character = await this.admin.knex.select('*').from('characters').where(character).first()
76
             return char
81
             return char

+ 9
- 0
src/backend/Components/Character/Interface.ts View File

1
+import { Character } from "../../Types/Types"
2
+import { SpecT } from "../../Types/PlayerSpecs"
3
+
4
+
5
+export class ICharacterManager{
6
+    createCharacter: (usertoken: string, char : Character) => Promise<Character>
7
+    getSpecId: <c extends keyof SpecT>(clazz: c, name: SpecT[c]) => Promise<number>
8
+    getCharacters: () => Promise<Character[]>
9
+}

+ 15
- 0
src/backend/Components/Character/RPCInterface.ts View File

1
+import { ICharacterManager } from "./Interface"
2
+
3
+
4
+export type CharacterManagerIfc = {
5
+    CharacterManager: {
6
+        getSpecId : ICharacterManager['getSpecId']
7
+        getCharacters : ICharacterManager['getCharacters']
8
+    }
9
+}
10
+
11
+export type CharacterManagerFeatureIfc = {
12
+    createCharacter: {
13
+        createCharacter: ICharacterManager['createCharacter']
14
+    }
15
+}

+ 23
- 23
src/backend/Components/Guild/GuildManager.ts View File

1
 import { ConfigLoader } from "loadson";
1
 import { ConfigLoader } from "loadson";
2
 import { Inject, Module } from "../../Injector/ServiceDecorator";
2
 import { Inject, Module } from "../../Injector/ServiceDecorator";
3
 import { GuildManagerFeatureIfc, GuildManagerIfc } from "./RPCInterface";
3
 import { GuildManagerFeatureIfc, GuildManagerIfc } from "./RPCInterface";
4
-import { FrontworkAdmin } from "../../Admin/Admin";
5
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
4
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
6
 import { _Rank, Rank } from "../../Types/Types";
5
 import { _Rank, Rank } from "../../Types/Types";
7
 import { IAdmin } from "../../Admin/Interface";
6
 import { IAdmin } from "../../Admin/Interface";
7
+import { IGuildManager } from "./Interface";
8
 
8
 
9
 export type Guild = {
9
 export type Guild = {
10
     name: string
10
     name: string
12
     description: string
12
     description: string
13
 }
13
 }
14
 
14
 
15
-@Module()
15
+@Module(IGuildManager)
16
 export class GuildManager
16
 export class GuildManager
17
-implements FrontworkComponent<GuildManagerIfc, GuildManagerFeatureIfc>{
17
+implements FrontworkComponent<GuildManagerIfc, GuildManagerFeatureIfc>, IGuildManager{
18
 
18
 
19
     name = "GuildManager" as "GuildManager";    
19
     name = "GuildManager" as "GuildManager";    
20
     
20
     
21
     @Inject(IAdmin)
21
     @Inject(IAdmin)
22
-    private admin
22
+    private admin : IAdmin
23
 
23
 
24
-    guild: ConfigLoader<Guild>
25
-
26
-    constructor(){
27
-        this.guild = new ConfigLoader({
28
-            name: "guild",
29
-            getDefaultConfig: () => {
30
-                return <Guild>{
31
-                    name: "Tranquil",
32
-                    realm: "Gandling EU",
33
-                    description: "Wee woo"
34
-                }
24
+    guild: ConfigLoader<Guild> = new ConfigLoader({
25
+        name: "guild",
26
+        getDefaultConfig: () => {
27
+            return <Guild>{
28
+                name: "Tranquil",
29
+                realm: "Gandling EU",
30
+                description: "Wee woo"
35
             }
31
             }
36
-        }, "./config")
37
-    }
32
+        }
33
+    }, "./config")
38
 
34
 
39
     exportRPCs = () => [{
35
     exportRPCs = () => [{
40
         name: 'getHeadCount' as 'getHeadCount',
36
         name: 'getHeadCount' as 'getHeadCount',
41
-        call: this.headCount
37
+        call: this.getHeadCount
42
     },{
38
     },{
43
         name: 'getGuildInfo' as 'getGuildInfo',
39
         name: 'getGuildInfo' as 'getGuildInfo',
44
-        call: async () => this.guild.getConfig()
40
+        call: this.getGuildInfo
45
     }]
41
     }]
46
 
42
 
47
     exportRPCFeatures = () => [{
43
     exportRPCFeatures = () => [{
48
         name: 'manageGuild' as 'manageGuild',
44
         name: 'manageGuild' as 'manageGuild',
49
         exportRPCs: () => [{
45
         exportRPCs: () => [{
50
             name: 'setName' as 'setName',
46
             name: 'setName' as 'setName',
51
-            call: async (name:string) => this.guild.setConfigKey('name', name)
47
+            call: this.setName
52
         },{
48
         },{
53
             name: 'setRealm' as 'setRealm',
49
             name: 'setRealm' as 'setRealm',
54
-            call: async (realm:string) => this.guild.setConfigKey('realm', realm)
50
+            call: this.setRealm
55
         }, {
51
         }, {
56
             name: 'setDescription' as 'setDescription',
52
             name: 'setDescription' as 'setDescription',
57
-            call: async (description: string) => this.guild.setConfigKey('description', description)
53
+            call: this.setDescription
58
         }]
54
         }]
59
     }]
55
     }]
60
     
56
     
61
     getTableDefinitions = () => []
57
     getTableDefinitions = () => []
62
 
58
 
63
-    headCount = async () => await Promise.all(
59
+    getHeadCount = async() : Promise<{ rank: Rank; count: number; }[]> => await Promise.all(
64
         _Rank.map(async r => {
60
         _Rank.map(async r => {
65
             const res = await this.admin.knex
61
             const res = await this.admin.knex
66
             .select('*')
62
             .select('*')
76
         })
72
         })
77
     )
73
     )
78
 
74
 
75
+    getGuildInfo = async () => this.guild.getConfig()
76
+    setName = async (name:string) => this.guild.setConfigKey('name', name)
77
+    setDescription = async (description: string) => this.guild.setConfigKey('description', description)
78
+    setRealm = async (realm:string) => this.guild.setConfigKey('realm', realm)
79
 }
79
 }

+ 10
- 0
src/backend/Components/Guild/Interface.ts View File

1
+import { Rank } from "../../Types/Types"
2
+import { Guild } from "./GuildManager"
3
+
4
+export class IGuildManager{
5
+    getHeadCount: () => Promise<{rank:Rank, count: number}[]>
6
+    getGuildInfo: () => Promise<Guild>
7
+    setName: (name:string) => Promise<Guild>
8
+    setRealm: (realm:string) => Promise<Guild>
9
+    setDescription: (description:string) => Promise<Guild>
10
+}

+ 6
- 7
src/backend/Components/Guild/RPCInterface.ts View File

1
-import { Guild } from "./GuildManager"
2
-import { Rank } from "../../Types/Types"
1
+import { IGuildManager } from "./Interface"
3
 
2
 
4
 export type GuildManagerIfc = {
3
 export type GuildManagerIfc = {
5
     GuildManager: {
4
     GuildManager: {
6
-        getHeadCount: () => Promise<{rank:Rank, count: number}[]>
7
-        getGuildInfo: () => Promise<Guild>
5
+        getHeadCount: IGuildManager['getHeadCount']
6
+        getGuildInfo: IGuildManager['getGuildInfo']
8
     }
7
     }
9
 }
8
 }
10
 
9
 
11
 export type GuildManagerFeatureIfc = {
10
 export type GuildManagerFeatureIfc = {
12
     manageGuild: {
11
     manageGuild: {
13
-        setName: (name:string) => Promise<Guild>
14
-        setRealm: (realm:string) => Promise<Guild>
15
-        setDescription: (description:string) => Promise<Guild>
12
+        setName: IGuildManager['setName']
13
+        setRealm: IGuildManager['setRealm']
14
+        setDescription: IGuildManager['setDescription']
16
     }
15
     }
17
 }
16
 }

+ 6
- 0
src/backend/Components/Item/Interface.ts View File

1
+import { Item } from "../../Types/Types"
2
+
3
+export class IItemManager{
4
+    getItems: () => Promise<Item[]>
5
+    getItem: (name:string) => Promise<Item>
6
+}

+ 9
- 16
src/backend/Components/Item/ItemManager.ts View File

4
 import { ItemManagerFeatureIfc, ItemManagerIfc } from "./RPCInterface";
4
 import { ItemManagerFeatureIfc, ItemManagerIfc } from "./RPCInterface";
5
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
5
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
6
 import { TableDefinitionExporter } from "../../Types/Interfaces";
6
 import { TableDefinitionExporter } from "../../Types/Interfaces";
7
-import { FrontworkAdmin } from "../../Admin/Admin";
8
-import { TableDefiniton } from "../../Types/Types";
7
+import { TableDefiniton, Item } from "../../Types/Types";
9
 import { IAdmin } from "../../Admin/Interface";
8
 import { IAdmin } from "../../Admin/Interface";
9
+import { IItemManager } from "./Interface";
10
+import { getLogger } from "log4js";
10
 
11
 
11
 const fetch = require('node-fetch')
12
 const fetch = require('node-fetch')
12
 const xml2js = require('xml2js');
13
 const xml2js = require('xml2js');
13
 const parser = new xml2js.Parser(/* options */);
14
 const parser = new xml2js.Parser(/* options */);
14
 
15
 
15
-export type Item = {
16
-    id?:number
17
-    name:string
18
-    iconname:string
19
-    url:string
20
-    quality:string
21
-    hidden:boolean
22
-}
23
-
24
-@Module()
16
+@Module(IItemManager)
25
 export class ItemManager
17
 export class ItemManager
26
-implements FrontworkComponent<ItemManagerIfc, ItemManagerFeatureIfc>, TableDefinitionExporter{
18
+implements FrontworkComponent<ItemManagerIfc, ItemManagerFeatureIfc>, TableDefinitionExporter, IItemManager{
27
     name = "ItemManager" as "ItemManager";    
19
     name = "ItemManager" as "ItemManager";    
28
     
20
     
29
     @Inject(IAdmin)
21
     @Inject(IAdmin)
30
-    private admin: FrontworkAdmin
22
+    private admin: IAdmin
31
 
23
 
32
     exportRPCs(): RPC<any, any>[]{
24
     exportRPCs(): RPC<any, any>[]{
33
         return [{
25
         return [{
99
             this.initialized = true        
91
             this.initialized = true        
100
         
92
         
101
         const allItems = [...T1]
93
         const allItems = [...T1]
94
+        getLogger('ItemManager').debug('Checking items')
95
+
102
         const countCache = await this.countItems()
96
         const countCache = await this.countItems()
103
         if(countCache != allItems.length){
97
         if(countCache != allItems.length){
104
             const items:Item[] = await Promise.all(allItems.map((i) => this.getItem(i)))
98
             const items:Item[] = await Promise.all(allItems.map((i) => this.getItem(i)))
107
                 .knex('items')
101
                 .knex('items')
108
                 .insert(items)
102
                 .insert(items)
109
             }catch(e){
103
             }catch(e){
110
-                console.log(e)
111
-                console.info("Skipping item insertion")
104
+                getLogger('ItemManager').debug("Skipping item insertion")
112
             }
105
             }
113
         }
106
         }
114
     }
107
     }

+ 10
- 3
src/backend/Components/Item/RPCInterface.ts View File

1
-import { RPCInterface } from "rpclibrary"
1
+import { IItemManager } from "./Interface"
2
 
2
 
3
-export type ItemManagerIfc = RPCInterface
4
-export type ItemManagerFeatureIfc = RPCInterface
3
+export type ItemManagerIfc = {
4
+    ItemManager: {
5
+        getItem: IItemManager['getItem']
6
+        getItems: IItemManager['getItems']
7
+    }
8
+}
9
+
10
+export type ItemManagerFeatureIfc = {
11
+}

+ 11
- 0
src/backend/Components/Login/Interface.ts View File

1
+import { Auth, Rank, User, RPCPermission } from "../../Types/Types"
2
+
3
+export class ILoginManager{
4
+    login: (username:string, pwHash:string) => Promise<Auth>
5
+    logout: (username: string, tokenValue :string) => Promise<void>
6
+    getAuth: (tokenValue: string) => Promise<Auth>
7
+    createUser: (user:User) => Promise<User>
8
+    setPermission: (perm: RPCPermission) => Promise<void>
9
+    getPermissions: () => Promise<RPCPermission[]>
10
+    checkToken: (token: string, rank: Rank) => boolean
11
+}

src/backend/Components/User/LoginManager.ts → src/backend/Components/Login/LoginManager.ts View File

4
 import { GuildManager } from "../Guild/GuildManager";
4
 import { GuildManager } from "../Guild/GuildManager";
5
 import { ItemManager } from "../Item/ItemManager";
5
 import { ItemManager } from "../Item/ItemManager";
6
 import { RaidManager } from "../Raid/RaidManager";
6
 import { RaidManager } from "../Raid/RaidManager";
7
-import { CharacterManager } from "./CharacterManager";
7
+import { CharacterManager } from "../Character/CharacterManager";
8
 import { LoginManagerIfc, LoginManagerFeatureIfc } from "./RPCInterface";
8
 import { LoginManagerIfc, LoginManagerFeatureIfc } from "./RPCInterface";
9
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
9
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
10
 import { Rank, User, Auth, _Rank, TableDefiniton, RPCPermission, FrontcraftFeatureIfc, AnyRPCExporter, Token } from "../../Types/Types";
10
 import { Rank, User, Auth, _Rank, TableDefiniton, RPCPermission, FrontcraftFeatureIfc, AnyRPCExporter, Token } from "../../Types/Types";
11
 import { IAdmin } from "../../Admin/Interface";
11
 import { IAdmin } from "../../Admin/Interface";
12
+import { ILoginManager } from "./Interface";
13
+import { getLogger } from "log4js";
12
 
14
 
13
 const uuid = require('uuid/v4')
15
 const uuid = require('uuid/v4')
14
 
16
 
21
 }
23
 }
22
 
24
 
23
 
25
 
24
-@Module()
26
+@Module(ILoginManager)
25
 export class LoginManager
27
 export class LoginManager
26
-implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>{
28
+implements FrontworkComponent<LoginManagerIfc, LoginManagerFeatureIfc>, ILoginManager{
27
     name = "Authenticator" as "Authenticator";   
29
     name = "Authenticator" as "Authenticator";   
28
 
30
 
29
     @Inject(IAdmin)
31
     @Inject(IAdmin)
61
             call: this.getAuth
63
             call: this.getAuth
62
         },{
64
         },{
63
             name: 'checkToken' as 'checkToken',
65
             name: 'checkToken' as 'checkToken',
64
-            call: async (tokenValue : string, rank: Rank) => this.checkToken(tokenValue, rank)
66
+            call: this.checkToken
65
         },{
67
         },{
66
             name: 'createUser' as 'createUser',
68
             name: 'createUser' as 'createUser',
67
             call: this.createUser
69
             call: this.createUser
111
     initialize = async () => {
113
     initialize = async () => {
112
         this.exporters = [this.guild, this.item, this.raid, this.character] 
114
         this.exporters = [this.guild, this.item, this.raid, this.character] 
113
         //set up permissions
115
         //set up permissions
116
+        getLogger('LoginManager').debug('inserting permissions')
117
+
114
         await Promise.all( 
118
         await Promise.all( 
115
             [this, ...this.exporters].flatMap(exp => exp.exportRPCFeatures().map(async (feature) => {
119
             [this, ...this.exporters].flatMap(exp => exp.exportRPCFeatures().map(async (feature) => {
116
             try{
120
             try{
117
                 await this.admin.knex.insert({ name: feature.name }).into('rpcpermissions')
121
                 await this.admin.knex.insert({ name: feature.name }).into('rpcpermissions')
118
-            }catch(e){}
122
+            }catch(e){
123
+                console.log(e);
124
+            }
119
         })))
125
         })))
120
 
126
 
121
         //start rankServers
127
         //start rankServers
122
-        const rankServers : any = {}   
128
+        getLogger('LoginManager').debug('Starting rank servers')
123
 
129
 
124
-        for(let i = 0; i < _Rank.length; i++){
125
-            const rank:Rank = _Rank[i]
130
+        let rankServers = { } as any
131
+        await Promise.all(_Rank.map(async (r,i) => {
126
             const port = 20001 + i
132
             const port = 20001 + i
127
-            const rankServer = await this.startRankServer(rank, port)
128
-            rankServers[rank] = {
133
+            const rankServer = await this.startRankServer(r, port)
134
+            rankServers[r] = {
129
                 server: rankServer,
135
                 server: rankServer,
130
                 port: port,
136
                 port: port,
131
                 allowed: []
137
                 allowed: []
132
             }
138
             }
133
-        }
139
+        }))
134
         this.rankServers = rankServers
140
         this.rankServers = rankServers
141
+        
135
     
142
     
136
         setInterval(this.checkExpiredSessions, 600_000)   
143
         setInterval(this.checkExpiredSessions, 600_000)   
137
     }
144
     }
138
 
145
 
146
+    stop = async () => {
147
+        Object.values(this.userLogins).forEach(x => Object.values(x.connections).forEach(c => c.destroy()))
148
+
149
+        await Promise.all(Object
150
+            .values(this.rankServers)
151
+            .map(async state => {
152
+                try{
153
+                    //return await state.server.destroy()
154
+                }catch(e){
155
+                    getLogger('LoginManager').warn(e)
156
+                }
157
+            })
158
+        );
159
+        
160
+    }
161
+
139
     checkExpiredSessions = () => {
162
     checkExpiredSessions = () => {
140
         Object.values(this.userLogins).map(userLogin => {
163
         Object.values(this.userLogins).map(userLogin => {
141
             const auth = userLogin.auth
164
             const auth = userLogin.auth
146
     }
169
     }
147
 
170
 
148
     checkConnection = async (socket: Socket) => {
171
     checkConnection = async (socket: Socket) => {
149
-        let data : any = false
172
+        let data : any
150
         let tries = 0
173
         let tries = 0
151
         while(!data){
174
         while(!data){
152
             tries ++
175
             tries ++
153
             if(tries === 5){
176
             if(tries === 5){
177
+                getLogger('LoginManager').debug('Connection check failed for connection *'+socket.port)
178
+
154
                 socket.destroy()
179
                 socket.destroy()
155
                 return
180
                 return
156
             }
181
             }
282
     }
307
     }
283
 
308
 
284
     startRankServer = async (rank : Rank, port: number) : Promise<RPCServer> => {
309
     startRankServer = async (rank : Rank, port: number) : Promise<RPCServer> => {
310
+
285
         const allowedRPCs = await this.getRPCForRank(rank)
311
         const allowedRPCs = await this.getRPCForRank(rank)
286
-        let rpcServer : RPCServer = new RPCServer(port, allowedRPCs, {
287
-            closeHandler: (socket) => { 
288
-                Object.values(this.userLogins)
289
-                    .forEach(login => delete login.connections[socket.port])
290
-
291
-            },
292
-            connectionHandler: (socket) => {
293
-                this.checkConnection(socket).catch(() => {}) //sometimes times out if you go too fast
294
-            },
295
-            sesame: (sesame) => this.checkToken(sesame, rank)
296
-        })
312
+        let rpcServer
313
+        let n = 0
314
+        while(!rpcServer){
315
+            n++            
316
+            await Promise.race([
317
+                new Promise((res, rej) => {
318
+                    rpcServer = new RPCServer(port, allowedRPCs, {
319
+                        closeHandler: (socket) => { 
320
+                            Object.values(this.userLogins)
321
+                                .forEach(login => delete login.connections[socket.port])
322
+            
323
+                        },
324
+                        connectionHandler: (socket) => {
325
+                            this.checkConnection(socket).catch((e) => {
326
+                                console.log(e);
327
+                            }) //sometimes times out if you go too fast
328
+                        },
329
+                        errorHandler: (socket, e, rpcName, args) => {
330
+                            console.log(rpcName, args);
331
+                        },
332
+                        sesame: (sesame) => this.checkToken(sesame, rank)
333
+                    })
334
+                    res()
335
+                }),
336
+                new Promise((res, rej) => setTimeout(res, 500))
337
+            ])
338
+            if(!rpcServer && n>1) 
339
+                getLogger('LoginManager').warn("createServer retry nr.", n, 'port', port)
340
+        }
297
         return rpcServer
341
         return rpcServer
298
     }
342
     }
299
 
343
 

+ 18
- 0
src/backend/Components/Login/RPCInterface.ts View File

1
+import { ILoginManager } from "./Interface"
2
+
3
+export type LoginManagerIfc = {
4
+    Authenticator: {
5
+        checkToken: ILoginManager['checkToken']
6
+        login: ILoginManager['login']
7
+        logout: ILoginManager['logout']
8
+        createUser: ILoginManager['createUser']
9
+        getAuth: ILoginManager['getAuth']
10
+    }
11
+}
12
+
13
+export type LoginManagerFeatureIfc = {
14
+    modifyPermissions: {
15
+        setPermission: ILoginManager['setPermission']
16
+        getPermissions: ILoginManager['getPermissions']
17
+    }
18
+}

+ 10
- 0
src/backend/Components/Raid/Interface.ts View File

1
+import { User, Raid, Signup } from "../../Types/Types"
2
+
3
+export class IRaidManager{
4
+    getRaids: () => Promise<Raid[]>
5
+    createRaid: (raid:Raid) => Promise<any>
6
+    addSignup: (signup: Signup) => Promise<any>
7
+    removeSignup: (signup: Signup) => Promise<any>    
8
+    getSignups: (raid:Raid) => Promise<Signup[]>
9
+    sign: (user:User, raid:Raid, attending:boolean) => Promise<any>
10
+}

+ 7
- 8
src/backend/Components/Raid/RPCInterface.ts View File

1
-import { Raid, Signup, User } from "../../Types/Types"
1
+import { IRaidManager } from "./Interface"
2
 
2
 
3
 export type RaidManagerIfc = {
3
 export type RaidManagerIfc = {
4
     RaidManager:{
4
     RaidManager:{
5
-        getRaids: () => Promise<Raid[]>
5
+        getRaids: IRaidManager['getRaids']
6
     }
6
     }
7
 }
7
 }
8
 
8
 
9
 export type RaidManagerFeatureIfc = {
9
 export type RaidManagerFeatureIfc = {
10
     manageRaid: {
10
     manageRaid: {
11
-        createRaid: (raid:Raid) => Promise<any>
12
-        addSignup: (signup: Signup) => Promise<any>
13
-        removeSignup: (signup: Signup) => Promise<any>    
11
+        createRaid: IRaidManager['createRaid']
12
+        addSignup: IRaidManager['addSignup']
13
+        removeSignup: IRaidManager['removeSignup'] 
14
     }
14
     }
15
     signup: {
15
     signup: {
16
-        getRaids: () => Promise<Raid[]>
17
-        getSingups: (raid:Raid) => Promise<Signup[]>
18
-        sign: (user:User, raid:Raid, attending:boolean) => Promise<any>
16
+        getSignups: IRaidManager['getSignups']
17
+        sign: IRaidManager['sign']
19
     }
18
     }
20
 }
19
 }

+ 6
- 6
src/backend/Components/Raid/RaidManager.ts View File

1
 import { Inject, Module } from "../../Injector/ServiceDecorator";
1
 import { Inject, Module } from "../../Injector/ServiceDecorator";
2
 import { RaidManagerIfc, RaidManagerFeatureIfc } from "./RPCInterface";
2
 import { RaidManagerIfc, RaidManagerFeatureIfc } from "./RPCInterface";
3
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
3
 import { FrontworkComponent } from "../../Types/FrontworkComponent";
4
-import { FrontworkAdmin } from "../../Admin/Admin";
5
 import { TableDefiniton, Signup, Raid, User } from "../../Types/Types";
4
 import { TableDefiniton, Signup, Raid, User } from "../../Types/Types";
6
 import { IAdmin } from "../../Admin/Interface";
5
 import { IAdmin } from "../../Admin/Interface";
6
+import { IRaidManager } from "./Interface";
7
 
7
 
8
-@Module()
8
+@Module(IRaidManager)
9
 export class RaidManager
9
 export class RaidManager
10
-implements FrontworkComponent<RaidManagerIfc, RaidManagerFeatureIfc>{
10
+implements FrontworkComponent<RaidManagerIfc, RaidManagerFeatureIfc>, IRaidManager{
11
     name = "RaidManager" as "RaidManager";    
11
     name = "RaidManager" as "RaidManager";    
12
 
12
 
13
     @Inject(IAdmin)
13
     @Inject(IAdmin)
14
-    private admin: FrontworkAdmin
14
+    private admin: IAdmin
15
 
15
 
16
     exportRPCs = () => [{
16
     exportRPCs = () => [{
17
         name: 'getRaids' as 'getRaids',
17
         name: 'getRaids' as 'getRaids',
34
         },{
34
         },{
35
             name: 'signup' as 'signup',
35
             name: 'signup' as 'signup',
36
             exportRPCs: () => [{
36
             exportRPCs: () => [{
37
-                name: 'getSingups' as 'getSingups',
37
+                name: 'getSignups' as 'getSignups',
38
                 call: this.getSignups
38
                 call: this.getSignups
39
             },{
39
             },{
40
                 name: 'sign' as 'sign',
40
                 name: 'sign' as 'sign',
87
     .select('*')
87
     .select('*')
88
     .from('raids')
88
     .from('raids')
89
     
89
     
90
-    getSignups = async (raid:Raid) => await this.admin.knex
90
+    getSignups = async (raid:Raid) : Promise<Signup[]> => await this.admin.knex
91
     .select('*')
91
     .select('*')
92
     .from('signups')
92
     .from('signups')
93
     .where('raid_id', '=', raid.id!)
93
     .where('raid_id', '=', raid.id!)

+ 0
- 32
src/backend/Components/User/RPCInterface.ts View File

1
-import { Auth, Rank, User, RPCPermission, Character } from "../../Types/Types"
2
-import { SpecT } from "../../Types/PlayerSpecs"
3
-
4
-export type LoginManagerIfc = {
5
-    Authenticator: {
6
-        login: (username:string, pwHash:string) => Promise<Auth>
7
-        logout: (username: string, tokenValue :string) => Promise<void>
8
-        getAuth: (tokenValue: string) => Promise<Auth>
9
-        checkToken: (token: string, rank: Rank) => Promise<boolean>
10
-        createUser: (user:User) => Promise<User>
11
-    }
12
-}
13
-
14
-export type LoginManagerFeatureIfc = {
15
-    modifyPermissions: {
16
-        setPermission: (perm: RPCPermission) => Promise<void>
17
-        getPermissions: () => Promise<RPCPermission[]>
18
-    }
19
-}
20
-
21
-export type CharacterManagerIfc = {
22
-    CharacterManager: {
23
-        getSpecId : <c extends keyof SpecT>(clazz: c, name: SpecT[c]) => Promise<number>
24
-        getCharacters : () => Promise<Character[]>
25
-    }
26
-}
27
-
28
-export type CharacterManagerFeatureIfc = {
29
-    createCharacter: {
30
-        createCharacter: (usertoken: string, char : Character) => Promise<Character>
31
-    }
32
-}

+ 9
- 8
src/backend/Injector/Injector.ts View File

12
 
12
 
13
   rootInterface : Type<any>
13
   rootInterface : Type<any>
14
   root : Type<any>
14
   root : Type<any>
15
-  rootModules : Type<any>[] = []
15
+  rootModules: Type<any>[] = []
16
+  modules : {ifc?: Type<any>, implementation: Type<any>}[] = []
16
 
17
 
17
   moduleObjs : {[key in string] : FrontworkComponent} = {}
18
   moduleObjs : {[key in string] : FrontworkComponent} = {}
18
 
19
 
28
       return this.moduleObjs[target.name] as any
29
       return this.moduleObjs[target.name] as any
29
 
30
 
30
     if(target.name === this.rootInterface.name || target.name === this.root.name){
31
     if(target.name === this.rootInterface.name || target.name === this.root.name){
31
-      let modules = this.rootModules.map(m => {
32
-        const module = new m()
33
-        this.moduleObjs[m.name] = module
32
+      let modules = this.modules.map(m => {
33
+        const module = new m.implementation()
34
+        if(m.ifc)
35
+          this.moduleObjs[m.ifc.name] = module
36
+        this.moduleObjs[m.implementation.name] = module
34
         return module
37
         return module
35
       })
38
       })
36
       const rootobj = new this.root(modules);
39
       const rootobj = new this.root(modules);
42
         if(this.moduleObjs[i.what.name])
45
         if(this.moduleObjs[i.what.name])
43
           i.target[i.where] = this.moduleObjs[i.what.name]
46
           i.target[i.where] = this.moduleObjs[i.what.name]
44
         else
47
         else
45
-          this.injectionQueue.push()
48
+          this.injectionQueue.push(i)
46
       }
49
       }
47
-      this.injectionQueue.forEach(i => {
48
-        i.target[i.where] = this.moduleObjs[i.what.name]
49
-      })
50
+
50
       return rootobj
51
       return rootobj
51
     }
52
     }
52
     this.moduleObjs[target.name] = new target()
53
     this.moduleObjs[target.name] = new target()

+ 5
- 2
src/backend/Injector/ServiceDecorator.ts View File

6
  * @returns {GenericClassDecorator<Type<any>>}
6
  * @returns {GenericClassDecorator<Type<any>>}
7
  * @constructor
7
  * @constructor
8
  */
8
  */
9
-export const Module = (...args) : GenericClassDecorator<Type<any>> => {
9
+export const Module = (ifc?: Type<any>) : GenericClassDecorator<Type<any>> => {
10
   return (target: Type<any>) => {
10
   return (target: Type<any>) => {
11
-    Injector.rootModules.push(target)
11
+    Injector.modules.push({
12
+      ifc: ifc,
13
+      implementation: target
14
+    })
12
   }
15
   }
13
 }
16
 }
14
 
17
 

+ 1
- 0
src/backend/Launcher.ts View File

1
 import { Injector } from './Injector/Injector';
1
 import { Injector } from './Injector/Injector';
2
 import { IAdmin } from './Admin/Interface';
2
 import { IAdmin } from './Admin/Interface';
3
+import "./Admin/Admin"
3
 require('events').EventEmitter.defaultMaxListeners = 0;
4
 require('events').EventEmitter.defaultMaxListeners = 0;
4
 
5
 
5
 Injector.resolve<IAdmin>(IAdmin).start()
6
 Injector.resolve<IAdmin>(IAdmin).start()

+ 1
- 0
src/backend/Types/FrontworkComponent.ts View File

20
     getTableDefinitions(): TableDefiniton[] 
20
     getTableDefinitions(): TableDefiniton[] 
21
 
21
 
22
     initialize?(): Promise<any>
22
     initialize?(): Promise<any>
23
+    stop?() : Promise<any>
23
 }
24
 }

+ 18
- 8
src/backend/Types/Types.ts View File

1
 import * as Knex from "knex"
1
 import * as Knex from "knex"
2
 import { RPCExporter } from "rpclibrary";
2
 import { RPCExporter } from "rpclibrary";
3
 import { RaidManagerIfc, RaidManagerFeatureIfc } from "../Components/Raid/RPCInterface";
3
 import { RaidManagerIfc, RaidManagerFeatureIfc } from "../Components/Raid/RPCInterface";
4
-import { LoginManagerIfc, CharacterManagerIfc, LoginManagerFeatureIfc, CharacterManagerFeatureIfc } from "../Components/User/RPCInterface";
4
+import { LoginManagerIfc, LoginManagerFeatureIfc } from "../Components/Login/RPCInterface";
5
+import { CharacterManagerIfc, CharacterManagerFeatureIfc } from "../Components/Character/RPCInterface";
5
 
6
 
7
+export type FrontcraftIfc = RaidManagerIfc
8
+                          & LoginManagerIfc
9
+                          & CharacterManagerIfc 
10
+
11
+export type FrontcraftFeatureIfc = RaidManagerFeatureIfc 
12
+                                 & LoginManagerFeatureIfc
13
+                                 & CharacterManagerFeatureIfc
6
 
14
 
7
 export declare type NotificationSeverity = 'Info' | 'Important' | 'Error';
15
 export declare type NotificationSeverity = 'Info' | 'Important' | 'Error';
8
 
16
 
30
     [rank in Rank] : boolean
38
     [rank in Rank] : boolean
31
 }
39
 }
32
 
40
 
41
+export type Item = {
42
+    id?:number
43
+    name:string
44
+    iconname:string
45
+    url:string
46
+    quality:string
47
+    hidden:boolean
48
+}
49
+
33
 export type User = {
50
 export type User = {
34
     id?: number
51
     id?: number
35
     name: string
52
     name: string
67
 
84
 
68
 export type Auth = {port: number, user: User, token: Token}
85
 export type Auth = {port: number, user: User, token: Token}
69
 
86
 
70
-export type FrontcraftIfc = RaidManagerIfc
71
-                          & LoginManagerIfc
72
-                          & CharacterManagerIfc
73
-
74
-export type FrontcraftFeatureIfc = RaidManagerFeatureIfc 
75
-                                 & LoginManagerFeatureIfc
76
-                                 & CharacterManagerFeatureIfc
77
 
87
 
78
 export type Spec = {
88
 export type Spec = {
79
     id?: number,
89
     id?: number,

Loading…
Cancel
Save