@betterportal/config-manager 10.6.31 → 10.6.33

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 (65) hide show
  1. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts +1 -1
  2. package/lib/.bsb/clients/service-betterportal-config-manager.js +1 -1
  3. package/lib/bp-contracts/org.betterportal.config-manager.json +69 -1
  4. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts +32 -0
  5. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts.map +1 -1
  6. package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts +3 -2
  7. package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts.map +1 -1
  8. package/lib/plugins/service-betterportal-config-manager/adminApi.js +58 -36
  9. package/lib/plugins/service-betterportal-config-manager/adminApi.js.map +1 -1
  10. package/lib/plugins/service-betterportal-config-manager/appQueries.d.ts +1096 -0
  11. package/lib/plugins/service-betterportal-config-manager/appQueries.d.ts.map +1 -0
  12. package/lib/plugins/service-betterportal-config-manager/appQueries.js +330 -0
  13. package/lib/plugins/service-betterportal-config-manager/appQueries.js.map +1 -0
  14. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.d.ts.map +1 -1
  15. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.js +35 -5
  16. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview-environments/_renderer.bootstrap5/GET.js.map +1 -1
  17. package/lib/plugins/service-betterportal-config-manager/index.d.ts +4 -0
  18. package/lib/plugins/service-betterportal-config-manager/index.d.ts.map +1 -1
  19. package/lib/plugins/service-betterportal-config-manager/index.js +70 -22
  20. package/lib/plugins/service-betterportal-config-manager/index.js.map +1 -1
  21. package/lib/plugins/service-betterportal-config-manager/m2mConnections.d.ts +6 -3
  22. package/lib/plugins/service-betterportal-config-manager/m2mConnections.d.ts.map +1 -1
  23. package/lib/plugins/service-betterportal-config-manager/m2mConnections.js.map +1 -1
  24. package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts +2 -1
  25. package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts.map +1 -1
  26. package/lib/plugins/service-betterportal-config-manager/menuEditor.js +165 -176
  27. package/lib/plugins/service-betterportal-config-manager/menuEditor.js.map +1 -1
  28. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.d.ts +10 -0
  29. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.d.ts.map +1 -1
  30. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.js +90 -1
  31. package/lib/plugins/service-betterportal-config-manager/previewEnvironmentManagement.js.map +1 -1
  32. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.d.ts +1 -1
  33. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.d.ts.map +1 -1
  34. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.js +133 -23
  35. package/lib/plugins/service-betterportal-config-manager/previewEnvironments.js.map +1 -1
  36. package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts +2 -0
  37. package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts.map +1 -1
  38. package/lib/plugins/service-betterportal-config-manager/routeContext.js.map +1 -1
  39. package/lib/plugins/service-betterportal-config-manager/storage/appData.d.ts +1 -1
  40. package/lib/plugins/service-betterportal-config-manager/storage/appData.d.ts.map +1 -1
  41. package/lib/plugins/service-betterportal-config-manager/storage/appData.js +4 -4
  42. package/lib/plugins/service-betterportal-config-manager/storage/appData.js.map +1 -1
  43. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts +5 -3
  44. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts.map +1 -1
  45. package/lib/plugins/service-betterportal-config-manager/storage/core.js +1 -1
  46. package/lib/plugins/service-betterportal-config-manager/storage/core.js.map +1 -1
  47. package/lib/plugins/service-betterportal-config-manager/storage/entities.d.ts.map +1 -1
  48. package/lib/plugins/service-betterportal-config-manager/storage/entities.js +4 -2
  49. package/lib/plugins/service-betterportal-config-manager/storage/entities.js.map +1 -1
  50. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts +14 -0
  51. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts.map +1 -1
  52. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js +11 -0
  53. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js.map +1 -1
  54. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts +4 -3
  55. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts.map +1 -1
  56. package/lib/plugins/service-betterportal-config-manager/syncApi.js.map +1 -1
  57. package/lib/plugins/service-betterportal-config-manager/tenantManagement.d.ts.map +1 -1
  58. package/lib/plugins/service-betterportal-config-manager/tenantManagement.js +3 -1
  59. package/lib/plugins/service-betterportal-config-manager/tenantManagement.js.map +1 -1
  60. package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts.map +1 -1
  61. package/lib/plugins/service-betterportal-config-manager/webhooks.js +147 -54
  62. package/lib/plugins/service-betterportal-config-manager/webhooks.js.map +1 -1
  63. package/lib/schemas/service-betterportal-config-manager.json +1 -1
  64. package/lib/schemas/service-betterportal-config-manager.plugin.json +1 -1
  65. package/package.json +3 -3
