@dotglitch/ngx-common 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +24 -0
  2. package/components/dynamic-html/dynamic-html.component.d.ts +15 -0
  3. package/components/dynamic-html/dynamic-html.module.d.ts +10 -0
  4. package/components/dynamic-html/dynamic-html.service.d.ts +18 -0
  5. package/components/dynamic-html/types.d.ts +12 -0
  6. package/components/lazy-loader/lazy-loader.component.d.ts +146 -0
  7. package/components/lazy-loader/lazy-loader.module.d.ts +10 -0
  8. package/components/lazy-loader/lazy-loader.service.d.ts +71 -0
  9. package/components/lazy-loader/types.d.ts +142 -0
  10. package/components/menu/menu.component.d.ts +52 -0
  11. package/components/tooltip/tooltip.component.d.ts +35 -0
  12. package/directives/menu.directive.d.ts +27 -0
  13. package/directives/tooltip.directive.d.ts +26 -0
  14. package/directives/utils.d.ts +8 -0
  15. package/esm2020/components/dynamic-html/dynamic-html.component.mjs +43 -0
  16. package/esm2020/components/dynamic-html/dynamic-html.module.mjs +27 -0
  17. package/esm2020/components/dynamic-html/dynamic-html.service.mjs +66 -0
  18. package/esm2020/components/dynamic-html/types.mjs +7 -0
  19. package/esm2020/components/lazy-loader/lazy-loader.component.mjs +360 -0
  20. package/esm2020/components/lazy-loader/lazy-loader.module.mjs +29 -0
  21. package/esm2020/components/lazy-loader/lazy-loader.service.mjs +215 -0
  22. package/esm2020/components/lazy-loader/types.mjs +26 -0
  23. package/esm2020/components/menu/menu.component.mjs +316 -0
  24. package/esm2020/components/tooltip/tooltip.component.mjs +135 -0
  25. package/esm2020/directives/menu.directive.mjs +112 -0
  26. package/esm2020/directives/tooltip.directive.mjs +92 -0
  27. package/esm2020/directives/utils.mjs +120 -0
  28. package/esm2020/dotglitch-ngx-common.mjs +5 -0
  29. package/esm2020/pipes/html-bypass.pipe.mjs +27 -0
  30. package/esm2020/pipes/resource-bypass.pipe.mjs +27 -0
  31. package/esm2020/pipes/script-bypass.pipe.mjs +27 -0
  32. package/esm2020/pipes/style-bypass.pipe.mjs +27 -0
  33. package/esm2020/pipes/url-bypass.pipe.mjs +27 -0
  34. package/esm2020/public-api.mjs +39 -0
  35. package/esm2020/services/dependency.service.mjs +55 -0
  36. package/esm2020/services/dialog.service.mjs +66 -0
  37. package/esm2020/services/fetch.service.mjs +71 -0
  38. package/esm2020/services/keyboard.service.mjs +128 -0
  39. package/esm2020/types/menu.mjs +2 -0
  40. package/esm2020/types/popup.mjs +2 -0
  41. package/esm2020/utils/index.mjs +39 -0
  42. package/fesm2015/dotglitch-ngx-common.mjs +1997 -0
  43. package/fesm2015/dotglitch-ngx-common.mjs.map +1 -0
  44. package/fesm2020/dotglitch-ngx-common.mjs +1977 -0
  45. package/fesm2020/dotglitch-ngx-common.mjs.map +1 -0
  46. package/index.d.ts +5 -0
  47. package/package.json +60 -0
  48. package/pipes/html-bypass.pipe.d.ts +16 -0
  49. package/pipes/resource-bypass.pipe.d.ts +16 -0
  50. package/pipes/script-bypass.pipe.d.ts +16 -0
  51. package/pipes/style-bypass.pipe.d.ts +16 -0
  52. package/pipes/url-bypass.pipe.d.ts +16 -0
  53. package/public-api.d.ts +34 -0
  54. package/services/dependency.service.d.ts +19 -0
  55. package/services/dialog.service.d.ts +41 -0
  56. package/services/fetch.service.d.ts +28 -0
  57. package/services/keyboard.service.d.ts +79 -0
  58. package/types/menu.d.ts +90 -0
  59. package/types/popup.d.ts +27 -0
  60. package/utils/index.d.ts +19 -0
