@myrmidon/gve-core 0.0.1

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 (48) hide show
  1. package/README.md +83 -0
  2. package/esm2022/lib/components/animation-timeline/animation-timeline.component.mjs +176 -0
  3. package/esm2022/lib/components/animation-tween/animation-tween.component.mjs +161 -0
  4. package/esm2022/lib/components/animation-vars/animation-vars.component.mjs +141 -0
  5. package/esm2022/lib/components/base-text-char/base-text-char.component.mjs +37 -0
  6. package/esm2022/lib/components/base-text-editor/base-text-editor.component.mjs +111 -0
  7. package/esm2022/lib/components/base-text-view/base-text-view.component.mjs +125 -0
  8. package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +512 -0
  9. package/esm2022/lib/components/chain-result-view/chain-result-view.component.mjs +190 -0
  10. package/esm2022/lib/components/feature-editor/feature-editor.component.mjs +185 -0
  11. package/esm2022/lib/components/feature-set-editor/feature-set-editor.component.mjs +152 -0
  12. package/esm2022/lib/components/feature-set-view/feature-set-view.component.mjs +80 -0
  13. package/esm2022/lib/components/ln-heights-editor/ln-heights-editor.component.mjs +95 -0
  14. package/esm2022/lib/components/operation-source-editor/operation-source-editor.component.mjs +106 -0
  15. package/esm2022/lib/components/simple-tree/simple-tree.component.mjs +56 -0
  16. package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +510 -0
  17. package/esm2022/lib/components/steps-map/steps-map.component.mjs +55 -0
  18. package/esm2022/lib/models.mjs +2 -0
  19. package/esm2022/lib/services/gve-api.service.mjs +52 -0
  20. package/esm2022/lib/services/settings.service.mjs +86 -0
  21. package/esm2022/lib/validators/svg-validators.mjs +28 -0
  22. package/esm2022/myrmidon-gve-core.mjs +5 -0
  23. package/esm2022/public-api.mjs +23 -0
  24. package/fesm2022/myrmidon-gve-core.mjs +2592 -0
  25. package/fesm2022/myrmidon-gve-core.mjs.map +1 -0
  26. package/index.d.ts +5 -0
  27. package/lib/components/animation-timeline/animation-timeline.component.d.ts +42 -0
  28. package/lib/components/animation-tween/animation-tween.component.d.ts +47 -0
  29. package/lib/components/animation-vars/animation-vars.component.d.ts +30 -0
  30. package/lib/components/base-text-char/base-text-char.component.d.ts +29 -0
  31. package/lib/components/base-text-editor/base-text-editor.component.d.ts +40 -0
  32. package/lib/components/base-text-view/base-text-view.component.d.ts +29 -0
  33. package/lib/components/chain-operation-editor/chain-operation-editor.component.d.ts +102 -0
  34. package/lib/components/chain-result-view/chain-result-view.component.d.ts +44 -0
  35. package/lib/components/feature-editor/feature-editor.component.d.ts +72 -0
  36. package/lib/components/feature-set-editor/feature-set-editor.component.d.ts +55 -0
  37. package/lib/components/feature-set-view/feature-set-view.component.d.ts +36 -0
  38. package/lib/components/ln-heights-editor/ln-heights-editor.component.d.ts +22 -0
  39. package/lib/components/operation-source-editor/operation-source-editor.component.d.ts +24 -0
  40. package/lib/components/simple-tree/simple-tree.component.d.ts +16 -0
  41. package/lib/components/snapshot-editor/snapshot-editor.component.d.ts +105 -0
  42. package/lib/components/steps-map/steps-map.component.d.ts +29 -0
  43. package/lib/models.d.ts +7 -0
  44. package/lib/services/gve-api.service.d.ts +57 -0
  45. package/lib/services/settings.service.d.ts +53 -0
  46. package/lib/validators/svg-validators.d.ts +4 -0
  47. package/package.json +45 -0
  48. package/public-api.d.ts +19 -0
