@mintplayer/ng-spark 22.30.0 → 22.32.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 (84) hide show
  1. package/README.md +2 -2
  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 +294 -2
  38. package/fesm2022/mintplayer-ng-spark-client-operations.mjs.map +1 -1
  39. package/fesm2022/mintplayer-ng-spark-identity-provider-connected-applications.mjs +389 -0
  40. package/fesm2022/mintplayer-ng-spark-identity-provider-connected-applications.mjs.map +1 -0
  41. package/fesm2022/mintplayer-ng-spark-identity-provider-core.mjs +204 -0
  42. package/fesm2022/mintplayer-ng-spark-identity-provider-core.mjs.map +1 -0
  43. package/fesm2022/mintplayer-ng-spark-identity-provider-developers.mjs +486 -0
  44. package/fesm2022/mintplayer-ng-spark-identity-provider-developers.mjs.map +1 -0
  45. package/fesm2022/mintplayer-ng-spark-identity-provider-management.mjs +350 -0
  46. package/fesm2022/mintplayer-ng-spark-identity-provider-management.mjs.map +1 -0
  47. package/fesm2022/mintplayer-ng-spark-identity-provider.mjs +66 -0
  48. package/fesm2022/mintplayer-ng-spark-identity-provider.mjs.map +1 -0
  49. package/fesm2022/mintplayer-ng-spark-po-detail.mjs +9 -4
  50. package/fesm2022/mintplayer-ng-spark-po-detail.mjs.map +1 -1
  51. package/fesm2022/mintplayer-ng-spark-pwa.mjs +162 -0
  52. package/fesm2022/mintplayer-ng-spark-pwa.mjs.map +1 -0
  53. package/fesm2022/mintplayer-ng-spark-services.mjs +11 -1
  54. package/fesm2022/mintplayer-ng-spark-services.mjs.map +1 -1
  55. package/fesm2022/mintplayer-ng-spark-shell.mjs.map +1 -1
  56. package/fesm2022/mintplayer-ng-spark.mjs.map +1 -1
  57. package/package.json +99 -1
  58. package/types/mintplayer-ng-spark-auth-account.d.ts +255 -0
  59. package/types/mintplayer-ng-spark-auth-auth-bar.d.ts +22 -0
  60. package/types/mintplayer-ng-spark-auth-confirm-email.d.ts +21 -0
  61. package/types/mintplayer-ng-spark-auth-core.d.ts +197 -0
  62. package/types/mintplayer-ng-spark-auth-external-login.d.ts +132 -0
  63. package/types/mintplayer-ng-spark-auth-forgot-password.d.ts +18 -0
  64. package/types/mintplayer-ng-spark-auth-guards.d.ts +15 -0
  65. package/types/mintplayer-ng-spark-auth-interceptors.d.ts +2 -0
  66. package/types/mintplayer-ng-spark-auth-login.d.ts +46 -0
  67. package/types/mintplayer-ng-spark-auth-models.d.ts +489 -0
  68. package/types/mintplayer-ng-spark-auth-pipes.d.ts +8 -0
  69. package/types/mintplayer-ng-spark-auth-register.d.ts +21 -0
  70. package/types/mintplayer-ng-spark-auth-reset-password.d.ts +25 -0
  71. package/types/mintplayer-ng-spark-auth-routes.d.ts +154 -0
  72. package/types/mintplayer-ng-spark-auth-sign-in.d.ts +84 -0
  73. package/types/mintplayer-ng-spark-auth-two-factor.d.ts +23 -0
  74. package/types/mintplayer-ng-spark-auth.d.ts +24 -0
  75. package/types/mintplayer-ng-spark-client-operations.d.ts +78 -3
  76. package/types/mintplayer-ng-spark-identity-provider-connected-applications.d.ts +35 -0
  77. package/types/mintplayer-ng-spark-identity-provider-core.d.ts +144 -0
  78. package/types/mintplayer-ng-spark-identity-provider-developers.d.ts +55 -0
  79. package/types/mintplayer-ng-spark-identity-provider-management.d.ts +33 -0
  80. package/types/mintplayer-ng-spark-identity-provider.d.ts +64 -0
  81. package/types/mintplayer-ng-spark-pwa.d.ts +89 -0
  82. package/types/mintplayer-ng-spark-services.d.ts +10 -0
  83. package/types/mintplayer-ng-spark-shell.d.ts +2 -2
  84. package/types/mintplayer-ng-spark.d.ts +4 -4
