@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,484 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import ts from "typescript";
4
+ // -- Path helpers -----------------------------------------------------
5
+ /** Normalize a filesystem path to posix (forward slashes). */
6
+ function toPosix(p) {
7
+ return p.split(path.sep).join("/");
8
+ }
9
+ /**
10
+ * Build a relative import path from the .bp-generated/ directory
11
+ * to a target file, using posix separators.
12
+ */
13
+ function relativeFromGenerated(generatedDir, targetPath) {
14
+ const rel = path.relative(generatedDir, targetPath);
15
+ const posix = toPosix(rel);
16
+ return posix.startsWith(".") ? posix : `./${posix}`;
17
+ }
18
+ function toJsImport(relativePath) {
19
+ return relativePath.replace(/\.tsx?$/, ".js");
20
+ }
21
+ // -- Handler / export detection ---------------------------------------
22
+ const HANDLER_NAMES = [
23
+ "handleGet",
24
+ "handlePost",
25
+ "handleGetPost",
26
+ "handlePut",
27
+ "handlePatch",
28
+ "handleDelete",
29
+ "handleOptions",
30
+ ];
31
+ const WELL_KNOWN_EXPORTS = [
32
+ "ResponseSchema",
33
+ "QuerySchema",
34
+ "HeadersSchema",
35
+ "RequestSchema",
36
+ "MultipartSchema",
37
+ "ItemSchema",
38
+ "SummarySchema",
39
+ "viewId",
40
+ "title",
41
+ "description",
42
+ "auth",
43
+ "role",
44
+ "dependencies",
45
+ "chrome",
46
+ "cacheHints",
47
+ "demoScenarios",
48
+ "handleSSE",
49
+ "tickSchema",
50
+ // stream renderer exports (index.stream.tsx)
51
+ "renderShell",
52
+ "renderItem",
53
+ "renderSummary",
54
+ "renderError",
55
+ ];
56
+ const ALL_DETECTABLE = [...HANDLER_NAMES, ...WELL_KNOWN_EXPORTS];
57
+ /** Map handler function name -> HTTP method(s). */
58
+ function handlerToMethods(handlerName) {
59
+ switch (handlerName) {
60
+ case "handleGet": return ["GET"];
61
+ case "handlePost": return ["POST"];
62
+ case "handleGetPost": return ["GET", "POST"];
63
+ case "handlePut": return ["PUT"];
64
+ case "handlePatch": return ["PATCH"];
65
+ case "handleDelete": return ["DELETE"];
66
+ case "handleOptions": return ["OPTIONS"];
67
+ default: return [];
68
+ }
69
+ }
70
+ /**
71
+ * Parse a TypeScript source file with the compiler API and detect
72
+ * exported identifiers that match the well-known set.
73
+ * This uses `ts.createSourceFile` - no full program compilation needed.
74
+ */
75
+ function detectExports(filePath) {
76
+ const source = fs.readFileSync(filePath, "utf-8");
77
+ const sourceFile = ts.createSourceFile(path.basename(filePath), source, ts.ScriptTarget.ES2022,
78
+ /* setParentNodes */ true, ts.ScriptKind.TS);
79
+ const detectable = new Set(ALL_DETECTABLE);
80
+ const found = [];
81
+ function visit(node) {
82
+ // export function handleGet(...)
83
+ if (ts.isFunctionDeclaration(node) &&
84
+ node.name &&
85
+ hasExportModifier(node) &&
86
+ detectable.has(node.name.text)) {
87
+ found.push(node.name.text);
88
+ }
89
+ // export const ResponseSchema = ...
90
+ if (ts.isVariableStatement(node) && hasExportModifier(node)) {
91
+ for (const decl of node.declarationList.declarations) {
92
+ if (ts.isIdentifier(decl.name) && detectable.has(decl.name.text)) {
93
+ found.push(decl.name.text);
94
+ }
95
+ }
96
+ }
97
+ // export { handleGet, ResponseSchema }
98
+ if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {
99
+ for (const spec of node.exportClause.elements) {
100
+ const name = (spec.name ?? spec.propertyName).text;
101
+ if (detectable.has(name)) {
102
+ found.push(name);
103
+ }
104
+ }
105
+ }
106
+ ts.forEachChild(node, visit);
107
+ }
108
+ visit(sourceFile);
109
+ return [...new Set(found)];
110
+ }
111
+ function detectRawHandler(filePath) {
112
+ return fs.readFileSync(filePath, "utf-8").includes("createRawHandler(");
113
+ }
114
+ function detectNamedExports(filePath, names) {
115
+ if (!fs.existsSync(filePath))
116
+ return [];
117
+ const source = fs.readFileSync(filePath, "utf-8");
118
+ const sourceFile = ts.createSourceFile(path.basename(filePath), source, ts.ScriptTarget.ES2022, true, ts.ScriptKind.TS);
119
+ const wanted = new Set(names);
120
+ const found = [];
121
+ function add(name) {
122
+ if (wanted.has(name) && !found.includes(name))
123
+ found.push(name);
124
+ }
125
+ function visit(node) {
126
+ if (hasExportModifier(node)) {
127
+ if ((ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isFunctionDeclaration(node)) && node.name) {
128
+ add(node.name.text);
129
+ }
130
+ if (ts.isVariableStatement(node)) {
131
+ for (const decl of node.declarationList.declarations) {
132
+ if (ts.isIdentifier(decl.name))
133
+ add(decl.name.text);
134
+ }
135
+ }
136
+ }
137
+ if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {
138
+ for (const spec of node.exportClause.elements) {
139
+ add((spec.name ?? spec.propertyName).text);
140
+ }
141
+ }
142
+ ts.forEachChild(node, visit);
143
+ }
144
+ visit(sourceFile);
145
+ return found;
146
+ }
147
+ function detectLiteralViewId(filePath) {
148
+ const source = fs.readFileSync(filePath, "utf-8");
149
+ const sourceFile = ts.createSourceFile(path.basename(filePath), source, ts.ScriptTarget.ES2022, true, ts.ScriptKind.TS);
150
+ let viewId;
151
+ function visit(node) {
152
+ if (viewId || !ts.isVariableStatement(node) || !hasExportModifier(node)) {
153
+ ts.forEachChild(node, visit);
154
+ return;
155
+ }
156
+ for (const decl of node.declarationList.declarations) {
157
+ if (ts.isIdentifier(decl.name)
158
+ && decl.name.text === "viewId"
159
+ && decl.initializer
160
+ && ts.isStringLiteral(decl.initializer)) {
161
+ viewId = decl.initializer.text;
162
+ return;
163
+ }
164
+ }
165
+ ts.forEachChild(node, visit);
166
+ }
167
+ visit(sourceFile);
168
+ return viewId;
169
+ }
170
+ function hasExportModifier(node) {
171
+ const mods = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined;
172
+ return mods?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;
173
+ }
174
+ // -- Route path construction ------------------------------------------
175
+ /**
176
+ * Convert a directory path relative to bp-routes/ into one or more HTTP paths
177
+ * and extract param names. Required params use [name]; optional params use [[name]].
178
+ *
179
+ * Example: "users/[userId]/posts" -> [{ httpPath: "/users/:userId/posts", paramNames: ["userId"] }]
180
+ * Example: "tenants/[[tenantId]]/services" -> "/tenants/services" and "/tenants/:tenantId/services"
181
+ */
182
+ function buildRoutePaths(segments) {
183
+ let variants = [
184
+ { segments: [], paramNames: [] }
185
+ ];
186
+ for (const seg of segments) {
187
+ const optionalParamMatch = seg.match(/^\[\[(\w+)]]$/);
188
+ if (optionalParamMatch) {
189
+ const paramName = optionalParamMatch[1];
190
+ variants = variants.flatMap((variant) => [
191
+ variant,
192
+ {
193
+ segments: [...variant.segments, `:${paramName}`],
194
+ paramNames: [...variant.paramNames, paramName]
195
+ }
196
+ ]);
197
+ continue;
198
+ }
199
+ const paramMatch = seg.match(/^\[(\w+)]$/);
200
+ const httpSegment = paramMatch ? `:${paramMatch[1]}` : seg;
201
+ const paramName = paramMatch?.[1];
202
+ variants = variants.map((variant) => ({
203
+ segments: [...variant.segments, httpSegment],
204
+ paramNames: paramName ? [...variant.paramNames, paramName] : variant.paramNames
205
+ }));
206
+ }
207
+ return variants.map((variant) => ({
208
+ httpPath: "/" + variant.segments.join("/"),
209
+ paramNames: variant.paramNames
210
+ }));
211
+ }
212
+ /**
213
+ * Build a viewId from path segments.
214
+ * Param segments become `$`, and `.index` is appended.
215
+ *
216
+ * Example: ["users", "[userId]"] -> "users.$userId.index"
217
+ */
218
+ function buildViewId(segments) {
219
+ const parts = segments.map((seg) => {
220
+ const paramMatch = seg.match(/^\[\[?(\w+)]]?$/);
221
+ return paramMatch ? `$${paramMatch[1]}` : seg;
222
+ });
223
+ return [...parts, "index"].join(".");
224
+ }
225
+ // -- Theme renderer scanning -----------------------------------------
226
+ /**
227
+ * Parse a theme file name to determine renderer type and attributes.
228
+ *
229
+ * Patterns:
230
+ * - index.tsx -> page, rendererId = "default"
231
+ * - index.GET.tsx -> page, rendererId = "default", method = "GET"
232
+ * - name.tsx -> component, rendererId = name
233
+ * - name.POST.tsx -> component, rendererId = name, method = "POST"
234
+ * - _location.id.tsx -> fragment, fragmentLocation = location, fragmentId = id
235
+ */
236
+ function parseThemeFile(fileName) {
237
+ // Must be .tsx
238
+ if (!fileName.endsWith(".tsx"))
239
+ return null;
240
+ let base = fileName.slice(0, -4); // strip .tsx
241
+ // Skip *.sse.tsx files - paired with fragment renderers separately
242
+ if (base.endsWith(".sse"))
243
+ return null;
244
+ // Extract trailing .NNN status code (3 digits, 100-599) if present.
245
+ const statusMatch = base.match(/\.([1-5]\d{2})$/);
246
+ let statusCode;
247
+ if (statusMatch) {
248
+ statusCode = Number(statusMatch[1]);
249
+ base = base.slice(0, base.length - statusMatch[0].length);
250
+ }
251
+ // Fragment: starts with underscore (but NOT _theme)
252
+ if (base.startsWith("_") && !base.startsWith("_theme")) {
253
+ const withoutUnderscore = base.slice(1);
254
+ const dotIdx = withoutUnderscore.indexOf(".");
255
+ if (dotIdx === -1)
256
+ return null; // must have location.id
257
+ const location = withoutUnderscore.slice(0, dotIdx);
258
+ const id = withoutUnderscore.slice(dotIdx + 1);
259
+ if (!location || !id)
260
+ return null;
261
+ return {
262
+ type: "fragment",
263
+ rendererId: `${location}.${id}`,
264
+ fragmentLocation: location,
265
+ fragmentId: id,
266
+ statusCode,
267
+ };
268
+ }
269
+ // Split remaining by dots to detect method-specific files
270
+ const parts = base.split(".");
271
+ const HTTP_METHODS = new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]);
272
+ if (parts[0] === "index") {
273
+ // index.tsx or index.METHOD.tsx
274
+ const method = parts.length === 2 && HTTP_METHODS.has(parts[1]) ? parts[1] : undefined;
275
+ if (parts.length > 2)
276
+ return null;
277
+ if (parts.length === 2 && !method)
278
+ return null;
279
+ return { type: "page", rendererId: "default", method, statusCode };
280
+ }
281
+ // name.tsx or name.METHOD.tsx -> component
282
+ const method = parts.length === 2 && HTTP_METHODS.has(parts[1]) ? parts[1] : undefined;
283
+ if (parts.length > 2)
284
+ return null;
285
+ if (parts.length === 2 && !method)
286
+ return null;
287
+ const rendererId = parts[0];
288
+ return { type: "component", rendererId, method, statusCode };
289
+ }
290
+ /**
291
+ * Scan a `_theme.{themeId}/` directory for renderers.
292
+ */
293
+ function scanThemeDirectory(themeDirPath, themeId, generatedDir, streamRenderers) {
294
+ const renderers = [];
295
+ if (!fs.existsSync(themeDirPath) || !fs.statSync(themeDirPath).isDirectory()) {
296
+ return renderers;
297
+ }
298
+ const entries = fs.readdirSync(themeDirPath, { withFileTypes: true });
299
+ // Streaming frame renderers: index.stream.tsx (spec/streaming.md section 4)
300
+ const streamFile = entries.find((e) => e.isFile() && e.name === "index.stream.tsx");
301
+ if (streamFile && streamRenderers) {
302
+ const filePath = path.join(themeDirPath, streamFile.name);
303
+ const exports = detectExports(filePath).filter((name) => name.startsWith("render"));
304
+ if (exports.includes("renderShell") && exports.includes("renderItem")) {
305
+ streamRenderers.push({
306
+ themeId,
307
+ relativePath: relativeFromGenerated(generatedDir, filePath),
308
+ exports,
309
+ });
310
+ }
311
+ }
312
+ // Collect SSE renderer files by their `rendererId` (location.fragmentId)
313
+ // so we can pair them with their fragment renderer.
314
+ const sseRendererPaths = new Map();
315
+ for (const entry of entries) {
316
+ if (!entry.isFile())
317
+ continue;
318
+ if (!entry.name.endsWith(".sse.tsx"))
319
+ continue;
320
+ const base = entry.name.slice(0, -".sse.tsx".length);
321
+ if (!base.startsWith("_") || base.startsWith("_theme"))
322
+ continue;
323
+ const withoutUnderscore = base.slice(1);
324
+ const dotIdx = withoutUnderscore.indexOf(".");
325
+ if (dotIdx === -1)
326
+ continue;
327
+ const location = withoutUnderscore.slice(0, dotIdx);
328
+ const id = withoutUnderscore.slice(dotIdx + 1);
329
+ if (!location || !id)
330
+ continue;
331
+ const filePath = path.join(themeDirPath, entry.name);
332
+ sseRendererPaths.set(`${location}.${id}`, relativeFromGenerated(generatedDir, filePath));
333
+ }
334
+ for (const entry of entries) {
335
+ if (!entry.isFile())
336
+ continue;
337
+ const parsed = parseThemeFile(entry.name);
338
+ if (!parsed)
339
+ continue;
340
+ const filePath = path.join(themeDirPath, entry.name);
341
+ const sseRendererPath = parsed.type === "fragment"
342
+ ? sseRendererPaths.get(parsed.rendererId)
343
+ : undefined;
344
+ renderers.push({
345
+ themeId,
346
+ rendererId: parsed.rendererId,
347
+ type: parsed.type,
348
+ method: parsed.method,
349
+ statusCode: parsed.statusCode,
350
+ fragmentLocation: parsed.fragmentLocation,
351
+ fragmentId: parsed.fragmentId,
352
+ relativePath: relativeFromGenerated(generatedDir, filePath),
353
+ sseRendererPath,
354
+ });
355
+ }
356
+ return renderers;
357
+ }
358
+ // -- Recursive route scanner ------------------------------------------
359
+ function scanDirectory(currentDir, routesDir, generatedDir, segments, routes) {
360
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
361
+ // Check for index.ts in this directory
362
+ const hasIndex = entries.some((e) => e.isFile() && e.name === "index.ts");
363
+ if (hasIndex && segments.length > 0) {
364
+ const indexPath = path.join(currentDir, "index.ts");
365
+ const routePaths = buildRoutePaths(segments);
366
+ const viewId = detectLiteralViewId(indexPath) ?? buildViewId(segments);
367
+ const handlerExports = detectExports(indexPath);
368
+ const isRaw = detectRawHandler(indexPath);
369
+ // Derive HTTP methods from handler functions
370
+ const methods = [];
371
+ for (const exp of handlerExports) {
372
+ for (const m of handlerToMethods(exp)) {
373
+ if (!methods.includes(m)) {
374
+ methods.push(m);
375
+ }
376
+ }
377
+ }
378
+ // Detect SSE handler (sse.ts)
379
+ const hasSse = entries.some((e) => e.isFile() && e.name === "sse.ts");
380
+ const ssePath = hasSse ? path.join(currentDir, "sse.ts") : undefined;
381
+ const sseExports = ssePath ? detectExports(ssePath) : [];
382
+ const hasSseHandler = hasSse && sseExports.includes("handleSSE");
383
+ const sseRelativePath = hasSseHandler && ssePath
384
+ ? relativeFromGenerated(generatedDir, ssePath)
385
+ : undefined;
386
+ const sseHasTickSchema = hasSseHandler && sseExports.includes("tickSchema");
387
+ // Scan theme renderers
388
+ const themeRenderers = [];
389
+ const streamRenderers = [];
390
+ for (const entry of entries) {
391
+ // Theme directory: _theme.{themeId}/
392
+ if (entry.isDirectory()) {
393
+ const themeMatch = entry.name.match(/^_theme\.(.+)$/);
394
+ if (themeMatch) {
395
+ const themeId = themeMatch[1];
396
+ const themeDirPath = path.join(currentDir, entry.name);
397
+ themeRenderers.push(...scanThemeDirectory(themeDirPath, themeId, generatedDir, streamRenderers));
398
+ }
399
+ }
400
+ // Single-file theme shorthand: _theme.{themeId}.tsx
401
+ if (entry.isFile()) {
402
+ const themeFileMatch = entry.name.match(/^_theme\.(.+)\.tsx$/);
403
+ if (themeFileMatch) {
404
+ const themeId = themeFileMatch[1];
405
+ const filePath = path.join(currentDir, entry.name);
406
+ themeRenderers.push({
407
+ themeId,
408
+ rendererId: "default",
409
+ type: "page",
410
+ relativePath: relativeFromGenerated(generatedDir, filePath),
411
+ });
412
+ }
413
+ }
414
+ }
415
+ for (const { httpPath, paramNames } of routePaths) {
416
+ routes.push({
417
+ viewId,
418
+ path: httpPath,
419
+ paramNames,
420
+ relativePath: relativeFromGenerated(generatedDir, currentDir),
421
+ handlerExports,
422
+ methods,
423
+ themeRenderers,
424
+ streamRenderers,
425
+ sseRelativePath,
426
+ hasSseHandler,
427
+ sseHasTickSchema,
428
+ hasItemSchema: handlerExports.includes("ItemSchema"),
429
+ hasSummarySchema: handlerExports.includes("SummarySchema"),
430
+ isRaw,
431
+ });
432
+ }
433
+ }
434
+ // Recurse into child directories (excluding theme dirs)
435
+ for (const entry of entries) {
436
+ if (!entry.isDirectory())
437
+ continue;
438
+ if (entry.name.startsWith("_theme."))
439
+ continue;
440
+ if (entry.name.startsWith("."))
441
+ continue;
442
+ const childDir = path.join(currentDir, entry.name);
443
+ scanDirectory(childDir, routesDir, generatedDir, [...segments, entry.name], routes);
444
+ }
445
+ }
446
+ // -- Public API -------------------------------------------------------
447
+ /**
448
+ * Scan the `bp-routes/` directory tree and build a data structure
449
+ * describing all routes, theme renderers, components, and fragments.
450
+ *
451
+ * @param baseDir - The directory containing `bp-routes/`. The
452
+ * `.bp-generated/` output directory is placed as a sibling.
453
+ */
454
+ export function scanRoutes(baseDir) {
455
+ const routesDir = path.resolve(baseDir, "bp-routes");
456
+ const generatedDir = path.resolve(baseDir, ".bp-generated");
457
+ const pluginIndexPath = path.resolve(baseDir, "index.ts");
458
+ const pluginImportPath = toJsImport(relativeFromGenerated(generatedDir, pluginIndexPath));
459
+ const pluginExports = detectNamedExports(pluginIndexPath, ["Plugin", "ServiceConfig"]);
460
+ if (!fs.existsSync(routesDir)) {
461
+ return { routes: [], generatedDir, pluginImportPath, pluginExports };
462
+ }
463
+ const routes = [];
464
+ scanDirectory(routesDir, routesDir, generatedDir, [], routes);
465
+ // Sort routes so static segments come before dynamic ones at the same level
466
+ routes.sort((a, b) => {
467
+ const aSeg = a.path.split("/").filter(Boolean);
468
+ const bSeg = b.path.split("/").filter(Boolean);
469
+ for (let i = 0; i < Math.min(aSeg.length, bSeg.length); i++) {
470
+ const aIsDynamic = aSeg[i].startsWith(":");
471
+ const bIsDynamic = bSeg[i].startsWith(":");
472
+ if (!aIsDynamic && bIsDynamic)
473
+ return -1;
474
+ if (aIsDynamic && !bIsDynamic)
475
+ return 1;
476
+ const cmp = aSeg[i].localeCompare(bSeg[i]);
477
+ if (cmp !== 0)
478
+ return cmp;
479
+ }
480
+ return aSeg.length - bSeg.length;
481
+ });
482
+ return { routes, generatedDir, pluginImportPath, pluginExports };
483
+ }
484
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/codegen/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ScanResult } from "./scanner.js";
2
+ export interface ValidationError {
3
+ file: string;
4
+ message: string;
5
+ severity: "error" | "warning";
6
+ }
7
+ /**
8
+ * Validate a `ScanResult` for convention violations.
9
+ *
10
+ * Returns an array of errors and warnings. An empty array means the
11
+ * scan result is valid.
12
+ */
13
+ export declare function validateScanResult(result: ScanResult): ValidationError[];
14
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/codegen/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,cAAc,CAAC;AAI7D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAgKD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe,EAAE,CAkBxE"}