@mintplayer/ng-spark 22.29.0 → 22.31.0

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 (103) hide show
  1. package/README.md +3 -3
  2. package/auth/README.md +216 -0
  3. package/fesm2022/mintplayer-ng-spark-auth-account.mjs +2023 -0
  4. package/fesm2022/mintplayer-ng-spark-auth-account.mjs.map +1 -0
  5. package/fesm2022/mintplayer-ng-spark-auth-auth-bar.mjs +96 -0
  6. package/fesm2022/mintplayer-ng-spark-auth-auth-bar.mjs.map +1 -0
  7. package/fesm2022/mintplayer-ng-spark-auth-confirm-email.mjs +200 -0
  8. package/fesm2022/mintplayer-ng-spark-auth-confirm-email.mjs.map +1 -0
  9. package/fesm2022/mintplayer-ng-spark-auth-core.mjs +452 -0
  10. package/fesm2022/mintplayer-ng-spark-auth-core.mjs.map +1 -0
  11. package/fesm2022/mintplayer-ng-spark-auth-external-login.mjs +201 -0
  12. package/fesm2022/mintplayer-ng-spark-auth-external-login.mjs.map +1 -0
  13. package/fesm2022/mintplayer-ng-spark-auth-forgot-password.mjs +196 -0
  14. package/fesm2022/mintplayer-ng-spark-auth-forgot-password.mjs.map +1 -0
  15. package/fesm2022/mintplayer-ng-spark-auth-guards.mjs +16 -0
  16. package/fesm2022/mintplayer-ng-spark-auth-guards.mjs.map +1 -0
  17. package/fesm2022/mintplayer-ng-spark-auth-interceptors.mjs +18 -0
  18. package/fesm2022/mintplayer-ng-spark-auth-interceptors.mjs.map +1 -0
  19. package/fesm2022/mintplayer-ng-spark-auth-login.mjs +282 -0
  20. package/fesm2022/mintplayer-ng-spark-auth-login.mjs.map +1 -0
  21. package/fesm2022/mintplayer-ng-spark-auth-models.mjs +114 -0
  22. package/fesm2022/mintplayer-ng-spark-auth-models.mjs.map +1 -0
  23. package/fesm2022/mintplayer-ng-spark-auth-pipes.mjs +43 -0
  24. package/fesm2022/mintplayer-ng-spark-auth-pipes.mjs.map +1 -0
  25. package/fesm2022/mintplayer-ng-spark-auth-register.mjs +216 -0
  26. package/fesm2022/mintplayer-ng-spark-auth-register.mjs.map +1 -0
  27. package/fesm2022/mintplayer-ng-spark-auth-reset-password.mjs +223 -0
  28. package/fesm2022/mintplayer-ng-spark-auth-reset-password.mjs.map +1 -0
  29. package/fesm2022/mintplayer-ng-spark-auth-routes.mjs +194 -0
  30. package/fesm2022/mintplayer-ng-spark-auth-routes.mjs.map +1 -0
  31. package/fesm2022/mintplayer-ng-spark-auth-sign-in.mjs +210 -0
  32. package/fesm2022/mintplayer-ng-spark-auth-sign-in.mjs.map +1 -0
  33. package/fesm2022/mintplayer-ng-spark-auth-two-factor.mjs +218 -0
  34. package/fesm2022/mintplayer-ng-spark-auth-two-factor.mjs.map +1 -0
  35. package/fesm2022/mintplayer-ng-spark-auth.mjs +48 -0
  36. package/fesm2022/mintplayer-ng-spark-auth.mjs.map +1 -0
  37. package/fesm2022/mintplayer-ng-spark-client-operations.mjs +368 -2
  38. package/fesm2022/mintplayer-ng-spark-client-operations.mjs.map +1 -1
  39. package/fesm2022/mintplayer-ng-spark-grid.mjs +22 -9
  40. package/fesm2022/mintplayer-ng-spark-grid.mjs.map +1 -1
  41. package/fesm2022/mintplayer-ng-spark-identity-provider-connected-applications.mjs +389 -0
  42. package/fesm2022/mintplayer-ng-spark-identity-provider-connected-applications.mjs.map +1 -0
  43. package/fesm2022/mintplayer-ng-spark-identity-provider-core.mjs +204 -0
  44. package/fesm2022/mintplayer-ng-spark-identity-provider-core.mjs.map +1 -0
  45. package/fesm2022/mintplayer-ng-spark-identity-provider-developers.mjs +486 -0
  46. package/fesm2022/mintplayer-ng-spark-identity-provider-developers.mjs.map +1 -0
  47. package/fesm2022/mintplayer-ng-spark-identity-provider-management.mjs +350 -0
  48. package/fesm2022/mintplayer-ng-spark-identity-provider-management.mjs.map +1 -0
  49. package/fesm2022/mintplayer-ng-spark-identity-provider.mjs +66 -0
  50. package/fesm2022/mintplayer-ng-spark-identity-provider.mjs.map +1 -0
  51. package/fesm2022/mintplayer-ng-spark-models.mjs +2 -1
  52. package/fesm2022/mintplayer-ng-spark-models.mjs.map +1 -1
  53. package/fesm2022/mintplayer-ng-spark-po-detail.mjs +13 -3
  54. package/fesm2022/mintplayer-ng-spark-po-detail.mjs.map +1 -1
  55. package/fesm2022/mintplayer-ng-spark-po-form.mjs +6 -3
  56. package/fesm2022/mintplayer-ng-spark-po-form.mjs.map +1 -1
  57. package/fesm2022/mintplayer-ng-spark-pwa.mjs +162 -0
  58. package/fesm2022/mintplayer-ng-spark-pwa.mjs.map +1 -0
  59. package/fesm2022/mintplayer-ng-spark-query-list.mjs +5 -2
  60. package/fesm2022/mintplayer-ng-spark-query-list.mjs.map +1 -1
  61. package/fesm2022/mintplayer-ng-spark-renderers.mjs +109 -4
  62. package/fesm2022/mintplayer-ng-spark-renderers.mjs.map +1 -1
  63. package/fesm2022/mintplayer-ng-spark-retry-action-modal.mjs +36 -6
  64. package/fesm2022/mintplayer-ng-spark-retry-action-modal.mjs.map +1 -1
  65. package/fesm2022/mintplayer-ng-spark-services.mjs +48 -6
  66. package/fesm2022/mintplayer-ng-spark-services.mjs.map +1 -1
  67. package/fesm2022/mintplayer-ng-spark-shell.mjs.map +1 -1
  68. package/fesm2022/mintplayer-ng-spark.mjs.map +1 -1
  69. package/package.json +101 -3
  70. package/types/mintplayer-ng-spark-auth-account.d.ts +255 -0
  71. package/types/mintplayer-ng-spark-auth-auth-bar.d.ts +22 -0
  72. package/types/mintplayer-ng-spark-auth-confirm-email.d.ts +21 -0
  73. package/types/mintplayer-ng-spark-auth-core.d.ts +197 -0
  74. package/types/mintplayer-ng-spark-auth-external-login.d.ts +132 -0
  75. package/types/mintplayer-ng-spark-auth-forgot-password.d.ts +18 -0
  76. package/types/mintplayer-ng-spark-auth-guards.d.ts +15 -0
  77. package/types/mintplayer-ng-spark-auth-interceptors.d.ts +2 -0
  78. package/types/mintplayer-ng-spark-auth-login.d.ts +46 -0
  79. package/types/mintplayer-ng-spark-auth-models.d.ts +489 -0
  80. package/types/mintplayer-ng-spark-auth-pipes.d.ts +8 -0
  81. package/types/mintplayer-ng-spark-auth-register.d.ts +21 -0
  82. package/types/mintplayer-ng-spark-auth-reset-password.d.ts +25 -0
  83. package/types/mintplayer-ng-spark-auth-routes.d.ts +154 -0
  84. package/types/mintplayer-ng-spark-auth-sign-in.d.ts +84 -0
  85. package/types/mintplayer-ng-spark-auth-two-factor.d.ts +23 -0
  86. package/types/mintplayer-ng-spark-auth.d.ts +24 -0
  87. package/types/mintplayer-ng-spark-client-operations.d.ts +148 -3
  88. package/types/mintplayer-ng-spark-grid.d.ts +19 -1
  89. package/types/mintplayer-ng-spark-identity-provider-connected-applications.d.ts +35 -0
  90. package/types/mintplayer-ng-spark-identity-provider-core.d.ts +144 -0
  91. package/types/mintplayer-ng-spark-identity-provider-developers.d.ts +55 -0
  92. package/types/mintplayer-ng-spark-identity-provider-management.d.ts +33 -0
  93. package/types/mintplayer-ng-spark-identity-provider.d.ts +64 -0
  94. package/types/mintplayer-ng-spark-models.d.ts +28 -0
  95. package/types/mintplayer-ng-spark-po-detail.d.ts +8 -0
  96. package/types/mintplayer-ng-spark-po-form.d.ts +2 -0
  97. package/types/mintplayer-ng-spark-pwa.d.ts +89 -0
  98. package/types/mintplayer-ng-spark-query-list.d.ts +2 -0
  99. package/types/mintplayer-ng-spark-renderers.d.ts +47 -0
  100. package/types/mintplayer-ng-spark-retry-action-modal.d.ts +1 -0
  101. package/types/mintplayer-ng-spark-services.d.ts +37 -1
  102. package/types/mintplayer-ng-spark-shell.d.ts +2 -2
  103. package/types/mintplayer-ng-spark.d.ts +4 -4
