@byline/cli 3.21.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +29 -3
  2. package/dist/cli.js +5 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/doctor.d.ts.map +1 -1
  5. package/dist/commands/doctor.js +1 -0
  6. package/dist/commands/doctor.js.map +1 -1
  7. package/dist/commands/init.d.ts +3 -0
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +10 -14
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/setup-checks.d.ts +9 -0
  12. package/dist/commands/setup-checks.d.ts.map +1 -1
  13. package/dist/commands/setup-checks.js +43 -18
  14. package/dist/commands/setup-checks.js.map +1 -1
  15. package/dist/commands/setup.js +1 -1
  16. package/dist/commands/setup.js.map +1 -1
  17. package/dist/context.d.ts +2 -0
  18. package/dist/context.d.ts.map +1 -1
  19. package/dist/context.js +6 -0
  20. package/dist/context.js.map +1 -1
  21. package/dist/lib/dependency-version.d.ts +12 -0
  22. package/dist/lib/dependency-version.d.ts.map +1 -0
  23. package/dist/lib/dependency-version.js +101 -0
  24. package/dist/lib/dependency-version.js.map +1 -0
  25. package/dist/lib/planned-writes.d.ts +8 -0
  26. package/dist/lib/planned-writes.d.ts.map +1 -0
  27. package/dist/lib/planned-writes.js +177 -0
  28. package/dist/lib/planned-writes.js.map +1 -0
  29. package/dist/lib/planned-writes.test.d.ts +2 -0
  30. package/dist/lib/planned-writes.test.d.ts.map +1 -0
  31. package/dist/lib/planned-writes.test.js +113 -0
  32. package/dist/lib/planned-writes.test.js.map +1 -0
  33. package/dist/lib/release-policy.d.ts +12 -0
  34. package/dist/lib/release-policy.d.ts.map +1 -0
  35. package/dist/lib/release-policy.js +20 -0
  36. package/dist/lib/release-policy.js.map +1 -0
  37. package/dist/lib/release-policy.test.d.ts +2 -0
  38. package/dist/lib/release-policy.test.d.ts.map +1 -0
  39. package/dist/lib/release-policy.test.js +36 -0
  40. package/dist/lib/release-policy.test.js.map +1 -0
  41. package/dist/lib/route-config.d.ts +40 -0
  42. package/dist/lib/route-config.d.ts.map +1 -0
  43. package/dist/lib/route-config.js +322 -0
  44. package/dist/lib/route-config.js.map +1 -0
  45. package/dist/lib/static-config.d.ts +20 -0
  46. package/dist/lib/static-config.d.ts.map +1 -0
  47. package/dist/lib/static-config.js +444 -0
  48. package/dist/lib/static-config.js.map +1 -0
  49. package/dist/lib/static-config.test.d.ts +2 -0
  50. package/dist/lib/static-config.test.d.ts.map +1 -0
  51. package/dist/lib/static-config.test.js +105 -0
  52. package/dist/lib/static-config.test.js.map +1 -0
  53. package/dist/lib/template-hook-boundary.test.node.d.ts +2 -0
  54. package/dist/lib/template-hook-boundary.test.node.d.ts.map +1 -0
  55. package/dist/lib/template-hook-boundary.test.node.js +30 -0
  56. package/dist/lib/template-hook-boundary.test.node.js.map +1 -0
  57. package/dist/lib/template-path.d.ts +5 -0
  58. package/dist/lib/template-path.d.ts.map +1 -0
  59. package/dist/lib/template-path.js +9 -0
  60. package/dist/lib/template-path.js.map +1 -0
  61. package/dist/lib/workspace-root.d.ts +28 -0
  62. package/dist/lib/workspace-root.d.ts.map +1 -0
  63. package/dist/lib/workspace-root.js +205 -0
  64. package/dist/lib/workspace-root.js.map +1 -0
  65. package/dist/manifest/deps.d.ts +1 -1
  66. package/dist/manifest/deps.d.ts.map +1 -1
  67. package/dist/manifest/deps.js +24 -8
  68. package/dist/manifest/deps.js.map +1 -1
  69. package/dist/phases/deps.d.ts +14 -1
  70. package/dist/phases/deps.d.ts.map +1 -1
  71. package/dist/phases/deps.js +312 -137
  72. package/dist/phases/deps.js.map +1 -1
  73. package/dist/phases/deps.test.d.ts +2 -0
  74. package/dist/phases/deps.test.d.ts.map +1 -0
  75. package/dist/phases/deps.test.js +343 -0
  76. package/dist/phases/deps.test.js.map +1 -0
  77. package/dist/phases/preflight.d.ts.map +1 -1
  78. package/dist/phases/preflight.js +59 -11
  79. package/dist/phases/preflight.js.map +1 -1
  80. package/dist/phases/prompts.d.ts +2 -0
  81. package/dist/phases/prompts.d.ts.map +1 -1
  82. package/dist/phases/prompts.js +51 -2
  83. package/dist/phases/prompts.js.map +1 -1
  84. package/dist/phases/routes-ui.test.d.ts +2 -0
  85. package/dist/phases/routes-ui.test.d.ts.map +1 -0
  86. package/dist/phases/routes-ui.test.js +766 -0
  87. package/dist/phases/routes-ui.test.js.map +1 -0
  88. package/dist/phases/routes.d.ts +4 -1
  89. package/dist/phases/routes.d.ts.map +1 -1
  90. package/dist/phases/routes.js +610 -122
  91. package/dist/phases/routes.js.map +1 -1
  92. package/dist/phases/scaffold-smoke.test.d.ts +2 -0
  93. package/dist/phases/scaffold-smoke.test.d.ts.map +1 -0
  94. package/dist/phases/scaffold-smoke.test.js +175 -0
  95. package/dist/phases/scaffold-smoke.test.js.map +1 -0
  96. package/dist/phases/scaffold.d.ts +3 -2
  97. package/dist/phases/scaffold.d.ts.map +1 -1
  98. package/dist/phases/scaffold.js +268 -91
  99. package/dist/phases/scaffold.js.map +1 -1
  100. package/dist/phases/scaffold.test.js +171 -22
  101. package/dist/phases/scaffold.test.js.map +1 -1
  102. package/dist/phases/ui.d.ts +4 -1
  103. package/dist/phases/ui.d.ts.map +1 -1
  104. package/dist/phases/ui.js +51 -59
  105. package/dist/phases/ui.js.map +1 -1
  106. package/dist/phases/wire/index.d.ts.map +1 -1
  107. package/dist/phases/wire/index.js +10 -6
  108. package/dist/phases/wire/index.js.map +1 -1
  109. package/dist/phases/wire/shared.d.ts +4 -1
  110. package/dist/phases/wire/shared.d.ts.map +1 -1
  111. package/dist/phases/wire/vite-config.d.ts.map +1 -1
  112. package/dist/phases/wire/vite-config.js +69 -20
  113. package/dist/phases/wire/vite-config.js.map +1 -1
  114. package/dist/phases/wire/vite-config.test.d.ts +2 -0
  115. package/dist/phases/wire/vite-config.test.d.ts.map +1 -0
  116. package/dist/phases/wire/vite-config.test.js +97 -0
  117. package/dist/phases/wire/vite-config.test.js.map +1 -0
  118. package/dist/prompts.d.ts +1 -0
  119. package/dist/prompts.d.ts.map +1 -1
  120. package/dist/prompts.js +7 -2
  121. package/dist/prompts.js.map +1 -1
  122. package/dist/runner.js +1 -1
  123. package/dist/runner.js.map +1 -1
  124. package/dist/templates/byline/collection-types.contract.ts +26 -1
  125. package/dist/templates/byline/collections/index.ts +1 -1
  126. package/dist/templates/byline/collections/server-hooks.ts +7 -0
  127. package/dist/templates/byline/generated/collection-types.ts +14 -6
  128. package/dist/templates/byline/routes.ts +7 -6
  129. package/dist/templates/byline/server.config.ts +10 -1
  130. package/dist/templates/byline-examples/admin.config.ts +7 -12
  131. package/dist/templates/byline-examples/blocks/photo-block.ts +3 -2
  132. package/dist/templates/byline-examples/collection-types.contract.ts +26 -1
  133. package/dist/templates/byline-examples/collections/docs/hooks.ts +23 -13
  134. package/dist/templates/byline-examples/collections/docs/schema.ts +2 -11
  135. package/dist/templates/byline-examples/collections/index.ts +1 -1
  136. package/dist/templates/byline-examples/collections/media/components/media-list-view.tsx +11 -6
  137. package/dist/templates/byline-examples/collections/media/schema.ts +3 -0
  138. package/dist/templates/byline-examples/collections/news/schema.ts +4 -3
  139. package/dist/templates/byline-examples/collections/server-hooks.ts +8 -0
  140. package/dist/templates/byline-examples/fields/ai-text.ts +1 -1
  141. package/dist/templates/byline-examples/fields/ai-textarea.ts +1 -1
  142. package/dist/templates/byline-examples/fields/lexical-richtext-ai.tsx +3 -3
  143. package/dist/templates/byline-examples/generated/collection-types.ts +138 -130
  144. package/dist/templates/byline-examples/routes.ts +7 -6
  145. package/dist/templates/byline-examples/scripts/backfill-version-locales.ts +1 -1
  146. package/dist/templates/byline-examples/scripts/import-docs.ts +10 -11
  147. package/dist/templates/byline-examples/scripts/lib/mdast-to-lexical.test.node.ts +93 -233
  148. package/dist/templates/byline-examples/scripts/lib/mdast-to-lexical.ts +2 -2
  149. package/dist/templates/byline-examples/scripts/lib/strip-leading-h1.test.node.ts +0 -4
  150. package/dist/templates/byline-examples/scripts/re-anchor.ts +3 -3
  151. package/dist/templates/byline-examples/scripts/regenerate-media-operation.ts +112 -0
  152. package/dist/templates/byline-examples/scripts/regenerate-media.ts +129 -92
  153. package/dist/templates/byline-examples/server.config.ts +14 -6
  154. package/dist/templates/host/vite.config.ts +2 -0
  155. package/dist/templates/routes/_byline/route.lazy.tsx +1 -2
  156. package/dist/templates/routes/_byline/route.tsx +1 -1
  157. package/dist/templates/ui-byline/blocks/photo-block/index.tsx +18 -22
  158. package/dist/templates/ui-byline/blocks/richtext-block/index.tsx +1 -1
  159. package/dist/templates/ui-byline/components/admonition/index.tsx +11 -8
  160. package/dist/templates/ui-byline/components/code/code.tsx +6 -4
  161. package/dist/templates/ui-byline/components/link/lang-link.tsx +4 -8
  162. package/dist/templates/ui-byline/components/link/link-field.tsx +3 -2
  163. package/dist/templates/ui-byline/components/link/link-lexical.tsx +9 -8
  164. package/dist/templates/ui-byline/render-blocks.tsx +38 -34
  165. package/dist/templates/ui-byline/types/content.ts +25 -0
  166. package/dist/templates/ui-byline/types/i18n.ts +4 -8
  167. package/dist/test-helpers.d.ts +5 -0
  168. package/dist/test-helpers.d.ts.map +1 -0
  169. package/dist/test-helpers.js +52 -0
  170. package/dist/test-helpers.js.map +1 -0
  171. package/dist/types.d.ts +21 -1
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/ui-template-contract.test.d.ts +2 -0
  174. package/dist/ui-template-contract.test.d.ts.map +1 -0
  175. package/dist/ui-template-contract.test.js +150 -0
  176. package/dist/ui-template-contract.test.js.map +1 -0
  177. package/dist/workspace-root.test.d.ts +2 -0
  178. package/dist/workspace-root.test.d.ts.map +1 -0
  179. package/dist/workspace-root.test.js +311 -0
  180. package/dist/workspace-root.test.js.map +1 -0
  181. package/package.json +9 -1
  182. package/dist/templates/byline/client.server.ts +0 -32
  183. package/dist/templates/byline-examples/client.server.ts +0 -32
