@kardoe/quickback 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/commands/compile.d.ts +18 -0
  2. package/dist/commands/compile.d.ts.map +1 -0
  3. package/dist/commands/compile.js +144 -0
  4. package/dist/commands/compile.js.map +1 -0
  5. package/dist/commands/create.d.ts +18 -0
  6. package/dist/commands/create.d.ts.map +1 -0
  7. package/dist/commands/create.js +669 -0
  8. package/dist/commands/create.js.map +1 -0
  9. package/dist/commands/init.d.ts +6 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +383 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/login.d.ts +8 -0
  14. package/dist/commands/login.d.ts.map +1 -0
  15. package/dist/commands/login.js +190 -0
  16. package/dist/commands/login.js.map +1 -0
  17. package/dist/commands/logout.d.ts +7 -0
  18. package/dist/commands/logout.d.ts.map +1 -0
  19. package/dist/commands/logout.js +19 -0
  20. package/dist/commands/logout.js.map +1 -0
  21. package/dist/commands/whoami.d.ts +7 -0
  22. package/dist/commands/whoami.d.ts.map +1 -0
  23. package/dist/commands/whoami.js +37 -0
  24. package/dist/commands/whoami.js.map +1 -0
  25. package/dist/index.d.ts +12 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +140 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/lib/api-client.d.ts +82 -0
  30. package/dist/lib/api-client.d.ts.map +1 -0
  31. package/dist/lib/api-client.js +59 -0
  32. package/dist/lib/api-client.js.map +1 -0
  33. package/dist/lib/auth.d.ts +44 -0
  34. package/dist/lib/auth.d.ts.map +1 -0
  35. package/dist/lib/auth.js +85 -0
  36. package/dist/lib/auth.js.map +1 -0
  37. package/dist/lib/compiler-stubs.d.ts +66 -0
  38. package/dist/lib/compiler-stubs.d.ts.map +1 -0
  39. package/dist/lib/compiler-stubs.js +75 -0
  40. package/dist/lib/compiler-stubs.js.map +1 -0
  41. package/dist/lib/file-loader.d.ts +73 -0
  42. package/dist/lib/file-loader.d.ts.map +1 -0
  43. package/dist/lib/file-loader.js +291 -0
  44. package/dist/lib/file-loader.js.map +1 -0
  45. package/dist/lib/file-writer.d.ts +33 -0
  46. package/dist/lib/file-writer.d.ts.map +1 -0
  47. package/dist/lib/file-writer.js +110 -0
  48. package/dist/lib/file-writer.js.map +1 -0
  49. package/dist/lib/helpers.d.ts +39 -0
  50. package/dist/lib/helpers.d.ts.map +1 -0
  51. package/dist/lib/helpers.js +299 -0
  52. package/dist/lib/helpers.js.map +1 -0
  53. package/dist/lib/shell.d.ts +15 -0
  54. package/dist/lib/shell.d.ts.map +1 -0
  55. package/dist/lib/shell.js +32 -0
  56. package/dist/lib/shell.js.map +1 -0
  57. package/dist/templates/registry.d.ts +36 -0
  58. package/dist/templates/registry.d.ts.map +1 -0
  59. package/dist/templates/registry.js +143 -0
  60. package/dist/templates/registry.js.map +1 -0
  61. package/package.json +37 -0