@@ -0,0 +1,204 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Injectable, Pipe, inject } from "@angular/core";
3
+ import { HttpClient, HttpErrorResponse } from "@angular/common/http";
4
+ import { firstValueFrom } from "rxjs";
5
+ import { currentLanguage } from "@mintplayer/ng-spark/models";
6
+ import { SparkAuthTranslationService } from "@mintplayer/ng-spark/auth/core";
7
+ const SPARK_IDENTITY_PROVIDER_API = "/spark/identity-provider";
8
+ var SparkIdentityProviderPortalService = class SparkIdentityProviderPortalService {
9
+ http = inject(HttpClient);
10
+ connectedApplications() {
11
+ return this.call(this.http.get(`${SPARK_IDENTITY_PROVIDER_API}/applications`));
12
+ }
13
+ withdraw(request) {
14
+ const body = request.scopes?.length ? {
15
+ applicationId: request.applicationId,
16
+ scopes: request.scopes
17
+ } : { applicationId: request.applicationId };
18
+ return this.call(this.http.post(`${SPARK_IDENTITY_PROVIDER_API}/applications/withdraw`, body));
19
+ }
20
+ developerStatus() {
21
+ return this.call(this.http.get(`${SPARK_IDENTITY_PROVIDER_API}/developer`));
22
+ }
23
+ requestDeveloperStatus(termsVersion) {
24
+ return this.call(this.http.post(`${SPARK_IDENTITY_PROVIDER_API}/developer`, { termsVersion }));
25
+ }
26
+ issueRegistrationToken() {
27
+ return this.call(this.http.post(`${SPARK_IDENTITY_PROVIDER_API}/developer/registration-token`, {}));
28
+ }
29
+ acceptInvitation(applicationId, token) {
30
+ return this.call(this.http.post(`${SPARK_IDENTITY_PROVIDER_API}/invitations/accept`, {
31
+ applicationId,
32
+ token
33
+ }));
34
+ }
35
+ signingKeys() {
36
+ return this.call(this.http.get(`${SPARK_IDENTITY_PROVIDER_API}/admin/keys`));
37
+ }
38
+ rotateSigningKeys() {
39
+ return this.call(this.http.post(`${SPARK_IDENTITY_PROVIDER_API}/admin/keys/rotate`, {}));
40
+ }
41
+ async call(request) {
42
+ try {
43
+ return {
44
+ ok: true,
45
+ value: await firstValueFrom(request)
46
+ };
47
+ } catch (error) {
48
+ if (error instanceof HttpErrorResponse) return {
49
+ ok: false,
50
+ status: error.status,
51
+ problem: problemText(error.error)
52
+ };
53
+ return {
54
+ ok: false,
55
+ status: 0,
56
+ problem: null
57
+ };
58
+ }
59
+ }
60
+ static ɵfac = i0.ɵɵngDeclareFactory({
61
+ minVersion: "12.0.0",
62
+ version: "22.2.0",
63
+ ngImport: i0,
64
+ type: SparkIdentityProviderPortalService,
65
+ deps: [],
66
+ target: i0.ɵɵFactoryTarget.Injectable
67
+ });
68
+ static ɵprov = i0.ɵɵngDeclareInjectable({
69
+ minVersion: "12.0.0",
70
+ version: "22.2.0",
71
+ ngImport: i0,
72
+ type: SparkIdentityProviderPortalService,
73
+ providedIn: "root"
74
+ });
75
+ };
76
+ i0.ɵɵngDeclareClassMetadata({
77
+ minVersion: "12.0.0",
78
+ version: "22.2.0",
79
+ ngImport: i0,
80
+ type: SparkIdentityProviderPortalService,
81
+ decorators: [{
82
+ type: Injectable,
83
+ args: [{ providedIn: "root" }]
84
+ }]
85
+ });
86
+ function problemText(body) {
87
+ if (body && typeof body === "object") {
88
+ const problem = body;
89
+ if (typeof problem.detail === "string" && problem.detail) return problem.detail;
90
+ }
91
+ return null;
92
+ }
93
+ const PREFIX = "identityProvider.spa.";
94
+ function format(template, args) {
95
+ return args.length ? template.replace(/\{(\d+)\}/g, (match, index) => {
96
+ const arg = args[Number(index)];
97
+ return arg === void 0 || arg === null ? match : String(arg);
98
+ }) : template;
99
+ }
100
+ function injectIdentityProviderText() {
101
+ const translations = inject(SparkAuthTranslationService);
102
+ return (key, ...args) => format(translations.t(PREFIX + key), args);
103
+ }
104
+ var SparkIdentityProviderTextPipe = class SparkIdentityProviderTextPipe {
105
+ translations = inject(SparkAuthTranslationService);
106
+ transform(key, ...args) {
107
+ return format(this.translations.t(PREFIX + key), args);
108
+ }
109
+ static ɵfac = i0.ɵɵngDeclareFactory({
110
+ minVersion: "12.0.0",
111
+ version: "22.2.0",
112
+ ngImport: i0,
113
+ type: SparkIdentityProviderTextPipe,
114
+ deps: [],
115
+ target: i0.ɵɵFactoryTarget.Pipe
116
+ });
117
+ static ɵpipe = i0.ɵɵngDeclarePipe({
118
+ minVersion: "14.0.0",
119
+ version: "22.2.0",
120
+ ngImport: i0,
121
+ type: SparkIdentityProviderTextPipe,
122
+ isStandalone: true,
123
+ name: "idp",
124
+ pure: false
125
+ });
126
+ };
127
+ i0.ɵɵngDeclareClassMetadata({
128
+ minVersion: "12.0.0",
129
+ version: "22.2.0",
130
+ ngImport: i0,
131
+ type: SparkIdentityProviderTextPipe,
132
+ decorators: [{
133
+ type: Pipe,
134
+ args: [{
135
+ name: "idp",
136
+ pure: false,
137
+ standalone: true
138
+ }]
139
+ }]
140
+ });
141
+ function identityProviderDate(value) {
142
+ if (!value) return "";
143
+ const date = new Date(value);
144
+ if (Number.isNaN(date.getTime())) return value;
145
+ try {
146
+ return new Intl.DateTimeFormat(currentLanguage(), {
147
+ dateStyle: "medium",
148
+ timeStyle: "short"
149
+ }).format(date);
150
+ } catch {
151
+ return date.toLocaleString();
152
+ }
153
+ }
154
+ var SparkIdentityProviderDatePipe = class SparkIdentityProviderDatePipe {
155
+ transform(value) {
156
+ return identityProviderDate(value);
157
+ }
158
+ static ɵfac = i0.ɵɵngDeclareFactory({
159
+ minVersion: "12.0.0",
160
+ version: "22.2.0",
161
+ ngImport: i0,
162
+ type: SparkIdentityProviderDatePipe,
163
+ deps: [],
164
+ target: i0.ɵɵFactoryTarget.Pipe
165
+ });
166
+ static ɵpipe = i0.ɵɵngDeclarePipe({
167
+ minVersion: "14.0.0",
168
+ version: "22.2.0",
169
+ ngImport: i0,
170
+ type: SparkIdentityProviderDatePipe,
171
+ isStandalone: true,
172
+ name: "idpDate",
173
+ pure: false
174
+ });
175
+ };
176
+ i0.ɵɵngDeclareClassMetadata({
177
+ minVersion: "12.0.0",
178
+ version: "22.2.0",
179
+ ngImport: i0,
180
+ type: SparkIdentityProviderDatePipe,
181
+ decorators: [{
182
+ type: Pipe,
183
+ args: [{
184
+ name: "idpDate",
185
+ pure: false,
186
+ standalone: true
187
+ }]
188
+ }]
189
+ });
190
+ const SPARK_IDENTITY_PROVIDER_QUERIES = {
191
+ applications: "oidc-applications",
192
+ resources: "oidc-resources",
193
+ developerRequests: "oidc-developer-requests",
194
+ scopeApprovals: "oidc-scope-approvals",
195
+ goLiveReviews: "oidc-golive-reviews",
196
+ grants: "oidc-grants",
197
+ auditEvents: "oidc-audit-events"
198
+ };
199
+ function identityProviderQueryLink(alias) {
200
+ return ["/query", alias];
201
+ }
202
+ export { SPARK_IDENTITY_PROVIDER_API, SPARK_IDENTITY_PROVIDER_QUERIES, SparkIdentityProviderDatePipe, SparkIdentityProviderPortalService, SparkIdentityProviderTextPipe, identityProviderDate, identityProviderQueryLink, injectIdentityProviderText };
203
+
204
+ //# sourceMappingURL=mintplayer-ng-spark-identity-provider-core.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-spark-identity-provider-core.mjs","names":[],"sources":["../../identity-provider/core/src/identity-provider-portal.service.ts","../../identity-provider/core/src/text.ts","../../identity-provider/core/src/queries.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { firstValueFrom, type Observable } from 'rxjs';\nimport type {\n SparkConnectedApplication,\n SparkDeveloperStatus,\n SparkInvitationOutcome,\n SparkKeyRotation,\n SparkPortalResult,\n SparkRegistrationToken,\n SparkSigningKey,\n SparkWithdrawAccessRequest,\n} from './models';\n\n/** The portal API's prefix (`IdentityProviderPortalGroup.Prefix` on the server). */\nexport const SPARK_IDENTITY_PROVIDER_API = '/spark/identity-provider';\n\n/**\n * The identity provider's portal API for the SPA pages (PRD D7). Every call is for a signed-in user;\n * the POSTs require the antiforgery token, which Angular's XSRF support adds from the `XSRF-TOKEN`\n * cookie (`withSparkAuth()` configures it), so the calls are plain `HttpClient` requests.\n *\n * Calls never throw: each resolves to a {@link SparkPortalResult}, so a page branches on `ok` and on\n * the status (403 for a page the user may not see) instead of catching.\n */\n@Injectable({ providedIn: 'root' })\nexport class SparkIdentityProviderPortalService {\n private readonly http = inject(HttpClient);\n\n connectedApplications(): Promise<SparkPortalResult<SparkConnectedApplication[]>> {\n return this.call(this.http.get<SparkConnectedApplication[]>(`${SPARK_IDENTITY_PROVIDER_API}/applications`));\n }\n\n /** Withdraws the whole grant, or only `scopes` when given. Answers 204, or 409 when it could not. */\n withdraw(request: SparkWithdrawAccessRequest): Promise<SparkPortalResult<null>> {\n const body: SparkWithdrawAccessRequest = request.scopes?.length\n ? { applicationId: request.applicationId, scopes: request.scopes }\n : { applicationId: request.applicationId };\n return this.call(this.http.post<null>(`${SPARK_IDENTITY_PROVIDER_API}/applications/withdraw`, body));\n }\n\n developerStatus(): Promise<SparkPortalResult<SparkDeveloperStatus>> {\n return this.call(this.http.get<SparkDeveloperStatus>(`${SPARK_IDENTITY_PROVIDER_API}/developer`));\n }\n\n /** Accepts the terms version the page showed; the server refuses (409) a version that is no longer current. */\n requestDeveloperStatus(termsVersion: number): Promise<SparkPortalResult<SparkDeveloperStatus>> {\n return this.call(this.http.post<SparkDeveloperStatus>(`${SPARK_IDENTITY_PROVIDER_API}/developer`, { termsVersion }));\n }\n\n issueRegistrationToken(): Promise<SparkPortalResult<SparkRegistrationToken>> {\n return this.call(this.http.post<SparkRegistrationToken>(`${SPARK_IDENTITY_PROVIDER_API}/developer/registration-token`, {}));\n }\n\n acceptInvitation(applicationId: string, token: string): Promise<SparkPortalResult<SparkInvitationOutcome>> {\n return this.call(this.http.post<SparkInvitationOutcome>(`${SPARK_IDENTITY_PROVIDER_API}/invitations/accept`, { applicationId, token }));\n }\n\n signingKeys(): Promise<SparkPortalResult<SparkSigningKey[]>> {\n return this.call(this.http.get<SparkSigningKey[]>(`${SPARK_IDENTITY_PROVIDER_API}/admin/keys`));\n }\n\n rotateSigningKeys(): Promise<SparkPortalResult<SparkKeyRotation>> {\n return this.call(this.http.post<SparkKeyRotation>(`${SPARK_IDENTITY_PROVIDER_API}/admin/keys/rotate`, {}));\n }\n\n private async call<T>(request: Observable<T>): Promise<SparkPortalResult<T>> {\n try {\n return { ok: true, value: await firstValueFrom(request) };\n } catch (error) {\n if (error instanceof HttpErrorResponse) {\n return { ok: false, status: error.status, problem: problemText(error.error) };\n }\n return { ok: false, status: 0, problem: null };\n }\n }\n}\n\n/** The text of an RFC 7807 problem (`TypedResults.Problem(detail)`), when the body is one. */\nfunction problemText(body: unknown): string | null {\n if (body && typeof body === 'object') {\n const problem = body as { detail?: unknown; title?: unknown };\n if (typeof problem.detail === 'string' && problem.detail) return problem.detail;\n }\n return null;\n}\n","import { Pipe, type PipeTransform, inject } from '@angular/core';\nimport { currentLanguage } from '@mintplayer/ng-spark/models';\nimport { SparkAuthTranslationService } from '@mintplayer/ng-spark/auth/core';\n\n/** Where the pages' texts live: `identityProvider.spa.*` in the identity-provider library's `translations.json`. */\nconst PREFIX = 'identityProvider.spa.';\n\nfunction format(template: string, args: unknown[]): string {\n return args.length\n ? template.replace(/\\{(\\d+)\\}/g, (match, index: string) => {\n const arg = args[Number(index)];\n return arg === undefined || arg === null ? match : String(arg);\n })\n : template;\n}\n\n/**\n * A text function for component code: `private readonly text = injectIdentityProviderText();` then\n * `this.text('apps.withdrawn')`. The texts come from the server's translations in the app's current\n * language, like every other ng-spark page; `{0}`, `{1}` are replaced by the arguments.\n */\nexport function injectIdentityProviderText(): (key: string, ...args: unknown[]) => string {\n const translations = inject(SparkAuthTranslationService);\n return (key, ...args) => format(translations.t(PREFIX + key), args);\n}\n\n/** `{{ 'apps.title' | idp }}`, `{{ 'apps.by' | idp: publisher }}`. Impure: follows the language and the loaded translations. */\n@Pipe({ name: 'idp', pure: false, standalone: true })\nexport class SparkIdentityProviderTextPipe implements PipeTransform {\n private readonly translations = inject(SparkAuthTranslationService);\n\n transform(key: string, ...args: unknown[]): string {\n return format(this.translations.t(PREFIX + key), args);\n }\n}\n\n/**\n * A server date (ISO string) as a date and time in the app's current language; empty for null.\n * `Intl` rather than Angular's `DatePipe`, which needs locale data registered for every language.\n */\nexport function identityProviderDate(value: string | null | undefined): string {\n if (!value) return '';\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n try {\n return new Intl.DateTimeFormat(currentLanguage(), { dateStyle: 'medium', timeStyle: 'short' }).format(date);\n } catch {\n return date.toLocaleString();\n }\n}\n\n/** `{{ app.firstGrantedAt | idpDate }}`. Impure: follows the language signal. */\n@Pipe({ name: 'idpDate', pure: false, standalone: true })\nexport class SparkIdentityProviderDatePipe implements PipeTransform {\n transform(value: string | null | undefined): string {\n return identityProviderDate(value);\n }\n}\n","/**\n * The identity-provider library's queries, by the aliases in its `App_Data/Model/*.json`\n * (`queries[].alias`). They open in the generic query page of `sparkRoutes()`, `/query/:queryId`,\n * which resolves an alias as well as an id. Each lists only what the caller may see.\n */\nexport const SPARK_IDENTITY_PROVIDER_QUERIES = {\n /** `OidcApplication`: the caller's applications (members-only filter), or all of them for an administrator. */\n applications: 'oidc-applications',\n resources: 'oidc-resources',\n developerRequests: 'oidc-developer-requests',\n scopeApprovals: 'oidc-scope-approvals',\n goLiveReviews: 'oidc-golive-reviews',\n grants: 'oidc-grants',\n auditEvents: 'oidc-audit-events',\n} as const;\n\n/** The router commands that open one of {@link SPARK_IDENTITY_PROVIDER_QUERIES}. */\nexport function identityProviderQueryLink(alias: string): string[] {\n return ['/query', alias];\n}\n"],"mappings":"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"}