@edge-base/cli 0.1.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 (234) hide show
  1. package/README.md +182 -0
  2. package/dist/commands/admin.d.ts +10 -0
  3. package/dist/commands/admin.d.ts.map +1 -0
  4. package/dist/commands/admin.js +307 -0
  5. package/dist/commands/admin.js.map +1 -0
  6. package/dist/commands/backup.d.ts +148 -0
  7. package/dist/commands/backup.d.ts.map +1 -0
  8. package/dist/commands/backup.js +1247 -0
  9. package/dist/commands/backup.js.map +1 -0
  10. package/dist/commands/completion.d.ts +3 -0
  11. package/dist/commands/completion.d.ts.map +1 -0
  12. package/dist/commands/completion.js +168 -0
  13. package/dist/commands/completion.js.map +1 -0
  14. package/dist/commands/create-plugin.d.ts +3 -0
  15. package/dist/commands/create-plugin.d.ts.map +1 -0
  16. package/dist/commands/create-plugin.js +208 -0
  17. package/dist/commands/create-plugin.js.map +1 -0
  18. package/dist/commands/deploy.d.ts +146 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +1823 -0
  21. package/dist/commands/deploy.js.map +1 -0
  22. package/dist/commands/describe.d.ts +45 -0
  23. package/dist/commands/describe.d.ts.map +1 -0
  24. package/dist/commands/describe.js +114 -0
  25. package/dist/commands/describe.js.map +1 -0
  26. package/dist/commands/destroy.d.ts +13 -0
  27. package/dist/commands/destroy.d.ts.map +1 -0
  28. package/dist/commands/destroy.js +642 -0
  29. package/dist/commands/destroy.js.map +1 -0
  30. package/dist/commands/dev.d.ts +80 -0
  31. package/dist/commands/dev.d.ts.map +1 -0
  32. package/dist/commands/dev.js +1131 -0
  33. package/dist/commands/dev.js.map +1 -0
  34. package/dist/commands/docker.d.ts +22 -0
  35. package/dist/commands/docker.d.ts.map +1 -0
  36. package/dist/commands/docker.js +373 -0
  37. package/dist/commands/docker.js.map +1 -0
  38. package/dist/commands/export.d.ts +15 -0
  39. package/dist/commands/export.d.ts.map +1 -0
  40. package/dist/commands/export.js +142 -0
  41. package/dist/commands/export.js.map +1 -0
  42. package/dist/commands/init.d.ts +7 -0
  43. package/dist/commands/init.d.ts.map +1 -0
  44. package/dist/commands/init.js +506 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/keys.d.ts +23 -0
  47. package/dist/commands/keys.d.ts.map +1 -0
  48. package/dist/commands/keys.js +347 -0
  49. package/dist/commands/keys.js.map +1 -0
  50. package/dist/commands/logs.d.ts +17 -0
  51. package/dist/commands/logs.d.ts.map +1 -0
  52. package/dist/commands/logs.js +104 -0
  53. package/dist/commands/logs.js.map +1 -0
  54. package/dist/commands/migrate.d.ts +29 -0
  55. package/dist/commands/migrate.d.ts.map +1 -0
  56. package/dist/commands/migrate.js +302 -0
  57. package/dist/commands/migrate.js.map +1 -0
  58. package/dist/commands/migration.d.ts +18 -0
  59. package/dist/commands/migration.d.ts.map +1 -0
  60. package/dist/commands/migration.js +114 -0
  61. package/dist/commands/migration.js.map +1 -0
  62. package/dist/commands/neon.d.ts +66 -0
  63. package/dist/commands/neon.d.ts.map +1 -0
  64. package/dist/commands/neon.js +600 -0
  65. package/dist/commands/neon.js.map +1 -0
  66. package/dist/commands/plugins.d.ts +9 -0
  67. package/dist/commands/plugins.d.ts.map +1 -0
  68. package/dist/commands/plugins.js +295 -0
  69. package/dist/commands/plugins.js.map +1 -0
  70. package/dist/commands/realtime.d.ts +3 -0
  71. package/dist/commands/realtime.d.ts.map +1 -0
  72. package/dist/commands/realtime.js +71 -0
  73. package/dist/commands/realtime.js.map +1 -0
  74. package/dist/commands/secret.d.ts +7 -0
  75. package/dist/commands/secret.d.ts.map +1 -0
  76. package/dist/commands/secret.js +180 -0
  77. package/dist/commands/secret.js.map +1 -0
  78. package/dist/commands/seed.d.ts +21 -0
  79. package/dist/commands/seed.d.ts.map +1 -0
  80. package/dist/commands/seed.js +325 -0
  81. package/dist/commands/seed.js.map +1 -0
  82. package/dist/commands/telemetry.d.ts +12 -0
  83. package/dist/commands/telemetry.d.ts.map +1 -0
  84. package/dist/commands/telemetry.js +57 -0
  85. package/dist/commands/telemetry.js.map +1 -0
  86. package/dist/commands/typegen.d.ts +26 -0
  87. package/dist/commands/typegen.d.ts.map +1 -0
  88. package/dist/commands/typegen.js +212 -0
  89. package/dist/commands/typegen.js.map +1 -0
  90. package/dist/commands/upgrade.d.ts +29 -0
  91. package/dist/commands/upgrade.d.ts.map +1 -0
  92. package/dist/commands/upgrade.js +265 -0
  93. package/dist/commands/upgrade.js.map +1 -0
  94. package/dist/commands/webhook-test.d.ts +3 -0
  95. package/dist/commands/webhook-test.d.ts.map +1 -0
  96. package/dist/commands/webhook-test.js +133 -0
  97. package/dist/commands/webhook-test.js.map +1 -0
  98. package/dist/index.d.ts +3 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +183 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/lib/agent-contract.d.ts +36 -0
  103. package/dist/lib/agent-contract.d.ts.map +1 -0
  104. package/dist/lib/agent-contract.js +78 -0
  105. package/dist/lib/agent-contract.js.map +1 -0
  106. package/dist/lib/cf-auth.d.ts +76 -0
  107. package/dist/lib/cf-auth.d.ts.map +1 -0
  108. package/dist/lib/cf-auth.js +321 -0
  109. package/dist/lib/cf-auth.js.map +1 -0
  110. package/dist/lib/cli-context.d.ts +23 -0
  111. package/dist/lib/cli-context.d.ts.map +1 -0
  112. package/dist/lib/cli-context.js +40 -0
  113. package/dist/lib/cli-context.js.map +1 -0
  114. package/dist/lib/cloudflare-deploy-manifest.d.ts +26 -0
  115. package/dist/lib/cloudflare-deploy-manifest.d.ts.map +1 -0
  116. package/dist/lib/cloudflare-deploy-manifest.js +107 -0
  117. package/dist/lib/cloudflare-deploy-manifest.js.map +1 -0
  118. package/dist/lib/cloudflare-wrangler-resources.d.ts +32 -0
  119. package/dist/lib/cloudflare-wrangler-resources.d.ts.map +1 -0
  120. package/dist/lib/cloudflare-wrangler-resources.js +59 -0
  121. package/dist/lib/cloudflare-wrangler-resources.js.map +1 -0
  122. package/dist/lib/config-editor.d.ts +139 -0
  123. package/dist/lib/config-editor.d.ts.map +1 -0
  124. package/dist/lib/config-editor.js +1188 -0
  125. package/dist/lib/config-editor.js.map +1 -0
  126. package/dist/lib/deploy-shared.d.ts +55 -0
  127. package/dist/lib/deploy-shared.d.ts.map +1 -0
  128. package/dist/lib/deploy-shared.js +183 -0
  129. package/dist/lib/deploy-shared.js.map +1 -0
  130. package/dist/lib/dev-sidecar.d.ts +31 -0
  131. package/dist/lib/dev-sidecar.d.ts.map +1 -0
  132. package/dist/lib/dev-sidecar.js +1058 -0
  133. package/dist/lib/dev-sidecar.js.map +1 -0
  134. package/dist/lib/fetch-with-timeout.d.ts +14 -0
  135. package/dist/lib/fetch-with-timeout.d.ts.map +1 -0
  136. package/dist/lib/fetch-with-timeout.js +29 -0
  137. package/dist/lib/fetch-with-timeout.js.map +1 -0
  138. package/dist/lib/function-registry.d.ts +56 -0
  139. package/dist/lib/function-registry.d.ts.map +1 -0
  140. package/dist/lib/function-registry.js +210 -0
  141. package/dist/lib/function-registry.js.map +1 -0
  142. package/dist/lib/load-config.d.ts +24 -0
  143. package/dist/lib/load-config.d.ts.map +1 -0
  144. package/dist/lib/load-config.js +263 -0
  145. package/dist/lib/load-config.js.map +1 -0
  146. package/dist/lib/local-secrets.d.ts +2 -0
  147. package/dist/lib/local-secrets.d.ts.map +1 -0
  148. package/dist/lib/local-secrets.js +60 -0
  149. package/dist/lib/local-secrets.js.map +1 -0
  150. package/dist/lib/managed-resource-names.d.ts +4 -0
  151. package/dist/lib/managed-resource-names.d.ts.map +1 -0
  152. package/dist/lib/managed-resource-names.js +19 -0
  153. package/dist/lib/managed-resource-names.js.map +1 -0
  154. package/dist/lib/migrator.d.ts +57 -0
  155. package/dist/lib/migrator.d.ts.map +1 -0
  156. package/dist/lib/migrator.js +321 -0
  157. package/dist/lib/migrator.js.map +1 -0
  158. package/dist/lib/neon.d.ts +41 -0
  159. package/dist/lib/neon.d.ts.map +1 -0
  160. package/dist/lib/neon.js +325 -0
  161. package/dist/lib/neon.js.map +1 -0
  162. package/dist/lib/node-tools.d.ts +10 -0
  163. package/dist/lib/node-tools.d.ts.map +1 -0
  164. package/dist/lib/node-tools.js +32 -0
  165. package/dist/lib/node-tools.js.map +1 -0
  166. package/dist/lib/npm.d.ts +8 -0
  167. package/dist/lib/npm.d.ts.map +1 -0
  168. package/dist/lib/npm.js +10 -0
  169. package/dist/lib/npm.js.map +1 -0
  170. package/dist/lib/npx.d.ts +9 -0
  171. package/dist/lib/npx.d.ts.map +1 -0
  172. package/dist/lib/npx.js +11 -0
  173. package/dist/lib/npx.js.map +1 -0
  174. package/dist/lib/project-runtime.d.ts +38 -0
  175. package/dist/lib/project-runtime.d.ts.map +1 -0
  176. package/dist/lib/project-runtime.js +122 -0
  177. package/dist/lib/project-runtime.js.map +1 -0
  178. package/dist/lib/prompts.d.ts +28 -0
  179. package/dist/lib/prompts.d.ts.map +1 -0
  180. package/dist/lib/prompts.js +85 -0
  181. package/dist/lib/prompts.js.map +1 -0
  182. package/dist/lib/rate-limit-bindings.d.ts +11 -0
  183. package/dist/lib/rate-limit-bindings.d.ts.map +1 -0
  184. package/dist/lib/rate-limit-bindings.js +52 -0
  185. package/dist/lib/rate-limit-bindings.js.map +1 -0
  186. package/dist/lib/realtime-provision.d.ts +22 -0
  187. package/dist/lib/realtime-provision.d.ts.map +1 -0
  188. package/dist/lib/realtime-provision.js +246 -0
  189. package/dist/lib/realtime-provision.js.map +1 -0
  190. package/dist/lib/resolve-options.d.ts +42 -0
  191. package/dist/lib/resolve-options.d.ts.map +1 -0
  192. package/dist/lib/resolve-options.js +98 -0
  193. package/dist/lib/resolve-options.js.map +1 -0
  194. package/dist/lib/runtime-scaffold.d.ts +17 -0
  195. package/dist/lib/runtime-scaffold.d.ts.map +1 -0
  196. package/dist/lib/runtime-scaffold.js +366 -0
  197. package/dist/lib/runtime-scaffold.js.map +1 -0
  198. package/dist/lib/schema-check.d.ts +79 -0
  199. package/dist/lib/schema-check.d.ts.map +1 -0
  200. package/dist/lib/schema-check.js +347 -0
  201. package/dist/lib/schema-check.js.map +1 -0
  202. package/dist/lib/spinner.d.ts +20 -0
  203. package/dist/lib/spinner.d.ts.map +1 -0
  204. package/dist/lib/spinner.js +42 -0
  205. package/dist/lib/spinner.js.map +1 -0
  206. package/dist/lib/telemetry.d.ts +37 -0
  207. package/dist/lib/telemetry.d.ts.map +1 -0
  208. package/dist/lib/telemetry.js +98 -0
  209. package/dist/lib/telemetry.js.map +1 -0
  210. package/dist/lib/turnstile-provision.d.ts +27 -0
  211. package/dist/lib/turnstile-provision.d.ts.map +1 -0
  212. package/dist/lib/turnstile-provision.js +144 -0
  213. package/dist/lib/turnstile-provision.js.map +1 -0
  214. package/dist/lib/update-check.d.ts +13 -0
  215. package/dist/lib/update-check.d.ts.map +1 -0
  216. package/dist/lib/update-check.js +110 -0
  217. package/dist/lib/update-check.js.map +1 -0
  218. package/dist/lib/wrangler-secrets.d.ts +3 -0
  219. package/dist/lib/wrangler-secrets.d.ts.map +1 -0
  220. package/dist/lib/wrangler-secrets.js +32 -0
  221. package/dist/lib/wrangler-secrets.js.map +1 -0
  222. package/dist/lib/wrangler.d.ts +9 -0
  223. package/dist/lib/wrangler.d.ts.map +1 -0
  224. package/dist/lib/wrangler.js +84 -0
  225. package/dist/lib/wrangler.js.map +1 -0
  226. package/dist/templates/plugin/README.md.tmpl +91 -0
  227. package/dist/templates/plugin/client/js/package.json.tmpl +23 -0
  228. package/dist/templates/plugin/client/js/src/index.ts.tmpl +68 -0
  229. package/dist/templates/plugin/client/js/tsconfig.json.tmpl +14 -0
  230. package/dist/templates/plugin/server/package.json.tmpl +19 -0
  231. package/dist/templates/plugin/server/src/index.ts.tmpl +59 -0
  232. package/dist/templates/plugin/server/tsconfig.json.tmpl +14 -0
  233. package/llms.txt +94 -0
  234. package/package.json +60 -0