@@ -0,0 +1,350 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, inject, signal } from "@angular/core";
3
+ import { RouterLink } from "@angular/router";
4
+ import { Color } from "@mintplayer/ng-bootstrap";
5
+ import { BsAlertComponent } from "@mintplayer/ng-bootstrap/alert";
6
+ import { BsBadgeComponent } from "@mintplayer/ng-bootstrap/badge";
7
+ import { BsCardComponent, BsCardHeaderComponent } from "@mintplayer/ng-bootstrap/card";
8
+ import { BsSpinnerComponent } from "@mintplayer/ng-bootstrap/spinner";
9
+ import { BsTableComponent } from "@mintplayer/ng-bootstrap/table";
10
+ import { SPARK_IDENTITY_PROVIDER_QUERIES, SparkIdentityProviderDatePipe, SparkIdentityProviderPortalService, SparkIdentityProviderTextPipe, identityProviderQueryLink, injectIdentityProviderText } from "@mintplayer/ng-spark/identity-provider/core";
11
+ const QUEUES = [
12
+ {
13
+ label: "query.DeveloperRequests",
14
+ alias: SPARK_IDENTITY_PROVIDER_QUERIES.developerRequests
15
+ },
16
+ {
17
+ label: "query.ScopeApprovals",
18
+ alias: SPARK_IDENTITY_PROVIDER_QUERIES.scopeApprovals
19
+ },
20
+ {
21
+ label: "query.GoLiveReviews",
22
+ alias: SPARK_IDENTITY_PROVIDER_QUERIES.goLiveReviews
23
+ },
24
+ {
25
+ label: "query.Applications",
26
+ alias: SPARK_IDENTITY_PROVIDER_QUERIES.applications
27
+ },
28
+ {
29
+ label: "query.Resources",
30
+ alias: SPARK_IDENTITY_PROVIDER_QUERIES.resources
31
+ },
32
+ {
33
+ label: "query.Grants",
34
+ alias: SPARK_IDENTITY_PROVIDER_QUERIES.grants
35
+ },
36
+ {
37
+ label: "query.AuditEvents",
38
+ alias: SPARK_IDENTITY_PROVIDER_QUERIES.auditEvents
39
+ }
40
+ ];
41
+ var SparkIdentityProviderManagementComponent = class SparkIdentityProviderManagementComponent {
42
+ text = injectIdentityProviderText();
43
+ portal = inject(SparkIdentityProviderPortalService);
44
+ colors = Color;
45
+ queues = QUEUES;
46
+ queryLink = identityProviderQueryLink;
47
+ loading = signal(true, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
48
+ busy = signal(false, ...ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []);
49
+ forbidden = signal(false, ...ngDevMode ? [{ debugName: "forbidden" }] : /* istanbul ignore next */ []);
50
+ keys = signal([], ...ngDevMode ? [{ debugName: "keys" }] : /* istanbul ignore next */ []);
51
+ changes = signal([], ...ngDevMode ? [{ debugName: "changes" }] : /* istanbul ignore next */ []);
52
+ error = signal("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
53
+ notice = signal("", ...ngDevMode ? [{ debugName: "notice" }] : /* istanbul ignore next */ []);
54
+ constructor() {
55
+ this.load();
56
+ }
57
+ async load() {
58
+ const result = await this.portal.signingKeys();
59
+ if (result.ok) this.keys.set(result.value);
60
+ else if (result.status === 403) this.forbidden.set(true);
61
+ else this.error.set(this.text("loadFailed"));
62
+ this.loading.set(false);
63
+ }
64
+ async rotate() {
65
+ if (!confirm(this.text("admin.confirmRotate"))) return;
66
+ this.busy.set(true);
67
+ this.error.set("");
68
+ this.notice.set("");
69
+ const result = await this.portal.rotateSigningKeys();
70
+ if (result.ok) {
71
+ this.changes.set(result.value.changes ?? []);
72
+ this.notice.set(this.text("admin.rotated"));
73
+ await this.load();
74
+ } else if (result.status === 403) this.forbidden.set(true);
75
+ else this.error.set(this.text("admin.rotateFailed"));
76
+ this.busy.set(false);
77
+ }
78
+ stateColor(state) {
79
+ switch (state.toLowerCase()) {
80
+ case "active": return Color.success;
81
+ case "retired": return Color.secondary;
82
+ default: return Color.info;
83
+ }
84
+ }
85
+ static ɵfac = i0.ɵɵngDeclareFactory({
86
+ minVersion: "12.0.0",
87
+ version: "22.2.0",
88
+ ngImport: i0,
89
+ type: SparkIdentityProviderManagementComponent,
90
+ deps: [],
91
+ target: i0.ɵɵFactoryTarget.Component
92
+ });
93
+ static ɵcmp = i0.ɵɵngDeclareComponent({
94
+ minVersion: "17.0.0",
95
+ version: "22.2.0",
96
+ type: SparkIdentityProviderManagementComponent,
97
+ isStandalone: true,
98
+ selector: "spark-identity-provider-management",
99
+ ngImport: i0,
100
+ template: `
101
+ <div class="d-flex justify-content-center">
102
+ <bs-card style="width: 100%; max-width: 960px;">
103
+ <bs-card-header><h3 class="mb-0">{{ 'admin.title' | idp }}</h3></bs-card-header>
104
+ <div class="p-4">
105
+ @if (loading()) {
106
+ <div class="text-center"><bs-spinner /></div>
107
+ } @else if (forbidden()) {
108
+ <bs-alert [type]="colors.warning" class="d-block spark-idp-not-allowed">{{ 'admin.notAllowed' | idp }}</bs-alert>
109
+ } @else {
110
+ @if (notice()) {
111
+ <bs-alert [type]="colors.success" class="mb-3 d-block spark-idp-notice">{{ notice() }}</bs-alert>
112
+ }
113
+ @if (error()) {
114
+ <bs-alert [type]="colors.danger" class="mb-3 d-block spark-idp-error">{{ error() }}</bs-alert>
115
+ }
116
+
117
+ <h5>{{ 'admin.queues' | idp }}</h5>
118
+ <ul class="list-unstyled mb-4">
119
+ @for (queue of queues; track queue.alias) {
120
+ <li class="py-1"><a class="spark-idp-queue" [routerLink]="queryLink(queue.alias)">{{ queue.label | idp }}</a></li>
121
+ }
122
+ </ul>
123
+
124
+ <h5>{{ 'admin.keys' | idp }}</h5>
125
+ <p class="text-muted">{{ 'admin.keysHint' | idp }}</p>
126
+ @if (keys().length) {
127
+ <bs-table [isResponsive]="true">
128
+ <thead>
129
+ <tr>
130
+ <th>{{ 'admin.kid' | idp }}</th>
131
+ <th>{{ 'admin.algorithm' | idp }}</th>
132
+ <th>{{ 'admin.state' | idp }}</th>
133
+ <th>{{ 'admin.created' | idp }}</th>
134
+ <th>{{ 'admin.activated' | idp }}</th>
135
+ <th>{{ 'admin.retired' | idp }}</th>
136
+ </tr>
137
+ </thead>
138
+ <tbody>
139
+ @for (key of keys(); track key.kid) {
140
+ <tr class="spark-idp-key" [attr.data-state]="key.state">
141
+ <td class="font-monospace text-break">{{ key.kid }}</td>
142
+ <td>{{ key.algorithm }}</td>
143
+ <td><bs-badge [type]="stateColor(key.state)">{{ key.state }}</bs-badge></td>
144
+ <td>{{ key.createdAt | idpDate }}</td>
145
+ <td>{{ key.activatedAt | idpDate }}</td>
146
+ <td>{{ key.retiredAt | idpDate }}</td>
147
+ </tr>
148
+ }
149
+ </tbody>
150
+ </bs-table>
151
+ } @else {
152
+ <p class="text-muted spark-idp-no-keys">{{ 'admin.noKeys' | idp }}</p>
153
+ }
154
+ <button type="button" class="btn btn-outline-danger spark-idp-rotate" [disabled]="busy()" (click)="rotate()">
155
+ @if (busy()) { <bs-spinner class="me-1" /> }
156
+ {{ 'admin.rotate' | idp }}
157
+ </button>
158
+ @if (changes().length) {
159
+ <ul class="small text-muted mt-3 mb-0 spark-idp-rotation-changes">
160
+ @for (change of changes(); track $index) { <li>{{ change }}</li> }
161
+ </ul>
162
+ }
163
+ }
164
+ </div>
165
+ </bs-card>
166
+ </div>
167
+ `,
168
+ isInline: true,
169
+ dependencies: [
170
+ {
171
+ kind: "directive",
172
+ type: RouterLink,
173
+ selector: "[routerLink]",
174
+ inputs: [
175
+ "target",
176
+ "queryParams",
177
+ "fragment",
178
+ "queryParamsHandling",
179
+ "state",
180
+ "info",
181
+ "relativeTo",
182
+ "preserveFragment",
183
+ "skipLocationChange",
184
+ "replaceUrl",
185
+ "browserUrl",
186
+ "routerLink"
187
+ ]
188
+ },
189
+ {
190
+ kind: "component",
191
+ type: BsAlertComponent,
192
+ selector: "bs-alert",
193
+ inputs: [
194
+ "type",
195
+ "announce",
196
+ "isVisible"
197
+ ],
198
+ outputs: ["isVisibleChange", "afterOpenedOrClosed"]
199
+ },
200
+ {
201
+ kind: "component",
202
+ type: BsBadgeComponent,
203
+ selector: "bs-badge",
204
+ inputs: [
205
+ "type",
206
+ "unit",
207
+ "decorative"
208
+ ]
209
+ },
210
+ {
211
+ kind: "component",
212
+ type: BsCardComponent,
213
+ selector: "bs-card",
214
+ inputs: ["color", "outline"]
215
+ },
216
+ {
217
+ kind: "component",
218
+ type: BsCardHeaderComponent,
219
+ selector: "bs-card-header",
220
+ inputs: ["color", "navStyle"]
221
+ },
222
+ {
223
+ kind: "component",
224
+ type: BsSpinnerComponent,
225
+ selector: "bs-spinner",
226
+ inputs: ["type", "color"]
227
+ },
228
+ {
229
+ kind: "component",
230
+ type: BsTableComponent,
231
+ selector: "bs-table",
232
+ inputs: [
233
+ "isResponsive",
234
+ "striped",
235
+ "hover",
236
+ "border",
237
+ "ariaRowCount"
238
+ ]
239
+ },
240
+ {
241
+ kind: "pipe",
242
+ type: SparkIdentityProviderTextPipe,
243
+ name: "idp"
244
+ },
245
+ {
246
+ kind: "pipe",
247
+ type: SparkIdentityProviderDatePipe,
248
+ name: "idpDate"
249
+ }
250
+ ],
251
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
252
+ });
253
+ };
254
+ i0.ɵɵngDeclareClassMetadata({
255
+ minVersion: "12.0.0",
256
+ version: "22.2.0",
257
+ ngImport: i0,
258
+ type: SparkIdentityProviderManagementComponent,
259
+ decorators: [{
260
+ type: Component,
261
+ args: [{
262
+ selector: "spark-identity-provider-management",
263
+ standalone: true,
264
+ changeDetection: ChangeDetectionStrategy.OnPush,
265
+ imports: [
266
+ RouterLink,
267
+ BsAlertComponent,
268
+ BsBadgeComponent,
269
+ BsCardComponent,
270
+ BsCardHeaderComponent,
271
+ BsSpinnerComponent,
272
+ BsTableComponent,
273
+ SparkIdentityProviderTextPipe,
274
+ SparkIdentityProviderDatePipe
275
+ ],
276
+ template: `
277
+ <div class="d-flex justify-content-center">
278
+ <bs-card style="width: 100%; max-width: 960px;">
279
+ <bs-card-header><h3 class="mb-0">{{ 'admin.title' | idp }}</h3></bs-card-header>
280
+ <div class="p-4">
281
+ @if (loading()) {
282
+ <div class="text-center"><bs-spinner /></div>
283
+ } @else if (forbidden()) {
284
+ <bs-alert [type]="colors.warning" class="d-block spark-idp-not-allowed">{{ 'admin.notAllowed' | idp }}</bs-alert>
285
+ } @else {
286
+ @if (notice()) {
287
+ <bs-alert [type]="colors.success" class="mb-3 d-block spark-idp-notice">{{ notice() }}</bs-alert>
288
+ }
289
+ @if (error()) {
290
+ <bs-alert [type]="colors.danger" class="mb-3 d-block spark-idp-error">{{ error() }}</bs-alert>
291
+ }
292
+
293
+ <h5>{{ 'admin.queues' | idp }}</h5>
294
+ <ul class="list-unstyled mb-4">
295
+ @for (queue of queues; track queue.alias) {
296
+ <li class="py-1"><a class="spark-idp-queue" [routerLink]="queryLink(queue.alias)">{{ queue.label | idp }}</a></li>
297
+ }
298
+ </ul>
299
+
300
+ <h5>{{ 'admin.keys' | idp }}</h5>
301
+ <p class="text-muted">{{ 'admin.keysHint' | idp }}</p>
302
+ @if (keys().length) {
303
+ <bs-table [isResponsive]="true">
304
+ <thead>
305
+ <tr>
306
+ <th>{{ 'admin.kid' | idp }}</th>
307
+ <th>{{ 'admin.algorithm' | idp }}</th>
308
+ <th>{{ 'admin.state' | idp }}</th>
309
+ <th>{{ 'admin.created' | idp }}</th>
310
+ <th>{{ 'admin.activated' | idp }}</th>
311
+ <th>{{ 'admin.retired' | idp }}</th>
312
+ </tr>
313
+ </thead>
314
+ <tbody>
315
+ @for (key of keys(); track key.kid) {
316
+ <tr class="spark-idp-key" [attr.data-state]="key.state">
317
+ <td class="font-monospace text-break">{{ key.kid }}</td>
318
+ <td>{{ key.algorithm }}</td>
319
+ <td><bs-badge [type]="stateColor(key.state)">{{ key.state }}</bs-badge></td>
320
+ <td>{{ key.createdAt | idpDate }}</td>
321
+ <td>{{ key.activatedAt | idpDate }}</td>
322
+ <td>{{ key.retiredAt | idpDate }}</td>
323
+ </tr>
324
+ }
325
+ </tbody>
326
+ </bs-table>
327
+ } @else {
328
+ <p class="text-muted spark-idp-no-keys">{{ 'admin.noKeys' | idp }}</p>
329
+ }
330
+ <button type="button" class="btn btn-outline-danger spark-idp-rotate" [disabled]="busy()" (click)="rotate()">
331
+ @if (busy()) { <bs-spinner class="me-1" /> }
332
+ {{ 'admin.rotate' | idp }}
333
+ </button>
334
+ @if (changes().length) {
335
+ <ul class="small text-muted mt-3 mb-0 spark-idp-rotation-changes">
336
+ @for (change of changes(); track $index) { <li>{{ change }}</li> }
337
+ </ul>
338
+ }
339
+ }
340
+ </div>
341
+ </bs-card>
342
+ </div>
343
+ `
344
+ }]
345
+ }],
346
+ ctorParameters: () => []
347
+ });
348
+ export { SparkIdentityProviderManagementComponent };
349
+
350
+ //# sourceMappingURL=mintplayer-ng-spark-identity-provider-management.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-spark-identity-provider-management.mjs","names":[],"sources":["../../identity-provider/management/src/spark-identity-provider-management.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsAlertComponent } from '@mintplayer/ng-bootstrap/alert';\nimport { BsBadgeComponent } from '@mintplayer/ng-bootstrap/badge';\nimport { BsCardComponent, BsCardHeaderComponent } from '@mintplayer/ng-bootstrap/card';\nimport { BsSpinnerComponent } from '@mintplayer/ng-bootstrap/spinner';\nimport { BsTableComponent } from '@mintplayer/ng-bootstrap/table';\nimport {\n SPARK_IDENTITY_PROVIDER_QUERIES,\n SparkIdentityProviderDatePipe,\n SparkIdentityProviderPortalService,\n SparkIdentityProviderTextPipe,\n SparkSigningKey,\n identityProviderQueryLink,\n injectIdentityProviderText,\n} from '@mintplayer/ng-spark/identity-provider/core';\n\n/** The library's queues and records, in the order an administrator works through them. */\nconst QUEUES: { label: string; alias: string }[] = [\n { label: 'query.DeveloperRequests', alias: SPARK_IDENTITY_PROVIDER_QUERIES.developerRequests },\n { label: 'query.ScopeApprovals', alias: SPARK_IDENTITY_PROVIDER_QUERIES.scopeApprovals },\n { label: 'query.GoLiveReviews', alias: SPARK_IDENTITY_PROVIDER_QUERIES.goLiveReviews },\n { label: 'query.Applications', alias: SPARK_IDENTITY_PROVIDER_QUERIES.applications },\n { label: 'query.Resources', alias: SPARK_IDENTITY_PROVIDER_QUERIES.resources },\n { label: 'query.Grants', alias: SPARK_IDENTITY_PROVIDER_QUERIES.grants },\n { label: 'query.AuditEvents', alias: SPARK_IDENTITY_PROVIDER_QUERIES.auditEvents },\n];\n\n/**\n * The identity provider's management page (`identity-provider/admin`, PRD D9), for its\n * administrators (`ManageAll/IdentityProvider`): the signing keys with a rotate-now action, and links\n * to the library's queues (developer requests, scope approvals, go-live reviews) and records (grants,\n * the audit trail) in the generic query page. The server answers 403 to anyone else, and the page\n * then says so instead of rendering an empty administration screen.\n */\n@Component({\n selector: 'spark-identity-provider-management',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n RouterLink, BsAlertComponent, BsBadgeComponent, BsCardComponent, BsCardHeaderComponent, BsSpinnerComponent,\n BsTableComponent, SparkIdentityProviderTextPipe, SparkIdentityProviderDatePipe,\n ],\n template: `\n <div class=\"d-flex justify-content-center\">\n <bs-card style=\"width: 100%; max-width: 960px;\">\n <bs-card-header><h3 class=\"mb-0\">{{ 'admin.title' | idp }}</h3></bs-card-header>\n <div class=\"p-4\">\n @if (loading()) {\n <div class=\"text-center\"><bs-spinner /></div>\n } @else if (forbidden()) {\n <bs-alert [type]=\"colors.warning\" class=\"d-block spark-idp-not-allowed\">{{ 'admin.notAllowed' | idp }}</bs-alert>\n } @else {\n @if (notice()) {\n <bs-alert [type]=\"colors.success\" class=\"mb-3 d-block spark-idp-notice\">{{ notice() }}</bs-alert>\n }\n @if (error()) {\n <bs-alert [type]=\"colors.danger\" class=\"mb-3 d-block spark-idp-error\">{{ error() }}</bs-alert>\n }\n\n <h5>{{ 'admin.queues' | idp }}</h5>\n <ul class=\"list-unstyled mb-4\">\n @for (queue of queues; track queue.alias) {\n <li class=\"py-1\"><a class=\"spark-idp-queue\" [routerLink]=\"queryLink(queue.alias)\">{{ queue.label | idp }}</a></li>\n }\n </ul>\n\n <h5>{{ 'admin.keys' | idp }}</h5>\n <p class=\"text-muted\">{{ 'admin.keysHint' | idp }}</p>\n @if (keys().length) {\n <bs-table [isResponsive]=\"true\">\n <thead>\n <tr>\n <th>{{ 'admin.kid' | idp }}</th>\n <th>{{ 'admin.algorithm' | idp }}</th>\n <th>{{ 'admin.state' | idp }}</th>\n <th>{{ 'admin.created' | idp }}</th>\n <th>{{ 'admin.activated' | idp }}</th>\n <th>{{ 'admin.retired' | idp }}</th>\n </tr>\n </thead>\n <tbody>\n @for (key of keys(); track key.kid) {\n <tr class=\"spark-idp-key\" [attr.data-state]=\"key.state\">\n <td class=\"font-monospace text-break\">{{ key.kid }}</td>\n <td>{{ key.algorithm }}</td>\n <td><bs-badge [type]=\"stateColor(key.state)\">{{ key.state }}</bs-badge></td>\n <td>{{ key.createdAt | idpDate }}</td>\n <td>{{ key.activatedAt | idpDate }}</td>\n <td>{{ key.retiredAt | idpDate }}</td>\n </tr>\n }\n </tbody>\n </bs-table>\n } @else {\n <p class=\"text-muted spark-idp-no-keys\">{{ 'admin.noKeys' | idp }}</p>\n }\n <button type=\"button\" class=\"btn btn-outline-danger spark-idp-rotate\" [disabled]=\"busy()\" (click)=\"rotate()\">\n @if (busy()) { <bs-spinner class=\"me-1\" /> }\n {{ 'admin.rotate' | idp }}\n </button>\n @if (changes().length) {\n <ul class=\"small text-muted mt-3 mb-0 spark-idp-rotation-changes\">\n @for (change of changes(); track $index) { <li>{{ change }}</li> }\n </ul>\n }\n }\n </div>\n </bs-card>\n </div>\n `,\n})\nexport class SparkIdentityProviderManagementComponent {\n private readonly text = injectIdentityProviderText();\n private readonly portal = inject(SparkIdentityProviderPortalService);\n protected readonly colors = Color;\n protected readonly queues = QUEUES;\n protected readonly queryLink = identityProviderQueryLink;\n\n readonly loading = signal(true);\n readonly busy = signal(false);\n readonly forbidden = signal(false);\n readonly keys = signal<SparkSigningKey[]>([]);\n readonly changes = signal<string[]>([]);\n readonly error = signal('');\n readonly notice = signal('');\n\n constructor() {\n void this.load();\n }\n\n async load(): Promise<void> {\n const result = await this.portal.signingKeys();\n if (result.ok) {\n this.keys.set(result.value);\n } else if (result.status === 403) {\n this.forbidden.set(true);\n } else {\n this.error.set(this.text('loadFailed'));\n }\n this.loading.set(false);\n }\n\n async rotate(): Promise<void> {\n if (!confirm(this.text('admin.confirmRotate'))) return;\n this.busy.set(true);\n this.error.set('');\n this.notice.set('');\n const result = await this.portal.rotateSigningKeys();\n if (result.ok) {\n this.changes.set(result.value.changes ?? []);\n this.notice.set(this.text('admin.rotated'));\n await this.load();\n } else if (result.status === 403) {\n this.forbidden.set(true);\n } else {\n this.error.set(this.text('admin.rotateFailed'));\n }\n this.busy.set(false);\n }\n\n protected stateColor(state: string): Color {\n switch (state.toLowerCase()) {\n case 'active': return Color.success;\n case 'retired': return Color.secondary;\n default: return Color.info;\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { sparkAuthGuard } from "@mintplayer/ng-spark/auth/guards";
2
+ export * from "@mintplayer/ng-spark/identity-provider/core";
3
+ function entryPath(entry, defaultPath) {
4
+ if (entry === void 0) return defaultPath;
5
+ return typeof entry === "string" ? entry : entry.path;
6
+ }
7
+ function child(entry, path, loader, guard) {
8
+ const component = typeof entry === "object" && entry.component ? entry.component : void 0;
9
+ return {
10
+ path,
11
+ loadComponent: component ? () => Promise.resolve(component) : loader,
12
+ ...guard.length ? { canActivate: guard } : {}
13
+ };
14
+ }
15
+ function withIdentityProvider(...features) {
16
+ const children = [];
17
+ const paths = {};
18
+ const accountLinks = [];
19
+ for (const feature of features) {
20
+ children.push(...feature.children);
21
+ Object.assign(paths, feature.paths);
22
+ if (feature.accountLinks) accountLinks.push(...feature.accountLinks);
23
+ }
24
+ return {
25
+ children,
26
+ paths,
27
+ accountLinks
28
+ };
29
+ }
30
+ function withConnectedApplications(options) {
31
+ const guard = options?.canActivate ?? [sparkAuthGuard];
32
+ const path = entryPath(options?.connectedApplications, "account/applications");
33
+ return {
34
+ paths: { connectedApplications: "/" + path },
35
+ accountLinks: [{
36
+ key: "connectedApplications",
37
+ path: "/" + path,
38
+ label: {
39
+ en: "Connected applications",
40
+ fr: "Applications connectées",
41
+ nl: "Verbonden applicaties"
42
+ }
43
+ }],
44
+ children: [child(options?.connectedApplications, path, () => import("@mintplayer/ng-spark/identity-provider/connected-applications").then((m) => m.SparkConnectedApplicationsComponent), guard)]
45
+ };
46
+ }
47
+ function withDeveloperRoutes(options) {
48
+ const guard = options?.canActivate ?? [sparkAuthGuard];
49
+ const developers = entryPath(options?.developers, "developers");
50
+ const invitation = entryPath(options?.invitation, "developers/invitations/:token");
51
+ return {
52
+ paths: { developers: "/" + developers },
53
+ children: [child(options?.developers, developers, () => import("@mintplayer/ng-spark/identity-provider/developers").then((m) => m.SparkDevelopersComponent), guard), child(options?.invitation, invitation, () => import("@mintplayer/ng-spark/identity-provider/developers").then((m) => m.SparkAcceptInvitationComponent), guard)]
54
+ };
55
+ }
56
+ function withManagementRoutes(options) {
57
+ const guard = options?.canActivate ?? [sparkAuthGuard];
58
+ const path = entryPath(options?.identityProviderManagement, "identity-provider/admin");
59
+ return {
60
+ paths: { identityProviderManagement: "/" + path },
61
+ children: [child(options?.identityProviderManagement, path, () => import("@mintplayer/ng-spark/identity-provider/management").then((m) => m.SparkIdentityProviderManagementComponent), guard)]
62
+ };
63
+ }
64
+ export { withConnectedApplications, withDeveloperRoutes, withIdentityProvider, withManagementRoutes };
65
+
66
+ //# sourceMappingURL=mintplayer-ng-spark-identity-provider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-spark-identity-provider.mjs","names":[],"sources":["../../identity-provider/src/identity-provider-routes.ts"],"sourcesContent":["import type { CanActivateFn } from '@angular/router';\nimport { sparkAuthGuard } from '@mintplayer/ng-spark/auth/guards';\nimport type { SparkAuthRouteEntry, SparkAuthRoutePaths, SparkAccountOverviewLink } from '@mintplayer/ng-spark/auth/models';\nimport type { SparkAuthRoutesFeature } from '@mintplayer/ng-spark/auth/routes';\n\ntype Child = SparkAuthRoutesFeature['children'][number];\ntype Loader = () => Promise<any>;\n\n/**\n * One group of identity-provider pages, passed to {@link withIdentityProvider}. Produced only by\n * `withConnectedApplications()`, `withDeveloperRoutes()` and `withManagementRoutes()`.\n */\nexport interface SparkIdentityProviderRoutesFeature {\n readonly children: Child[];\n readonly paths: SparkAuthRoutePaths;\n readonly accountLinks?: SparkAccountOverviewLink[];\n}\n\n/** Every feature's guard option: defaults to `[sparkAuthGuard]`; `[]` under an already guarded parent. */\nexport interface SparkIdentityProviderGuardOptions {\n canActivate?: CanActivateFn[];\n}\n\nfunction entryPath(entry: SparkAuthRouteEntry | undefined, defaultPath: string): string {\n if (entry === undefined) return defaultPath;\n return typeof entry === 'string' ? entry : entry.path;\n}\n\n/** An explicitly supplied component wins over the library's lazy import, as in `sparkAuthRoutes()`. */\nfunction child(entry: SparkAuthRouteEntry | undefined, path: string, loader: Loader, guard: CanActivateFn[]): Child {\n const component = typeof entry === 'object' && entry.component ? entry.component : undefined;\n return {\n path,\n loadComponent: component ? () => Promise.resolve(component) : loader,\n ...(guard.length ? { canActivate: guard } : {}),\n };\n}\n\n/**\n * The identity provider's SPA pages (`docs/identity_provider_platform_PRD.md` D7), as one\n * `sparkAuthRoutes()` feature:\n *\n * ```ts\n * sparkAuthRoutes(\n * withLocalLogin(), withAccount(),\n * withIdentityProvider(withConnectedApplications(), withDeveloperRoutes(), withManagementRoutes()),\n * )\n * ```\n *\n * The sub-features merge into one feature, and each page keeps its own `import()` (its own secondary\n * entry point), so a page nobody opts into is never bundled. The pages popups show (`/connect/*`:\n * sign-in, consent, device, logout, error) are server-rendered and not part of this.\n *\n * Every path has a literal first segment, so the group neither shadows `sparkRoutes()` nor is shadowed\n * by it. Apps and resources are edited in the generic `po/:type` screens (PRD Q1 = A).\n */\nexport function withIdentityProvider(...features: SparkIdentityProviderRoutesFeature[]): SparkAuthRoutesFeature {\n const children: Child[] = [];\n const paths: SparkAuthRoutePaths = {};\n const accountLinks: SparkAccountOverviewLink[] = [];\n for (const feature of features) {\n children.push(...feature.children);\n Object.assign(paths, feature.paths);\n if (feature.accountLinks) accountLinks.push(...feature.accountLinks);\n }\n return { children, paths, accountLinks };\n}\n\n/**\n * Mounts the connected-applications page (default `account/applications`, PRD D6): the applications\n * the user granted access to, with whole-grant and per-scope withdrawal. Sets\n * `SPARK_AUTH_ROUTE_PATHS.connectedApplications` and adds a link to the account overview.\n */\nexport function withConnectedApplications(\n options?: SparkIdentityProviderGuardOptions & { connectedApplications?: SparkAuthRouteEntry },\n): SparkIdentityProviderRoutesFeature {\n const guard = options?.canActivate ?? [sparkAuthGuard];\n const path = entryPath(options?.connectedApplications, 'account/applications');\n return {\n paths: { connectedApplications: '/' + path },\n accountLinks: [{ key: 'connectedApplications', path: '/' + path, label: { en: 'Connected applications', fr: 'Applications connectées', nl: 'Verbonden applicaties' } }],\n children: [\n child(options?.connectedApplications, path,\n () => import('@mintplayer/ng-spark/identity-provider/connected-applications').then(m => m.SparkConnectedApplicationsComponent),\n guard),\n ],\n };\n}\n\n/**\n * Mounts the developer portal (PRD D2/D3): `developers` (status, terms, request, registration token)\n * and `developers/invitations/:token?app=<applicationId>` (accept a team invitation; the mailed link's\n * target, which the server builds from this default path). Both need a signed-in user; the guard sends\n * anyone else to sign in and back.\n */\nexport function withDeveloperRoutes(\n options?: SparkIdentityProviderGuardOptions & { developers?: SparkAuthRouteEntry; invitation?: SparkAuthRouteEntry },\n): SparkIdentityProviderRoutesFeature {\n const guard = options?.canActivate ?? [sparkAuthGuard];\n const developers = entryPath(options?.developers, 'developers');\n const invitation = entryPath(options?.invitation, 'developers/invitations/:token');\n return {\n paths: { developers: '/' + developers },\n children: [\n child(options?.developers, developers,\n () => import('@mintplayer/ng-spark/identity-provider/developers').then(m => m.SparkDevelopersComponent),\n guard),\n child(options?.invitation, invitation,\n () => import('@mintplayer/ng-spark/identity-provider/developers').then(m => m.SparkAcceptInvitationComponent),\n guard),\n ],\n };\n}\n\n/**\n * Mounts the management page (default `identity-provider/admin`, PRD D9): signing keys with\n * rotate-now, and links to the queues (developer requests, scope approvals, go-live reviews) and\n * records (applications, resources, grants, audit trail). Mount it for everyone signed in: the server\n * decides who is an administrator, and the page tells anyone else they may not see it.\n */\nexport function withManagementRoutes(\n options?: SparkIdentityProviderGuardOptions & { identityProviderManagement?: SparkAuthRouteEntry },\n): SparkIdentityProviderRoutesFeature {\n const guard = options?.canActivate ?? [sparkAuthGuard];\n const path = entryPath(options?.identityProviderManagement, 'identity-provider/admin');\n return {\n paths: { identityProviderManagement: '/' + path },\n children: [\n child(options?.identityProviderManagement, path,\n () => import('@mintplayer/ng-spark/identity-provider/management').then(m => m.SparkIdentityProviderManagementComponent),\n guard),\n ],\n };\n}\n"],"mappings":";;AAuBA,SAAS,UAAU,OAAwC,aAAmB;CAC5E,IAAI,UAAU,QAAW,OAAO;CAChC,OAAO,OAAO,UAAU,WAAW,QAAQ,MAAM;AACnD;AAGA,SAAS,MAAM,OAAwC,MAAc,QAAgB,OAAsB;CACzG,MAAM,YAAY,OAAO,UAAU,YAAY,MAAM,YAAY,MAAM,YAAY;CACnF,OAAO;EACL;EACA,eAAe,kBAAkB,QAAQ,QAAQ,SAAS,IAAI;EAC9D,GAAI,MAAM,SAAS,EAAE,aAAa,MAAK,IAAK,CAAA;CAC7C;AACH;AAoBA,SAAgB,qBAAqB,GAAG,UAA8C;CACpF,MAAM,WAAoB,CAAA;CAC1B,MAAM,QAA6B,CAAA;CACnC,MAAM,eAA2C,CAAA;CACjD,KAAK,MAAM,WAAW,UAAU;EAC9B,SAAS,KAAK,GAAG,QAAQ,QAAQ;EACjC,OAAO,OAAO,OAAO,QAAQ,KAAK;EAClC,IAAI,QAAQ,cAAc,aAAa,KAAK,GAAG,QAAQ,YAAY;CACrE;CACA,OAAO;EAAE;EAAU;EAAO;CAAY;AACxC;AAOA,SAAgB,0BACd,SAA6F;CAE7F,MAAM,QAAQ,SAAS,eAAe,CAAC,cAAc;CACrD,MAAM,OAAO,UAAU,SAAS,uBAAuB,sBAAsB;CAC7E,OAAO;EACL,OAAO,EAAE,uBAAuB,MAAM,KAAI;EAC1C,cAAc,CAAC;GAAE,KAAK;GAAyB,MAAM,MAAM;GAAM,OAAO;IAAE,IAAI;IAA0B,IAAI;IAA2B,IAAI;GAAuB;EAAE,CAAE;EACtK,UAAU,CACR,MAAM,SAAS,uBAAuB,YAC9B,OAAO,gEAAgE,CAAC,MAAK,MAAK,EAAE,mCAAmC,GAC7H,KAAK,CACR;CACF;AACH;AAQA,SAAgB,oBACd,SAAoH;CAEpH,MAAM,QAAQ,SAAS,eAAe,CAAC,cAAc;CACrD,MAAM,aAAa,UAAU,SAAS,YAAY,YAAY;CAC9D,MAAM,aAAa,UAAU,SAAS,YAAY,+BAA+B;CACjF,OAAO;EACL,OAAO,EAAE,YAAY,MAAM,WAAU;EACrC,UAAU,CACR,MAAM,SAAS,YAAY,kBACnB,OAAO,oDAAoD,CAAC,MAAK,MAAK,EAAE,wBAAwB,GACtG,KAAK,GACP,MAAM,SAAS,YAAY,kBACnB,OAAO,oDAAoD,CAAC,MAAK,MAAK,EAAE,8BAA8B,GAC5G,KAAK,CACR;CACF;AACH;AAQA,SAAgB,qBACd,SAAkG;CAElG,MAAM,QAAQ,SAAS,eAAe,CAAC,cAAc;CACrD,MAAM,OAAO,UAAU,SAAS,4BAA4B,yBAAyB;CACrF,OAAO;EACL,OAAO,EAAE,4BAA4B,MAAM,KAAI;EAC/C,UAAU,CACR,MAAM,SAAS,4BAA4B,YACnC,OAAO,oDAAoD,CAAC,MAAK,MAAK,EAAE,wCAAwC,GACtH,KAAK,CACR;CACF;AACH"}
@@ -227,6 +227,7 @@ var ELookupDisplayType;
227
227
  ELookupDisplayType[ELookupDisplayType["Dropdown"] = 0] = "Dropdown";
228
228
  ELookupDisplayType[ELookupDisplayType["Modal"] = 1] = "Modal";
229
229
  })(ELookupDisplayType || (ELookupDisplayType = {}));
