@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.
Files changed (194) hide show
  1. package/README.md +13 -0
  2. package/lib/adapters/h3.d.ts +51 -0
  3. package/lib/adapters/h3.d.ts.map +1 -0
  4. package/lib/adapters/h3.js +1120 -0
  5. package/lib/adapters/h3.js.map +1 -0
  6. package/lib/codegen/cli.d.ts +3 -0
  7. package/lib/codegen/cli.d.ts.map +1 -0
  8. package/lib/codegen/cli.js +82 -0
  9. package/lib/codegen/cli.js.map +1 -0
  10. package/lib/codegen/emitter.d.ts +7 -0
  11. package/lib/codegen/emitter.d.ts.map +1 -0
  12. package/lib/codegen/emitter.js +453 -0
  13. package/lib/codegen/emitter.js.map +1 -0
  14. package/lib/codegen/init.d.ts +3 -0
  15. package/lib/codegen/init.d.ts.map +1 -0
  16. package/lib/codegen/init.js +90 -0
  17. package/lib/codegen/init.js.map +1 -0
  18. package/lib/codegen/scanner.d.ts +56 -0
  19. package/lib/codegen/scanner.d.ts.map +1 -0
  20. package/lib/codegen/scanner.js +484 -0
  21. package/lib/codegen/scanner.js.map +1 -0
  22. package/lib/codegen/validate.d.ts +14 -0
  23. package/lib/codegen/validate.d.ts.map +1 -0
  24. package/lib/codegen/validate.js +166 -0
  25. package/lib/codegen/validate.js.map +1 -0
  26. package/lib/contracts/auth.d.ts +160 -0
  27. package/lib/contracts/auth.d.ts.map +1 -0
  28. package/lib/contracts/auth.js +123 -0
  29. package/lib/contracts/auth.js.map +1 -0
  30. package/lib/contracts/binding.d.ts +169 -0
  31. package/lib/contracts/binding.d.ts.map +1 -0
  32. package/lib/contracts/binding.js +69 -0
  33. package/lib/contracts/binding.js.map +1 -0
  34. package/lib/contracts/common.d.ts +23 -0
  35. package/lib/contracts/common.d.ts.map +1 -0
  36. package/lib/contracts/common.js +18 -0
  37. package/lib/contracts/common.js.map +1 -0
  38. package/lib/contracts/config.d.ts +93 -0
  39. package/lib/contracts/config.d.ts.map +1 -0
  40. package/lib/contracts/config.js +62 -0
  41. package/lib/contracts/config.js.map +1 -0
  42. package/lib/contracts/controlPlane.d.ts +63 -0
  43. package/lib/contracts/controlPlane.d.ts.map +1 -0
  44. package/lib/contracts/controlPlane.js +2 -0
  45. package/lib/contracts/controlPlane.js.map +1 -0
  46. package/lib/contracts/json.d.ts +9 -0
  47. package/lib/contracts/json.d.ts.map +1 -0
  48. package/lib/contracts/json.js +6 -0
  49. package/lib/contracts/json.js.map +1 -0
  50. package/lib/contracts/manifest.d.ts +158 -0
  51. package/lib/contracts/manifest.d.ts.map +1 -0
  52. package/lib/contracts/manifest.js +40 -0
  53. package/lib/contracts/manifest.js.map +1 -0
  54. package/lib/contracts/observability.d.ts +77 -0
  55. package/lib/contracts/observability.d.ts.map +1 -0
  56. package/lib/contracts/observability.js +99 -0
  57. package/lib/contracts/observability.js.map +1 -0
  58. package/lib/contracts/platformConfig.d.ts +635 -0
  59. package/lib/contracts/platformConfig.d.ts.map +1 -0
  60. package/lib/contracts/platformConfig.js +256 -0
  61. package/lib/contracts/platformConfig.js.map +1 -0
  62. package/lib/contracts/registry.d.ts +104 -0
  63. package/lib/contracts/registry.d.ts.map +1 -0
  64. package/lib/contracts/registry.js +2 -0
  65. package/lib/contracts/registry.js.map +1 -0
  66. package/lib/contracts/route.d.ts +199 -0
  67. package/lib/contracts/route.d.ts.map +1 -0
  68. package/lib/contracts/route.js +26 -0
  69. package/lib/contracts/route.js.map +1 -0
  70. package/lib/contracts/serviceConfig.d.ts +88 -0
  71. package/lib/contracts/serviceConfig.d.ts.map +1 -0
  72. package/lib/contracts/serviceConfig.js +45 -0
  73. package/lib/contracts/serviceConfig.js.map +1 -0
  74. package/lib/contracts/streaming.d.ts +76 -0
  75. package/lib/contracts/streaming.d.ts.map +1 -0
  76. package/lib/contracts/streaming.js +31 -0
  77. package/lib/contracts/streaming.js.map +1 -0
  78. package/lib/contracts/view.d.ts +149 -0
  79. package/lib/contracts/view.d.ts.map +1 -0
  80. package/lib/contracts/view.js +82 -0
  81. package/lib/contracts/view.js.map +1 -0
  82. package/lib/controlPlane/store.d.ts +24 -0
  83. package/lib/controlPlane/store.d.ts.map +1 -0
  84. package/lib/controlPlane/store.js +70 -0
  85. package/lib/controlPlane/store.js.map +1 -0
  86. package/lib/controlPlane/sync.d.ts +8 -0
  87. package/lib/controlPlane/sync.d.ts.map +1 -0
  88. package/lib/controlPlane/sync.js +24 -0
  89. package/lib/controlPlane/sync.js.map +1 -0
  90. package/lib/controlPlane/types.d.ts +15 -0
  91. package/lib/controlPlane/types.d.ts.map +1 -0
  92. package/lib/controlPlane/types.js +2 -0
  93. package/lib/controlPlane/types.js.map +1 -0
  94. package/lib/index.d.ts +40 -0
  95. package/lib/index.d.ts.map +1 -0
  96. package/lib/index.js +40 -0
  97. package/lib/index.js.map +1 -0
  98. package/lib/runtime/auth/envelope.d.ts +32 -0
  99. package/lib/runtime/auth/envelope.d.ts.map +1 -0
  100. package/lib/runtime/auth/envelope.js +123 -0
  101. package/lib/runtime/auth/envelope.js.map +1 -0
  102. package/lib/runtime/auth/issuer.d.ts +44 -0
  103. package/lib/runtime/auth/issuer.d.ts.map +1 -0
  104. package/lib/runtime/auth/issuer.js +82 -0
  105. package/lib/runtime/auth/issuer.js.map +1 -0
  106. package/lib/runtime/auth/jwks.d.ts +7 -0
  107. package/lib/runtime/auth/jwks.d.ts.map +1 -0
  108. package/lib/runtime/auth/jwks.js +69 -0
  109. package/lib/runtime/auth/jwks.js.map +1 -0
  110. package/lib/runtime/auth/keypair.d.ts +21 -0
  111. package/lib/runtime/auth/keypair.d.ts.map +1 -0
  112. package/lib/runtime/auth/keypair.js +50 -0
  113. package/lib/runtime/auth/keypair.js.map +1 -0
  114. package/lib/runtime/auth/tokens.d.ts +25 -0
  115. package/lib/runtime/auth/tokens.d.ts.map +1 -0
  116. package/lib/runtime/auth/tokens.js +137 -0
  117. package/lib/runtime/auth/tokens.js.map +1 -0
  118. package/lib/runtime/auth/verifier.d.ts +45 -0
  119. package/lib/runtime/auth/verifier.d.ts.map +1 -0
  120. package/lib/runtime/auth/verifier.js +76 -0
  121. package/lib/runtime/auth/verifier.js.map +1 -0
  122. package/lib/runtime/bpHeaders.d.ts +10 -0
  123. package/lib/runtime/bpHeaders.d.ts.map +1 -0
  124. package/lib/runtime/bpHeaders.js +53 -0
  125. package/lib/runtime/bpHeaders.js.map +1 -0
  126. package/lib/runtime/configProvider.d.ts +41 -0
  127. package/lib/runtime/configProvider.d.ts.map +1 -0
  128. package/lib/runtime/configProvider.js +232 -0
  129. package/lib/runtime/configProvider.js.map +1 -0
  130. package/lib/runtime/configStore.d.ts +34 -0
  131. package/lib/runtime/configStore.d.ts.map +1 -0
  132. package/lib/runtime/configStore.js +197 -0
  133. package/lib/runtime/configStore.js.map +1 -0
  134. package/lib/runtime/configTicket.d.ts +49 -0
  135. package/lib/runtime/configTicket.d.ts.map +1 -0
  136. package/lib/runtime/configTicket.js +168 -0
  137. package/lib/runtime/configTicket.js.map +1 -0
  138. package/lib/runtime/h3.d.ts +28 -0
  139. package/lib/runtime/h3.d.ts.map +1 -0
  140. package/lib/runtime/h3.js +199 -0
  141. package/lib/runtime/h3.js.map +1 -0
  142. package/lib/runtime/handler.d.ts +55 -0
  143. package/lib/runtime/handler.d.ts.map +1 -0
  144. package/lib/runtime/handler.js +51 -0
  145. package/lib/runtime/handler.js.map +1 -0
  146. package/lib/runtime/http.d.ts +13 -0
  147. package/lib/runtime/http.d.ts.map +1 -0
  148. package/lib/runtime/http.js +114 -0
  149. package/lib/runtime/http.js.map +1 -0
  150. package/lib/runtime/jsonSchema.d.ts +4 -0
  151. package/lib/runtime/jsonSchema.d.ts.map +1 -0
  152. package/lib/runtime/jsonSchema.js +28 -0
  153. package/lib/runtime/jsonSchema.js.map +1 -0
  154. package/lib/runtime/manifest.d.ts +3 -0
  155. package/lib/runtime/manifest.d.ts.map +1 -0
  156. package/lib/runtime/manifest.js +5 -0
  157. package/lib/runtime/manifest.js.map +1 -0
  158. package/lib/runtime/media.d.ts +20 -0
  159. package/lib/runtime/media.d.ts.map +1 -0
  160. package/lib/runtime/media.js +70 -0
  161. package/lib/runtime/media.js.map +1 -0
  162. package/lib/runtime/registry.d.ts +67 -0
  163. package/lib/runtime/registry.d.ts.map +1 -0
  164. package/lib/runtime/registry.js +290 -0
  165. package/lib/runtime/registry.js.map +1 -0
  166. package/lib/runtime/serviceConfig.d.ts +38 -0
  167. package/lib/runtime/serviceConfig.d.ts.map +1 -0
  168. package/lib/runtime/serviceConfig.js +152 -0
  169. package/lib/runtime/serviceConfig.js.map +1 -0
  170. package/lib/runtime/statusViews.d.ts +23 -0
  171. package/lib/runtime/statusViews.d.ts.map +1 -0
  172. package/lib/runtime/statusViews.js +48 -0
  173. package/lib/runtime/statusViews.js.map +1 -0
  174. package/lib/runtime/stream.d.ts +41 -0
  175. package/lib/runtime/stream.d.ts.map +1 -0
  176. package/lib/runtime/stream.js +92 -0
  177. package/lib/runtime/stream.js.map +1 -0
  178. package/lib/runtime/streamHandler.d.ts +48 -0
  179. package/lib/runtime/streamHandler.d.ts.map +1 -0
  180. package/lib/runtime/streamHandler.js +49 -0
  181. package/lib/runtime/streamHandler.js.map +1 -0
  182. package/lib/runtime/tenantResolution.d.ts +4 -0
  183. package/lib/runtime/tenantResolution.d.ts.map +1 -0
  184. package/lib/runtime/tenantResolution.js +19 -0
  185. package/lib/runtime/tenantResolution.js.map +1 -0
  186. package/lib/runtime/uuid.d.ts +6 -0
  187. package/lib/runtime/uuid.d.ts.map +1 -0
  188. package/lib/runtime/uuid.js +27 -0
  189. package/lib/runtime/uuid.js.map +1 -0
  190. package/lib/runtime/view.d.ts +48 -0
  191. package/lib/runtime/view.d.ts.map +1 -0
  192. package/lib/runtime/view.js +111 -0
  193. package/lib/runtime/view.js.map +1 -0
  194. package/package.json +56 -0