@@ -0,0 +1,325 @@
1
+ import { Command } from 'commander';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { raiseCliError, raiseNeedsInput } from '../lib/agent-contract.js';
6
+ import { isJson, isQuiet } from '../lib/cli-context.js';
7
+ import { fetchWithTimeout } from '../lib/fetch-with-timeout.js';
8
+ import { loadConfigSafe } from '../lib/load-config.js';
9
+ import { extractDatabases } from '../lib/deploy-shared.js';
10
+ import { resolveOptionalServiceKey, resolveServerUrl } from '../lib/resolve-options.js';
11
+ const FULL_CONFIG_EVAL = { allowRegexFallback: false };
12
+ function isRetryableSeedFailure(status, bodyText) {
13
+ if (status === 429 || status >= 500)
14
+ return true;
15
+ if (status !== 404)
16
+ return false;
17
+ const normalized = bodyText.trim().toLowerCase();
18
+ return normalized.startsWith('<!doctype html') || normalized.startsWith('<html');
19
+ }
20
+ async function createSeedRecord(url, headers, record) {
21
+ for (let attempt = 0; attempt < 3; attempt += 1) {
22
+ try {
23
+ const response = await fetchWithTimeout(url, {
24
+ method: 'POST',
25
+ headers,
26
+ body: JSON.stringify(record),
27
+ });
28
+ if (response.ok) {
29
+ return { ok: true };
30
+ }
31
+ const body = await response.text();
32
+ if (!isRetryableSeedFailure(response.status, body) || attempt === 2) {
33
+ return { ok: false, status: response.status, body };
34
+ }
35
+ }
36
+ catch (error) {
37
+ if (attempt === 2) {
38
+ throw error;
39
+ }
40
+ }
41
+ await new Promise((resolve) => setTimeout(resolve, (attempt + 1) * 1000));
42
+ }
43
+ return { ok: false, status: 500, body: 'Seed retry loop exhausted.' };
44
+ }
45
+ function isDynamicSeedDbBlock(dbBlock) {
46
+ if (dbBlock.instance)
47
+ return true;
48
+ if (dbBlock.access && typeof dbBlock.access === 'object')
49
+ return true;
50
+ return false;
51
+ }
52
+ function getSeedDatabases(config) {
53
+ const databases = config ? extractDatabases(config) : null;
54
+ return (databases ?? {});
55
+ }
56
+ export function listSeedNamespaces(config) {
57
+ return Object.keys(getSeedDatabases(config));
58
+ }
59
+ export function inferDefaultSeedNamespace(config) {
60
+ const staticNamespaces = Object.entries(getSeedDatabases(config))
61
+ .filter(([, dbBlock]) => !isDynamicSeedDbBlock(dbBlock))
62
+ .map(([namespace]) => namespace);
63
+ return staticNamespaces.length === 1 ? staticNamespaces[0] : null;
64
+ }
65
+ export function buildSeedTableBasePath(namespace, instanceId) {
66
+ const encodedNamespace = encodeURIComponent(namespace);
67
+ if (instanceId) {
68
+ return `/api/db/${encodedNamespace}/${encodeURIComponent(instanceId)}/tables`;
69
+ }
70
+ return `/api/db/${encodedNamespace}/tables`;
71
+ }
72
+ function resolveSeedTarget(options, config) {
73
+ const databases = getSeedDatabases(config);
74
+ const availableNamespaces = Object.keys(databases);
75
+ let namespace = options.namespace;
76
+ if (options.id && !namespace) {
77
+ if (availableNamespaces.length === 1) {
78
+ namespace = availableNamespaces[0];
79
+ }
80
+ else {
81
+ throw new Error('`--id` requires `--namespace` when more than one DB block exists.');
82
+ }
83
+ }
84
+ if (!namespace) {
85
+ const inferred = inferDefaultSeedNamespace(config);
86
+ if (inferred) {
87
+ namespace = inferred;
88
+ }
89
+ else if (availableNamespaces.length > 0) {
90
+ throw new Error('Could not infer a single seed namespace from edgebase.config.ts. Use `--namespace <name>`.');
91
+ }
92
+ else {
93
+ namespace = 'shared';
94
+ }
95
+ }
96
+ const dbBlock = databases[namespace];
97
+ if (dbBlock) {
98
+ const dynamic = isDynamicSeedDbBlock(dbBlock);
99
+ if (dynamic && !options.id) {
100
+ throw new Error(`DB block '${namespace}' is dynamic and requires an instance id. Use \`--id <instanceId>\`.`);
101
+ }
102
+ if (!dynamic && options.id) {
103
+ throw new Error(`DB block '${namespace}' is single-instance. Remove \`--id\` or choose a dynamic namespace.`);
104
+ }
105
+ }
106
+ return {
107
+ namespace,
108
+ instanceId: options.id,
109
+ };
110
+ }
111
+ function toSeedTargetIssue(error, config) {
112
+ const namespaces = listSeedNamespaces(config);
113
+ if (/Use `--namespace <name>`/.test(error.message) && namespaces.length > 0) {
114
+ raiseNeedsInput({
115
+ code: 'seed_namespace_required',
116
+ field: 'namespace',
117
+ message: error.message,
118
+ hint: 'Rerun with --namespace <name>.',
119
+ choices: namespaces.map((namespace) => ({
120
+ label: namespace,
121
+ value: namespace,
122
+ args: ['--namespace', namespace],
123
+ })),
124
+ });
125
+ }
126
+ if (/requires an instance id/.test(error.message)) {
127
+ raiseNeedsInput({
128
+ code: 'seed_instance_id_required',
129
+ field: 'id',
130
+ message: error.message,
131
+ hint: 'Rerun with --id <instanceId>.',
132
+ });
133
+ }
134
+ raiseCliError({
135
+ code: 'seed_target_resolution_failed',
136
+ message: error.message,
137
+ hint: 'Provide --namespace <name> and, for dynamic DB blocks, --id <instanceId>.',
138
+ });
139
+ }
140
+ export const _internals = {
141
+ buildSeedTableBasePath,
142
+ inferDefaultSeedNamespace,
143
+ listSeedNamespaces,
144
+ resolveSeedTarget,
145
+ };
146
+ export const seedCommand = new Command('seed')
147
+ .description('Load seed data into local dev server')
148
+ .option('--file <path>', 'Path to seed data file', 'edgebase.seed.json')
149
+ .option('--url <url>', 'Server URL (default: EDGEBASE_URL or http://localhost:8787)')
150
+ .option('--namespace <ns>', 'DB block namespace to seed')
151
+ .option('--id <instanceId>', 'Instance id for dynamic DB blocks')
152
+ .option('--reset', 'Delete existing data before seeding')
153
+ .option('--service-key <key>', 'Service Key for authenticated requests (auto-resolve when available)')
154
+ .action(async (options) => {
155
+ const cwd = process.cwd();
156
+ const seedPath = path.resolve(cwd, options.file);
157
+ const warnings = [];
158
+ if (!fs.existsSync(seedPath)) {
159
+ raiseCliError({
160
+ code: 'seed_file_not_found',
161
+ message: `Seed file not found: ${options.file}`,
162
+ hint: 'Create edgebase.seed.json or rerun with --file <path>.',
163
+ });
164
+ }
165
+ let seedData;
166
+ try {
167
+ const content = fs.readFileSync(seedPath, 'utf-8');
168
+ seedData = JSON.parse(content);
169
+ }
170
+ catch (err) {
171
+ raiseCliError({
172
+ code: 'seed_file_parse_failed',
173
+ message: `Failed to parse seed file: ${err.message}`,
174
+ hint: 'Ensure the seed file contains valid JSON with table names mapped to record arrays.',
175
+ });
176
+ }
177
+ const sigintHandler = () => { process.exit(130); };
178
+ process.on('SIGINT', sigintHandler);
179
+ try {
180
+ let configJson = null;
181
+ const configPath = path.join(cwd, 'edgebase.config.ts');
182
+ if (fs.existsSync(configPath)) {
183
+ try {
184
+ configJson = loadConfigSafe(configPath, cwd, FULL_CONFIG_EVAL);
185
+ }
186
+ catch (err) {
187
+ if (!options.namespace) {
188
+ raiseCliError({
189
+ code: 'seed_config_load_failed',
190
+ message: `Failed to infer seed namespace: ${err.message}`,
191
+ hint: 'Pass --namespace <name> to seed without loading edgebase.config.ts.',
192
+ });
193
+ }
194
+ warnings.push(`Skipping config-based namespace inference: ${err.message}`);
195
+ }
196
+ }
197
+ let target;
198
+ try {
199
+ target = resolveSeedTarget(options, configJson);
200
+ }
201
+ catch (err) {
202
+ toSeedTargetIssue(err, configJson);
203
+ }
204
+ const baseUrl = resolveServerUrl({ url: options.url }, false) || 'http://localhost:8787';
205
+ const tableBasePath = buildSeedTableBasePath(target.namespace, target.instanceId);
206
+ const headers = {
207
+ 'Content-Type': 'application/json',
208
+ };
209
+ const serviceKey = resolveOptionalServiceKey({ serviceKey: options.serviceKey });
210
+ if (serviceKey) {
211
+ headers['X-EdgeBase-Service-Key'] = serviceKey;
212
+ }
213
+ try {
214
+ await fetchWithTimeout(`${baseUrl}/api/health`, undefined, 5000);
215
+ }
216
+ catch {
217
+ raiseCliError({
218
+ code: 'seed_server_unreachable',
219
+ message: `Cannot connect to dev server at ${baseUrl}`,
220
+ hint: 'Make sure `npx edgebase dev` is running or rerun with --url <server-url>.',
221
+ });
222
+ }
223
+ if (!isQuiet()) {
224
+ console.log(`🌱 Seeding from: ${options.file}`);
225
+ console.log(` Server: ${baseUrl}`);
226
+ console.log(` Namespace: ${target.namespace}${target.instanceId ? ` (${target.instanceId})` : ''}`);
227
+ console.log('');
228
+ }
229
+ let totalCreated = 0;
230
+ let totalFailed = 0;
231
+ const failures = [];
232
+ for (const [tableName, records] of Object.entries(seedData)) {
233
+ if (!Array.isArray(records)) {
234
+ const warning = `Skipping "${tableName}" - expected an array`;
235
+ warnings.push(warning);
236
+ if (!isQuiet()) {
237
+ console.warn(chalk.yellow('⚠'), warning);
238
+ }
239
+ continue;
240
+ }
241
+ if (options.reset) {
242
+ if (!isQuiet()) {
243
+ console.log(` 🗑️ Resetting "${tableName}"...`);
244
+ }
245
+ try {
246
+ const listRes = await fetchWithTimeout(`${baseUrl}${tableBasePath}/${encodeURIComponent(tableName)}?limit=1000`, { headers });
247
+ if (listRes.ok) {
248
+ const data = (await listRes.json());
249
+ for (const item of data.data ?? []) {
250
+ await fetchWithTimeout(`${baseUrl}${tableBasePath}/${encodeURIComponent(tableName)}/${encodeURIComponent(item.id)}`, { method: 'DELETE', headers });
251
+ }
252
+ }
253
+ }
254
+ catch {
255
+ const warning = `Reset failed for "${tableName}" - continuing`;
256
+ warnings.push(warning);
257
+ if (!isQuiet()) {
258
+ console.warn(' ', chalk.yellow('⚠'), warning);
259
+ }
260
+ }
261
+ }
262
+ if (!isQuiet()) {
263
+ console.log(` 📝 Seeding "${tableName}" — ${records.length} records`);
264
+ }
265
+ for (const record of records) {
266
+ try {
267
+ const res = await createSeedRecord(`${baseUrl}${tableBasePath}/${encodeURIComponent(tableName)}`, headers, record);
268
+ if (res.ok) {
269
+ totalCreated++;
270
+ }
271
+ else {
272
+ totalFailed++;
273
+ const message = `Failed to create record in "${tableName}": ${res.status} ${res.body.substring(0, 100)}`;
274
+ failures.push({ table: tableName, message });
275
+ if (!isQuiet()) {
276
+ console.warn(' ', chalk.yellow('⚠'), message);
277
+ }
278
+ }
279
+ }
280
+ catch (err) {
281
+ totalFailed++;
282
+ const message = `Network error for "${tableName}": ${err.message}`;
283
+ failures.push({ table: tableName, message });
284
+ if (!isQuiet()) {
285
+ console.warn(' ', chalk.yellow('⚠'), message);
286
+ }
287
+ }
288
+ }
289
+ }
290
+ if (totalFailed > 0) {
291
+ raiseCliError({
292
+ code: 'seed_partial_failure',
293
+ message: `Seeding completed with ${totalFailed} failed record(s).`,
294
+ hint: 'Inspect the failing tables, fix the data or schema mismatch, and rerun the seed command.',
295
+ details: {
296
+ created: totalCreated,
297
+ failed: totalFailed,
298
+ namespace: target.namespace,
299
+ instanceId: target.instanceId,
300
+ warnings,
301
+ failures,
302
+ },
303
+ });
304
+ }
305
+ if (isJson()) {
306
+ console.log(JSON.stringify({
307
+ status: 'success',
308
+ file: seedPath,
309
+ serverUrl: baseUrl,
310
+ namespace: target.namespace,
311
+ instanceId: target.instanceId,
312
+ created: totalCreated,
313
+ failed: totalFailed,
314
+ warnings,
315
+ }));
316
+ return;
317
+ }
318
+ console.log('');
319
+ console.log(chalk.green('✅'), `Seeding complete: ${totalCreated} created, ${totalFailed} failed`);
320
+ }
321
+ finally {
322
+ process.off('SIGINT', sigintHandler);
323
+ }
324
+ });
325
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * `npx edgebase telemetry` — Manage anonymous usage telemetry.
4
+ *
5
+ * Telemetry is opt-in only. When enabled, records:
6
+ * - Command name, success/failure, duration
7
+ * - No PII, no code, no file paths
8
+ *
9
+ * Data is stored locally in ~/.edgebase/telemetry.json.
10
+ */
11
+ export declare const telemetryCommand: Command;
12
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,SACqB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { enableTelemetry, disableTelemetry, getTelemetryStatus, } from '../lib/telemetry.js';
4
+ import { isJson } from '../lib/cli-context.js';
5
+ /**
6
+ * `npx edgebase telemetry` — Manage anonymous usage telemetry.
7
+ *
8
+ * Telemetry is opt-in only. When enabled, records:
9
+ * - Command name, success/failure, duration
10
+ * - No PII, no code, no file paths
11
+ *
12
+ * Data is stored locally in ~/.edgebase/telemetry.json.
13
+ */
14
+ export const telemetryCommand = new Command('telemetry')
15
+ .description('Manage anonymous usage telemetry');
16
+ telemetryCommand
17
+ .command('enable')
18
+ .description('Opt in to anonymous telemetry')
19
+ .action(() => {
20
+ enableTelemetry();
21
+ if (isJson()) {
22
+ console.log(JSON.stringify({ enabled: true }));
23
+ return;
24
+ }
25
+ console.log(chalk.green('✓'), 'Telemetry enabled.');
26
+ console.log(chalk.dim(' Anonymous usage data will be collected locally.'));
27
+ console.log(chalk.dim(' No personal data is ever transmitted.'));
28
+ });
29
+ telemetryCommand
30
+ .command('disable')
31
+ .description('Opt out of telemetry')
32
+ .action(() => {
33
+ disableTelemetry();
34
+ if (isJson()) {
35
+ console.log(JSON.stringify({ enabled: false }));
36
+ return;
37
+ }
38
+ console.log(chalk.green('✓'), 'Telemetry disabled.');
39
+ });
40
+ telemetryCommand
41
+ .command('status')
42
+ .description('Show current telemetry status')
43
+ .action(() => {
44
+ const { enabled, eventCount } = getTelemetryStatus();
45
+ if (isJson()) {
46
+ console.log(JSON.stringify({ enabled, eventCount }));
47
+ return;
48
+ }
49
+ console.log(chalk.blue('📊 Telemetry Status'));
50
+ console.log(` Enabled: ${enabled ? chalk.green('yes') : chalk.red('no')}`);
51
+ console.log(` Events recorded: ${eventCount}`);
52
+ console.log();
53
+ if (!enabled) {
54
+ console.log(chalk.dim(' Run'), chalk.cyan('npx edgebase telemetry enable'), chalk.dim('to opt in.'));
55
+ }
56
+ });
57
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,kCAAkC,CAAC,CAAC;AAEnD,gBAAgB;KACb,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,GAAG,EAAE;IACX,eAAe,EAAE,CAAC;IAClB,IAAI,MAAM,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEL,gBAAgB;KACb,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,GAAG,EAAE;IACX,gBAAgB,EAAE,CAAC;IACnB,IAAI,MAAM,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,qBAAqB,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEL,gBAAgB;KACb,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,CAAC;IACrD,IAAI,MAAM,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACxG,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Command } from 'commander';
2
+ interface SchemaField {
3
+ type: string;
4
+ required?: boolean;
5
+ references?: string | {
6
+ table: string;
7
+ };
8
+ enum?: string[];
9
+ }
10
+ interface TableConfig {
11
+ schema?: Record<string, SchemaField | false>;
12
+ }
13
+ interface DbBlock {
14
+ tables?: Record<string, TableConfig>;
15
+ }
16
+ interface ParsedConfig {
17
+ databases?: Record<string, DbBlock>;
18
+ }
19
+ /**
20
+ * Generate full type definitions file from a parsed config.
21
+ * Supports the canonical `databases` block.
22
+ */
23
+ export declare function generateTypes(config: ParsedConfig): string;
24
+ export declare const typegenCommand: Command;
25
+ export {};
26
+ //# sourceMappingURL=typegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typegen.d.ts","sourceRoot":"","sources":["../../src/commands/typegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC;CAC9C;AAED,UAAU,OAAO;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACtC;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AA6FD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA0C1D;AAID,eAAO,MAAM,cAAc,SA0DvB,CAAC"}
@@ -0,0 +1,212 @@
1
+ import { Command } from 'commander';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { raiseCliError } from '../lib/agent-contract.js';
6
+ import { spin } from '../lib/spinner.js';
7
+ import { isJson, isQuiet } from '../lib/cli-context.js';
8
+ import { loadConfigSafe } from '../lib/load-config.js';
9
+ // ─── FieldType → TypeScript type mapping ───
10
+ const FIELD_TYPE_MAP = {
11
+ string: 'string',
12
+ text: 'string',
13
+ number: 'number',
14
+ boolean: 'boolean',
15
+ datetime: 'string',
16
+ json: 'unknown',
17
+ };
18
+ // ─── System fields added to every table ───
19
+ const SYSTEM_FIELDS = [
20
+ ' /** System-generated unique ID */',
21
+ ' id: string;',
22
+ ' /** ISO 8601 creation timestamp */',
23
+ ' createdAt: string;',
24
+ ' /** ISO 8601 last-update timestamp */',
25
+ ' updatedAt: string;',
26
+ ];
27
+ // ─── Config loading ───
28
+ const FULL_CONFIG_EVAL = { allowRegexFallback: false };
29
+ /**
30
+ * Resolve the config path. Checks for edgebase.config.ts and edgebase.config.js.
31
+ */
32
+ function resolveConfigPath(cwd) {
33
+ for (const name of ['edgebase.config.ts', 'edgebase.config.js']) {
34
+ const p = path.join(cwd, name);
35
+ if (fs.existsSync(p))
36
+ return p;
37
+ }
38
+ return null;
39
+ }
40
+ /**
41
+ * Typegen must fully evaluate edgebase.config.ts so invalid legacy syntax
42
+ * fails loudly instead of being silently dropped by regex fallback.
43
+ */
44
+ function loadConfig(configPath, cwd) {
45
+ return loadConfigSafe(configPath, cwd, FULL_CONFIG_EVAL);
46
+ }
47
+ // ─── Type Generation ───
48
+ function toPascalCase(s) {
49
+ const parts = splitIdentifierParts(s);
50
+ if (parts.length === 0)
51
+ return 'Table';
52
+ const normalized = [...parts];
53
+ normalized[normalized.length - 1] = singularizeWord(normalized[normalized.length - 1]);
54
+ return normalized
55
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
56
+ .join('');
57
+ }
58
+ function splitIdentifierParts(value) {
59
+ return value
60
+ .split(/[^A-Za-z0-9]+/)
61
+ .flatMap((part) => part.split(/(?=[A-Z][a-z])|(?<=[a-z0-9])(?=[A-Z])/))
62
+ .map((part) => part.trim())
63
+ .filter(Boolean)
64
+ .map((part) => part.toLowerCase());
65
+ }
66
+ function singularizeWord(word) {
67
+ if (word.length <= 3)
68
+ return word;
69
+ if (/(ss|us|is)$/.test(word))
70
+ return word;
71
+ if (/ies$/.test(word))
72
+ return `${word.slice(0, -3)}y`;
73
+ if (/(xes|zes|ches|shes|ses)$/.test(word))
74
+ return word.slice(0, -2);
75
+ if (word.endsWith('s'))
76
+ return word.slice(0, -1);
77
+ return word;
78
+ }
79
+ function isTsIdentifier(name) {
80
+ return /^[$A-Z_a-z][$\w]*$/.test(name);
81
+ }
82
+ function renderPropertyName(name) {
83
+ return isTsIdentifier(name) ? name : JSON.stringify(name);
84
+ }
85
+ function getReferenceLabel(reference) {
86
+ if (!reference)
87
+ return null;
88
+ if (typeof reference === 'string')
89
+ return reference;
90
+ if (typeof reference.table === 'string' && reference.table.length > 0)
91
+ return reference.table;
92
+ return null;
93
+ }
94
+ function generateInterface(name, config) {
95
+ const typeName = toPascalCase(name);
96
+ const lines = [];
97
+ lines.push(`/** Table: ${name} */`);
98
+ lines.push(`export interface ${typeName} {`);
99
+ lines.push(...SYSTEM_FIELDS);
100
+ if (config.schema) {
101
+ for (const [fieldName, fieldDef] of Object.entries(config.schema)) {
102
+ if (fieldDef === false)
103
+ continue;
104
+ const tsType = FIELD_TYPE_MAP[fieldDef.type] ?? 'unknown';
105
+ const optional = fieldDef.required ? '' : '?';
106
+ const referenceLabel = getReferenceLabel(fieldDef.references);
107
+ const refComment = referenceLabel ? ` // references → ${referenceLabel}` : '';
108
+ const enumComment = fieldDef.enum ? ` // enum: ${fieldDef.enum.join(' | ')}` : '';
109
+ lines.push(` ${renderPropertyName(fieldName)}${optional}: ${tsType};${refComment}${enumComment}`);
110
+ }
111
+ }
112
+ lines.push(`}`);
113
+ return lines.join('\n');
114
+ }
115
+ /**
116
+ * Generate full type definitions file from a parsed config.
117
+ * Supports the canonical `databases` block.
118
+ */
119
+ export function generateTypes(config) {
120
+ const lines = [
121
+ '// ─────────────────────────────────────────────',
122
+ '// Auto-generated by `npx edgebase typegen`',
123
+ '// Do not edit manually.',
124
+ `// Generated at: ${new Date().toISOString()}`,
125
+ '// ─────────────────────────────────────────────',
126
+ '',
127
+ ];
128
+ // Collect all tables from the databases block
129
+ const allTables = {};
130
+ if (config.databases) {
131
+ for (const dbBlock of Object.values(config.databases)) {
132
+ for (const [tableName, tableConfig] of Object.entries(dbBlock.tables ?? {})) {
133
+ allTables[tableName] = tableConfig;
134
+ }
135
+ }
136
+ }
137
+ if (Object.keys(allTables).length === 0) {
138
+ lines.push('// No tables found in config.');
139
+ return lines.join('\n');
140
+ }
141
+ for (const [name, tableConfig] of Object.entries(allTables)) {
142
+ lines.push(generateInterface(name, tableConfig));
143
+ lines.push('');
144
+ }
145
+ // Type map
146
+ lines.push('/** Table name → Type mapping */');
147
+ lines.push('export interface EdgeBaseTables {');
148
+ for (const name of Object.keys(allTables)) {
149
+ const typeName = toPascalCase(name);
150
+ lines.push(` ${renderPropertyName(name)}: ${typeName};`);
151
+ }
152
+ lines.push('}');
153
+ lines.push('');
154
+ return lines.join('\n');
155
+ }
156
+ // ─── Command ───
157
+ export const typegenCommand = new Command('typegen')
158
+ .alias('tg')
159
+ .description('Generate TypeScript types from edgebase.config.ts schema')
160
+ .option('-o, --output <path>', 'Output file path', 'edgebase.d.ts')
161
+ .action((options) => {
162
+ const cwd = process.cwd();
163
+ const configPath = resolveConfigPath(cwd);
164
+ if (!configPath) {
165
+ raiseCliError({
166
+ code: 'typegen_config_not_found',
167
+ message: 'edgebase.config.ts not found.',
168
+ hint: 'Run `npm create edge-base@latest my-app` to create a project first.',
169
+ });
170
+ }
171
+ const s = spin(`Reading config: ${path.basename(configPath)}`);
172
+ let config;
173
+ try {
174
+ config = loadConfig(configPath, cwd);
175
+ }
176
+ catch (err) {
177
+ s.fail(`Failed to parse config: ${err.message}`);
178
+ raiseCliError({
179
+ code: 'typegen_config_parse_failed',
180
+ message: `Failed to parse config: ${err.message}`,
181
+ hint: 'Make sure edgebase.config.ts exports a valid config object.',
182
+ });
183
+ }
184
+ // Count tables from the canonical databases block
185
+ let tableCount = 0;
186
+ if (config.databases) {
187
+ for (const db of Object.values(config.databases)) {
188
+ tableCount += Object.keys(db.tables ?? {}).length;
189
+ }
190
+ }
191
+ if (tableCount === 0) {
192
+ s.warn('No tables found in config.');
193
+ }
194
+ else {
195
+ s.succeed(`Parsed ${tableCount} table(s) from config`);
196
+ }
197
+ const output = generateTypes(config);
198
+ const outputPath = path.resolve(cwd, options.output);
199
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
200
+ fs.writeFileSync(outputPath, output, 'utf-8');
201
+ if (isJson()) {
202
+ console.log(JSON.stringify({
203
+ status: 'success',
204
+ tables: tableCount,
205
+ output: options.output,
206
+ }));
207
+ }
208
+ else if (!isQuiet()) {
209
+ console.log(chalk.green('✅'), `Generated ${tableCount} type(s) → ${options.output}`);
210
+ }
211
+ });
212
+ //# sourceMappingURL=typegen.js.map