230
+ const SPARK_RETRY_CANCEL = "Cancel";
230
231
  function comparableValue(attribute) {
231
232
  if (!attribute) return "\0absent";
232
233
  return JSON.stringify({
@@ -481,6 +482,6 @@ function toNumber(value) {
481
482
  const n = Number(value);
482
483
  return Number.isFinite(n) ? n : null;
483
484
  }
484
- export { AS_DETAIL_BREADCRUMBS_KEY, AS_DETAIL_METADATA_KEY, AS_DETAIL_ORIGINAL_DATES_KEY, AS_DETAIL_ROW_KEY, AS_DETAIL_SELF_BREADCRUMB_KEY, ELookupDisplayType, EReferenceDisplayType, SPARK_MAX_SELECTED_ITEMS, ShowedOn, applyOverlay, builtInAction, comparableFormValue, comparableValue, confirmationText, currentLanguage, defaultQueryActions, dictToNestedPo, evaluateRules, filterDetailActions, filterQueryActions, formValuesEqual, fromDateInput, fromDateInputValue, fromDateTimeLocalInput, hasShowedOnFlag, isDateDataType, isPersistentObject, isQueryRow, isReservedAsDetailKey, isShowedOnDetail, isShowedOnQuery, mergeRefreshValues, needsSelection, nestedPoToDict, nestedPoToDisplayRow, normalizeSubQuery, overlayFromResponse, parseSelectionRule, parseWireDate, resolveTranslation, resolvedBreadcrumb, rowMetadata, selectionModeFor, selfBreadcrumb, subQueriesOf, toDateInput, toDateInputValue, toDateTimeLocalInput, valueFor, wireDatesEqual };
485
+ export { AS_DETAIL_BREADCRUMBS_KEY, AS_DETAIL_METADATA_KEY, AS_DETAIL_ORIGINAL_DATES_KEY, AS_DETAIL_ROW_KEY, AS_DETAIL_SELF_BREADCRUMB_KEY, ELookupDisplayType, EReferenceDisplayType, SPARK_MAX_SELECTED_ITEMS, SPARK_RETRY_CANCEL, ShowedOn, applyOverlay, builtInAction, comparableFormValue, comparableValue, confirmationText, currentLanguage, defaultQueryActions, dictToNestedPo, evaluateRules, filterDetailActions, filterQueryActions, formValuesEqual, fromDateInput, fromDateInputValue, fromDateTimeLocalInput, hasShowedOnFlag, isDateDataType, isPersistentObject, isQueryRow, isReservedAsDetailKey, isShowedOnDetail, isShowedOnQuery, mergeRefreshValues, needsSelection, nestedPoToDict, nestedPoToDisplayRow, normalizeSubQuery, overlayFromResponse, parseSelectionRule, parseWireDate, resolveTranslation, resolvedBreadcrumb, rowMetadata, selectionModeFor, selfBreadcrumb, subQueriesOf, toDateInput, toDateInputValue, toDateTimeLocalInput, valueFor, wireDatesEqual };
485
486
 
486
487
  //# sourceMappingURL=mintplayer-ng-spark-models.mjs.map