@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,18 @@
1
+ /**
2
+ * Compile Command
3
+ *
4
+ * Loads configuration and features from disk, calls the remote compiler API,
5
+ * writes the generated files to the project root, and runs post-compile commands.
6
+ *
7
+ * Project structure:
8
+ * my-app/
9
+ * ├── quickback/
10
+ * │ ├── quickback.config.ts
11
+ * │ └── definitions/features/...
12
+ * ├── src/ ← compiled code written here
13
+ * ├── supabase/migrations/ ← for Supabase provider
14
+ * ├── drizzle/ ← for D1/SQLite providers
15
+ * └── package.json
16
+ */
17
+ export declare function compile(): Promise<void>;
18
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAqI7C"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Compile Command
3
+ *
4
+ * Loads configuration and features from disk, calls the remote compiler API,
5
+ * writes the generated files to the project root, and runs post-compile commands.
6
+ *
7
+ * Project structure:
8
+ * my-app/
9
+ * ├── quickback/
10
+ * │ ├── quickback.config.ts
11
+ * │ └── definitions/features/...
12
+ * ├── src/ ← compiled code written here
13
+ * ├── supabase/migrations/ ← for Supabase provider
14
+ * ├── drizzle/ ← for D1/SQLite providers
15
+ * └── package.json
16
+ */
17
+ import { join, dirname } from 'path';
18
+ import pc from 'picocolors';
19
+ import ora from 'ora';
20
+ import { callCompiler } from '../lib/api-client.js';
21
+ import { loadConfig, loadFeatures, findConfigPath, findFeaturesDir, loadDrizzleMeta } from '../lib/file-loader.js';
22
+ import { writeFilesWithMerge } from '../lib/file-writer.js';
23
+ import { runCommand } from '../lib/shell.js';
24
+ export async function compile() {
25
+ console.log(pc.bold('Quickback Compiler'));
26
+ console.log(pc.gray('Compiling via remote API...\n'));
27
+ const spinner = ora('Loading configuration...').start();
28
+ try {
29
+ // Find config file
30
+ const configPath = findConfigPath();
31
+ if (!configPath) {
32
+ spinner.fail('Configuration not found');
33
+ console.error(pc.red('Error: quickback.config.ts not found'));
34
+ console.log("Run 'quickback init' to create a new project structure");
35
+ process.exit(1);
36
+ }
37
+ // Determine project root (parent of quickback/ folder)
38
+ const quickbackDir = dirname(configPath);
39
+ const projectRoot = configPath.includes('/quickback/')
40
+ ? dirname(quickbackDir) // Config in quickback/ folder → parent is project root
41
+ : process.cwd(); // Config at cwd → cwd is project root
42
+ // Load config
43
+ const config = await loadConfig(configPath);
44
+ spinner.succeed(`Configuration loaded: ${pc.cyan(config.name)}`);
45
+ // Load features
46
+ spinner.start('Loading features...');
47
+ const featuresDir = findFeaturesDir();
48
+ const features = featuresDir ? await loadFeatures(featuresDir) : [];
49
+ spinner.succeed(`Loaded ${features.length} feature(s)`);
50
+ // Determine output directory first (needed for loading existing meta)
51
+ const outputDir = config.build?.outputDir
52
+ ? join(quickbackDir, config.build.outputDir)
53
+ : projectRoot;
54
+ // Load existing drizzle meta for incremental migrations
55
+ const drizzleMeta = loadDrizzleMeta(outputDir);
56
+ if (drizzleMeta) {
57
+ console.log(pc.gray(` Found existing migration state (${Object.keys(drizzleMeta).length} files)`));
58
+ }
59
+ // Call remote compiler API
60
+ spinner.start('Compiling via Quickback API...');
61
+ const result = await callCompiler({
62
+ config: {
63
+ name: config.name,
64
+ preset: config.preset,
65
+ template: config.template,
66
+ providers: config.providers,
67
+ build: config.build,
68
+ },
69
+ features: features.map((f) => ({
70
+ name: f.name,
71
+ schema: f.schema,
72
+ tables: f.tables,
73
+ resourceSource: f.resourceSource,
74
+ actionsSource: f.actionsSource,
75
+ handlerFiles: f.handlerFiles,
76
+ })),
77
+ // Include existing migration state for incremental migrations
78
+ existingFiles: drizzleMeta,
79
+ }); // Type assertion for existingFiles
80
+ spinner.succeed(`Compiled ${result.meta.fileCount} files (v${result.meta.version})`);
81
+ // Display warnings if any
82
+ if (result.warnings && result.warnings.length > 0) {
83
+ console.log(pc.yellow('\n⚠ Compilation warnings:'));
84
+ for (const warning of result.warnings) {
85
+ console.log(pc.yellow(` • ${warning}`));
86
+ }
87
+ console.log();
88
+ }
89
+ spinner.start('Writing output...');
90
+ // Use merge strategy - don't wipe existing files, just update generated ones
91
+ writeFilesWithMerge(outputDir, result.files);
92
+ spinner.succeed(`Output written to ${pc.cyan(outputDir)}`);
93
+ // Run post-compile commands from providers
94
+ if (result.commands && result.commands.length > 0) {
95
+ console.log(pc.gray('\nRunning post-compile commands...\n'));
96
+ for (const cmd of result.commands) {
97
+ // Replace {{OUTPUT_DIR}} placeholder with actual path
98
+ const command = cmd.command.replace(/\{\{OUTPUT_DIR\}\}/g, outputDir);
99
+ // Determine working directory based on command's cwd setting
100
+ // 'output' means project root (where compiled code lives)
101
+ const commandCwd = cmd.cwd === 'output' ? outputDir : projectRoot;
102
+ spinner.start(cmd.description);
103
+ try {
104
+ await runCommand(command, { cwd: commandCwd });
105
+ spinner.succeed(cmd.description);
106
+ }
107
+ catch (error) {
108
+ if (cmd.optional) {
109
+ spinner.warn(`${cmd.description} (skipped)`);
110
+ }
111
+ else {
112
+ spinner.fail(cmd.description);
113
+ throw error;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ // Print next steps
119
+ console.log(pc.green('\n✔ Compilation complete!'));
120
+ console.log(`\nGenerated files for: ${pc.cyan(result.meta.features.join(', ') || 'no features')}`);
121
+ console.log('\nNext steps:');
122
+ console.log(pc.gray(' npm run dev'));
123
+ }
124
+ catch (error) {
125
+ spinner.fail('Compilation failed');
126
+ if (error instanceof Error) {
127
+ console.error(pc.red('\nError:'), error.message);
128
+ // Check for specific error types
129
+ if (error.message.includes('requires a Pro account')) {
130
+ console.log(pc.yellow('\nThis template requires a Pro account.'));
131
+ console.log('Run: quickback login');
132
+ }
133
+ else if (error.message.includes('fetch')) {
134
+ console.log(pc.yellow('\nCould not connect to the Quickback API.'));
135
+ console.log('Check your internet connection and try again.');
136
+ }
137
+ }
138
+ else {
139
+ console.error(pc.red('\nError:'), error);
140
+ }
141
+ process.exit(1);
142
+ }
143
+ }
144
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Create Command
3
+ *
4
+ * One-shot project creation with templates.
5
+ * Usage: quickback create <template> <app-name>
6
+ * Example: quickback create betterauth-d1-cloudflare my-app
7
+ */
8
+ export interface CreateOptions {
9
+ template: string;
10
+ appName: string;
11
+ skipCloudflareSetup?: boolean;
12
+ skipInstall?: boolean;
13
+ skipMigrations?: boolean;
14
+ dryRun?: boolean;
15
+ verbose?: boolean;
16
+ }
17
+ export declare function create(args: string[]): Promise<void>;
18
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAMD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+I1D"}