@@ -0,0 +1,299 @@
1
+ export function validateBindingName(name) {
2
+ if (!name || name.trim().length === 0)
3
+ return "Please enter a binding name";
4
+ if (!/^[A-Z0-9_]+$/.test(name))
5
+ return "Use ONLY A-Z, 0-9, and underscores";
6
+ return undefined;
7
+ }
8
+ export function updateJSON(filePath, mutator) {
9
+ const { readFileSync, writeFileSync } = require("fs");
10
+ const json = JSON.parse(readFileSync(filePath, "utf8"));
11
+ const next = mutator(json);
12
+ writeFileSync(filePath, JSON.stringify(next, null, 2));
13
+ }
14
+ export function extractFirstBlock(toml, header) {
15
+ const re = new RegExp(`(\\[\\[${header}\\]\\][\\s\\S]*?)(?=\\n\\[\\[|$)`);
16
+ const match = re.exec(toml);
17
+ if (!match)
18
+ return null;
19
+ return { block: match[1], start: match.index, end: match.index + match[1].length };
20
+ }
21
+ export function updateD1Block(toml, binding, dbName) {
22
+ const found = extractFirstBlock(toml, "d1_databases");
23
+ if (!found)
24
+ return toml;
25
+ let block = found.block;
26
+ if (/binding\s*=\s*"[^"]+"/.test(block)) {
27
+ block = block.replace(/binding\s*=\s*"[^"]+"/, `binding = "${binding}"`);
28
+ }
29
+ else {
30
+ block = block.replace(/\[\[d1_databases\]\]/, `[[d1_databases]]\nbinding = "${binding}"`);
31
+ }
32
+ if (/database_name\s*=\s*"[^"]+"/.test(block)) {
33
+ block = block.replace(/database_name\s*=\s*"[^"]+"/, `database_name = "${dbName}"`);
34
+ }
35
+ return toml.slice(0, found.start) + block + toml.slice(found.end);
36
+ }
37
+ export function appendOrReplaceKvNamespaceBlock(toml, binding, id) {
38
+ const kvBlockRegex = /\[\[kv_namespaces\]\][\s\S]*?(?=(\n\[\[|$))/g;
39
+ const blocks = toml.match(kvBlockRegex) || [];
40
+ const newBlock = [
41
+ "[[kv_namespaces]]",
42
+ `binding = "${binding}"`,
43
+ id ? `id = "${id}"` : `id = "YOUR_KV_NAMESPACE_ID"`,
44
+ ].join("\n");
45
+ const existingIndex = blocks.findIndex(b => b.includes(`binding = "${binding}"`));
46
+ if (existingIndex >= 0) {
47
+ const existing = blocks[existingIndex];
48
+ return toml.replace(existing, newBlock);
49
+ }
50
+ return toml.trimEnd() + "\n\n" + newBlock + "\n";
51
+ }
52
+ export function appendOrReplaceR2Block(toml, binding, bucketName) {
53
+ const r2BlockRegex = /\[\[r2_buckets\]\][\s\S]*?(?=(\n\[\[|$))/g;
54
+ const blocks = toml.match(r2BlockRegex) || [];
55
+ const newBlock = ["[[r2_buckets]]", `binding = "${binding}"`, `bucket_name = "${bucketName}"`].join("\n");
56
+ const existingIndex = blocks.findIndex(b => b.includes(`binding = "${binding}"`));
57
+ if (existingIndex >= 0) {
58
+ const existing = blocks[existingIndex];
59
+ return toml.replace(existing, newBlock);
60
+ }
61
+ return toml.trimEnd() + "\n\n" + newBlock + "\n";
62
+ }
63
+ export function appendOrReplaceHyperdriveBlock(toml, binding, id, database, connectionString) {
64
+ const blockRegex = /\[\[hyperdrive\]\][\s\S]*?(?=(\n\[\[|$))/g;
65
+ const blocks = toml.match(blockRegex) || [];
66
+ // Use provided connection string or fallback to proper local defaults
67
+ let localConnectionString = connectionString || "postgresql://postgres:password@localhost:5432/postgres";
68
+ if (!connectionString && database === "hyperdrive-mysql") {
69
+ localConnectionString = "mysql://root:password@localhost:3306/mysql";
70
+ }
71
+ const placeholderId = id || "YOUR_HYPERDRIVE_ID";
72
+ const newBlock = [
73
+ "[[hyperdrive]]",
74
+ `binding = "${binding}"`,
75
+ `id = "${placeholderId}"`,
76
+ `localConnectionString = "${localConnectionString}"`,
77
+ ].join("\n");
78
+ const existingIndex = blocks.findIndex(b => b.includes(`binding = "${binding}"`));
79
+ if (existingIndex >= 0) {
80
+ const existing = blocks[existingIndex];
81
+ return toml.replace(existing, newBlock);
82
+ }
83
+ return toml.trimEnd() + "\n\n" + newBlock + "\n";
84
+ }
85
+ export function parseWranglerToml(tomlContent) {
86
+ const databases = [];
87
+ // Parse D1 databases
88
+ const d1Regex = /\[\[d1_databases\]\]\s*\n([^[]*?)(?=\n\[|\n$|$)/g;
89
+ let d1Match;
90
+ while ((d1Match = d1Regex.exec(tomlContent)) !== null) {
91
+ const block = d1Match[1];
92
+ const bindingRegex = /binding\s*=\s*"([^"]+)"/;
93
+ const nameRegex = /database_name\s*=\s*"([^"]+)"/;
94
+ const idRegex = /database_id\s*=\s*"([^"]+)"/;
95
+ const bindingMatch = bindingRegex.exec(block);
96
+ const nameMatch = nameRegex.exec(block);
97
+ const idMatch = idRegex.exec(block);
98
+ if (bindingMatch) {
99
+ databases.push({
100
+ type: "d1",
101
+ binding: bindingMatch[1],
102
+ name: nameMatch?.[1],
103
+ id: idMatch?.[1],
104
+ });
105
+ }
106
+ }
107
+ // Parse Hyperdrive databases
108
+ const hyperdriveRegex = /\[\[hyperdrive\]\]\s*\n([^[]*?)(?=\n\[|\n$|$)/g;
109
+ let hyperdriveMatch;
110
+ while ((hyperdriveMatch = hyperdriveRegex.exec(tomlContent)) !== null) {
111
+ const block = hyperdriveMatch[1];
112
+ const bindingRegex = /binding\s*=\s*"([^"]+)"/;
113
+ const idRegex = /id\s*=\s*"([^"]+)"/;
114
+ const bindingMatch = bindingRegex.exec(block);
115
+ const idMatch = idRegex.exec(block);
116
+ if (bindingMatch) {
117
+ databases.push({
118
+ type: "hyperdrive",
119
+ binding: bindingMatch[1],
120
+ id: idMatch?.[1],
121
+ });
122
+ }
123
+ }
124
+ return {
125
+ databases,
126
+ hasMultipleDatabases: databases.length > 1,
127
+ };
128
+ }
129
+ // Functions to extract IDs from wrangler command responses
130
+ export function extractD1DatabaseId(wranglerOutput) {
131
+ try {
132
+ // Look for TOML format: database_id = "uuid"
133
+ const tomlRegex = /database_id\s*=\s*"([^"]+)"/;
134
+ const tomlMatch = tomlRegex.exec(wranglerOutput);
135
+ if (tomlMatch) {
136
+ return tomlMatch[1];
137
+ }
138
+ // Look for JSON response with database_id
139
+ const jsonRegex = /\{[\s\S]*"database_id":\s*"([^"]+)"[\s\S]*\}/;
140
+ const jsonMatch = jsonRegex.exec(wranglerOutput);
141
+ if (jsonMatch) {
142
+ return jsonMatch[1];
143
+ }
144
+ // Parse table format from `wrangler d1 info` command
145
+ // The ID appears in the first row of the table without a label
146
+ const lines = wranglerOutput.split("\n");
147
+ for (const line of lines) {
148
+ // Look for a line that contains a UUID (36 characters with hyphens)
149
+ const uuidRegex = /│\s*([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\s*│/i;
150
+ const uuidMatch = uuidRegex.exec(line);
151
+ if (uuidMatch) {
152
+ return uuidMatch[1];
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
161
+ export function extractKvNamespaceId(wranglerOutput) {
162
+ try {
163
+ // Look for TOML format: id = "uuid"
164
+ const tomlRegex = /id\s*=\s*"([^"]+)"/;
165
+ const tomlMatch = tomlRegex.exec(wranglerOutput);
166
+ if (tomlMatch) {
167
+ return tomlMatch[1];
168
+ }
169
+ // Fallback: Look for JSON response with id field in KV context
170
+ const jsonRegex = /"id":\s*"([a-f0-9]+)"/;
171
+ const jsonMatch = jsonRegex.exec(wranglerOutput);
172
+ if (jsonMatch) {
173
+ return jsonMatch[1];
174
+ }
175
+ return null;
176
+ }
177
+ catch {
178
+ return null;
179
+ }
180
+ }
181
+ export function extractHyperdriveId(wranglerOutput) {
182
+ try {
183
+ // Look for TOML format: id = "uuid"
184
+ const tomlRegex = /id\s*=\s*"([^"]+)"/;
185
+ const tomlMatch = tomlRegex.exec(wranglerOutput);
186
+ if (tomlMatch) {
187
+ return tomlMatch[1];
188
+ }
189
+ // Fallback: Look for Hyperdrive ID in text format: "id: uuid"
190
+ const textRegex = /id:\s*([a-f0-9-]+)/i;
191
+ const textMatch = textRegex.exec(wranglerOutput);
192
+ if (textMatch) {
193
+ return textMatch[1];
194
+ }
195
+ // Fallback: Look for JSON response with id field
196
+ const jsonRegex = /\{[\s\S]*"id":\s*"([^"]+)"[\s\S]*\}/;
197
+ const jsonMatch = jsonRegex.exec(wranglerOutput);
198
+ if (jsonMatch) {
199
+ return jsonMatch[1];
200
+ }
201
+ return null;
202
+ }
203
+ catch {
204
+ return null;
205
+ }
206
+ }
207
+ // Functions to update TOML with extracted IDs
208
+ export function updateD1BlockWithId(toml, binding, dbName, databaseId) {
209
+ const found = extractFirstBlock(toml, "d1_databases");
210
+ if (!found)
211
+ return toml;
212
+ let block = found.block;
213
+ // Update binding
214
+ if (/binding\s*=\s*"[^"]+"/.test(block)) {
215
+ block = block.replace(/binding\s*=\s*"[^"]+"/, `binding = "${binding}"`);
216
+ }
217
+ else {
218
+ block = block.replace(/\[\[d1_databases\]\]/, `[[d1_databases]]\nbinding = "${binding}"`);
219
+ }
220
+ // Update database_name
221
+ if (/database_name\s*=\s*"[^"]+"/.test(block)) {
222
+ block = block.replace(/database_name\s*=\s*"[^"]+"/, `database_name = "${dbName}"`);
223
+ }
224
+ // Update database_id
225
+ if (/database_id\s*=\s*"[^"]+"/.test(block)) {
226
+ block = block.replace(/database_id\s*=\s*"[^"]+"/, `database_id = "${databaseId}"`);
227
+ }
228
+ else {
229
+ // Add database_id after database_name
230
+ block = block.replace(/database_name\s*=\s*"[^"]+"/, `database_name = "${dbName}"\ndatabase_id = "${databaseId}"`);
231
+ }
232
+ return toml.slice(0, found.start) + block + toml.slice(found.end);
233
+ }
234
+ export function updateKvBlockWithId(toml, binding, namespaceId) {
235
+ // Use the existing appendOrReplaceKvNamespaceBlock but ensure it updates the ID
236
+ return appendOrReplaceKvNamespaceBlock(toml, binding, namespaceId);
237
+ }
238
+ export function updateHyperdriveBlockWithId(toml, binding, hyperdriveId, connectionString) {
239
+ const found = extractFirstBlock(toml, "hyperdrive");
240
+ if (!found)
241
+ return toml;
242
+ let block = found.block;
243
+ // Update id field
244
+ if (/id\s*=\s*"[^"]+"/.test(block)) {
245
+ block = block.replace(/id\s*=\s*"[^"]+"/, `id = "${hyperdriveId}"`);
246
+ }
247
+ else {
248
+ // Add id after binding
249
+ block = block.replace(/binding\s*=\s*"[^"]+"/, `binding = "${binding}"\nid = "${hyperdriveId}"`);
250
+ }
251
+ // Update localConnectionString if provided
252
+ if (connectionString) {
253
+ if (/localConnectionString\s*=\s*"[^"]+"/.test(block)) {
254
+ block = block.replace(/localConnectionString\s*=\s*"[^"]+"/, `localConnectionString = "${connectionString}"`);
255
+ }
256
+ else {
257
+ // Add localConnectionString after id
258
+ block = block.replace(/id\s*=\s*"[^"]+"/, `id = "${hyperdriveId}"\nlocalConnectionString = "${connectionString}"`);
259
+ }
260
+ }
261
+ return toml.slice(0, found.start) + block + toml.slice(found.end);
262
+ }
263
+ export function initializeGitRepository(projectPath) {
264
+ const { spawnSync } = require("child_process");
265
+ // Check if git is available
266
+ const gitCheck = spawnSync("git", ["--version"], { stdio: "pipe", encoding: "utf8" });
267
+ if (gitCheck.status !== 0) {
268
+ return { success: false, error: "Git is not installed or not available in PATH" };
269
+ }
270
+ // Initialize git repository
271
+ const initResult = spawnSync("git", ["init"], {
272
+ cwd: projectPath,
273
+ stdio: "pipe",
274
+ encoding: "utf8",
275
+ });
276
+ if (initResult.status !== 0) {
277
+ return { success: false, error: `Failed to initialize git repository: ${initResult.stderr}` };
278
+ }
279
+ // Add all files to staging
280
+ const addResult = spawnSync("git", ["add", "."], {
281
+ cwd: projectPath,
282
+ stdio: "pipe",
283
+ encoding: "utf8",
284
+ });
285
+ if (addResult.status !== 0) {
286
+ return { success: false, error: `Failed to add files to git: ${addResult.stderr}` };
287
+ }
288
+ // Create initial commit
289
+ const commitResult = spawnSync("git", ["commit", "-m", "Initial commit"], {
290
+ cwd: projectPath,
291
+ stdio: "pipe",
292
+ encoding: "utf8",
293
+ });
294
+ if (commitResult.status !== 0) {
295
+ return { success: false, error: `Failed to create initial commit: ${commitResult.stderr}` };
296
+ }
297
+ return { success: true };
298
+ }
299
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/lib/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shell Utility
3
+ *
4
+ * Run shell commands with proper error handling
5
+ */
6
+ export interface RunCommandOptions {
7
+ cwd?: string;
8
+ silent?: boolean;
9
+ env?: NodeJS.ProcessEnv;
10
+ }
11
+ /**
12
+ * Run a shell command and return a promise
13
+ */
14
+ export declare function runCommand(cmd: string, options?: RunCommandOptions): Promise<void>;
15
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/lib/shell.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5F"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Shell Utility
3
+ *
4
+ * Run shell commands with proper error handling
5
+ */
6
+ import { spawn } from 'child_process';
7
+ /**
8
+ * Run a shell command and return a promise
9
+ */
10
+ export async function runCommand(cmd, options = {}) {
11
+ const { cwd = process.cwd(), silent = false, env } = options;
12
+ return new Promise((resolve, reject) => {
13
+ const proc = spawn(cmd, {
14
+ cwd,
15
+ stdio: silent ? 'pipe' : 'inherit',
16
+ shell: true,
17
+ env: env || process.env,
18
+ });
19
+ proc.on('close', (code) => {
20
+ if (code === 0) {
21
+ resolve();
22
+ }
23
+ else {
24
+ reject(new Error(`Command failed with exit code ${code}: ${cmd}`));
25
+ }
26
+ });
27
+ proc.on('error', (err) => {
28
+ reject(new Error(`Failed to run command: ${cmd}\n${err.message}`));
29
+ });
30
+ });
31
+ }
32
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/lib/shell.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAQtC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,UAA6B,EAAE;IAC3E,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAE7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE;YACtB,GAAG;YACH,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAClC,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Template Registry
3
+ *
4
+ * Defines available project templates for quickback create command.
5
+ * The server is the source of truth for templates and tiers.
6
+ * This local registry serves as a fallback when offline.
7
+ */
8
+ import { type TemplateInfo } from '../lib/api-client.js';
9
+ export interface TemplateDefinition {
10
+ name: string;
11
+ description: string;
12
+ category: "auth" | "saas" | "api" | "payments";
13
+ tags: string[];
14
+ author: string;
15
+ version: string;
16
+ includes: string[];
17
+ preset: string;
18
+ requiresCloudflare: boolean;
19
+ tier: 'free' | 'pro';
20
+ }
21
+ /**
22
+ * Fetch templates from server (with caching)
23
+ */
24
+ export declare function fetchServerTemplates(): Promise<Record<string, TemplateInfo>>;
25
+ /**
26
+ * Check if a template requires pro tier
27
+ */
28
+ export declare function isProTemplate(templateName: string): Promise<boolean>;
29
+ export declare const TEMPLATE_REGISTRY: Record<string, TemplateDefinition>;
30
+ export declare const TEMPLATE_ALIASES: Record<string, string>;
31
+ export declare function getTemplate(nameOrAlias: string): TemplateDefinition | undefined;
32
+ export declare function listTemplates(): TemplateDefinition[];
33
+ export declare function listTemplateNames(): string[];
34
+ export declare function listAliases(): Record<string, string>;
35
+ export declare function formatTemplateList(): string;
36
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/templates/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CACxB;AAKD;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAYlF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY1E;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAgEhE,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQnD,CAAC;AAEF,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAG/E;AAED,wBAAgB,aAAa,IAAI,kBAAkB,EAAE,CAEpD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEpD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAgB3C"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Template Registry
3
+ *
4
+ * Defines available project templates for quickback create command.
5
+ * The server is the source of truth for templates and tiers.
6
+ * This local registry serves as a fallback when offline.
7
+ */
8
+ import { fetchTemplates } from '../lib/api-client.js';
9
+ // Cache for server templates
10
+ let serverTemplatesCache = null;
11
+ /**
12
+ * Fetch templates from server (with caching)
13
+ */
14
+ export async function fetchServerTemplates() {
15
+ if (serverTemplatesCache) {
16
+ return serverTemplatesCache;
17
+ }
18
+ try {
19
+ serverTemplatesCache = await fetchTemplates();
20
+ return serverTemplatesCache;
21
+ }
22
+ catch {
23
+ // Fallback to local registry
24
+ return {};
25
+ }
26
+ }
27
+ /**
28
+ * Check if a template requires pro tier
29
+ */
30
+ export async function isProTemplate(templateName) {
31
+ const serverTemplates = await fetchServerTemplates();
32
+ const resolved = TEMPLATE_ALIASES[templateName] || templateName;
33
+ // Check server first
34
+ if (serverTemplates[resolved]) {
35
+ return serverTemplates[resolved].tier === 'pro';
36
+ }
37
+ // Fallback to local
38
+ const local = TEMPLATE_REGISTRY[resolved];
39
+ return local?.tier === 'pro';
40
+ }
41
+ export const TEMPLATE_REGISTRY = {
42
+ // Free tier templates
43
+ "betterauth-d1-cloudflare": {
44
+ name: "Better Auth + D1 + Cloudflare",
45
+ description: "Authentication with Better Auth, D1 database, deployed to Cloudflare Workers",
46
+ category: "auth",
47
+ tags: ["auth", "cloudflare", "d1", "hono"],
48
+ author: "quickback",
49
+ version: "1.0.0",
50
+ includes: ["betterauth", "d1", "hono", "drizzle"],
51
+ preset: "cloudflare",
52
+ requiresCloudflare: true,
53
+ tier: "free",
54
+ },
55
+ "betterauth-sqlite-bun": {
56
+ name: "Better Auth + SQLite + Bun",
57
+ description: "Local development with Better Auth, SQLite database, running on Bun",
58
+ category: "auth",
59
+ tags: ["auth", "bun", "sqlite", "local"],
60
+ author: "quickback",
61
+ version: "1.0.0",
62
+ includes: ["betterauth", "better-sqlite3", "hono", "drizzle"],
63
+ preset: "bun",
64
+ requiresCloudflare: false,
65
+ tier: "free",
66
+ },
67
+ // Pro tier templates
68
+ "betterauth-libsql-turso": {
69
+ name: "Better Auth + LibSQL + Turso",
70
+ description: "Authentication with Better Auth, Turso/LibSQL database",
71
+ category: "auth",
72
+ tags: ["auth", "turso", "libsql", "edge"],
73
+ author: "quickback",
74
+ version: "1.0.0",
75
+ includes: ["betterauth", "libsql", "hono", "drizzle"],
76
+ preset: "turso",
77
+ requiresCloudflare: false,
78
+ tier: "pro",
79
+ },
80
+ // Future templates (placeholders for marketplace)
81
+ "b2bsaas-cloudflare": {
82
+ name: "B2B SaaS Starter",
83
+ description: "Full B2B SaaS with auth, organizations, billing hooks, email",
84
+ category: "saas",
85
+ tags: ["saas", "b2b", "stripe", "cloudflare", "teams"],
86
+ author: "quickback",
87
+ version: "0.1.0",
88
+ includes: ["betterauth", "organizations", "stripe", "resend", "d1", "r2"],
89
+ preset: "cloudflare",
90
+ requiresCloudflare: true,
91
+ tier: "pro",
92
+ },
93
+ "api-minimal-bun": {
94
+ name: "Minimal API (no auth)",
95
+ description: "Lightweight API with just database and routes, no authentication",
96
+ category: "api",
97
+ tags: ["api", "minimal", "bun", "sqlite"],
98
+ author: "quickback",
99
+ version: "1.0.0",
100
+ includes: ["hono", "drizzle", "better-sqlite3"],
101
+ preset: "bun",
102
+ requiresCloudflare: false,
103
+ tier: "free",
104
+ },
105
+ };
106
+ // Aliases for common shortcuts
107
+ export const TEMPLATE_ALIASES = {
108
+ "cloudflare": "betterauth-d1-cloudflare",
109
+ "cf": "betterauth-d1-cloudflare",
110
+ "bun": "betterauth-sqlite-bun",
111
+ "local": "betterauth-sqlite-bun",
112
+ "turso": "betterauth-libsql-turso",
113
+ "saas": "b2bsaas-cloudflare",
114
+ "minimal": "api-minimal-bun",
115
+ };
116
+ export function getTemplate(nameOrAlias) {
117
+ const resolved = TEMPLATE_ALIASES[nameOrAlias] || nameOrAlias;
118
+ return TEMPLATE_REGISTRY[resolved];
119
+ }
120
+ export function listTemplates() {
121
+ return Object.values(TEMPLATE_REGISTRY);
122
+ }
123
+ export function listTemplateNames() {
124
+ return Object.keys(TEMPLATE_REGISTRY);
125
+ }
126
+ export function listAliases() {
127
+ return TEMPLATE_ALIASES;
128
+ }
129
+ export function formatTemplateList() {
130
+ const lines = ["Available templates:\n"];
131
+ for (const [id, template] of Object.entries(TEMPLATE_REGISTRY)) {
132
+ lines.push(` ${id}`);
133
+ lines.push(` ${template.description}`);
134
+ lines.push(` Tags: ${template.tags.join(", ")}`);
135
+ lines.push("");
136
+ }
137
+ lines.push("Aliases:");
138
+ for (const [alias, target] of Object.entries(TEMPLATE_ALIASES)) {
139
+ lines.push(` ${alias} -> ${target}`);
140
+ }
141
+ return lines.join("\n");
142
+ }
143
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/templates/registry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@kardoe/quickback",
3
+ "version": "0.4.0",
4
+ "description": "CLI for Quickback - one-shot backend generator",
5
+ "author": "Paul Stenhouse",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "bin": {
9
+ "quickback": "./dist/index.js"
10
+ },
11
+ "main": "./dist/index.js",
12
+ "files": [
13
+ "dist/**/*"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "test": "bun test",
19
+ "typecheck": "tsc --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "dev": "^0.1.3",
23
+ "esbuild": "^0.27.2",
24
+ "ora": "^9.0.0",
25
+ "picocolors": "^1.0.0",
26
+ "prompts": "^2.4.2"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^22.7.5",
30
+ "@types/prompts": "^2.4.9",
31
+ "bun-types": "^1.3.5",
32
+ "typescript": "^5.5.4"
33
+ },
34
+ "engines": {
35
+ "node": ">=18.0.0"
36
+ }
37
+ }