@@ -0,0 +1,444 @@
1
+ import { Node, Project, ScriptTarget, SyntaxKind, VariableDeclarationKind, } from 'ts-morph';
2
+ const project = new Project({
3
+ useInMemoryFileSystem: true,
4
+ compilerOptions: { target: ScriptTarget.ES2024 },
5
+ });
6
+ /** Parse one exported const without loading, transpiling, or executing its source. */
7
+ export function evaluateExportedConst(source, exportName) {
8
+ const sourceFile = project.createSourceFile(`static-config-${Math.random().toString(36).slice(2)}.ts`, source, { overwrite: true });
9
+ try {
10
+ const diagnostics = project.getProgram().getSyntacticDiagnostics(sourceFile);
11
+ if (diagnostics.length > 0)
12
+ return failure('source contains parse diagnostics');
13
+ const declaration = findExportedConst(sourceFile, exportName);
14
+ if (!declaration)
15
+ return failure(`exported const ${exportName} was not found`);
16
+ const initializer = declaration.getInitializer();
17
+ if (!initializer)
18
+ return failure(`exported const ${exportName} has no initializer`);
19
+ const state = { evaluating: new Set(), bindings: new Set([declaration]) };
20
+ const result = evaluate(initializer, sourceFile, state);
21
+ return result.ok && hasUnsafeBindingEffects(sourceFile, state.bindings)
22
+ ? failure('evaluated bindings are mutated or passed to effectful code')
23
+ : result;
24
+ }
25
+ finally {
26
+ project.removeSourceFile(sourceFile);
27
+ }
28
+ }
29
+ /** Evaluate only named properties; unrelated property initializers are never visited. */
30
+ export function evaluateExportedObjectProperties(source, exportName, propertyNames) {
31
+ return withExportedInitializer(source, exportName, (initializer, sourceFile, state) => evaluateObjectProperties(initializer, sourceFile, state, new Set(propertyNames)));
32
+ }
33
+ /** Evaluate named properties from each object in an exported array. */
34
+ export function evaluateExportedArrayObjectProperties(source, exportName, propertyNames) {
35
+ return withExportedInitializer(source, exportName, (initializer, sourceFile, state) => {
36
+ const array = evaluateArrayExpressions(initializer, sourceFile, state);
37
+ if (!array.ok)
38
+ return array;
39
+ const names = new Set(propertyNames);
40
+ const values = [];
41
+ for (const expression of array.value) {
42
+ const value = evaluateObjectProperties(expression, sourceFile, state, names);
43
+ if (!value.ok)
44
+ return value;
45
+ values.push(value.value);
46
+ }
47
+ return success(values);
48
+ });
49
+ }
50
+ export function hasExportedCoreResolveRoutesCall(source, exportName) {
51
+ const sourceFile = project.createSourceFile(`static-config-${Math.random().toString(36).slice(2)}.ts`, source, { overwrite: true });
52
+ try {
53
+ if (project.getProgram().getSyntacticDiagnostics(sourceFile).length > 0)
54
+ return false;
55
+ const initializer = findExportedConst(sourceFile, exportName)?.getInitializer();
56
+ if (!initializer)
57
+ return false;
58
+ const expression = unwrap(initializer);
59
+ if (!Node.isCallExpression(expression))
60
+ return false;
61
+ const callee = expression.getExpression();
62
+ return (Node.isIdentifier(callee) &&
63
+ expression.getArguments().length === 1 &&
64
+ isCoreResolveRoutesImport(callee));
65
+ }
66
+ finally {
67
+ project.removeSourceFile(sourceFile);
68
+ }
69
+ }
70
+ function withExportedInitializer(source, exportName, evaluateInitializer) {
71
+ const sourceFile = project.createSourceFile(`static-config-${Math.random().toString(36).slice(2)}.ts`, source, { overwrite: true });
72
+ try {
73
+ const diagnostics = project.getProgram().getSyntacticDiagnostics(sourceFile);
74
+ if (diagnostics.length > 0)
75
+ return failure('source contains parse diagnostics');
76
+ const declaration = findExportedConst(sourceFile, exportName);
77
+ if (!declaration)
78
+ return failure(`exported const ${exportName} was not found`);
79
+ const initializer = declaration.getInitializer();
80
+ if (!initializer)
81
+ return failure(`exported const ${exportName} has no initializer`);
82
+ const state = { evaluating: new Set(), bindings: new Set([declaration]) };
83
+ const result = evaluateInitializer(initializer, sourceFile, state);
84
+ return result.ok && hasUnsafeBindingEffects(sourceFile, state.bindings)
85
+ ? failure('evaluated bindings are mutated or passed to effectful code')
86
+ : result;
87
+ }
88
+ finally {
89
+ project.removeSourceFile(sourceFile);
90
+ }
91
+ }
92
+ function evaluate(expression, sourceFile, state) {
93
+ const unwrapped = unwrap(expression);
94
+ if (Node.isStringLiteral(unwrapped) || Node.isNoSubstitutionTemplateLiteral(unwrapped)) {
95
+ return success(unwrapped.getLiteralValue());
96
+ }
97
+ if (Node.isNumericLiteral(unwrapped))
98
+ return success(unwrapped.getLiteralValue());
99
+ if (unwrapped.isKind(SyntaxKind.TrueKeyword))
100
+ return success(true);
101
+ if (unwrapped.isKind(SyntaxKind.FalseKeyword))
102
+ return success(false);
103
+ if (unwrapped.isKind(SyntaxKind.NullKeyword))
104
+ return success(null);
105
+ if (Node.isArrayLiteralExpression(unwrapped)) {
106
+ const values = [];
107
+ for (const element of unwrapped.getElements()) {
108
+ if (Node.isOmittedExpression(element))
109
+ return failure('array holes are not static config');
110
+ if (Node.isSpreadElement(element)) {
111
+ const spread = evaluate(element.getExpression(), sourceFile, state);
112
+ if (!spread.ok)
113
+ return spread;
114
+ if (!Array.isArray(spread.value))
115
+ return failure('array spread must resolve to an array');
116
+ values.push(...spread.value);
117
+ continue;
118
+ }
119
+ const value = evaluate(element, sourceFile, state);
120
+ if (!value.ok)
121
+ return value;
122
+ values.push(value.value);
123
+ }
124
+ return success(values);
125
+ }
126
+ if (Node.isObjectLiteralExpression(unwrapped)) {
127
+ const value = Object.create(null);
128
+ for (const property of unwrapped.getProperties()) {
129
+ if (Node.isSpreadAssignment(property)) {
130
+ const spread = evaluate(property.getExpression(), sourceFile, state);
131
+ if (!spread.ok)
132
+ return spread;
133
+ if (!isStaticObject(spread.value))
134
+ return failure('object spread must resolve to an object');
135
+ Object.assign(value, spread.value);
136
+ continue;
137
+ }
138
+ if (Node.isPropertyAssignment(property)) {
139
+ const name = staticPropertyName(property.getNameNode());
140
+ if (name === null)
141
+ return failure('computed property names are not static config');
142
+ const propertyValue = evaluate(property.getInitializerOrThrow(), sourceFile, state);
143
+ if (!propertyValue.ok)
144
+ return propertyValue;
145
+ value[name] = propertyValue.value;
146
+ continue;
147
+ }
148
+ if (Node.isShorthandPropertyAssignment(property)) {
149
+ const propertyValue = evaluate(property.getNameNode(), sourceFile, state);
150
+ if (!propertyValue.ok)
151
+ return propertyValue;
152
+ value[property.getName()] = propertyValue.value;
153
+ continue;
154
+ }
155
+ return failure('methods and accessors are not static config');
156
+ }
157
+ return success(value);
158
+ }
159
+ if (Node.isIdentifier(unwrapped)) {
160
+ const declaration = findTopLevelConst(sourceFile, unwrapped.getText());
161
+ if (!declaration)
162
+ return failure(`${unwrapped.getText()} is not a same-file immutable constant`);
163
+ if (state.evaluating.has(declaration))
164
+ return failure('cyclic constants are not static config');
165
+ const initializer = declaration.getInitializer();
166
+ if (!initializer)
167
+ return failure(`${unwrapped.getText()} has no initializer`);
168
+ state.bindings.add(declaration);
169
+ state.evaluating.add(declaration);
170
+ const value = evaluate(initializer, sourceFile, state);
171
+ state.evaluating.delete(declaration);
172
+ return value;
173
+ }
174
+ if (Node.isCallExpression(unwrapped)) {
175
+ const callee = unwrapped.getExpression();
176
+ const args = unwrapped.getArguments();
177
+ if (!Node.isIdentifier(callee) || !isCoreResolveRoutesImport(callee)) {
178
+ return failure('calls are not static config');
179
+ }
180
+ if (args.length !== 1 || !args[0] || !Node.isExpression(args[0])) {
181
+ return failure('resolveRoutes must have one static object argument');
182
+ }
183
+ const routes = evaluate(args[0], sourceFile, state);
184
+ if (!routes.ok)
185
+ return routes;
186
+ if (!isStaticObject(routes.value))
187
+ return failure('resolveRoutes argument must be an object');
188
+ return success({ admin: '/admin', api: '/api', signIn: '/sign-in', ...routes.value });
189
+ }
190
+ return failure(`${unwrapped.getKindName()} is not static config`);
191
+ }
192
+ function evaluateObjectProperties(expression, sourceFile, state, propertyNames) {
193
+ const unwrapped = unwrap(expression);
194
+ if (Node.isIdentifier(unwrapped)) {
195
+ const declaration = findTopLevelConst(sourceFile, unwrapped.getText());
196
+ if (!declaration)
197
+ return failure(`${unwrapped.getText()} is not a same-file immutable constant`);
198
+ if (state.evaluating.has(declaration))
199
+ return failure('cyclic constants are not static config');
200
+ const initializer = declaration.getInitializer();
201
+ if (!initializer)
202
+ return failure(`${unwrapped.getText()} has no initializer`);
203
+ state.bindings.add(declaration);
204
+ state.evaluating.add(declaration);
205
+ const value = evaluateObjectProperties(initializer, sourceFile, state, propertyNames);
206
+ state.evaluating.delete(declaration);
207
+ return value;
208
+ }
209
+ if (Node.isCallExpression(unwrapped)) {
210
+ const callee = unwrapped.getExpression();
211
+ const args = unwrapped.getArguments();
212
+ if (!Node.isIdentifier(callee) || !isCoreResolveRoutesImport(callee)) {
213
+ return failure('calls are not static config');
214
+ }
215
+ if (args.length !== 1 || !args[0] || !Node.isExpression(args[0])) {
216
+ return failure('resolveRoutes must have one static object argument');
217
+ }
218
+ const value = evaluateObjectProperties(args[0], sourceFile, state, propertyNames);
219
+ if (!value.ok)
220
+ return value;
221
+ const defaults = { admin: '/admin', api: '/api', signIn: '/sign-in' };
222
+ return success(Object.fromEntries([...propertyNames].flatMap((name) => {
223
+ const propertyValue = value.value[name] ?? defaults[name];
224
+ return propertyValue === undefined ? [] : [[name, propertyValue]];
225
+ })));
226
+ }
227
+ if (!Node.isObjectLiteralExpression(unwrapped)) {
228
+ return failure(`${unwrapped.getKindName()} is not a static object`);
229
+ }
230
+ const value = Object.create(null);
231
+ for (const property of unwrapped.getProperties()) {
232
+ if (Node.isSpreadAssignment(property)) {
233
+ const spread = evaluateObjectProperties(property.getExpression(), sourceFile, state, propertyNames);
234
+ if (!spread.ok)
235
+ return spread;
236
+ Object.assign(value, spread.value);
237
+ continue;
238
+ }
239
+ if (Node.isPropertyAssignment(property)) {
240
+ const name = staticPropertyName(property.getNameNode());
241
+ if (name === null)
242
+ return failure('computed property names are not static config');
243
+ if (!propertyNames.has(name))
244
+ continue;
245
+ const propertyValue = evaluate(property.getInitializerOrThrow(), sourceFile, state);
246
+ if (!propertyValue.ok)
247
+ return propertyValue;
248
+ value[name] = propertyValue.value;
249
+ continue;
250
+ }
251
+ if (Node.isShorthandPropertyAssignment(property)) {
252
+ if (!propertyNames.has(property.getName()))
253
+ continue;
254
+ const propertyValue = evaluate(property.getNameNode(), sourceFile, state);
255
+ if (!propertyValue.ok)
256
+ return propertyValue;
257
+ value[property.getName()] = propertyValue.value;
258
+ continue;
259
+ }
260
+ const name = staticPropertyName(property.getNameNode());
261
+ if (name === null || propertyNames.has(name)) {
262
+ return failure('computed properties, methods, and accessors are not static config');
263
+ }
264
+ }
265
+ return success(value);
266
+ }
267
+ function evaluateArrayExpressions(expression, sourceFile, state) {
268
+ const unwrapped = unwrap(expression);
269
+ if (Node.isIdentifier(unwrapped)) {
270
+ const declaration = findTopLevelConst(sourceFile, unwrapped.getText());
271
+ if (!declaration)
272
+ return failure(`${unwrapped.getText()} is not a same-file immutable constant`);
273
+ if (state.evaluating.has(declaration))
274
+ return failure('cyclic constants are not static config');
275
+ const initializer = declaration.getInitializer();
276
+ if (!initializer)
277
+ return failure(`${unwrapped.getText()} has no initializer`);
278
+ state.bindings.add(declaration);
279
+ state.evaluating.add(declaration);
280
+ const value = evaluateArrayExpressions(initializer, sourceFile, state);
281
+ state.evaluating.delete(declaration);
282
+ return value;
283
+ }
284
+ if (!Node.isArrayLiteralExpression(unwrapped)) {
285
+ return failure(`${unwrapped.getKindName()} is not a static array`);
286
+ }
287
+ const values = [];
288
+ for (const element of unwrapped.getElements()) {
289
+ if (Node.isOmittedExpression(element))
290
+ return failure('array holes are not static config');
291
+ if (Node.isSpreadElement(element)) {
292
+ const spread = evaluateArrayExpressions(element.getExpression(), sourceFile, state);
293
+ if (!spread.ok)
294
+ return spread;
295
+ values.push(...spread.value);
296
+ }
297
+ else {
298
+ values.push(element);
299
+ }
300
+ }
301
+ return success(values);
302
+ }
303
+ function hasUnsafeBindingEffects(sourceFile, initialBindings) {
304
+ const symbols = new Set();
305
+ for (const declaration of initialBindings) {
306
+ const symbol = declaration.getSymbol();
307
+ if (symbol)
308
+ symbols.add(symbol);
309
+ }
310
+ const aliasAssignments = new Set();
311
+ let changed = true;
312
+ while (changed) {
313
+ changed = false;
314
+ for (const declaration of sourceFile.getVariableDeclarations()) {
315
+ const initializer = declaration.getInitializer();
316
+ if (!initializer || !referencesSymbols(initializer, symbols))
317
+ continue;
318
+ changed = addBindingSymbols(declaration, symbols) || changed;
319
+ }
320
+ for (const assignment of sourceFile.getDescendantsOfKind(SyntaxKind.BinaryExpression)) {
321
+ if (assignment.getOperatorToken().getKind() !== SyntaxKind.EqualsToken)
322
+ continue;
323
+ if (!referencesSymbols(assignment.getRight(), symbols))
324
+ continue;
325
+ const left = assignment.getLeft();
326
+ if (!Node.isIdentifier(left))
327
+ continue;
328
+ const symbol = left.getSymbol();
329
+ if (!symbol || symbols.has(symbol))
330
+ continue;
331
+ symbols.add(symbol);
332
+ aliasAssignments.add(assignment);
333
+ changed = true;
334
+ }
335
+ }
336
+ return sourceFile.getDescendants().some((node) => {
337
+ if (Node.isBinaryExpression(node) && isAssignmentOperator(node.getOperatorToken().getKind())) {
338
+ if (aliasAssignments.has(node))
339
+ return false;
340
+ return (referencesSymbols(node.getLeft(), symbols) || referencesSymbols(node.getRight(), symbols));
341
+ }
342
+ if (Node.isPrefixUnaryExpression(node) || Node.isPostfixUnaryExpression(node)) {
343
+ const operator = node.getOperatorToken();
344
+ return ((operator === SyntaxKind.PlusPlusToken || operator === SyntaxKind.MinusMinusToken) &&
345
+ referencesSymbols(node.getOperand(), symbols));
346
+ }
347
+ if (Node.isDeleteExpression(node))
348
+ return referencesSymbols(node.getExpression(), symbols);
349
+ if (Node.isCallExpression(node)) {
350
+ const callee = node.getExpression();
351
+ if (Node.isIdentifier(callee) && isCoreResolveRoutesImport(callee)) {
352
+ return false;
353
+ }
354
+ return (referencesSymbols(callee, symbols) ||
355
+ node.getArguments().some((argument) => referencesSymbols(argument, symbols)));
356
+ }
357
+ if (Node.isNewExpression(node)) {
358
+ return node.getArguments().some((argument) => referencesSymbols(argument, symbols));
359
+ }
360
+ if (Node.isForInStatement(node) || Node.isForOfStatement(node)) {
361
+ const initializer = node.getInitializer();
362
+ return Node.isExpression(initializer) && referencesSymbols(initializer, symbols);
363
+ }
364
+ return false;
365
+ });
366
+ }
367
+ function addBindingSymbols(declaration, symbols) {
368
+ const name = declaration.getNameNode();
369
+ const identifiers = Node.isIdentifier(name)
370
+ ? [name]
371
+ : name.getDescendantsOfKind(SyntaxKind.Identifier);
372
+ let changed = false;
373
+ for (const identifier of identifiers) {
374
+ const symbol = identifier.getSymbol();
375
+ if (!symbol || symbols.has(symbol))
376
+ continue;
377
+ symbols.add(symbol);
378
+ changed = true;
379
+ }
380
+ return changed;
381
+ }
382
+ function referencesSymbols(node, symbols) {
383
+ const identifiers = Node.isIdentifier(node)
384
+ ? [node, ...node.getDescendantsOfKind(SyntaxKind.Identifier)]
385
+ : node.getDescendantsOfKind(SyntaxKind.Identifier);
386
+ return identifiers.some((identifier) => {
387
+ const symbol = identifier.getSymbol();
388
+ return symbol !== undefined && symbols.has(symbol);
389
+ });
390
+ }
391
+ function isAssignmentOperator(kind) {
392
+ return kind >= SyntaxKind.FirstAssignment && kind <= SyntaxKind.LastAssignment;
393
+ }
394
+ function unwrap(expression) {
395
+ let current = expression;
396
+ while (Node.isParenthesizedExpression(current) ||
397
+ Node.isAsExpression(current) ||
398
+ Node.isSatisfiesExpression(current) ||
399
+ Node.isTypeAssertion(current)) {
400
+ current = current.getExpression();
401
+ }
402
+ return current;
403
+ }
404
+ function findExportedConst(sourceFile, name) {
405
+ const declaration = findTopLevelConst(sourceFile, name);
406
+ const statement = declaration?.getVariableStatement();
407
+ return statement?.isExported() ? declaration : undefined;
408
+ }
409
+ function findTopLevelConst(sourceFile, name) {
410
+ return sourceFile.getVariableDeclarations().find((declaration) => {
411
+ const statement = declaration.getVariableStatement();
412
+ return (declaration.getName() === name &&
413
+ statement?.getParent() === sourceFile &&
414
+ statement.getDeclarationKind() === VariableDeclarationKind.Const);
415
+ });
416
+ }
417
+ function staticPropertyName(name) {
418
+ if (Node.isIdentifier(name) || Node.isStringLiteral(name) || Node.isNumericLiteral(name)) {
419
+ return Node.isIdentifier(name) ? name.getText() : String(name.getLiteralValue());
420
+ }
421
+ return null;
422
+ }
423
+ function isCoreResolveRoutesImport(identifier) {
424
+ const declarations = identifier.getSymbol()?.getDeclarations() ?? [];
425
+ if (declarations.length !== 1)
426
+ return false;
427
+ const [declaration] = declarations;
428
+ if (!declaration || !Node.isImportSpecifier(declaration) || declaration.isTypeOnly())
429
+ return false;
430
+ const importDeclaration = declaration.getImportDeclaration();
431
+ return (!importDeclaration.isTypeOnly() &&
432
+ importDeclaration.getModuleSpecifierValue() === '@byline/core' &&
433
+ declaration.getName() === 'resolveRoutes');
434
+ }
435
+ export function isStaticObject(value) {
436
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
437
+ }
438
+ function success(value) {
439
+ return { ok: true, value };
440
+ }
441
+ function failure(error) {
442
+ return { ok: false, error };
443
+ }
444
+ //# sourceMappingURL=static-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-config.js","sourceRoot":"","sources":["../../src/lib/static-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=static-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-config.test.d.ts","sourceRoot":"","sources":["../../src/lib/static-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { evaluateExportedConst, hasExportedCoreResolveRoutesCall } from './static-config.js';
3
+ describe('static config evaluation', () => {
4
+ it('supports constants, spreads, parentheses, as const, and satisfies', () => {
5
+ const result = evaluateExportedConst(`
6
+ const admin = '/cms'
7
+ const base = ({ admin, api: '/rpc' } as const)
8
+ const signIn = '/staff/login' as const
9
+ export const routes = ({ ...base, signIn } as const) satisfies Record<string, string>
10
+ `, 'routes');
11
+ expect(result).toEqual({
12
+ ok: true,
13
+ value: { admin: '/cms', api: '/rpc', signIn: '/staff/login' },
14
+ });
15
+ });
16
+ it('supports no-substitution template literal strings', () => {
17
+ expect(evaluateExportedConst('export const routes = { admin: `/cms` }', 'routes')).toEqual({
18
+ ok: true,
19
+ value: { admin: '/cms' },
20
+ });
21
+ });
22
+ it('rejects template literals with substitutions', () => {
23
+ const source = `const base = '/'; export const routes = { admin: \`\${base}cms\` }`;
24
+ expect(evaluateExportedConst(source, 'routes').ok).toBe(false);
25
+ });
26
+ it('recognizes only resolveRoutes imported from @byline/core', () => {
27
+ expect(evaluateExportedConst(`
28
+ import { resolveRoutes as resolve } from '@byline/core'
29
+ const input = { admin: '/cms' } as const
30
+ export const routes = resolve(input)
31
+ `, 'routes')).toEqual({
32
+ ok: true,
33
+ value: { admin: '/cms', api: '/api', signIn: '/sign-in' },
34
+ });
35
+ expect(evaluateExportedConst(`
36
+ import { resolveRoutes } from './routes.js'
37
+ export const routes = resolveRoutes({ admin: '/cms' })
38
+ `, 'routes').ok).toBe(false);
39
+ });
40
+ it.each([
41
+ ["import { value } from './config.js'; export const routes = value", 'imported'],
42
+ ["const key = 'admin'; export const routes = { [key]: '/cms' }", 'computed'],
43
+ ["let value = '/cms'; export const routes = { admin: value }", 'mutable'],
44
+ ['const a = b; const b = a; export const routes = a', 'cyclic'],
45
+ ['export const routes = process.env.ROUTES', 'property access'],
46
+ ['export const routes = makeRoutes()', 'arbitrary call'],
47
+ ])('rejects %s values', (source) => {
48
+ expect(evaluateExportedConst(source, 'routes').ok).toBe(false);
49
+ });
50
+ it('does not execute source while parsing it', () => {
51
+ const marker = '__bylineStaticParserExecuted';
52
+ Reflect.deleteProperty(globalThis, marker);
53
+ const result = evaluateExportedConst(`
54
+ globalThis.${marker} = true
55
+ export const routes = runUntrustedCode()
56
+ `, 'routes');
57
+ expect(result.ok).toBe(false);
58
+ expect(Reflect.get(globalThis, marker)).toBeUndefined();
59
+ });
60
+ it.each([
61
+ ["export const routes = { admin: '/cms'", 'parse diagnostics'],
62
+ [
63
+ "const base = { admin: '/cms' }; base.admin = '/evil'; export const routes = base",
64
+ 'assignment',
65
+ ],
66
+ [
67
+ "const base = { admin: '/cms' }; Object.assign(base, { admin: '/evil' }); export const routes = base",
68
+ 'Object.assign',
69
+ ],
70
+ ['const base = { admin: 1 }; base.admin++; export const routes = base', 'increment'],
71
+ ["const base = { admin: '/cms' }; mutate(base); export const routes = base", 'effectful call'],
72
+ [
73
+ "const base = { admin: '/cms' }; const alias = base; alias.admin = '/evil'; export const routes = base",
74
+ 'alias mutation',
75
+ ],
76
+ [
77
+ "const base = { admin: '/cms' }; let alias; alias = base; alias.admin = '/evil'; export const routes = base",
78
+ 'assignment alias mutation',
79
+ ],
80
+ [
81
+ "const base = { admin: '/cms' }; const holder = {}; holder.value = base; export const routes = base",
82
+ 'property escape',
83
+ ],
84
+ ])('rejects evaluated-binding mutation: %s', (source) => {
85
+ expect(evaluateExportedConst(source, 'routes').ok).toBe(false);
86
+ });
87
+ it('does not confuse shadowed identifiers with evaluated bindings', () => {
88
+ const result = evaluateExportedConst(`
89
+ const admin = '/cms'
90
+ function unrelated(admin: string) { console.log(admin) }
91
+ export const routes = { admin }
92
+ `, 'routes');
93
+ expect(result).toEqual({ ok: true, value: { admin: '/cms' } });
94
+ });
95
+ it('rejects a malformed local declaration that collides with the core import', () => {
96
+ const source = `
97
+ import { resolveRoutes } from '@byline/core'
98
+ const resolveRoutes = (value: unknown) => ({ admin: '/evil', value })
99
+ export const routes = resolveRoutes({ admin: '/cms' })
100
+ `;
101
+ expect(evaluateExportedConst(source, 'routes').ok).toBe(false);
102
+ expect(hasExportedCoreResolveRoutesCall(source, 'routes')).toBe(false);
103
+ });
104
+ });
105
+ //# sourceMappingURL=static-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-config.test.js","sourceRoot":"","sources":["../../src/lib/static-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=template-hook-boundary.test.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-hook-boundary.test.node.d.ts","sourceRoot":"","sources":["../../src/lib/template-hook-boundary.test.node.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { describe, expect, it } from 'vitest';
5
+ const templates = resolve(dirname(fileURLToPath(import.meta.url)), '../templates');
6
+ function source(path) {
7
+ return readFileSync(resolve(templates, path), 'utf8');
8
+ }
9
+ describe('scaffold server hook boundary', () => {
10
+ it('keeps the example schema host-agnostic and registers its hooks from the server graph', () => {
11
+ const schema = source('byline-examples/collections/docs/schema.ts');
12
+ const registry = source('byline-examples/collections/server-hooks.ts');
13
+ const serverConfig = source('byline-examples/server.config.ts');
14
+ expect(schema).not.toContain('@tanstack/react-start');
15
+ expect(schema).not.toContain('createServerOnlyFn');
16
+ expect(schema).not.toContain("'./hooks.js'");
17
+ expect(registry).toContain("docs: () => import('./docs/hooks.js')");
18
+ expect(serverConfig).toContain("import { serverHooks } from './collections/server-hooks.js'");
19
+ expect(serverConfig).toContain('hooks: serverHooks');
20
+ });
21
+ it('ships the registry seam in both scaffold flavors and configures the host build guard', () => {
22
+ for (const flavor of ['byline', 'byline-examples']) {
23
+ expect(source(`${flavor}/collections/server-hooks.ts`)).toContain('satisfies ServerHooksConfig');
24
+ expect(source(`${flavor}/server.config.ts`)).toContain('hooks: serverHooks');
25
+ }
26
+ expect(source('host/vite.config.ts')).toContain("import { bylineClientHookBoundary } from '@byline/host-tanstack-start/vite'");
27
+ expect(source('host/vite.config.ts')).toContain('bylineClientHookBoundary()');
28
+ });
29
+ });
30
+ //# sourceMappingURL=template-hook-boundary.test.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-hook-boundary.test.node.js","sourceRoot":"","sources":["../../src/lib/template-hook-boundary.test.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;AAElF,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;AACvD,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,MAAM,GAAG,MAAM,CAAC,4CAA4C,CAAC,CAAA;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,6CAA6C,CAAC,CAAA;QACtE,MAAM,YAAY,GAAG,MAAM,CAAC,kCAAkC,CAAC,CAAA;QAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAA;QACnE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,6DAA6D,CAAC,CAAA;QAC7F,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAC/D,6BAA6B,CAC9B,CAAA;YACD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC9E,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAC7C,6EAA6E,CAC9E,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ /** Normalize a template-relative path independently of the host platform. */
2
+ export declare function toPosixTemplatePath(path: string): string;
3
+ /** Source comparison used only for recognizing exact canonical predecessors. */
4
+ export declare function normalizeTemplateSource(source: string): string;
5
+ //# sourceMappingURL=template-path.d.ts.map