@eventcatalog/cli 0.3.1 → 0.3.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js","../../src/cli/index.ts","../../src/cli/executor.ts","../../src/cli/parser.ts","../../src/cli/list.ts","../../src/cli/export.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { executeFunction } from './executor';\nimport { listFunctions, formatListOutput } from './list';\nimport { exportResource, exportCatalog } from './export';\n\n// Read package.json to get version\nlet version = '1.0.0';\ntry {\n const packageJsonPath = resolve(__dirname, '../../package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n version = packageJson.version;\n} catch {\n // Fall back to default version if package.json not found\n}\n\nprogram\n .name('eventcatalog')\n .description('EventCatalog Command-Line Interface')\n .version(version)\n .option('-d, --dir <path>', 'Path to the EventCatalog directory (default: current directory)', '.');\n\n// List command - show all available functions\nprogram\n .command('list')\n .description('List all available SDK functions')\n .action(() => {\n try {\n const functions = listFunctions('.');\n const output = formatListOutput(functions);\n console.log(output);\n } catch (error) {\n console.error('Error listing functions:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Export command - export a resource to .ec DSL format\nprogram\n .command('export')\n .description('Export a catalog resource to EventCatalog DSL (.ec) format')\n .option('-a, --all', 'Export the entire catalog (all resource types)', false)\n .option('-r, --resource <type>', 'Resource type (event, command, query, service, domain)')\n .option('--id <id>', 'Resource ID (omit to export all resources of the given type)')\n .option('-v, --version <version>', 'Resource version (defaults to latest)')\n .option('--hydrate', 'Include referenced resources (messages, channels, owners)', false)\n .option('--stdout', 'Print to stdout instead of writing a file', false)\n .option('--playground', 'Open the exported DSL in the playground', false)\n .option('-o, --output <path>', 'Output file path (defaults to <id>.ec or catalog.ec)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n\n if (opts.all) {\n const result = await exportCatalog({\n hydrate: opts.hydrate,\n stdout: opts.stdout,\n playground: opts.playground,\n output: opts.output,\n dir,\n });\n console.log(result);\n return;\n }\n\n if (!opts.resource) {\n console.error('Either --all or --resource is required');\n process.exit(1);\n }\n\n const result = await exportResource({\n resource: opts.resource,\n id: opts.id,\n version: opts.version,\n hydrate: opts.hydrate,\n stdout: opts.stdout,\n playground: opts.playground,\n output: opts.output,\n dir,\n });\n console.log(result);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Catch-all for any other command - execute as SDK function\nprogram.arguments('<function> [args...]').action(async (functionName: string, args: string[]) => {\n try {\n const options = program.opts() as any;\n const dir = options.dir || '.';\n const result = await executeFunction(dir, functionName, args);\n console.log(JSON.stringify(result, null, 0));\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n});\n\nprogram.parse(process.argv);\n\n// Show help if no command provided\nif (process.argv.length < 3) {\n program.outputHelp();\n}\n","import { existsSync } from 'node:fs';\nimport { parseArguments } from './parser';\nimport createSDK from '@eventcatalog/sdk';\n\n/**\n * Execute a SDK function with the given arguments\n */\nexport async function executeFunction(catalogDir: string, functionName: string, rawArgs: string[]): Promise<any> {\n // Validate catalog directory exists\n if (!existsSync(catalogDir)) {\n throw new Error(`Catalog directory not found: ${catalogDir}`);\n }\n\n // Initialize the SDK\n const sdk = createSDK(catalogDir);\n\n // Validate function exists\n if (!(functionName in sdk)) {\n throw new Error(`Function '${functionName}' not found. Use 'eventcatalog list' to see available functions.`);\n }\n\n const fn = (sdk as any)[functionName];\n\n // Validate it's callable\n if (typeof fn !== 'function') {\n throw new Error(`'${functionName}' is not a callable function.`);\n }\n\n // Parse arguments\n const parsedArgs = parseArguments(rawArgs);\n\n // Execute function\n try {\n return await fn(...parsedArgs);\n } catch (error) {\n throw new Error(`Error executing '${functionName}': ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","/**\n * Parse command-line arguments into typed values\n * Supports JSON objects/arrays, booleans, numbers, and strings\n */\nexport function parseArguments(rawArgs: string[]): any[] {\n return rawArgs.map((arg, index) => {\n // Try to parse as JSON object or array if it looks like JSON\n if ((arg.startsWith('{') && arg.endsWith('}')) || (arg.startsWith('[') && arg.endsWith(']'))) {\n try {\n return JSON.parse(arg);\n } catch (error) {\n // If it fails to parse as JSON, treat it as a string\n // Only throw error if it looks like valid JSON syntax was intended\n if (arg.includes(':') || arg.includes(',')) {\n throw new Error(`Invalid JSON in argument ${index + 1}: ${error instanceof Error ? error.message : String(error)}`);\n }\n // Otherwise, return as string\n return arg;\n }\n }\n\n // Parse booleans\n if (arg === 'true') return true;\n if (arg === 'false') return false;\n\n // Parse numbers\n if (/^-?\\d+(\\.\\d+)?$/.test(arg)) {\n return Number(arg);\n }\n\n // Return as string\n return arg;\n });\n}\n","import createSDK from '@eventcatalog/sdk';\n\ninterface CategorizedFunctions {\n [category: string]: string[];\n}\n\n/**\n * Get all available SDK functions organized by category\n */\nexport function listFunctions(catalogDir: string = '.'): CategorizedFunctions {\n // Initialize SDK to get all functions\n const sdk = createSDK(catalogDir);\n\n // Get all function names from SDK\n const functionNames = Object.keys(sdk).filter((key) => typeof (sdk as any)[key] === 'function');\n\n // Categorize functions based on naming patterns\n const categories: CategorizedFunctions = {\n Events: [],\n Commands: [],\n Queries: [],\n Channels: [],\n Services: [],\n Domains: [],\n Entities: [],\n DataStores: [],\n DataProducts: [],\n Teams: [],\n Users: [],\n 'Custom Docs': [],\n Messages: [],\n Utilities: [],\n };\n\n functionNames.forEach((name) => {\n if (name.includes('Event')) categories['Events'].push(name);\n else if (name.includes('Command')) categories['Commands'].push(name);\n else if (name.includes('Query')) categories['Queries'].push(name);\n else if (name.includes('Channel')) categories['Channels'].push(name);\n else if (name.includes('Service')) categories['Services'].push(name);\n else if (name.includes('Domain')) categories['Domains'].push(name);\n else if (name.includes('Entity')) categories['Entities'].push(name);\n else if (name.includes('DataStore')) categories['DataStores'].push(name);\n else if (name.includes('DataProduct')) categories['DataProducts'].push(name);\n else if (name.includes('Team')) categories['Teams'].push(name);\n else if (name.includes('User')) categories['Users'].push(name);\n else if (name.includes('CustomDoc')) categories['Custom Docs'].push(name);\n else if (name.includes('Message') || name.includes('Producers') || name.includes('Consumers'))\n categories['Messages'].push(name);\n else categories['Utilities'].push(name);\n });\n\n // Remove empty categories\n Object.keys(categories).forEach((key) => {\n if (categories[key].length === 0) {\n delete categories[key];\n }\n });\n\n return categories;\n}\n\n/**\n * Format and print categorized functions\n */\nexport function formatListOutput(functions: CategorizedFunctions): string {\n let output = 'Available EventCatalog SDK Functions:\\n\\n';\n\n Object.entries(functions).forEach(([category, names]) => {\n output += `${category}:\\n`;\n names.sort().forEach((name) => {\n output += ` - ${name}\\n`;\n });\n output += '\\n';\n });\n\n return output;\n}\n","import { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport open from 'open';\nimport createSDK from '@eventcatalog/sdk';\n\nconst RESOURCE_TYPES = ['event', 'command', 'query', 'service', 'domain'] as const;\ntype ResourceType = (typeof RESOURCE_TYPES)[number];\n\nconst PLURAL_MAP: Record<string, ResourceType> = {\n events: 'event',\n commands: 'command',\n queries: 'query',\n services: 'service',\n domains: 'domain',\n};\n\ninterface ExportOptions {\n resource: string;\n id?: string;\n version?: string;\n hydrate?: boolean;\n stdout?: boolean;\n playground?: boolean;\n output?: string;\n dir: string;\n}\n\nfunction normalizeResourceType(resource: string): ResourceType {\n const lower = resource.toLowerCase();\n if (PLURAL_MAP[lower]) return PLURAL_MAP[lower];\n return lower as ResourceType;\n}\n\nfunction getResourceFetcher(sdk: ReturnType<typeof createSDK>, type: ResourceType) {\n switch (type) {\n case 'event':\n return sdk.getEvent;\n case 'command':\n return sdk.getCommand;\n case 'query':\n return sdk.getQuery;\n case 'service':\n return sdk.getService;\n case 'domain':\n return sdk.getDomain;\n }\n}\n\nfunction getCollectionFetcher(sdk: ReturnType<typeof createSDK>, type: ResourceType) {\n switch (type) {\n case 'event':\n return sdk.getEvents;\n case 'command':\n return sdk.getCommands;\n case 'query':\n return sdk.getQueries;\n case 'service':\n return sdk.getServices;\n case 'domain':\n return sdk.getDomains;\n }\n}\n\nfunction pluralize(type: ResourceType): string {\n if (type === 'query') return 'queries';\n return `${type}s`;\n}\n\nconst SECTION_ORDER = ['team', 'user', 'channel', 'event', 'command', 'query', 'service', 'domain'] as const;\n\nconst SECTION_LABELS: Record<string, string> = {\n team: 'TEAMS',\n user: 'USERS',\n channel: 'CHANNELS',\n event: 'EVENTS',\n command: 'COMMANDS',\n query: 'QUERIES',\n service: 'SERVICES',\n domain: 'DOMAINS',\n};\n\nfunction groupDSLBlocks(dsl: string): string {\n const blocks = dsl.split(/\\n\\n/).filter((b) => b.trim());\n const buckets: Record<string, string[]> = {};\n\n for (const block of blocks) {\n const firstWord = block.trimStart().split(/\\s/)[0];\n const key = firstWord === 'subdomain' ? 'domain' : firstWord;\n if (!buckets[key]) buckets[key] = [];\n buckets[key].push(block);\n }\n\n const sections: string[] = [];\n for (const type of SECTION_ORDER) {\n if (!buckets[type] || buckets[type].length === 0) continue;\n const label = SECTION_LABELS[type] || type.toUpperCase();\n sections.push(`// ${label}\\n${buckets[type].join('\\n\\n')}`);\n delete buckets[type];\n }\n\n // Any remaining types not in SECTION_ORDER\n for (const [type, items] of Object.entries(buckets)) {\n if (items.length === 0) continue;\n const label = type.toUpperCase();\n sections.push(`// ${label}\\n${items.join('\\n\\n')}`);\n }\n\n return sections.join('\\n\\n');\n}\n\nconst VISUALIZER_TYPES = ['event', 'command', 'query', 'service', 'domain'] as const;\n\nfunction buildVisualizerBlock(dsl: string, name: string, filterTypes: ResourceType | ResourceType[]): string {\n const types = Array.isArray(filterTypes) ? filterTypes : [filterTypes];\n const entries: string[] = [];\n\n for (const line of dsl.split('\\n')) {\n const trimmed = line.trimStart();\n const parts = trimmed.split(/\\s/);\n const keyword = parts[0];\n const id = parts[1];\n if (!types.includes(keyword as ResourceType)) continue;\n if (!id || !trimmed.endsWith('{')) continue;\n entries.push(` ${keyword} ${id}`);\n }\n\n if (entries.length === 0) return '';\n return `\\nvisualizer main {\\n name \"${name}\"\\n${entries.join('\\n')}\\n}`;\n}\n\nexport async function exportCatalog(options: Omit<ExportOptions, 'resource'>): Promise<string> {\n const { hydrate = false, stdout = false, playground = false, output, dir } = options;\n\n const sdk = createSDK(dir);\n const dslParts: string[] = [];\n\n for (const type of RESOURCE_TYPES) {\n const fetcher = getCollectionFetcher(sdk, type);\n const resources = await fetcher({ latestOnly: true });\n if (!resources || resources.length === 0) continue;\n const rawDsl = await sdk.toDSL(resources, { type, hydrate });\n dslParts.push(rawDsl);\n }\n\n if (dslParts.length === 0) {\n throw new Error(`No resources found in catalog at '${dir}'`);\n }\n\n const combined = dslParts.join('\\n\\n');\n const grouped = groupDSLBlocks(combined);\n const vizBlock = buildVisualizerBlock(grouped, 'Full Catalog', [...RESOURCE_TYPES]);\n const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n if (stdout) {\n return dsl;\n }\n\n const filename = output || 'catalog.ec';\n const filepath = resolve(filename);\n writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n const lines = ['', ` Exported full catalog to ${filepath}`];\n\n if (playground) {\n const encoded = Buffer.from(dsl).toString('base64');\n const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in playground...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in the playground`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nexport async function exportAll(options: ExportOptions): Promise<string> {\n const { resource, hydrate = false, stdout = false, playground = false, output, dir } = options;\n\n const type = normalizeResourceType(resource);\n if (!RESOURCE_TYPES.includes(type)) {\n throw new Error(`Invalid resource type '${resource}'. Must be one of: ${RESOURCE_TYPES.join(', ')}`);\n }\n\n const plural = pluralize(type);\n const sdk = createSDK(dir);\n\n const fetcher = getCollectionFetcher(sdk, type);\n const allResources = (await fetcher({ latestOnly: true })) || [];\n\n if (allResources.length === 0) {\n throw new Error(`No ${plural} found in catalog at '${dir}'`);\n }\n\n const rawDsl = await sdk.toDSL(allResources, { type, hydrate });\n const grouped = groupDSLBlocks(rawDsl);\n const vizBlock = buildVisualizerBlock(grouped, `All ${plural}`, type);\n const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n if (stdout) {\n return dsl;\n }\n\n const filename = output || `${plural}.ec`;\n const filepath = resolve(filename);\n writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n const lines = ['', ` Exported ${allResources.length} ${plural} to ${filepath}`];\n\n if (playground) {\n const encoded = Buffer.from(dsl).toString('base64');\n const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in playground...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in the playground`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nexport async function exportResource(options: ExportOptions): Promise<string> {\n const { resource, id, version, hydrate = false, stdout = false, playground = false, output, dir } = options;\n\n if (!id) {\n return exportAll(options);\n }\n\n const type = normalizeResourceType(resource);\n if (!RESOURCE_TYPES.includes(type)) {\n throw new Error(`Invalid resource type '${resource}'. Must be one of: ${RESOURCE_TYPES.join(', ')}`);\n }\n\n const sdk = createSDK(dir);\n\n const fetcher = getResourceFetcher(sdk, type);\n const data = await fetcher(id, version);\n\n if (!data) {\n const versionStr = version ? `@${version}` : ' (latest)';\n throw new Error(`${resource} '${id}${versionStr}' not found in catalog at '${dir}'`);\n }\n\n const rawDsl = await sdk.toDSL(data, { type, hydrate });\n const grouped = hydrate ? groupDSLBlocks(rawDsl) : rawDsl;\n const vizBlock = buildVisualizerBlock(grouped, `View of ${id}`, type);\n const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n if (stdout) {\n return dsl;\n }\n\n const filename = output || `${id}.ec`;\n const filepath = resolve(filename);\n writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n const lines = ['', ` Exported ${type} '${id}' to ${filepath}`];\n\n if (playground) {\n const encoded = Buffer.from(dsl).toString('base64');\n const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in playground...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in the playground`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["resolve","createSDK","createSDK","createSDK","version","resolve","result"]}
1
+ {"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js","../../src/cli/index.ts","../../src/cli/executor.ts","../../src/cli/parser.ts","../../src/cli/list.ts","../../src/cli/export.ts","../../src/cli/import.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { executeFunction } from './executor';\nimport { listFunctions, formatListOutput } from './list';\nimport { exportResource, exportCatalog } from './export';\nimport { importDSL } from './import';\n\n// Read package.json to get version\nlet version = '1.0.0';\ntry {\n const packageJsonPath = resolve(__dirname, '../../package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n version = packageJson.version;\n} catch {\n // Fall back to default version if package.json not found\n}\n\nprogram\n .name('eventcatalog')\n .description('EventCatalog Command-Line Interface')\n .version(version)\n .option('-d, --dir <path>', 'Path to the EventCatalog directory (default: current directory)', '.');\n\n// List command - show all available functions\nprogram\n .command('list')\n .description('List all available SDK functions')\n .action(() => {\n try {\n const functions = listFunctions('.');\n const output = formatListOutput(functions);\n console.log(output);\n } catch (error) {\n console.error('Error listing functions:', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Export command - export a resource to .ec DSL format\nprogram\n .command('export')\n .description('Export a catalog resource to EventCatalog DSL (.ec) format')\n .option('-a, --all', 'Export the entire catalog (all resource types)', false)\n .option('-r, --resource <type>', 'Resource type (event, command, query, service, domain)')\n .option('--id <id>', 'Resource ID (omit to export all resources of the given type)')\n .option('-v, --version <version>', 'Resource version (defaults to latest)')\n .option('--hydrate', 'Include referenced resources (messages, channels, owners)', false)\n .option('--stdout', 'Print to stdout instead of writing a file', false)\n .option('--playground', 'Open the exported DSL in the playground', false)\n .option('-o, --output <path>', 'Output file path (defaults to <id>.ec or catalog.ec)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n\n if (opts.all) {\n const result = await exportCatalog({\n hydrate: opts.hydrate,\n stdout: opts.stdout,\n playground: opts.playground,\n output: opts.output,\n dir,\n });\n console.log(result);\n return;\n }\n\n if (!opts.resource) {\n console.error('Either --all or --resource is required');\n process.exit(1);\n }\n\n const result = await exportResource({\n resource: opts.resource,\n id: opts.id,\n version: opts.version,\n hydrate: opts.hydrate,\n stdout: opts.stdout,\n playground: opts.playground,\n output: opts.output,\n dir,\n });\n console.log(result);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Import command - import .ec DSL files into catalog markdown\nprogram\n .command('import [files...]')\n .description('Import EventCatalog DSL (.ec) files into catalog markdown')\n .option('--stdin', 'Read DSL from stdin', false)\n .option('--dry-run', 'Preview resources without writing', false)\n .option('--flat', 'Write resources in flat structure (no nesting under domains/services)', false)\n .option('--no-init', 'Skip catalog initialization prompt')\n .action(async (files: string[], opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n\n const result = await importDSL({\n files: files.length > 0 ? files : undefined,\n stdin: opts.stdin,\n dryRun: opts.dryRun,\n flat: opts.flat,\n noInit: !opts.init,\n dir,\n });\n console.log(result);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Catch-all for any other command - execute as SDK function\nprogram.arguments('<function> [args...]').action(async (functionName: string, args: string[]) => {\n try {\n const options = program.opts() as any;\n const dir = options.dir || '.';\n const result = await executeFunction(dir, functionName, args);\n console.log(JSON.stringify(result, null, 0));\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n});\n\nprogram.parse(process.argv);\n\n// Show help if no command provided\nif (process.argv.length < 3) {\n program.outputHelp();\n}\n","import { existsSync } from 'node:fs';\nimport { parseArguments } from './parser';\nimport createSDK from '@eventcatalog/sdk';\n\n/**\n * Execute a SDK function with the given arguments\n */\nexport async function executeFunction(catalogDir: string, functionName: string, rawArgs: string[]): Promise<any> {\n // Validate catalog directory exists\n if (!existsSync(catalogDir)) {\n throw new Error(`Catalog directory not found: ${catalogDir}`);\n }\n\n // Initialize the SDK\n const sdk = createSDK(catalogDir);\n\n // Validate function exists\n if (!(functionName in sdk)) {\n throw new Error(`Function '${functionName}' not found. Use 'eventcatalog list' to see available functions.`);\n }\n\n const fn = (sdk as any)[functionName];\n\n // Validate it's callable\n if (typeof fn !== 'function') {\n throw new Error(`'${functionName}' is not a callable function.`);\n }\n\n // Parse arguments\n const parsedArgs = parseArguments(rawArgs);\n\n // Execute function\n try {\n return await fn(...parsedArgs);\n } catch (error) {\n throw new Error(`Error executing '${functionName}': ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","/**\n * Parse command-line arguments into typed values\n * Supports JSON objects/arrays, booleans, numbers, and strings\n */\nexport function parseArguments(rawArgs: string[]): any[] {\n return rawArgs.map((arg, index) => {\n // Try to parse as JSON object or array if it looks like JSON\n if ((arg.startsWith('{') && arg.endsWith('}')) || (arg.startsWith('[') && arg.endsWith(']'))) {\n try {\n return JSON.parse(arg);\n } catch (error) {\n // If it fails to parse as JSON, treat it as a string\n // Only throw error if it looks like valid JSON syntax was intended\n if (arg.includes(':') || arg.includes(',')) {\n throw new Error(`Invalid JSON in argument ${index + 1}: ${error instanceof Error ? error.message : String(error)}`);\n }\n // Otherwise, return as string\n return arg;\n }\n }\n\n // Parse booleans\n if (arg === 'true') return true;\n if (arg === 'false') return false;\n\n // Parse numbers\n if (/^-?\\d+(\\.\\d+)?$/.test(arg)) {\n return Number(arg);\n }\n\n // Return as string\n return arg;\n });\n}\n","import createSDK from '@eventcatalog/sdk';\n\ninterface CategorizedFunctions {\n [category: string]: string[];\n}\n\n/**\n * Get all available SDK functions organized by category\n */\nexport function listFunctions(catalogDir: string = '.'): CategorizedFunctions {\n // Initialize SDK to get all functions\n const sdk = createSDK(catalogDir);\n\n // Get all function names from SDK\n const functionNames = Object.keys(sdk).filter((key) => typeof (sdk as any)[key] === 'function');\n\n // Categorize functions based on naming patterns\n const categories: CategorizedFunctions = {\n Events: [],\n Commands: [],\n Queries: [],\n Channels: [],\n Services: [],\n Domains: [],\n Entities: [],\n DataStores: [],\n DataProducts: [],\n Teams: [],\n Users: [],\n 'Custom Docs': [],\n Messages: [],\n Utilities: [],\n };\n\n functionNames.forEach((name) => {\n if (name.includes('Event')) categories['Events'].push(name);\n else if (name.includes('Command')) categories['Commands'].push(name);\n else if (name.includes('Query')) categories['Queries'].push(name);\n else if (name.includes('Channel')) categories['Channels'].push(name);\n else if (name.includes('Service')) categories['Services'].push(name);\n else if (name.includes('Domain')) categories['Domains'].push(name);\n else if (name.includes('Entity')) categories['Entities'].push(name);\n else if (name.includes('DataStore')) categories['DataStores'].push(name);\n else if (name.includes('DataProduct')) categories['DataProducts'].push(name);\n else if (name.includes('Team')) categories['Teams'].push(name);\n else if (name.includes('User')) categories['Users'].push(name);\n else if (name.includes('CustomDoc')) categories['Custom Docs'].push(name);\n else if (name.includes('Message') || name.includes('Producers') || name.includes('Consumers'))\n categories['Messages'].push(name);\n else categories['Utilities'].push(name);\n });\n\n // Remove empty categories\n Object.keys(categories).forEach((key) => {\n if (categories[key].length === 0) {\n delete categories[key];\n }\n });\n\n return categories;\n}\n\n/**\n * Format and print categorized functions\n */\nexport function formatListOutput(functions: CategorizedFunctions): string {\n let output = 'Available EventCatalog SDK Functions:\\n\\n';\n\n Object.entries(functions).forEach(([category, names]) => {\n output += `${category}:\\n`;\n names.sort().forEach((name) => {\n output += ` - ${name}\\n`;\n });\n output += '\\n';\n });\n\n return output;\n}\n","import { writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport open from 'open';\nimport createSDK from '@eventcatalog/sdk';\n\nconst RESOURCE_TYPES = ['event', 'command', 'query', 'service', 'domain'] as const;\ntype ResourceType = (typeof RESOURCE_TYPES)[number];\n\nconst PLURAL_MAP: Record<string, ResourceType> = {\n events: 'event',\n commands: 'command',\n queries: 'query',\n services: 'service',\n domains: 'domain',\n};\n\ninterface ExportOptions {\n resource: string;\n id?: string;\n version?: string;\n hydrate?: boolean;\n stdout?: boolean;\n playground?: boolean;\n output?: string;\n dir: string;\n}\n\nfunction normalizeResourceType(resource: string): ResourceType {\n const lower = resource.toLowerCase();\n if (PLURAL_MAP[lower]) return PLURAL_MAP[lower];\n return lower as ResourceType;\n}\n\nfunction getResourceFetcher(sdk: ReturnType<typeof createSDK>, type: ResourceType) {\n switch (type) {\n case 'event':\n return sdk.getEvent;\n case 'command':\n return sdk.getCommand;\n case 'query':\n return sdk.getQuery;\n case 'service':\n return sdk.getService;\n case 'domain':\n return sdk.getDomain;\n }\n}\n\nfunction getCollectionFetcher(sdk: ReturnType<typeof createSDK>, type: ResourceType) {\n switch (type) {\n case 'event':\n return sdk.getEvents;\n case 'command':\n return sdk.getCommands;\n case 'query':\n return sdk.getQueries;\n case 'service':\n return sdk.getServices;\n case 'domain':\n return sdk.getDomains;\n }\n}\n\nfunction pluralize(type: ResourceType): string {\n if (type === 'query') return 'queries';\n return `${type}s`;\n}\n\nconst SECTION_ORDER = ['team', 'user', 'channel', 'event', 'command', 'query', 'service', 'domain'] as const;\n\nconst SECTION_LABELS: Record<string, string> = {\n team: 'TEAMS',\n user: 'USERS',\n channel: 'CHANNELS',\n event: 'EVENTS',\n command: 'COMMANDS',\n query: 'QUERIES',\n service: 'SERVICES',\n domain: 'DOMAINS',\n};\n\nfunction groupDSLBlocks(dsl: string): string {\n const blocks = dsl.split(/\\n\\n/).filter((b) => b.trim());\n const buckets: Record<string, string[]> = {};\n\n for (const block of blocks) {\n const firstWord = block.trimStart().split(/\\s/)[0];\n const key = firstWord === 'subdomain' ? 'domain' : firstWord;\n if (!buckets[key]) buckets[key] = [];\n buckets[key].push(block);\n }\n\n const sections: string[] = [];\n for (const type of SECTION_ORDER) {\n if (!buckets[type] || buckets[type].length === 0) continue;\n const label = SECTION_LABELS[type] || type.toUpperCase();\n sections.push(`// ${label}\\n${buckets[type].join('\\n\\n')}`);\n delete buckets[type];\n }\n\n // Any remaining types not in SECTION_ORDER\n for (const [type, items] of Object.entries(buckets)) {\n if (items.length === 0) continue;\n const label = type.toUpperCase();\n sections.push(`// ${label}\\n${items.join('\\n\\n')}`);\n }\n\n return sections.join('\\n\\n');\n}\n\nconst VISUALIZER_TYPES = ['event', 'command', 'query', 'service', 'domain'] as const;\n\nfunction buildVisualizerBlock(dsl: string, name: string, filterTypes: ResourceType | ResourceType[]): string {\n const types = Array.isArray(filterTypes) ? filterTypes : [filterTypes];\n const entries: string[] = [];\n\n for (const line of dsl.split('\\n')) {\n const trimmed = line.trimStart();\n const parts = trimmed.split(/\\s/);\n const keyword = parts[0];\n const id = parts[1];\n if (!types.includes(keyword as ResourceType)) continue;\n if (!id || !trimmed.endsWith('{')) continue;\n entries.push(` ${keyword} ${id}`);\n }\n\n if (entries.length === 0) return '';\n return `\\nvisualizer main {\\n name \"${name}\"\\n${entries.join('\\n')}\\n}`;\n}\n\nexport async function exportCatalog(options: Omit<ExportOptions, 'resource'>): Promise<string> {\n const { hydrate = false, stdout = false, playground = false, output, dir } = options;\n\n const sdk = createSDK(dir);\n const dslParts: string[] = [];\n\n for (const type of RESOURCE_TYPES) {\n const fetcher = getCollectionFetcher(sdk, type);\n const resources = await fetcher({ latestOnly: true });\n if (!resources || resources.length === 0) continue;\n const rawDsl = await sdk.toDSL(resources, { type, hydrate });\n dslParts.push(rawDsl);\n }\n\n if (dslParts.length === 0) {\n throw new Error(`No resources found in catalog at '${dir}'`);\n }\n\n const combined = dslParts.join('\\n\\n');\n const grouped = groupDSLBlocks(combined);\n const vizBlock = buildVisualizerBlock(grouped, 'Full Catalog', [...RESOURCE_TYPES]);\n const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n if (stdout) {\n return dsl;\n }\n\n const filename = output || 'catalog.ec';\n const filepath = resolve(filename);\n writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n const lines = ['', ` Exported full catalog to ${filepath}`];\n\n if (playground) {\n const encoded = Buffer.from(dsl).toString('base64');\n const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in playground...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in the playground`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nexport async function exportAll(options: ExportOptions): Promise<string> {\n const { resource, hydrate = false, stdout = false, playground = false, output, dir } = options;\n\n const type = normalizeResourceType(resource);\n if (!RESOURCE_TYPES.includes(type)) {\n throw new Error(`Invalid resource type '${resource}'. Must be one of: ${RESOURCE_TYPES.join(', ')}`);\n }\n\n const plural = pluralize(type);\n const sdk = createSDK(dir);\n\n const fetcher = getCollectionFetcher(sdk, type);\n const allResources = (await fetcher({ latestOnly: true })) || [];\n\n if (allResources.length === 0) {\n throw new Error(`No ${plural} found in catalog at '${dir}'`);\n }\n\n const rawDsl = await sdk.toDSL(allResources, { type, hydrate });\n const grouped = groupDSLBlocks(rawDsl);\n const vizBlock = buildVisualizerBlock(grouped, `All ${plural}`, type);\n const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n if (stdout) {\n return dsl;\n }\n\n const filename = output || `${plural}.ec`;\n const filepath = resolve(filename);\n writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n const lines = ['', ` Exported ${allResources.length} ${plural} to ${filepath}`];\n\n if (playground) {\n const encoded = Buffer.from(dsl).toString('base64');\n const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in playground...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in the playground`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nexport async function exportResource(options: ExportOptions): Promise<string> {\n const { resource, id, version, hydrate = false, stdout = false, playground = false, output, dir } = options;\n\n if (!id) {\n return exportAll(options);\n }\n\n const type = normalizeResourceType(resource);\n if (!RESOURCE_TYPES.includes(type)) {\n throw new Error(`Invalid resource type '${resource}'. Must be one of: ${RESOURCE_TYPES.join(', ')}`);\n }\n\n const sdk = createSDK(dir);\n\n const fetcher = getResourceFetcher(sdk, type);\n const data = await fetcher(id, version);\n\n if (!data) {\n const versionStr = version ? `@${version}` : ' (latest)';\n throw new Error(`${resource} '${id}${versionStr}' not found in catalog at '${dir}'`);\n }\n\n const rawDsl = await sdk.toDSL(data, { type, hydrate });\n const grouped = hydrate ? groupDSLBlocks(rawDsl) : rawDsl;\n const vizBlock = buildVisualizerBlock(grouped, `View of ${id}`, type);\n const dsl = vizBlock ? `${grouped}\\n${vizBlock}` : grouped;\n\n if (stdout) {\n return dsl;\n }\n\n const filename = output || `${id}.ec`;\n const filepath = resolve(filename);\n writeFileSync(filepath, dsl + '\\n', 'utf-8');\n\n const lines = ['', ` Exported ${type} '${id}' to ${filepath}`];\n\n if (playground) {\n const encoded = Buffer.from(dsl).toString('base64');\n const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in playground...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in the playground`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n","import { readFileSync, existsSync, mkdirSync, writeFileSync, copyFileSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { createInterface } from 'node:readline';\nimport matter from 'gray-matter';\nimport createSDK from '@eventcatalog/sdk';\n\nexport interface ImportOptions {\n files?: string[];\n stdin?: boolean;\n dryRun?: boolean;\n flat?: boolean;\n noInit?: boolean;\n dir: string;\n}\n\ninterface ParsedResource {\n type: string;\n id: string;\n version?: string;\n frontmatter: Record<string, any>;\n markdown: string;\n path: string;\n}\n\ninterface ImportResult {\n created: string[];\n updated: string[];\n versioned: string[];\n errors: string[];\n}\n\nconst RESOURCE_TYPE_FROM_FOLDER: Record<string, string> = {\n events: 'event',\n commands: 'command',\n queries: 'query',\n services: 'service',\n domains: 'domain',\n channels: 'channel',\n flows: 'flow',\n containers: 'container',\n 'data-products': 'dataProduct',\n diagrams: 'diagram',\n users: 'user',\n teams: 'team',\n};\n\nasync function parseDSL(source: string, options?: { nested?: boolean }): Promise<{ path: string; content: string }[]> {\n const { createEcServices, compile } = await import('@eventcatalog/language-server');\n const { EmptyFileSystem, URI } = await import('langium');\n\n const services = createEcServices(EmptyFileSystem);\n const uri = URI.parse(`file:///import-${Date.now()}.ec`);\n const document = services.shared.workspace.LangiumDocumentFactory.fromString(source, uri);\n services.shared.workspace.LangiumDocuments.addDocument(document);\n await services.shared.workspace.DocumentBuilder.build([document]);\n\n const parserErrors = document.parseResult.parserErrors;\n if (parserErrors.length > 0) {\n const messages = parserErrors.map((e: any) => ` Line ${e.token?.startLine ?? '?'}: ${e.message}`);\n throw new Error(`Parse errors:\\n${messages.join('\\n')}`);\n }\n\n const program = document.parseResult.value;\n const outputs = compile(program, { nested: options?.nested });\n\n try {\n services.shared.workspace.LangiumDocuments.deleteDocument(uri);\n } catch {\n // Ignore cleanup errors\n }\n\n return outputs;\n}\n\n/**\n * Extract the resource type folder from a path that may be nested.\n * e.g. \"events/OrderCreated/...\" → \"events\"\n * e.g. \"domains/Payment/services/OrderService/...\" → \"services\"\n * e.g. \"domains/Payment/services/OrderService/events/X/...\" → \"events\"\n * e.g. \"users/jdoe.md\" → \"users\"\n *\n * Walk the segments and return the last known resource-type folder.\n */\nfunction extractResourceTypeFolder(path: string): string {\n const segments = path.split('/');\n let lastTypeFolder = segments[0];\n for (const seg of segments) {\n if (RESOURCE_TYPE_FROM_FOLDER[seg]) {\n lastTypeFolder = seg;\n }\n }\n return lastTypeFolder;\n}\n\nfunction parseCompiledOutput(output: { path: string; content: string }): ParsedResource {\n const { data: frontmatter, content: markdown } = matter(output.content);\n\n const typeFolder = extractResourceTypeFolder(output.path);\n const type = RESOURCE_TYPE_FROM_FOLDER[typeFolder] || typeFolder;\n\n return {\n type,\n id: frontmatter.id,\n version: frontmatter.version,\n frontmatter,\n markdown: markdown.trim(),\n path: output.path,\n };\n}\n\nconst MESSAGE_TYPE_FOLDER: Record<string, string> = {\n event: 'events',\n command: 'commands',\n query: 'queries',\n channel: 'channels',\n};\n\nconst DEFAULT_STUB_VERSION = '0.0.1';\n\n/**\n * Extract message stubs from service sends/receives that weren't compiled as standalone resources.\n * Uses the DSL AST to determine message types accurately.\n */\nasync function extractMessageStubs(source: string, compiledIds: Set<string>, nested: boolean = false): Promise<ParsedResource[]> {\n const { createEcServices } = await import('@eventcatalog/language-server');\n const { EmptyFileSystem, URI } = await import('langium');\n\n const services = createEcServices(EmptyFileSystem);\n const uri = URI.parse(`file:///stub-extract-${Date.now()}.ec`);\n const document = services.shared.workspace.LangiumDocumentFactory.fromString(source, uri);\n services.shared.workspace.LangiumDocuments.addDocument(document);\n await services.shared.workspace.DocumentBuilder.build([document]);\n\n const program = document.parseResult.value as any;\n const stubs: ParsedResource[] = [];\n const stubIds = new Set<string>();\n\n function processDefinitions(definitions: any[], parentPath: string = '') {\n for (const def of definitions) {\n // Handle visualizer wrappers\n if (def.$type === 'VisualizerDef' && def.body) {\n processDefinitions(def.body, parentPath);\n continue;\n }\n\n // Handle domains — recurse into their services with domain parentPath\n if (def.$type === 'DomainDef') {\n const domainPath = nested ? `domains/${def.name}` : '';\n const domainBody = def.body || [];\n\n // Process services inside the domain\n const domainServices = domainBody.filter((d: any) => d.$type === 'ServiceDef');\n processDefinitions(domainServices, domainPath);\n\n // Process subdomains\n const subdomains = domainBody.filter((d: any) => d.$type === 'SubdomainDef');\n for (const sub of subdomains) {\n const subPath = nested ? `domains/${def.name}/subdomains/${sub.name}` : '';\n const subServices = (sub.body || []).filter((d: any) => d.$type === 'ServiceDef');\n processDefinitions(subServices, subPath);\n }\n continue;\n }\n\n if (def.$type !== 'ServiceDef') continue;\n\n const servicePath = nested ? (parentPath ? `${parentPath}/services/${def.name}` : `services/${def.name}`) : '';\n\n const body = def.body || [];\n for (const stmt of body) {\n if (stmt.$type !== 'SendsStmt' && stmt.$type !== 'ReceivesStmt') continue;\n\n const msgType = stmt.messageType; // 'event', 'command', or 'query'\n const msgName = stmt.messageName;\n const hasBody = stmt.body && stmt.body.length > 0;\n\n if (hasBody) continue; // Inline definition — compiler already handled it\n\n const key = `${msgType}:${msgName}`;\n if (compiledIds.has(key) || stubIds.has(key)) continue;\n\n const folder = MESSAGE_TYPE_FOLDER[msgType];\n if (!folder) continue;\n\n const version = stmt.version || DEFAULT_STUB_VERSION;\n\n const stubFolder = nested && servicePath ? `${servicePath}/${folder}` : folder;\n\n stubIds.add(key);\n stubs.push({\n type: msgType,\n id: msgName,\n version,\n frontmatter: {\n id: msgName,\n name: msgName,\n version,\n },\n markdown: '',\n path: `${stubFolder}/${msgName}/versioned/${version}/index.md`,\n });\n\n // Create channel stubs for to/from references\n if (stmt.channelClause) {\n const channels = stmt.channelClause.channels || [];\n for (const ch of channels) {\n const chName = ch.channelName;\n const chKey = `channel:${chName}`;\n if (compiledIds.has(chKey) || stubIds.has(chKey)) continue;\n\n const chVersion = ch.channelVersion || DEFAULT_STUB_VERSION;\n const chFolder = nested && parentPath ? `${parentPath}/channels` : 'channels';\n stubIds.add(chKey);\n stubs.push({\n type: 'channel',\n id: chName,\n version: chVersion,\n frontmatter: {\n id: chName,\n name: chName,\n version: chVersion,\n },\n markdown: '',\n path: `${chFolder}/${chName}/versioned/${chVersion}/index.md`,\n });\n }\n }\n }\n }\n }\n\n processDefinitions(program.definitions);\n\n try {\n services.shared.workspace.LangiumDocuments.deleteDocument(uri);\n } catch {\n // Ignore cleanup errors\n }\n\n return stubs;\n}\n\n/**\n * Map resource type to the base folder used by the SDK writer.\n * The SDK creates writers with type-prefixed directories, e.g.\n * writeService → catalogDir/services/\n * writeEvent → catalogDir/events/\n * So any custom path must be relative to that base.\n */\nconst SDK_WRITER_BASE: Record<string, string> = {\n event: 'events',\n command: 'commands',\n query: 'queries',\n service: 'services',\n domain: 'domains',\n channel: 'channels',\n container: 'containers',\n team: 'teams',\n user: 'users',\n};\n\n/**\n * Extract the SDK-compatible path option from a compiler output path.\n * The SDK writer already prefixes with the type folder, so we need to\n * return a path relative to that base.\n *\n * e.g. for type \"service\":\n * \"services/OrderService/versioned/1.0.0/index.md\" → \"\" (default behavior)\n * \"domains/Payment/services/OrderService/versioned/1.0.0/index.md\"\n * → \"../domains/Payment/services/OrderService\"\n *\n * Returns empty string when the resource is at its default location.\n */\nfunction extractSdkPath(compiledPath: string, resourceType: string): string {\n // Strip versioned/X/index.md or index.md or .md suffix\n const dirPath = compiledPath\n .replace(/\\/versioned\\/[^/]+\\/index\\.md$/, '')\n .replace(/\\/index\\.md$/, '')\n .replace(/\\.md$/, '');\n\n const baseFolder = SDK_WRITER_BASE[resourceType];\n if (!baseFolder) return '';\n\n // If path starts with the type's default folder, strip it\n // e.g. \"services/OrderService\" → \"OrderService\" (default SDK behavior handles this)\n if (dirPath.startsWith(`${baseFolder}/`)) {\n const relative = dirPath.slice(baseFolder.length + 1);\n // If it's just the resource name (no nesting), return empty to use default\n if (!relative.includes('/')) return '';\n return relative;\n }\n\n // Path is nested under a different folder (e.g. domains/X/services/Y)\n // Need to go up one level from the SDK writer's base directory\n return `../${dirPath}`;\n}\n\nconst TYPES_WITH_NODE_GRAPH = new Set(['event', 'command', 'query', 'service', 'domain', 'channel', 'flow']);\n\ntype SDK = ReturnType<typeof createSDK>;\n\nfunction getWriter(sdk: SDK, type: string): ((resource: any, options?: any) => Promise<void>) | null {\n switch (type) {\n case 'event':\n return sdk.writeEvent;\n case 'command':\n return sdk.writeCommand;\n case 'query':\n return sdk.writeQuery;\n case 'service':\n return sdk.writeService;\n case 'domain':\n return sdk.writeDomain;\n case 'channel':\n return sdk.writeChannel;\n case 'team':\n return sdk.writeTeam;\n case 'user':\n return sdk.writeUser;\n default:\n return null;\n }\n}\n\nfunction getReader(sdk: SDK, type: string): ((id: string, version?: string) => Promise<any>) | null {\n switch (type) {\n case 'event':\n return sdk.getEvent;\n case 'command':\n return sdk.getCommand;\n case 'query':\n return sdk.getQuery;\n case 'service':\n return sdk.getService;\n case 'domain':\n return sdk.getDomain;\n case 'channel':\n return sdk.getChannel;\n case 'team':\n return sdk.getTeam;\n case 'user':\n return sdk.getUser;\n default:\n return null;\n }\n}\n\nexport function promptConfirm(message: string): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n rl.question(`${message} `, (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n resolve(normalized === '' || normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\nexport function promptInput(message: string, defaultValue: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n rl.question(`${message} `, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue);\n });\n });\n}\n\nexport function initCatalog(dir: string, organizationName: string = 'My Organization'): void {\n const catalogDir = resolve(dir);\n mkdirSync(catalogDir, { recursive: true });\n\n // package.json\n const packageJson = {\n name: 'my-catalog',\n version: '0.1.0',\n private: true,\n scripts: {\n dev: 'eventcatalog dev',\n build: 'eventcatalog build',\n start: 'eventcatalog start',\n preview: 'eventcatalog preview',\n generate: 'eventcatalog generate',\n lint: 'eventcatalog-linter',\n test: 'echo \"Error: no test specified\" && exit 1',\n },\n dependencies: {\n '@eventcatalog/core': 'latest',\n '@eventcatalog/linter': 'latest',\n },\n };\n writeFileSync(join(catalogDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n\n // eventcatalog.config.js\n const cId = randomUUID();\n const config = `/** @type {import('@eventcatalog/core/bin/eventcatalog.config').Config} */\nexport default {\n title: 'EventCatalog',\n tagline: 'Discover, Explore and Document your Event Driven Architectures',\n organizationName: '${organizationName}',\n homepageLink: 'https://eventcatalog.dev/',\n output: 'static',\n trailingSlash: false,\n base: '/',\n logo: {\n alt: 'EventCatalog Logo',\n src: '/logo.png',\n text: 'EventCatalog',\n },\n cId: '${cId}',\n};\n`;\n writeFileSync(join(catalogDir, 'eventcatalog.config.js'), config, 'utf-8');\n\n // .gitignore\n const gitignore = `# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.astro\nout\ndist\n\n# Misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n.eventcatalog-core\n\n.env\n.env-*\n`;\n writeFileSync(join(catalogDir, '.gitignore'), gitignore, 'utf-8');\n\n // .env\n const envFile = `# EventCatalog Scale License Key, if you want to unlock the scale features\n# You can get a 14 day trial license key from https://eventcatalog.cloud\n\nEVENTCATALOG_SCALE_LICENSE_KEY=\n\n# Optional key if you are using EventCatalog Chat with OpenAI Models.\n# You need to set \\`output\\` to \\`server\\` in your eventcatalog.config.js file.\n# See documentation for more details: https://www.eventcatalog.dev/features/ai-assistant\nOPENAI_API_KEY=\n`;\n writeFileSync(join(catalogDir, '.env'), envFile, 'utf-8');\n\n // .npmrc\n writeFileSync(join(catalogDir, '.npmrc'), 'strict-peer-dependencies=false\\n', 'utf-8');\n\n // public/logo.png\n mkdirSync(join(catalogDir, 'public'), { recursive: true });\n copyFileSync(join(__dirname, 'logo.png'), join(catalogDir, 'public', 'logo.png'));\n}\n\nexport async function importDSL(options: ImportOptions): Promise<string> {\n const { files, stdin = false, dryRun = false, flat = false, noInit = false, dir } = options;\n const nested = !flat;\n\n let source: string;\n\n if (stdin) {\n source = await readStdin();\n } else if (files && files.length > 0) {\n const parts: string[] = [];\n for (const file of files) {\n const filepath = resolve(file);\n if (!existsSync(filepath)) {\n throw new Error(`File not found: ${filepath}`);\n }\n parts.push(readFileSync(filepath, 'utf-8'));\n }\n source = parts.join('\\n\\n');\n } else {\n throw new Error('Either provide .ec file paths or use --stdin');\n }\n\n if (!source.trim()) {\n throw new Error('No DSL content to import');\n }\n\n // Check if catalog needs initialization\n const catalogDir = resolve(dir);\n let didInit = false;\n if (!noInit && !existsSync(join(catalogDir, 'eventcatalog.config.js')) && process.stdin.isTTY) {\n const confirmed = await promptConfirm(`Initialize a new EventCatalog at ${catalogDir}? (Y/n)`);\n if (confirmed) {\n const organizationName = await promptInput('Organization name (My Organization):', 'My Organization');\n initCatalog(dir, organizationName);\n didInit = true;\n }\n }\n\n const outputs = await parseDSL(source, { nested });\n\n if (outputs.length === 0) {\n throw new Error('No resources found in DSL content');\n }\n\n const sdk = createSDK(catalogDir);\n const result: ImportResult = { created: [], updated: [], versioned: [], errors: [] };\n\n const resources = outputs.map(parseCompiledOutput);\n\n // Create stub resources for referenced messages that weren't compiled as standalone\n const compiledIds = new Set(resources.map((r) => `${r.type}:${r.id}`));\n const stubs = await extractMessageStubs(source, compiledIds, nested);\n resources.push(...stubs);\n\n for (const resource of resources) {\n const label = resource.version ? `${resource.type} ${resource.id}@${resource.version}` : `${resource.type} ${resource.id}`;\n\n if (dryRun) {\n const reader = getReader(sdk, resource.type);\n if (reader) {\n const existing = await reader(resource.id, resource.version).catch(() => undefined);\n if (existing) {\n result.updated.push(label);\n } else {\n const latest = await reader(resource.id).catch(() => undefined);\n if (latest && latest.version && latest.version !== resource.version) {\n result.versioned.push(`${resource.type} ${resource.id}@${latest.version}`);\n }\n result.created.push(label);\n }\n } else {\n result.created.push(label);\n }\n continue;\n }\n\n const writer = getWriter(sdk, resource.type);\n if (!writer) {\n result.errors.push(`${label}: unsupported resource type '${resource.type}'`);\n continue;\n }\n\n try {\n const reader = getReader(sdk, resource.type);\n const existing = reader ? await reader(resource.id, resource.version).catch(() => undefined) : undefined;\n\n let markdown = resource.markdown;\n\n // Add <NodeGraph /> to markdown for newly created resources (not updates)\n if (!existing && TYPES_WITH_NODE_GRAPH.has(resource.type)) {\n markdown = markdown ? `${markdown}\\n\\n<NodeGraph />` : '<NodeGraph />';\n }\n\n const resourceData = {\n ...resource.frontmatter,\n markdown,\n };\n\n // If resource already exists, write with default SDK behavior (existing location).\n // For new resources in nested mode, extract directory from compiler path.\n const writeOptions: Record<string, any> = {\n override: true,\n versionExistingContent: true,\n };\n\n if (!existing && nested) {\n const sdkPath = extractSdkPath(resource.path, resource.type);\n if (sdkPath) {\n writeOptions.path = sdkPath;\n }\n }\n\n await writer(resourceData, writeOptions);\n\n if (existing) {\n result.updated.push(label);\n } else {\n result.created.push(label);\n }\n } catch (error) {\n result.errors.push(`${label}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n let output = formatResult(result, dryRun);\n if (didInit) {\n output += ` Tip: Run 'npm install' in ${catalogDir} to install dependencies\\n`;\n }\n return output;\n}\n\n// ANSI color helpers\nconst c = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\nconst TYPE_CONFIG: Record<string, { color: string; label: string; order: number }> = {\n domain: { color: c.magenta, label: 'domain', order: 0 },\n service: { color: c.blue, label: 'service', order: 1 },\n event: { color: c.green, label: 'event', order: 2 },\n command: { color: c.yellow, label: 'command', order: 3 },\n query: { color: c.cyan, label: 'query', order: 4 },\n channel: { color: c.gray, label: 'channel', order: 5 },\n flow: { color: c.white, label: 'flow', order: 6 },\n user: { color: c.blue, label: 'user', order: 7 },\n team: { color: c.blue, label: 'team', order: 8 },\n};\n\nconst DEFAULT_TYPE_CONFIG = { color: c.white, label: 'resource', order: 99 };\n\n/**\n * Parse a label like \"event OrderCreated@1.0.0\" into { type, name }.\n */\nfunction parseLabel(label: string): { type: string; name: string } {\n const spaceIdx = label.indexOf(' ');\n if (spaceIdx === -1) return { type: '', name: label };\n return { type: label.slice(0, spaceIdx), name: label.slice(spaceIdx + 1) };\n}\n\n/**\n * Group labels by resource type, sorted by type order then alphabetically.\n */\nfunction groupByType(labels: string[]): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n for (const label of labels) {\n const { type, name } = parseLabel(label);\n if (!groups.has(type)) groups.set(type, []);\n groups.get(type)!.push(name);\n }\n const sorted = new Map(\n [...groups.entries()].sort((a, b) => {\n const orderA = (TYPE_CONFIG[a[0]] || DEFAULT_TYPE_CONFIG).order;\n const orderB = (TYPE_CONFIG[b[0]] || DEFAULT_TYPE_CONFIG).order;\n return orderA - orderB;\n })\n );\n for (const [, names] of sorted) {\n names.sort();\n }\n return sorted;\n}\n\n/**\n * Format a type badge like \" event \" with background color.\n */\nfunction typeBadge(type: string): string {\n const cfg = TYPE_CONFIG[type] || DEFAULT_TYPE_CONFIG;\n const padded = ` ${cfg.label} `;\n // Use reverse video for a \"badge\" effect: swaps fg/bg\n return `${cfg.color}\\x1b[7m${padded}${c.reset}`;\n}\n\nfunction formatResourceList(labels: string[]): string[] {\n const lines: string[] = [];\n const groups = groupByType(labels);\n\n for (const [type, names] of groups) {\n const cfg = TYPE_CONFIG[type] || DEFAULT_TYPE_CONFIG;\n const plural = names.length === 1 ? cfg.label : `${cfg.label}s`;\n lines.push('');\n lines.push(` ${typeBadge(type)} ${c.dim}${names.length} ${plural}${c.reset}`);\n for (const name of names) {\n lines.push(` ${cfg.color}│${c.reset} ${name}`);\n }\n }\n return lines;\n}\n\nfunction formatResult(result: ImportResult, dryRun: boolean): string {\n const lines: string[] = [''];\n const prefix = dryRun ? `${c.yellow}${c.bold}DRY RUN${c.reset} ` : '';\n const total = result.created.length + result.updated.length + result.versioned.length;\n\n if (total > 0 || result.errors.length > 0) {\n lines.push(` ${prefix}${c.bold}Import complete${c.reset}`);\n lines.push(` ${c.dim}${'─'.repeat(40)}${c.reset}`);\n }\n\n if (result.created.length > 0) {\n const verb = dryRun ? 'Would create' : 'Created';\n lines.push('');\n lines.push(` ${c.green}${c.bold}+ ${verb} ${result.created.length} resource(s)${c.reset}`);\n lines.push(...formatResourceList(result.created));\n }\n\n if (result.updated.length > 0) {\n const verb = dryRun ? 'Would update' : 'Updated';\n lines.push('');\n lines.push(` ${c.blue}${c.bold}~ ${verb} ${result.updated.length} resource(s)${c.reset}`);\n lines.push(...formatResourceList(result.updated));\n }\n\n if (result.versioned.length > 0) {\n const verb = dryRun ? 'Would version' : 'Versioned';\n lines.push('');\n lines.push(` ${c.yellow}${c.bold}↑ ${verb} ${result.versioned.length} existing resource(s)${c.reset}`);\n lines.push(...formatResourceList(result.versioned));\n }\n\n if (result.errors.length > 0) {\n lines.push('');\n lines.push(` ${c.red}${c.bold}✘ ${result.errors.length} error(s)${c.reset}`);\n for (const e of result.errors) {\n lines.push(` ${c.red}│${c.reset} ${c.red}${e}${c.reset}`);\n }\n }\n\n if (result.created.length === 0 && result.updated.length === 0 && result.errors.length === 0) {\n lines.push(` ${c.dim}No resources to write.${c.reset}`);\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk) => chunks.push(chunk));\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n process.stdin.on('error', reject);\n });\n}\n"],"mappings":"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","names":["readFileSync","resolve","createSDK","createSDK","createSDK","version","existsSync","writeFileSync","resolve","createSDK","program","path","version","resolve","readFileSync","result"]}
Binary file
package/dist/cli-docs.js CHANGED
@@ -1651,6 +1651,37 @@ var cliFunctions = [
1651
1651
  command: "npx @eventcatalog/cli export --resource services --hydrate --playground"
1652
1652
  }