@@ -0,0 +1,55 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { MatButtonModule } from '@angular/material/button';
4
+ import { MatRippleModule } from '@angular/material/core';
5
+ import { MatTooltipModule } from '@angular/material/tooltip';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/material/core";
9
+ /**
10
+ * A map of steps in a chain operation context.
11
+ */
12
+ export class StepsMapComponent {
13
+ constructor() {
14
+ /**
15
+ * The font size of the steps text.
16
+ */
17
+ this.textFontSize = '0.5em';
18
+ /**
19
+ * Emitted when the selectd step has changed.
20
+ */
21
+ this.selectedStepChange = new EventEmitter();
22
+ }
23
+ /**
24
+ * The steps to display.
25
+ */
26
+ get steps() {
27
+ return this._steps;
28
+ }
29
+ set steps(value) {
30
+ if (this._steps === value) {
31
+ return;
32
+ }
33
+ this.selectedStep = undefined;
34
+ this._steps = value || undefined;
35
+ }
36
+ onSelectStep(step) {
37
+ this.selectedStep = step;
38
+ this.selectedStepChange.emit(step);
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: StepsMapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: StepsMapComponent, isStandalone: true, selector: "gve-steps-map", inputs: { steps: "steps", selectedStep: "selectedStep", textFontSize: "textFontSize" }, outputs: { selectedStepChange: "selectedStepChange" }, ngImport: i0, template: "<div>\r\n @if (steps?.length) { @for (step of steps; track step.outputTag) {\r\n <div\r\n matRipple\r\n class=\"step form-row\"\r\n [ngClass]=\"{ selected: step === selectedStep }\"\r\n (click)=\"onSelectStep(step)\"\r\n >\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} &#x25b6; </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <div class=\"text\" [style.fontSize]=\"textFontSize\">{{ step.result }}</div>\r\n </div>\r\n } }\r\n</div>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.selected{background-color:#fbfb9d}.step{border-top:1px solid rgb(68,114,253);border-bottom:1px solid rgb(68,114,253);border-right:1px solid rgb(68,114,253);border-radius:6px;margin:8px 0}.tag{background-color:#4472fd;color:#fff;border:1px solid rgb(68,114,253);border-radius:6px;padding:4px;cursor:pointer}.muted-tag{color:silver}.text{font-size:.5em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i2.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: MatTooltipModule }] }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: StepsMapComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'gve-steps-map', standalone: true, imports: [CommonModule, MatButtonModule, MatRippleModule, MatTooltipModule], template: "<div>\r\n @if (steps?.length) { @for (step of steps; track step.outputTag) {\r\n <div\r\n matRipple\r\n class=\"step form-row\"\r\n [ngClass]=\"{ selected: step === selectedStep }\"\r\n (click)=\"onSelectStep(step)\"\r\n >\r\n <div class=\"tag\">\r\n <span class=\"muted-tag\">{{ step.inputTag }} &#x25b6; </span>\r\n {{ step.outputTag }}\r\n </div>\r\n <div class=\"text\" [style.fontSize]=\"textFontSize\">{{ step.result }}</div>\r\n </div>\r\n } }\r\n</div>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}.selected{background-color:#fbfb9d}.step{border-top:1px solid rgb(68,114,253);border-bottom:1px solid rgb(68,114,253);border-right:1px solid rgb(68,114,253);border-radius:6px;margin:8px 0}.tag{background-color:#4472fd;color:#fff;border:1px solid rgb(68,114,253);border-radius:6px;padding:4px;cursor:pointer}.muted-tag{color:silver}.text{font-size:.5em}\n"] }]
46
+ }], propDecorators: { steps: [{
47
+ type: Input
48
+ }], selectedStep: [{
49
+ type: Input
50
+ }], textFontSize: [{
51
+ type: Input
52
+ }], selectedStepChange: [{
53
+ type: Output
54
+ }] } });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zdGVwcy1tYXAvc3RlcHMtbWFwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zdGVwcy1tYXAvc3RlcHMtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFJN0Q7O0dBRUc7QUFRSCxNQUFNLE9BQU8saUJBQWlCO0lBUDlCO1FBK0JFOztXQUVHO1FBRUksaUJBQVksR0FBVyxPQUFPLENBQUM7UUFFdEM7O1dBRUc7UUFFSSx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztLQU0zRTtJQXJDQzs7T0FFRztJQUNILElBQ1csS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBVyxLQUFLLENBQUMsS0FBcUQ7UUFDcEUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDO0lBQ25DLENBQUM7SUFvQk0sWUFBWSxDQUFDLElBQStCO1FBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQzs4R0F2Q1UsaUJBQWlCO2tHQUFqQixpQkFBaUIsd05DbkI5QixzZkFnQkEsc2ZERFksWUFBWSw0SEFBRSxlQUFlLDhCQUFFLGVBQWUsa1NBQUUsZ0JBQWdCOzsyRkFJL0QsaUJBQWlCO2tCQVA3QixTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQzs4QkFXaEUsS0FBSztzQkFEZixLQUFLO2dCQWdCQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBT0Msa0JBQWtCO3NCQUR4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdFJpcHBsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcblxyXG5pbXBvcnQgeyBDaGFpbk9wZXJhdGlvbkNvbnRleHRTdGVwIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ3ZlLWFwaS5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hcCBvZiBzdGVwcyBpbiBhIGNoYWluIG9wZXJhdGlvbiBjb250ZXh0LlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndmUtc3RlcHMtbWFwJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0UmlwcGxlTW9kdWxlLCBNYXRUb29sdGlwTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcHMtbWFwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3RlcHMtbWFwLmNvbXBvbmVudC5jc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RlcHNNYXBDb21wb25lbnQge1xyXG4gIHByaXZhdGUgX3N0ZXBzPzogQ2hhaW5PcGVyYXRpb25Db250ZXh0U3RlcFtdO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc3RlcHMgdG8gZGlzcGxheS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgc3RlcHMoKTogQ2hhaW5PcGVyYXRpb25Db250ZXh0U3RlcFtdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGVwcztcclxuICB9XHJcbiAgcHVibGljIHNldCBzdGVwcyh2YWx1ZTogQ2hhaW5PcGVyYXRpb25Db250ZXh0U3RlcFtdIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuX3N0ZXBzID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RlcCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuX3N0ZXBzID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHN0ZXAgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2VsZWN0ZWRTdGVwOiBDaGFpbk9wZXJhdGlvbkNvbnRleHRTdGVwIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZm9udCBzaXplIG9mIHRoZSBzdGVwcyB0ZXh0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHRleHRGb250U2l6ZTogc3RyaW5nID0gJzAuNWVtJztcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBzZWxlY3RkIHN0ZXAgaGFzIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHNlbGVjdGVkU3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhaW5PcGVyYXRpb25Db250ZXh0U3RlcD4oKTtcclxuXHJcbiAgcHVibGljIG9uU2VsZWN0U3RlcChzdGVwOiBDaGFpbk9wZXJhdGlvbkNvbnRleHRTdGVwKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RlcCA9IHN0ZXA7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RlcENoYW5nZS5lbWl0KHN0ZXApO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIEBpZiAoc3RlcHM/Lmxlbmd0aCkgeyBAZm9yIChzdGVwIG9mIHN0ZXBzOyB0cmFjayBzdGVwLm91dHB1dFRhZykge1xyXG4gIDxkaXZcclxuICAgIG1hdFJpcHBsZVxyXG4gICAgY2xhc3M9XCJzdGVwIGZvcm0tcm93XCJcclxuICAgIFtuZ0NsYXNzXT1cInsgc2VsZWN0ZWQ6IHN0ZXAgPT09IHNlbGVjdGVkU3RlcCB9XCJcclxuICAgIChjbGljayk9XCJvblNlbGVjdFN0ZXAoc3RlcClcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWdcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtdXRlZC10YWdcIj57eyBzdGVwLmlucHV0VGFnIH19ICYjeDI1YjY7IDwvc3Bhbj5cclxuICAgICAge3sgc3RlcC5vdXRwdXRUYWcgfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHRcIiBbc3R5bGUuZm9udFNpemVdPVwidGV4dEZvbnRTaXplXCI+e3sgc3RlcC5yZXN1bHQgfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuICB9IH1cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vZ3ZlLWNvcmUvc3JjL2xpYi9tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBUEkgY2FsbCByZXN1bHQgd3JhcHBlci5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzdWx0V3JhcHBlcjxUPiB7XHJcbiAgcmVzdWx0PzogVDtcclxuICBlcnJvcj86IHN0cmluZztcclxufVxyXG4iXX0=
@@ -0,0 +1,52 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { catchError } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common/http";
5
+ import * as i2 from "@myrmidon/ng-tools";
6
+ /**
7
+ * Service to interact with the GVE API.
8
+ */
9
+ export class GveApiService {
10
+ constructor(_http, _error, _env) {
11
+ this._http = _http;
12
+ this._error = _error;
13
+ this._env = _env;
14
+ }
15
+ /**
16
+ * Parse the specified text into operations. Each operation is a line
17
+ * of the text.
18
+ * @param text The text to parse.
19
+ * @returns The operations.
20
+ */
21
+ parseOperations(text) {
22
+ return this._http
23
+ .post(`${this._env.get('apiUrl')}text/operations/parse`, {
24
+ text,
25
+ })
26
+ .pipe(catchError(this._error.handleError));
27
+ }
28
+ /**
29
+ * Run operations on the specified text.
30
+ *
31
+ * @param text The base text.
32
+ * @param operations The operations to run.
33
+ * @returns Result wrapper.
34
+ */
35
+ runOperations(text, operations) {
36
+ return this._http
37
+ .post(`${this._env.get('apiUrl')}text/operations/run`, {
38
+ text,
39
+ operations,
40
+ })
41
+ .pipe(catchError(this._error.handleError));
42
+ }
43
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: GveApiService, deps: [{ token: i1.HttpClient }, { token: i2.ErrorService }, { token: i2.EnvService }], target: i0.ɵɵFactoryTarget.Injectable }); }
44
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: GveApiService, providedIn: 'root' }); }
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: GveApiService, decorators: [{
47
+ type: Injectable,
48
+ args: [{
49
+ providedIn: 'root',
50
+ }]
51
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.ErrorService }, { type: i2.EnvService }] });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3ZlLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vZ3ZlLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9ndmUtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7O0FBcUM5Qzs7R0FFRztBQUlILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQ1UsS0FBaUIsRUFDakIsTUFBb0IsRUFDcEIsSUFBZ0I7UUFGaEIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQ3BCLFNBQUksR0FBSixJQUFJLENBQVk7SUFDdkIsQ0FBQztJQUVKOzs7OztPQUtHO0lBQ0ksZUFBZSxDQUNwQixJQUFZO1FBRVosT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLElBQUksQ0FDSCxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFDakQ7WUFDRSxJQUFJO1NBQ0wsQ0FDRjthQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhLENBQ2xCLElBQWdCLEVBQ2hCLFVBQWdDO1FBRWhDLE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxJQUFJLENBQ0gsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQy9DO1lBQ0UsSUFBSTtZQUNKLFVBQVU7U0FDWCxDQUNGO2FBQ0EsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQzs4R0E5Q1UsYUFBYTtrSEFBYixhQUFhLGNBRlosTUFBTTs7MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UsIEVudlNlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDaGFyQ2hhaW5PcGVyYXRpb24sXHJcbiAgQ2hhck5vZGUsXHJcbiAgT3BlcmF0aW9uRmVhdHVyZSxcclxufSBmcm9tICdAbXlybWlkb24vZ3ZlLXNuYXBzaG90LXZpZXcnO1xyXG5cclxuaW1wb3J0IHsgUmVzdWx0V3JhcHBlciB9IGZyb20gJy4uL21vZGVscyc7XHJcblxyXG4vKipcclxuICogRXhlY3V0aW9uIHN0ZXAgb2YgYSBjaGFyLWJhc2VkIGNoYWluIG9wZXJhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhaW5PcGVyYXRpb25Db250ZXh0U3RlcCB7XHJcbiAgb3BlcmF0aW9uOiBDaGFyQ2hhaW5PcGVyYXRpb247XHJcbiAgaW5wdXRUYWc6IHN0cmluZztcclxuICBvdXRwdXRUYWc6IHN0cmluZztcclxuICByZXN1bHQ/OiBzdHJpbmc7XHJcbiAgZmVhdHVyZVNldDoge1xyXG4gICAgZmVhdHVyZXM6IE9wZXJhdGlvbkZlYXR1cmVbXTtcclxuICAgIG5vZGVGZWF0dXJlczogUmVjb3JkPHN0cmluZywgT3BlcmF0aW9uRmVhdHVyZVtdPjtcclxuICB9O1xyXG4gIHJlZk5vZGVJZHM6IG51bWJlcltdO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzdWx0IG9mIGV4ZWN1dGlvbiBvZiBhIGNoYXItYmFzZWQgY2hhaW4uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENoYXJDaGFpblJlc3VsdCB7XHJcbiAgc3RlcHM6IENoYWluT3BlcmF0aW9uQ29udGV4dFN0ZXBbXTtcclxuICBjaGFpbkR1bXA6IHN0cmluZztcclxuICBjaGFpblRhZ3M6IHN0cmluZ1tdO1xyXG4gIHRhZ2dlZE5vZGVzOiB7IFtrZXk6IHN0cmluZ106IENoYXJOb2RlW10gfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgR1ZFIEFQSS5cclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHdmVBcGlTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIF9lcnJvcjogRXJyb3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZW52OiBFbnZTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZSB0aGUgc3BlY2lmaWVkIHRleHQgaW50byBvcGVyYXRpb25zLiBFYWNoIG9wZXJhdGlvbiBpcyBhIGxpbmVcclxuICAgKiBvZiB0aGUgdGV4dC5cclxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBwYXJzZS5cclxuICAgKiBAcmV0dXJucyBUaGUgb3BlcmF0aW9ucy5cclxuICAgKi9cclxuICBwdWJsaWMgcGFyc2VPcGVyYXRpb25zKFxyXG4gICAgdGV4dDogc3RyaW5nXHJcbiAgKTogT2JzZXJ2YWJsZTxSZXN1bHRXcmFwcGVyPENoYXJDaGFpbk9wZXJhdGlvbltdPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgLnBvc3Q8UmVzdWx0V3JhcHBlcjxDaGFyQ2hhaW5PcGVyYXRpb25bXT4+KFxyXG4gICAgICAgIGAke3RoaXMuX2Vudi5nZXQoJ2FwaVVybCcpfXRleHQvb3BlcmF0aW9ucy9wYXJzZWAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGV4dCxcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUnVuIG9wZXJhdGlvbnMgb24gdGhlIHNwZWNpZmllZCB0ZXh0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHRleHQgVGhlIGJhc2UgdGV4dC5cclxuICAgKiBAcGFyYW0gb3BlcmF0aW9ucyBUaGUgb3BlcmF0aW9ucyB0byBydW4uXHJcbiAgICogQHJldHVybnMgUmVzdWx0IHdyYXBwZXIuXHJcbiAgICovXHJcbiAgcHVibGljIHJ1bk9wZXJhdGlvbnMoXHJcbiAgICB0ZXh0OiBDaGFyTm9kZVtdLFxyXG4gICAgb3BlcmF0aW9uczogQ2hhckNoYWluT3BlcmF0aW9uW11cclxuICApOiBPYnNlcnZhYmxlPFJlc3VsdFdyYXBwZXI8Q2hhckNoYWluUmVzdWx0Pj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgLnBvc3Q8UmVzdWx0V3JhcHBlcjxDaGFyQ2hhaW5SZXN1bHQ+PihcclxuICAgICAgICBgJHt0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKX10ZXh0L29wZXJhdGlvbnMvcnVuYCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0ZXh0LFxyXG4gICAgICAgICAgb3BlcmF0aW9ucyxcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,86 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Service to store and retrieve dynamic settings.
5
+ */
6
+ export class SettingsService {
7
+ constructor() {
8
+ this._cache = new Map();
9
+ }
10
+ /**
11
+ * Scopes the key by prefixing it with the keyPrefix if any.
12
+ *
13
+ * @param key The key to scope.
14
+ * @returns The scoped key.
15
+ */
16
+ getScopedKey(key) {
17
+ return this.keyPrefix ? this.keyPrefix + key : key;
18
+ }
19
+ /**
20
+ * Sets a setting's value.
21
+ *
22
+ * @param key The key.
23
+ * @param value The value.
24
+ * @param persist True to persist this setting in local storage.
25
+ */
26
+ set(key, value, persist = false) {
27
+ key = this.getScopedKey(key);
28
+ this._cache.set(key, value);
29
+ if (persist && value) {
30
+ localStorage.setItem(key, JSON.stringify(value));
31
+ }
32
+ }
33
+ /**
34
+ * Get a setting's value of type T.
35
+ *
36
+ * @param key The key.
37
+ * @param defaultValue The default value to get when the setting
38
+ * is not found in the store.
39
+ * @returns The value.
40
+ */
41
+ get(key, defaultValue) {
42
+ key = this.getScopedKey(key);
43
+ // immediately return value from cache
44
+ if (this._cache.has(key)) {
45
+ return this._cache.get(key);
46
+ }
47
+ // try loading value from local storage
48
+ const value = localStorage.getItem(key);
49
+ if (value) {
50
+ const v = JSON.parse(value);
51
+ this._cache.set(key, v);
52
+ return value;
53
+ }
54
+ // not found, return default value
55
+ return defaultValue;
56
+ }
57
+ /**
58
+ * Check if a key exists in the store.
59
+ *
60
+ * @param key The key.
61
+ * @returns True if the key exists in the store.
62
+ */
63
+ contains(key) {
64
+ key = this.getScopedKey(key);
65
+ return this._cache.has(key) || localStorage.getItem(key) !== null;
66
+ }
67
+ /**
68
+ * Remove a setting if present.
69
+ *
70
+ * @param key The key.
71
+ */
72
+ remove(key) {
73
+ key = this.getScopedKey(key);
74
+ this._cache.delete(key);
75
+ localStorage.removeItem(key);
76
+ }
77
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: SettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
78
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: SettingsService, providedIn: 'root' }); }
79
+ }
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: SettingsService, decorators: [{
81
+ type: Injectable,
82
+ args: [{
83
+ providedIn: 'root',
84
+ }]
85
+ }] });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvc2VydmljZXMvc2V0dGluZ3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUUzQzs7R0FFRztBQUlILE1BQU0sT0FBTyxlQUFlO0lBSDVCO1FBSW1CLFdBQU0sR0FBcUIsSUFBSSxHQUFHLEVBQWUsQ0FBQztLQW9GcEU7SUExRUM7Ozs7O09BS0c7SUFDSyxZQUFZLENBQUMsR0FBVztRQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQ2pELEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNyQixZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksR0FBRyxDQUFJLEdBQVcsRUFBRSxZQUFrQjtRQUMzQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU3QixzQ0FBc0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4QixPQUFPLEtBQVUsQ0FBQztRQUNwQixDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVEsQ0FBQyxHQUFXO1FBQ3pCLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsR0FBVztRQUN2QixHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OEdBcEZVLGVBQWU7a0hBQWYsZUFBZSxjQUZkLE1BQU07OzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGR5bmFtaWMgc2V0dGluZ3MuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZTogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZWZpeCB0byBzY29wZSB0aGUga2V5cy4gVGhpcyBwcmVmaXggaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHNjb3BlIHRoZSBrZXlzXHJcbiAgICogc28gdGhhdCB0aGV5IGNhbm5vdCBjb25mbGljdCB3aXRoIG90aGVyIGtleXMgaW4gdGhlIGxvY2FsIHN0b3JhZ2UuXHJcbiAgICogVGhlIHByZWZpeCBpcyB0b3RhbGx5IHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyIG9mIHRoZSBzZXJ2aWNlLCB3aG8gc2hvdWxkXHJcbiAgICogdXNlIHRoZSBrZXlzIHdpdGhvdXQgdGhlIHByZWZpeC5cclxuICAgKi9cclxuICBwdWJsaWMga2V5UHJlZml4Pzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBTY29wZXMgdGhlIGtleSBieSBwcmVmaXhpbmcgaXQgd2l0aCB0aGUga2V5UHJlZml4IGlmIGFueS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBzY29wZS5cclxuICAgKiBAcmV0dXJucyBUaGUgc2NvcGVkIGtleS5cclxuICAgKi9cclxuICBwcml2YXRlIGdldFNjb3BlZEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5rZXlQcmVmaXggPyB0aGlzLmtleVByZWZpeCArIGtleSA6IGtleTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBzZXR0aW5nJ3MgdmFsdWUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuXHJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cclxuICAgKiBAcGFyYW0gcGVyc2lzdCBUcnVlIHRvIHBlcnNpc3QgdGhpcyBzZXR0aW5nIGluIGxvY2FsIHN0b3JhZ2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgcGVyc2lzdCA9IGZhbHNlKSB7XHJcbiAgICBrZXkgPSB0aGlzLmdldFNjb3BlZEtleShrZXkpO1xyXG4gICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgaWYgKHBlcnNpc3QgJiYgdmFsdWUpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgc2V0dGluZydzIHZhbHVlIG9mIHR5cGUgVC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleS5cclxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIHRvIGdldCB3aGVuIHRoZSBzZXR0aW5nXHJcbiAgICogaXMgbm90IGZvdW5kIGluIHRoZSBzdG9yZS5cclxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUuXHJcbiAgICovXHJcbiAgcHVibGljIGdldDxUPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XHJcbiAgICBrZXkgPSB0aGlzLmdldFNjb3BlZEtleShrZXkpO1xyXG5cclxuICAgIC8vIGltbWVkaWF0ZWx5IHJldHVybiB2YWx1ZSBmcm9tIGNhY2hlXHJcbiAgICBpZiAodGhpcy5fY2FjaGUuaGFzKGtleSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRyeSBsb2FkaW5nIHZhbHVlIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAgY29uc3QgdmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IHYgPSBKU09OLnBhcnNlKHZhbHVlKTtcclxuICAgICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgdik7XHJcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBUO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vdCBmb3VuZCwgcmV0dXJuIGRlZmF1bHQgdmFsdWVcclxuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGtleSBUaGUga2V5LlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb250YWlucyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAga2V5ID0gdGhpcy5nZXRTY29wZWRLZXkoa2V5KTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KSB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGEgc2V0dGluZyBpZiBwcmVzZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGtleSBUaGUga2V5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGtleSA9IHRoaXMuZ2V0U2NvcGVkS2V5KGtleSk7XHJcbiAgICB0aGlzLl9jYWNoZS5kZWxldGUoa2V5KTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,28 @@
1
+ export class SvgValidators {
2
+ static rootGValidator() {
3
+ return (control) => {
4
+ if (!control.value) {
5
+ return null;
6
+ }
7
+ const parser = new DOMParser();
8
+ let error = null;
9
+ let svgRoot;
10
+ try {
11
+ const doc = parser.parseFromString(control.value, 'image/svg+xml');
12
+ svgRoot =
13
+ doc.documentElement.nodeName === 'svg' ? doc.documentElement : null;
14
+ }
15
+ catch (e) {
16
+ error = { svgInvalid: { value: control.value } };
17
+ }
18
+ if (!error && svgRoot) {
19
+ const gElements = svgRoot.getElementsByTagName('g');
20
+ if (gElements.length !== 1 || svgRoot.childNodes.length > 1) {
21
+ error = { svgInvalidRoot: { value: control.value } };
22
+ }
23
+ }
24
+ return error;
25
+ };
26
+ }
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLXZhbGlkYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbGliL3ZhbGlkYXRvcnMvc3ZnLXZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLGFBQWE7SUFDeEIsTUFBTSxDQUFDLGNBQWM7UUFDbkIsT0FBTyxDQUFDLE9BQXdCLEVBQWlDLEVBQUU7WUFDakUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMvQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxPQUFPLENBQUM7WUFFWixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRSxPQUFPO29CQUNMLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3hFLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLEtBQUssR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNuRCxDQUFDO1lBRUQsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM1RCxLQUFLLEdBQUcsRUFBRSxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ3ZELENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN2Z1ZhbGlkYXRvcnMge1xyXG4gIHN0YXRpYyByb290R1ZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICBsZXQgc3ZnUm9vdDtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhjb250cm9sLnZhbHVlLCAnaW1hZ2Uvc3ZnK3htbCcpO1xyXG4gICAgICAgIHN2Z1Jvb3QgPVxyXG4gICAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSA9PT0gJ3N2ZycgPyBkb2MuZG9jdW1lbnRFbGVtZW50IDogbnVsbDtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGVycm9yID0geyBzdmdJbnZhbGlkOiB7IHZhbHVlOiBjb250cm9sLnZhbHVlIH0gfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFlcnJvciAmJiBzdmdSb290KSB7XHJcbiAgICAgICAgY29uc3QgZ0VsZW1lbnRzID0gc3ZnUm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZycpO1xyXG4gICAgICAgIGlmIChnRWxlbWVudHMubGVuZ3RoICE9PSAxIHx8IHN2Z1Jvb3QuY2hpbGROb2Rlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBlcnJvciA9IHsgc3ZnSW52YWxpZFJvb3Q6IHsgdmFsdWU6IGNvbnRyb2wudmFsdWUgfSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlybWlkb24tZ3ZlLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbXlybWlkb24tZ3ZlLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,23 @@
1
+ /*
2
+ * Public API Surface of gve-core
3
+ */
4
+ export * from './lib/models';
5
+ export * from './lib/components/animation-timeline/animation-timeline.component';
6
+ export * from './lib/components/animation-tween/animation-tween.component';
7
+ export * from './lib/components/animation-vars/animation-vars.component';
8
+ export * from './lib/components/base-text-char/base-text-char.component';
9
+ export * from './lib/components/base-text-editor/base-text-editor.component';
10
+ export * from './lib/components/base-text-view/base-text-view.component';
11
+ export * from './lib/components/chain-operation-editor/chain-operation-editor.component';
12
+ export * from './lib/components/chain-result-view/chain-result-view.component';
13
+ export * from './lib/components/feature-editor/feature-editor.component';
14
+ export * from './lib/components/feature-set-editor/feature-set-editor.component';
15
+ export * from './lib/components/feature-set-view/feature-set-view.component';
16
+ export * from './lib/components/ln-heights-editor/ln-heights-editor.component';
17
+ export * from './lib/components/operation-source-editor/operation-source-editor.component';
18
+ export * from './lib/components/simple-tree/simple-tree.component';
19
+ export * from './lib/components/snapshot-editor/snapshot-editor.component';
20
+ export * from './lib/components/steps-map/steps-map.component';
21
+ export * from './lib/services/gve-api.service';
22
+ export * from './lib/services/settings.service';
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxrRUFBa0UsQ0FBQztBQUNqRixjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYywwREFBMEQsQ0FBQztBQUN6RSxjQUFjLDhEQUE4RCxDQUFDO0FBQzdFLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYywwRUFBMEUsQ0FBQztBQUN6RixjQUFjLGdFQUFnRSxDQUFDO0FBQy9FLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyxrRUFBa0UsQ0FBQztBQUNqRixjQUFjLDhEQUE4RCxDQUFDO0FBQzdFLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyw0RUFBNEUsQ0FBQztBQUMzRixjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyxnREFBZ0QsQ0FBQztBQUUvRCxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsaUNBQWlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgZ3ZlLWNvcmVcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2FuaW1hdGlvbi10aW1lbGluZS9hbmltYXRpb24tdGltZWxpbmUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9hbmltYXRpb24tdHdlZW4vYW5pbWF0aW9uLXR3ZWVuLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYW5pbWF0aW9uLXZhcnMvYW5pbWF0aW9uLXZhcnMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iYXNlLXRleHQtY2hhci9iYXNlLXRleHQtY2hhci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Jhc2UtdGV4dC1lZGl0b3IvYmFzZS10ZXh0LWVkaXRvci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Jhc2UtdGV4dC12aWV3L2Jhc2UtdGV4dC12aWV3LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvY2hhaW4tb3BlcmF0aW9uLWVkaXRvci9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvY2hhaW4tcmVzdWx0LXZpZXcvY2hhaW4tcmVzdWx0LXZpZXcuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9mZWF0dXJlLWVkaXRvci9mZWF0dXJlLWVkaXRvci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2ZlYXR1cmUtc2V0LWVkaXRvci9mZWF0dXJlLXNldC1lZGl0b3IuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9mZWF0dXJlLXNldC12aWV3L2ZlYXR1cmUtc2V0LXZpZXcuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9sbi1oZWlnaHRzLWVkaXRvci9sbi1oZWlnaHRzLWVkaXRvci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL29wZXJhdGlvbi1zb3VyY2UtZWRpdG9yL29wZXJhdGlvbi1zb3VyY2UtZWRpdG9yLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvc2ltcGxlLXRyZWUvc2ltcGxlLXRyZWUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9zbmFwc2hvdC1lZGl0b3Ivc25hcHNob3QtZWRpdG9yLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvc3RlcHMtbWFwL3N0ZXBzLW1hcC5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvZ3ZlLWFwaS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvc2V0dGluZ3Muc2VydmljZSc7XHJcblxyXG4iXX0=