@zmdb/cli 1.0.0-beta.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 (207) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +19 -0
  3. package/dist/__fixtures__/http-client/src/contract.d.ts +38 -0
  4. package/dist/__fixtures__/http-client/src/contract.d.ts.map +1 -0
  5. package/dist/__fixtures__/http-client/src/contract.js +121 -0
  6. package/dist/__fixtures__/http-client/src/contract.js.map +1 -0
  7. package/dist/__fixtures__/http-client/src/models.d.ts +11 -0
  8. package/dist/__fixtures__/http-client/src/models.d.ts.map +1 -0
  9. package/dist/__fixtures__/http-client/src/models.js +2 -0
  10. package/dist/__fixtures__/http-client/src/models.js.map +1 -0
  11. package/dist/__fixtures__/http-client/src/schema.d.ts +4 -0
  12. package/dist/__fixtures__/http-client/src/schema.d.ts.map +1 -0
  13. package/dist/__fixtures__/http-client/src/schema.js +2 -0
  14. package/dist/__fixtures__/http-client/src/schema.js.map +1 -0
  15. package/dist/__fixtures__/http-client/src/unrelated.d.ts +2 -0
  16. package/dist/__fixtures__/http-client/src/unrelated.d.ts.map +1 -0
  17. package/dist/__fixtures__/http-client/src/unrelated.js +2 -0
  18. package/dist/__fixtures__/http-client/src/unrelated.js.map +1 -0
  19. package/dist/__fixtures__/http-client/zmdb.config.d.ts +16 -0
  20. package/dist/__fixtures__/http-client/zmdb.config.d.ts.map +1 -0
  21. package/dist/__fixtures__/http-client/zmdb.config.js +12 -0
  22. package/dist/__fixtures__/http-client/zmdb.config.js.map +1 -0
  23. package/dist/__fixtures__/project/src/schema.d.ts +6 -0
  24. package/dist/__fixtures__/project/src/schema.d.ts.map +1 -0
  25. package/dist/__fixtures__/project/src/schema.js +2 -0
  26. package/dist/__fixtures__/project/src/schema.js.map +1 -0
  27. package/dist/__fixtures__/project/zmdb.config.d.ts +22 -0
  28. package/dist/__fixtures__/project/zmdb.config.d.ts.map +1 -0
  29. package/dist/__fixtures__/project/zmdb.config.js +55 -0
  30. package/dist/__fixtures__/project/zmdb.config.js.map +1 -0
  31. package/dist/application-loader.d.ts +4 -0
  32. package/dist/application-loader.d.ts.map +1 -0
  33. package/dist/application-loader.js +102 -0
  34. package/dist/application-loader.js.map +1 -0
  35. package/dist/args.d.ts +23 -0
  36. package/dist/args.d.ts.map +1 -0
  37. package/dist/args.js +353 -0
  38. package/dist/args.js.map +1 -0
  39. package/dist/atomic.d.ts +13 -0
  40. package/dist/atomic.d.ts.map +1 -0
  41. package/dist/atomic.js +28 -0
  42. package/dist/atomic.js.map +1 -0
  43. package/dist/bin.d.ts +3 -0
  44. package/dist/bin.d.ts.map +1 -0
  45. package/dist/bin.js +4 -0
  46. package/dist/bin.js.map +1 -0
  47. package/dist/commands/check.d.ts +5 -0
  48. package/dist/commands/check.d.ts.map +1 -0
  49. package/dist/commands/check.js +7 -0
  50. package/dist/commands/check.js.map +1 -0
  51. package/dist/commands/client.d.ts +38 -0
  52. package/dist/commands/client.d.ts.map +1 -0
  53. package/dist/commands/client.js +347 -0
  54. package/dist/commands/client.js.map +1 -0
  55. package/dist/commands/codegen.d.ts +9 -0
  56. package/dist/commands/codegen.d.ts.map +1 -0
  57. package/dist/commands/codegen.js +56 -0
  58. package/dist/commands/codegen.js.map +1 -0
  59. package/dist/commands/embed.d.ts +8 -0
  60. package/dist/commands/embed.d.ts.map +1 -0
  61. package/dist/commands/embed.js +17 -0
  62. package/dist/commands/embed.js.map +1 -0
  63. package/dist/commands/export.d.ts +5 -0
  64. package/dist/commands/export.d.ts.map +1 -0
  65. package/dist/commands/export.js +6 -0
  66. package/dist/commands/export.js.map +1 -0
  67. package/dist/commands/generate.d.ts +5 -0
  68. package/dist/commands/generate.d.ts.map +1 -0
  69. package/dist/commands/generate.js +6 -0
  70. package/dist/commands/generate.js.map +1 -0
  71. package/dist/commands/migrate.d.ts +9 -0
  72. package/dist/commands/migrate.d.ts.map +1 -0
  73. package/dist/commands/migrate.js +18 -0
  74. package/dist/commands/migrate.js.map +1 -0
  75. package/dist/commands/new.d.ts +4 -0
  76. package/dist/commands/new.d.ts.map +1 -0
  77. package/dist/commands/new.js +35 -0
  78. package/dist/commands/new.js.map +1 -0
  79. package/dist/commands/pull.d.ts +5 -0
  80. package/dist/commands/pull.d.ts.map +1 -0
  81. package/dist/commands/pull.js +14 -0
  82. package/dist/commands/pull.js.map +1 -0
  83. package/dist/commands/push.d.ts +6 -0
  84. package/dist/commands/push.d.ts.map +1 -0
  85. package/dist/commands/push.js +11 -0
  86. package/dist/commands/push.js.map +1 -0
  87. package/dist/commands/studio.d.ts +31 -0
  88. package/dist/commands/studio.d.ts.map +1 -0
  89. package/dist/commands/studio.js +154 -0
  90. package/dist/commands/studio.js.map +1 -0
  91. package/dist/commands/upgrade.d.ts +5 -0
  92. package/dist/commands/upgrade.d.ts.map +1 -0
  93. package/dist/commands/upgrade.js +11 -0
  94. package/dist/commands/upgrade.js.map +1 -0
  95. package/dist/database.d.ts +4 -0
  96. package/dist/database.d.ts.map +1 -0
  97. package/dist/database.js +8 -0
  98. package/dist/database.js.map +1 -0
  99. package/dist/errors.d.ts +7 -0
  100. package/dist/errors.d.ts.map +1 -0
  101. package/dist/errors.js +20 -0
  102. package/dist/errors.js.map +1 -0
  103. package/dist/index.d.ts +34 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +626 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/lifecycle.d.ts +6 -0
  108. package/dist/lifecycle.d.ts.map +1 -0
  109. package/dist/lifecycle.js +75 -0
  110. package/dist/lifecycle.js.map +1 -0
  111. package/dist/migration-project.d.ts +14 -0
  112. package/dist/migration-project.d.ts.map +1 -0
  113. package/dist/migration-project.js +74 -0
  114. package/dist/migration-project.js.map +1 -0
  115. package/dist/output.d.ts +27 -0
  116. package/dist/output.d.ts.map +1 -0
  117. package/dist/output.js +60 -0
  118. package/dist/output.js.map +1 -0
  119. package/dist/repl.d.ts +48 -0
  120. package/dist/repl.d.ts.map +1 -0
  121. package/dist/repl.js +265 -0
  122. package/dist/repl.js.map +1 -0
  123. package/dist/scaffold.d.ts +28 -0
  124. package/dist/scaffold.d.ts.map +1 -0
  125. package/dist/scaffold.js +414 -0
  126. package/dist/scaffold.js.map +1 -0
  127. package/dist/studio/index.d.ts +20 -0
  128. package/dist/studio/index.d.ts.map +1 -0
  129. package/dist/studio/index.js +607 -0
  130. package/dist/studio/index.js.map +1 -0
  131. package/dist/templates/command.d.ts +3 -0
  132. package/dist/templates/command.d.ts.map +1 -0
  133. package/dist/templates/command.js +65 -0
  134. package/dist/templates/command.js.map +1 -0
  135. package/dist/templates/controller.d.ts +3 -0
  136. package/dist/templates/controller.d.ts.map +1 -0
  137. package/dist/templates/controller.js +41 -0
  138. package/dist/templates/controller.js.map +1 -0
  139. package/dist/templates/index.d.ts +4 -0
  140. package/dist/templates/index.d.ts.map +1 -0
  141. package/dist/templates/index.js +18 -0
  142. package/dist/templates/index.js.map +1 -0
  143. package/dist/templates/module.d.ts +3 -0
  144. package/dist/templates/module.d.ts.map +1 -0
  145. package/dist/templates/module.js +41 -0
  146. package/dist/templates/module.js.map +1 -0
  147. package/dist/templates/project.d.ts +3 -0
  148. package/dist/templates/project.d.ts.map +1 -0
  149. package/dist/templates/project.js +280 -0
  150. package/dist/templates/project.js.map +1 -0
  151. package/dist/templates/repository.d.ts +3 -0
  152. package/dist/templates/repository.d.ts.map +1 -0
  153. package/dist/templates/repository.js +66 -0
  154. package/dist/templates/repository.js.map +1 -0
  155. package/dist/templates/schema.d.ts +3 -0
  156. package/dist/templates/schema.d.ts.map +1 -0
  157. package/dist/templates/schema.js +36 -0
  158. package/dist/templates/schema.js.map +1 -0
  159. package/dist/templates/types.d.ts +25 -0
  160. package/dist/templates/types.d.ts.map +1 -0
  161. package/dist/templates/types.js +17 -0
  162. package/dist/templates/types.js.map +1 -0
  163. package/package.json +72 -0
  164. package/src/__fixtures__/http-client/package.json +5 -0
  165. package/src/__fixtures__/http-client/src/contract.ts +85 -0
  166. package/src/__fixtures__/http-client/src/models.ts +12 -0
  167. package/src/__fixtures__/http-client/src/schema.ts +3 -0
  168. package/src/__fixtures__/http-client/src/unrelated.ts +1 -0
  169. package/src/__fixtures__/http-client/tsconfig.json +17 -0
  170. package/src/__fixtures__/http-client/zmdb.config.ts +12 -0
  171. package/src/__fixtures__/project/package.json +5 -0
  172. package/src/__fixtures__/project/src/schema.ts +6 -0
  173. package/src/__fixtures__/project/tsconfig.json +24 -0
  174. package/src/__fixtures__/project/zmdb.config.ts +57 -0
  175. package/src/application-loader.ts +108 -0
  176. package/src/args.ts +391 -0
  177. package/src/atomic.ts +43 -0
  178. package/src/bin.ts +5 -0
  179. package/src/commands/check.ts +11 -0
  180. package/src/commands/client.ts +415 -0
  181. package/src/commands/codegen.ts +73 -0
  182. package/src/commands/embed.ts +36 -0
  183. package/src/commands/export.ts +10 -0
  184. package/src/commands/generate.ts +14 -0
  185. package/src/commands/migrate.ts +38 -0
  186. package/src/commands/new.ts +48 -0
  187. package/src/commands/pull.ts +32 -0
  188. package/src/commands/push.ts +21 -0
  189. package/src/commands/studio.ts +200 -0
  190. package/src/commands/upgrade.ts +14 -0
  191. package/src/database.ts +9 -0
  192. package/src/errors.ts +19 -0
  193. package/src/index.ts +710 -0
  194. package/src/lifecycle.ts +73 -0
  195. package/src/migration-project.ts +91 -0
  196. package/src/output.ts +77 -0
  197. package/src/repl.ts +328 -0
  198. package/src/scaffold.ts +485 -0
  199. package/src/studio/index.ts +674 -0
  200. package/src/templates/command.ts +66 -0
  201. package/src/templates/controller.ts +42 -0
  202. package/src/templates/index.ts +29 -0
  203. package/src/templates/module.ts +42 -0
  204. package/src/templates/project.ts +281 -0
  205. package/src/templates/repository.ts +67 -0
  206. package/src/templates/schema.ts +37 -0
  207. package/src/templates/types.ts +46 -0