@@ -0,0 +1,166 @@
1
+ // -- Fragment file-name pattern ---------------------------------------
2
+ /** Matches `_{location}.{id}.tsx` - at least two dot-separated parts after `_`. */
3
+ const FRAGMENT_PATTERN = /^_([a-zA-Z][a-zA-Z0-9]*)\.([a-zA-Z][a-zA-Z0-9]*)\.tsx$/;
4
+ // -- Validation helpers -----------------------------------------------
5
+ function checkHandlerExports(route, errors) {
6
+ const hasHandler = route.handlerExports.some((e) => e.startsWith("handle"));
7
+ if (!hasHandler) {
8
+ errors.push({
9
+ file: route.relativePath + "/index.ts",
10
+ message: `Route "${route.viewId}" does not export any handler function (handleGet, handlePost, etc.).`,
11
+ severity: "error",
12
+ });
13
+ }
14
+ }
15
+ function checkResponseSchema(route, errors) {
16
+ if (route.isRaw) {
17
+ if (route.handlerExports.includes("ResponseSchema")) {
18
+ errors.push({
19
+ file: route.relativePath + "/index.ts",
20
+ message: `Raw route "${route.viewId}" must not export a ResponseSchema.`,
21
+ severity: "error",
22
+ });
23
+ }
24
+ return;
25
+ }
26
+ // Streaming routes (spec/streaming.md) export ItemSchema instead; the
27
+ // buffered response schema is derived by createStreamHandler.
28
+ if (route.hasItemSchema) {
29
+ if (route.handlerExports.includes("ResponseSchema")) {
30
+ errors.push({
31
+ file: route.relativePath + "/index.ts",
32
+ message: `Route "${route.viewId}" exports both ItemSchema and ResponseSchema. Streaming routes derive their response schema - remove ResponseSchema.`,
33
+ severity: "error",
34
+ });
35
+ }
36
+ return;
37
+ }
38
+ if (!route.handlerExports.includes("ResponseSchema")) {
39
+ errors.push({
40
+ file: route.relativePath + "/index.ts",
41
+ message: `Route "${route.viewId}" does not export a ResponseSchema.`,
42
+ severity: "error",
43
+ });
44
+ }
45
+ }
46
+ function checkRawRenderers(route, errors) {
47
+ if (!route.isRaw)
48
+ return;
49
+ if (route.themeRenderers.length === 0 && route.streamRenderers.length === 0)
50
+ return;
51
+ errors.push({
52
+ file: route.relativePath + "/index.ts",
53
+ message: `Raw route "${route.viewId}" cannot have theme renderers.`,
54
+ severity: "error",
55
+ });
56
+ }
57
+ function checkFragmentFileNames(route, errors) {
58
+ for (const renderer of route.themeRenderers) {
59
+ if (renderer.type !== "fragment")
60
+ continue;
61
+ // Extract the file name from the relative import path
62
+ const segments = renderer.relativePath.split("/");
63
+ const fileName = segments[segments.length - 1];
64
+ if (fileName && !FRAGMENT_PATTERN.test(fileName)) {
65
+ errors.push({
66
+ file: renderer.relativePath,
67
+ message: `Fragment file "${fileName}" does not match the _{location}.{id}.tsx pattern.`,
68
+ severity: "error",
69
+ });
70
+ }
71
+ }
72
+ }
73
+ function checkDuplicateViewIds(routes, errors) {
74
+ const seen = new Map();
75
+ for (const route of routes) {
76
+ const existing = seen.get(route.viewId);
77
+ if (existing) {
78
+ errors.push({
79
+ file: route.relativePath + "/index.ts",
80
+ message: `Duplicate viewId "${route.viewId}". Also defined at "${existing.relativePath}/index.ts".`,
81
+ severity: "error",
82
+ });
83
+ }
84
+ else {
85
+ seen.set(route.viewId, route);
86
+ }
87
+ }
88
+ }
89
+ function checkConflictingPaths(routes, errors) {
90
+ const seen = new Map();
91
+ for (const route of routes) {
92
+ // Normalize the path for conflict detection: replace each :param with a
93
+ // placeholder so "/users/:userId" and "/users/:id" are treated as the
94
+ // same structural path.
95
+ const normalized = route.path.replace(/:[^/]+/g, ":*");
96
+ const existing = seen.get(normalized);
97
+ if (existing && existing.viewId !== route.viewId) {
98
+ errors.push({
99
+ file: route.relativePath + "/index.ts",
100
+ message: `Path "${route.path}" conflicts with "${existing.path}" (route "${existing.viewId}"). Both resolve to the same structural pattern.`,
101
+ severity: "error",
102
+ });
103
+ }
104
+ else {
105
+ seen.set(normalized, route);
106
+ }
107
+ }
108
+ }
109
+ function checkThemeRendererOrphans(route, errors) {
110
+ // Theme renderers should belong to a route that has an index.ts.
111
+ // Since we only create ScannedRoute entries for directories that have
112
+ // index.ts, any renderer attached to a route is by definition valid.
113
+ // However, we can warn if a renderer's path suggests it sits outside
114
+ // the route's own directory tree. In practice the scanner already
115
+ // constrains this, but we defensively verify.
116
+ for (const renderer of route.themeRenderers) {
117
+ if (!renderer.relativePath.includes(route.relativePath.replace(/\/index\.ts$/, ""))) {
118
+ // The renderer's relative path does not share the route's base
119
+ // directory - this should never happen with the scanner, but
120
+ // guard against hand-edited ScanResults.
121
+ errors.push({
122
+ file: renderer.relativePath,
123
+ message: `Theme renderer "${renderer.rendererId}" (theme "${renderer.themeId}") does not appear to belong to route "${route.viewId}".`,
124
+ severity: "error",
125
+ });
126
+ }
127
+ }
128
+ }
129
+ function checkMissingThemeRenderers(route, errors) {
130
+ if (route.isRaw)
131
+ return;
132
+ if (route.themeRenderers.length === 0) {
133
+ const hasHandler = route.handlerExports.some((e) => e.startsWith("handle"));
134
+ if (hasHandler) {
135
+ errors.push({
136
+ file: route.relativePath + "/index.ts",
137
+ message: `Route "${route.viewId}" has handlers but no theme renderers. The route will serve JSON but not HTML.`,
138
+ severity: "warning",
139
+ });
140
+ }
141
+ }
142
+ }
143
+ // -- Public API -------------------------------------------------------
144
+ /**
145
+ * Validate a `ScanResult` for convention violations.
146
+ *
147
+ * Returns an array of errors and warnings. An empty array means the
148
+ * scan result is valid.
149
+ */
150
+ export function validateScanResult(result) {
151
+ const errors = [];
152
+ // Cross-route checks
153
+ checkDuplicateViewIds(result.routes, errors);
154
+ checkConflictingPaths(result.routes, errors);
155
+ // Per-route checks
156
+ for (const route of result.routes) {
157
+ checkHandlerExports(route, errors);
158
+ checkResponseSchema(route, errors);
159
+ checkRawRenderers(route, errors);
160
+ checkFragmentFileNames(route, errors);
161
+ checkThemeRendererOrphans(route, errors);
162
+ checkMissingThemeRenderers(route, errors);
163
+ }
164
+ return errors;
165
+ }
166
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/codegen/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ export declare const TokenTypeSchema: av.EnumSchema<readonly ["access", "refresh", "cp-envelope", "setup", "install"]>;
4
+ export type TokenType = Infer<typeof TokenTypeSchema>;
5
+ export declare const JwtClaimsSchema: av.ObjectSchema<{
6
+ iss: av.StringSchema;
7
+ aud: av.UnionSchema<[av.StringSchema, av.ArraySchema<av.StringSchema>]>;
8
+ sub: av.StringSchema;
9
+ exp: av.IntSchema;
10
+ iat: av.IntSchema;
11
+ nbf: av.OptionalSchema<av.IntSchema>;
12
+ jti: av.StringSchema;
13
+ realm: av.EnumSchema<readonly ["runtime", "control-plane"]>;
14
+ tenantId: av.StringSchema;
15
+ appId: av.StringSchema;
16
+ roles: av.ArraySchema<av.StringSchema>;
17
+ tokenType: av.EnumSchema<readonly ["access", "refresh", "cp-envelope", "setup", "install"]>;
18
+ authProvider: av.OptionalSchema<av.StringSchema>;
19
+ providerSubject: av.OptionalSchema<av.StringSchema>;
20
+ provider: av.OptionalSchema<av.ObjectSchema<{
21
+ username: av.OptionalSchema<av.StringSchema>;
22
+ profileUrl: av.OptionalSchema<av.StringSchema>;
23
+ accountId: av.OptionalSchema<av.UnionSchema<[av.StringSchema, av.NumberSchema]>>;
24
+ nodeId: av.OptionalSchema<av.StringSchema>;
25
+ scope: av.OptionalSchema<av.StringSchema>;
26
+ }>>;
27
+ name: av.OptionalSchema<av.StringSchema>;
28
+ email: av.OptionalSchema<av.StringSchema>;
29
+ picture: av.OptionalSchema<av.StringSchema>;
30
+ }>;
31
+ export type JwtClaims = Infer<typeof JwtClaimsSchema>;
32
+ export declare const TokenLifetimeConfigSchema: av.ObjectSchema<{
33
+ accessTokenSeconds: av.IntSchema;
34
+ refreshTokenSeconds: av.IntSchema;
35
+ }>;
36
+ export type TokenLifetimeConfig = Infer<typeof TokenLifetimeConfigSchema>;
37
+ export declare const AuthAudienceRuleSchema: av.ObjectSchema<{
38
+ realm: av.EnumSchema<readonly ["runtime", "control-plane"]>;
39
+ audiences: av.ArraySchema<av.StringSchema>;
40
+ }>;
41
+ export type AuthAudienceRule = Infer<typeof AuthAudienceRuleSchema>;
42
+ export declare const AppAuthPermissionActionSchema: av.EnumSchema<readonly ["read", "create", "update", "delete"]>;
43
+ export type AppAuthPermissionAction = Infer<typeof AppAuthPermissionActionSchema>;
44
+ export declare const AppAuthPermissionGrantSchema: av.ObjectSchema<{
45
+ serviceId: av.StringSchema;
46
+ viewId: av.StringSchema;
47
+ permissions: av.ArraySchema<av.EnumSchema<readonly ["read", "create", "update", "delete"]>>;
48
+ }>;
49
+ export type AppAuthPermissionGrant = Infer<typeof AppAuthPermissionGrantSchema>;
50
+ export declare const AppAuthRoleSchema: av.ObjectSchema<{
51
+ id: av.StringSchema;
52
+ title: av.StringSchema;
53
+ description: av.OptionalSchema<av.StringSchema>;
54
+ permissions: av.ArraySchema<av.ObjectSchema<{
55
+ serviceId: av.StringSchema;
56
+ viewId: av.StringSchema;
57
+ permissions: av.ArraySchema<av.EnumSchema<readonly ["read", "create", "update", "delete"]>>;
58
+ }>>;
59
+ }>;
60
+ export type AppAuthRole = Infer<typeof AppAuthRoleSchema>;
61
+ export declare const DefaultAuthProviderConfigSchema: av.ObjectSchema<{
62
+ kind: av.LiteralSchema<"betterportal.default">;
63
+ }>;
64
+ export type DefaultAuthProviderConfig = Infer<typeof DefaultAuthProviderConfigSchema>;
65
+ export declare const AuthressProviderConfigSchema: av.ObjectSchema<{
66
+ kind: av.LiteralSchema<"authress.io">;
67
+ roleClaimPath: av.StringSchema;
68
+ subjectClaimPath: av.StringSchema;
69
+ nameClaimPath: av.OptionalSchema<av.StringSchema>;
70
+ emailClaimPath: av.OptionalSchema<av.StringSchema>;
71
+ pictureClaimPath: av.OptionalSchema<av.StringSchema>;
72
+ }>;
73
+ export type AuthressProviderConfig = Infer<typeof AuthressProviderConfigSchema>;
74
+ export declare const AppAuthProviderConfigSchema: av.UnionSchema<[av.ObjectSchema<{
75
+ kind: av.LiteralSchema<"betterportal.default">;
76
+ }>, av.ObjectSchema<{
77
+ kind: av.LiteralSchema<"authress.io">;
78
+ roleClaimPath: av.StringSchema;
79
+ subjectClaimPath: av.StringSchema;
80
+ nameClaimPath: av.OptionalSchema<av.StringSchema>;
81
+ emailClaimPath: av.OptionalSchema<av.StringSchema>;
82
+ pictureClaimPath: av.OptionalSchema<av.StringSchema>;
83
+ }>]>;
84
+ export type AppAuthProviderConfig = Infer<typeof AppAuthProviderConfigSchema>;
85
+ export declare const AppAuthConfigSchema: av.ObjectSchema<{
86
+ serviceId: av.StringSchema;
87
+ provider: av.OptionalSchema<av.UnionSchema<[av.ObjectSchema<{
88
+ kind: av.LiteralSchema<"betterportal.default">;
89
+ }>, av.ObjectSchema<{
90
+ kind: av.LiteralSchema<"authress.io">;
91
+ roleClaimPath: av.StringSchema;
92
+ subjectClaimPath: av.StringSchema;
93
+ nameClaimPath: av.OptionalSchema<av.StringSchema>;
94
+ emailClaimPath: av.OptionalSchema<av.StringSchema>;
95
+ pictureClaimPath: av.OptionalSchema<av.StringSchema>;
96
+ }>]>>;
97
+ loginViewId: av.OptionalSchema<av.StringSchema>;
98
+ logoutViewId: av.OptionalSchema<av.StringSchema>;
99
+ refreshViewId: av.OptionalSchema<av.StringSchema>;
100
+ expectedIssuer: av.StringSchema;
101
+ expectedAudience: av.StringSchema;
102
+ /** Reference URL only - published by the auth service for clients/browsers.
103
+ * Verifiers MUST use publicKeys (pushed at /install) to avoid CM -> service fetch. */
104
+ jwksUri: av.StringSchema;
105
+ /** Public JWKS pushed by the auth service at /install and on key rotation.
106
+ * CP-side JWT verification uses these static keys, never fetches jwksUri. */
107
+ publicKeys: av.OptionalSchema<av.ObjectSchema<{
108
+ keys: av.ArraySchema<av.RecordSchema<av.AnySchema>>;
109
+ }>>;
110
+ roles: av.ArraySchema<av.ObjectSchema<{
111
+ id: av.StringSchema;
112
+ title: av.StringSchema;
113
+ description: av.OptionalSchema<av.StringSchema>;
114
+ permissions: av.ArraySchema<av.ObjectSchema<{
115
+ serviceId: av.StringSchema;
116
+ viewId: av.StringSchema;
117
+ permissions: av.ArraySchema<av.EnumSchema<readonly ["read", "create", "update", "delete"]>>;
118
+ }>>;
119
+ }>>;
120
+ }>;
121
+ export type AppAuthConfig = Infer<typeof AppAuthConfigSchema>;
122
+ export declare const TenantAppValidationSchema: av.ObjectSchema<{
123
+ allowed: av.BoolSchema;
124
+ reason: av.OptionalSchema<av.StringSchema>;
125
+ upgradeUrl: av.OptionalSchema<av.StringSchema>;
126
+ retryAfterSeconds: av.OptionalSchema<av.IntSchema>;
127
+ }>;
128
+ export type TenantAppValidation = Infer<typeof TenantAppValidationSchema>;
129
+ export declare const CpEnvelopeClaimsSchema: av.ObjectSchema<{
130
+ iss: av.StringSchema;
131
+ aud: av.StringSchema;
132
+ exp: av.IntSchema;
133
+ iat: av.IntSchema;
134
+ jti: av.StringSchema;
135
+ tokenType: av.LiteralSchema<"cp-envelope">;
136
+ tenantId: av.StringSchema;
137
+ appId: av.StringSchema;
138
+ originUserJti: av.OptionalSchema<av.StringSchema>;
139
+ cpId: av.StringSchema;
140
+ cpJwksUri: av.StringSchema;
141
+ }>;
142
+ export type CpEnvelopeClaims = Infer<typeof CpEnvelopeClaimsSchema>;
143
+ export declare const SetupTokenClaimsSchema: av.ObjectSchema<{
144
+ iss: av.StringSchema;
145
+ exp: av.IntSchema;
146
+ iat: av.IntSchema;
147
+ jti: av.StringSchema;
148
+ tokenType: av.LiteralSchema<"setup">;
149
+ /** UUIDv7 - pre-assigned by CP for this install. Becomes tenant.services[].id. */
150
+ instanceId: av.StringSchema;
151
+ serviceUrl: av.StringSchema;
152
+ cpUrl: av.StringSchema;
153
+ cpJwksUri: av.StringSchema;
154
+ scope: av.OptionalSchema<av.ObjectSchema<{
155
+ tenantId: av.StringSchema;
156
+ appId: av.OptionalSchema<av.StringSchema>;
157
+ }>>;
158
+ }>;
159
+ export type SetupTokenClaims = Infer<typeof SetupTokenClaimsSchema>;
160
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/contracts/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAMrC,eAAO,MAAM,eAAe,kFAA8E,CAAC;AAC3G,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAEtD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;EAyBA,CAAC;AAC7B,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAEtD,eAAO,MAAM,yBAAyB;;;EAGV,CAAC;AAC7B,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE1E,eAAO,MAAM,sBAAsB;;;EAGP,CAAC;AAC7B,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEpE,eAAO,MAAM,6BAA6B,gEAA4D,CAAC;AACvG,MAAM,MAAM,uBAAuB,GAAG,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAElF,eAAO,MAAM,4BAA4B;;;;EAIb,CAAC;AAC7B,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAEhF,eAAO,MAAM,iBAAiB;;;;;;;;;EAKF,CAAC;AAC7B,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE1D,eAAO,MAAM,+BAA+B;;EAEhB,CAAC;AAC7B,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAEtF,eAAO,MAAM,4BAA4B;;;;;;;EAOb,CAAC;AAC7B,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAEhF,eAAO,MAAM,2BAA2B;;;;;;;;;IAGtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE9E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;IAQ9B;2FACuF;;IAEvF;kFAC8E;;;;;;;;;;;;;;EAKpD,CAAC;AAC7B,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAI9D,eAAO,MAAM,yBAAyB;;;;;EAKV,CAAC;AAC7B,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAI1E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAYP,CAAC;AAC7B,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAIpE,eAAO,MAAM,sBAAsB;;;;;;IAMjC,kFAAkF;;;;;;;;;EASxD,CAAC;AAC7B,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,123 @@
1
+ import * as av from "anyvali";
2
+ import { IdentityRealmSchema, UuidV7Schema } from "./common.js";
3
+ const NonEmptyStringSchema = av.string().minLength(1);
4
+ const NonEmptyStringArraySchema = av.array(NonEmptyStringSchema).minItems(1);
5
+ export const TokenTypeSchema = av.enum_(["access", "refresh", "cp-envelope", "setup", "install"]);
6
+ export const JwtClaimsSchema = av.object({
7
+ iss: NonEmptyStringSchema,
8
+ aud: av.union([NonEmptyStringSchema, NonEmptyStringArraySchema]),
9
+ sub: NonEmptyStringSchema,
10
+ exp: av.int().min(1),
11
+ iat: av.int().min(0),
12
+ nbf: av.optional(av.int().min(0)),
13
+ jti: NonEmptyStringSchema,
14
+ realm: IdentityRealmSchema,
15
+ tenantId: UuidV7Schema,
16
+ appId: UuidV7Schema,
17
+ roles: av.array(NonEmptyStringSchema).default([]),
18
+ tokenType: TokenTypeSchema,
19
+ authProvider: av.optional(av.string().minLength(1)),
20
+ providerSubject: av.optional(av.string().minLength(1)),
21
+ provider: av.optional(av.object({
22
+ username: av.optional(av.string()),
23
+ profileUrl: av.optional(av.string()),
24
+ accountId: av.optional(av.union([av.string(), av.number()])),
25
+ nodeId: av.optional(av.string()),
26
+ scope: av.optional(av.string())
27
+ }, { unknownKeys: "strip" })),
28
+ name: av.optional(av.string()),
29
+ email: av.optional(av.string()),
30
+ picture: av.optional(av.string())
31
+ }, { unknownKeys: "strip" });
32
+ export const TokenLifetimeConfigSchema = av.object({
33
+ accessTokenSeconds: av.int().min(1).default(60 * 15),
34
+ refreshTokenSeconds: av.int().min(1).default(60 * 60 * 24 * 7)
35
+ }, { unknownKeys: "strip" });
36
+ export const AuthAudienceRuleSchema = av.object({
37
+ realm: IdentityRealmSchema,
38
+ audiences: NonEmptyStringArraySchema
39
+ }, { unknownKeys: "strip" });
40
+ export const AppAuthPermissionActionSchema = av.enum_(["read", "create", "update", "delete"]);
41
+ export const AppAuthPermissionGrantSchema = av.object({
42
+ serviceId: UuidV7Schema,
43
+ viewId: NonEmptyStringSchema,
44
+ permissions: av.array(AppAuthPermissionActionSchema).minItems(1)
45
+ }, { unknownKeys: "strip" });
46
+ export const AppAuthRoleSchema = av.object({
47
+ id: NonEmptyStringSchema,
48
+ title: NonEmptyStringSchema,
49
+ description: av.optional(av.string()),
50
+ permissions: av.array(AppAuthPermissionGrantSchema).default([])
51
+ }, { unknownKeys: "strip" });
52
+ export const DefaultAuthProviderConfigSchema = av.object({
53
+ kind: av.literal("betterportal.default")
54
+ }, { unknownKeys: "strip" });
55
+ export const AuthressProviderConfigSchema = av.object({
56
+ kind: av.literal("authress.io"),
57
+ roleClaimPath: av.string().minLength(1).default("roles"),
58
+ subjectClaimPath: av.string().minLength(1).default("sub"),
59
+ nameClaimPath: av.optional(av.string().minLength(1)),
60
+ emailClaimPath: av.optional(av.string().minLength(1)),
61
+ pictureClaimPath: av.optional(av.string().minLength(1))
62
+ }, { unknownKeys: "strip" });
63
+ export const AppAuthProviderConfigSchema = av.union([
64
+ DefaultAuthProviderConfigSchema,
65
+ AuthressProviderConfigSchema
66
+ ]);
67
+ export const AppAuthConfigSchema = av.object({
68
+ serviceId: UuidV7Schema,
69
+ provider: av.optional(AppAuthProviderConfigSchema),
70
+ loginViewId: av.optional(NonEmptyStringSchema),
71
+ logoutViewId: av.optional(NonEmptyStringSchema),
72
+ refreshViewId: av.optional(NonEmptyStringSchema),
73
+ expectedIssuer: NonEmptyStringSchema,
74
+ expectedAudience: NonEmptyStringSchema,
75
+ /** Reference URL only - published by the auth service for clients/browsers.
76
+ * Verifiers MUST use publicKeys (pushed at /install) to avoid CM -> service fetch. */
77
+ jwksUri: NonEmptyStringSchema,
78
+ /** Public JWKS pushed by the auth service at /install and on key rotation.
79
+ * CP-side JWT verification uses these static keys, never fetches jwksUri. */
80
+ publicKeys: av.optional(av.object({
81
+ keys: av.array(av.record(av.any()))
82
+ }, { unknownKeys: "strip" })),
83
+ roles: av.array(AppAuthRoleSchema).default([])
84
+ }, { unknownKeys: "strip" });
85
+ // -- Tenant-app validation (validateTenantApp hook return) -----------
86
+ export const TenantAppValidationSchema = av.object({
87
+ allowed: av.bool(),
88
+ reason: av.optional(av.string()),
89
+ upgradeUrl: av.optional(av.string()),
90
+ retryAfterSeconds: av.optional(av.int().min(0))
91
+ }, { unknownKeys: "strip" });
92
+ // -- CP envelope token claims ----------------------------------------
93
+ export const CpEnvelopeClaimsSchema = av.object({
94
+ iss: NonEmptyStringSchema,
95
+ aud: NonEmptyStringSchema,
96
+ exp: av.int().min(1),
97
+ iat: av.int().min(0),
98
+ jti: NonEmptyStringSchema,
99
+ tokenType: av.literal("cp-envelope"),
100
+ tenantId: UuidV7Schema,
101
+ appId: UuidV7Schema,
102
+ originUserJti: av.optional(NonEmptyStringSchema),
103
+ cpId: NonEmptyStringSchema,
104
+ cpJwksUri: NonEmptyStringSchema
105
+ }, { unknownKeys: "strip" });
106
+ // -- Setup token claims (control-plane -> browser) --------------------
107
+ export const SetupTokenClaimsSchema = av.object({
108
+ iss: NonEmptyStringSchema,
109
+ exp: av.int().min(1),
110
+ iat: av.int().min(0),
111
+ jti: NonEmptyStringSchema,
112
+ tokenType: av.literal("setup"),
113
+ /** UUIDv7 - pre-assigned by CP for this install. Becomes tenant.services[].id. */
114
+ instanceId: UuidV7Schema,
115
+ serviceUrl: NonEmptyStringSchema,
116
+ cpUrl: NonEmptyStringSchema,
117
+ cpJwksUri: NonEmptyStringSchema,
118
+ scope: av.optional(av.object({
119
+ tenantId: UuidV7Schema,
120
+ appId: av.optional(UuidV7Schema)
121
+ }, { unknownKeys: "strip" }))
122
+ }, { unknownKeys: "strip" });
123
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/contracts/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ export declare const AppRouteSchema: av.ObjectSchema<{
4
+ id: av.StringSchema;
5
+ title: av.StringSchema;
6
+ path: av.StringSchema;
7
+ viewId: av.StringSchema;
8
+ serviceId: av.StringSchema;
9
+ enabled: av.BoolSchema;
10
+ }>;
11
+ export type AppRoute = Infer<typeof AppRouteSchema>;
12
+ export declare const TenantSchema: av.ObjectSchema<{
13
+ id: av.StringSchema;
14
+ slug: av.StringSchema;
15
+ title: av.StringSchema;
16
+ branding: av.ObjectSchema<{
17
+ logoUrl: av.OptionalSchema<av.StringSchema>;
18
+ primaryColor: av.OptionalSchema<av.StringSchema>;
19
+ secondaryColor: av.OptionalSchema<av.StringSchema>;
20
+ }>;
21
+ }>;
22
+ export type Tenant = Infer<typeof TenantSchema>;
23
+ export declare const FragmentAssignmentSchema: av.ObjectSchema<{
24
+ serviceId: av.StringSchema;
25
+ fragmentId: av.StringSchema;
26
+ enabled: av.BoolSchema;
27
+ }>;
28
+ export type FragmentAssignment = Infer<typeof FragmentAssignmentSchema>;
29
+ export declare const AppSchema: av.ObjectSchema<{
30
+ id: av.StringSchema;
31
+ tenantId: av.StringSchema;
32
+ slug: av.StringSchema;
33
+ hostname: av.StringSchema;
34
+ title: av.StringSchema;
35
+ themeId: av.StringSchema;
36
+ routes: av.ArraySchema<av.ObjectSchema<{
37
+ id: av.StringSchema;
38
+ title: av.StringSchema;
39
+ path: av.StringSchema;
40
+ viewId: av.StringSchema;
41
+ serviceId: av.StringSchema;
42
+ enabled: av.BoolSchema;
43
+ }>>;
44
+ fragments: av.RecordSchema<av.ArraySchema<av.ObjectSchema<{
45
+ serviceId: av.StringSchema;
46
+ fragmentId: av.StringSchema;
47
+ enabled: av.BoolSchema;
48
+ }>>>;
49
+ }>;
50
+ export type App = Infer<typeof AppSchema>;
51
+ export declare const BindingTrustSchema: av.ObjectSchema<{
52
+ credentialId: av.StringSchema;
53
+ issuer: av.StringSchema;
54
+ audience: av.StringSchema;
55
+ scopes: av.ArraySchema<av.StringSchema>;
56
+ rotationVersion: av.StringSchema;
57
+ }>;
58
+ export type BindingTrust = Infer<typeof BindingTrustSchema>;
59
+ export declare const BindingRecordSchema: av.ObjectSchema<{
60
+ bindingId: av.StringSchema;
61
+ serviceId: av.StringSchema;
62
+ tenantId: av.StringSchema;
63
+ appIds: av.ArraySchema<av.StringSchema>;
64
+ endpointBaseUrl: av.StringSchema;
65
+ deploymentMode: av.EnumSchema<readonly ["bp-hosted", "customer-hosted", "third-party-saas", "self-hosted", "saas-managed"]>;
66
+ enabled: av.BoolSchema;
67
+ importedManifestVersion: av.StringSchema;
68
+ lastSyncAtIso: av.OptionalSchema<av.StringSchema>;
69
+ trust: av.ObjectSchema<{
70
+ credentialId: av.StringSchema;
71
+ issuer: av.StringSchema;
72
+ audience: av.StringSchema;
73
+ scopes: av.ArraySchema<av.StringSchema>;
74
+ rotationVersion: av.StringSchema;
75
+ }>;
76
+ }>;
77
+ export type BindingRecord = Infer<typeof BindingRecordSchema>;
78
+ export declare const ServiceCatalogEntrySchema: av.ObjectSchema<{
79
+ serviceId: av.StringSchema;
80
+ title: av.StringSchema;
81
+ description: av.StringSchema;
82
+ category: av.EnumSchema<readonly ["utility", "integration", "theme", "auth", "service"]>;
83
+ manifestUrl: av.StringSchema;
84
+ defaultEndpointBaseUrl: av.StringSchema;
85
+ deploymentModes: av.ArraySchema<av.EnumSchema<readonly ["bp-hosted", "customer-hosted", "third-party-saas", "self-hosted", "saas-managed"]>>;
86
+ tenantConfigSchemas: av.ArraySchema<av.ObjectSchema<{
87
+ id: av.StringSchema;
88
+ title: av.StringSchema;
89
+ description: av.StringSchema;
90
+ scope: av.EnumSchema<readonly ["tenant", "app"]>;
91
+ jsonSchema: av.BaseSchema<unknown, import("./json.js").JsonObject>;
92
+ groups: av.OptionalSchema<av.ArraySchema<av.ObjectSchema<{
93
+ id: av.StringSchema;
94
+ title: av.StringSchema;
95
+ description: av.OptionalSchema<av.StringSchema>;
96
+ order: av.OptionalSchema<av.IntSchema>;
97
+ optional: av.OptionalSchema<av.BoolSchema>;
98
+ }>>>;
99
+ fields: av.ArraySchema<av.ObjectSchema<{
100
+ key: av.StringSchema;
101
+ title: av.StringSchema;
102
+ description: av.StringSchema;
103
+ scope: av.EnumSchema<readonly ["tenant", "app"]>;
104
+ visibility: av.EnumSchema<readonly ["public", "protected", "secret"]>;
105
+ ownership: av.EnumSchema<readonly ["bp", "plugin", "mixed"]>;
106
+ sourceOfTruth: av.EnumSchema<readonly ["bp", "plugin", "external"]>;
107
+ groupId: av.OptionalSchema<av.StringSchema>;
108
+ order: av.OptionalSchema<av.IntSchema>;
109
+ defaultValue: av.OptionalSchema<av.BaseSchema<unknown, import("./json.js").JsonValue>>;
110
+ ui: av.OptionalSchema<av.ObjectSchema<{
111
+ control: av.OptionalSchema<av.EnumSchema<readonly ["text", "textarea", "password", "number", "checkbox", "select", "multiselect", "color", "date", "time", "datetime-local", "url", "email"]>>;
112
+ placeholder: av.OptionalSchema<av.StringSchema>;
113
+ options: av.OptionalSchema<av.ArraySchema<av.ObjectSchema<{
114
+ value: av.StringSchema;
115
+ label: av.StringSchema;
116
+ }>>>;
117
+ optionsSource: av.OptionalSchema<av.EnumSchema<readonly ["app.routes"]>>;
118
+ min: av.OptionalSchema<av.UnionSchema<[av.NumberSchema, av.StringSchema]>>;
119
+ max: av.OptionalSchema<av.UnionSchema<[av.NumberSchema, av.StringSchema]>>;
120
+ step: av.OptionalSchema<av.NumberSchema>;
121
+ rows: av.OptionalSchema<av.IntSchema>;
122
+ }>>;
123
+ required: av.BoolSchema;
124
+ }>>;
125
+ }>>;
126
+ appConfigSchemas: av.ArraySchema<av.ObjectSchema<{
127
+ id: av.StringSchema;
128
+ title: av.StringSchema;
129
+ description: av.StringSchema;
130
+ scope: av.EnumSchema<readonly ["tenant", "app"]>;
131
+ jsonSchema: av.BaseSchema<unknown, import("./json.js").JsonObject>;
132
+ groups: av.OptionalSchema<av.ArraySchema<av.ObjectSchema<{
133
+ id: av.StringSchema;
134
+ title: av.StringSchema;
135
+ description: av.OptionalSchema<av.StringSchema>;
136
+ order: av.OptionalSchema<av.IntSchema>;
137
+ optional: av.OptionalSchema<av.BoolSchema>;
138
+ }>>>;
139
+ fields: av.ArraySchema<av.ObjectSchema<{
140
+ key: av.StringSchema;
141
+ title: av.StringSchema;
142
+ description: av.StringSchema;
143
+ scope: av.EnumSchema<readonly ["tenant", "app"]>;
144
+ visibility: av.EnumSchema<readonly ["public", "protected", "secret"]>;
145
+ ownership: av.EnumSchema<readonly ["bp", "plugin", "mixed"]>;
146
+ sourceOfTruth: av.EnumSchema<readonly ["bp", "plugin", "external"]>;
147
+ groupId: av.OptionalSchema<av.StringSchema>;
148
+ order: av.OptionalSchema<av.IntSchema>;
149
+ defaultValue: av.OptionalSchema<av.BaseSchema<unknown, import("./json.js").JsonValue>>;
150
+ ui: av.OptionalSchema<av.ObjectSchema<{
151
+ control: av.OptionalSchema<av.EnumSchema<readonly ["text", "textarea", "password", "number", "checkbox", "select", "multiselect", "color", "date", "time", "datetime-local", "url", "email"]>>;
152
+ placeholder: av.OptionalSchema<av.StringSchema>;
153
+ options: av.OptionalSchema<av.ArraySchema<av.ObjectSchema<{
154
+ value: av.StringSchema;
155
+ label: av.StringSchema;
156
+ }>>>;
157
+ optionsSource: av.OptionalSchema<av.EnumSchema<readonly ["app.routes"]>>;
158
+ min: av.OptionalSchema<av.UnionSchema<[av.NumberSchema, av.StringSchema]>>;
159
+ max: av.OptionalSchema<av.UnionSchema<[av.NumberSchema, av.StringSchema]>>;
160
+ step: av.OptionalSchema<av.NumberSchema>;
161
+ rows: av.OptionalSchema<av.IntSchema>;
162
+ }>>;
163
+ required: av.BoolSchema;
164
+ }>>;
165
+ }>>;
166
+ hostedByBetterPortal: av.BoolSchema;
167
+ }>;
168
+ export type ServiceCatalogEntry = Infer<typeof ServiceCatalogEntrySchema>;
169
+ //# sourceMappingURL=binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/contracts/binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAMrC,eAAO,MAAM,cAAc;;;;;;;EAOC,CAAC;AAC7B,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEpD,eAAO,MAAM,YAAY;;;;;;;;;EASG,CAAC;AAC7B,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEhD,eAAO,MAAM,wBAAwB;;;;EAIT,CAAC;AAC7B,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAExE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;EASM,CAAC;AAC7B,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAE1C,eAAO,MAAM,kBAAkB;;;;;;EAMH,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;EAWJ,CAAC;AAC7B,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAE9D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWV,CAAC;AAC7B,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}