@beaulewis/saas-cli 1.0.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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +373 -0
  3. package/bin/saas.js +2 -0
  4. package/dist/chunk-26VE6QJ4.js +120 -0
  5. package/dist/chunk-26VE6QJ4.js.map +1 -0
  6. package/dist/chunk-3KD5CFV3.js +196 -0
  7. package/dist/chunk-3KD5CFV3.js.map +1 -0
  8. package/dist/chunk-5BCEXHNM.js +108 -0
  9. package/dist/chunk-5BCEXHNM.js.map +1 -0
  10. package/dist/chunk-N4OIAZSA.js +110 -0
  11. package/dist/chunk-N4OIAZSA.js.map +1 -0
  12. package/dist/chunk-ZD2ZSBK3.js +224 -0
  13. package/dist/chunk-ZD2ZSBK3.js.map +1 -0
  14. package/dist/dart-DXLFNGHR.js +41 -0
  15. package/dist/dart-DXLFNGHR.js.map +1 -0
  16. package/dist/drift-XYY4D366.js +59 -0
  17. package/dist/drift-XYY4D366.js.map +1 -0
  18. package/dist/flutter-J5BYPVIW.js +41 -0
  19. package/dist/flutter-J5BYPVIW.js.map +1 -0
  20. package/dist/freezed-QXFQ4GJC.js +58 -0
  21. package/dist/freezed-QXFQ4GJC.js.map +1 -0
  22. package/dist/gorouter-QBMTTFVR.js +56 -0
  23. package/dist/gorouter-QBMTTFVR.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +1437 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/package-QO75XHBD.js +43 -0
  28. package/dist/package-QO75XHBD.js.map +1 -0
  29. package/dist/powersync-I3LR7TDN.js +37 -0
  30. package/dist/powersync-I3LR7TDN.js.map +1 -0
  31. package/dist/repository-BAOVD3NG.js +34 -0
  32. package/dist/repository-BAOVD3NG.js.map +1 -0
  33. package/dist/riverpod-XUU656PM.js +42 -0
  34. package/dist/riverpod-XUU656PM.js.map +1 -0
  35. package/dist/widget-YDKHPRXM.js +42 -0
  36. package/dist/widget-YDKHPRXM.js.map +1 -0
  37. package/package.json +89 -0
  38. package/templates/drift/dao.hbs +51 -0
  39. package/templates/drift/migration.hbs +15 -0
  40. package/templates/freezed/model.hbs +20 -0
  41. package/templates/gorouter/route.hbs +18 -0
  42. package/templates/powersync/rules.hbs +10 -0
  43. package/templates/powersync/schema.hbs +19 -0
  44. package/templates/repository/repository.hbs +62 -0
  45. package/templates/riverpod/async-notifier.hbs +44 -0
  46. package/templates/riverpod/family.hbs +9 -0
  47. package/templates/riverpod/future.hbs +9 -0
  48. package/templates/riverpod/notifier.hbs +34 -0
  49. package/templates/riverpod/stream.hbs +9 -0
