@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.
- package/LICENSE +21 -0
- package/README.md +373 -0
- package/bin/saas.js +2 -0
- package/dist/chunk-26VE6QJ4.js +120 -0
- package/dist/chunk-26VE6QJ4.js.map +1 -0
- package/dist/chunk-3KD5CFV3.js +196 -0
- package/dist/chunk-3KD5CFV3.js.map +1 -0
- package/dist/chunk-5BCEXHNM.js +108 -0
- package/dist/chunk-5BCEXHNM.js.map +1 -0
- package/dist/chunk-N4OIAZSA.js +110 -0
- package/dist/chunk-N4OIAZSA.js.map +1 -0
- package/dist/chunk-ZD2ZSBK3.js +224 -0
- package/dist/chunk-ZD2ZSBK3.js.map +1 -0
- package/dist/dart-DXLFNGHR.js +41 -0
- package/dist/dart-DXLFNGHR.js.map +1 -0
- package/dist/drift-XYY4D366.js +59 -0
- package/dist/drift-XYY4D366.js.map +1 -0
- package/dist/flutter-J5BYPVIW.js +41 -0
- package/dist/flutter-J5BYPVIW.js.map +1 -0
- package/dist/freezed-QXFQ4GJC.js +58 -0
- package/dist/freezed-QXFQ4GJC.js.map +1 -0
- package/dist/gorouter-QBMTTFVR.js +56 -0
- package/dist/gorouter-QBMTTFVR.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1437 -0
- package/dist/index.js.map +1 -0
- package/dist/package-QO75XHBD.js +43 -0
- package/dist/package-QO75XHBD.js.map +1 -0
- package/dist/powersync-I3LR7TDN.js +37 -0
- package/dist/powersync-I3LR7TDN.js.map +1 -0
- package/dist/repository-BAOVD3NG.js +34 -0
- package/dist/repository-BAOVD3NG.js.map +1 -0
- package/dist/riverpod-XUU656PM.js +42 -0
- package/dist/riverpod-XUU656PM.js.map +1 -0
- package/dist/widget-YDKHPRXM.js +42 -0
- package/dist/widget-YDKHPRXM.js.map +1 -0
- package/package.json +89 -0
- package/templates/drift/dao.hbs +51 -0
- package/templates/drift/migration.hbs +15 -0
- package/templates/freezed/model.hbs +20 -0
- package/templates/gorouter/route.hbs +18 -0
- package/templates/powersync/rules.hbs +10 -0
- package/templates/powersync/schema.hbs +19 -0
- package/templates/repository/repository.hbs +62 -0
- package/templates/riverpod/async-notifier.hbs +44 -0
- package/templates/riverpod/family.hbs +9 -0
- package/templates/riverpod/future.hbs +9 -0
- package/templates/riverpod/notifier.hbs +34 -0
- package/templates/riverpod/stream.hbs +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/ask/index.ts","../src/services/perplexity.ts","../src/commands/cf/index.ts","../src/commands/docs/index.ts","../src/commands/flags/index.ts","../src/commands/gen/index.ts","../src/commands/init/index.ts","../src/commands/push/index.ts","../src/commands/redis/index.ts","../src/commands/supabase/index.ts","../src/services/supabase.ts","../src/commands/video/index.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { askCommand } from './commands/ask/index.js';\nimport { cfCommand } from './commands/cf/index.js';\n// Import commands (will be added as we implement them)\nimport { docsCommand } from './commands/docs/index.js';\nimport { flagsCommand } from './commands/flags/index.js';\nimport { genCommand } from './commands/gen/index.js';\nimport { initCommand } from './commands/init/index.js';\nimport { pushCommand } from './commands/push/index.js';\nimport { redisCommand } from './commands/redis/index.js';\nimport { supabaseCommand } from './commands/supabase/index.js';\nimport { videoCommand } from './commands/video/index.js';\nimport { handleError } from './utils/error.js';\n\nconst VERSION = '1.0.0';\n\n/**\n * Create and configure the CLI program\n */\nfunction createProgram(): Command {\n const program = new Command();\n\n program\n .name('saas')\n .description('A unified CLI for Flutter SaaS development')\n .version(VERSION, '-V, --version', 'Display version number')\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n })\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Enable verbose output')\n .option('--debug', 'Enable debug output')\n .hook('preAction', (thisCommand) => {\n // Store global options for access in commands\n const opts = thisCommand.opts();\n process.env.SAAS_CLI_JSON = opts.json ? '1' : '';\n process.env.SAAS_CLI_VERBOSE = opts.verbose ? '1' : '';\n process.env.SAAS_CLI_DEBUG = opts.debug ? '1' : '';\n });\n\n // Register domain commands\n program.addCommand(docsCommand);\n program.addCommand(askCommand);\n program.addCommand(genCommand);\n program.addCommand(supabaseCommand);\n program.addCommand(redisCommand);\n program.addCommand(cfCommand);\n program.addCommand(pushCommand);\n program.addCommand(flagsCommand);\n program.addCommand(videoCommand);\n program.addCommand(initCommand);\n\n // Add examples to help\n program.addHelpText(\n 'after',\n `\n${pc.cyan('Examples:')}\n ${pc.dim('# Look up Flutter documentation')}\n $ saas docs flutter \"ListView.builder with pagination\"\n\n ${pc.dim('# Ask AI a question')}\n $ saas ask \"best practices for offline-first Flutter apps\"\n\n ${pc.dim('# Generate a Riverpod notifier')}\n $ saas gen riverpod notifier UserList --state \"List<User>\"\n\n ${pc.dim('# Generate RLS policies')}\n $ saas supabase rls recipes --policy user-owned --column user_id\n\n ${pc.dim('# Check feature flag status')}\n $ saas flags list\n\n${pc.cyan('Documentation:')}\n https://github.com/your-username/saas-cli\n`,\n );\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function run(): Promise<void> {\n const program = createProgram();\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n handleError(error);\n }\n}\n\nexport { createProgram };\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { getPerplexityClient } from '../../services/perplexity.js';\nimport { MODEL_ALIASES, type PerplexityModel } from '../../types/index.js';\nimport { getAPIKey, loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\n\ninterface AskOptions {\n model?: string;\n recent?: 'day' | 'week' | 'month' | 'year';\n domains?: string;\n sources?: boolean;\n json?: boolean;\n}\n\nexport const askCommand = new Command('ask')\n .description('Ask AI-powered questions with web search (Perplexity)')\n .argument('<query>', 'Your question')\n .option('-m, --model <model>', 'Model: sonar, pro, reasoning, deep', 'sonar')\n .option('--recent <period>', 'Filter by recency: day, week, month, year')\n .option('--domains <domains>', 'Limit to domains (comma-separated)')\n .option('--sources', 'Include source URLs in output')\n .option('--json', 'Output as JSON')\n .action(async (query: string, options: AskOptions) => {\n const modelAlias = options.model ?? 'sonar';\n const model: PerplexityModel = MODEL_ALIASES[modelAlias] ?? 'sonar';\n const modelDisplay = modelAlias.toUpperCase();\n\n const spinner = ora(`Asking ${modelDisplay}...`).start();\n\n try {\n const config = await loadGlobalConfig();\n const apiKey = getAPIKey('perplexity', config);\n\n if (!apiKey) {\n spinner.fail('Perplexity API key not found');\n throw new AuthError(\n 'PERPLEXITY_API_KEY environment variable is not set',\n 'Get your API key from https://perplexity.ai/settings/api and set PERPLEXITY_API_KEY',\n );\n }\n\n const client = getPerplexityClient(apiKey);\n const result = await client.ask(query, {\n model,\n searchRecencyFilter: options.recent,\n searchDomainFilter: options.domains?.split(','),\n returnSources: options.sources,\n });\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify({ query, model: modelAlias, result }, null, 2));\n } else {\n console.log(pc.cyan(`\\n━━━ ${modelDisplay} ━━━\\n`));\n console.log(result);\n }\n } catch (error) {\n spinner.fail('Query failed');\n handleError(error);\n }\n });\n","import type { Got } from 'got';\nimport type { PerplexityAskOptions, PerplexityResponse } from '../types/index.js';\nimport { cachedFetch, cacheKey } from '../utils/cache.js';\nimport { createAuthenticatedClient } from './http.js';\n\nconst PERPLEXITY_BASE_URL = 'https://api.perplexity.ai';\n\n/**\n * Perplexity AI client for web-grounded questions\n */\nexport class PerplexityClient {\n private client: Got;\n\n constructor(apiKey: string) {\n this.client = createAuthenticatedClient(PERPLEXITY_BASE_URL, apiKey);\n }\n\n /**\n * Ask a question using Perplexity AI\n */\n async ask(query: string, options: PerplexityAskOptions = {}): Promise<string> {\n const model = options.model ?? 'sonar';\n\n const requestBody: Record<string, unknown> = {\n model,\n messages: [\n {\n role: 'system',\n content:\n 'You are a helpful assistant for software development questions. Be precise and include code examples when relevant. Focus on Flutter, Dart, and related technologies.',\n },\n {\n role: 'user',\n content: query,\n },\n ],\n max_tokens: options.maxTokens ?? 2048,\n temperature: options.temperature ?? 0.2,\n return_related_questions: false,\n };\n\n // Add optional filters\n if (options.searchRecencyFilter) {\n requestBody.search_recency_filter = options.searchRecencyFilter;\n }\n\n if (options.searchDomainFilter && options.searchDomainFilter.length > 0) {\n requestBody.search_domain_filter = options.searchDomainFilter;\n }\n\n const response = await this.client\n .post('chat/completions', {\n json: requestBody,\n })\n .json<PerplexityResponse>();\n\n return this.formatResponse(response, options.returnSources);\n }\n\n /**\n * Ask with caching enabled\n */\n async askCached(query: string, options: PerplexityAskOptions = {}): Promise<string> {\n const model = options.model ?? 'sonar';\n const key = cacheKey('perplexity', model, query);\n\n return cachedFetch(\n key,\n () => this.ask(query, options),\n 1800 * 1000, // 30 minute cache for AI responses\n );\n }\n\n /**\n * Format the API response\n */\n private formatResponse(response: PerplexityResponse, includeSources?: boolean): string {\n const choice = response.choices[0];\n if (!choice) {\n return 'No response received from AI.';\n }\n\n let output = choice.message.content;\n\n // Add citations if requested\n if (includeSources && response.citations && response.citations.length > 0) {\n output += '\\n\\n---\\nSources:\\n';\n response.citations.forEach((url, i) => {\n output += `[${i + 1}] ${url}\\n`;\n });\n }\n\n return output;\n }\n}\n\n// Singleton instance cache\nlet clientInstance: PerplexityClient | null = null;\nlet currentApiKey: string | null = null;\n\n/**\n * Get or create a Perplexity client instance\n */\nexport function getPerplexityClient(apiKey: string): PerplexityClient {\n if (!clientInstance || currentApiKey !== apiKey) {\n clientInstance = new PerplexityClient(apiKey);\n currentApiKey = apiKey;\n }\n return clientInstance;\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { AuthError, CLIError, handleError } from '../../utils/error.js';\n\nconst execAsync = promisify(exec);\n\nasync function checkWranglerCLI(): Promise<boolean> {\n try {\n await execAsync('wrangler --version');\n return true;\n } catch {\n return false;\n }\n}\n\nasync function runWranglerCommand(args: string[]): Promise<string> {\n const isInstalled = await checkWranglerCLI();\n if (!isInstalled) {\n throw new CLIError('Wrangler CLI not found', 1, 'Install with: pnpm add -g wrangler');\n }\n\n if (!process.env.CF_API_TOKEN && !process.env.CLOUDFLARE_API_TOKEN) {\n throw new AuthError(\n 'Cloudflare API token not found',\n 'Set CF_API_TOKEN or CLOUDFLARE_API_TOKEN environment variable',\n );\n }\n\n try {\n const { stdout, stderr } = await execAsync(`wrangler ${args.join(' ')}`);\n if (stderr && !stderr.includes('warning')) {\n console.error(stderr);\n }\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`Wrangler command failed: ${message}`);\n }\n}\n\nexport const cfCommand = new Command('cf')\n .description('Cloudflare Workers and KV management')\n .addCommand(\n new Command('worker')\n .description('Worker management')\n .argument('<action>', 'Action: new, deploy, logs, list')\n .argument('[name]', 'Worker name')\n .action(async (action, name) => {\n const spinner = ora(`Worker ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n if (!name) throw new CLIError('Worker name required for \"new\" action');\n args = ['init', name];\n break;\n case 'deploy':\n args = name ? ['deploy', '--name', name] : ['deploy'];\n break;\n case 'logs':\n args = name ? ['tail', name] : ['tail'];\n break;\n case 'list':\n args = ['deployments', 'list'];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, deploy, logs, list',\n );\n }\n\n const output = await runWranglerCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Worker ${action} failed`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('kv')\n .description('KV namespace operations')\n .argument('<action>', 'Action: namespaces, keys, get, put, del')\n .argument('[namespace]', 'KV namespace ID')\n .argument('[key]', 'Key name')\n .argument('[value]', 'Value (for put)')\n .action(async (action, namespace, key, value) => {\n const spinner = ora(`KV ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'namespaces':\n args = ['kv:namespace', 'list'];\n break;\n case 'keys':\n if (!namespace) throw new CLIError('Namespace ID required');\n args = ['kv:key', 'list', '--namespace-id', namespace];\n break;\n case 'get':\n if (!namespace || !key) throw new CLIError('Namespace and key required');\n args = ['kv:key', 'get', key, '--namespace-id', namespace];\n break;\n case 'put':\n if (!namespace || !key || !value)\n throw new CLIError('Namespace, key, and value required');\n args = ['kv:key', 'put', key, value, '--namespace-id', namespace];\n break;\n case 'del':\n if (!namespace || !key) throw new CLIError('Namespace and key required');\n args = ['kv:key', 'delete', key, '--namespace-id', namespace];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: namespaces, keys, get, put, del',\n );\n }\n\n const output = await runWranglerCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`KV ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { Command } from 'commander';\n\nexport const docsCommand = new Command('docs')\n .description('Look up documentation via Context7')\n .addCommand(\n new Command('flutter')\n .description('Search Flutter documentation')\n .argument('<query>', 'Search query')\n .action(async (query) => {\n const { flutterAction } = await import('./flutter.js');\n await flutterAction(query);\n }),\n )\n .addCommand(\n new Command('dart')\n .description('Search Dart documentation')\n .argument('<query>', 'Search query')\n .action(async (query) => {\n const { dartAction } = await import('./dart.js');\n await dartAction(query);\n }),\n )\n .addCommand(\n new Command('package')\n .description('Search package documentation')\n .argument('<package>', 'Package name')\n .argument('[query]', 'Search query')\n .action(async (pkg, query) => {\n const { packageAction } = await import('./package.js');\n await packageAction(pkg, query);\n }),\n )\n .addCommand(\n new Command('widget')\n .description('Look up widget documentation')\n .argument('<name>', 'Widget name')\n .option('--properties', 'Show all properties')\n .action(async (name, options) => {\n const { widgetAction } = await import('./widget.js');\n await widgetAction(name, options);\n }),\n );\n","import { Command } from 'commander';\nimport got from 'got';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatTable } from '../../utils/output.js';\n\nconst POSTHOG_API = 'https://app.posthog.com/api';\n\nasync function getPostHogConfig() {\n const projectId = process.env.POSTHOG_PROJECT_ID;\n const apiKey = process.env.POSTHOG_API_KEY;\n\n if (!projectId || !apiKey) {\n const config = await loadGlobalConfig();\n return {\n projectId: projectId || config.posthog?.projectId,\n apiKey: apiKey || config.posthog?.apiKey,\n };\n }\n\n return { projectId, apiKey };\n}\n\ninterface FeatureFlag {\n id: number;\n key: string;\n name: string;\n active: boolean;\n rollout_percentage?: number;\n}\n\nexport const flagsCommand = new Command('flags')\n .description('PostHog feature flag management')\n .addCommand(\n new Command('list').description('List all feature flags').action(async () => {\n const spinner = ora('Fetching feature flags...').start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n const response = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n })\n .json<{ results: FeatureFlag[] }>();\n\n spinner.stop();\n\n const rows = response.results.map((flag) => [\n flag.key,\n flag.active ? pc.green('enabled') : pc.red('disabled'),\n flag.rollout_percentage !== undefined ? `${flag.rollout_percentage}%` : '100%',\n ]);\n\n console.log(formatTable(['Flag', 'Status', 'Rollout'], rows));\n } catch (error) {\n spinner.fail('Failed to fetch feature flags');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('get')\n .description('Get feature flag details')\n .argument('<flag>', 'Flag key')\n .action(async (flag) => {\n const spinner = ora(`Fetching flag: ${flag}...`).start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n const response = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n searchParams: { key: flag },\n })\n .json<{ results: FeatureFlag[] }>();\n\n spinner.stop();\n\n const flagData = response.results.find((f) => f.key === flag);\n if (!flagData) {\n console.log(pc.yellow(`Flag \"${flag}\" not found`));\n return;\n }\n\n console.log(pc.cyan(`Flag: ${flagData.key}`));\n console.log(` Name: ${flagData.name || 'N/A'}`);\n console.log(` Status: ${flagData.active ? pc.green('enabled') : pc.red('disabled')}`);\n console.log(` Rollout: ${flagData.rollout_percentage ?? 100}%`);\n } catch (error) {\n spinner.fail('Failed to fetch flag');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('set')\n .description('Enable or disable a feature flag')\n .argument('<flag>', 'Flag key')\n .argument('<value>', 'true/false or percentage (0-100)')\n .action(async (flag, value) => {\n const spinner = ora(`Updating flag: ${flag}...`).start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n // First, find the flag ID\n const listResponse = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n })\n .json<{ results: FeatureFlag[] }>();\n\n const flagData = listResponse.results.find((f) => f.key === flag);\n if (!flagData) {\n spinner.fail(`Flag \"${flag}\" not found`);\n return;\n }\n\n // Determine if it's a boolean or percentage\n const isPercentage = /^\\d+$/.test(value) && Number.parseInt(value, 10) <= 100;\n const isBoolean = value === 'true' || value === 'false';\n\n const updateData: Record<string, unknown> = {};\n if (isPercentage) {\n updateData.rollout_percentage = Number.parseInt(value, 10);\n } else if (isBoolean) {\n updateData.active = value === 'true';\n } else {\n spinner.fail('Value must be true, false, or a percentage (0-100)');\n return;\n }\n\n await got.patch(`${POSTHOG_API}/projects/${projectId}/feature_flags/${flagData.id}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: updateData,\n });\n\n spinner.succeed('Feature flag updated');\n console.log(pc.green(`${flag} = ${value}`));\n } catch (error) {\n spinner.fail('Failed to update flag');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('add-user')\n .description('Add user to flag override')\n .argument('<flag>', 'Flag key')\n .argument('<userId>', 'User ID')\n .action(async (flag, userId) => {\n console.log(pc.yellow('Note: User-level overrides require PostHog Enterprise'));\n console.log(pc.dim(`Would add user ${userId} to flag ${flag}`));\n }),\n )\n .addCommand(\n new Command('remove-user')\n .description('Remove user from flag override')\n .argument('<flag>', 'Flag key')\n .argument('<userId>', 'User ID')\n .action(async (flag, userId) => {\n console.log(pc.yellow('Note: User-level overrides require PostHog Enterprise'));\n console.log(pc.dim(`Would remove user ${userId} from flag ${flag}`));\n }),\n );\n","import { Command } from 'commander';\n\nexport const genCommand = new Command('gen')\n .description('Generate boilerplate code for Flutter/Dart patterns')\n .addCommand(\n new Command('riverpod')\n .description('Generate Riverpod providers')\n .argument('<pattern>', 'Pattern: notifier, async-notifier, future, stream, family')\n .argument('<name>', 'Provider name')\n .option('-s, --state <type>', 'State type (e.g., \"List<User>\")')\n .option('-o, --output <path>', 'Output file path')\n .action(async (pattern, name, options) => {\n const { riverpodAction } = await import('./riverpod.js');\n await riverpodAction(pattern, name, options);\n }),\n )\n .addCommand(\n new Command('drift')\n .description('Generate Drift database code')\n .argument('<type>', 'Type: table, dao, migration')\n .argument('<name>', 'Table or DAO name')\n .option('-c, --columns <spec>', 'Column specification (for table)')\n .option('-o, --output <path>', 'Output file path')\n .action(async (type, name, options) => {\n const { driftAction } = await import('./drift.js');\n await driftAction(type, name, options);\n }),\n )\n .addCommand(\n new Command('gorouter')\n .description('Generate GoRouter routes')\n .argument('<name>', 'Route name')\n .option('-p, --path <path>', 'Route path (e.g., /recipe/:id)')\n .option('--params <params>', 'Path parameters (e.g., id:string)')\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { gorouterAction } = await import('./gorouter.js');\n await gorouterAction(name, options);\n }),\n )\n .addCommand(\n new Command('powersync')\n .description('Generate PowerSync sync rules')\n .argument('<type>', 'Type: rules, schema')\n .argument('<table>', 'Table name')\n .option('-u, --user-column <column>', 'User ID column for sync rules')\n .option('-o, --output <path>', 'Output file path')\n .action(async (type, table, options) => {\n const { powersyncAction } = await import('./powersync.js');\n await powersyncAction(type, table, options);\n }),\n )\n .addCommand(\n new Command('freezed')\n .description('Generate Freezed models')\n .argument('<name>', 'Model name')\n .option(\n '-f, --fields <spec>',\n 'Field specification (e.g., id:String,name:String,email:String?)',\n )\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { freezedAction } = await import('./freezed.js');\n await freezedAction(name, options);\n }),\n )\n .addCommand(\n new Command('repository')\n .description('Generate repository pattern')\n .argument('<name>', 'Repository name')\n .option('-e, --entity <name>', 'Entity name')\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { repositoryAction } = await import('./repository.js');\n await repositoryAction(name, options);\n }),\n );\n","import { existsSync } from 'node:fs';\nimport { writeFile } from 'node:fs/promises';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { CLIError, handleError } from '../../utils/error.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize projects and add features')\n .addCommand(\n new Command('flutter')\n .description('Initialize a new Flutter project with SaaS stack')\n .argument('<name>', 'Project name')\n .action(async (name) => {\n const spinner = ora('Creating Flutter project...').start();\n try {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n // Create Flutter project\n await execAsync(`flutter create ${name}`);\n spinner.text = 'Adding dependencies...';\n\n // Add dependencies\n const deps = [\n 'flutter_riverpod',\n 'riverpod_annotation',\n 'go_router',\n 'freezed_annotation',\n 'json_annotation',\n 'supabase_flutter',\n ];\n\n const devDeps = ['riverpod_generator', 'build_runner', 'freezed', 'json_serializable'];\n\n process.chdir(name);\n await execAsync(`flutter pub add ${deps.join(' ')}`);\n await execAsync(`flutter pub add --dev ${devDeps.join(' ')}`);\n\n spinner.succeed('Flutter project created');\n console.log(pc.green(`\\nProject \"${name}\" created with:`));\n console.log(' - Riverpod (state management)');\n console.log(' - GoRouter (navigation)');\n console.log(' - Freezed (immutable models)');\n console.log(' - Supabase (backend)');\n console.log(`\\nNext steps:`);\n console.log(` cd ${name}`);\n console.log(` flutter run`);\n } catch (error) {\n spinner.fail('Failed to create Flutter project');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('supabase')\n .description('Initialize Supabase in current project')\n .action(async () => {\n const spinner = ora('Initializing Supabase...').start();\n try {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n await execAsync('supabase init');\n\n spinner.succeed('Supabase initialized');\n console.log(pc.green('\\nSupabase project created'));\n console.log('Next steps:');\n console.log(' supabase start');\n console.log(' supabase db push');\n } catch (error) {\n spinner.fail('Failed to initialize Supabase');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('worker')\n .description('Initialize a new Cloudflare Worker')\n .argument('<name>', 'Worker name')\n .action(async (name) => {\n const spinner = ora('Creating Cloudflare Worker...').start();\n try {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n await execAsync(`wrangler init ${name}`);\n\n spinner.succeed('Cloudflare Worker created');\n console.log(pc.green(`\\nWorker \"${name}\" created`));\n console.log('Next steps:');\n console.log(` cd ${name}`);\n console.log(' wrangler dev');\n } catch (error) {\n spinner.fail('Failed to create Worker');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('add')\n .description('Add a feature to existing Flutter project')\n .argument('<feature>', 'Feature: riverpod, drift, powersync, auth')\n .action(async (feature) => {\n const spinner = ora(`Adding ${feature}...`).start();\n try {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n let deps: string[] = [];\n let devDeps: string[] = [];\n\n switch (feature) {\n case 'riverpod':\n deps = ['flutter_riverpod', 'riverpod_annotation'];\n devDeps = ['riverpod_generator', 'build_runner'];\n break;\n case 'drift':\n deps = ['drift', 'sqlite3_flutter_libs', 'path_provider', 'path'];\n devDeps = ['drift_dev', 'build_runner'];\n break;\n case 'powersync':\n deps = ['powersync'];\n break;\n case 'auth':\n deps = ['supabase_flutter'];\n break;\n default:\n throw new CLIError(\n `Unknown feature: \"${feature}\"`,\n 1,\n 'Valid features: riverpod, drift, powersync, auth',\n );\n }\n\n if (deps.length > 0) {\n await execAsync(`flutter pub add ${deps.join(' ')}`);\n }\n if (devDeps.length > 0) {\n await execAsync(`flutter pub add --dev ${devDeps.join(' ')}`);\n }\n\n spinner.succeed(`${feature} added`);\n console.log(pc.green(`\\n${feature} dependencies installed`));\n\n if (feature === 'riverpod' || feature === 'drift') {\n console.log('Run code generation:');\n console.log(' dart run build_runner build');\n }\n } catch (error) {\n spinner.fail(`Failed to add ${feature}`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('config').description('Create saas.yaml config file').action(async () => {\n const configPath = 'saas.yaml';\n\n if (existsSync(configPath)) {\n console.log(pc.yellow('saas.yaml already exists'));\n return;\n }\n\n const config = `# SaaS CLI Configuration\nproject:\n name: my-saas-app\n type: flutter\n\nflutter:\n path: .\n\nsupabase:\n path: supabase\n types_output: lib/generated/supabase_types.dart\n\ntemplates:\n riverpod:\n path: lib/features/{feature}/presentation/providers\n drift:\n path: lib/features/{feature}/data/datasources/local\n freezed:\n path: lib/features/{feature}/domain/entities\n`;\n\n await writeFile(configPath, config);\n console.log(pc.green('✓ Created saas.yaml'));\n }),\n );\n","import { Command } from 'commander';\nimport got from 'got';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\n\nconst ONESIGNAL_API = 'https://onesignal.com/api/v1';\n\nasync function getOneSignalConfig() {\n const appId = process.env.ONESIGNAL_APP_ID;\n const apiKey = process.env.ONESIGNAL_API_KEY;\n\n if (!appId || !apiKey) {\n const config = await loadGlobalConfig();\n return {\n appId: appId || config.onesignal?.appId,\n apiKey: apiKey || config.onesignal?.apiKey,\n };\n }\n\n return { appId, apiKey };\n}\n\nasync function sendNotification(\n target: { userId?: string; segment?: string },\n message: string,\n data?: Record<string, unknown>,\n scheduleAt?: string,\n) {\n const { appId, apiKey } = await getOneSignalConfig();\n\n if (!appId || !apiKey) {\n throw new AuthError(\n 'OneSignal credentials not found',\n 'Set ONESIGNAL_APP_ID and ONESIGNAL_API_KEY environment variables',\n );\n }\n\n const payload: Record<string, unknown> = {\n app_id: appId,\n contents: { en: message },\n };\n\n if (target.userId) {\n payload.include_external_user_ids = [target.userId];\n } else if (target.segment) {\n payload.included_segments = [target.segment];\n }\n\n if (data) {\n payload.data = data;\n }\n\n if (scheduleAt) {\n payload.send_after = scheduleAt;\n }\n\n const response = await got\n .post(`${ONESIGNAL_API}/notifications`, {\n headers: {\n Authorization: `Basic ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: payload,\n })\n .json<{ id: string; recipients: number }>();\n\n return response;\n}\n\nexport const pushCommand = new Command('push')\n .description('OneSignal push notification management')\n .addCommand(\n new Command('send')\n .description('Send a push notification')\n .argument('<target>', 'User ID or segment name')\n .argument('<message>', 'Notification message')\n .option('-s, --segment', 'Target is a segment name')\n .option('-d, --data <json>', 'Additional data (JSON)')\n .action(async (target, message, options) => {\n const spinner = ora('Sending notification...').start();\n try {\n const data = options.data ? JSON.parse(options.data) : undefined;\n const targetObj = options.segment ? { segment: target } : { userId: target };\n\n const result = await sendNotification(targetObj, message, data);\n\n spinner.succeed('Notification sent');\n console.log(pc.green(`ID: ${result.id}`));\n console.log(pc.dim(`Recipients: ${result.recipients}`));\n } catch (error) {\n spinner.fail('Failed to send notification');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('schedule')\n .description('Schedule a push notification')\n .argument('<target>', 'User ID')\n .argument('<message>', 'Notification message')\n .option(\n '--at <datetime>',\n 'Send time (ISO 8601 format)',\n new Date(Date.now() + 3600000).toISOString(),\n )\n .option('-d, --data <json>', 'Additional data (JSON)')\n .action(async (target, message, options) => {\n const spinner = ora('Scheduling notification...').start();\n try {\n const data = options.data ? JSON.parse(options.data) : undefined;\n\n const result = await sendNotification({ userId: target }, message, data, options.at);\n\n spinner.succeed('Notification scheduled');\n console.log(pc.green(`ID: ${result.id}`));\n console.log(pc.dim(`Scheduled for: ${options.at}`));\n } catch (error) {\n spinner.fail('Failed to schedule notification');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('template')\n .description('Template operations')\n .argument('<action>', 'Action: list, send')\n .argument('[templateId]', 'Template ID (for send)')\n .option('--to <userId>', 'Target user ID (for send)')\n .action(async (action, templateId, options) => {\n const spinner = ora(`Template ${action}...`).start();\n try {\n const { appId, apiKey } = await getOneSignalConfig();\n\n if (!appId || !apiKey) {\n throw new AuthError(\n 'OneSignal credentials not found',\n 'Set ONESIGNAL_APP_ID and ONESIGNAL_API_KEY environment variables',\n );\n }\n\n if (action === 'list') {\n const response = await got\n .get(`${ONESIGNAL_API}/templates?app_id=${appId}`, {\n headers: { Authorization: `Basic ${apiKey}` },\n })\n .json<{ templates: Array<{ id: string; name: string }> }>();\n\n spinner.stop();\n console.log(pc.cyan('Templates:'));\n for (const template of response.templates) {\n console.log(` ${pc.green(template.id)} - ${template.name}`);\n }\n } else if (action === 'send') {\n if (!templateId || !options.to) {\n throw new Error('Template ID and target user required');\n }\n\n const response = await got\n .post(`${ONESIGNAL_API}/notifications`, {\n headers: {\n Authorization: `Basic ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: {\n app_id: appId,\n template_id: templateId,\n include_external_user_ids: [options.to],\n },\n })\n .json<{ id: string }>();\n\n spinner.succeed('Template notification sent');\n console.log(pc.green(`ID: ${response.id}`));\n }\n } catch (error) {\n spinner.fail(`Template ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatTable } from '../../utils/output.js';\n\n// Note: In production, you'd use ioredis. This is a simplified implementation.\nasync function getRedisUrl(): Promise<string> {\n const url = process.env.REDIS_URL;\n if (!url) {\n const config = await loadGlobalConfig();\n if (config.redis?.url) {\n return config.redis.url;\n }\n throw new AuthError(\n 'REDIS_URL environment variable is not set',\n 'Set REDIS_URL to your Redis/DragonflyDB connection string',\n );\n }\n return url;\n}\n\nexport const redisCommand = new Command('redis')\n .description('Redis/DragonflyDB cache and queue management')\n .addCommand(\n new Command('ping').description('Test Redis connection').action(async () => {\n const spinner = ora('Pinging Redis...').start();\n try {\n const url = await getRedisUrl();\n // In production, use ioredis here\n spinner.succeed(`Connected to Redis at ${url.replace(/:[^:]+@/, ':****@')}`);\n console.log(pc.green('PONG'));\n } catch (error) {\n spinner.fail('Failed to connect to Redis');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('info').description('Get Redis server info').action(async () => {\n const spinner = ora('Fetching Redis info...').start();\n try {\n await getRedisUrl();\n spinner.stop();\n console.log(pc.yellow('Note: Full Redis info requires ioredis integration'));\n console.log('Install ioredis for full functionality: pnpm add ioredis');\n } catch (error) {\n spinner.fail('Failed to get Redis info');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('keys')\n .description('List keys matching pattern')\n .argument('<pattern>', 'Key pattern (e.g., user:*)')\n .action(async (pattern) => {\n const spinner = ora(`Searching keys: ${pattern}...`).start();\n try {\n await getRedisUrl();\n spinner.stop();\n console.log(pc.yellow('Note: Key listing requires ioredis integration'));\n } catch (error) {\n spinner.fail('Failed to list keys');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('get')\n .description('Get value by key')\n .argument('<key>', 'Key name')\n .action(async (_key) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Get operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('set')\n .description('Set a key-value pair')\n .argument('<key>', 'Key name')\n .argument('<value>', 'Value')\n .option('--ttl <seconds>', 'Time to live in seconds')\n .action(async (_key, _value, _options) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Set operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('del')\n .description('Delete a key')\n .argument('<key>', 'Key name')\n .action(async (_key) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Delete operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('queue')\n .description('BullMQ queue operations')\n .argument('<name>', 'Queue name')\n .argument(\n '[action]',\n 'Action: status, waiting, active, failed, delayed, pause, resume, clean',\n )\n .option('--status <status>', 'Job status for clean action')\n .option('--age <hours>', 'Job age in hours for clean action')\n .action(async (name, action = 'status', _options) => {\n const spinner = ora(`Queue ${name}: ${action}...`).start();\n try {\n await getRedisUrl();\n spinner.stop();\n\n // Placeholder output\n if (action === 'status') {\n console.log(pc.cyan(`Queue: ${name}`));\n console.log(\n formatTable(\n ['Status', 'Count'],\n [\n ['waiting', '0'],\n ['active', '0'],\n ['completed', '0'],\n ['failed', '0'],\n ['delayed', '0'],\n ],\n ),\n );\n }\n console.log(pc.yellow('\\nNote: Full BullMQ integration requires bullmq package'));\n } catch (error) {\n spinner.fail(`Queue operation failed`);\n handleError(error);\n }\n }),\n );\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { RLS_POLICIES, type RLSPolicyType, runSupabaseCommand } from '../../services/supabase.js';\nimport { columnsToSQL, parseColumnSpec } from '../../utils/column-parser.js';\nimport { CLIError, handleError } from '../../utils/error.js';\n\nexport const supabaseCommand = new Command('supabase')\n .description('Supabase database management')\n .addCommand(\n new Command('schema')\n .description('Show database schema')\n .argument('[table]', 'Specific table name')\n .option('--rls', 'Include RLS policies')\n .option('--relationships', 'Show foreign key relationships')\n .action(async (_table, _options) => {\n const spinner = ora('Fetching schema...').start();\n try {\n const output = await runSupabaseCommand(['db', 'dump', '--schema', 'public', '-f', '-']);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail('Failed to fetch schema');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('create-table')\n .description('Generate CREATE TABLE SQL')\n .argument('<name>', 'Table name')\n .option('-c, --columns <spec>', 'Column specification')\n .option('--from-freezed <file>', 'Generate from Freezed model file')\n .action(async (name, options) => {\n try {\n if (!options.columns) {\n throw new CLIError(\n 'Columns specification required',\n 1,\n 'Use --columns \"id:uuid:pk,title:text,user_id:uuid:fk(auth.users)\"',\n );\n }\n\n const columns = parseColumnSpec(options.columns);\n const sql = columnsToSQL(name, columns);\n\n console.log(pc.cyan('-- Migration: create_' + name + '_table'));\n console.log(sql);\n console.log('\\n-- Enable RLS');\n console.log(`ALTER TABLE ${name} ENABLE ROW LEVEL SECURITY;`);\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('rls')\n .description('Generate RLS policies')\n .argument('<table>', 'Table name')\n .option(\n '-p, --policy <type>',\n 'Policy type: user-owned, team-owned, public-read, admin-only',\n 'user-owned',\n )\n .option('-c, --column <name>', 'User/team ID column', 'user_id')\n .action(async (table, options) => {\n try {\n const policyType = options.policy as RLSPolicyType;\n if (!RLS_POLICIES[policyType]) {\n throw new CLIError(\n `Invalid policy type: \"${policyType}\"`,\n 1,\n 'Valid types: user-owned, team-owned, public-read, admin-only',\n );\n }\n\n const sql = RLS_POLICIES[policyType](table, options.column);\n console.log(sql);\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('migration')\n .description('Migration management')\n .argument('<action>', 'Action: new, apply, status')\n .argument('[name]', 'Migration name (for new)')\n .action(async (action, name) => {\n const spinner = ora(`Running migration ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n if (!name) {\n throw new CLIError('Migration name required for \"new\" action');\n }\n args = ['migration', 'new', name];\n break;\n case 'apply':\n args = ['db', 'push'];\n break;\n case 'status':\n args = ['migration', 'list'];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, apply, status',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Migration ${action} failed`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('types')\n .description('Generate TypeScript/Dart types')\n .argument('<lang>', 'Language: dart, typescript')\n .option('-o, --output <path>', 'Output file path')\n .action(async (lang, options) => {\n const spinner = ora(`Generating ${lang} types...`).start();\n try {\n let args: string[];\n switch (lang) {\n case 'dart':\n case 'typescript':\n args = ['gen', 'types', lang, '--local'];\n break;\n default:\n throw new CLIError(\n `Invalid language: \"${lang}\"`,\n 1,\n 'Valid languages: dart, typescript',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n\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 spinner.fail('Type generation failed');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('fn')\n .description('Edge function management')\n .argument('<action>', 'Action: new, deploy, logs')\n .argument('<name>', 'Function name')\n .action(async (action, name) => {\n const spinner = ora(`Running fn ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n args = ['functions', 'new', name];\n break;\n case 'deploy':\n args = ['functions', 'deploy', name];\n break;\n case 'logs':\n args = ['functions', 'logs', name];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, deploy, logs',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Function ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { CLIError } from '../utils/error.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Check if Supabase CLI is installed\n */\nexport async function checkSupabaseCLI(): Promise<boolean> {\n try {\n await execAsync('supabase --version');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Run a Supabase CLI command\n */\nexport async function runSupabaseCommand(args: string[]): Promise<string> {\n const isInstalled = await checkSupabaseCLI();\n if (!isInstalled) {\n throw new CLIError(\n 'Supabase CLI not found',\n 1,\n 'Install with: brew install supabase/tap/supabase',\n );\n }\n\n try {\n const { stdout, stderr } = await execAsync(`supabase ${args.join(' ')}`);\n if (stderr && !stderr.includes('warning')) {\n console.error(stderr);\n }\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`Supabase command failed: ${message}`);\n }\n}\n\n/**\n * Get database schema\n */\nexport async function getSchema(tableName?: string): Promise<string> {\n const args = ['db', 'dump', '--schema', 'public'];\n if (tableName) {\n args.push('--data-only', '--table', tableName);\n }\n return runSupabaseCommand(args);\n}\n\n/**\n * Generate TypeScript types\n */\nexport async function generateTypes(outputPath?: string): Promise<string> {\n const args = ['gen', 'types', 'typescript', '--local'];\n const output = await runSupabaseCommand(args);\n\n if (outputPath) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(outputPath, output);\n }\n\n return output;\n}\n\n/**\n * RLS policy templates\n */\nexport const RLS_POLICIES = {\n 'user-owned': (table: string, column: string) => `\n-- RLS Policies for ${table} (user-owned)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Users can view their own records\nCREATE POLICY \"Users can view own ${table}\"\n ON ${table} FOR SELECT\n USING (auth.uid() = ${column});\n\n-- Users can create their own records\nCREATE POLICY \"Users can create own ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (auth.uid() = ${column});\n\n-- Users can update their own records\nCREATE POLICY \"Users can update own ${table}\"\n ON ${table} FOR UPDATE\n USING (auth.uid() = ${column});\n\n-- Users can delete their own records\nCREATE POLICY \"Users can delete own ${table}\"\n ON ${table} FOR DELETE\n USING (auth.uid() = ${column});\n`,\n\n 'team-owned': (table: string, teamColumn: string) => `\n-- RLS Policies for ${table} (team-owned)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Team members can view team records\nCREATE POLICY \"Team members can view ${table}\"\n ON ${table} FOR SELECT\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team members can create team records\nCREATE POLICY \"Team members can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team members can update team records\nCREATE POLICY \"Team members can update ${table}\"\n ON ${table} FOR UPDATE\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team admins can delete team records\nCREATE POLICY \"Team admins can delete ${table}\"\n ON ${table} FOR DELETE\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid() AND role = 'admin'\n )\n );\n`,\n\n 'public-read': (table: string) => `\n-- RLS Policies for ${table} (public-read)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Anyone can view records\nCREATE POLICY \"Anyone can view ${table}\"\n ON ${table} FOR SELECT\n USING (true);\n\n-- Only authenticated users can create records\nCREATE POLICY \"Authenticated users can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (auth.role() = 'authenticated');\n\n-- Only owners can update their records\nCREATE POLICY \"Owners can update ${table}\"\n ON ${table} FOR UPDATE\n USING (auth.uid() = user_id);\n\n-- Only owners can delete their records\nCREATE POLICY \"Owners can delete ${table}\"\n ON ${table} FOR DELETE\n USING (auth.uid() = user_id);\n`,\n\n 'admin-only': (table: string) => `\n-- RLS Policies for ${table} (admin-only)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Only admins can view records\nCREATE POLICY \"Admins can view ${table}\"\n ON ${table} FOR SELECT\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can create records\nCREATE POLICY \"Admins can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can update records\nCREATE POLICY \"Admins can update ${table}\"\n ON ${table} FOR UPDATE\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can delete records\nCREATE POLICY \"Admins can delete ${table}\"\n ON ${table} FOR DELETE\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n`,\n};\n\nexport type RLSPolicyType = keyof typeof RLS_POLICIES;\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { CLIError, handleError } from '../../utils/error.js';\n\nconst execAsync = promisify(exec);\n\nasync function checkFFmpeg(): Promise<boolean> {\n try {\n await execAsync('ffmpeg -version');\n return true;\n } catch {\n return false;\n }\n}\n\nasync function runFFmpeg(args: string[]): Promise<string> {\n const isInstalled = await checkFFmpeg();\n if (!isInstalled) {\n throw new CLIError(\n 'FFmpeg not found',\n 1,\n 'Install FFmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)',\n );\n }\n\n try {\n const { stdout, stderr } = await execAsync(`ffmpeg ${args.join(' ')}`);\n return stdout || stderr;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`FFmpeg command failed: ${message}`);\n }\n}\n\nasync function runFFprobe(args: string[]): Promise<string> {\n const isInstalled = await checkFFmpeg();\n if (!isInstalled) {\n throw new CLIError(\n 'FFmpeg/FFprobe not found',\n 1,\n 'Install FFmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)',\n );\n }\n\n try {\n const { stdout } = await execAsync(`ffprobe ${args.join(' ')}`);\n return stdout;\n } catch (error) {\n const err = error as { stderr?: string };\n return err.stderr || '';\n }\n}\n\nexport const videoCommand = new Command('video')\n .description('Video processing with FFmpeg')\n .addCommand(\n new Command('info')\n .description('Get video file information')\n .argument('<file>', 'Video file path')\n .action(async (file) => {\n const spinner = ora('Analyzing video...').start();\n try {\n const output = await runFFprobe([\n '-v',\n 'quiet',\n '-print_format',\n 'json',\n '-show_format',\n '-show_streams',\n `\"${file}\"`,\n ]);\n\n spinner.stop();\n\n try {\n const info = JSON.parse(output);\n const format = info.format || {};\n const videoStream =\n info.streams?.find((s: { codec_type: string }) => s.codec_type === 'video') || {};\n const audioStream =\n info.streams?.find((s: { codec_type: string }) => s.codec_type === 'audio') || {};\n\n console.log(pc.cyan('Video Information:'));\n console.log(` File: ${format.filename || file}`);\n console.log(\n ` Duration: ${format.duration ? Number.parseFloat(format.duration).toFixed(2) + 's' : 'N/A'}`,\n );\n console.log(\n ` Size: ${format.size ? (Number.parseInt(format.size, 10) / 1024 / 1024).toFixed(2) + ' MB' : 'N/A'}`,\n );\n console.log(\n ` Bitrate: ${format.bit_rate ? (Number.parseInt(format.bit_rate, 10) / 1000).toFixed(0) + ' kbps' : 'N/A'}`,\n );\n\n if (videoStream.width) {\n console.log(pc.cyan('\\nVideo Stream:'));\n console.log(` Resolution: ${videoStream.width}x${videoStream.height}`);\n console.log(` Codec: ${videoStream.codec_name || 'N/A'}`);\n console.log(` FPS: ${videoStream.r_frame_rate || 'N/A'}`);\n }\n\n if (audioStream.codec_name) {\n console.log(pc.cyan('\\nAudio Stream:'));\n console.log(` Codec: ${audioStream.codec_name}`);\n console.log(` Sample Rate: ${audioStream.sample_rate || 'N/A'} Hz`);\n console.log(` Channels: ${audioStream.channels || 'N/A'}`);\n }\n } catch {\n console.log(output);\n }\n } catch (error) {\n spinner.fail('Failed to analyze video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('combine')\n .description('Combine video and audio')\n .argument('<video>', 'Video file path')\n .argument('<audio>', 'Audio file path')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, audio, options) => {\n const spinner = ora('Combining video and audio...').start();\n try {\n await runFFmpeg([\n '-i',\n `\"${video}\"`,\n '-i',\n `\"${audio}\"`,\n '-c:v',\n 'copy',\n '-c:a',\n 'aac',\n '-y',\n `\"${options.output}\"`,\n ]);\n\n spinner.succeed(`Combined: ${options.output}`);\n } catch (error) {\n spinner.fail('Failed to combine video and audio');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('thumbnail')\n .description('Extract thumbnail from video')\n .argument('<video>', 'Video file path')\n .option('--at <timestamp>', 'Timestamp (e.g., 00:00:05)', '00:00:01')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n const spinner = ora('Extracting thumbnail...').start();\n try {\n await runFFmpeg([\n '-i',\n `\"${video}\"`,\n '-ss',\n options.at,\n '-vframes',\n '1',\n '-y',\n `\"${options.output}\"`,\n ]);\n\n spinner.succeed(`Thumbnail: ${options.output}`);\n } catch (error) {\n spinner.fail('Failed to extract thumbnail');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('resize')\n .description('Resize video')\n .argument('<video>', 'Video file path')\n .requiredOption('-s, --size <WxH>', 'New size (e.g., 1280x720)')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n const spinner = ora('Resizing video...').start();\n try {\n await runFFmpeg([\n '-i',\n `\"${video}\"`,\n '-vf',\n `scale=${options.size}`,\n '-y',\n `\"${options.output}\"`,\n ]);\n\n spinner.succeed(`Resized: ${options.output}`);\n } catch (error) {\n spinner.fail('Failed to resize video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('compress')\n .description('Compress video')\n .argument('<video>', 'Video file path')\n .option('-q, --quality <crf>', 'Quality (1-51, lower is better)', '23')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n const spinner = ora('Compressing video...').start();\n try {\n await runFFmpeg([\n '-i',\n `\"${video}\"`,\n '-c:v',\n 'libx264',\n '-crf',\n options.quality,\n '-preset',\n 'medium',\n '-y',\n `\"${options.output}\"`,\n ]);\n\n spinner.succeed(`Compressed: ${options.output}`);\n } catch (error) {\n spinner.fail('Failed to compress video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('trim')\n .description('Trim video')\n .argument('<video>', 'Video file path')\n .requiredOption('--start <time>', 'Start time (e.g., 00:00:10)')\n .requiredOption('--end <time>', 'End time (e.g., 00:01:00)')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n const spinner = ora('Trimming video...').start();\n try {\n await runFFmpeg([\n '-i',\n `\"${video}\"`,\n '-ss',\n options.start,\n '-to',\n options.end,\n '-c',\n 'copy',\n '-y',\n `\"${options.output}\"`,\n ]);\n\n spinner.succeed(`Trimmed: ${options.output}`);\n } catch (error) {\n spinner.fail('Failed to trim video');\n handleError(error);\n }\n }),\n );\n","import { run } from './cli.js';\n\nrun();\n"],"mappings":"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","names":["Command","pc","Command","ora","Command","ora","Command","Command","ora","pc","Command","ora","pc","Command","Command","ora","pc","Command","ora","exec","promisify","execAsync","pc","Command","got","ora","pc","got","Command","ora","pc","Command","ora","pc","Command","ora","pc","Command","ora","pc","exec","promisify","execAsync","promisify","exec","Command","ora","pc","writeFile","exec","promisify","Command","ora","pc","execAsync","promisify","exec","Command","ora","pc","Command","pc"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
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/package.ts
|
|
15
|
+
import ora from "ora";
|
|
16
|
+
async function packageAction(pkg, query) {
|
|
17
|
+
const searchQuery = query || `${pkg} usage examples`;
|
|
18
|
+
const spinner = ora(`Searching ${pkg} documentation...`).start();
|
|
19
|
+
try {
|
|
20
|
+
const config = await loadGlobalConfig();
|
|
21
|
+
const apiKey = getAPIKey("context7", config);
|
|
22
|
+
if (!apiKey) {
|
|
23
|
+
spinner.fail("Context7 API key not found");
|
|
24
|
+
throw new AuthError(
|
|
25
|
+
"CONTEXT7_API_KEY environment variable is not set",
|
|
26
|
+
"Get your API key from https://context7.com/dashboard and set CONTEXT7_API_KEY"
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
const client = getContext7Client(apiKey);
|
|
30
|
+
const result = await client.search(pkg, searchQuery);
|
|
31
|
+
spinner.stop();
|
|
32
|
+
const title = query ? `${pkg.toUpperCase()}: ${query}` : pkg.toUpperCase();
|
|
33
|
+
const output = formatBox(title, result);
|
|
34
|
+
console.log(output);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
spinner.fail("Failed to fetch documentation");
|
|
37
|
+
handleError(error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
packageAction
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=package-QO75XHBD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/docs/package.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 packageAction(pkg: string, query?: string): Promise<void> {\n const searchQuery = query || `${pkg} usage examples`;\n const spinner = ora(`Searching ${pkg} 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(pkg, searchQuery);\n\n spinner.stop();\n\n const title = query ? `${pkg.toUpperCase()}: ${query}` : pkg.toUpperCase();\n const output = formatBox(title, 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,KAAa,OAA+B;AAC9E,QAAM,cAAc,SAAS,GAAG,GAAG;AACnC,QAAM,UAAU,IAAI,aAAa,GAAG,mBAAmB,EAAE,MAAM;AAE/D,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,KAAK,WAAW;AAEnD,YAAQ,KAAK;AAEb,UAAM,QAAQ,QAAQ,GAAG,IAAI,YAAY,CAAC,KAAK,KAAK,KAAK,IAAI,YAAY;AACzE,UAAM,SAAS,UAAU,OAAO,MAAM;AACtC,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,KAAK,+BAA+B;AAC5C,gBAAY,KAAK;AAAA,EACnB;AACF;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
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/powersync.ts
|
|
10
|
+
import pc from "picocolors";
|
|
11
|
+
var VALID_TYPES = ["rules", "schema"];
|
|
12
|
+
async function powersyncAction(type, table, options) {
|
|
13
|
+
try {
|
|
14
|
+
if (!VALID_TYPES.includes(type)) {
|
|
15
|
+
throw new CLIError(`Invalid type: "${type}"`, 1, `Valid types: ${VALID_TYPES.join(", ")}`);
|
|
16
|
+
}
|
|
17
|
+
const context = {
|
|
18
|
+
table,
|
|
19
|
+
tableName: table,
|
|
20
|
+
userColumn: options.userColumn || "user_id"
|
|
21
|
+
};
|
|
22
|
+
const output = await renderTemplate("powersync", type, context);
|
|
23
|
+
if (options.output) {
|
|
24
|
+
const { writeFile } = await import("fs/promises");
|
|
25
|
+
await writeFile(options.output, output);
|
|
26
|
+
console.log(pc.green(`\u2713 Generated ${options.output}`));
|
|
27
|
+
} else {
|
|
28
|
+
console.log(output);
|
|
29
|
+
}
|
|
30
|
+
} catch (error) {
|
|
31
|
+
handleError(error);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
powersyncAction
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=powersync-I3LR7TDN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/gen/powersync.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { renderTemplate } from '../../services/template.js';\nimport { CLIError, handleError } from '../../utils/error.js';\n\ninterface PowerSyncOptions {\n userColumn?: string;\n output?: string;\n}\n\nconst VALID_TYPES = ['rules', 'schema'];\n\nexport async function powersyncAction(\n type: string,\n table: string,\n options: PowerSyncOptions,\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 // Prepare context\n const context = {\n table,\n tableName: table,\n userColumn: options.userColumn || 'user_id',\n };\n\n // Render template\n const output = await renderTemplate('powersync', type, 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;AASf,IAAM,cAAc,CAAC,SAAS,QAAQ;AAEtC,eAAsB,gBACpB,MACA,OACA,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;AAGA,UAAM,UAAU;AAAA,MACd;AAAA,MACA,WAAW;AAAA,MACX,YAAY,QAAQ,cAAc;AAAA,IACpC;AAGA,UAAM,SAAS,MAAM,eAAe,aAAa,MAAM,OAAO;AAG9D,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,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
renderTemplate
|
|
3
|
+
} from "./chunk-26VE6QJ4.js";
|
|
4
|
+
import {
|
|
5
|
+
handleError
|
|
6
|
+
} from "./chunk-5BCEXHNM.js";
|
|
7
|
+
|
|
8
|
+
// src/commands/gen/repository.ts
|
|
9
|
+
import pc from "picocolors";
|
|
10
|
+
async function repositoryAction(name, options) {
|
|
11
|
+
try {
|
|
12
|
+
const entityName = options.entity || name.replace(/Repository$/i, "");
|
|
13
|
+
const context = {
|
|
14
|
+
name,
|
|
15
|
+
repositoryName: name.endsWith("Repository") ? name : name + "Repository",
|
|
16
|
+
entityName,
|
|
17
|
+
entityNameLower: entityName.charAt(0).toLowerCase() + entityName.slice(1)
|
|
18
|
+
};
|
|
19
|
+
const output = await renderTemplate("repository", "repository", context);
|
|
20
|
+
if (options.output) {
|
|
21
|
+
const { writeFile } = await import("fs/promises");
|
|
22
|
+
await writeFile(options.output, output);
|
|
23
|
+
console.log(pc.green(`\u2713 Generated ${options.output}`));
|
|
24
|
+
} else {
|
|
25
|
+
console.log(output);
|
|
26
|
+
}
|
|
27
|
+
} catch (error) {
|
|
28
|
+
handleError(error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
repositoryAction
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=repository-BAOVD3NG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/gen/repository.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { renderTemplate } from '../../services/template.js';\nimport { handleError } from '../../utils/error.js';\n\ninterface RepositoryOptions {\n entity?: string;\n output?: string;\n}\n\nexport async function repositoryAction(name: string, options: RepositoryOptions): Promise<void> {\n try {\n // Derive entity name from repository name if not provided\n const entityName = options.entity || name.replace(/Repository$/i, '');\n\n // Prepare context\n const context = {\n name,\n repositoryName: name.endsWith('Repository') ? name : name + 'Repository',\n entityName,\n entityNameLower: entityName.charAt(0).toLowerCase() + entityName.slice(1),\n };\n\n // Render template\n const output = await renderTemplate('repository', 'repository', 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;AASf,eAAsB,iBAAiB,MAAc,SAA2C;AAC9F,MAAI;AAEF,UAAM,aAAa,QAAQ,UAAU,KAAK,QAAQ,gBAAgB,EAAE;AAGpE,UAAM,UAAU;AAAA,MACd;AAAA,MACA,gBAAgB,KAAK,SAAS,YAAY,IAAI,OAAO,OAAO;AAAA,MAC5D;AAAA,MACA,iBAAiB,WAAW,OAAO,CAAC,EAAE,YAAY,IAAI,WAAW,MAAM,CAAC;AAAA,IAC1E;AAGA,UAAM,SAAS,MAAM,eAAe,cAAc,cAAc,OAAO;AAGvE,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,42 @@
|
|
|
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/riverpod.ts
|
|
10
|
+
import pc from "picocolors";
|
|
11
|
+
var VALID_PATTERNS = ["notifier", "async-notifier", "future", "stream", "family"];
|
|
12
|
+
async function riverpodAction(pattern, name, options) {
|
|
13
|
+
try {
|
|
14
|
+
if (!VALID_PATTERNS.includes(pattern)) {
|
|
15
|
+
throw new CLIError(
|
|
16
|
+
`Invalid pattern: "${pattern}"`,
|
|
17
|
+
1,
|
|
18
|
+
`Valid patterns: ${VALID_PATTERNS.join(", ")}`
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
const templateName = pattern === "async-notifier" ? "async-notifier" : pattern;
|
|
22
|
+
const context = {
|
|
23
|
+
name,
|
|
24
|
+
state: options.state || "dynamic",
|
|
25
|
+
hasState: !!options.state
|
|
26
|
+
};
|
|
27
|
+
const output = await renderTemplate("riverpod", templateName, context);
|
|
28
|
+
if (options.output) {
|
|
29
|
+
const { writeFile } = await import("fs/promises");
|
|
30
|
+
await writeFile(options.output, output);
|
|
31
|
+
console.log(pc.green(`\u2713 Generated ${options.output}`));
|
|
32
|
+
} else {
|
|
33
|
+
console.log(output);
|
|
34
|
+
}
|
|
35
|
+
} catch (error) {
|
|
36
|
+
handleError(error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
riverpodAction
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=riverpod-XUU656PM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/gen/riverpod.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { renderTemplate } from '../../services/template.js';\nimport { CLIError, handleError } from '../../utils/error.js';\n\ninterface RiverpodOptions {\n state?: string;\n output?: string;\n}\n\nconst VALID_PATTERNS = ['notifier', 'async-notifier', 'future', 'stream', 'family'];\n\nexport async function riverpodAction(\n pattern: string,\n name: string,\n options: RiverpodOptions,\n): Promise<void> {\n try {\n // Validate pattern\n if (!VALID_PATTERNS.includes(pattern)) {\n throw new CLIError(\n `Invalid pattern: \"${pattern}\"`,\n 1,\n `Valid patterns: ${VALID_PATTERNS.join(', ')}`,\n );\n }\n\n // Map pattern to template name\n const templateName = pattern === 'async-notifier' ? 'async-notifier' : pattern;\n\n // Prepare context\n const context = {\n name,\n state: options.state || 'dynamic',\n hasState: !!options.state,\n };\n\n // Render template\n const output = await renderTemplate('riverpod', templateName, 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;AASf,IAAM,iBAAiB,CAAC,YAAY,kBAAkB,UAAU,UAAU,QAAQ;AAElF,eAAsB,eACpB,SACA,MACA,SACe;AACf,MAAI;AAEF,QAAI,CAAC,eAAe,SAAS,OAAO,GAAG;AACrC,YAAM,IAAI;AAAA,QACR,qBAAqB,OAAO;AAAA,QAC5B;AAAA,QACA,mBAAmB,eAAe,KAAK,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AAGA,UAAM,eAAe,YAAY,mBAAmB,mBAAmB;AAGvE,UAAM,UAAU;AAAA,MACd;AAAA,MACA,OAAO,QAAQ,SAAS;AAAA,MACxB,UAAU,CAAC,CAAC,QAAQ;AAAA,IACtB;AAGA,UAAM,SAAS,MAAM,eAAe,YAAY,cAAc,OAAO;AAGrE,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,42 @@
|
|
|
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/widget.ts
|
|
15
|
+
import ora from "ora";
|
|
16
|
+
async function widgetAction(name, options) {
|
|
17
|
+
const query = options.properties ? `${name} widget all properties and parameters` : `${name} widget usage and examples`;
|
|
18
|
+
const spinner = ora(`Looking up ${name} widget...`).start();
|
|
19
|
+
try {
|
|
20
|
+
const config = await loadGlobalConfig();
|
|
21
|
+
const apiKey = getAPIKey("context7", config);
|
|
22
|
+
if (!apiKey) {
|
|
23
|
+
spinner.fail("Context7 API key not found");
|
|
24
|
+
throw new AuthError(
|
|
25
|
+
"CONTEXT7_API_KEY environment variable is not set",
|
|
26
|
+
"Get your API key from https://context7.com/dashboard and set CONTEXT7_API_KEY"
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
const client = getContext7Client(apiKey);
|
|
30
|
+
const result = await client.search("flutter", query);
|
|
31
|
+
spinner.stop();
|
|
32
|
+
const output = formatBox(`Widget: ${name}`, result);
|
|
33
|
+
console.log(output);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
spinner.fail("Failed to fetch widget documentation");
|
|
36
|
+
handleError(error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
widgetAction
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=widget-YDKHPRXM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/docs/widget.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\ninterface WidgetOptions {\n properties?: boolean;\n}\n\nexport async function widgetAction(name: string, options: WidgetOptions): Promise<void> {\n const query = options.properties\n ? `${name} widget all properties and parameters`\n : `${name} widget usage and examples`;\n\n const spinner = ora(`Looking up ${name} widget...`).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(`Widget: ${name}`, result);\n console.log(output);\n } catch (error) {\n spinner.fail('Failed to fetch widget documentation');\n handleError(error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAUhB,eAAsB,aAAa,MAAc,SAAuC;AACtF,QAAM,QAAQ,QAAQ,aAClB,GAAG,IAAI,0CACP,GAAG,IAAI;AAEX,QAAM,UAAU,IAAI,cAAc,IAAI,YAAY,EAAE,MAAM;AAE1D,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,WAAW,IAAI,IAAI,MAAM;AAClD,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,KAAK,sCAAsC;AACnD,gBAAY,KAAK;AAAA,EACnB;AACF;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@beaulewis/saas-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A unified CLI tool for Flutter SaaS development with live documentation, code generation, and backend integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"packageManager": "pnpm@9.15.0",
|
|
7
|
+
"bin": {
|
|
8
|
+
"saas": "./bin/saas.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"bin",
|
|
18
|
+
"dist",
|
|
19
|
+
"templates"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "tsx watch src/index.ts",
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"start": "node dist/index.js",
|
|
25
|
+
"lint": "biome check src/",
|
|
26
|
+
"lint:fix": "biome check --write src/",
|
|
27
|
+
"format": "biome format --write src/",
|
|
28
|
+
"format:check": "biome format src/",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"test:unit": "vitest run tests/unit",
|
|
33
|
+
"test:integration": "vitest run tests/integration",
|
|
34
|
+
"test:coverage": "vitest run --coverage",
|
|
35
|
+
"prepare": "husky",
|
|
36
|
+
"prepublishOnly": "pnpm build"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@inquirer/prompts": "^8.1.0",
|
|
40
|
+
"cli-table3": "^0.6.5",
|
|
41
|
+
"commander": "^14.0.2",
|
|
42
|
+
"got": "^14.6.6",
|
|
43
|
+
"handlebars": "^4.7.8",
|
|
44
|
+
"keyv": "^5.5.5",
|
|
45
|
+
"keyv-file": "^5.3.3",
|
|
46
|
+
"ora": "^9.0.0",
|
|
47
|
+
"picocolors": "^1.1.1",
|
|
48
|
+
"yaml": "^2.8.2"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@biomejs/biome": "^2.3.11",
|
|
52
|
+
"@commitlint/cli": "^19.0.0",
|
|
53
|
+
"@commitlint/config-conventional": "^19.0.0",
|
|
54
|
+
"@types/node": "^25.0.3",
|
|
55
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
56
|
+
"husky": "^9.0.0",
|
|
57
|
+
"lint-staged": "^15.0.0",
|
|
58
|
+
"tsup": "^8.5.1",
|
|
59
|
+
"tsx": "^4.21.0",
|
|
60
|
+
"typescript": "^5.9.3",
|
|
61
|
+
"vitest": "^4.0.16"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=20"
|
|
65
|
+
},
|
|
66
|
+
"keywords": [
|
|
67
|
+
"cli",
|
|
68
|
+
"flutter",
|
|
69
|
+
"saas",
|
|
70
|
+
"supabase",
|
|
71
|
+
"riverpod",
|
|
72
|
+
"drift",
|
|
73
|
+
"code-generation",
|
|
74
|
+
"documentation"
|
|
75
|
+
],
|
|
76
|
+
"repository": {
|
|
77
|
+
"type": "git",
|
|
78
|
+
"url": "git+https://github.com/Beaulewis1977/saas-cli.git"
|
|
79
|
+
},
|
|
80
|
+
"homepage": "https://github.com/Beaulewis1977/saas-cli#readme",
|
|
81
|
+
"bugs": {
|
|
82
|
+
"url": "https://github.com/Beaulewis1977/saas-cli/issues"
|
|
83
|
+
},
|
|
84
|
+
"author": "Beau Lewis <blewisxx@gmail.com>",
|
|
85
|
+
"license": "MIT",
|
|
86
|
+
"publishConfig": {
|
|
87
|
+
"access": "public"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import 'package:drift/drift.dart';
|
|
2
|
+
|
|
3
|
+
import '../database.dart';
|
|
4
|
+
import '../tables/{{snakeCase tableName}}.dart';
|
|
5
|
+
|
|
6
|
+
part '{{snakeCase name}}_dao.g.dart';
|
|
7
|
+
|
|
8
|
+
@DriftAccessor(tables: [{{pascalCase tableName}}])
|
|
9
|
+
class {{pascalCase name}}Dao extends DatabaseAccessor<AppDatabase> with _${{pascalCase name}}DaoMixin {
|
|
10
|
+
{{pascalCase name}}Dao(AppDatabase db) : super(db);
|
|
11
|
+
|
|
12
|
+
/// Get all records
|
|
13
|
+
Future<List<{{pascalCase tableName}}Data>> getAll() {
|
|
14
|
+
return select({{camelCase tableName}}).get();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/// Get a record by ID
|
|
18
|
+
Future<{{pascalCase tableName}}Data?> getById(int id) {
|
|
19
|
+
return (select({{camelCase tableName}})..where((t) => t.id.equals(id))).getSingleOrNull();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Watch all records
|
|
23
|
+
Stream<List<{{pascalCase tableName}}Data>> watchAll() {
|
|
24
|
+
return select({{camelCase tableName}}).watch();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// Watch a single record by ID
|
|
28
|
+
Stream<{{pascalCase tableName}}Data?> watchById(int id) {
|
|
29
|
+
return (select({{camelCase tableName}})..where((t) => t.id.equals(id))).watchSingleOrNull();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// Insert a new record
|
|
33
|
+
Future<int> insertRecord({{pascalCase tableName}}Companion record) {
|
|
34
|
+
return into({{camelCase tableName}}).insert(record);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// Update an existing record
|
|
38
|
+
Future<bool> updateRecord({{pascalCase tableName}}Data record) {
|
|
39
|
+
return update({{camelCase tableName}}).replace(record);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// Delete a record by ID
|
|
43
|
+
Future<int> deleteById(int id) {
|
|
44
|
+
return (delete({{camelCase tableName}})..where((t) => t.id.equals(id))).go();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// Delete all records
|
|
48
|
+
Future<int> deleteAll() {
|
|
49
|
+
return delete({{camelCase tableName}}).go();
|
|
50
|
+
}
|
|
51
|
+
}
|