@@ -0,0 +1,414 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { glob, mkdir, readFile, realpath, writeFile } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { templateFor, } from './templates/index.js';
6
+ import { FORMAT_OPTIONS } from './templates/types.js';
7
+ const SCAFFOLD_KINDS = ['project', 'schema', 'controller', 'module', 'repository', 'command'];
8
+ const PACKAGE_VERSION = packageVersion();
9
+ let formatter;
10
+ export class ScaffoldUsageError extends Error {
11
+ }
12
+ export class ScaffoldConflictError extends Error {
13
+ }
14
+ /** Resolve, format and write one scaffold without ever editing an existing file. */
15
+ export async function scaffold(options) {
16
+ const kind = scaffoldKind(options.kind);
17
+ const name = scaffoldName(options.name);
18
+ const cwd = resolve(options.cwd);
19
+ const target = await resolveTarget(cwd, kind, name, options.package);
20
+ const plan = templateFor(kind)({ name, packageVersion: PACKAGE_VERSION });
21
+ const files = await formattedFiles(plan);
22
+ const absoluteFiles = files.map(file => ({
23
+ ...file,
24
+ absolutePath: confinedPath(target.root, file.path),
25
+ }));
26
+ for (const file of absoluteFiles)
27
+ await rejectSymlinkParents(target.root, file.absolutePath);
28
+ const conflicts = absoluteFiles.filter(file => existsSync(file.absolutePath));
29
+ if (conflicts.length > 0) {
30
+ throw new ScaffoldConflictError(`refusing to overwrite existing ${plural(conflicts.length, 'file')}: ${conflicts
31
+ .map(file => file.path)
32
+ .join(', ')}`);
33
+ }
34
+ if (options.dryRun !== true) {
35
+ for (const file of absoluteFiles) {
36
+ await mkdir(dirname(file.absolutePath), { recursive: true });
37
+ try {
38
+ await writeFile(file.absolutePath, file.source, { flag: 'wx' });
39
+ }
40
+ catch (error) {
41
+ if (errorCode(error) === 'EEXIST') {
42
+ throw new ScaffoldConflictError(`refusing to overwrite existing file: ${file.path}`, { cause: error });
43
+ }
44
+ throw error;
45
+ }
46
+ }
47
+ }
48
+ return {
49
+ kind,
50
+ name,
51
+ target: target.displayRoot,
52
+ files: files.map(file => ({
53
+ path: kind === 'project' ? `${name.fileStem}/${file.path}` : file.path,
54
+ source: file.source,
55
+ })),
56
+ instructions: plan.instructions ?? [],
57
+ dryRun: options.dryRun === true,
58
+ };
59
+ }
60
+ export function renderScaffold(result) {
61
+ if (result.dryRun) {
62
+ return result.files.map(file => `--- ${file.path}\n${file.source}`).join('');
63
+ }
64
+ const created = result.files.map(file => `created ${file.path}`).join('\n');
65
+ const instructions = result.instructions.length === 0 ? '' : `\n\n${result.instructions.join('\n\n')}`;
66
+ return `${created}${instructions}\n`;
67
+ }
68
+ function scaffoldKind(value) {
69
+ const kind = SCAFFOLD_KINDS.find(candidate => candidate === value);
70
+ if (kind !== undefined)
71
+ return kind;
72
+ throw new ScaffoldUsageError(`unknown scaffold kind "${value}"; expected ${SCAFFOLD_KINDS.map(candidate => `"${candidate}"`).join(', ')}`);
73
+ }
74
+ function scaffoldName(input) {
75
+ if (input.includes('/') || input.includes('\\') || input === '.' || input === '..') {
76
+ throw new ScaffoldUsageError(`name "${input}" must not contain a path`);
77
+ }
78
+ const words = input
79
+ .trim()
80
+ .replaceAll(/([a-z0-9])([A-Z])/g, '$1-$2')
81
+ .split(/[^A-Za-z0-9]+/)
82
+ .filter(word => word.length > 0);
83
+ const fileStem = words.map(word => word.toLowerCase()).join('-');
84
+ const pascal = words.map(capitalize).join('');
85
+ if (fileStem.length === 0 || !/^[$A-Z_a-z][$\w]*$/.test(pascal)) {
86
+ throw new ScaffoldUsageError(`name "${input}" cannot become a valid TypeScript identifier`);
87
+ }
88
+ const first = pascal[0];
89
+ if (first === undefined) {
90
+ throw new ScaffoldUsageError(`name "${input}" cannot become a valid TypeScript identifier`);
91
+ }
92
+ const camel = `${first.toLowerCase()}${pascal.slice(1)}`;
93
+ const snake = words.map(word => word.toLowerCase()).join('_');
94
+ return {
95
+ input,
96
+ fileStem,
97
+ pascal,
98
+ camel,
99
+ constant: words.map(word => word.toUpperCase()).join('_'),
100
+ table: pluralTable(snake),
101
+ };
102
+ }
103
+ function capitalize(value) {
104
+ const first = value[0];
105
+ return first === undefined ? value : `${first.toUpperCase()}${value.slice(1).toLowerCase()}`;
106
+ }
107
+ function pluralTable(value) {
108
+ if (value.endsWith('s'))
109
+ return value;
110
+ if (value.endsWith('ch') || value.endsWith('sh') || /[xz]$/.test(value))
111
+ return `${value}es`;
112
+ if (/[^aeiou]y$/.test(value))
113
+ return `${value.slice(0, -1)}ies`;
114
+ return `${value}s`;
115
+ }
116
+ async function formattedFiles(plan) {
117
+ const files = [];
118
+ for (const file of plan.files) {
119
+ files.push({
120
+ path: normalizeTemplatePath(file.path),
121
+ source: await formatTemplate(file),
122
+ });
123
+ }
124
+ return files;
125
+ }
126
+ async function formatTemplate(file) {
127
+ if (file.path.endsWith('.ts') || file.path.endsWith('.mjs') || file.path.endsWith('.json')) {
128
+ formatter ??= import('oxfmt');
129
+ const { format } = await formatter;
130
+ const result = await format(file.path, file.source, FORMAT_OPTIONS);
131
+ if (result.errors.length > 0) {
132
+ throw new TypeError(`oxfmt could not format generated ${file.path}: ${JSON.stringify(result.errors)}`);
133
+ }
134
+ return result.code;
135
+ }
136
+ return `${file.source.replaceAll(/\r\n?/g, '\n').replaceAll(/\n+$/g, '')}\n`;
137
+ }
138
+ function normalizeTemplatePath(path) {
139
+ const normalized = path.replaceAll('\\', '/').replaceAll(/^\.\/+/g, '');
140
+ if (normalized.length === 0 || normalized.startsWith('/') || normalized.split('/').includes('..')) {
141
+ throw new TypeError(`template path must stay below the target: ${JSON.stringify(path)}`);
142
+ }
143
+ return normalized;
144
+ }
145
+ async function rejectSymlinkParents(root, target) {
146
+ const actualRoot = await resolvedExistingParent(root);
147
+ const actualParent = await resolvedExistingParent(dirname(target));
148
+ if (!inside(actualRoot, actualParent)) {
149
+ throw new ScaffoldUsageError(`template path crosses a symlink outside the target: ${target}`);
150
+ }
151
+ }
152
+ async function resolvedExistingParent(path) {
153
+ try {
154
+ return await realpath(path);
155
+ }
156
+ catch (error) {
157
+ if (errorCode(error) !== 'ENOENT')
158
+ throw error;
159
+ const parent = dirname(path);
160
+ if (parent === path)
161
+ throw error;
162
+ return resolve(await resolvedExistingParent(parent), relative(parent, path));
163
+ }
164
+ }
165
+ function confinedPath(root, path) {
166
+ const absolute = resolve(root, ...path.split('/'));
167
+ if (!inside(root, absolute)) {
168
+ throw new TypeError(`template path escapes the target: ${JSON.stringify(path)}`);
169
+ }
170
+ return absolute;
171
+ }
172
+ async function resolveTarget(cwd, kind, name, requestedPackage) {
173
+ const [workspace, nearestPackage] = await Promise.all([discoverWorkspace(cwd), nearestPackageRoot(cwd)]);
174
+ let base;
175
+ if (workspace === undefined) {
176
+ if (requestedPackage !== undefined) {
177
+ throw new ScaffoldUsageError(`--package "${requestedPackage}" was supplied, but no workspace was found`);
178
+ }
179
+ if (kind === 'project') {
180
+ base = cwd;
181
+ }
182
+ else if (nearestPackage === undefined) {
183
+ throw new ScaffoldUsageError(`no package.json was found from ${cwd}`);
184
+ }
185
+ else {
186
+ base = nearestPackage;
187
+ }
188
+ }
189
+ else if (requestedPackage !== undefined) {
190
+ base = namedWorkspacePackage(workspace, requestedPackage).path;
191
+ }
192
+ else {
193
+ const enclosing = workspace.packages.filter(candidate => inside(candidate.path, cwd));
194
+ if (enclosing.length === 1) {
195
+ const selected = enclosing[0];
196
+ if (selected === undefined)
197
+ throw new Error('unreachable workspace package selection');
198
+ base = selected.path;
199
+ }
200
+ else if (nearestPackage !== undefined &&
201
+ nearestPackage !== workspace.root &&
202
+ inside(workspace.root, nearestPackage) &&
203
+ !workspace.packages.some(candidate => inside(candidate.path, nearestPackage))) {
204
+ // A package nested below an unrelated workspace root is still its own boundary.
205
+ // This is how generated fixtures and vendored projects avoid being mistaken for
206
+ // undeclared packages of the outer checkout.
207
+ base = nearestPackage;
208
+ }
209
+ else {
210
+ throw ambiguousWorkspace(workspace);
211
+ }
212
+ }
213
+ const root = kind === 'project' ? resolve(base, name.fileStem) : base;
214
+ return {
215
+ root,
216
+ displayRoot: relative(cwd, root) || '.',
217
+ };
218
+ }
219
+ function namedWorkspacePackage(workspace, requested) {
220
+ const matches = workspace.packages.filter(candidate => candidate.name === requested || candidate.relativePath === requested);
221
+ if (matches.length !== 1) {
222
+ const qualifier = matches.length === 0 ? 'was not found' : 'is ambiguous';
223
+ throw new ScaffoldUsageError(`workspace package "${requested}" ${qualifier}; candidates:\n${workspaceCandidates(workspace)}`);
224
+ }
225
+ const match = matches[0];
226
+ if (match === undefined)
227
+ throw new Error('unreachable named workspace package selection');
228
+ return match;
229
+ }
230
+ function ambiguousWorkspace(workspace) {
231
+ return new ScaffoldUsageError(`refusing to guess a workspace package; pass --package <name>. Candidates:\n${workspaceCandidates(workspace)}`);
232
+ }
233
+ function workspaceCandidates(workspace) {
234
+ if (workspace.packages.length === 0)
235
+ return ' (none found)';
236
+ return workspace.packages.map(candidate => ` ${candidate.name} (${candidate.relativePath})`).join('\n');
237
+ }
238
+ async function discoverWorkspace(cwd) {
239
+ let directory = cwd;
240
+ while (true) {
241
+ const manifest = await readJson(resolve(directory, 'package.json'));
242
+ const packagePatterns = workspacePatterns(manifest);
243
+ const pnpmPatterns = packagePatterns === undefined ? await readPnpmWorkspace(directory) : undefined;
244
+ const patterns = packagePatterns ?? pnpmPatterns;
245
+ if (patterns !== undefined) {
246
+ return {
247
+ root: directory,
248
+ packages: await workspacePackages(directory, patterns),
249
+ };
250
+ }
251
+ const parent = dirname(directory);
252
+ if (parent === directory)
253
+ return undefined;
254
+ directory = parent;
255
+ }
256
+ }
257
+ async function workspacePackages(root, patterns) {
258
+ const include = patterns
259
+ .filter(pattern => !pattern.startsWith('!'))
260
+ .map(packageManifestPattern)
261
+ .filter(pattern => pattern.length > 0);
262
+ const exclude = patterns
263
+ .filter(pattern => pattern.startsWith('!'))
264
+ .map(pattern => packageManifestPattern(pattern.slice(1)))
265
+ .filter(pattern => pattern.length > 0);
266
+ if (include.length === 0)
267
+ return [];
268
+ const rootPath = await realpath(root);
269
+ const packages = new Map();
270
+ for await (const manifestPath of glob(include, {
271
+ cwd: root,
272
+ ...(exclude.length === 0 ? {} : { exclude }),
273
+ })) {
274
+ const lexicalPath = resolve(root, dirname(manifestPath));
275
+ const packagePath = await realpath(lexicalPath);
276
+ if (!inside(rootPath, packagePath))
277
+ continue;
278
+ const manifest = await readJson(resolve(packagePath, 'package.json'));
279
+ const relativePath = relative(rootPath, packagePath).split(sep).join('/');
280
+ const named = stringProperty(manifest, 'name');
281
+ packages.set(packagePath, {
282
+ name: named ?? relativePath,
283
+ path: packagePath,
284
+ relativePath,
285
+ });
286
+ }
287
+ return [...packages.values()].toSorted((left, right) => {
288
+ const byName = left.name.localeCompare(right.name);
289
+ return byName === 0 ? left.relativePath.localeCompare(right.relativePath) : byName;
290
+ });
291
+ }
292
+ function packageManifestPattern(pattern) {
293
+ const trimmed = pattern.trim().replaceAll('\\', '/').replaceAll(/\/+$/g, '');
294
+ if (trimmed.length === 0)
295
+ return '';
296
+ return trimmed.endsWith('package.json') ? trimmed : `${trimmed}/package.json`;
297
+ }
298
+ function workspacePatterns(manifest) {
299
+ if (!record(manifest))
300
+ return undefined;
301
+ const workspaces = Reflect.get(manifest, 'workspaces');
302
+ if (stringArray(workspaces))
303
+ return workspaces;
304
+ if (!record(workspaces))
305
+ return undefined;
306
+ const packages = Reflect.get(workspaces, 'packages');
307
+ return stringArray(packages) ? packages : undefined;
308
+ }
309
+ async function readPnpmWorkspace(directory) {
310
+ const path = resolve(directory, 'pnpm-workspace.yaml');
311
+ let text;
312
+ try {
313
+ text = await readFile(path, 'utf8');
314
+ }
315
+ catch (error) {
316
+ if (errorCode(error) === 'ENOENT')
317
+ return undefined;
318
+ throw error;
319
+ }
320
+ const lines = text.split(/\r?\n/);
321
+ const patterns = [];
322
+ let packageIndent;
323
+ for (const line of lines) {
324
+ const packages = /^(\s*)packages:\s*(.*)$/.exec(line);
325
+ if (packages !== null) {
326
+ packageIndent = packages[1]?.length ?? 0;
327
+ patterns.push(...quotedValues(packages[2] ?? ''));
328
+ continue;
329
+ }
330
+ if (packageIndent === undefined || /^\s*(?:#.*)?$/.test(line))
331
+ continue;
332
+ const indent = /^\s*/.exec(line)?.[0].length ?? 0;
333
+ if (indent <= packageIndent)
334
+ break;
335
+ const item = /^\s*-\s*(.+?)\s*$/.exec(line);
336
+ if (item !== null) {
337
+ const value = unquote(stripYamlComment(item[1] ?? ''));
338
+ if (value.length > 0)
339
+ patterns.push(value);
340
+ }
341
+ }
342
+ return packageIndent === undefined ? undefined : patterns;
343
+ }
344
+ function quotedValues(value) {
345
+ const matches = value.matchAll(/['"]([^'"]+)['"]/g);
346
+ return [...matches].map(match => match[1] ?? '').filter(item => item.length > 0);
347
+ }
348
+ function stripYamlComment(value) {
349
+ const comment = value.indexOf(' #');
350
+ return comment === -1 ? value.trim() : value.slice(0, comment).trim();
351
+ }
352
+ function unquote(value) {
353
+ if (value.length < 2)
354
+ return value;
355
+ const first = value[0];
356
+ const last = value.at(-1);
357
+ return (first === "'" && last === "'") || (first === '"' && last === '"') ? value.slice(1, -1) : value;
358
+ }
359
+ async function nearestPackageRoot(cwd) {
360
+ let directory = cwd;
361
+ while (true) {
362
+ if (existsSync(resolve(directory, 'package.json')))
363
+ return directory;
364
+ const parent = dirname(directory);
365
+ if (parent === directory)
366
+ return undefined;
367
+ directory = parent;
368
+ }
369
+ }
370
+ function inside(root, candidate) {
371
+ const path = relative(root, candidate);
372
+ return path === '' || (!path.startsWith(`..${sep}`) && path !== '..' && !isAbsolute(path));
373
+ }
374
+ async function readJson(path) {
375
+ try {
376
+ return JSON.parse(await readFile(path, 'utf8'));
377
+ }
378
+ catch (error) {
379
+ if (errorCode(error) === 'ENOENT')
380
+ return undefined;
381
+ throw new ScaffoldUsageError(`could not read ${path}: ${error instanceof Error ? error.message : String(error)}`, {
382
+ cause: error,
383
+ });
384
+ }
385
+ }
386
+ function record(value) {
387
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
388
+ }
389
+ function stringArray(value) {
390
+ return Array.isArray(value) && value.every(item => typeof item === 'string');
391
+ }
392
+ function stringProperty(value, key) {
393
+ if (!record(value))
394
+ return undefined;
395
+ const property = Reflect.get(value, key);
396
+ return typeof property === 'string' && property.length > 0 ? property : undefined;
397
+ }
398
+ function errorCode(error) {
399
+ if (!record(error))
400
+ return undefined;
401
+ const code = Reflect.get(error, 'code');
402
+ return typeof code === 'string' ? code : undefined;
403
+ }
404
+ function plural(count, word) {
405
+ return `${String(count)} ${word}${count === 1 ? '' : 's'}`;
406
+ }
407
+ function packageVersion() {
408
+ const manifest = JSON.parse(readFileSync(fileURLToPath(new URL('../package.json', import.meta.url)), 'utf8'));
409
+ const version = stringProperty(manifest, 'version');
410
+ if (version === undefined)
411
+ throw new TypeError('zmdb package.json has no version');
412
+ return version;
413
+ }
414
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type Driver } from '@zmdb/orm';
2
+ import { type CoreSchema } from '@zmdb/schema';
3
+ import { type DialectTarget } from '@zmdb/sql';
4
+ export interface StudioInput {
5
+ readonly schemas: readonly CoreSchema<string>[];
6
+ readonly driver: Driver;
7
+ readonly dialect?: DialectTarget;
8
+ }
9
+ export interface StudioApp extends AsyncDisposable {
10
+ fetch(request: Request): Promise<Response>;
11
+ }
12
+ /**
13
+ * Build the dependency-free server-rendered studio application.
14
+ *
15
+ * The router contains GET routes only. The Fetch boundary rejects every other
16
+ * verb before route matching or database access, so adding a handler cannot
17
+ * accidentally turn the studio into a write surface.
18
+ */
19
+ export declare function createStudioApp(input: StudioInput): StudioApp;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/studio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAIzD,OAAO,EAAuB,KAAK,aAAa,EAAsB,MAAM,WAAW,CAAC;AAexF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,MAAM,WAAW,SAAU,SAAQ,eAAe;IAChD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5C;AAsRD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAmC7D"}