@@ -0,0 +1,1096 @@
1
+ import type { PoolClient } from "pg";
2
+ import { type HeaderMap, type BetterPortalConfig, type BetterPortalObservability } from "@betterportal/framework";
3
+ import type { PostgresStorage } from "./storage/postgres.js";
4
+ export type AppDatabase = PostgresStorage["database"];
5
+ /** Editor data, not a complete platform configuration and never passed to saveConfig. */
6
+ export type AppEditorData = Pick<BetterPortalConfig, "apps" | "tenants" | "platformServices" | "sharedServiceCatalog" | "sharedServiceActivations" | "previewEnvironmentDeployments">;
7
+ export declare function readAppEditor(client: PoolClient, db: AppDatabase, appId: string): Promise<AppEditorData>;
8
+ /** A short transaction over one app's relational collections. No platform snapshots. */
9
+ export declare function editAppRows<T>(db: AppDatabase, appId: string, obs: BetterPortalObservability | undefined, change: (data: AppEditorData) => Promise<T>): Promise<T>;
10
+ /** Management request resolution reads app settings first, then only the matched app's rows. */
11
+ export declare function readRequestConfig(db: AppDatabase, headers: HeaderMap, obs?: BetterPortalObservability): Promise<{
12
+ configManagement: {
13
+ auth: {
14
+ mechanism: "none" | "dev-token" | "jwt" | "oidc";
15
+ requiredPermissions: string[];
16
+ issuer?: string | undefined;
17
+ audience?: string | undefined;
18
+ };
19
+ adminTenantId?: string | undefined;
20
+ managementAppId?: string | undefined;
21
+ };
22
+ platformServices: {
23
+ id: string;
24
+ hostname: string;
25
+ apiKeyHash: string;
26
+ capabilities: string[];
27
+ title: string;
28
+ createdAt: string;
29
+ enabled: boolean;
30
+ publicKeyPem?: string | undefined;
31
+ keyId?: string | undefined;
32
+ serviceId?: string | undefined;
33
+ authProvider?: {
34
+ issuer: string;
35
+ audience: string;
36
+ jwksUri: string;
37
+ publicKeys?: {
38
+ keys: {
39
+ kty: "RSA";
40
+ use: "sig";
41
+ alg: "RS256";
42
+ kid: string;
43
+ n: string;
44
+ e: string;
45
+ }[];
46
+ } | undefined;
47
+ } | undefined;
48
+ description?: string | undefined;
49
+ category?: string | undefined;
50
+ }[];
51
+ tenants: {
52
+ id: string;
53
+ slug: string;
54
+ title: string;
55
+ active: boolean;
56
+ branding: {
57
+ brandName?: string | undefined;
58
+ logoUrl?: string | undefined;
59
+ primaryColor?: string | undefined;
60
+ secondaryColor?: string | undefined;
61
+ };
62
+ services: {
63
+ id: string;
64
+ hostname: string;
65
+ apiKeyHash: string;
66
+ capabilities: string[];
67
+ deploymentMode: "bp-hosted" | "customer-hosted" | "third-party-saas" | "self-hosted" | "saas-managed";
68
+ createdAt: string;
69
+ enabled: boolean;
70
+ publicKeyPem?: string | undefined;
71
+ keyId?: string | undefined;
72
+ serviceId?: string | undefined;
73
+ authProvider?: {
74
+ issuer: string;
75
+ audience: string;
76
+ jwksUri: string;
77
+ publicKeys?: {
78
+ keys: {
79
+ kty: "RSA";
80
+ use: "sig";
81
+ alg: "RS256";
82
+ kid: string;
83
+ n: string;
84
+ e: string;
85
+ }[];
86
+ } | undefined;
87
+ } | undefined;
88
+ title?: string | undefined;
89
+ description?: string | undefined;
90
+ lastSeenAt?: string | undefined;
91
+ lastSyncAt?: string | undefined;
92
+ }[];
93
+ activatedPlatformServices: string[];
94
+ }[];
95
+ apps: {
96
+ id: string;
97
+ tenantId: string;
98
+ slug: string;
99
+ title: string;
100
+ hostnames: string[];
101
+ originOverrides: string[];
102
+ refererOverrides: string[];
103
+ themeConfig: {
104
+ mode: "light" | "dark" | "system";
105
+ bootstrap: {
106
+ primary?: string | undefined;
107
+ secondary?: string | undefined;
108
+ success?: string | undefined;
109
+ info?: string | undefined;
110
+ warning?: string | undefined;
111
+ danger?: string | undefined;
112
+ light?: string | undefined;
113
+ dark?: string | undefined;
114
+ };
115
+ light: {
116
+ background?: string | undefined;
117
+ surface?: string | undefined;
118
+ surfaceAlt?: string | undefined;
119
+ text?: string | undefined;
120
+ textSoft?: string | undefined;
121
+ border?: string | undefined;
122
+ accentSoft?: string | undefined;
123
+ };
124
+ dark: {
125
+ background?: string | undefined;
126
+ surface?: string | undefined;
127
+ surfaceAlt?: string | undefined;
128
+ text?: string | undefined;
129
+ textSoft?: string | undefined;
130
+ border?: string | undefined;
131
+ accentSoft?: string | undefined;
132
+ };
133
+ brandName?: string | undefined;
134
+ documentTitle?: string | undefined;
135
+ lightLogoUrl?: string | undefined;
136
+ darkLogoUrl?: string | undefined;
137
+ faviconUrl?: string | undefined;
138
+ };
139
+ defaultRoute: string;
140
+ routes: {
141
+ id: string;
142
+ kind: "page" | "api";
143
+ path: string;
144
+ serviceId: string;
145
+ viewId: string;
146
+ enabled: boolean;
147
+ operations: string[];
148
+ servicePathVariant?: string | undefined;
149
+ fixedParams?: Record<string, string> | undefined;
150
+ authRequired?: boolean | undefined;
151
+ menuPermissions?: {
152
+ serviceId: string;
153
+ viewId: string;
154
+ permissions: string[];
155
+ }[] | undefined;
156
+ sitemap?: {
157
+ kind: "provider" | "default" | "exclude" | "metadata";
158
+ lastModified?: string | undefined;
159
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
160
+ priority?: number | undefined;
161
+ } | undefined;
162
+ robots?: {
163
+ userAgent: string;
164
+ access: "allow" | "disallow";
165
+ crawlDelaySeconds?: number | undefined;
166
+ }[] | undefined;
167
+ targetPath?: string | undefined;
168
+ resolvedServicePath?: string | undefined;
169
+ resolvedMethods?: ("GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS")[] | undefined;
170
+ query?: string | undefined;
171
+ title?: string | undefined;
172
+ icon?: string | undefined;
173
+ enablement?: "enabled" | "auto" | "disabled" | undefined;
174
+ menu?: boolean | undefined;
175
+ chrome?: {
176
+ [x: string]: string | number | boolean;
177
+ hideMenu?: boolean | undefined;
178
+ hideHeader?: boolean | undefined;
179
+ hideFooter?: boolean | undefined;
180
+ fullScreen?: boolean | undefined;
181
+ } | undefined;
182
+ }[];
183
+ menu: import("@betterportal/framework").BetterPortalMenuItem[];
184
+ slots: {
185
+ slotId: string;
186
+ serviceId: string;
187
+ viewId: string;
188
+ enabled: boolean;
189
+ renderer?: string | undefined;
190
+ }[];
191
+ fragments: Record<string, {
192
+ serviceId: string;
193
+ fragmentId: string;
194
+ targetPath: string;
195
+ enabled: boolean;
196
+ }[]>;
197
+ shellFragments: Record<string, Record<string, {
198
+ mode: "none";
199
+ } | {
200
+ mode: "override";
201
+ item: {
202
+ source: "shell";
203
+ fragmentId: string;
204
+ } | {
205
+ source: "service";
206
+ serviceId: string;
207
+ fragmentId: string;
208
+ targetPath: string;
209
+ };
210
+ } | {
211
+ mode: "items";
212
+ items: ({
213
+ source: "shell";
214
+ fragmentId: string;
215
+ } | {
216
+ source: "service";
217
+ serviceId: string;
218
+ fragmentId: string;
219
+ targetPath: string;
220
+ })[];
221
+ }>>;
222
+ shell?: {
223
+ serviceId: string;
224
+ } | undefined;
225
+ layoutId?: string | undefined;
226
+ seo?: {
227
+ visibility: "auto" | "public" | "private";
228
+ serviceFailure: "error" | "known-routes" | "omit-service";
229
+ serviceCache: "none" | "1h" | "24h" | "7d";
230
+ canonicalOrigin?: string | undefined;
231
+ } | undefined;
232
+ auth?: {
233
+ serviceId: string;
234
+ expectedIssuer: string;
235
+ expectedAudience: string;
236
+ jwksUri: string;
237
+ roles: {
238
+ id: string;
239
+ title: string;
240
+ permissions: {
241
+ serviceId: string;
242
+ viewId: string;
243
+ permissions: ("read" | "create" | "update" | "delete")[];
244
+ }[];
245
+ description?: string | undefined;
246
+ }[];
247
+ provider?: {
248
+ kind: "betterportal.default";
249
+ } | {
250
+ kind: "authress.io";
251
+ roleClaimPath: string;
252
+ subjectClaimPath: string;
253
+ nameClaimPath?: string | undefined;
254
+ emailClaimPath?: string | undefined;
255
+ pictureClaimPath?: string | undefined;
256
+ } | undefined;
257
+ roleAuthority?: "provider" | "betterportal" | undefined;
258
+ loginViewId?: string | undefined;
259
+ logoutViewId?: string | undefined;
260
+ refreshViewId?: string | undefined;
261
+ redirects?: {
262
+ afterLogin?: {
263
+ serviceId: string;
264
+ viewId: string;
265
+ } | undefined;
266
+ afterLogout?: {
267
+ serviceId: string;
268
+ viewId: string;
269
+ } | undefined;
270
+ } | undefined;
271
+ publicKeys?: {
272
+ keys: {
273
+ kty: "RSA";
274
+ use: "sig";
275
+ alg: "RS256";
276
+ kid: string;
277
+ n: string;
278
+ e: string;
279
+ }[];
280
+ } | undefined;
281
+ } | undefined;
282
+ statusViewIds?: Record<string, string> | undefined;
283
+ }[];
284
+ sharedServiceCatalog: {
285
+ id: string;
286
+ title: string;
287
+ baseUrl: string;
288
+ apiKeyHash: string;
289
+ supportedDeploymentModes: ("bp-hosted" | "customer-hosted" | "third-party-saas" | "self-hosted" | "saas-managed")[];
290
+ owner: "bp" | "3p";
291
+ tags: string[];
292
+ enabled: boolean;
293
+ serviceId?: string | undefined;
294
+ description?: string | undefined;
295
+ logoUrl?: string | undefined;
296
+ publicKeyPem?: string | undefined;
297
+ keyId?: string | undefined;
298
+ authProvider?: {
299
+ issuer: string;
300
+ audience: string;
301
+ jwksUri: string;
302
+ publicKeys?: {
303
+ keys: {
304
+ kty: "RSA";
305
+ use: "sig";
306
+ alg: "RS256";
307
+ kid: string;
308
+ n: string;
309
+ e: string;
310
+ }[];
311
+ } | undefined;
312
+ } | undefined;
313
+ upgradeUrlTemplate?: string | undefined;
314
+ category?: string | undefined;
315
+ pricingHint?: "free" | "freemium" | "paid" | undefined;
316
+ publishedAt?: string | undefined;
317
+ }[];
318
+ sharedServiceActivations: {
319
+ id: string;
320
+ tenantId: string;
321
+ sharedServiceId: string;
322
+ activatedAt: string;
323
+ enabled: boolean;
324
+ appId?: string | undefined;
325
+ }[];
326
+ manifestCache: {
327
+ serviceId: string;
328
+ manifestVersion: string;
329
+ fetchedAt: string;
330
+ capabilities: string[];
331
+ m2mRequests: {
332
+ id: string;
333
+ title: string;
334
+ contractId: string;
335
+ requiredCapabilities: string[];
336
+ methods: ("GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS")[];
337
+ permissions: string[];
338
+ mode: "service" | "delegated";
339
+ optional: boolean;
340
+ description?: string | undefined;
341
+ version?: string | undefined;
342
+ }[];
343
+ apiContracts: {
344
+ id: string;
345
+ title: string;
346
+ version: string;
347
+ viewId: string;
348
+ methods: ("GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS")[];
349
+ capabilities: string[];
350
+ permissions: string[];
351
+ modes: ("service" | "delegated")[];
352
+ description?: string | undefined;
353
+ }[];
354
+ developerResources: {
355
+ id: string;
356
+ kind: "guide" | "template" | "skill" | "example";
357
+ title: string;
358
+ mediaType: string;
359
+ content: string;
360
+ description?: string | undefined;
361
+ language?: string | undefined;
362
+ }[];
363
+ configSchemas: {
364
+ id: string;
365
+ title: string;
366
+ description: string;
367
+ scope: "tenant" | "app";
368
+ jsonSchema: import("@betterportal/framework").JsonObject;
369
+ fields: {
370
+ key: string;
371
+ title: string;
372
+ description: string;
373
+ scope: "tenant" | "app";
374
+ visibility: "public" | "protected" | "secret";
375
+ ownership: "bp" | "plugin" | "mixed";
376
+ sourceOfTruth: "external" | "bp" | "plugin";
377
+ required: boolean;
378
+ groupId?: string | undefined;
379
+ order?: number | undefined;
380
+ defaultValue?: import("@betterportal/framework").JsonValue | undefined;
381
+ ui?: {
382
+ control?: "number" | "email" | "text" | "select" | "url" | "date" | "textarea" | "password" | "checkbox" | "multiselect" | "color" | "time" | "datetime-local" | undefined;
383
+ placeholder?: string | undefined;
384
+ options?: {
385
+ value: string;
386
+ label: string;
387
+ }[] | undefined;
388
+ optionsSource?: "app.routes" | undefined;
389
+ min?: string | number | undefined;
390
+ max?: string | number | undefined;
391
+ step?: number | undefined;
392
+ rows?: number | undefined;
393
+ } | undefined;
394
+ }[];
395
+ groups?: {
396
+ id: string;
397
+ title: string;
398
+ description?: string | undefined;
399
+ order?: number | undefined;
400
+ optional?: boolean | undefined;
401
+ }[] | undefined;
402
+ }[];
403
+ webhooks: {
404
+ id: string;
405
+ title: string;
406
+ payloadSchema: import("@betterportal/framework").JsonObject;
407
+ description?: string | undefined;
408
+ }[];
409
+ viewIndex: Record<string, {
410
+ viewId: string;
411
+ title: string;
412
+ description: string;
413
+ path: string;
414
+ pathVariants: string[];
415
+ operations: {
416
+ operationId: string;
417
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS";
418
+ title: string;
419
+ description: string;
420
+ renderers: string[];
421
+ renderModes: ("page" | "fragment" | "embed")[];
422
+ authRequired: boolean;
423
+ robots: {
424
+ userAgent: string;
425
+ access: "allow" | "disallow";
426
+ crawlDelaySeconds?: number | undefined;
427
+ }[];
428
+ dependencies: {
429
+ operationId: string;
430
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS";
431
+ serviceId?: string | undefined;
432
+ }[];
433
+ permissions: {
434
+ serviceId: string;
435
+ viewId: string;
436
+ permissions: string[];
437
+ }[];
438
+ renderable: boolean;
439
+ apiContracts: {
440
+ id: string;
441
+ title: string;
442
+ version: string;
443
+ viewId: string;
444
+ methods: ("GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS")[];
445
+ capabilities: string[];
446
+ permissions: string[];
447
+ modes: ("service" | "delegated")[];
448
+ description?: string | undefined;
449
+ }[];
450
+ demoScenarios: {
451
+ id: string;
452
+ title: string;
453
+ response: import("@betterportal/framework").JsonValue;
454
+ description?: string | undefined;
455
+ match?: {
456
+ query?: import("@betterportal/framework").JsonObject | undefined;
457
+ params?: import("@betterportal/framework").JsonObject | undefined;
458
+ headers?: Record<string, string> | undefined;
459
+ request?: import("@betterportal/framework").JsonObject | undefined;
460
+ } | undefined;
461
+ }[];
462
+ role?: string | undefined;
463
+ sitemap?: {
464
+ kind: "provider" | "default" | "exclude" | "metadata";
465
+ lastModified?: string | undefined;
466
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
467
+ priority?: number | undefined;
468
+ } | undefined;
469
+ menu?: boolean | undefined;
470
+ chrome?: {
471
+ [x: string]: string | number | boolean;
472
+ hideMenu?: boolean | undefined;
473
+ hideHeader?: boolean | undefined;
474
+ hideFooter?: boolean | undefined;
475
+ fullScreen?: boolean | undefined;
476
+ } | undefined;
477
+ schemas?: {
478
+ query?: import("@betterportal/framework").JsonObject | undefined;
479
+ headers?: import("@betterportal/framework").JsonObject | undefined;
480
+ request?: import("@betterportal/framework").JsonObject | undefined;
481
+ multipart?: import("@betterportal/framework").JsonObject | undefined;
482
+ response?: import("@betterportal/framework").JsonObject | undefined;
483
+ } | undefined;
484
+ raw?: boolean | undefined;
485
+ }[];
486
+ fragments: {
487
+ fragmentId: string;
488
+ targetPath: string;
489
+ operationId: string;
490
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS";
491
+ }[];
492
+ paramsSchema?: import("@betterportal/framework").JsonObject | undefined;
493
+ }>;
494
+ title?: string | undefined;
495
+ authProvider?: {
496
+ issuer: string;
497
+ audience: string;
498
+ jwksUri: string;
499
+ publicKeys?: {
500
+ keys: {
501
+ kty: "RSA";
502
+ use: "sig";
503
+ alg: "RS256";
504
+ kid: string;
505
+ n: string;
506
+ e: string;
507
+ }[];
508
+ } | undefined;
509
+ } | undefined;
510
+ shell?: {
511
+ service: string;
512
+ renderer: string;
513
+ fragments: {
514
+ id: string;
515
+ kind: "fragment" | "block";
516
+ title: string;
517
+ description: string;
518
+ defaultItems: string[];
519
+ }[];
520
+ } | undefined;
521
+ }[];
522
+ m2m: {
523
+ bindings: {
524
+ id: string;
525
+ tenantId: string;
526
+ sourceServiceId: string;
527
+ requestId: string;
528
+ contractId: string;
529
+ targetServiceId: string;
530
+ targetViewId: string;
531
+ mode: "service" | "delegated";
532
+ enabled: boolean;
533
+ createdAt: string;
534
+ appId?: string | undefined;
535
+ }[];
536
+ grants: {
537
+ id: string;
538
+ tenantId: string;
539
+ bindingId: string;
540
+ methods: ("GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS")[];
541
+ permissions: string[];
542
+ enabled: boolean;
543
+ createdAt: string;
544
+ appId?: string | undefined;
545
+ }[];
546
+ };
547
+ previewEnvironmentGroups: {
548
+ id: string;
549
+ name: string;
550
+ sourceTenantId: string;
551
+ sourceAppId: string;
552
+ expiresInDays: number | null;
553
+ elevatedRoleIds: string[];
554
+ apiKeyHash: string;
555
+ services: {
556
+ serviceId: string;
557
+ config: {
558
+ tenant: import("@betterportal/framework").JsonObject;
559
+ app: import("@betterportal/framework").JsonObject;
560
+ };
561
+ title?: string | undefined;
562
+ configSchemas?: {
563
+ id: string;
564
+ title: string;
565
+ description: string;
566
+ scope: "tenant" | "app";
567
+ jsonSchema: import("@betterportal/framework").JsonObject;
568
+ fields: {
569
+ key: string;
570
+ title: string;
571
+ description: string;
572
+ scope: "tenant" | "app";
573
+ visibility: "public" | "protected" | "secret";
574
+ ownership: "bp" | "plugin" | "mixed";
575
+ sourceOfTruth: "external" | "bp" | "plugin";
576
+ required: boolean;
577
+ groupId?: string | undefined;
578
+ order?: number | undefined;
579
+ defaultValue?: import("@betterportal/framework").JsonValue | undefined;
580
+ ui?: {
581
+ control?: "number" | "email" | "text" | "select" | "url" | "date" | "textarea" | "password" | "checkbox" | "multiselect" | "color" | "time" | "datetime-local" | undefined;
582
+ placeholder?: string | undefined;
583
+ options?: {
584
+ value: string;
585
+ label: string;
586
+ }[] | undefined;
587
+ optionsSource?: "app.routes" | undefined;
588
+ min?: string | number | undefined;
589
+ max?: string | number | undefined;
590
+ step?: number | undefined;
591
+ rows?: number | undefined;
592
+ } | undefined;
593
+ }[];
594
+ groups?: {
595
+ id: string;
596
+ title: string;
597
+ description?: string | undefined;
598
+ order?: number | undefined;
599
+ optional?: boolean | undefined;
600
+ }[] | undefined;
601
+ }[] | undefined;
602
+ }[];
603
+ createdAt: string;
604
+ updatedAt: string;
605
+ oidc?: {
606
+ issuer: string;
607
+ audience: string;
608
+ jwksUri: string;
609
+ requiredClaims: Record<string, string>;
610
+ subjectPrefix?: string | undefined;
611
+ } | undefined;
612
+ }[];
613
+ previewEnvironmentDeployments: {
614
+ id: string;
615
+ groupId: string;
616
+ key: string;
617
+ name: string;
618
+ hostname: string;
619
+ tenantId: string;
620
+ appId: string;
621
+ expiresInDays: number | null;
622
+ services: {
623
+ serviceId: string;
624
+ instanceId: string;
625
+ url: string;
626
+ }[];
627
+ createdAt: string;
628
+ updatedAt: string;
629
+ effectiveConfig?: {
630
+ services: {
631
+ serviceId: string;
632
+ config: {
633
+ tenant: import("@betterportal/framework").JsonObject;
634
+ app: import("@betterportal/framework").JsonObject;
635
+ };
636
+ title?: string | undefined;
637
+ configSchemas?: {
638
+ id: string;
639
+ title: string;
640
+ description: string;
641
+ scope: "tenant" | "app";
642
+ jsonSchema: import("@betterportal/framework").JsonObject;
643
+ fields: {
644
+ key: string;
645
+ title: string;
646
+ description: string;
647
+ scope: "tenant" | "app";
648
+ visibility: "public" | "protected" | "secret";
649
+ ownership: "bp" | "plugin" | "mixed";
650
+ sourceOfTruth: "external" | "bp" | "plugin";
651
+ required: boolean;
652
+ groupId?: string | undefined;
653
+ order?: number | undefined;
654
+ defaultValue?: import("@betterportal/framework").JsonValue | undefined;
655
+ ui?: {
656
+ control?: "number" | "email" | "text" | "select" | "url" | "date" | "textarea" | "password" | "checkbox" | "multiselect" | "color" | "time" | "datetime-local" | undefined;
657
+ placeholder?: string | undefined;
658
+ options?: {
659
+ value: string;
660
+ label: string;
661
+ }[] | undefined;
662
+ optionsSource?: "app.routes" | undefined;
663
+ min?: string | number | undefined;
664
+ max?: string | number | undefined;
665
+ step?: number | undefined;
666
+ rows?: number | undefined;
667
+ } | undefined;
668
+ }[];
669
+ groups?: {
670
+ id: string;
671
+ title: string;
672
+ description?: string | undefined;
673
+ order?: number | undefined;
674
+ optional?: boolean | undefined;
675
+ }[] | undefined;
676
+ }[] | undefined;
677
+ }[];
678
+ elevatedRoleIds: string[];
679
+ } | undefined;
680
+ credentialReplay?: {
681
+ requestHash: string;
682
+ ciphertext: string;
683
+ expiresAt: string;
684
+ } | undefined;
685
+ expiresAt?: string | undefined;
686
+ }[];
687
+ webhooks: {
688
+ targets: {
689
+ id: string;
690
+ tenantId: string;
691
+ serviceId: string;
692
+ eventId: string;
693
+ url: string;
694
+ secret: string;
695
+ createdAt: string;
696
+ enabled: boolean;
697
+ maxAttempts: number;
698
+ appId?: string | undefined;
699
+ }[];
700
+ };
701
+ }>;
702
+ export declare function readAppPage(db: AppDatabase, appId?: string, chooseFirst?: boolean): Promise<{
703
+ appChoices: {
704
+ id: string;
705
+ tenantId: string;
706
+ title: string;
707
+ }[];
708
+ apps: {
709
+ id: string;
710
+ tenantId: string;
711
+ slug: string;
712
+ title: string;
713
+ hostnames: string[];
714
+ originOverrides: string[];
715
+ refererOverrides: string[];
716
+ themeConfig: {
717
+ mode: "light" | "dark" | "system";
718
+ bootstrap: {
719
+ primary?: string | undefined;
720
+ secondary?: string | undefined;
721
+ success?: string | undefined;
722
+ info?: string | undefined;
723
+ warning?: string | undefined;
724
+ danger?: string | undefined;
725
+ light?: string | undefined;
726
+ dark?: string | undefined;
727
+ };
728
+ light: {
729
+ background?: string | undefined;
730
+ surface?: string | undefined;
731
+ surfaceAlt?: string | undefined;
732
+ text?: string | undefined;
733
+ textSoft?: string | undefined;
734
+ border?: string | undefined;
735
+ accentSoft?: string | undefined;
736
+ };
737
+ dark: {
738
+ background?: string | undefined;
739
+ surface?: string | undefined;
740
+ surfaceAlt?: string | undefined;
741
+ text?: string | undefined;
742
+ textSoft?: string | undefined;
743
+ border?: string | undefined;
744
+ accentSoft?: string | undefined;
745
+ };
746
+ brandName?: string | undefined;
747
+ documentTitle?: string | undefined;
748
+ lightLogoUrl?: string | undefined;
749
+ darkLogoUrl?: string | undefined;
750
+ faviconUrl?: string | undefined;
751
+ };
752
+ defaultRoute: string;
753
+ routes: {
754
+ id: string;
755
+ kind: "page" | "api";
756
+ path: string;
757
+ serviceId: string;
758
+ viewId: string;
759
+ enabled: boolean;
760
+ operations: string[];
761
+ servicePathVariant?: string | undefined;
762
+ fixedParams?: Record<string, string> | undefined;
763
+ authRequired?: boolean | undefined;
764
+ menuPermissions?: {
765
+ serviceId: string;
766
+ viewId: string;
767
+ permissions: string[];
768
+ }[] | undefined;
769
+ sitemap?: {
770
+ kind: "provider" | "default" | "exclude" | "metadata";
771
+ lastModified?: string | undefined;
772
+ changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never" | undefined;
773
+ priority?: number | undefined;
774
+ } | undefined;
775
+ robots?: {
776
+ userAgent: string;
777
+ access: "allow" | "disallow";
778
+ crawlDelaySeconds?: number | undefined;
779
+ }[] | undefined;
780
+ targetPath?: string | undefined;
781
+ resolvedServicePath?: string | undefined;
782
+ resolvedMethods?: ("GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS")[] | undefined;
783
+ query?: string | undefined;
784
+ title?: string | undefined;
785
+ icon?: string | undefined;
786
+ enablement?: "enabled" | "auto" | "disabled" | undefined;
787
+ menu?: boolean | undefined;
788
+ chrome?: {
789
+ [x: string]: string | number | boolean;
790
+ hideMenu?: boolean | undefined;
791
+ hideHeader?: boolean | undefined;
792
+ hideFooter?: boolean | undefined;
793
+ fullScreen?: boolean | undefined;
794
+ } | undefined;
795
+ }[];
796
+ menu: import("@betterportal/framework").BetterPortalMenuItem[];
797
+ slots: {
798
+ slotId: string;
799
+ serviceId: string;
800
+ viewId: string;
801
+ enabled: boolean;
802
+ renderer?: string | undefined;
803
+ }[];
804
+ fragments: Record<string, {
805
+ serviceId: string;
806
+ fragmentId: string;
807
+ targetPath: string;
808
+ enabled: boolean;
809
+ }[]>;
810
+ shellFragments: Record<string, Record<string, {
811
+ mode: "none";
812
+ } | {
813
+ mode: "override";
814
+ item: {
815
+ source: "shell";
816
+ fragmentId: string;
817
+ } | {
818
+ source: "service";
819
+ serviceId: string;
820
+ fragmentId: string;
821
+ targetPath: string;
822
+ };
823
+ } | {
824
+ mode: "items";
825
+ items: ({
826
+ source: "shell";
827
+ fragmentId: string;
828
+ } | {
829
+ source: "service";
830
+ serviceId: string;
831
+ fragmentId: string;
832
+ targetPath: string;
833
+ })[];
834
+ }>>;
835
+ shell?: {
836
+ serviceId: string;
837
+ } | undefined;
838
+ layoutId?: string | undefined;
839
+ seo?: {
840
+ visibility: "auto" | "public" | "private";
841
+ serviceFailure: "error" | "known-routes" | "omit-service";
842
+ serviceCache: "none" | "1h" | "24h" | "7d";
843
+ canonicalOrigin?: string | undefined;
844
+ } | undefined;
845
+ auth?: {
846
+ serviceId: string;
847
+ expectedIssuer: string;
848
+ expectedAudience: string;
849
+ jwksUri: string;
850
+ roles: {
851
+ id: string;
852
+ title: string;
853
+ permissions: {
854
+ serviceId: string;
855
+ viewId: string;
856
+ permissions: ("read" | "create" | "update" | "delete")[];
857
+ }[];
858
+ description?: string | undefined;
859
+ }[];
860
+ provider?: {
861
+ kind: "betterportal.default";
862
+ } | {
863
+ kind: "authress.io";
864
+ roleClaimPath: string;
865
+ subjectClaimPath: string;
866
+ nameClaimPath?: string | undefined;
867
+ emailClaimPath?: string | undefined;
868
+ pictureClaimPath?: string | undefined;
869
+ } | undefined;
870
+ roleAuthority?: "provider" | "betterportal" | undefined;
871
+ loginViewId?: string | undefined;
872
+ logoutViewId?: string | undefined;
873
+ refreshViewId?: string | undefined;
874
+ redirects?: {
875
+ afterLogin?: {
876
+ serviceId: string;
877
+ viewId: string;
878
+ } | undefined;
879
+ afterLogout?: {
880
+ serviceId: string;
881
+ viewId: string;
882
+ } | undefined;
883
+ } | undefined;
884
+ publicKeys?: {
885
+ keys: {
886
+ kty: "RSA";
887
+ use: "sig";
888
+ alg: "RS256";
889
+ kid: string;
890
+ n: string;
891
+ e: string;
892
+ }[];
893
+ } | undefined;
894
+ } | undefined;
895
+ statusViewIds?: Record<string, string> | undefined;
896
+ }[];
897
+ platformServices: {
898
+ id: string;
899
+ hostname: string;
900
+ apiKeyHash: string;
901
+ capabilities: string[];
902
+ title: string;
903
+ createdAt: string;
904
+ enabled: boolean;
905
+ publicKeyPem?: string | undefined;
906
+ keyId?: string | undefined;
907
+ serviceId?: string | undefined;
908
+ authProvider?: {
909
+ issuer: string;
910
+ audience: string;
911
+ jwksUri: string;
912
+ publicKeys?: {
913
+ keys: {
914
+ kty: "RSA";
915
+ use: "sig";
916
+ alg: "RS256";
917
+ kid: string;
918
+ n: string;
919
+ e: string;
920
+ }[];
921
+ } | undefined;
922
+ } | undefined;
923
+ description?: string | undefined;
924
+ category?: string | undefined;
925
+ }[];
926
+ tenants: {
927
+ id: string;
928
+ slug: string;
929
+ title: string;
930
+ active: boolean;
931
+ branding: {
932
+ brandName?: string | undefined;
933
+ logoUrl?: string | undefined;
934
+ primaryColor?: string | undefined;
935
+ secondaryColor?: string | undefined;
936
+ };
937
+ services: {
938
+ id: string;
939
+ hostname: string;
940
+ apiKeyHash: string;
941
+ capabilities: string[];
942
+ deploymentMode: "bp-hosted" | "customer-hosted" | "third-party-saas" | "self-hosted" | "saas-managed";
943
+ createdAt: string;
944
+ enabled: boolean;
945
+ publicKeyPem?: string | undefined;
946
+ keyId?: string | undefined;
947
+ serviceId?: string | undefined;
948
+ authProvider?: {
949
+ issuer: string;
950
+ audience: string;
951
+ jwksUri: string;
952
+ publicKeys?: {
953
+ keys: {
954
+ kty: "RSA";
955
+ use: "sig";
956
+ alg: "RS256";
957
+ kid: string;
958
+ n: string;
959
+ e: string;
960
+ }[];
961
+ } | undefined;
962
+ } | undefined;
963
+ title?: string | undefined;
964
+ description?: string | undefined;
965
+ lastSeenAt?: string | undefined;
966
+ lastSyncAt?: string | undefined;
967
+ }[];
968
+ activatedPlatformServices: string[];
969
+ }[];
970
+ sharedServiceCatalog: {
971
+ id: string;
972
+ title: string;
973
+ baseUrl: string;
974
+ apiKeyHash: string;
975
+ supportedDeploymentModes: ("bp-hosted" | "customer-hosted" | "third-party-saas" | "self-hosted" | "saas-managed")[];
976
+ owner: "bp" | "3p";
977
+ tags: string[];
978
+ enabled: boolean;
979
+ serviceId?: string | undefined;
980
+ description?: string | undefined;
981
+ logoUrl?: string | undefined;
982
+ publicKeyPem?: string | undefined;
983
+ keyId?: string | undefined;
984
+ authProvider?: {
985
+ issuer: string;
986
+ audience: string;
987
+ jwksUri: string;
988
+ publicKeys?: {
989
+ keys: {
990
+ kty: "RSA";
991
+ use: "sig";
992
+ alg: "RS256";
993
+ kid: string;
994
+ n: string;
995
+ e: string;
996
+ }[];
997
+ } | undefined;
998
+ } | undefined;
999
+ upgradeUrlTemplate?: string | undefined;
1000
+ category?: string | undefined;
1001
+ pricingHint?: "free" | "freemium" | "paid" | undefined;
1002
+ publishedAt?: string | undefined;
1003
+ }[];
1004
+ sharedServiceActivations: {
1005
+ id: string;
1006
+ tenantId: string;
1007
+ sharedServiceId: string;
1008
+ activatedAt: string;
1009
+ enabled: boolean;
1010
+ appId?: string | undefined;
1011
+ }[];
1012
+ previewEnvironmentDeployments: {
1013
+ id: string;
1014
+ groupId: string;
1015
+ key: string;
1016
+ name: string;
1017
+ hostname: string;
1018
+ tenantId: string;
1019
+ appId: string;
1020
+ expiresInDays: number | null;
1021
+ services: {
1022
+ serviceId: string;
1023
+ instanceId: string;
1024
+ url: string;
1025
+ }[];
1026
+ createdAt: string;
1027
+ updatedAt: string;
1028
+ effectiveConfig?: {
1029
+ services: {
1030
+ serviceId: string;
1031
+ config: {
1032
+ tenant: import("@betterportal/framework").JsonObject;
1033
+ app: import("@betterportal/framework").JsonObject;
1034
+ };
1035
+ title?: string | undefined;
1036
+ configSchemas?: {
1037
+ id: string;
1038
+ title: string;
1039
+ description: string;
1040
+ scope: "tenant" | "app";
1041
+ jsonSchema: import("@betterportal/framework").JsonObject;
1042
+ fields: {
1043
+ key: string;
1044
+ title: string;
1045
+ description: string;
1046
+ scope: "tenant" | "app";
1047
+ visibility: "public" | "protected" | "secret";
1048
+ ownership: "bp" | "plugin" | "mixed";
1049
+ sourceOfTruth: "external" | "bp" | "plugin";
1050
+ required: boolean;
1051
+ groupId?: string | undefined;
1052
+ order?: number | undefined;
1053
+ defaultValue?: import("@betterportal/framework").JsonValue | undefined;
1054
+ ui?: {
1055
+ control?: "number" | "email" | "text" | "select" | "url" | "date" | "textarea" | "password" | "checkbox" | "multiselect" | "color" | "time" | "datetime-local" | undefined;
1056
+ placeholder?: string | undefined;
1057
+ options?: {
1058
+ value: string;
1059
+ label: string;
1060
+ }[] | undefined;
1061
+ optionsSource?: "app.routes" | undefined;
1062
+ min?: string | number | undefined;
1063
+ max?: string | number | undefined;
1064
+ step?: number | undefined;
1065
+ rows?: number | undefined;
1066
+ } | undefined;
1067
+ }[];
1068
+ groups?: {
1069
+ id: string;
1070
+ title: string;
1071
+ description?: string | undefined;
1072
+ order?: number | undefined;
1073
+ optional?: boolean | undefined;
1074
+ }[] | undefined;
1075
+ }[] | undefined;
1076
+ }[];
1077
+ elevatedRoleIds: string[];
1078
+ } | undefined;
1079
+ credentialReplay?: {
1080
+ requestHash: string;
1081
+ ciphertext: string;
1082
+ expiresAt: string;
1083
+ } | undefined;
1084
+ expiresAt?: string | undefined;
1085
+ }[];
1086
+ }>;
1087
+ export type CacheData = Pick<BetterPortalConfig, "apps" | "tenants" | "platformServices" | "sharedServiceCatalog" | "sharedServiceActivations" | "configManagement" | "manifestCache">;
1088
+ /** Caches need service manifests and auth grants, never menus, routes or preview snapshots. */
1089
+ export declare function readCacheData(db: AppDatabase): Promise<CacheData>;
1090
+ export declare function readApp(db: AppDatabase, appId: string): Promise<AppEditorData>;
1091
+ export type DirectoryData = Pick<BetterPortalConfig, "apps" | "tenants" | "platformServices" | "sharedServiceCatalog" | "sharedServiceActivations" | "configManagement" | "m2m">;
1092
+ /** Service/settings pages need registration summaries, not app operational collections. */
1093
+ export declare function readDirectory(db: AppDatabase): Promise<DirectoryData>;
1094
+ /** Tenant editor needs route choices/counts, but no route options, menus or grants. */
1095
+ export declare function readTenantPage(db: AppDatabase): Promise<DirectoryData>;
1096
+ //# sourceMappingURL=appQueries.d.ts.map