1653
1653
  ]
1654
+ },
1655
+ // ================================
1656
+ // Import
1657
+ // ================================
1658
+ {
1659
+ name: "import",
1660
+ description: "Import EventCatalog DSL (.ec) files into catalog markdown files. Existing resources with the same version are overridden. Importing a newer version automatically moves the old version into the versioned/ folder.",
1661
+ category: "Import",
1662
+ args: [
1663
+ { name: "files", type: "string", required: false, description: "One or more .ec file paths to import" },
1664
+ { name: "stdin", type: "boolean", required: false, description: "Read DSL from stdin" },
1665
+ { name: "dry-run", type: "boolean", required: false, description: "Preview resources without writing" }
1666
+ ],
1667
+ examples: [
1668
+ {
1669
+ description: "Import a single .ec file",
1670
+ command: "npx @eventcatalog/cli import catalog.ec"
1671
+ },
1672
+ {
1673
+ description: "Import multiple .ec files",
1674
+ command: "npx @eventcatalog/cli import services.ec events.ec"
1675
+ },
1676
+ {
1677
+ description: "Import from stdin (pipe from export)",
1678
+ command: "npx @eventcatalog/cli export --all --stdout | npx @eventcatalog/cli import --stdin -d ./new-catalog"
1679
+ },
1680
+ {
1681
+ description: "Preview what would be written or merged",
1682
+ command: "npx @eventcatalog/cli import catalog.ec --dry-run"
1683
+ }
1684
+ ]
1654
1685
  }
1655
1686
  ];
1656
1687
  function getCategories() {