@@ -0,0 +1,55 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Injectable, Inject } from '@angular/core';
3
+ import { sleep } from '../utils';
4
+ import * as i0 from "@angular/core";
5
+ const SCRIPT_INIT_TIMEOUT = 500; // ms
6
+ /**
7
+ * Service that installs CSS/JS dynamically
8
+ */
9
+ export class DependencyService {
10
+ constructor(document) {
11
+ this.document = document;
12
+ }
13
+ /**
14
+ * Install a Javascript file into the webpage on-demand
15
+ * @param id Unique identifier for the JS script
16
+ * @param src URL of the script
17
+ * @param globalkey A global object the script will provide.
18
+ * Providing this will ensure a promise only resolves after the
19
+ * specified global object is provided, with a timeout of 500ms
20
+ */
21
+ loadScript(id, src, globalkey = null) {
22
+ return new Promise((res, rej) => {
23
+ if (this.document.getElementById(id))
24
+ return res();
25
+ const script = this.document.createElement('script');
26
+ script.id = id;
27
+ script.setAttribute("async", '');
28
+ script.setAttribute("src", src);
29
+ script.onload = async () => {
30
+ if (typeof globalkey == "string") {
31
+ let i = 0;
32
+ for (; !window[globalkey] && i < SCRIPT_INIT_TIMEOUT; i += 10)
33
+ await sleep(10);
34
+ if (i >= SCRIPT_INIT_TIMEOUT) {
35
+ return rej(new Error("Timed out waiting for script to self-initialize."));
36
+ }
37
+ }
38
+ res();
39
+ };
40
+ this.document.body.appendChild(script);
41
+ });
42
+ }
43
+ }
44
+ DependencyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DependencyService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
45
+ DependencyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DependencyService, providedIn: 'root' });
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DependencyService, decorators: [{
47
+ type: Injectable,
48
+ args: [{
49
+ providedIn: 'root'
50
+ }]
51
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
52
+ type: Inject,
53
+ args: [DOCUMENT]
54
+ }] }]; } });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZW5jeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9zZXJ2aWNlcy9kZXBlbmRlbmN5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBRWpDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSztBQUV0Qzs7R0FFRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFFMUIsWUFDOEIsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUM1QyxDQUFDO0lBRUw7Ozs7Ozs7T0FPRztJQUNILFVBQVUsQ0FBQyxFQUFVLEVBQUUsR0FBVyxFQUFFLFlBQW9CLElBQUk7UUFDeEQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBRW5ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBRWYsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksRUFBRTtnQkFDdkIsSUFBSSxPQUFPLFNBQVMsSUFBSSxRQUFRLEVBQUU7b0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFFVixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsRUFBRSxDQUFDLElBQUksRUFBRTt3QkFDekQsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRXBCLElBQUksQ0FBQyxJQUFJLG1CQUFtQixFQUFFO3dCQUMxQixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDLENBQUM7cUJBQzdFO2lCQUNKO2dCQUVELEdBQUcsRUFBRSxDQUFDO1lBQ1YsQ0FBQyxDQUFBO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs7OEdBekNRLGlCQUFpQixrQkFHZCxRQUFRO2tIQUhYLGlCQUFpQixjQUZkLE1BQU07MkZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBSVEsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgU0NSSVBUX0lOSVRfVElNRU9VVCA9IDUwMDsgLy8gbXNcblxuLyoqXG4gKiBTZXJ2aWNlIHRoYXQgaW5zdGFsbHMgQ1NTL0pTIGR5bmFtaWNhbGx5XG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeVNlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICAgKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEluc3RhbGwgYSBKYXZhc2NyaXB0IGZpbGUgaW50byB0aGUgd2VicGFnZSBvbi1kZW1hbmRcbiAgICAgKiBAcGFyYW0gaWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBKUyBzY3JpcHRcbiAgICAgKiBAcGFyYW0gc3JjIFVSTCBvZiB0aGUgc2NyaXB0XG4gICAgICogQHBhcmFtIGdsb2JhbGtleSBBIGdsb2JhbCBvYmplY3QgdGhlIHNjcmlwdCB3aWxsIHByb3ZpZGUuXG4gICAgICogIFByb3ZpZGluZyB0aGlzIHdpbGwgZW5zdXJlIGEgcHJvbWlzZSBvbmx5IHJlc29sdmVzIGFmdGVyIHRoZVxuICAgICAqICBzcGVjaWZpZWQgZ2xvYmFsIG9iamVjdCBpcyBwcm92aWRlZCwgd2l0aCBhIHRpbWVvdXQgb2YgNTAwbXNcbiAgICAgKi9cbiAgICBsb2FkU2NyaXB0KGlkOiBzdHJpbmcsIHNyYzogc3RyaW5nLCBnbG9iYWxrZXk6IHN0cmluZyA9IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKSByZXR1cm4gcmVzKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHQuaWQgPSBpZDtcblxuICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZShcImFzeW5jXCIsICcnKTtcbiAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgc3JjKTtcblxuICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdsb2JhbGtleSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgIXdpbmRvd1tnbG9iYWxrZXldICYmIGkgPCBTQ1JJUFRfSU5JVF9USU1FT1VUOyBpICs9IDEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoMTApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID49IFNDUklQVF9JTklUX1RJTUVPVVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWoobmV3IEVycm9yKFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNjcmlwdCB0byBzZWxmLWluaXRpYWxpemUuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBsb2FkU3R5bGVzaGVldChpZDogc3RyaW5nLCBocmVmOiBzdHJpbmcpIHtcbiAgICAvLyAgICAgbGV0IHRoZW1lTGluayA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEhUTUxMaW5rRWxlbWVudDtcbiAgICAvLyAgICAgaWYgKHRoZW1lTGluaykge1xuICAgIC8vICAgICAgICAgdGhlbWVMaW5rLmhyZWYgPSBocmVmO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGVsc2Uge1xuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAvLyAgICAgICAgIHN0eWxlLmlkID0gaWQ7XG4gICAgLy8gICAgICAgICBzdHlsZS5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgLy8gICAgICAgICBzdHlsZS5ocmVmID0gaHJlZjtcblxuICAgIC8vICAgICAgICAgY29uc3QgaGVhZCA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcblxuICAgIC8vICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG59XG4iXX0=
@@ -0,0 +1,66 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Logger } from '../utils';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/dialog";
5
+ import * as i2 from "../public-api";
6
+ const { log, warn, err } = Logger("DialogService", "#607d8b");
7
+ export class DialogService {
8
+ constructor(dialog, lazyLoader) {
9
+ this.dialog = dialog;
10
+ this.lazyLoader = lazyLoader;
11
+ this.dialogs = [];
12
+ }
13
+ open(name, opts = {}) {
14
+ return new Promise((resolve, reject) => {
15
+ const registration = this.lazyLoader.resolveRegistrationEntry(name, opts.group || "default");
16
+ if (!registration)
17
+ return reject(new Error("Cannot open dialog for " + name + ". Could not find in registry."));
18
+ const args = {
19
+ closeOnNavigation: true,
20
+ restoreFocus: true,
21
+ width: registration['width'],
22
+ height: registration['height'],
23
+ ...opts,
24
+ data: {
25
+ id: name,
26
+ inputs: opts.inputs || {},
27
+ outputs: opts.outputs || {},
28
+ group: opts.group
29
+ },
30
+ panelClass: [
31
+ "dialog-" + name,
32
+ ...(Array.isArray(opts.panelClass) ? opts.panelClass : [opts.panelClass] || [])
33
+ ]
34
+ };
35
+ // TODO:
36
+ let dialog = this.dialog.open(undefined, args);
37
+ dialog['idx'] = name;
38
+ this.dialogs.push(dialog);
39
+ dialog.afterClosed().subscribe(result => {
40
+ log("Dialog closed " + name, result);
41
+ resolve(result);
42
+ });
43
+ });
44
+ }
45
+ // Close all dialogs matching the given name
46
+ close(name) {
47
+ const dialogs = this.dialogs.filter(d => d['idx'] == name);
48
+ dialogs.forEach(dialog => dialog.close());
49
+ }
50
+ /**
51
+ * Method to close _all_ dialogs.
52
+ * Should be used sparingly.
53
+ */
54
+ clearDialog() {
55
+ this.dialogs.forEach(dialog => dialog.close());
56
+ }
57
+ }
58
+ DialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DialogService, deps: [{ token: i1.MatDialog }, { token: i2.LazyLoaderService }], target: i0.ɵɵFactoryTarget.Injectable });
59
+ DialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DialogService, providedIn: 'root' });
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DialogService, decorators: [{
61
+ type: Injectable,
62
+ args: [{
63
+ providedIn: 'root'
64
+ }]
65
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.LazyLoaderService }]; } });
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQzs7OztBQUdsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBMEI5RCxNQUFNLE9BQU8sYUFBYTtJQUl0QixZQUNZLE1BQWlCLEVBQ2pCLFVBQTZCO1FBRDdCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFKakMsWUFBTyxHQUFpQyxFQUFFLENBQUM7SUFNbkQsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFZLEVBQUUsT0FBc0IsRUFBRTtRQUN2QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBRW5DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLENBQUM7WUFDN0YsSUFBSSxDQUFDLFlBQVk7Z0JBQ2IsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMseUJBQXlCLEdBQUcsSUFBSSxHQUFHLCtCQUErQixDQUFDLENBQUMsQ0FBQztZQUdqRyxNQUFNLElBQUksR0FBRztnQkFDVCxpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsS0FBSyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUM7Z0JBQzVCLE1BQU0sRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUM5QixHQUFHLElBQUk7Z0JBQ1AsSUFBSSxFQUFFO29CQUNGLEVBQUUsRUFBRSxJQUFJO29CQUNSLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUU7b0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUU7b0JBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztpQkFDcEI7Z0JBQ0QsVUFBVSxFQUFFO29CQUNSLFNBQVMsR0FBRyxJQUFJO29CQUNoQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDbEY7YUFDSixDQUFDO1lBRUYsUUFBUTtZQUNSLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUvQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3BDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxLQUFLLENBQUMsSUFBWTtRQUNkLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzNELE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7MEdBN0RRLGFBQWE7OEdBQWIsYUFBYSxjQUZWLE1BQU07MkZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IExhenlMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vcHVibGljLWFwaSc7XG5cbmNvbnN0IHsgbG9nLCB3YXJuLCBlcnIgfSA9IExvZ2dlcihcIkRpYWxvZ1NlcnZpY2VcIiwgXCIjNjA3ZDhiXCIpO1xuXG5leHBvcnQgdHlwZSBEaWFsb2dPcHRpb25zID0gUGFydGlhbDxPbWl0PE1hdERpYWxvZ0NvbmZpZzxhbnk+LCAnZGF0YSc+ICYge1xuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgZ3JvdXA6IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcHJvcGVydGllcyB0byBiZSBwcm92aWRlZCB0byBASW5wdXQoKSBpbmplY3RvcnNcbiAgICAgKi9cbiAgICBpbnB1dHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHByb3ZpZGVkIHRvIEBJbnB1dCgpIGluamVjdG9yc1xuICAgICAqL1xuICAgIG91dHB1dHM6IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfSxcbiAgICAvKipcbiAgICAgKiBDb250ZXh0IGluIHdoaWNoIHRvIGV4ZWN1dGUgY2FsbGJhY2tzIGZyb20gdGhlIGBvdXRwdXRzYCBwcm9wZXJ0eSB2aWFcbiAgICAgKiBAT3V0cHV0KCkgZXZlbnQgRW1pdHRlcnNcbiAgICAgKi9cbiAgICBwYXJlbnQ6IGFueVxufT47XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRGlhbG9nU2VydmljZSB7XG5cbiAgICBwcml2YXRlIGRpYWxvZ3M6IE1hdERpYWxvZ1JlZjx1bmtub3duLCBhbnk+W10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgICAgICBwcml2YXRlIGxhenlMb2FkZXI6IExhenlMb2FkZXJTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG4gICAgb3BlbihuYW1lOiBzdHJpbmcsIG9wdHM6IERpYWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IHRoaXMubGF6eUxvYWRlci5yZXNvbHZlUmVnaXN0cmF0aW9uRW50cnkobmFtZSwgb3B0cy5ncm91cCB8fCBcImRlZmF1bHRcIik7XG4gICAgICAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcIkNhbm5vdCBvcGVuIGRpYWxvZyBmb3IgXCIgKyBuYW1lICsgXCIuIENvdWxkIG5vdCBmaW5kIGluIHJlZ2lzdHJ5LlwiKSk7XG5cblxuICAgICAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgICAgICBjbG9zZU9uTmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IHRydWUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlZ2lzdHJhdGlvblsnd2lkdGgnXSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHJlZ2lzdHJhdGlvblsnaGVpZ2h0J10sXG4gICAgICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IG9wdHMuaW5wdXRzIHx8IHt9LFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBvcHRzLm91dHB1dHMgfHwge30sXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBvcHRzLmdyb3VwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiZGlhbG9nLVwiICsgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkob3B0cy5wYW5lbENsYXNzKSA/IG9wdHMucGFuZWxDbGFzcyA6IFtvcHRzLnBhbmVsQ2xhc3NdIHx8IFtdKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIFRPRE86XG4gICAgICAgICAgICBsZXQgZGlhbG9nID0gdGhpcy5kaWFsb2cub3Blbih1bmRlZmluZWQsIGFyZ3MpO1xuXG4gICAgICAgICAgICBkaWFsb2dbJ2lkeCddID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9ncy5wdXNoKGRpYWxvZyk7XG5cbiAgICAgICAgICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGxvZyhcIkRpYWxvZyBjbG9zZWQgXCIgKyBuYW1lLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBhbGwgZGlhbG9ncyBtYXRjaGluZyB0aGUgZ2l2ZW4gbmFtZVxuICAgIGNsb3NlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBkaWFsb2dzID0gdGhpcy5kaWFsb2dzLmZpbHRlcihkID0+IGRbJ2lkeCddID09IG5hbWUpO1xuICAgICAgICBkaWFsb2dzLmZvckVhY2goZGlhbG9nID0+IGRpYWxvZy5jbG9zZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gY2xvc2UgX2FsbF8gZGlhbG9ncy5cbiAgICAgKiBTaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuXG4gICAgICovXG4gICAgY2xlYXJEaWFsb2coKSB7XG4gICAgICAgIHRoaXMuZGlhbG9ncy5mb3JFYWNoKGRpYWxvZyA9PiBkaWFsb2cuY2xvc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbiBhIGNvbmZpcm1hdGlvbiBkaWFsb2cuIFdpbGwgcmVqZWN0IGlmIGEgY2FuY2VsIG9jY3Vycy5cbiAgICAgKiBAcGFyYW0gdGl0bGUgdGl0bGUgb2YgdGhlIGRpYWxvZ1xuICAgICAqIEBwYXJhbSBtZXNzYWdlIG1haW4gcXVlc3Rpb24gdGhhdCBhIHVzZXIgbmVlZHMgdG8gY29uZmlybS9kZW55XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICAvLyBjb25maXJtQWN0aW9uKHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xuICAgIC8vICAgICAgICAgICAgIG1heEhlaWdodDogXCI5MHZoXCIsXG4gICAgLy8gICAgICAgICAgICAgbWF4V2lkdGg6IFwiOTB2d1wiLFxuICAgIC8vICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFtcImRpYWxvZy1jb25maXJtYXRpb25cIl0sXG4gICAgLy8gICAgICAgICAgICAgY2xvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgLy8gICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICAgIC8vICAgICAgICAgICAgIGRhdGE6IHt0aXRsZSwgbWVzc2FnZX1cbiAgICAvLyAgICAgICAgIH0pO1xuXG4gICAgLy8gICAgICAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAvLyAgICAgICAgICAgICByZXN1bHQgPT0gdHJ1ZSA/IHJlcygpIDogcmVqKCk7XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfVxufVxuIl19
@@ -0,0 +1,71 @@
1
+ import { Injectable, isDevMode } from '@angular/core';
2
+ import { retry } from 'rxjs/operators';
3
+ import { of } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ // Total number of _retries_ if there is a 429 response code.
7
+ const retryCount = 2;
8
+ export class Fetch {
9
+ constructor(http) {
10
+ this.http = http;
11
+ }
12
+ // Public interface for making AJAX transactions
13
+ get(url, options = {}, returnError = false) {
14
+ return this.request("get", url, options, returnError);
15
+ }
16
+ put(url, body, options = {}, returnError = false) {
17
+ options.body = (options.body && Object.keys(options.body).length > 0 ? options.body : body) || {};
18
+ return this.request("put", url, options, returnError);
19
+ }
20
+ post(url, body, options = {}, returnError = false) {
21
+ options.body = (options.body && Object.keys(options.body).length > 0 ? options.body : body) || {};
22
+ return this.request("post", url, options, returnError);
23
+ }
24
+ patch(url, body, options = {}, returnError = false) {
25
+ options.body = (options.body && Object.keys(options.body).length > 0 ? options.body : body) || {};
26
+ return this.request("patch", url, options, returnError);
27
+ }
28
+ delete(url, options = {}, returnError = false) {
29
+ return this.request("delete", url, options, returnError);
30
+ }
31
+ // Internally, handle the observable as a promise.
32
+ request(method, url, options = {}, returnError = false) {
33
+ options.reportProgress = true;
34
+ // Allow support for different response types.
35
+ // Generally we shouldn't need this to be anything other than JSON.
36
+ options.responseType = options.responseType || "json";
37
+ options.withCredentials = true;
38
+ const p = new Promise((resolve, reject) => {
39
+ const o = this.http.request(method, url, options)
40
+ .pipe(retry({
41
+ delay(error, retryCount) {
42
+ // 429 and 502 are most common for overloaded
43
+ // backends -- so we'll retry if we get these errors
44
+ if (error.status == 429 || error.status == 502)
45
+ return of({});
46
+ if (error.status == 504 && isDevMode())
47
+ alert("It looks like you can't reach your development backend anymore");
48
+ throw error;
49
+ },
50
+ count: retryCount
51
+ }))
52
+ .subscribe(data => {
53
+ resolve(data);
54
+ // provide 3ms slacktime before releasing observable.
55
+ setTimeout(() => {
56
+ o.unsubscribe();
57
+ }, 3);
58
+ });
59
+ });
60
+ return p;
61
+ }
62
+ }
63
+ Fetch.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Fetch, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
64
+ Fetch.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Fetch, providedIn: "root" });
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Fetch, decorators: [{
66
+ type: Injectable,
67
+ args: [{
68
+ providedIn: "root"
69
+ }]
70
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvc2VydmljZXMvZmV0Y2guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBRTFCLDZEQUE2RDtBQUM3RCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFvQnJCLE1BQU0sT0FBTyxLQUFLO0lBQ2QsWUFDWSxJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQ3hCLENBQUM7SUFFTCxnREFBZ0Q7SUFDekMsR0FBRyxDQUFJLEdBQVcsRUFBRSxVQUF3QixFQUFFLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDdEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDTSxHQUFHLENBQUksR0FBVyxFQUFFLElBQVMsRUFBRSxVQUF3QixFQUFFLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDakYsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBSSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ00sSUFBSSxDQUFJLEdBQVcsRUFBRSxJQUFTLEVBQUUsVUFBd0IsRUFBRSxFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQ2xGLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUksTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNNLEtBQUssQ0FBSSxHQUFXLEVBQUUsSUFBUyxFQUFFLFVBQXdCLEVBQUUsRUFBRSxXQUFXLEdBQUcsS0FBSztRQUNuRixPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDTSxNQUFNLENBQUksR0FBVyxFQUFFLFVBQXdCLEVBQUUsRUFBRSxXQUFXLEdBQUcsS0FBSztRQUN6RSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUksUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELGtEQUFrRDtJQUMxQyxPQUFPLENBQUksTUFBYyxFQUFFLEdBQVcsRUFBRSxVQUF3QixFQUFFLEVBQUUsV0FBVyxHQUFHLEtBQUs7UUFDM0YsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFOUIsOENBQThDO1FBQzlDLG1FQUFtRTtRQUNuRSxPQUFPLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRS9CLE1BQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDO2lCQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUNSLEtBQUssQ0FBQyxLQUFLLEVBQUUsVUFBVTtvQkFDbkIsNkNBQTZDO29CQUM3QyxvREFBb0Q7b0JBQ3BELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHO3dCQUMxQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFbEIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUU7d0JBQ2xDLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO29CQUU1RSxNQUFNLEtBQUssQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsVUFBVTthQUNwQixDQUFDLENBQUM7aUJBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxJQUFvQixDQUFDLENBQUM7Z0JBRTlCLHFEQUFxRDtnQkFDckQsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQWUsQ0FBQztJQUMzQixDQUFDOztrR0E3RFEsS0FBSztzR0FBTCxLQUFLLGNBRkYsTUFBTTsyRkFFVCxLQUFLO2tCQUhqQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBDb250ZXh0LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5cbi8vIFRvdGFsIG51bWJlciBvZiBfcmV0cmllc18gaWYgdGhlcmUgaXMgYSA0MjkgcmVzcG9uc2UgY29kZS5cbmNvbnN0IHJldHJ5Q291bnQgPSAyO1xuXG5leHBvcnQgdHlwZSBGZXRjaE9wdGlvbnMgPSB7XG4gICAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9O1xuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dDtcbiAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xuICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIH07XG4gICAgYm9keT86IGFueSxcbiAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcbiAgICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBGZXRjaCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxuICAgICkgeyB9XG5cbiAgICAvLyBQdWJsaWMgaW50ZXJmYWNlIGZvciBtYWtpbmcgQUpBWCB0cmFuc2FjdGlvbnNcbiAgICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSwgcmV0dXJuRXJyb3IgPSBmYWxzZSk6IFByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KFwiZ2V0XCIsIHVybCwgb3B0aW9ucywgcmV0dXJuRXJyb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgcHV0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBhbnksIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9LCByZXR1cm5FcnJvciA9IGZhbHNlKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IChvcHRpb25zLmJvZHkgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5ib2R5KS5sZW5ndGggPiAwID8gb3B0aW9ucy5ib2R5IDogYm9keSkgfHwge307XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJwdXRcIiwgdXJsLCBvcHRpb25zLCByZXR1cm5FcnJvcik7XG4gICAgfVxuICAgIHB1YmxpYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBhbnksIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9LCByZXR1cm5FcnJvciA9IGZhbHNlKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIG9wdGlvbnMuYm9keSA9IChvcHRpb25zLmJvZHkgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5ib2R5KS5sZW5ndGggPiAwID8gb3B0aW9ucy5ib2R5IDogYm9keSkgfHwge307XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oXCJwb3N0XCIsIHVybCwgb3B0aW9ucywgcmV0dXJuRXJyb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgcGF0Y2g8VD4odXJsOiBzdHJpbmcsIGJvZHk6IGFueSwgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30sIHJldHVybkVycm9yID0gZmFsc2UpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gKG9wdGlvbnMuYm9keSAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmJvZHkpLmxlbmd0aCA+IDAgPyBvcHRpb25zLmJvZHkgOiBib2R5KSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPihcInBhdGNoXCIsIHVybCwgb3B0aW9ucywgcmV0dXJuRXJyb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSwgcmV0dXJuRXJyb3IgPSBmYWxzZSk6IFByb21pc2U8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFQ+KFwiZGVsZXRlXCIsIHVybCwgb3B0aW9ucywgcmV0dXJuRXJyb3IpO1xuICAgIH1cblxuICAgIC8vIEludGVybmFsbHksIGhhbmRsZSB0aGUgb2JzZXJ2YWJsZSBhcyBhIHByb21pc2UuXG4gICAgcHJpdmF0ZSByZXF1ZXN0PFQ+KG1ldGhvZDogc3RyaW5nLCB1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30sIHJldHVybkVycm9yID0gZmFsc2UpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgb3B0aW9ucy5yZXBvcnRQcm9ncmVzcyA9IHRydWU7XG5cbiAgICAgICAgLy8gQWxsb3cgc3VwcG9ydCBmb3IgZGlmZmVyZW50IHJlc3BvbnNlIHR5cGVzLlxuICAgICAgICAvLyBHZW5lcmFsbHkgd2Ugc2hvdWxkbid0IG5lZWQgdGhpcyB0byBiZSBhbnl0aGluZyBvdGhlciB0aGFuIEpTT04uXG4gICAgICAgIG9wdGlvbnMucmVzcG9uc2VUeXBlID0gb3B0aW9ucy5yZXNwb25zZVR5cGUgfHwgXCJqc29uXCI7XG4gICAgICAgIG9wdGlvbnMud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIC5waXBlKHJldHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgZGVsYXkoZXJyb3IsIHJldHJ5Q291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQyOSBhbmQgNTAyIGFyZSBtb3N0IGNvbW1vbiBmb3Igb3ZlcmxvYWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZHMgLS0gc28gd2UnbGwgcmV0cnkgaWYgd2UgZ2V0IHRoZXNlIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MjkgfHwgZXJyb3Iuc3RhdHVzID09IDUwMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Yoe30pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDUwNCAmJiBpc0Rldk1vZGUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChcIkl0IGxvb2tzIGxpa2UgeW91IGNhbid0IHJlYWNoIHlvdXIgZGV2ZWxvcG1lbnQgYmFja2VuZCBhbnltb3JlXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IHJldHJ5Q291bnRcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEgYXMgdW5rbm93biBhcyBUKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBwcm92aWRlIDNtcyBzbGFja3RpbWUgYmVmb3JlIHJlbGVhc2luZyBvYnNlcnZhYmxlLlxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwIGFzIFByb21pc2U8VD47XG4gICAgfVxufVxuIl19
@@ -0,0 +1,128 @@
1
+ import { Injectable, HostListener } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Service that listens for global keyboard events
6
+ */
7
+ export class KeyboardService {
8
+ constructor() {
9
+ this.heldKeys = {};
10
+ this.keyCommands = [];
11
+ window.addEventListener("keydown", (evt) => this.onKeyDown(evt));
12
+ window.addEventListener("keyup", (evt) => this.onKeyUp(evt));
13
+ }
14
+ onKeyDown(evt) {
15
+ // console.log("keydown", evt.key)
16
+ this.heldKeys[evt.key.toLowerCase()] = true;
17
+ // Do a general filter where all of the modifiers must be matched if specified
18
+ // Then check that the actual keys match what was specified
19
+ let commands = this.keyCommands
20
+ .filter(kc => (kc.ctrl == undefined || kc.ctrl === evt.ctrlKey) &&
21
+ (kc.alt == undefined || kc.alt === evt.altKey) &&
22
+ (kc.shift == undefined || kc.shift === evt.shiftKey) &&
23
+ (kc.super == undefined || kc.super === evt.metaKey) &&
24
+ kc.keys.length == kc.keys.filter(k => this.heldKeys[k])?.length);
25
+ if (evt.ctrlKey && commands.length > 0 || commands.find(c => c.interrupt)) {
26
+ evt.stopPropagation();
27
+ evt.preventDefault();
28
+ }
29
+ if (evt.key == "Pause")
30
+ debugger;
31
+ commands.forEach(kc => kc.sub.next(evt));
32
+ /**
33
+ * Prevent CTRL+P and other standard key events from being handled by the browser.
34
+ * Allow specific combonations:
35
+ * CTRL+W
36
+ * CTRL+T
37
+ * CTRL+F5
38
+ */
39
+ // if (evt.ctrlKey && !['w', 't', 'F5'].includes(evt.key)) {
40
+ // evt.preventDefault();
41
+ // }
42
+ }
43
+ onKeyUp(evt) {
44
+ this.heldKeys[evt.key.toLowerCase()] = false;
45
+ }
46
+ onKeyPress(evt) {
47
+ // this.heldKeys[evt.key] = false;
48
+ }
49
+ /**
50
+ * Use this to subscribe to keyboard events throughout
51
+ * the application. This is a passive listener and will
52
+ * **NOT** interrupt the event chain.
53
+ */
54
+ onKeyCommand(key) {
55
+ const sub = new Subject();
56
+ let item = {
57
+ ...key,
58
+ keys: (Array.isArray(key.key) ? key.key : [key.key]),
59
+ sub: sub
60
+ };
61
+ this.keyCommands.push(item);
62
+ return {
63
+ ...sub,
64
+ subscribe: ((...args) => {
65
+ const s = sub.subscribe(...args);
66
+ return {
67
+ ...s,
68
+ unsubscribe: () => {
69
+ s.unsubscribe();
70
+ // Remove the keycommand from the list of listeners.
71
+ const i = this.keyCommands.findIndex(c => c == item);
72
+ this.keyCommands.splice(i, 1);
73
+ }
74
+ };
75
+ })
76
+ };
77
+ }
78
+ /**
79
+ * Return `true` if shift is currently pressed.
80
+ */
81
+ get isShiftPressed() {
82
+ return !!this.heldKeys["shift"];
83
+ }
84
+ /**
85
+ * Return `true` if ctrl is currently pressed.
86
+ */
87
+ get isCtrlPressed() {
88
+ return !!this.heldKeys["control"];
89
+ }
90
+ /**
91
+ * Return `true` if alt is currently pressed.
92
+ */
93
+ get isAltPressed() {
94
+ return !!this.heldKeys["alt"];
95
+ }
96
+ /**
97
+ * Return `true` if super (mac/linux) or the windows key is currently pressed.
98
+ */
99
+ get isSuperPressed() {
100
+ return !!this.heldKeys["super"];
101
+ }
102
+ /**
103
+ * Return `true` if tab is currently pressed.
104
+ */
105
+ get isTabPressed() {
106
+ return !!this.heldKeys["tab"];
107
+ }
108
+ clearKeys() {
109
+ Object.keys(this.heldKeys).forEach(k => {
110
+ this.heldKeys[k] = false;
111
+ });
112
+ }
113
+ }
114
+ KeyboardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: KeyboardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
115
+ KeyboardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: KeyboardService, providedIn: 'root' });
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: KeyboardService, decorators: [{
117
+ type: Injectable,
118
+ args: [{
119
+ providedIn: 'root'
120
+ }]
121
+ }], ctorParameters: function () { return []; }, propDecorators: { clearKeys: [{
122
+ type: HostListener,
123
+ args: ["window:blur"]
124
+ }, {
125
+ type: HostListener,
126
+ args: ["window:resize"]
127
+ }] } });
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvc2VydmljZXMva2V5Ym9hcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQXFCL0I7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZUFBZTtJQWN4QjtRQVpRLGFBQVEsR0FBK0IsRUFBRSxDQUFDO1FBQzNDLGdCQUFXLEdBU1osRUFBRSxDQUFDO1FBR0wsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sU0FBUyxDQUFDLEdBQWtCO1FBQ2hDLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFNUMsOEVBQThFO1FBQzlFLDJEQUEyRDtRQUMzRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVzthQUMxQixNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDVCxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUNqRCxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUss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QUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0Q7O09BRUc7SUFDSCxJQUFJLFlBQVk7UUFDWixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRDs7T0FFRztJQUNILElBQUksY0FBYztRQUNkLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FBQ1osT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBSUQsU0FBUztRQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OzRHQXRJUSxlQUFlO2dIQUFmLGVBQWUsY0FGWixNQUFNOzJGQUVULGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzBFQW1JRyxTQUFTO3NCQUZSLFlBQVk7dUJBQUMsYUFBYTs7c0JBQzFCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgdHlwZSBLZXlDb21tYW5kID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBub24tbW9kaWZpZXIga2V5KHMpIHRoYXQgbXVzdCBiZSBwcmVzc2VkIGZvciB0aGUgZXZlbnQgdG8gZmlyZS5cbiAgICAgKi9cbiAgICBrZXk6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIGxhYmVsOiBzdHJpbmcsXG5cbiAgICBjdHJsPzogYm9vbGVhbixcbiAgICBhbHQ/OiBib29sZWFuLFxuICAgIHNoaWZ0PzogYm9vbGVhbixcbiAgICBzdXBlcj86IGJvb2xlYW4sXG4gICAgdGFiPzogYm9vbGVhbixcblxuICAgIC8qKlxuICAgICAqIFNob3VsZCB0aGUgaGFuZGxlciBpbnRlcnJ1cHQgZGVmYXVsdCBldmVudCBoYW5kbGluZ1xuICAgICAqL1xuICAgIGludGVycnVwdD86IGJvb2xlYW4sXG59XG5cbi8qKlxuICogU2VydmljZSB0aGF0IGxpc3RlbnMgZm9yIGdsb2JhbCBrZXlib2FyZCBldmVudHNcbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBLZXlib2FyZFNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBoZWxkS2V5czogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICBwdWJsaWMga2V5Q29tbWFuZHM6IHtcbiAgICAgICAgY3RybD86IGJvb2xlYW4sXG4gICAgICAgIGFsdD86IGJvb2xlYW4sXG4gICAgICAgIHNoaWZ0PzogYm9vbGVhbixcbiAgICAgICAgc3VwZXI/OiBib29sZWFuLFxuICAgICAgICBpbnRlcnJ1cHQ/OiBib29sZWFuLFxuICAgICAgICBsYWJlbDogc3RyaW5nLFxuICAgICAgICBrZXlzOiBzdHJpbmdbXSxcbiAgICAgICAgc3ViOiBTdWJqZWN0PEtleWJvYXJkRXZlbnQ+XG4gICAgfVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldnQpID0+IHRoaXMub25LZXlEb3duKGV2dCkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIChldnQpID0+IHRoaXMub25LZXlVcChldnQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uS2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJrZXlkb3duXCIsIGV2dC5rZXkpXG4gICAgICAgIHRoaXMuaGVsZEtleXNbZXZ0LmtleS50b0xvd2VyQ2FzZSgpXSA9IHRydWU7XG5cbiAgICAgICAgLy8gRG8gYSBnZW5lcmFsIGZpbHRlciB3aGVyZSBhbGwgb2YgdGhlIG1vZGlmaWVycyBtdXN0IGJlIG1hdGNoZWQgaWYgc3BlY2lmaWVkXG4gICAgICAgIC8vIFRoZW4gY2hlY2sgdGhhdCB0aGUgYWN0dWFsIGtleXMgbWF0Y2ggd2hhdCB3YXMgc3BlY2lmaWVkXG4gICAgICAgIGxldCBjb21tYW5kcyA9IHRoaXMua2V5Q29tbWFuZHNcbiAgICAgICAgICAgIC5maWx0ZXIoa2MgPT5cbiAgICAgICAgICAgICAgICAoa2MuY3RybCA9PSB1bmRlZmluZWQgfHwga2MuY3RybCA9PT0gZXZ0LmN0cmxLZXkpICYmXG4gICAgICAgICAgICAgICAgKGtjLmFsdCA9PSB1bmRlZmluZWQgfHwga2MuYWx0ID09PSBldnQuYWx0S2V5KSAmJlxuICAgICAgICAgICAgICAgIChrYy5zaGlmdCA9PSB1bmRlZmluZWQgfHwga2Muc2hpZnQgPT09IGV2dC5zaGlmdEtleSkgJiZcbiAgICAgICAgICAgICAgICAoa2Muc3VwZXIgPT0gdW5kZWZpbmVkIHx8IGtjLnN1cGVyID09PSBldnQubWV0YUtleSkgJiZcbiAgICAgICAgICAgICAgICBrYy5rZXlzLmxlbmd0aCA9PSBrYy5rZXlzLmZpbHRlcihrID0+IHRoaXMuaGVsZEtleXNba10pPy5sZW5ndGhcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV2dC5jdHJsS2V5ICYmIGNvbW1hbmRzLmxlbmd0aCA+IDAgfHwgY29tbWFuZHMuZmluZChjID0+IGMuaW50ZXJydXB0KSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZ0LmtleSA9PSBcIlBhdXNlXCIpXG4gICAgICAgICAgICBkZWJ1Z2dlcjtcblxuICAgICAgICBjb21tYW5kcy5mb3JFYWNoKGtjID0+IGtjLnN1Yi5uZXh0KGV2dCkpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcmV2ZW50IENUUkwrUCBhbmQgb3RoZXIgc3RhbmRhcmQga2V5IGV2ZW50cyBmcm9tIGJlaW5nIGhhbmRsZWQgYnkgdGhlIGJyb3dzZXIuXG4gICAgICAgICAqIEFsbG93IHNwZWNpZmljIGNvbWJvbmF0aW9uczpcbiAgICAgICAgICogQ1RSTCtXXG4gICAgICAgICAqIENUUkwrVFxuICAgICAgICAgKiBDVFJMK0Y1XG4gICAgICAgICAqL1xuICAgICAgICAvLyBpZiAoZXZ0LmN0cmxLZXkgJiYgIVsndycsICd0JywgJ0Y1J10uaW5jbHVkZXMoZXZ0LmtleSkpIHtcbiAgICAgICAgLy8gICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbktleVVwKGV2dDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLmhlbGRLZXlzW2V2dC5rZXkudG9Mb3dlckNhc2UoKV0gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uS2V5UHJlc3MoZXZ0OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIC8vIHRoaXMuaGVsZEtleXNbZXZ0LmtleV0gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyB0byBzdWJzY3JpYmUgdG8ga2V5Ym9hcmQgZXZlbnRzIHRocm91Z2hvdXRcbiAgICAgKiB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgYSBwYXNzaXZlIGxpc3RlbmVyIGFuZCB3aWxsXG4gICAgICogKipOT1QqKiBpbnRlcnJ1cHQgdGhlIGV2ZW50IGNoYWluLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleUNvbW1hbmQoa2V5OiBLZXlDb21tYW5kKSB7XG4gICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdWJqZWN0PEtleWJvYXJkRXZlbnQ+KCk7XG4gICAgICAgIGxldCBpdGVtID0ge1xuICAgICAgICAgICAgLi4ua2V5LFxuICAgICAgICAgICAga2V5czogKEFycmF5LmlzQXJyYXkoa2V5LmtleSkgPyBrZXkua2V5IDogW2tleS5rZXldKSxcbiAgICAgICAgICAgIHN1Yjogc3ViXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtleUNvbW1hbmRzLnB1c2goaXRlbSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN1YixcbiAgICAgICAgICAgIHN1YnNjcmliZTogKCguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IHN1Yi5zdWJzY3JpYmUoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXljb21tYW5kIGZyb20gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMua2V5Q29tbWFuZHMuZmluZEluZGV4KGMgPT4gYyA9PSBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua2V5Q29tbWFuZHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pIGFzIFN1YmplY3Q8S2V5Ym9hcmRFdmVudD5bJ3N1YnNjcmliZSddXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZiBzaGlmdCBpcyBjdXJyZW50bHkgcHJlc3NlZC5cbiAgICAgKi9cbiAgICBnZXQgaXNTaGlmdFByZXNzZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuaGVsZEtleXNbXCJzaGlmdFwiXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZiBjdHJsIGlzIGN1cnJlbnRseSBwcmVzc2VkLlxuICAgICAqL1xuICAgIGdldCBpc0N0cmxQcmVzc2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmhlbGRLZXlzW1wiY29udHJvbFwiXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZiBhbHQgaXMgY3VycmVudGx5IHByZXNzZWQuXG4gICAgICovXG4gICAgZ2V0IGlzQWx0UHJlc3NlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5oZWxkS2V5c1tcImFsdFwiXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZiBzdXBlciAobWFjL2xpbnV4KSBvciB0aGUgd2luZG93cyBrZXkgaXMgY3VycmVudGx5IHByZXNzZWQuXG4gICAgICovXG4gICAgZ2V0IGlzU3VwZXJQcmVzc2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmhlbGRLZXlzW1wic3VwZXJcIl07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBgdHJ1ZWAgaWYgdGFiIGlzIGN1cnJlbnRseSBwcmVzc2VkLlxuICAgICAqL1xuICAgIGdldCBpc1RhYlByZXNzZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuaGVsZEtleXNbXCJ0YWJcIl07XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpibHVyXCIpXG4gICAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcbiAgICBjbGVhcktleXMoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaGVsZEtleXMpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICB0aGlzLmhlbGRLZXlzW2tdID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdHlwZXMvbWVudS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBvcHVwT3B0aW9ucyB9IGZyb20gJy4vcG9wdXAnO1xuXG50eXBlIE1lbnVUcmlnZ2VyID0gXCJjbGlja1wiIHwgXCJkYmxjbGlja1wiIHwgXCJob3ZlclwiIHwgXCJjb250ZXh0bWVudVwiO1xuXG5leHBvcnQgdHlwZSBNZW51T3B0aW9ucyA9IFBhcnRpYWw8UG9wdXBPcHRpb25zICYge1xuICAgIC8qKlxuICAgICAqIFdoaWNoIGV2ZW50IHNob3VsZCB0cmlnZ2VyIHRoZSBhcHAgbWVudS5cbiAgICAgKi9cbiAgICB0cmlnZ2VyOiBNZW51VHJpZ2dlciB8IE1lbnVUcmlnZ2VyW107XG59PjtcblxudHlwZSBCYXNlTWVudUl0ZW08VCA9IGFueT4gPSB7XG4gICAgLyoqXG4gICAgICogTGFiZWwgZm9yIHRoZSBtZW51LWl0ZW1cbiAgICAgKi9cbiAgICBsYWJlbD86IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIGFuZ3VsYXIgdGVtcGxhdGUgdG8gdXNlIGZvciB0aGUgbGFiZWxcbiAgICAgKiBBbHRlcm5hdGl2ZWx5IGFjY2VwdHMgYSBsYW1iZGEgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBsYWJlbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PiB8ICgoZGF0YTogVCkgPT4gc3RyaW5nKVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSB1c2VyIGFjdGl2YXRlc1xuICAgICAqIGEgY29udGV4dC1tZW51IGl0ZW0uXG4gICAgICogVXNlIHRoZSBgY29udGV4dE1lbnVEYXRhYCBkZWNvcmF0b3IgZm9yIHBhc3NpbmcgZGF0YS5cbiAgICAgKi9cbiAgICBhY3Rpb24/OiAoZGF0YTogVCkgPT4gYW55LFxuXG4gICAgLyoqXG4gICAgICogSW5zdGVhZCBvZiBhbiBhY3Rpb24sIHRoaXMgaXRlbSBjYW4gYmUgYSBoeXBlcmxpbmsgcG9pbnRpbmcgdG8gdGhpcyBVUkxcbiAgICAgKiB3d3cuZXhhbXBsZS5jb20vZm9vL2Jhci56aXBcbiAgICAgKi9cbiAgICBsaW5rPzogc3RyaW5nLFxuXG4gICAgLyoqXG4gICAgICogV2hlbiBoYXZpbmcgYSBjb25maWd1cmVkIGBsaW5rYCBwcm9wZXJ0eSwgdGhpcyBzcGVjaWZpZXMgdGhlIGB0YXJnZXRgXG4gICAgICogYXR0cmlidXRlIGFwcGxpZWQgdG8gdGhlIGxpbmtcbiAgICAgKi9cbiAgICBsaW5rVGFyZ2V0PzogXCJfYmxhbmtcIiB8IFwiX3NlbGZcIiB8IFwiX3BhcmVudFwiIHwgXCJfdG9wXCIsIC8vIFwiZnJhbWVuYW1lXCJcblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgcmVzb2x2aW5nIGEgbGluayB3aGVuIHRoZSBjb250ZXh0IG1lbnVcbiAgICAgKiBpcyBvcGVuZWRcbiAgICAgKi9cbiAgICBsaW5rVGVtcGxhdGU/OiAoKGRhdGE6IFQpID0+IHN0cmluZyksXG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBtZXRob2QgdGhhdCBpcyBjYWxsZWQgdXBvbiBhIGNvbnRleHQgbWVudSBhY3RpdmF0aW9uXG4gICAgICogdGhhdCB3aGVuIGl0IHJldHVybnMgdHJ1ZSwgd2lsbCBzaG93IHRoZSBpdGVtIGFzIGRpc2FibGVkLlxuICAgICAqL1xuICAgIGlzRGlzYWJsZWQ/OiAoZGF0YTogVCkgPT4gYm9vbGVhbixcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB1cG9uIGEgY29udGV4dCBtZW51IGFjdGl2YXRpb25cbiAgICAgKiB0aGF0IHdoZW4gcmV0dXJuaW5nIGZhbHNlLCB3aWxsIGhpZGUgdGhlIG1lbnUgaXRlbS5cbiAgICAgKi9cbiAgICBpc1Zpc2libGU/OiAoZGF0YTogVCkgPT4gYm9vbGVhbixcblxuICAgIC8qKlxuICAgICAqIElmIGEgc2hvcnRjdXQgaXMgc2V0LCB0aGUgdGV4dC1sYWJlbC5cbiAgICAgKi9cbiAgICBzaG9ydGN1dExhYmVsPzogc3RyaW5nLFxuXG4gICAgLyoqXG4gICAgICogS2V5Ym9hcmQgc2hvcnRjdXQgdG8gYWN0aXZhdGUgdGhpcyBpdGVtLlxuICAgICAqL1xuICAgIC8vIHNob3J0Y3V0PzogS2V5Q29tbWFuZCxcblxuICAgIC8qKlxuICAgICAqIEljb24gdG8gcmVuZGVyIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGl0ZW0uXG4gICAgICogQ2FuIGJlIGEgVVJML1VSSSAobXVzdCBpbmNsdWRlIGV4dGVuc2lvbilcbiAgICAgKiBPciBjYW4gYmUgYSBtYXRlcmlhbCBpY29uIGlkZW50aWZpZXIuXG4gICAgICovXG4gICAgaWNvbj86IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGNoaWxkIG1lbnVcbiAgICAgKi9cbiAgICBjaGlsZHJlbj86IE1lbnVJdGVtPFQ+W10sXG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCByZXNvbHZlciB0aGF0IGR5bmFtaWNhbGx5IGxvYWRzIHRoZSBjb250ZW50c1xuICAgICAqIGZvciB0aGUgbWVudSBpdGVtLlxuICAgICAqIENhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGRldGVybWluZSB0aGUgc3VibWVudSBjb250ZW50c1xuICAgICAqL1xuICAgIGNoaWxkcmVuUmVzb2x2ZXI/OiAoZGF0YTogVCkgPT4gUHJvbWlzZTxNZW51SXRlbTxUPltdPixcblxuICAgIC8qKlxuICAgICAqIElmIGBjaGlsZHJlblJlc29sdmVyYCBpcyBwcm92aWRlZCwgZGlzYWJsZSBjYWNoaW5nIG9mXG4gICAgICogdGhlIHJlc29sdmVkIGNoaWxkcmVuLlxuICAgICAqL1xuICAgIGNhY2hlUmVzb2x2ZWRDaGlsZHJlbj86IGJvb2xlYW4sXG5cbiAgICAvKipcbiAgICAgKiBJbnN0ZWFkIG9mIGFuIGFycmF5IG9mIGNoaWxkcmVuLCByZW5kZXIgYSB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIGNoaWxkVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxUPiB8IFR5cGU8YW55PixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXRlbSBpcyBhIHNlcGFyYXRvci5cbiAgICAgKiBDYW4gYmUgdXNlZCB3aXRoIGxhYmVsIHRvIG1ha2UgYSBsYWJlbCBzZXBhcmF0b3IuXG4gICAgICovXG4gICAgc2VwYXJhdG9yPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIE1lbnVJdGVtPFQgPSBhbnk+ID1cbiAgICBCYXNlTWVudUl0ZW08VD4gfFxuICAgIFwic2VwYXJhdG9yXCI7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3R5cGVzL3BvcHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQb3B1cE9wdGlvbnMgPSBQYXJ0aWFsPHtcbiAgICAvKipcbiAgICAgKiBQb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCB0aGUgbWVudSBwb3BzLXVwIGF0XG4gICAgICovXG4gICAgcG9zaXRpb246IFwidG9wXCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiIHwgXCJsZWZ0XCIsXG4gICAgLyoqXG4gICAgICogSG93IHRoZSBwb3B1cCBpcyBhbGlnbmVkIHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBcImNlbnRlclwiIHwgXCJiZWZvcmVzdGFydFwiIHwgXCJzdGFydFwiIHwgXCJlbmRcIiB8IFwiYWZ0ZXJlbmRcIixcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogV0lQOlxuICAgICAqIFNob3cgYW4gZXJyb3IgZnJvbSB0aGUgZGlhbG9nIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgc2hvd0Fycm93OiBib29sZWFuLFxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBXSVA6XG4gICAgICogU2l6ZSBvZiB0aGUgYXJyb3cuXG4gICAgICovXG4gICAgYXJyb3dTaXplOiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogSG93IG11Y2ggcGFkZGluZyB0byBhZGQgbmVhciB0aGUgZWRnZXMgb2YgdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBlZGdlUGFkZGluZzogbnVtYmVyLFxuXG4gICAgY3VzdG9tQ2xhc3M6IHN0cmluZ1tdO1xufT47XG4iXX0=
@@ -0,0 +1,39 @@
1
+ export const sleep = ms => new Promise(r => setTimeout(r, ms));
2
+ /**
3
+ * Prompt the user to save a json file of the given object.
4
+ */
5
+ export const saveObjectAsFile = (name, data) => {
6
+ const a = document.createElement("a");
7
+ const file = new Blob([JSON.stringify(data)], { type: "application/json" });
8
+ a.href = URL.createObjectURL(file);
9
+ a.download = name;
10
+ a.click();
11
+ a.remove();
12
+ };
13
+ /**
14
+ * Formatted logger that will print a bit of context before the message.
15
+ * @returns
16
+ */
17
+ export const Logger = (context, contextColor, textColor = "#03a9f4") => ({
18
+ log: (message, ...args) => {
19
+ console.log(`%c[${context}] %c${message}`, 'color: ' + contextColor, 'color: ' + textColor, ...args);
20
+ },
21
+ warn: (message, ...args) => {
22
+ console.warn(`%c[${context}] %c${message}`, 'color: ' + contextColor, 'color: ' + textColor, ...args);
23
+ },
24
+ err: (message, ...args) => {
25
+ console.error(`%c[${context}] %c${message}`, 'color: ' + contextColor, 'color: ' + textColor, ...args);
26
+ },
27
+ error: (message, ...args) => {
28
+ console.error(`%c[${context}] %c${message}`, 'color: ' + contextColor, 'color: ' + textColor, ...args);
29
+ }
30
+ });
31
+ /**
32
+ * Convert a string `fooBAR baz_160054''"1]"` into a slug: `foobar-baz-1600541`
33
+ */
34
+ export const stringToSlug = (text) => (text || '')
35
+ .trim()
36
+ .toLowerCase()
37
+ .replace(/[\-_+ ]/g, '-')
38
+ .replace(/[^a-z0-9\-]/g, '');
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRS9EOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQWUsRUFBRSxZQUFvQixFQUFFLFlBQW9CLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RixHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtRQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sT0FBTyxPQUFPLE9BQU8sRUFBRSxFQUFFLFNBQVMsR0FBRyxZQUFZLEVBQUUsU0FBUyxHQUFHLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFDRCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtRQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sT0FBTyxPQUFPLE9BQU8sRUFBRSxFQUFFLFNBQVMsR0FBRyxZQUFZLEVBQUUsU0FBUyxHQUFHLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFDRCxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtRQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sT0FBTyxPQUFPLE9BQU8sRUFBRSxFQUFFLFNBQVMsR0FBRyxZQUFZLEVBQUUsU0FBUyxHQUFHLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFDRCxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtRQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sT0FBTyxPQUFPLE9BQU8sRUFBRSxFQUFFLFNBQVMsR0FBRyxZQUFZLEVBQUUsU0FBUyxHQUFHLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzNHLENBQUM7Q0FDSixDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQ3pDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztLQUNQLElBQUksRUFBRTtLQUNOLFdBQVcsRUFBRTtLQUNiLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO0tBQ3hCLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3Qgc2xlZXAgPSBtcyA9PiBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgbXMpKTtcblxuLyoqXG4gKiBQcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZSBhIGpzb24gZmlsZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3Qgc2F2ZU9iamVjdEFzRmlsZSA9IChuYW1lOiBzdHJpbmcsIGRhdGE6IE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRhdGEpXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KTtcbiAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgIGEuZG93bmxvYWQgPSBuYW1lO1xuICAgIGEuY2xpY2soKTtcbiAgICBhLnJlbW92ZSgpO1xufTtcblxuLyoqXG4gKiBGb3JtYXR0ZWQgbG9nZ2VyIHRoYXQgd2lsbCBwcmludCBhIGJpdCBvZiBjb250ZXh0IGJlZm9yZSB0aGUgbWVzc2FnZS5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBMb2dnZXIgPSAoY29udGV4dDogc3RyaW5nLCBjb250ZXh0Q29sb3I6IHN0cmluZywgdGV4dENvbG9yOiBzdHJpbmcgPSBcIiMwM2E5ZjRcIikgPT4gKHtcbiAgICBsb2c6IChtZXNzYWdlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1ske2NvbnRleHR9XSAlYyR7bWVzc2FnZX1gLCAnY29sb3I6ICcgKyBjb250ZXh0Q29sb3IsICdjb2xvcjogJyArIHRleHRDb2xvciwgLi4uYXJncyk7XG4gICAgfSxcbiAgICB3YXJuOiAobWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYCVjWyR7Y29udGV4dH1dICVjJHttZXNzYWdlfWAsICdjb2xvcjogJyArIGNvbnRleHRDb2xvciwgJ2NvbG9yOiAnICsgdGV4dENvbG9yLCAuLi5hcmdzKTtcbiAgICB9LFxuICAgIGVycjogKG1lc3NhZ2UsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJWNbJHtjb250ZXh0fV0gJWMke21lc3NhZ2V9YCwgJ2NvbG9yOiAnICsgY29udGV4dENvbG9yLCAnY29sb3I6ICcgKyB0ZXh0Q29sb3IsIC4uLmFyZ3MpO1xuICAgIH0sXG4gICAgZXJyb3I6IChtZXNzYWdlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCVjWyR7Y29udGV4dH1dICVjJHttZXNzYWdlfWAsICdjb2xvcjogJyArIGNvbnRleHRDb2xvciwgJ2NvbG9yOiAnICsgdGV4dENvbG9yLCAuLi5hcmdzKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIGBmb29CQVIgYmF6XzE2MDA1NCcnXCIxXVwiYCBpbnRvIGEgc2x1ZzogYGZvb2Jhci1iYXotMTYwMDU0MWBcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZ1RvU2x1ZyA9ICh0ZXh0OiBzdHJpbmcpID0+XG4gICAgKHRleHQgfHwgJycpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLnJlcGxhY2UoL1tcXC1fKyBdL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL1teYS16MC05XFwtXS9nLCAnJyk7XG5cbiJdfQ==