@@ -0,0 +1,224 @@
1
+ import {
2
+ CLIError
3
+ } from "./chunk-5BCEXHNM.js";
4
+
5
+ // src/utils/column-parser.ts
6
+ function parseColumnSpec(spec) {
7
+ const columns = [];
8
+ const parts = spec.split(",").map((s) => s.trim());
9
+ for (const part of parts) {
10
+ if (!part) continue;
11
+ const column = parseColumn(part);
12
+ columns.push(column);
13
+ }
14
+ return columns;
15
+ }
16
+ function parseColumn(definition) {
17
+ const segments = definition.split(":").map((s) => s.trim());
18
+ if (segments.length < 2) {
19
+ throw new CLIError(
20
+ `Invalid column definition: "${definition}"`,
21
+ 1,
22
+ "Format: name:type[:modifiers] (e.g., id:int:pk, title:text, userId:uuid:fk(auth.users.id))"
23
+ );
24
+ }
25
+ const [name, type, ...modifiers] = segments;
26
+ if (!name || !type) {
27
+ throw new CLIError(
28
+ `Missing name or type in column: "${definition}"`,
29
+ 1,
30
+ "Each column must have a name and type"
31
+ );
32
+ }
33
+ const column = {
34
+ name,
35
+ type: normalizeType(type)
36
+ };
37
+ for (const mod of modifiers) {
38
+ parseModifier(column, mod);
39
+ }
40
+ return column;
41
+ }
42
+ function parseModifier(column, modifier) {
43
+ const mod = modifier.toLowerCase();
44
+ if (mod === "pk" || mod === "primarykey" || mod === "primary_key") {
45
+ column.isPrimaryKey = true;
46
+ return;
47
+ }
48
+ if (mod === "autoincrement" || mod === "auto_increment" || mod === "serial") {
49
+ column.isAutoIncrement = true;
50
+ return;
51
+ }
52
+ if (mod === "nullable" || mod === "null") {
53
+ column.isNullable = true;
54
+ return;
55
+ }
56
+ const fkMatch = modifier.match(/^fk\(([^)]+)\)$/i);
57
+ if (fkMatch) {
58
+ column.isForeignKey = true;
59
+ const ref = fkMatch[1];
60
+ const parts = ref.split(".");
61
+ if (parts.length >= 2) {
62
+ column.foreignKeyTable = parts.slice(0, -1).join(".");
63
+ column.foreignKeyColumn = parts[parts.length - 1];
64
+ } else {
65
+ column.foreignKeyTable = ref;
66
+ column.foreignKeyColumn = "id";
67
+ }
68
+ return;
69
+ }
70
+ const defaultMatch = modifier.match(/^default\((.+)\)$/i);
71
+ if (defaultMatch) {
72
+ column.defaultValue = defaultMatch[1] ?? "";
73
+ return;
74
+ }
75
+ throw new CLIError(
76
+ `Unknown modifier: "${modifier}"`,
77
+ 1,
78
+ "Valid modifiers: pk, fk(table.column), nullable, default(value), autoincrement"
79
+ );
80
+ }
81
+ function normalizeType(type) {
82
+ const typeMap = {
83
+ str: "text",
84
+ string: "text",
85
+ varchar: "text",
86
+ char: "text",
87
+ int: "integer",
88
+ number: "integer",
89
+ bigint: "bigint",
90
+ float: "real",
91
+ double: "real",
92
+ decimal: "real",
93
+ bool: "boolean",
94
+ boolean: "boolean",
95
+ date: "datetime",
96
+ timestamp: "datetime",
97
+ timestamptz: "datetime",
98
+ time: "datetime",
99
+ datetime: "datetime",
100
+ uuid: "uuid",
101
+ json: "jsonb",
102
+ jsonb: "jsonb",
103
+ blob: "blob",
104
+ bytes: "blob",
105
+ binary: "blob"
106
+ };
107
+ return typeMap[type.toLowerCase()] || type.toLowerCase();
108
+ }
109
+ function columnsToSQL(tableName, columns) {
110
+ const lines = [];
111
+ for (const col of columns) {
112
+ let line = ` ${toSnakeCase(col.name)} ${sqlType(col.type)}`;
113
+ if (col.isPrimaryKey && col.isAutoIncrement) {
114
+ line = ` ${toSnakeCase(col.name)} ${col.type === "uuid" ? "UUID DEFAULT gen_random_uuid()" : "SERIAL"} PRIMARY KEY`;
115
+ } else if (col.isPrimaryKey) {
116
+ line += " PRIMARY KEY";
117
+ }
118
+ if (!col.isNullable && !col.isPrimaryKey) {
119
+ line += " NOT NULL";
120
+ }
121
+ if (col.defaultValue !== void 0 && !col.isPrimaryKey) {
122
+ line += ` DEFAULT ${formatDefaultValue(col.defaultValue, col.type)}`;
123
+ }
124
+ if (col.isForeignKey && col.foreignKeyTable) {
125
+ line += ` REFERENCES ${col.foreignKeyTable}(${col.foreignKeyColumn || "id"}) ON DELETE CASCADE`;
126
+ }
127
+ lines.push(line);
128
+ }
129
+ return `CREATE TABLE ${toSnakeCase(tableName)} (
130
+ ${lines.join(",\n")}
131
+ );`;
132
+ }
133
+ function columnsToDrift(tableName, columns) {
134
+ const lines = [`class ${toPascalCase(tableName)} extends Table {`];
135
+ for (const col of columns) {
136
+ lines.push(driftColumn(col));
137
+ }
138
+ lines.push("}");
139
+ return lines.join("\n");
140
+ }
141
+ function driftColumn(col) {
142
+ const driftType = getDriftType(col.type);
143
+ let line = ` ${driftType}Column get ${toCamelCase(col.name)} => ${driftType}()`;
144
+ if (col.isPrimaryKey && col.isAutoIncrement) {
145
+ line += ".autoIncrement()";
146
+ }
147
+ if (col.isNullable) {
148
+ line += ".nullable()";
149
+ }
150
+ if (col.defaultValue !== void 0) {
151
+ const dartDefault = formatDartDefault(col.defaultValue, col.type);
152
+ line += `.withDefault(${dartDefault})`;
153
+ }
154
+ line += "();";
155
+ return line;
156
+ }
157
+ function getDriftType(type) {
158
+ const typeMap = {
159
+ integer: "integer",
160
+ bigint: "int64",
161
+ text: "text",
162
+ boolean: "boolean",
163
+ real: "real",
164
+ datetime: "dateTime",
165
+ uuid: "text",
166
+ jsonb: "text",
167
+ blob: "blob"
168
+ };
169
+ return typeMap[type] || "text";
170
+ }
171
+ function sqlType(type) {
172
+ const typeMap = {
173
+ integer: "INTEGER",
174
+ bigint: "BIGINT",
175
+ text: "TEXT",
176
+ boolean: "BOOLEAN",
177
+ real: "REAL",
178
+ datetime: "TIMESTAMPTZ",
179
+ uuid: "UUID",
180
+ jsonb: "JSONB",
181
+ blob: "BYTEA"
182
+ };
183
+ return typeMap[type] || "TEXT";
184
+ }
185
+ function formatDefaultValue(value, type) {
186
+ if (value === "now()" || value === "now") {
187
+ return "now()";
188
+ }
189
+ if (type === "boolean") {
190
+ return value.toLowerCase() === "true" ? "true" : "false";
191
+ }
192
+ if (type === "integer" || type === "real" || type === "bigint") {
193
+ return value;
194
+ }
195
+ return `'${value}'`;
196
+ }
197
+ function formatDartDefault(value, type) {
198
+ if (value === "now()" || value === "now") {
199
+ return "currentDateAndTime";
200
+ }
201
+ if (type === "boolean") {
202
+ return `const Constant(${value.toLowerCase() === "true" ? "true" : "false"})`;
203
+ }
204
+ if (type === "integer" || type === "real" || type === "bigint") {
205
+ return `const Constant(${value})`;
206
+ }
207
+ return `const Constant('${value}')`;
208
+ }
209
+ function toSnakeCase(str) {
210
+ return str.replace(/([A-Z])/g, "_$1").replace(/[-\s]+/g, "_").toLowerCase().replace(/^_/, "");
211
+ }
212
+ function toCamelCase(str) {
213
+ return str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : "").replace(/^(.)/, (c) => c.toLowerCase());
214
+ }
215
+ function toPascalCase(str) {
216
+ return str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : "").replace(/^(.)/, (c) => c.toUpperCase());
217
+ }
218
+
219
+ export {
220
+ parseColumnSpec,
221
+ columnsToSQL,
222
+ columnsToDrift
223
+ };
224
+ //# sourceMappingURL=chunk-ZD2ZSBK3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/column-parser.ts"],"sourcesContent":["import type { ColumnSpec } from '../types/index.js';\nimport { CLIError } from './error.js';\n\n/**\n * Parse a column specification string into structured column definitions\n *\n * Format: name:type[:modifiers]\n * Modifiers: pk, fk(table.column), nullable, default(value), autoincrement\n *\n * Examples:\n * id:int:pk\n * title:text\n * userId:uuid:fk(auth.users.id)\n * createdAt:datetime:default(now())\n * synced:bool:default(false)\n * email:text:nullable\n */\nexport function parseColumnSpec(spec: string): ColumnSpec[] {\n const columns: ColumnSpec[] = [];\n const parts = spec.split(',').map((s) => s.trim());\n\n for (const part of parts) {\n if (!part) continue;\n\n const column = parseColumn(part);\n columns.push(column);\n }\n\n return columns;\n}\n\n/**\n * Parse a single column definition\n */\nfunction parseColumn(definition: string): ColumnSpec {\n const segments = definition.split(':').map((s) => s.trim());\n\n if (segments.length < 2) {\n throw new CLIError(\n `Invalid column definition: \"${definition}\"`,\n 1,\n 'Format: name:type[:modifiers] (e.g., id:int:pk, title:text, userId:uuid:fk(auth.users.id))',\n );\n }\n\n const [name, type, ...modifiers] = segments;\n\n if (!name || !type) {\n throw new CLIError(\n `Missing name or type in column: \"${definition}\"`,\n 1,\n 'Each column must have a name and type',\n );\n }\n\n const column: ColumnSpec = {\n name,\n type: normalizeType(type),\n };\n\n // Parse modifiers\n for (const mod of modifiers) {\n parseModifier(column, mod);\n }\n\n return column;\n}\n\n/**\n * Parse a modifier and apply it to the column\n */\nfunction parseModifier(column: ColumnSpec, modifier: string): void {\n const mod = modifier.toLowerCase();\n\n // Primary key\n if (mod === 'pk' || mod === 'primarykey' || mod === 'primary_key') {\n column.isPrimaryKey = true;\n return;\n }\n\n // Auto increment\n if (mod === 'autoincrement' || mod === 'auto_increment' || mod === 'serial') {\n column.isAutoIncrement = true;\n return;\n }\n\n // Nullable\n if (mod === 'nullable' || mod === 'null') {\n column.isNullable = true;\n return;\n }\n\n // Foreign key: fk(table.column) or fk(table)\n const fkMatch = modifier.match(/^fk\\(([^)]+)\\)$/i);\n if (fkMatch) {\n column.isForeignKey = true;\n const ref = fkMatch[1]!;\n const parts = ref.split('.');\n if (parts.length >= 2) {\n column.foreignKeyTable = parts.slice(0, -1).join('.');\n column.foreignKeyColumn = parts[parts.length - 1];\n } else {\n column.foreignKeyTable = ref;\n column.foreignKeyColumn = 'id';\n }\n return;\n }\n\n // Default value: default(value) - handles nested parens like now()\n const defaultMatch = modifier.match(/^default\\((.+)\\)$/i);\n if (defaultMatch) {\n column.defaultValue = defaultMatch[1] ?? '';\n return;\n }\n\n throw new CLIError(\n `Unknown modifier: \"${modifier}\"`,\n 1,\n 'Valid modifiers: pk, fk(table.column), nullable, default(value), autoincrement',\n );\n}\n\n/**\n * Normalize type names\n */\nfunction normalizeType(type: string): string {\n const typeMap: Record<string, string> = {\n str: 'text',\n string: 'text',\n varchar: 'text',\n char: 'text',\n int: 'integer',\n number: 'integer',\n bigint: 'bigint',\n float: 'real',\n double: 'real',\n decimal: 'real',\n bool: 'boolean',\n boolean: 'boolean',\n date: 'datetime',\n timestamp: 'datetime',\n timestamptz: 'datetime',\n time: 'datetime',\n datetime: 'datetime',\n uuid: 'uuid',\n json: 'jsonb',\n jsonb: 'jsonb',\n blob: 'blob',\n bytes: 'blob',\n binary: 'blob',\n };\n\n return typeMap[type.toLowerCase()] || type.toLowerCase();\n}\n\n/**\n * Convert columns to SQL CREATE TABLE statement\n */\nexport function columnsToSQL(tableName: string, columns: ColumnSpec[]): string {\n const lines: string[] = [];\n\n for (const col of columns) {\n let line = ` ${toSnakeCase(col.name)} ${sqlType(col.type)}`;\n\n if (col.isPrimaryKey && col.isAutoIncrement) {\n line = ` ${toSnakeCase(col.name)} ${col.type === 'uuid' ? 'UUID DEFAULT gen_random_uuid()' : 'SERIAL'} PRIMARY KEY`;\n } else if (col.isPrimaryKey) {\n line += ' PRIMARY KEY';\n }\n\n if (!col.isNullable && !col.isPrimaryKey) {\n line += ' NOT NULL';\n }\n\n if (col.defaultValue !== undefined && !col.isPrimaryKey) {\n line += ` DEFAULT ${formatDefaultValue(col.defaultValue, col.type)}`;\n }\n\n if (col.isForeignKey && col.foreignKeyTable) {\n line += ` REFERENCES ${col.foreignKeyTable}(${col.foreignKeyColumn || 'id'}) ON DELETE CASCADE`;\n }\n\n lines.push(line);\n }\n\n return `CREATE TABLE ${toSnakeCase(tableName)} (\\n${lines.join(',\\n')}\\n);`;\n}\n\n/**\n * Convert columns to Drift table definition\n */\nexport function columnsToDrift(tableName: string, columns: ColumnSpec[]): string {\n const lines: string[] = [`class ${toPascalCase(tableName)} extends Table {`];\n\n for (const col of columns) {\n lines.push(driftColumn(col));\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/**\n * Generate a single Drift column definition\n */\nfunction driftColumn(col: ColumnSpec): string {\n const driftType = getDriftType(col.type);\n let line = ` ${driftType}Column get ${toCamelCase(col.name)} => ${driftType}()`;\n\n if (col.isPrimaryKey && col.isAutoIncrement) {\n line += '.autoIncrement()';\n }\n\n if (col.isNullable) {\n line += '.nullable()';\n }\n\n if (col.defaultValue !== undefined) {\n const dartDefault = formatDartDefault(col.defaultValue, col.type);\n line += `.withDefault(${dartDefault})`;\n }\n\n line += '();';\n return line;\n}\n\n/**\n * Get Drift column type\n */\nfunction getDriftType(type: string): string {\n const typeMap: Record<string, string> = {\n integer: 'integer',\n bigint: 'int64',\n text: 'text',\n boolean: 'boolean',\n real: 'real',\n datetime: 'dateTime',\n uuid: 'text',\n jsonb: 'text',\n blob: 'blob',\n };\n return typeMap[type] || 'text';\n}\n\n/**\n * Get SQL type\n */\nfunction sqlType(type: string): string {\n const typeMap: Record<string, string> = {\n integer: 'INTEGER',\n bigint: 'BIGINT',\n text: 'TEXT',\n boolean: 'BOOLEAN',\n real: 'REAL',\n datetime: 'TIMESTAMPTZ',\n uuid: 'UUID',\n jsonb: 'JSONB',\n blob: 'BYTEA',\n };\n return typeMap[type] || 'TEXT';\n}\n\n/**\n * Format default value for SQL\n */\nfunction formatDefaultValue(value: string, type: string): string {\n if (value === 'now()' || value === 'now') {\n return 'now()';\n }\n if (type === 'boolean') {\n return value.toLowerCase() === 'true' ? 'true' : 'false';\n }\n if (type === 'integer' || type === 'real' || type === 'bigint') {\n return value;\n }\n return `'${value}'`;\n}\n\n/**\n * Format default value for Dart\n */\nfunction formatDartDefault(value: string, type: string): string {\n if (value === 'now()' || value === 'now') {\n return 'currentDateAndTime';\n }\n if (type === 'boolean') {\n return `const Constant(${value.toLowerCase() === 'true' ? 'true' : 'false'})`;\n }\n if (type === 'integer' || type === 'real' || type === 'bigint') {\n return `const Constant(${value})`;\n }\n return `const Constant('${value}')`;\n}\n\n// Case conversion helpers\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (c) => c.toLowerCase());\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (c) => c.toUpperCase());\n}\n\nexport { toSnakeCase, toCamelCase, toPascalCase };\n"],"mappings":"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","names":[]}
@@ -0,0 +1,41 @@
1
+ import {
2
+ getContext7Client
3
+ } from "./chunk-N4OIAZSA.js";
4
+ import {
5
+ formatBox,
6
+ getAPIKey,
7
+ loadGlobalConfig
8
+ } from "./chunk-3KD5CFV3.js";
9
+ import {
10
+ AuthError,
11
+ handleError
12
+ } from "./chunk-5BCEXHNM.js";
13
+
14
+ // src/commands/docs/dart.ts
15
+ import ora from "ora";
16
+ async function dartAction(query) {
17
+ const spinner = ora("Searching Dart documentation...").start();
18
+ try {
19
+ const config = await loadGlobalConfig();
20
+ const apiKey = getAPIKey("context7", config);
21
+ if (!apiKey) {
22
+ spinner.fail("Context7 API key not found");
23
+ throw new AuthError(
24
+ "CONTEXT7_API_KEY environment variable is not set",
25
+ "Get your API key from https://context7.com/dashboard and set CONTEXT7_API_KEY"
26
+ );
27
+ }
28
+ const client = getContext7Client(apiKey);
29
+ const result = await client.search("dart", query);
30
+ spinner.stop();
31
+ const output = formatBox(`DART: ${query}`, result);
32
+ console.log(output);
33
+ } catch (error) {
34
+ spinner.fail("Failed to fetch documentation");
35
+ handleError(error);
36
+ }
37
+ }
38
+ export {
39
+ dartAction
40
+ };
41
+ //# sourceMappingURL=dart-DXLFNGHR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/docs/dart.ts"],"sourcesContent":["import ora from 'ora';\nimport { getContext7Client } from '../../services/context7.js';\nimport { getAPIKey, loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatBox } from '../../utils/output.js';\n\nexport async function dartAction(query: string): Promise<void> {\n const spinner = ora('Searching Dart documentation...').start();\n\n try {\n const config = await loadGlobalConfig();\n const apiKey = getAPIKey('context7', config);\n\n if (!apiKey) {\n spinner.fail('Context7 API key not found');\n throw new AuthError(\n 'CONTEXT7_API_KEY environment variable is not set',\n 'Get your API key from https://context7.com/dashboard and set CONTEXT7_API_KEY',\n );\n }\n\n const client = getContext7Client(apiKey);\n const result = await client.search('dart', query);\n\n spinner.stop();\n\n const output = formatBox(`DART: ${query}`, result);\n console.log(output);\n } catch (error) {\n spinner.fail('Failed to fetch documentation');\n handleError(error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAMhB,eAAsB,WAAW,OAA8B;AAC7D,QAAM,UAAU,IAAI,iCAAiC,EAAE,MAAM;AAE7D,MAAI;AACF,UAAM,SAAS,MAAM,iBAAiB;AACtC,UAAM,SAAS,UAAU,YAAY,MAAM;AAE3C,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK,4BAA4B;AACzC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,kBAAkB,MAAM;AACvC,UAAM,SAAS,MAAM,OAAO,OAAO,QAAQ,KAAK;AAEhD,YAAQ,KAAK;AAEb,UAAM,SAAS,UAAU,SAAS,KAAK,IAAI,MAAM;AACjD,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,KAAK,+BAA+B;AAC5C,gBAAY,KAAK;AAAA,EACnB;AACF;","names":[]}
@@ -0,0 +1,59 @@
1
+ import {
2
+ columnsToDrift,
3
+ parseColumnSpec
4
+ } from "./chunk-ZD2ZSBK3.js";
5
+ import {
6
+ renderTemplate
7
+ } from "./chunk-26VE6QJ4.js";
8
+ import {
9
+ CLIError,
10
+ handleError
11
+ } from "./chunk-5BCEXHNM.js";
12
+
13
+ // src/commands/gen/drift.ts
14
+ import pc from "picocolors";
15
+ var VALID_TYPES = ["table", "dao", "migration"];
16
+ async function driftAction(type, name, options) {
17
+ try {
18
+ if (!VALID_TYPES.includes(type)) {
19
+ throw new CLIError(`Invalid type: "${type}"`, 1, `Valid types: ${VALID_TYPES.join(", ")}`);
20
+ }
21
+ let output;
22
+ if (type === "table") {
23
+ if (!options.columns) {
24
+ throw new CLIError(
25
+ "Columns specification required for table generation",
26
+ 1,
27
+ 'Use --columns "id:int:pk,title:text,userId:uuid:fk(auth.users)"'
28
+ );
29
+ }
30
+ const columns = parseColumnSpec(options.columns);
31
+ output = columnsToDrift(name, columns);
32
+ } else if (type === "dao") {
33
+ const context = {
34
+ name,
35
+ tableName: name
36
+ };
37
+ output = await renderTemplate("drift", "dao", context);
38
+ } else {
39
+ const context = {
40
+ name,
41
+ date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0]?.replace(/-/g, "")
42
+ };
43
+ output = await renderTemplate("drift", "migration", context);
44
+ }
45
+ if (options.output) {
46
+ const { writeFile } = await import("fs/promises");
47
+ await writeFile(options.output, output);
48
+ console.log(pc.green(`\u2713 Generated ${options.output}`));
49
+ } else {
50
+ console.log(output);
51
+ }
52
+ } catch (error) {
53
+ handleError(error);
54
+ }
55
+ }
56
+ export {
57
+ driftAction
58
+ };
59
+ //# sourceMappingURL=drift-XYY4D366.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/gen/drift.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { renderTemplate } from '../../services/template.js';\nimport { columnsToDrift, parseColumnSpec } from '../../utils/column-parser.js';\nimport { CLIError, handleError } from '../../utils/error.js';\n\ninterface DriftOptions {\n columns?: string;\n output?: string;\n}\n\nconst VALID_TYPES = ['table', 'dao', 'migration'];\n\nexport async function driftAction(\n type: string,\n name: string,\n options: DriftOptions,\n): Promise<void> {\n try {\n // Validate type\n if (!VALID_TYPES.includes(type)) {\n throw new CLIError(`Invalid type: \"${type}\"`, 1, `Valid types: ${VALID_TYPES.join(', ')}`);\n }\n\n let output: string;\n\n if (type === 'table') {\n if (!options.columns) {\n throw new CLIError(\n 'Columns specification required for table generation',\n 1,\n 'Use --columns \"id:int:pk,title:text,userId:uuid:fk(auth.users)\"',\n );\n }\n\n const columns = parseColumnSpec(options.columns);\n output = columnsToDrift(name, columns);\n } else if (type === 'dao') {\n const context = {\n name,\n tableName: name,\n };\n output = await renderTemplate('drift', 'dao', context);\n } else {\n // migration\n const context = {\n name,\n date: new Date().toISOString().split('T')[0]?.replace(/-/g, ''),\n };\n output = await renderTemplate('drift', 'migration', context);\n }\n\n // Output result\n if (options.output) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(options.output, output);\n console.log(pc.green(`✓ Generated ${options.output}`));\n } else {\n console.log(output);\n }\n } catch (error) {\n handleError(error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,OAAO,QAAQ;AAUf,IAAM,cAAc,CAAC,SAAS,OAAO,WAAW;AAEhD,eAAsB,YACpB,MACA,MACA,SACe;AACf,MAAI;AAEF,QAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,YAAM,IAAI,SAAS,kBAAkB,IAAI,KAAK,GAAG,gBAAgB,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,IAC3F;AAEA,QAAI;AAEJ,QAAI,SAAS,SAAS;AACpB,UAAI,CAAC,QAAQ,SAAS;AACpB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,gBAAgB,QAAQ,OAAO;AAC/C,eAAS,eAAe,MAAM,OAAO;AAAA,IACvC,WAAW,SAAS,OAAO;AACzB,YAAM,UAAU;AAAA,QACd;AAAA,QACA,WAAW;AAAA,MACb;AACA,eAAS,MAAM,eAAe,SAAS,OAAO,OAAO;AAAA,IACvD,OAAO;AAEL,YAAM,UAAU;AAAA,QACd;AAAA,QACA,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,MAAM,EAAE;AAAA,MAChE;AACA,eAAS,MAAM,eAAe,SAAS,aAAa,OAAO;AAAA,IAC7D;AAGA,QAAI,QAAQ,QAAQ;AAClB,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,YAAM,UAAU,QAAQ,QAAQ,MAAM;AACtC,cAAQ,IAAI,GAAG,MAAM,oBAAe,QAAQ,MAAM,EAAE,CAAC;AAAA,IACvD,OAAO;AACL,cAAQ,IAAI,MAAM;AAAA,IACpB;AAAA,EACF,SAAS,OAAO;AACd,gBAAY,KAAK;AAAA,EACnB;AACF;","names":[]}
@@ -0,0 +1,41 @@
1
+ import {
2
+ getContext7Client
3
+ } from "./chunk-N4OIAZSA.js";
4
+ import {
5
+ formatBox,
6
+ getAPIKey,
7
+ loadGlobalConfig
8
+ } from "./chunk-3KD5CFV3.js";
9
+ import {
10
+ AuthError,
11
+ handleError
12
+ } from "./chunk-5BCEXHNM.js";
13
+
14
+ // src/commands/docs/flutter.ts
15
+ import ora from "ora";
16
+ async function flutterAction(query) {
17
+ const spinner = ora("Searching Flutter documentation...").start();
18
+ try {
19
+ const config = await loadGlobalConfig();
20
+ const apiKey = getAPIKey("context7", config);
21
+ if (!apiKey) {
22
+ spinner.fail("Context7 API key not found");
23
+ throw new AuthError(
24
+ "CONTEXT7_API_KEY environment variable is not set",
25
+ "Get your API key from https://context7.com/dashboard and set CONTEXT7_API_KEY"
26
+ );
27
+ }
28
+ const client = getContext7Client(apiKey);
29
+ const result = await client.search("flutter", query);
30
+ spinner.stop();
31
+ const output = formatBox(`FLUTTER: ${query}`, result);
32
+ console.log(output);
33
+ } catch (error) {
34
+ spinner.fail("Failed to fetch documentation");
35
+ handleError(error);
36
+ }
37
+ }
38
+ export {
39
+ flutterAction
40
+ };
41
+ //# sourceMappingURL=flutter-J5BYPVIW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/docs/flutter.ts"],"sourcesContent":["import ora from 'ora';\nimport { getContext7Client } from '../../services/context7.js';\nimport { getAPIKey, loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatBox } from '../../utils/output.js';\n\nexport async function flutterAction(query: string): Promise<void> {\n const spinner = ora('Searching Flutter documentation...').start();\n\n try {\n const config = await loadGlobalConfig();\n const apiKey = getAPIKey('context7', config);\n\n if (!apiKey) {\n spinner.fail('Context7 API key not found');\n throw new AuthError(\n 'CONTEXT7_API_KEY environment variable is not set',\n 'Get your API key from https://context7.com/dashboard and set CONTEXT7_API_KEY',\n );\n }\n\n const client = getContext7Client(apiKey);\n const result = await client.search('flutter', query);\n\n spinner.stop();\n\n const output = formatBox(`FLUTTER: ${query}`, result);\n console.log(output);\n } catch (error) {\n spinner.fail('Failed to fetch documentation');\n handleError(error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAMhB,eAAsB,cAAc,OAA8B;AAChE,QAAM,UAAU,IAAI,oCAAoC,EAAE,MAAM;AAEhE,MAAI;AACF,UAAM,SAAS,MAAM,iBAAiB;AACtC,UAAM,SAAS,UAAU,YAAY,MAAM;AAE3C,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK,4BAA4B;AACzC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,kBAAkB,MAAM;AACvC,UAAM,SAAS,MAAM,OAAO,OAAO,WAAW,KAAK;AAEnD,YAAQ,KAAK;AAEb,UAAM,SAAS,UAAU,YAAY,KAAK,IAAI,MAAM;AACpD,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,KAAK,+BAA+B;AAC5C,gBAAY,KAAK;AAAA,EACnB;AACF;","names":[]}
@@ -0,0 +1,58 @@
1
+ import {
2
+ renderTemplate
3
+ } from "./chunk-26VE6QJ4.js";
4
+ import {
5
+ CLIError,
6
+ handleError
7
+ } from "./chunk-5BCEXHNM.js";
8
+
9
+ // src/commands/gen/freezed.ts
10
+ import pc from "picocolors";
11
+ async function freezedAction(name, options) {
12
+ try {
13
+ const fields = [];
14
+ if (options.fields) {
15
+ const fieldParts = options.fields.split(",");
16
+ for (const field of fieldParts) {
17
+ const [fieldName, fieldType] = field.trim().split(":");
18
+ if (fieldName && fieldType) {
19
+ const isNullable = fieldType.endsWith("?");
20
+ const cleanType = isNullable ? fieldType.slice(0, -1) : fieldType;
21
+ fields.push({
22
+ name: fieldName.trim(),
23
+ type: cleanType,
24
+ isNullable,
25
+ hasDefault: false
26
+ });
27
+ }
28
+ }
29
+ }
30
+ if (fields.length === 0) {
31
+ throw new CLIError(
32
+ "Fields specification required for Freezed generation",
33
+ 1,
34
+ 'Use --fields "id:String,name:String,email:String?"'
35
+ );
36
+ }
37
+ const context = {
38
+ name,
39
+ className: name.charAt(0).toUpperCase() + name.slice(1),
40
+ fileName: name.replace(/([A-Z])/g, "_$1").toLowerCase().replace(/^_/, ""),
41
+ fields
42
+ };
43
+ const output = await renderTemplate("freezed", "model", context);
44
+ if (options.output) {
45
+ const { writeFile } = await import("fs/promises");
46
+ await writeFile(options.output, output);
47
+ console.log(pc.green(`\u2713 Generated ${options.output}`));
48
+ } else {
49
+ console.log(output);
50
+ }
51
+ } catch (error) {
52
+ handleError(error);
53
+ }
54
+ }
55
+ export {
56
+ freezedAction
57
+ };
58
+ //# sourceMappingURL=freezed-QXFQ4GJC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/gen/freezed.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { renderTemplate } from '../../services/template.js';\nimport { CLIError, handleError } from '../../utils/error.js';\n\ninterface FreezedOptions {\n fields?: string;\n output?: string;\n}\n\ninterface FieldSpec {\n name: string;\n type: string;\n isNullable: boolean;\n hasDefault: boolean;\n defaultValue?: string;\n}\n\nexport async function freezedAction(name: string, options: FreezedOptions): Promise<void> {\n try {\n // Parse fields\n const fields: FieldSpec[] = [];\n\n if (options.fields) {\n const fieldParts = options.fields.split(',');\n for (const field of fieldParts) {\n const [fieldName, fieldType] = field.trim().split(':');\n if (fieldName && fieldType) {\n const isNullable = fieldType.endsWith('?');\n const cleanType = isNullable ? fieldType.slice(0, -1) : fieldType;\n\n fields.push({\n name: fieldName.trim(),\n type: cleanType,\n isNullable,\n hasDefault: false,\n });\n }\n }\n }\n\n if (fields.length === 0) {\n throw new CLIError(\n 'Fields specification required for Freezed generation',\n 1,\n 'Use --fields \"id:String,name:String,email:String?\"',\n );\n }\n\n // Prepare context\n const context = {\n name,\n className: name.charAt(0).toUpperCase() + name.slice(1),\n fileName: name\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, ''),\n fields,\n };\n\n // Render template\n const output = await renderTemplate('freezed', 'model', context);\n\n // Output result\n if (options.output) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(options.output, output);\n console.log(pc.green(`✓ Generated ${options.output}`));\n } else {\n console.log(output);\n }\n } catch (error) {\n handleError(error);\n }\n}\n"],"mappings":";;;;;;;;;AAAA,OAAO,QAAQ;AAiBf,eAAsB,cAAc,MAAc,SAAwC;AACxF,MAAI;AAEF,UAAM,SAAsB,CAAC;AAE7B,QAAI,QAAQ,QAAQ;AAClB,YAAM,aAAa,QAAQ,OAAO,MAAM,GAAG;AAC3C,iBAAW,SAAS,YAAY;AAC9B,cAAM,CAAC,WAAW,SAAS,IAAI,MAAM,KAAK,EAAE,MAAM,GAAG;AACrD,YAAI,aAAa,WAAW;AAC1B,gBAAM,aAAa,UAAU,SAAS,GAAG;AACzC,gBAAM,YAAY,aAAa,UAAU,MAAM,GAAG,EAAE,IAAI;AAExD,iBAAO,KAAK;AAAA,YACV,MAAM,UAAU,KAAK;AAAA,YACrB,MAAM;AAAA,YACN;AAAA,YACA,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU;AAAA,MACd;AAAA,MACA,WAAW,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,MACtD,UAAU,KACP,QAAQ,YAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,MAAM,EAAE;AAAA,MACnB;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,eAAe,WAAW,SAAS,OAAO;AAG/D,QAAI,QAAQ,QAAQ;AAClB,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,YAAM,UAAU,QAAQ,QAAQ,MAAM;AACtC,cAAQ,IAAI,GAAG,MAAM,oBAAe,QAAQ,MAAM,EAAE,CAAC;AAAA,IACvD,OAAO;AACL,cAAQ,IAAI,MAAM;AAAA,IACpB;AAAA,EACF,SAAS,OAAO;AACd,gBAAY,KAAK;AAAA,EACnB;AACF;","names":[]}
@@ -0,0 +1,56 @@
1
+ import {
2
+ renderTemplate
3
+ } from "./chunk-26VE6QJ4.js";
4
+ import {
5
+ handleError
6
+ } from "./chunk-5BCEXHNM.js";
7
+
8
+ // src/commands/gen/gorouter.ts
9
+ import pc from "picocolors";
10
+ async function gorouterAction(name, options) {
11
+ try {
12
+ const pathParams = [];
13
+ if (options.params) {
14
+ const paramParts = options.params.split(",");
15
+ for (const param of paramParts) {
16
+ const [paramName, paramType] = param.split(":");
17
+ if (paramName) {
18
+ pathParams.push({
19
+ name: paramName.trim(),
20
+ type: paramType?.trim() || "String"
21
+ });
22
+ }
23
+ }
24
+ }
25
+ const routePath = options.path || `/${name.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "")}`;
26
+ const pathMatches = routePath.match(/:(\w+)/g);
27
+ if (pathMatches && pathParams.length === 0) {
28
+ for (const match of pathMatches) {
29
+ const paramName = match.slice(1);
30
+ pathParams.push({ name: paramName, type: "String" });
31
+ }
32
+ }
33
+ const context = {
34
+ name,
35
+ routeName: name.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, ""),
36
+ path: routePath,
37
+ params: pathParams,
38
+ hasParams: pathParams.length > 0,
39
+ screenName: name.charAt(0).toUpperCase() + name.slice(1) + "Screen"
40
+ };
41
+ const output = await renderTemplate("gorouter", "route", context);
42
+ if (options.output) {
43
+ const { writeFile } = await import("fs/promises");
44
+ await writeFile(options.output, output);
45
+ console.log(pc.green(`\u2713 Generated ${options.output}`));
46
+ } else {
47
+ console.log(output);
48
+ }
49
+ } catch (error) {
50
+ handleError(error);
51
+ }
52
+ }
53
+ export {
54
+ gorouterAction
55
+ };
56
+ //# sourceMappingURL=gorouter-QBMTTFVR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/gen/gorouter.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { renderTemplate } from '../../services/template.js';\nimport { handleError } from '../../utils/error.js';\n\ninterface GoRouterOptions {\n path?: string;\n params?: string;\n output?: string;\n}\n\nexport async function gorouterAction(name: string, options: GoRouterOptions): Promise<void> {\n try {\n // Parse path parameters\n const pathParams: Array<{ name: string; type: string }> = [];\n\n if (options.params) {\n const paramParts = options.params.split(',');\n for (const param of paramParts) {\n const [paramName, paramType] = param.split(':');\n if (paramName) {\n pathParams.push({\n name: paramName.trim(),\n type: paramType?.trim() || 'String',\n });\n }\n }\n }\n\n // Extract params from path if not specified\n const routePath =\n options.path ||\n `/${name\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')}`;\n const pathMatches = routePath.match(/:(\\w+)/g);\n\n if (pathMatches && pathParams.length === 0) {\n for (const match of pathMatches) {\n const paramName = match.slice(1);\n pathParams.push({ name: paramName, type: 'String' });\n }\n }\n\n // Prepare context\n const context = {\n name,\n routeName: name\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, ''),\n path: routePath,\n params: pathParams,\n hasParams: pathParams.length > 0,\n screenName: name.charAt(0).toUpperCase() + name.slice(1) + 'Screen',\n };\n\n // Render template\n const output = await renderTemplate('gorouter', 'route', context);\n\n // Output result\n if (options.output) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(options.output, output);\n console.log(pc.green(`✓ Generated ${options.output}`));\n } else {\n console.log(output);\n }\n } catch (error) {\n handleError(error);\n }\n}\n"],"mappings":";;;;;;;;AAAA,OAAO,QAAQ;AAUf,eAAsB,eAAe,MAAc,SAAyC;AAC1F,MAAI;AAEF,UAAM,aAAoD,CAAC;AAE3D,QAAI,QAAQ,QAAQ;AAClB,YAAM,aAAa,QAAQ,OAAO,MAAM,GAAG;AAC3C,iBAAW,SAAS,YAAY;AAC9B,cAAM,CAAC,WAAW,SAAS,IAAI,MAAM,MAAM,GAAG;AAC9C,YAAI,WAAW;AACb,qBAAW,KAAK;AAAA,YACd,MAAM,UAAU,KAAK;AAAA,YACrB,MAAM,WAAW,KAAK,KAAK;AAAA,UAC7B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,YACJ,QAAQ,QACR,IAAI,KACD,QAAQ,YAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,MAAM,EAAE,CAAC;AACtB,UAAM,cAAc,UAAU,MAAM,SAAS;AAE7C,QAAI,eAAe,WAAW,WAAW,GAAG;AAC1C,iBAAW,SAAS,aAAa;AAC/B,cAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,mBAAW,KAAK,EAAE,MAAM,WAAW,MAAM,SAAS,CAAC;AAAA,MACrD;AAAA,IACF;AAGA,UAAM,UAAU;AAAA,MACd;AAAA,MACA,WAAW,KACR,QAAQ,YAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,MAAM,EAAE;AAAA,MACnB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,WAAW,WAAW,SAAS;AAAA,MAC/B,YAAY,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,IAC7D;AAGA,UAAM,SAAS,MAAM,eAAe,YAAY,SAAS,OAAO;AAGhE,QAAI,QAAQ,QAAQ;AAClB,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,YAAM,UAAU,QAAQ,QAAQ,MAAM;AACtC,cAAQ,IAAI,GAAG,MAAM,oBAAe,QAAQ,MAAM,EAAE,CAAC;AAAA,IACvD,OAAO;AACL,cAAQ,IAAI,MAAM;AAAA,IACpB;AAAA,EACF,SAAS,OAAO;AACd,gBAAY,KAAK;AAAA,EACnB;AACF;","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }