@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,607 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import {} from '@zmdb/orm';
36
+ import { isRecord } from '@zmdb/schema';
37
+ import {} from '@zmdb/schema/ir';
38
+ import { toJsonSchema } from '@zmdb/schema/openapi';
39
+ import { resolveRelation } from '@zmdb/schema/relations';
40
+ import { createQueryCompiler } from '@zmdb/sql';
41
+ import { aggregateSelectFrom } from '@zmdb/sql/aggregations';
42
+ import { Controller, createRouter, Get, respond } from '@zmdb/web';
43
+ const DEFAULT_PAGE_SIZE = 25;
44
+ const MAX_PAGE_SIZE = 50;
45
+ const HTML_HEADERS = Object.freeze({
46
+ 'content-type': 'text/html; charset=utf-8',
47
+ 'content-security-policy': "default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'",
48
+ 'referrer-policy': 'no-referrer',
49
+ 'x-content-type-options': 'nosniff',
50
+ });
51
+ const PAGE_QUERY_KEYS = new Set(['page', 'pageSize', 'orderBy', 'direction']);
52
+ class StudioRequestError extends Error {
53
+ status;
54
+ constructor(status, message) {
55
+ super(message);
56
+ this.name = 'StudioRequestError';
57
+ this.status = status;
58
+ }
59
+ }
60
+ class Studio {
61
+ #driver;
62
+ #dialect;
63
+ #tables;
64
+ #tablesByName;
65
+ constructor(input) {
66
+ this.#driver = input.driver;
67
+ const dialect = input.dialect ?? input.driver.dialect;
68
+ if (dialect === undefined) {
69
+ throw new Error('zmdb studio needs a dialect on its input or driver');
70
+ }
71
+ this.#dialect = dialect;
72
+ const byName = new Map();
73
+ const tables = [];
74
+ for (const schema of input.schemas) {
75
+ if (byName.has(schema.ir.table)) {
76
+ throw new Error(`zmdb studio received duplicate configured table "${schema.ir.table}"`);
77
+ }
78
+ const visible = new Set(Object.keys(toJsonSchema(schema).properties));
79
+ const table = {
80
+ schema,
81
+ visibleColumns: schema.ir.columns.filter(column => visible.has(column.name)),
82
+ };
83
+ byName.set(schema.ir.table, table);
84
+ tables.push(table);
85
+ }
86
+ this.#tables = tables.toSorted((left, right) => left.schema.ir.table.localeCompare(right.schema.ir.table));
87
+ this.#tablesByName = byName;
88
+ }
89
+ index(query) {
90
+ assertQueryKeys(query, new Set());
91
+ const items = this.#tables.length === 0
92
+ ? '<p>No tables are configured.</p>'
93
+ : `<ul class="tables">${this.#tables
94
+ .map(table => `<li><a href="${escapeHtml(tablePath(table.schema))}">${escapeHtml(table.schema.ir.table)}</a>` +
95
+ `<span>${String(table.visibleColumns.length)} visible columns</span></li>`)
96
+ .join('')}</ul>`;
97
+ return htmlResponse('Declared tables', `<h1>Declared tables</h1><p>The index comes only from the config&apos;s schema set.</p>${items}`);
98
+ }
99
+ async tablePage(tableName, query) {
100
+ const table = this.table(tableName);
101
+ const options = pageOptions(table, query);
102
+ const page = await this.page(table, options, []);
103
+ return htmlResponse(table.schema.ir.table, [
104
+ breadcrumbs([{ href: '/', label: 'tables' }, { label: table.schema.ir.table }]),
105
+ `<h1>${escapeHtml(table.schema.ir.table)}</h1>`,
106
+ `<p>${String(page.total)} rows. Page ${String(options.page)} of ${String(pageCount(page))}.</p>`,
107
+ renderRows(table, page.rows),
108
+ renderPageControls(tablePath(table.schema), page),
109
+ ].join(''));
110
+ }
111
+ async row(tableName, token, query) {
112
+ assertQueryKeys(query, new Set());
113
+ const table = this.table(tableName);
114
+ const key = decodeKey(table, token);
115
+ const row = await this.oneRow(table, key);
116
+ if (row === undefined) {
117
+ throw new StudioRequestError(404, `no row matched the declared key for table "${table.schema.ir.table}"`);
118
+ }
119
+ const fields = table.visibleColumns
120
+ .map(column => `<dt>${escapeHtml(column.name)}</dt><dd>${escapeHtml(displayValue(rowValue(row, column)))}</dd>`)
121
+ .join('');
122
+ const relations = !hasBrowsableKey(table)
123
+ ? '<p>Relations are not linked because this table has no browser-safe declared key.</p>'
124
+ : table.schema.ir.relations.length === 0
125
+ ? '<p>No relations are declared.</p>'
126
+ : `<ul>${table.schema.ir.relations
127
+ .map(relation => `<li><a href="${escapeHtml(relationPath(table.schema, token, relation.name))}">${escapeHtml(relation.name)}</a> → ${escapeHtml(relation.target)}</li>`)
128
+ .join('')}</ul>`;
129
+ return htmlResponse(`${table.schema.ir.table} row`, [
130
+ breadcrumbs([
131
+ { href: '/', label: 'tables' },
132
+ { href: tablePath(table.schema), label: table.schema.ir.table },
133
+ { label: 'row' },
134
+ ]),
135
+ `<h1>${escapeHtml(table.schema.ir.table)} row</h1>`,
136
+ `<dl>${fields}</dl>`,
137
+ '<h2>Declared relations</h2>',
138
+ relations,
139
+ ].join(''));
140
+ }
141
+ async relation(tableName, token, relationName, query) {
142
+ const table = this.table(tableName);
143
+ const key = decodeKey(table, token);
144
+ const parent = await this.oneRow(table, key);
145
+ if (parent === undefined) {
146
+ throw new StudioRequestError(404, `no row matched the declared key for table "${table.schema.ir.table}"`);
147
+ }
148
+ let relation;
149
+ try {
150
+ relation = resolveRelation(table.schema.ir, relationName);
151
+ }
152
+ catch (error) {
153
+ throw new StudioRequestError(400, messageOf(error));
154
+ }
155
+ const target = this.table(relation.targetTable);
156
+ const predicates = relation.parentKey.map((parentKey, index) => {
157
+ const targetKey = relation.targetKey[index];
158
+ if (targetKey === undefined) {
159
+ throw new StudioRequestError(400, `${table.schema.table}.${relation.name} resolved mismatched key columns`);
160
+ }
161
+ const parentColumn = declaredColumn(table, parentKey);
162
+ return {
163
+ column: declaredColumn(target, targetKey),
164
+ value: rowValue(parent, parentColumn),
165
+ };
166
+ });
167
+ const options = pageOptions(target, query);
168
+ const page = await this.page(target, options, predicates);
169
+ return htmlResponse(`${table.schema.ir.table}.${relation.name}`, [
170
+ breadcrumbs([
171
+ { href: '/', label: 'tables' },
172
+ { href: tablePath(table.schema), label: table.schema.ir.table },
173
+ { href: rowPath(table.schema, token), label: 'row' },
174
+ { label: relation.name },
175
+ ]),
176
+ `<h1>${escapeHtml(relation.name)}</h1>`,
177
+ `<p>${String(page.total)} related ${escapeHtml(target.schema.ir.table)} rows.</p>`,
178
+ renderRows(target, page.rows),
179
+ renderPageControls(relationPath(table.schema, token, relation.name), page),
180
+ ].join(''));
181
+ }
182
+ table(name) {
183
+ const table = this.#tablesByName.get(name);
184
+ if (table === undefined) {
185
+ throw new StudioRequestError(400, `undeclared table "${name}" is not in the configured schema set`);
186
+ }
187
+ return table;
188
+ }
189
+ async oneRow(table, key) {
190
+ let query = createQueryCompiler(this.#dialect)
191
+ .selectFrom(table.schema.ir.physicalTable)
192
+ .select(table.schema.ir.columns.map(column => column.physicalName));
193
+ query = applyPredicates(query, key);
194
+ return (await this.#driver.execute(query.limit(1).compile()))[0];
195
+ }
196
+ async page(table, options, predicates) {
197
+ const visible = unique(table.visibleColumns.map(column => column.physicalName));
198
+ const selected = visible.length === 0 ? [options.orderBy.physicalName] : visible;
199
+ let query = createQueryCompiler(this.#dialect)
200
+ .selectFrom(table.schema.ir.physicalTable)
201
+ .select(selected)
202
+ .orderBy(options.orderBy.physicalName, options.direction)
203
+ .limit(options.pageSize)
204
+ .offset(options.offset);
205
+ query = applyPredicates(query, predicates);
206
+ let count = aggregateSelectFrom(table.schema.ir.physicalTable, this.#dialect).count('*', 'count');
207
+ count = applyAggregatePredicates(count, predicates);
208
+ const [rows, countRows] = await Promise.all([
209
+ this.#driver.execute(query.compile()),
210
+ this.#driver.execute(count.compile()),
211
+ ]);
212
+ return {
213
+ rows,
214
+ total: countValue(countRows[0]?.['count']),
215
+ options,
216
+ };
217
+ }
218
+ }
219
+ let StudioController = (() => {
220
+ let _classDecorators = [Controller()];
221
+ let _classDescriptor;
222
+ let _classExtraInitializers = [];
223
+ let _classThis;
224
+ let _instanceExtraInitializers = [];
225
+ let _index_decorators;
226
+ let _table_decorators;
227
+ let _row_decorators;
228
+ let _relation_decorators;
229
+ var StudioController = class {
230
+ static { _classThis = this; }
231
+ static {
232
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
233
+ _index_decorators = [Get('/')];
234
+ _table_decorators = [Get('/tables/:table')];
235
+ _row_decorators = [Get('/tables/:table/rows/:key')];
236
+ _relation_decorators = [Get('/tables/:table/rows/:key/relations/:relation')];
237
+ __esDecorate(this, null, _index_decorators, { kind: "method", name: "index", static: false, private: false, access: { has: obj => "index" in obj, get: obj => obj.index }, metadata: _metadata }, null, _instanceExtraInitializers);
238
+ __esDecorate(this, null, _table_decorators, { kind: "method", name: "table", static: false, private: false, access: { has: obj => "table" in obj, get: obj => obj.table }, metadata: _metadata }, null, _instanceExtraInitializers);
239
+ __esDecorate(this, null, _row_decorators, { kind: "method", name: "row", static: false, private: false, access: { has: obj => "row" in obj, get: obj => obj.row }, metadata: _metadata }, null, _instanceExtraInitializers);
240
+ __esDecorate(this, null, _relation_decorators, { kind: "method", name: "relation", static: false, private: false, access: { has: obj => "relation" in obj, get: obj => obj.relation }, metadata: _metadata }, null, _instanceExtraInitializers);
241
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
242
+ StudioController = _classThis = _classDescriptor.value;
243
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
244
+ __runInitializers(_classThis, _classExtraInitializers);
245
+ }
246
+ #studio = __runInitializers(this, _instanceExtraInitializers);
247
+ constructor(studio) {
248
+ this.#studio = studio;
249
+ }
250
+ index(ctx) {
251
+ return this.answer(() => this.#studio.index(ctx.query));
252
+ }
253
+ table(ctx) {
254
+ return this.answer(() => this.#studio.tablePage(decodePath(ctx.params.table), ctx.query));
255
+ }
256
+ row(ctx) {
257
+ return this.answer(() => this.#studio.row(decodePath(ctx.params.table), ctx.params.key, ctx.query));
258
+ }
259
+ relation(ctx) {
260
+ return this.answer(() => this.#studio.relation(decodePath(ctx.params.table), ctx.params.key, decodePath(ctx.params.relation), ctx.query));
261
+ }
262
+ async answer(action) {
263
+ try {
264
+ return await action();
265
+ }
266
+ catch (error) {
267
+ if (error instanceof StudioRequestError) {
268
+ return htmlResponse(error.status === 404 ? 'Not found' : 'Request refused', `<h1>${error.status === 404 ? 'Not found' : 'Request refused'}</h1><p>${escapeHtml(error.message)}</p>`, error.status);
269
+ }
270
+ return htmlResponse('Studio error', `<h1>Studio error</h1><p>${escapeHtml(messageOf(error))}</p>`, 500);
271
+ }
272
+ }
273
+ };
274
+ return StudioController = _classThis;
275
+ })();
276
+ /**
277
+ * Build the dependency-free server-rendered studio application.
278
+ *
279
+ * The router contains GET routes only. The Fetch boundary rejects every other
280
+ * verb before route matching or database access, so adding a handler cannot
281
+ * accidentally turn the studio into a write surface.
282
+ */
283
+ export function createStudioApp(input) {
284
+ const router = createRouter();
285
+ router.register(new StudioController(new Studio(input)));
286
+ let disposed = false;
287
+ return {
288
+ async fetch(request) {
289
+ if (disposed) {
290
+ return new Response('studio is closed', {
291
+ status: 503,
292
+ headers: { 'content-type': 'text/plain; charset=utf-8' },
293
+ });
294
+ }
295
+ if (request.method !== 'GET') {
296
+ return new Response('Method Not Allowed', {
297
+ status: 405,
298
+ headers: { allow: 'GET', 'content-type': 'text/plain; charset=utf-8' },
299
+ });
300
+ }
301
+ const url = new URL(request.url);
302
+ const response = await router.handle({
303
+ method: 'GET',
304
+ path: url.pathname,
305
+ headers: Object.fromEntries(request.headers),
306
+ query: queryValues(url.searchParams),
307
+ scheme: url.protocol.slice(0, -1),
308
+ });
309
+ return fetchResponse(response);
310
+ },
311
+ [Symbol.asyncDispose]() {
312
+ disposed = true;
313
+ return Promise.resolve();
314
+ },
315
+ };
316
+ }
317
+ function applyPredicates(builder, predicates) {
318
+ let query = builder;
319
+ for (const predicate of predicates) {
320
+ query = query.where(predicate.column.physicalName, '=', predicate.value);
321
+ }
322
+ return query;
323
+ }
324
+ function applyAggregatePredicates(builder, predicates) {
325
+ let query = builder;
326
+ for (const predicate of predicates) {
327
+ query = query.where(predicate.column.physicalName, '=', predicate.value);
328
+ }
329
+ return query;
330
+ }
331
+ function pageOptions(table, query) {
332
+ assertQueryKeys(query, PAGE_QUERY_KEYS);
333
+ const page = positiveInteger(queryValue(query, 'page') ?? '1', 'page');
334
+ const requestedPageSize = positiveInteger(queryValue(query, 'pageSize') ?? String(DEFAULT_PAGE_SIZE), 'pageSize');
335
+ const pageSize = Math.min(requestedPageSize, MAX_PAGE_SIZE);
336
+ const namedOrder = queryValue(query, 'orderBy');
337
+ const defaultOrder = table.schema.ir.primaryKey.find(name => isVisibleColumn(table, name)) ??
338
+ table.visibleColumns[0]?.name ??
339
+ table.schema.ir.columns[0]?.name;
340
+ if (defaultOrder === undefined) {
341
+ throw new StudioRequestError(400, `table "${table.schema.ir.table}" declares no columns`);
342
+ }
343
+ const orderBy = namedOrder === undefined
344
+ ? declaredColumn(table, defaultOrder)
345
+ : (table.visibleColumns.find(column => column.name === namedOrder) ??
346
+ (() => {
347
+ throw new StudioRequestError(400, `undeclared column "${namedOrder}" on table "${table.schema.ir.table}"`);
348
+ })());
349
+ const namedDirection = queryValue(query, 'direction') ?? 'asc';
350
+ if (namedDirection !== 'asc' && namedDirection !== 'desc') {
351
+ throw new StudioRequestError(400, `direction must be "asc" or "desc", received "${namedDirection}"`);
352
+ }
353
+ const offset = (page - 1) * pageSize;
354
+ if (!Number.isSafeInteger(offset)) {
355
+ throw new StudioRequestError(400, `page ${String(page)} is too large`);
356
+ }
357
+ return {
358
+ page,
359
+ pageSize,
360
+ offset,
361
+ orderBy,
362
+ orderByParameter: isVisibleColumn(table, orderBy.name) ? orderBy.name : undefined,
363
+ direction: namedDirection,
364
+ };
365
+ }
366
+ function positiveInteger(value, name) {
367
+ if (!/^[1-9]\d*$/.test(value)) {
368
+ throw new StudioRequestError(400, `${name} must be a positive integer`);
369
+ }
370
+ const parsed = Number(value);
371
+ if (!Number.isSafeInteger(parsed)) {
372
+ throw new StudioRequestError(400, `${name} is too large`);
373
+ }
374
+ return parsed;
375
+ }
376
+ function assertQueryKeys(query, allowed) {
377
+ for (const key of Object.keys(query)) {
378
+ if (!allowed.has(key)) {
379
+ const suffix = key.toLowerCase() === 'sql' ? '; studio never accepts SQL from the browser' : '';
380
+ throw new StudioRequestError(400, `query parameter "${key}" is not accepted${suffix}`);
381
+ }
382
+ }
383
+ }
384
+ function queryValue(query, name) {
385
+ const value = query[name];
386
+ if (value === undefined || typeof value === 'string') {
387
+ return value;
388
+ }
389
+ if (value.length !== 1) {
390
+ throw new StudioRequestError(400, `query parameter "${name}" must appear once`);
391
+ }
392
+ return value[0];
393
+ }
394
+ function queryValues(search) {
395
+ const values = {};
396
+ for (const key of new Set(search.keys())) {
397
+ const all = search.getAll(key);
398
+ values[key] = all.length === 1 ? (all[0] ?? '') : all;
399
+ }
400
+ return values;
401
+ }
402
+ function declaredColumn(table, name) {
403
+ const column = table.schema.ir.columns.find(candidate => candidate.name === name);
404
+ if (column === undefined) {
405
+ throw new StudioRequestError(400, `undeclared column "${name}" on table "${table.schema.ir.table}"`);
406
+ }
407
+ return column;
408
+ }
409
+ function decodeKey(table, token) {
410
+ if (table.schema.ir.primaryKey.length === 0) {
411
+ throw new StudioRequestError(400, `table "${table.schema.ir.table}" has no declared primary key`);
412
+ }
413
+ if (!hasBrowsableKey(table)) {
414
+ throw new StudioRequestError(400, `table "${table.schema.ir.table}" has no browser-safe declared key`);
415
+ }
416
+ let parsed;
417
+ try {
418
+ parsed = JSON.parse(decodePath(token));
419
+ }
420
+ catch {
421
+ throw new StudioRequestError(400, `row key for table "${table.schema.ir.table}" is malformed`);
422
+ }
423
+ if (!isRecord(parsed)) {
424
+ throw new StudioRequestError(400, `row key for table "${table.schema.ir.table}" must be an object`);
425
+ }
426
+ const allowed = new Set(table.schema.ir.primaryKey);
427
+ for (const name of Object.keys(parsed)) {
428
+ if (!allowed.has(name)) {
429
+ throw new StudioRequestError(400, `row key names undeclared column "${name}"`);
430
+ }
431
+ }
432
+ return table.schema.ir.primaryKey.map(name => {
433
+ if (!Object.hasOwn(parsed, name)) {
434
+ throw new StudioRequestError(400, `row key is missing declared column "${name}"`);
435
+ }
436
+ const column = declaredColumn(table, name);
437
+ return { column, value: parsed[name] };
438
+ });
439
+ }
440
+ function isVisibleColumn(table, name) {
441
+ return table.visibleColumns.some(column => column.name === name);
442
+ }
443
+ function encodeKey(table, row) {
444
+ if (!hasBrowsableKey(table)) {
445
+ return undefined;
446
+ }
447
+ const key = {};
448
+ for (const name of table.schema.ir.primaryKey) {
449
+ const column = declaredColumn(table, name);
450
+ const value = rowValue(row, column);
451
+ if (value === undefined) {
452
+ return undefined;
453
+ }
454
+ key[name] = value;
455
+ }
456
+ return encodeURIComponent(JSON.stringify(key, (_name, value) => (typeof value === 'bigint' ? value.toString() : value)));
457
+ }
458
+ function hasBrowsableKey(table) {
459
+ return (table.schema.ir.primaryKey.length > 0 && table.schema.ir.primaryKey.every(name => isVisibleColumn(table, name)));
460
+ }
461
+ function rowValue(row, column) {
462
+ return Object.hasOwn(row, column.physicalName) ? row[column.physicalName] : row[column.name];
463
+ }
464
+ function countValue(value) {
465
+ const count = typeof value === 'bigint' ? Number(value) : Number(value ?? 0);
466
+ if (!Number.isSafeInteger(count) || count < 0) {
467
+ throw new Error(`studio count query returned ${String(value)}`);
468
+ }
469
+ return count;
470
+ }
471
+ function unique(values) {
472
+ return [...new Set(values)];
473
+ }
474
+ function pageCount(page) {
475
+ return Math.max(1, Math.ceil(page.total / page.options.pageSize));
476
+ }
477
+ function tablePath(schema) {
478
+ return `/tables/${encodeURIComponent(schema.ir.table)}`;
479
+ }
480
+ function rowPath(schema, token) {
481
+ return `${tablePath(schema)}/rows/${token}`;
482
+ }
483
+ function relationPath(schema, token, relation) {
484
+ return `${rowPath(schema, token)}/relations/${encodeURIComponent(relation)}`;
485
+ }
486
+ function renderRows(table, rows) {
487
+ if (rows.length === 0) {
488
+ return '<p>No rows on this page.</p>';
489
+ }
490
+ const headers = table.visibleColumns.map(column => `<th scope="col">${escapeHtml(column.name)}</th>`).join('');
491
+ const body = rows
492
+ .map(row => {
493
+ const token = encodeKey(table, row);
494
+ const rowLink = token === undefined ? '<span>no key</span>' : `<a href="${escapeHtml(rowPath(table.schema, token))}">view</a>`;
495
+ const cells = table.visibleColumns
496
+ .map(column => `<td>${escapeHtml(displayValue(rowValue(row, column)))}</td>`)
497
+ .join('');
498
+ return `<tr><td>${rowLink}</td>${cells}</tr>`;
499
+ })
500
+ .join('');
501
+ return `<div class="scroll"><table><thead><tr><th scope="col">row</th>${headers}</tr></thead><tbody>${body}</tbody></table></div>`;
502
+ }
503
+ function renderPageControls(base, page) {
504
+ const pages = pageCount(page);
505
+ const previous = page.options.page > 1
506
+ ? `<a rel="prev" href="${escapeHtml(pageHref(base, page.options, page.options.page - 1))}">previous</a>`
507
+ : '<span>previous</span>';
508
+ const next = page.options.page < pages
509
+ ? `<a rel="next" href="${escapeHtml(pageHref(base, page.options, page.options.page + 1))}">next</a>`
510
+ : '<span>next</span>';
511
+ return `<nav class="pages" aria-label="pagination">${previous}<span>page ${String(page.options.page)} / ${String(pages)}</span>${next}</nav>`;
512
+ }
513
+ function pageHref(base, options, page) {
514
+ const query = new URLSearchParams({
515
+ page: String(page),
516
+ pageSize: String(options.pageSize),
517
+ direction: options.direction,
518
+ });
519
+ if (options.orderByParameter !== undefined) {
520
+ query.set('orderBy', options.orderByParameter);
521
+ }
522
+ return `${base}?${query.toString()}`;
523
+ }
524
+ function breadcrumbs(items) {
525
+ return `<nav class="crumbs" aria-label="breadcrumb">${items
526
+ .map(item => item.href === undefined
527
+ ? `<span>${escapeHtml(item.label)}</span>`
528
+ : `<a href="${escapeHtml(item.href)}">${escapeHtml(item.label)}</a>`)
529
+ .join('<span>/</span>')}</nav>`;
530
+ }
531
+ function displayValue(value) {
532
+ if (value === null)
533
+ return 'null';
534
+ if (value === undefined)
535
+ return 'undefined';
536
+ if (value instanceof Date)
537
+ return value.toISOString();
538
+ if (value instanceof Uint8Array)
539
+ return `[${String(value.byteLength)} bytes]`;
540
+ if (typeof value === 'string')
541
+ return value;
542
+ if (typeof value === 'number' || typeof value === 'bigint' || typeof value === 'boolean') {
543
+ return String(value);
544
+ }
545
+ try {
546
+ return JSON.stringify(value, (_name, item) => (typeof item === 'bigint' ? item.toString() : item));
547
+ }
548
+ catch {
549
+ return String(value);
550
+ }
551
+ }
552
+ function htmlResponse(title, content, status = 200) {
553
+ return respond({
554
+ status,
555
+ headers: HTML_HEADERS,
556
+ body: '<!doctype html><html lang="en"><head><meta charset="utf-8">' +
557
+ '<meta name="viewport" content="width=device-width,initial-scale=1">' +
558
+ `<title>${escapeHtml(title)} · zmdb studio</title>` +
559
+ '<style>' +
560
+ ':root{color-scheme:light dark;font-family:ui-sans-serif,system-ui,sans-serif}' +
561
+ 'body{max-width:1100px;margin:0 auto;padding:2rem;line-height:1.5}' +
562
+ 'a{color:LinkText}.warning{border:1px solid #b36b00;padding:.75rem 1rem;border-radius:.4rem}' +
563
+ '.tables{padding:0;list-style:none}.tables li{display:flex;gap:1rem;padding:.5rem 0}' +
564
+ '.tables span{opacity:.7}.scroll{overflow:auto}table{border-collapse:collapse;width:100%}' +
565
+ 'th,td{border:1px solid GrayText;padding:.45rem;text-align:left;vertical-align:top}' +
566
+ 'dl{display:grid;grid-template-columns:minmax(8rem,15rem) 1fr;gap:.5rem}dt{font-weight:700}' +
567
+ '.crumbs,.pages{display:flex;gap:.65rem;align-items:center}.pages{justify-content:space-between;margin-top:1rem}' +
568
+ 'code{font-family:ui-monospace,monospace}' +
569
+ '</style></head><body>' +
570
+ '<p class="warning"><strong>Local raw-data viewer.</strong> Apart from columns declared ' +
571
+ '<code>Sensitive</code>, values are shown without masking. Do not point this at a production ' +
572
+ 'database expecting automatic redaction.</p>' +
573
+ `<main>${content}</main></body></html>`,
574
+ });
575
+ }
576
+ function escapeHtml(value) {
577
+ return value.replace(/[&<>"']/g, character => {
578
+ switch (character) {
579
+ case '&':
580
+ return '&amp;';
581
+ case '<':
582
+ return '&lt;';
583
+ case '>':
584
+ return '&gt;';
585
+ case '"':
586
+ return '&quot;';
587
+ default:
588
+ return '&#39;';
589
+ }
590
+ });
591
+ }
592
+ function decodePath(value) {
593
+ try {
594
+ return decodeURIComponent(value);
595
+ }
596
+ catch {
597
+ throw new StudioRequestError(400, `malformed URL component "${value}"`);
598
+ }
599
+ }
600
+ function fetchResponse(response) {
601
+ const headers = new Headers(response.headers);
602
+ return new Response(response.body.value, { status: response.status, headers });
603
+ }
604
+ function messageOf(error) {
605
+ return error instanceof Error ? error.message : String(error);
606
+ }
607
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/studio/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TemplateFactory } from './types.js';
2
+ export declare const commandTemplate: TemplateFactory;
3
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/templates/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,eA+D5B,CAAC"}