@betterportal/framework 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/lib/adapters/h3.d.ts +51 -0
- package/lib/adapters/h3.d.ts.map +1 -0
- package/lib/adapters/h3.js +1120 -0
- package/lib/adapters/h3.js.map +1 -0
- package/lib/codegen/cli.d.ts +3 -0
- package/lib/codegen/cli.d.ts.map +1 -0
- package/lib/codegen/cli.js +82 -0
- package/lib/codegen/cli.js.map +1 -0
- package/lib/codegen/emitter.d.ts +7 -0
- package/lib/codegen/emitter.d.ts.map +1 -0
- package/lib/codegen/emitter.js +453 -0
- package/lib/codegen/emitter.js.map +1 -0
- package/lib/codegen/init.d.ts +3 -0
- package/lib/codegen/init.d.ts.map +1 -0
- package/lib/codegen/init.js +90 -0
- package/lib/codegen/init.js.map +1 -0
- package/lib/codegen/scanner.d.ts +56 -0
- package/lib/codegen/scanner.d.ts.map +1 -0
- package/lib/codegen/scanner.js +484 -0
- package/lib/codegen/scanner.js.map +1 -0
- package/lib/codegen/validate.d.ts +14 -0
- package/lib/codegen/validate.d.ts.map +1 -0
- package/lib/codegen/validate.js +166 -0
- package/lib/codegen/validate.js.map +1 -0
- package/lib/contracts/auth.d.ts +160 -0
- package/lib/contracts/auth.d.ts.map +1 -0
- package/lib/contracts/auth.js +123 -0
- package/lib/contracts/auth.js.map +1 -0
- package/lib/contracts/binding.d.ts +169 -0
- package/lib/contracts/binding.d.ts.map +1 -0
- package/lib/contracts/binding.js +69 -0
- package/lib/contracts/binding.js.map +1 -0
- package/lib/contracts/common.d.ts +23 -0
- package/lib/contracts/common.d.ts.map +1 -0
- package/lib/contracts/common.js +18 -0
- package/lib/contracts/common.js.map +1 -0
- package/lib/contracts/config.d.ts +93 -0
- package/lib/contracts/config.d.ts.map +1 -0
- package/lib/contracts/config.js +62 -0
- package/lib/contracts/config.js.map +1 -0
- package/lib/contracts/controlPlane.d.ts +63 -0
- package/lib/contracts/controlPlane.d.ts.map +1 -0
- package/lib/contracts/controlPlane.js +2 -0
- package/lib/contracts/controlPlane.js.map +1 -0
- package/lib/contracts/json.d.ts +9 -0
- package/lib/contracts/json.d.ts.map +1 -0
- package/lib/contracts/json.js +6 -0
- package/lib/contracts/json.js.map +1 -0
- package/lib/contracts/manifest.d.ts +158 -0
- package/lib/contracts/manifest.d.ts.map +1 -0
- package/lib/contracts/manifest.js +40 -0
- package/lib/contracts/manifest.js.map +1 -0
- package/lib/contracts/observability.d.ts +77 -0
- package/lib/contracts/observability.d.ts.map +1 -0
- package/lib/contracts/observability.js +99 -0
- package/lib/contracts/observability.js.map +1 -0
- package/lib/contracts/platformConfig.d.ts +635 -0
- package/lib/contracts/platformConfig.d.ts.map +1 -0
- package/lib/contracts/platformConfig.js +256 -0
- package/lib/contracts/platformConfig.js.map +1 -0
- package/lib/contracts/registry.d.ts +104 -0
- package/lib/contracts/registry.d.ts.map +1 -0
- package/lib/contracts/registry.js +2 -0
- package/lib/contracts/registry.js.map +1 -0
- package/lib/contracts/route.d.ts +199 -0
- package/lib/contracts/route.d.ts.map +1 -0
- package/lib/contracts/route.js +26 -0
- package/lib/contracts/route.js.map +1 -0
- package/lib/contracts/serviceConfig.d.ts +88 -0
- package/lib/contracts/serviceConfig.d.ts.map +1 -0
- package/lib/contracts/serviceConfig.js +45 -0
- package/lib/contracts/serviceConfig.js.map +1 -0
- package/lib/contracts/streaming.d.ts +76 -0
- package/lib/contracts/streaming.d.ts.map +1 -0
- package/lib/contracts/streaming.js +31 -0
- package/lib/contracts/streaming.js.map +1 -0
- package/lib/contracts/view.d.ts +149 -0
- package/lib/contracts/view.d.ts.map +1 -0
- package/lib/contracts/view.js +82 -0
- package/lib/contracts/view.js.map +1 -0
- package/lib/controlPlane/store.d.ts +24 -0
- package/lib/controlPlane/store.d.ts.map +1 -0
- package/lib/controlPlane/store.js +70 -0
- package/lib/controlPlane/store.js.map +1 -0
- package/lib/controlPlane/sync.d.ts +8 -0
- package/lib/controlPlane/sync.d.ts.map +1 -0
- package/lib/controlPlane/sync.js +24 -0
- package/lib/controlPlane/sync.js.map +1 -0
- package/lib/controlPlane/types.d.ts +15 -0
- package/lib/controlPlane/types.d.ts.map +1 -0
- package/lib/controlPlane/types.js +2 -0
- package/lib/controlPlane/types.js.map +1 -0
- package/lib/index.d.ts +40 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +40 -0
- package/lib/index.js.map +1 -0
- package/lib/runtime/auth/envelope.d.ts +32 -0
- package/lib/runtime/auth/envelope.d.ts.map +1 -0
- package/lib/runtime/auth/envelope.js +123 -0
- package/lib/runtime/auth/envelope.js.map +1 -0
- package/lib/runtime/auth/issuer.d.ts +44 -0
- package/lib/runtime/auth/issuer.d.ts.map +1 -0
- package/lib/runtime/auth/issuer.js +82 -0
- package/lib/runtime/auth/issuer.js.map +1 -0
- package/lib/runtime/auth/jwks.d.ts +7 -0
- package/lib/runtime/auth/jwks.d.ts.map +1 -0
- package/lib/runtime/auth/jwks.js +69 -0
- package/lib/runtime/auth/jwks.js.map +1 -0
- package/lib/runtime/auth/keypair.d.ts +21 -0
- package/lib/runtime/auth/keypair.d.ts.map +1 -0
- package/lib/runtime/auth/keypair.js +50 -0
- package/lib/runtime/auth/keypair.js.map +1 -0
- package/lib/runtime/auth/tokens.d.ts +25 -0
- package/lib/runtime/auth/tokens.d.ts.map +1 -0
- package/lib/runtime/auth/tokens.js +137 -0
- package/lib/runtime/auth/tokens.js.map +1 -0
- package/lib/runtime/auth/verifier.d.ts +45 -0
- package/lib/runtime/auth/verifier.d.ts.map +1 -0
- package/lib/runtime/auth/verifier.js +76 -0
- package/lib/runtime/auth/verifier.js.map +1 -0
- package/lib/runtime/bpHeaders.d.ts +10 -0
- package/lib/runtime/bpHeaders.d.ts.map +1 -0
- package/lib/runtime/bpHeaders.js +53 -0
- package/lib/runtime/bpHeaders.js.map +1 -0
- package/lib/runtime/configProvider.d.ts +41 -0
- package/lib/runtime/configProvider.d.ts.map +1 -0
- package/lib/runtime/configProvider.js +232 -0
- package/lib/runtime/configProvider.js.map +1 -0
- package/lib/runtime/configStore.d.ts +34 -0
- package/lib/runtime/configStore.d.ts.map +1 -0
- package/lib/runtime/configStore.js +197 -0
- package/lib/runtime/configStore.js.map +1 -0
- package/lib/runtime/configTicket.d.ts +49 -0
- package/lib/runtime/configTicket.d.ts.map +1 -0
- package/lib/runtime/configTicket.js +168 -0
- package/lib/runtime/configTicket.js.map +1 -0
- package/lib/runtime/h3.d.ts +28 -0
- package/lib/runtime/h3.d.ts.map +1 -0
- package/lib/runtime/h3.js +199 -0
- package/lib/runtime/h3.js.map +1 -0
- package/lib/runtime/handler.d.ts +55 -0
- package/lib/runtime/handler.d.ts.map +1 -0
- package/lib/runtime/handler.js +51 -0
- package/lib/runtime/handler.js.map +1 -0
- package/lib/runtime/http.d.ts +13 -0
- package/lib/runtime/http.d.ts.map +1 -0
- package/lib/runtime/http.js +114 -0
- package/lib/runtime/http.js.map +1 -0
- package/lib/runtime/jsonSchema.d.ts +4 -0
- package/lib/runtime/jsonSchema.d.ts.map +1 -0
- package/lib/runtime/jsonSchema.js +28 -0
- package/lib/runtime/jsonSchema.js.map +1 -0
- package/lib/runtime/manifest.d.ts +3 -0
- package/lib/runtime/manifest.d.ts.map +1 -0
- package/lib/runtime/manifest.js +5 -0
- package/lib/runtime/manifest.js.map +1 -0
- package/lib/runtime/media.d.ts +20 -0
- package/lib/runtime/media.d.ts.map +1 -0
- package/lib/runtime/media.js +70 -0
- package/lib/runtime/media.js.map +1 -0
- package/lib/runtime/registry.d.ts +67 -0
- package/lib/runtime/registry.d.ts.map +1 -0
- package/lib/runtime/registry.js +290 -0
- package/lib/runtime/registry.js.map +1 -0
- package/lib/runtime/serviceConfig.d.ts +38 -0
- package/lib/runtime/serviceConfig.d.ts.map +1 -0
- package/lib/runtime/serviceConfig.js +152 -0
- package/lib/runtime/serviceConfig.js.map +1 -0
- package/lib/runtime/statusViews.d.ts +23 -0
- package/lib/runtime/statusViews.d.ts.map +1 -0
- package/lib/runtime/statusViews.js +48 -0
- package/lib/runtime/statusViews.js.map +1 -0
- package/lib/runtime/stream.d.ts +41 -0
- package/lib/runtime/stream.d.ts.map +1 -0
- package/lib/runtime/stream.js +92 -0
- package/lib/runtime/stream.js.map +1 -0
- package/lib/runtime/streamHandler.d.ts +48 -0
- package/lib/runtime/streamHandler.d.ts.map +1 -0
- package/lib/runtime/streamHandler.js +49 -0
- package/lib/runtime/streamHandler.js.map +1 -0
- package/lib/runtime/tenantResolution.d.ts +4 -0
- package/lib/runtime/tenantResolution.d.ts.map +1 -0
- package/lib/runtime/tenantResolution.js +19 -0
- package/lib/runtime/tenantResolution.js.map +1 -0
- package/lib/runtime/uuid.d.ts +6 -0
- package/lib/runtime/uuid.d.ts.map +1 -0
- package/lib/runtime/uuid.js +27 -0
- package/lib/runtime/uuid.js.map +1 -0
- package/lib/runtime/view.d.ts +48 -0
- package/lib/runtime/view.d.ts.map +1 -0
- package/lib/runtime/view.js +111 -0
- package/lib/runtime/view.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import { DeploymentModeSchema, HttpMethodSchema, PluginIdSchema, UuidV7Schema } from "./common.js";
|
|
3
|
+
import { AppAuthConfigSchema } from "./auth.js";
|
|
4
|
+
const NonEmptyStringSchema = av.string().minLength(1);
|
|
5
|
+
export const BetterPortalBrandingSchema = av.object({
|
|
6
|
+
brandName: av.optional(NonEmptyStringSchema),
|
|
7
|
+
logoUrl: av.optional(av.string().format("url")),
|
|
8
|
+
primaryColor: av.optional(NonEmptyStringSchema),
|
|
9
|
+
secondaryColor: av.optional(NonEmptyStringSchema)
|
|
10
|
+
}, { unknownKeys: "strip" }).default({});
|
|
11
|
+
export const BetterPortalThemeBootstrapPaletteSchema = av.object({
|
|
12
|
+
primary: av.optional(NonEmptyStringSchema),
|
|
13
|
+
secondary: av.optional(NonEmptyStringSchema),
|
|
14
|
+
success: av.optional(NonEmptyStringSchema),
|
|
15
|
+
info: av.optional(NonEmptyStringSchema),
|
|
16
|
+
warning: av.optional(NonEmptyStringSchema),
|
|
17
|
+
danger: av.optional(NonEmptyStringSchema),
|
|
18
|
+
light: av.optional(NonEmptyStringSchema),
|
|
19
|
+
dark: av.optional(NonEmptyStringSchema)
|
|
20
|
+
}, { unknownKeys: "strip" }).default({});
|
|
21
|
+
export const BetterPortalThemeSurfaceSchema = av.object({
|
|
22
|
+
background: av.optional(NonEmptyStringSchema),
|
|
23
|
+
surface: av.optional(NonEmptyStringSchema),
|
|
24
|
+
surfaceAlt: av.optional(NonEmptyStringSchema),
|
|
25
|
+
text: av.optional(NonEmptyStringSchema),
|
|
26
|
+
textSoft: av.optional(NonEmptyStringSchema),
|
|
27
|
+
border: av.optional(NonEmptyStringSchema),
|
|
28
|
+
accentSoft: av.optional(NonEmptyStringSchema)
|
|
29
|
+
}, { unknownKeys: "strip" }).default({});
|
|
30
|
+
export const BetterPortalThemeConfigSchema = av.object({
|
|
31
|
+
brandName: av.optional(NonEmptyStringSchema),
|
|
32
|
+
mode: av.enum_(["light", "dark", "system"]).default("light"),
|
|
33
|
+
bootstrap: BetterPortalThemeBootstrapPaletteSchema,
|
|
34
|
+
light: BetterPortalThemeSurfaceSchema,
|
|
35
|
+
dark: BetterPortalThemeSurfaceSchema
|
|
36
|
+
}, { unknownKeys: "strip" }).default({
|
|
37
|
+
mode: "light",
|
|
38
|
+
bootstrap: {},
|
|
39
|
+
light: {},
|
|
40
|
+
dark: {}
|
|
41
|
+
});
|
|
42
|
+
// -- Service registration (per-tenant owned) -------------------------
|
|
43
|
+
export const TenantServiceRegistrationSchema = av.object({
|
|
44
|
+
id: UuidV7Schema,
|
|
45
|
+
hostname: av.string().format("url"),
|
|
46
|
+
apiKeyHash: av.string().default(""),
|
|
47
|
+
publicKeyPem: av.optional(NonEmptyStringSchema),
|
|
48
|
+
keyId: av.optional(NonEmptyStringSchema),
|
|
49
|
+
serviceId: av.optional(PluginIdSchema),
|
|
50
|
+
capabilities: av.array(NonEmptyStringSchema).default([]),
|
|
51
|
+
title: av.optional(NonEmptyStringSchema),
|
|
52
|
+
description: av.optional(NonEmptyStringSchema),
|
|
53
|
+
deploymentMode: DeploymentModeSchema.default("self-hosted"),
|
|
54
|
+
createdAt: av.string().format("date-time"),
|
|
55
|
+
lastSeenAt: av.optional(av.string().format("date-time")),
|
|
56
|
+
enabled: av.bool().default(true)
|
|
57
|
+
}, { unknownKeys: "strip" });
|
|
58
|
+
export const BetterPortalAppShellSchema = av.object({
|
|
59
|
+
serviceId: UuidV7Schema
|
|
60
|
+
}, { unknownKeys: "strip" });
|
|
61
|
+
// -- Platform service (BP-hosted marketplace) -------------------------
|
|
62
|
+
export const PlatformServiceSchema = av.object({
|
|
63
|
+
id: UuidV7Schema,
|
|
64
|
+
hostname: av.string().format("url"),
|
|
65
|
+
apiKeyHash: av.string().default(""),
|
|
66
|
+
publicKeyPem: av.optional(NonEmptyStringSchema),
|
|
67
|
+
keyId: av.optional(NonEmptyStringSchema),
|
|
68
|
+
serviceId: av.optional(PluginIdSchema),
|
|
69
|
+
capabilities: av.array(NonEmptyStringSchema).default([]),
|
|
70
|
+
title: NonEmptyStringSchema,
|
|
71
|
+
description: av.optional(NonEmptyStringSchema),
|
|
72
|
+
category: av.optional(NonEmptyStringSchema),
|
|
73
|
+
createdAt: av.string().format("date-time"),
|
|
74
|
+
enabled: av.bool().default(true)
|
|
75
|
+
}, { unknownKeys: "strip" });
|
|
76
|
+
// -- Tenant -----------------------------------------------------------
|
|
77
|
+
export const BetterPortalTenantSchema = av.object({
|
|
78
|
+
id: UuidV7Schema,
|
|
79
|
+
slug: NonEmptyStringSchema,
|
|
80
|
+
title: NonEmptyStringSchema,
|
|
81
|
+
active: av.bool().default(true),
|
|
82
|
+
branding: BetterPortalBrandingSchema,
|
|
83
|
+
services: av.array(TenantServiceRegistrationSchema).default([]),
|
|
84
|
+
activatedPlatformServices: av.array(UuidV7Schema).default([])
|
|
85
|
+
}, { unknownKeys: "strip" });
|
|
86
|
+
export const BetterPortalRouteChromeValueSchema = av.union([av.string(), av.number(), av.bool()]);
|
|
87
|
+
export const BetterPortalRouteChromeSchema = av.intersection([
|
|
88
|
+
av.object({
|
|
89
|
+
hideMenu: av.optional(av.bool()),
|
|
90
|
+
hideHeader: av.optional(av.bool()),
|
|
91
|
+
hideFooter: av.optional(av.bool()),
|
|
92
|
+
fullScreen: av.optional(av.bool())
|
|
93
|
+
}, { unknownKeys: "allow" }),
|
|
94
|
+
av.record(BetterPortalRouteChromeValueSchema)
|
|
95
|
+
]);
|
|
96
|
+
export const BetterPortalRouteMountSchema = av.object({
|
|
97
|
+
id: UuidV7Schema,
|
|
98
|
+
path: NonEmptyStringSchema,
|
|
99
|
+
serviceId: UuidV7Schema,
|
|
100
|
+
viewId: NonEmptyStringSchema,
|
|
101
|
+
/** @deprecated Use resolvedServicePath (CP-injected). Kept one release for migration. */
|
|
102
|
+
targetPath: av.optional(NonEmptyStringSchema),
|
|
103
|
+
/** Service path resolved by control plane from manifest cache. Injected on sync delivery. */
|
|
104
|
+
resolvedServicePath: av.optional(NonEmptyStringSchema),
|
|
105
|
+
/** Optional query string appended to service request. */
|
|
106
|
+
query: av.optional(av.string()),
|
|
107
|
+
title: av.optional(NonEmptyStringSchema),
|
|
108
|
+
icon: av.optional(NonEmptyStringSchema),
|
|
109
|
+
enabled: av.bool().default(true),
|
|
110
|
+
methods: av.array(HttpMethodSchema).minItems(1).default(["GET"]),
|
|
111
|
+
chrome: av.optional(BetterPortalRouteChromeSchema)
|
|
112
|
+
}, { unknownKeys: "strip" });
|
|
113
|
+
// -- Menu (separate from routes) --------------------------------------
|
|
114
|
+
export const BetterPortalMenuItemSchema = av.object({
|
|
115
|
+
id: UuidV7Schema,
|
|
116
|
+
type: av.enum_(["link", "group", "section", "divider", "external"]).default("link"),
|
|
117
|
+
title: av.optional(NonEmptyStringSchema),
|
|
118
|
+
icon: av.optional(NonEmptyStringSchema),
|
|
119
|
+
routeId: av.optional(UuidV7Schema),
|
|
120
|
+
href: av.optional(av.string()),
|
|
121
|
+
enabled: av.bool().default(true),
|
|
122
|
+
defaultExpanded: av.optional(av.bool()),
|
|
123
|
+
children: av.array(av.any()).default([])
|
|
124
|
+
}, { unknownKeys: "strip" });
|
|
125
|
+
export const BetterPortalSlotAssignmentSchema = av.object({
|
|
126
|
+
slotId: NonEmptyStringSchema,
|
|
127
|
+
serviceId: UuidV7Schema,
|
|
128
|
+
viewId: NonEmptyStringSchema,
|
|
129
|
+
renderer: av.optional(NonEmptyStringSchema),
|
|
130
|
+
enabled: av.bool().default(true)
|
|
131
|
+
}, { unknownKeys: "strip" });
|
|
132
|
+
export const BetterPortalFragmentAssignmentSchema = av.object({
|
|
133
|
+
serviceId: UuidV7Schema,
|
|
134
|
+
fragmentId: NonEmptyStringSchema,
|
|
135
|
+
targetPath: NonEmptyStringSchema,
|
|
136
|
+
enabled: av.bool().default(true)
|
|
137
|
+
}, { unknownKeys: "strip" });
|
|
138
|
+
export const BetterPortalAppSchema = av.object({
|
|
139
|
+
id: UuidV7Schema,
|
|
140
|
+
tenantId: UuidV7Schema,
|
|
141
|
+
slug: NonEmptyStringSchema,
|
|
142
|
+
title: NonEmptyStringSchema,
|
|
143
|
+
hostnames: av.array(NonEmptyStringSchema).minItems(1),
|
|
144
|
+
originOverrides: av.array(av.string().format("url")).default([]),
|
|
145
|
+
refererOverrides: av.array(av.string().format("url")).default([]),
|
|
146
|
+
shell: av.optional(BetterPortalAppShellSchema),
|
|
147
|
+
themeId: av.optional(NonEmptyStringSchema),
|
|
148
|
+
themeConfig: BetterPortalThemeConfigSchema,
|
|
149
|
+
layoutId: av.optional(NonEmptyStringSchema),
|
|
150
|
+
defaultRoute: NonEmptyStringSchema.default("/"),
|
|
151
|
+
routes: av.array(BetterPortalRouteMountSchema).default([]),
|
|
152
|
+
menu: av.array(BetterPortalMenuItemSchema).default([]),
|
|
153
|
+
slots: av.array(BetterPortalSlotAssignmentSchema).default([]),
|
|
154
|
+
fragments: av.record(av.array(BetterPortalFragmentAssignmentSchema)).default({}),
|
|
155
|
+
auth: av.optional(AppAuthConfigSchema),
|
|
156
|
+
statusViewIds: av.optional(av.record(NonEmptyStringSchema))
|
|
157
|
+
}, { unknownKeys: "strip" });
|
|
158
|
+
export const BetterPortalConfigManagementAuthSchema = av.object({
|
|
159
|
+
mechanism: av.enum_(["none", "dev-token", "jwt", "oidc"]).default("none"),
|
|
160
|
+
issuer: av.optional(NonEmptyStringSchema),
|
|
161
|
+
audience: av.optional(NonEmptyStringSchema),
|
|
162
|
+
requiredPermissions: av.array(NonEmptyStringSchema).default([])
|
|
163
|
+
}, { unknownKeys: "strip" }).default({
|
|
164
|
+
mechanism: "none",
|
|
165
|
+
requiredPermissions: []
|
|
166
|
+
});
|
|
167
|
+
export const BetterPortalConfigManagementSchema = av.object({
|
|
168
|
+
adminTenantId: av.optional(NonEmptyStringSchema),
|
|
169
|
+
managementAppId: av.optional(NonEmptyStringSchema),
|
|
170
|
+
auth: BetterPortalConfigManagementAuthSchema
|
|
171
|
+
}, { unknownKeys: "strip" }).default({
|
|
172
|
+
auth: {
|
|
173
|
+
mechanism: "none",
|
|
174
|
+
requiredPermissions: []
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
// -- Shared service catalog (BP-curated + 3rd-party marketplace) -----
|
|
178
|
+
export const SharedServiceDefinitionSchema = av.object({
|
|
179
|
+
id: NonEmptyStringSchema,
|
|
180
|
+
serviceId: av.optional(PluginIdSchema),
|
|
181
|
+
title: NonEmptyStringSchema,
|
|
182
|
+
description: av.optional(av.string()),
|
|
183
|
+
logoUrl: av.optional(av.string().format("url")),
|
|
184
|
+
baseUrl: av.string().format("url"),
|
|
185
|
+
apiKeyHash: av.string().default(""),
|
|
186
|
+
publicKeyPem: av.optional(NonEmptyStringSchema),
|
|
187
|
+
keyId: av.optional(NonEmptyStringSchema),
|
|
188
|
+
supportedDeploymentModes: av.array(DeploymentModeSchema).default([]),
|
|
189
|
+
owner: av.enum_(["bp", "3p"]).default("bp"),
|
|
190
|
+
upgradeUrlTemplate: av.optional(av.string()),
|
|
191
|
+
category: av.optional(NonEmptyStringSchema),
|
|
192
|
+
tags: av.array(NonEmptyStringSchema).default([]),
|
|
193
|
+
pricingHint: av.optional(av.enum_(["free", "freemium", "paid"])),
|
|
194
|
+
publishedAt: av.optional(av.string().format("date-time")),
|
|
195
|
+
enabled: av.bool().default(true)
|
|
196
|
+
}, { unknownKeys: "strip" });
|
|
197
|
+
export const TenantSharedServiceActivationSchema = av.object({
|
|
198
|
+
id: UuidV7Schema,
|
|
199
|
+
tenantId: NonEmptyStringSchema,
|
|
200
|
+
appId: av.optional(NonEmptyStringSchema),
|
|
201
|
+
sharedServiceId: NonEmptyStringSchema,
|
|
202
|
+
activatedAt: av.string().format("date-time"),
|
|
203
|
+
enabled: av.bool().default(true)
|
|
204
|
+
}, { unknownKeys: "strip" });
|
|
205
|
+
// -- Manifest cache (CP-side per spec section P8) --------------------
|
|
206
|
+
export const ServiceManifestCacheEntrySchema = av.object({
|
|
207
|
+
serviceId: NonEmptyStringSchema,
|
|
208
|
+
manifestVersion: NonEmptyStringSchema,
|
|
209
|
+
fetchedAt: av.string().format("date-time"),
|
|
210
|
+
viewIndex: av.record(av.object({
|
|
211
|
+
viewId: NonEmptyStringSchema,
|
|
212
|
+
path: NonEmptyStringSchema,
|
|
213
|
+
methods: av.array(NonEmptyStringSchema).default([]),
|
|
214
|
+
role: av.optional(NonEmptyStringSchema),
|
|
215
|
+
chrome: av.optional(BetterPortalRouteChromeSchema),
|
|
216
|
+
dependencies: av.array(NonEmptyStringSchema).default([]),
|
|
217
|
+
permissions: av.array(av.object({
|
|
218
|
+
serviceId: NonEmptyStringSchema,
|
|
219
|
+
viewId: NonEmptyStringSchema,
|
|
220
|
+
permissions: av.array(NonEmptyStringSchema).default([])
|
|
221
|
+
}, { unknownKeys: "strip" })).default([]),
|
|
222
|
+
renderable: av.bool().default(true),
|
|
223
|
+
schemas: av.optional(av.record(av.any())),
|
|
224
|
+
raw: av.optional(av.bool()),
|
|
225
|
+
demoScenarios: av.array(av.any()).default([])
|
|
226
|
+
}, { unknownKeys: "strip" })).default({})
|
|
227
|
+
}, { unknownKeys: "strip" });
|
|
228
|
+
export const WebhookTargetSchema = av.object({
|
|
229
|
+
id: UuidV7Schema,
|
|
230
|
+
tenantId: NonEmptyStringSchema,
|
|
231
|
+
appId: av.optional(NonEmptyStringSchema),
|
|
232
|
+
serviceId: NonEmptyStringSchema,
|
|
233
|
+
eventId: NonEmptyStringSchema,
|
|
234
|
+
url: av.string().format("url"),
|
|
235
|
+
secret: NonEmptyStringSchema,
|
|
236
|
+
createdAt: av.string().format("date-time"),
|
|
237
|
+
enabled: av.bool().default(true),
|
|
238
|
+
maxAttempts: av.int().min(1).max(20).default(10)
|
|
239
|
+
}, { unknownKeys: "strip" });
|
|
240
|
+
export const BetterPortalConfigSchema = av.object({
|
|
241
|
+
configManagement: BetterPortalConfigManagementSchema,
|
|
242
|
+
platformServices: av.array(PlatformServiceSchema).default([]),
|
|
243
|
+
tenants: av.array(BetterPortalTenantSchema).default([]),
|
|
244
|
+
apps: av.array(BetterPortalAppSchema).default([]),
|
|
245
|
+
sharedServiceCatalog: av.array(SharedServiceDefinitionSchema).default([]),
|
|
246
|
+
sharedServiceActivations: av.array(TenantSharedServiceActivationSchema).default([]),
|
|
247
|
+
manifestCache: av.array(ServiceManifestCacheEntrySchema).default([]),
|
|
248
|
+
webhooks: av.object({
|
|
249
|
+
targets: av.array(WebhookTargetSchema).default([])
|
|
250
|
+
}, { unknownKeys: "strip" }).default({ targets: [] })
|
|
251
|
+
}, { unknownKeys: "strip" });
|
|
252
|
+
export const BetterPortalOriginPolicySchema = av.object({
|
|
253
|
+
allowedOrigins: av.array(av.string().format("url")).default([]),
|
|
254
|
+
allowedReferers: av.array(av.string().format("url")).default([])
|
|
255
|
+
}, { unknownKeys: "strip" });
|
|
256
|
+
//# sourceMappingURL=platformConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformConfig.js","sourceRoot":"","sources":["../../src/contracts/platformConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { BaseSchema } from "anyvali";
|
|
2
|
+
import type { HttpMethod } from "./common.js";
|
|
3
|
+
import type { CacheHints } from "./view.js";
|
|
4
|
+
import type { ApiAuthRequirement, DemoScenario, RawRouteHandler, RouteHandler, SSEHandler } from "./route.js";
|
|
5
|
+
import type { BetterPortalRouteChrome } from "./platformConfig.js";
|
|
6
|
+
import type { BpStreamHandler, StreamRendererSet } from "./streaming.js";
|
|
7
|
+
import type { HtmlRenderable } from "../runtime/view.js";
|
|
8
|
+
/** Type of view renderer within a _theme.* directory. */
|
|
9
|
+
export type ThemeRendererType = "page" | "component" | "fragment";
|
|
10
|
+
/** A single theme renderer - page, component, or fragment. */
|
|
11
|
+
export interface RegisteredThemeRenderer {
|
|
12
|
+
readonly rendererId: string;
|
|
13
|
+
readonly type: ThemeRendererType;
|
|
14
|
+
/** HTTP method restriction (e.g., from index.GET.tsx). Undefined = all methods. */
|
|
15
|
+
readonly method?: HttpMethod;
|
|
16
|
+
/** Fragment location (e.g., "nav" from _nav.profile.tsx). Only for fragments. */
|
|
17
|
+
readonly fragmentLocation?: string;
|
|
18
|
+
/** Fragment id (e.g., "profile" from _nav.profile.tsx). Only for fragments. */
|
|
19
|
+
readonly fragmentId?: string;
|
|
20
|
+
/** The render function exported by the theme file. */
|
|
21
|
+
readonly render: (data: any) => HtmlRenderable;
|
|
22
|
+
/**
|
|
23
|
+
* SSE tick renderer - fragments only.
|
|
24
|
+
* Sourced from `_<location>.<fragmentId>.sse.tsx`'s `renderTick` export.
|
|
25
|
+
* Called once per SSE data item yielded by the route's `handleSSE` generator.
|
|
26
|
+
*/
|
|
27
|
+
readonly sseRender?: (data: any) => HtmlRenderable;
|
|
28
|
+
}
|
|
29
|
+
/** All renderers for a single theme within a route. */
|
|
30
|
+
export interface ThemeRendererSet {
|
|
31
|
+
readonly pages: ReadonlyArray<RegisteredThemeRenderer>;
|
|
32
|
+
readonly components: ReadonlyArray<RegisteredThemeRenderer>;
|
|
33
|
+
readonly fragments: ReadonlyArray<RegisteredThemeRenderer>;
|
|
34
|
+
/**
|
|
35
|
+
* Streaming-view frame renderers, sourced from `index.stream.tsx`.
|
|
36
|
+
* Present only on routes whose handler is a `createStreamHandler` stream.
|
|
37
|
+
*/
|
|
38
|
+
readonly stream?: StreamRendererSet;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Status-specific renderers grouped by kind.
|
|
42
|
+
* `page` is single; `component` and `fragment` are keyed by id / location.id so the adapter
|
|
43
|
+
* can match the originally requested renderer (e.g. fragment `nav.profile`).
|
|
44
|
+
*/
|
|
45
|
+
export interface StatusRenderersByKind {
|
|
46
|
+
readonly page?: RegisteredThemeRenderer;
|
|
47
|
+
readonly components?: Readonly<Record<string, RegisteredThemeRenderer>>;
|
|
48
|
+
readonly fragments?: Readonly<Record<string, RegisteredThemeRenderer>>;
|
|
49
|
+
}
|
|
50
|
+
/** Schema references for a route - all optional except response. */
|
|
51
|
+
export interface RouteSchemas {
|
|
52
|
+
readonly response?: BaseSchema<unknown, unknown>;
|
|
53
|
+
readonly query?: BaseSchema<unknown, unknown>;
|
|
54
|
+
readonly headers?: BaseSchema<unknown, unknown>;
|
|
55
|
+
readonly request?: BaseSchema<unknown, unknown>;
|
|
56
|
+
readonly multipart?: BaseSchema<unknown, unknown>;
|
|
57
|
+
/** Streaming views: per-frame item payload schema (canonical contract). */
|
|
58
|
+
readonly item?: BaseSchema<unknown, unknown>;
|
|
59
|
+
/** Streaming views: end-of-stream summary payload schema. */
|
|
60
|
+
readonly summary?: BaseSchema<unknown, unknown>;
|
|
61
|
+
}
|
|
62
|
+
/** A fully resolved route from the registry. */
|
|
63
|
+
export interface RegisteredRoute {
|
|
64
|
+
readonly viewId: string;
|
|
65
|
+
/** HTTP path derived from filesystem (e.g., "/users/:userId"). */
|
|
66
|
+
readonly path: string;
|
|
67
|
+
/** HTTP methods derived from handler exports (e.g., ["GET", "POST"]). */
|
|
68
|
+
readonly methods: ReadonlyArray<HttpMethod>;
|
|
69
|
+
/** Parameter names derived from [param] directory names. */
|
|
70
|
+
readonly paramNames: ReadonlyArray<string>;
|
|
71
|
+
readonly schemas: RouteSchemas;
|
|
72
|
+
/** Handler functions keyed by HTTP method. Streaming routes register a branded BpStreamHandler object instead of a function. */
|
|
73
|
+
readonly handlers: Readonly<Partial<Record<HttpMethod, RouteHandler<any, any, any, any, any, any, any> | RawRouteHandler<any, any, any, any, any, any> | BpStreamHandler<any, any, any, any, any>>>>;
|
|
74
|
+
readonly raw?: boolean;
|
|
75
|
+
readonly title: string;
|
|
76
|
+
readonly description: string;
|
|
77
|
+
readonly auth: ApiAuthRequirement;
|
|
78
|
+
/** Optional view role hint (e.g., "auth.login"). Used by discovery flows. */
|
|
79
|
+
readonly role?: string;
|
|
80
|
+
/** ViewIds that should be mounted with this view for API/detail flows. */
|
|
81
|
+
readonly dependencies?: ReadonlyArray<string>;
|
|
82
|
+
/** Optional shell chrome hints declared by the service route. */
|
|
83
|
+
readonly chrome?: BetterPortalRouteChrome;
|
|
84
|
+
/**
|
|
85
|
+
* Status code -> renderer map (per theme), broken down by renderer kind.
|
|
86
|
+
* Adapter looks up by (themeId, statusCode, kind, optional rendererKey).
|
|
87
|
+
*/
|
|
88
|
+
readonly statusRenderers?: Readonly<Record<string, Readonly<Record<number, StatusRenderersByKind>>>>;
|
|
89
|
+
readonly cacheHints: CacheHints;
|
|
90
|
+
readonly demoScenarios: ReadonlyArray<DemoScenario>;
|
|
91
|
+
/** Theme renderers keyed by themeId. */
|
|
92
|
+
readonly themeRenderers: Readonly<Record<string, ThemeRendererSet>>;
|
|
93
|
+
/** SSE handler, registered at `{path}/__sse`. */
|
|
94
|
+
readonly sse?: {
|
|
95
|
+
readonly handler: SSEHandler;
|
|
96
|
+
/** Optional schema validating each tick yielded by the generator handler. */
|
|
97
|
+
readonly tickSchema?: BaseSchema<unknown, unknown>;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** The complete compiled registry - output of codegen. */
|
|
101
|
+
export interface BetterPortalRegistry {
|
|
102
|
+
readonly routes: ReadonlyArray<RegisteredRoute>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/contracts/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/contracts/registry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import type { Infer } from "anyvali";
|
|
3
|
+
import type { HttpMethod } from "./common.js";
|
|
4
|
+
import type { JsonValue } from "./json.js";
|
|
5
|
+
import type { BetterPortalObservability } from "./observability.js";
|
|
6
|
+
import type { BetterPortalApp, BetterPortalTenant } from "./platformConfig.js";
|
|
7
|
+
import { type JwtClaims } from "./auth.js";
|
|
8
|
+
/**
|
|
9
|
+
* Route-level (API-layer) auth requirement. Replaces ViewAuthRequirement at the API tier.
|
|
10
|
+
* Routes declare this to opt into framework-enforced authentication and authorization.
|
|
11
|
+
* Per spec section 0.5, validation runs in 8 steps before the handler is invoked.
|
|
12
|
+
*/
|
|
13
|
+
export declare const ApiAuthRequirementSchema: av.ObjectSchema<{
|
|
14
|
+
required: av.BoolSchema;
|
|
15
|
+
permissions: av.ArraySchema<av.ObjectSchema<{
|
|
16
|
+
serviceId: av.StringSchema;
|
|
17
|
+
viewId: av.StringSchema;
|
|
18
|
+
permissions: av.ArraySchema<av.EnumSchema<readonly ["read", "create", "update", "delete"]>>;
|
|
19
|
+
}>>;
|
|
20
|
+
}>;
|
|
21
|
+
export type ApiAuthRequirement = Infer<typeof ApiAuthRequirementSchema>;
|
|
22
|
+
/**
|
|
23
|
+
* Interface the adapter uses to verify JWTs. Framework does not depend on a particular
|
|
24
|
+
* verifier impl - services or plugin-bsb inject one based on app.auth config.
|
|
25
|
+
*/
|
|
26
|
+
export interface JwtVerifier {
|
|
27
|
+
verify(token: string, context: {
|
|
28
|
+
tenantId: string;
|
|
29
|
+
appId: string;
|
|
30
|
+
}): Promise<JwtClaims>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validated user claims attached to the handler context when auth succeeds.
|
|
34
|
+
* Either fully populated or `undefined` - never partial.
|
|
35
|
+
*/
|
|
36
|
+
export type ValidatedUserClaims = JwtClaims;
|
|
37
|
+
/**
|
|
38
|
+
* BP-managed header API on the handler context. Headers set here are emitted as
|
|
39
|
+
* BP-SetHeader / BP-RemoveHeader response headers and stored by the client BP shim.
|
|
40
|
+
*/
|
|
41
|
+
export interface BpHeadersApi {
|
|
42
|
+
set(name: string, value: string, options?: BpHeaderSetOptions): void;
|
|
43
|
+
remove(name: string): void;
|
|
44
|
+
}
|
|
45
|
+
export interface BpHeaderSetOptions {
|
|
46
|
+
/** Only the setting service may overwrite or remove. */
|
|
47
|
+
locked?: boolean;
|
|
48
|
+
/** Header only attached to subsequent requests to the service that set it. Default global. */
|
|
49
|
+
scopeToOwner?: boolean;
|
|
50
|
+
/** @deprecated Use scopeToOwner. Explicit cross-service header scope is not supported. */
|
|
51
|
+
scopeServiceId?: string;
|
|
52
|
+
/** Auto-remove on client after this many seconds. */
|
|
53
|
+
expiresInSeconds?: number;
|
|
54
|
+
/** Service-relative or absolute URL the shell may POST before expiry to refresh this header. */
|
|
55
|
+
refreshPath?: string;
|
|
56
|
+
/** Refresh this many seconds before expiry. Defaults to shell policy. */
|
|
57
|
+
refreshBeforeSeconds?: number;
|
|
58
|
+
}
|
|
59
|
+
export type RawResponseBody = BodyInit | null;
|
|
60
|
+
export interface FileResponseOptions {
|
|
61
|
+
filename?: string;
|
|
62
|
+
contentType?: string;
|
|
63
|
+
size?: number;
|
|
64
|
+
disposition?: "attachment" | "inline";
|
|
65
|
+
headers?: HeadersInit;
|
|
66
|
+
status?: number;
|
|
67
|
+
}
|
|
68
|
+
export interface UploadedFile {
|
|
69
|
+
fieldName: string;
|
|
70
|
+
filename: string;
|
|
71
|
+
contentType: string;
|
|
72
|
+
size: number;
|
|
73
|
+
data: Uint8Array;
|
|
74
|
+
}
|
|
75
|
+
export interface MultipartRequest {
|
|
76
|
+
fields: Record<string, string | string[]>;
|
|
77
|
+
files: Record<string, UploadedFile | UploadedFile[]>;
|
|
78
|
+
}
|
|
79
|
+
export interface RouteUrlOptions {
|
|
80
|
+
/** Defaults to this handler's service id. Accepts either plugin id or service-instance UUID. */
|
|
81
|
+
serviceId?: string;
|
|
82
|
+
params?: Record<string, string | number | boolean | null | undefined>;
|
|
83
|
+
query?: Record<string, string | number | boolean | null | undefined>;
|
|
84
|
+
/** Defaults to false, returning a root-relative path. */
|
|
85
|
+
absolute?: boolean;
|
|
86
|
+
/** Overrides the resolved origin when absolute is true. */
|
|
87
|
+
origin?: string;
|
|
88
|
+
}
|
|
89
|
+
export interface WebhookEmitOptions {
|
|
90
|
+
tenantId?: string;
|
|
91
|
+
appId?: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Context provided to a route handler.
|
|
95
|
+
* TParams is auto-generated from [param] directory names - never hand-written.
|
|
96
|
+
*/
|
|
97
|
+
export interface RouteHandlerContext<TParams = Record<string, string>, TQuery = Record<string, unknown>, THeaders = Record<string, string>, TRequest = Record<string, unknown>, TPlugin = unknown, TServiceConfig = Record<string, unknown>> {
|
|
98
|
+
readonly params: TParams;
|
|
99
|
+
readonly query: TQuery;
|
|
100
|
+
readonly headers: THeaders;
|
|
101
|
+
readonly request: TRequest;
|
|
102
|
+
readonly multipart?: MultipartRequest;
|
|
103
|
+
readonly method: HttpMethod;
|
|
104
|
+
readonly path: string;
|
|
105
|
+
readonly rawEvent?: unknown;
|
|
106
|
+
readonly obs?: BetterPortalObservability;
|
|
107
|
+
/** Validated user claims when auth resolver succeeds. `undefined` for anonymous or invalid token. */
|
|
108
|
+
readonly user?: ValidatedUserClaims;
|
|
109
|
+
/** Resolved tenant for this request. Handlers are not invoked without it. */
|
|
110
|
+
readonly tenant: BetterPortalTenant;
|
|
111
|
+
/** Resolved app for this request. Handlers are not invoked without it. */
|
|
112
|
+
readonly app: BetterPortalApp;
|
|
113
|
+
/** Effective service config for this tenant/app: tenant defaults overridden by app config. */
|
|
114
|
+
readonly config?: TServiceConfig;
|
|
115
|
+
/** Direct plugin/service instance that owns this route. */
|
|
116
|
+
readonly plugin?: TPlugin;
|
|
117
|
+
/** Optional response model injected by services before generated view handlers run. */
|
|
118
|
+
readonly responseModel?: unknown;
|
|
119
|
+
/** BP-managed response header API. Always present when adapter wires it. */
|
|
120
|
+
readonly bpHeaders?: BpHeadersApi;
|
|
121
|
+
/** Response headers for HTMX/native headers without raw event reach-through. */
|
|
122
|
+
readonly responseHeaders?: Headers;
|
|
123
|
+
/** Set HTTP status without raw event reach-through. */
|
|
124
|
+
readonly setStatus?: (status: number) => void;
|
|
125
|
+
/** The service id this handler belongs to. Always present when adapter wires it. */
|
|
126
|
+
readonly serviceId?: string;
|
|
127
|
+
/** Build a service-facing URL for a registered view id. */
|
|
128
|
+
readonly routeUrl?: (viewId: string, options?: RouteUrlOptions) => string | null;
|
|
129
|
+
/** Build an app/UI-facing URL for a mounted route by view id. */
|
|
130
|
+
readonly uiRouteUrl?: (viewId: string, options?: RouteUrlOptions) => string | null;
|
|
131
|
+
/** Emit a dev-declared webhook event through the control plane. */
|
|
132
|
+
readonly webhook?: (eventId: string, payload: JsonValue, options?: WebhookEmitOptions) => Promise<void>;
|
|
133
|
+
readonly response: (body?: RawResponseBody, init?: ResponseInit) => Response;
|
|
134
|
+
readonly file: (body: RawResponseBody, options?: FileResponseOptions) => Response;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A route handler function. Return type is the response data.
|
|
138
|
+
*/
|
|
139
|
+
export type RouteHandler<TParams = Record<string, string>, TQuery = Record<string, unknown>, THeaders = Record<string, string>, TRequest = Record<string, unknown>, TResponse = unknown, TPlugin = unknown, TServiceConfig = Record<string, unknown>> = (ctx: RouteHandlerContext<TParams, TQuery, THeaders, TRequest, TPlugin, TServiceConfig>) => TResponse | Promise<TResponse>;
|
|
140
|
+
export type RawRouteHandler<TParams = Record<string, string>, TQuery = Record<string, unknown>, THeaders = Record<string, string>, TRequest = Record<string, unknown>, TPlugin = unknown, TServiceConfig = Record<string, unknown>> = ((ctx: RouteHandlerContext<TParams, TQuery, THeaders, TRequest, TPlugin, TServiceConfig>) => Response | Promise<Response>) & {
|
|
141
|
+
readonly __bpRawHandler: true;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Match criteria for demo scenarios - used to match incoming request data
|
|
145
|
+
* against a scenario for preview/testing.
|
|
146
|
+
*/
|
|
147
|
+
export interface DemoScenarioMatch {
|
|
148
|
+
readonly query?: Record<string, unknown>;
|
|
149
|
+
readonly params?: Record<string, unknown>;
|
|
150
|
+
readonly headers?: Record<string, string>;
|
|
151
|
+
readonly request?: Record<string, unknown>;
|
|
152
|
+
}
|
|
153
|
+
export declare const DemoScenarioMatchSchema: av.ObjectSchema<{
|
|
154
|
+
query: av.OptionalSchema<av.RecordSchema<av.AnySchema>>;
|
|
155
|
+
params: av.OptionalSchema<av.RecordSchema<av.AnySchema>>;
|
|
156
|
+
headers: av.OptionalSchema<av.RecordSchema<av.StringSchema>>;
|
|
157
|
+
request: av.OptionalSchema<av.RecordSchema<av.AnySchema>>;
|
|
158
|
+
}>;
|
|
159
|
+
/**
|
|
160
|
+
* A demo scenario for a route - includes optional match criteria
|
|
161
|
+
* and the expected response data.
|
|
162
|
+
*/
|
|
163
|
+
export interface DemoScenario<TResponse = unknown> {
|
|
164
|
+
readonly id: string;
|
|
165
|
+
readonly title: string;
|
|
166
|
+
readonly description?: string;
|
|
167
|
+
readonly match?: DemoScenarioMatch;
|
|
168
|
+
readonly response: TResponse;
|
|
169
|
+
}
|
|
170
|
+
export declare const DemoScenarioSchema: av.ObjectSchema<{
|
|
171
|
+
id: av.StringSchema;
|
|
172
|
+
title: av.StringSchema;
|
|
173
|
+
description: av.OptionalSchema<av.StringSchema>;
|
|
174
|
+
match: av.OptionalSchema<av.ObjectSchema<{
|
|
175
|
+
query: av.OptionalSchema<av.RecordSchema<av.AnySchema>>;
|
|
176
|
+
params: av.OptionalSchema<av.RecordSchema<av.AnySchema>>;
|
|
177
|
+
headers: av.OptionalSchema<av.RecordSchema<av.StringSchema>>;
|
|
178
|
+
request: av.OptionalSchema<av.RecordSchema<av.AnySchema>>;
|
|
179
|
+
}>>;
|
|
180
|
+
response: av.AnySchema;
|
|
181
|
+
}>;
|
|
182
|
+
export type DemoScenarioInferred = Infer<typeof DemoScenarioSchema>;
|
|
183
|
+
export interface SSEHandlerContext {
|
|
184
|
+
readonly event: unknown;
|
|
185
|
+
readonly params: Record<string, string>;
|
|
186
|
+
readonly query: Record<string, unknown>;
|
|
187
|
+
readonly obs?: BetterPortalObservability;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Two supported handler shapes:
|
|
191
|
+
* - Legacy: returns BodyInit (e.g., from `createEventStream(event).send()`).
|
|
192
|
+
* Handler manages stream lifecycle directly. Cannot be themed.
|
|
193
|
+
* - Generator: returns AsyncIterable of data items. Framework drives the
|
|
194
|
+
* stream, validates each item (if `tickSchema` exported), and
|
|
195
|
+
* applies theme-specific `renderTick` when `?_f=loc.frag` is
|
|
196
|
+
* present on the request.
|
|
197
|
+
*/
|
|
198
|
+
export type SSEHandler = ((ctx: SSEHandlerContext) => Promise<BodyInit> | BodyInit) | ((ctx: SSEHandlerContext) => AsyncIterable<unknown>);
|
|
199
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/contracts/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import { AppAuthPermissionGrantSchema } from "./auth.js";
|
|
3
|
+
/**
|
|
4
|
+
* Route-level (API-layer) auth requirement. Replaces ViewAuthRequirement at the API tier.
|
|
5
|
+
* Routes declare this to opt into framework-enforced authentication and authorization.
|
|
6
|
+
* Per spec section 0.5, validation runs in 8 steps before the handler is invoked.
|
|
7
|
+
*/
|
|
8
|
+
export const ApiAuthRequirementSchema = av.object({
|
|
9
|
+
required: av.bool().default(false),
|
|
10
|
+
permissions: av.array(AppAuthPermissionGrantSchema).default([])
|
|
11
|
+
}, { unknownKeys: "strip" });
|
|
12
|
+
const NonEmptyStringSchema = av.string().minLength(1);
|
|
13
|
+
export const DemoScenarioMatchSchema = av.object({
|
|
14
|
+
query: av.optional(av.record(av.any())),
|
|
15
|
+
params: av.optional(av.record(av.any())),
|
|
16
|
+
headers: av.optional(av.record(av.string())),
|
|
17
|
+
request: av.optional(av.record(av.any()))
|
|
18
|
+
}, { unknownKeys: "strip" });
|
|
19
|
+
export const DemoScenarioSchema = av.object({
|
|
20
|
+
id: NonEmptyStringSchema,
|
|
21
|
+
title: NonEmptyStringSchema,
|
|
22
|
+
description: av.optional(av.string()),
|
|
23
|
+
match: av.optional(DemoScenarioMatchSchema),
|
|
24
|
+
response: av.any()
|
|
25
|
+
}, { unknownKeys: "strip" });
|
|
26
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/contracts/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAM9B,OAAO,EAAE,4BAA4B,EAAkB,MAAM,WAAW,CAAC;AAEzE;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC,MAAM,CAAC;IAChD,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAClC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAuK7B,MAAM,oBAAoB,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;CAC1C,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAc7B,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC;IAC1C,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACrC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC3C,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE;CACnB,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC"}
|