@eventcatalog/cli 0.4.0 → 0.4.3

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/dist/cli/index.js CHANGED
@@ -325,9 +325,9 @@ ${vizBlock}` : grouped;
325
325
  const encoded = Buffer.from(dsl).toString("base64");
326
326
  const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;
327
327
  await (0, import_open.default)(playgroundUrl);
328
- lines.push("", ` Opening in EventCatalog Modelling...`);
328
+ lines.push("", ` Opening in EventCatalog Canvas...`);
329
329
  } else {
330
- lines.push("", ` Tip: Use --playground to open in EventCatalog Modelling`);
330
+ lines.push("", ` Tip: Use --playground to open in EventCatalog Canvas`);
331
331
  }
332
332
  lines.push("");
333
333
  return lines.join("\n");
@@ -359,9 +359,9 @@ ${vizBlock}` : grouped;
359
359
  const encoded = Buffer.from(dsl).toString("base64");
360
360
  const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;
361
361
  await (0, import_open.default)(playgroundUrl);
362
- lines.push("", ` Opening in EventCatalog Modelling...`);
362
+ lines.push("", ` Opening in EventCatalog Canvas...`);
363
363
  } else {
364
- lines.push("", ` Tip: Use --playground to open in EventCatalog Modelling`);
364
+ lines.push("", ` Tip: Use --playground to open in EventCatalog Canvas`);
365
365
  }
366
366
  lines.push("");
367
367
  return lines.join("\n");
@@ -397,9 +397,9 @@ ${vizBlock}` : grouped;
397
397
  const encoded = Buffer.from(dsl).toString("base64");
398
398
  const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;
399
399
  await (0, import_open.default)(playgroundUrl);
400
- lines.push("", ` Opening in EventCatalog Modelling...`);
400
+ lines.push("", ` Opening in EventCatalog Canvas...`);
401
401
  } else {
402
- lines.push("", ` Tip: Use --playground to open in EventCatalog Modelling`);
402
+ lines.push("", ` Tip: Use --playground to open in EventCatalog Canvas`);
403
403
  }
404
404
  lines.push("");
405
405
  return lines.join("\n");
@@ -434,6 +434,9 @@ function normalizeImportedFrontmatter(type, frontmatter) {
434
434
  normalized.access_mode = normalized.accessMode;
435
435
  delete normalized.accessMode;
436
436
  }
437
+ if (!normalized.container_type) {
438
+ normalized.container_type = "database";
439
+ }
437
440
  }
438
441
  return normalized;
439
442
  }
@@ -1176,7 +1179,7 @@ import_commander.program.command("list").description("List all available SDK fun
1176
1179
  process.exit(1);
1177
1180
  }
1178
1181
  });
1179
- import_commander.program.command("export").description("Export a catalog resource to EventCatalog DSL (.ec) format").option("-a, --all", "Export the entire catalog (all resource types)", false).option("-r, --resource <type>", "Resource type (event, command, query, service, domain)").option("--id <id>", "Resource ID (omit to export all resources of the given type)").option("-v, --version <version>", "Resource version (defaults to latest)").option("--hydrate", "Include referenced resources (messages, channels, owners)", false).option("--stdout", "Print to stdout instead of writing a file", false).option("--playground", "Open the exported DSL in EventCatalog Modelling", false).option("-o, --output <path>", "Output file path (defaults to <id>.ec or catalog.ec)").action(async (opts) => {
1182
+ import_commander.program.command("export").description("Export a catalog resource to EventCatalog DSL (.ec) format").option("-a, --all", "Export the entire catalog (all resource types)", false).option("-r, --resource <type>", "Resource type (event, command, query, service, domain)").option("--id <id>", "Resource ID (omit to export all resources of the given type)").option("-v, --version <version>", "Resource version (defaults to latest)").option("--hydrate", "Include referenced resources (messages, channels, owners)", false).option("--stdout", "Print to stdout instead of writing a file", false).option("--playground", "Open the exported DSL in EventCatalog Canvas", false).option("-o, --output <path>", "Output file path (defaults to <id>.ec or catalog.ec)").action(async (opts) => {
1180
1183
  try {
1181
1184
  const globalOpts = import_commander.program.opts();
1182
1185
  const dir = globalOpts.dir || ".";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/executor.ts","../../src/cli/parser.ts","../../src/cli/list.ts","../../src/cli/export.ts","../../src/cli/import.ts","../../src/cli/dsl-managed-keys.ts"],"sourcesContent":["#!/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 EventCatalog Modelling', 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];\nconst SUPPORTED_RESOURCE_TYPES = RESOURCE_TYPES.join(', ');\n\nconst PLURAL_MAP: Record<string, ResourceType> = {\n events: 'event',\n commands: 'command',\n queries: 'query',\n services: 'service',\n domains: 'domain',\n};\n\nconst KNOWN_UNSUPPORTED_EXPORT_TYPES = new Set([\n 'channel',\n 'channels',\n 'team',\n 'teams',\n 'user',\n 'users',\n 'container',\n 'containers',\n 'data-product',\n 'data-products',\n 'dataproduct',\n 'dataproducts',\n 'diagram',\n 'diagrams',\n 'flow',\n 'flows',\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 assertSupportedExportType(resource: string, type: ResourceType): void {\n const lower = resource.toLowerCase();\n\n if (KNOWN_UNSUPPORTED_EXPORT_TYPES.has(lower)) {\n throw new Error(\n `Resource type '${resource}' is not yet supported for DSL export. Supported types: ${SUPPORTED_RESOURCE_TYPES}`\n );\n }\n\n if (!RESOURCE_TYPES.includes(type)) {\n throw new Error(`Invalid resource type '${resource}'. Must be one of: ${SUPPORTED_RESOURCE_TYPES}`);\n }\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\n/**\n * Groups DSL blocks by resource type and orders them with section headers.\n *\n * Raw toDSL output may interleave different resource types (e.g. teams, channels,\n * services, events). This splits on blank lines, buckets each block by its leading\n * keyword, then reassembles in SECTION_ORDER with \"// EVENTS\" style headers.\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\ninterface ResourceDefinition {\n keyword: string;\n id: string;\n version?: string;\n}\n\n/**\n * Extracts resource definitions from DSL text by scanning for top-level\n * `<keyword> <id> {` lines and reading the version from the block body.\n */\nfunction extractResourceDefinitions(dsl: string, filterTypes: string[]): ResourceDefinition[] {\n const results: ResourceDefinition[] = [];\n const lines = dsl.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimStart();\n const parts = trimmed.split(/\\s/);\n const keyword = parts[0];\n const id = parts[1];\n if (!filterTypes.includes(keyword)) continue;\n if (!id || !trimmed.endsWith('{')) continue;\n\n // Look ahead inside the block for a `version X.Y.Z` line\n let version: string | undefined;\n for (let j = i + 1; j < lines.length; j++) {\n const inner = lines[j].trim();\n if (inner === '}') break;\n const vMatch = inner.match(/^version\\s+(.+)$/);\n if (vMatch) {\n version = vMatch[1];\n break;\n }\n }\n results.push({ keyword, id, version });\n }\n\n return results;\n}\n\n/**\n * Builds a `visualizer main { ... }` block listing all resource definitions\n * found in the DSL output.\n *\n * When multiple versions of the same resource exist (e.g. two versions of\n * OrderService), references are version-qualified (`service OrderService@1.0.0`)\n * to avoid ambiguity. Single-version resources use bare ids.\n */\nfunction buildVisualizerBlock(dsl: string, name: string, filterTypes: ResourceType | ResourceType[]): string {\n const types = Array.isArray(filterTypes) ? filterTypes : [filterTypes];\n const definitions = extractResourceDefinitions(dsl, types);\n\n if (definitions.length === 0) return '';\n\n // Count occurrences of each keyword+id to detect duplicates needing version qualification\n const counts = new Map<string, number>();\n for (const def of definitions) {\n const key = `${def.keyword}:${def.id}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n\n const entries = definitions.map((def) => {\n const key = `${def.keyword}:${def.id}`;\n const needsVersion = (counts.get(key) || 0) > 1 && def.version;\n const ref = needsVersion ? `${def.id}@${def.version}` : def.id;\n return ` ${def.keyword} ${ref}`;\n });\n\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 // Independent collection fetches/conversions can run in parallel.\n // Promise.all preserves RESOURCE_TYPES order in the resulting array.\n const dslParts = (\n await Promise.all(\n RESOURCE_TYPES.map(async (type) => {\n const fetcher = getCollectionFetcher(sdk, type);\n const resources = await fetcher({ latestOnly: true });\n if (!resources || resources.length === 0) return '';\n return sdk.toDSL(resources, { type, hydrate });\n })\n )\n ).filter((dsl): dsl is string => Boolean(dsl));\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 EventCatalog Modelling...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Modelling`);\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 assertSupportedExportType(resource, type);\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 EventCatalog Modelling...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Modelling`);\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 assertSupportedExportType(resource, type);\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\n // When hydrating, toDSL pulls in related resources (services, channels, owners)\n // so we group by type with section headers and widen the visualizer filter to\n // include all resource types that may appear in the hydrated output.\n const grouped = hydrate ? groupDSLBlocks(rawDsl) : rawDsl;\n const vizTypes: ResourceType[] = hydrate ? [...RESOURCE_TYPES] : [type];\n const vizBlock = buildVisualizerBlock(grouped, `View of ${id}`, vizTypes);\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 EventCatalog Modelling...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Modelling`);\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';\nimport { DSL_MANAGED_KEYS_BY_TYPE } from './dsl-managed-keys';\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\nfunction normalizeImportedFrontmatter(type: string, frontmatter: Record<string, any>): Record<string, any> {\n const normalized = { ...frontmatter };\n\n // SDK/container schema uses snake_case fields.\n if (type === 'container') {\n if (normalized.container_type === undefined && normalized.containerType !== undefined) {\n normalized.container_type = normalized.containerType;\n delete normalized.containerType;\n }\n if (normalized.access_mode === undefined && normalized.accessMode !== undefined) {\n normalized.access_mode = normalized.accessMode;\n delete normalized.accessMode;\n }\n }\n\n return normalized;\n}\n\nfunction toFrontmatter(resource: any): Record<string, any> {\n if (!resource || typeof resource !== 'object') return {};\n const { markdown: _markdown, ...frontmatter } = resource;\n return frontmatter;\n}\n\nfunction mergeImportedFrontmatter(\n type: string,\n incomingFrontmatter: Record<string, any>,\n existing?: any,\n latest?: any\n): Record<string, any> {\n const normalizedIncoming = normalizeImportedFrontmatter(type, incomingFrontmatter);\n const managedKeys = DSL_MANAGED_KEYS_BY_TYPE[type];\n\n if (!managedKeys) {\n return normalizedIncoming;\n }\n\n const baseFrontmatter = toFrontmatter(existing ?? latest);\n const preservedFrontmatter = { ...baseFrontmatter };\n\n for (const key of managedKeys) {\n delete preservedFrontmatter[key];\n }\n\n return {\n ...preservedFrontmatter,\n ...normalizedIncoming,\n };\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(\n source: string,\n options?: { nested?: boolean }\n): Promise<{ outputs: { path: string; content: string }[]; program: any }> {\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, program };\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';\nconst NO_VERSION_KEY = '__no_version__';\n\nfunction getResourceNameKey(type: string, id: string): string {\n return `${type}:${id}`;\n}\n\nfunction getResourceVersionKey(type: string, id: string, version?: string): string {\n return `${type}:${id}@${version || NO_VERSION_KEY}`;\n}\n\nfunction hasReferenceStatements(source: string): boolean {\n return /\\b(?:sends|receives|writes-to|reads-from)\\b/.test(source);\n}\n\n/**\n * Extract resource stubs from service references that weren't compiled as standalone resources.\n * Uses the DSL AST to determine message types accurately.\n */\nasync function extractMessageStubs(program: any, compiledIds: Set<string>, nested: boolean = false): Promise<ParsedResource[]> {\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') {\n const msgType = stmt.messageType; // 'event', 'command', or 'query'\n const msgName = stmt.messageName;\n const hasBody = stmt.body && stmt.body.length > 0;\n const version = stmt.version || DEFAULT_STUB_VERSION;\n\n if (!hasBody) {\n const folder = MESSAGE_TYPE_FOLDER[msgType];\n if (folder) {\n const key = getResourceVersionKey(msgType, msgName, version);\n const anyVersionKey = getResourceNameKey(msgType, msgName);\n\n // For explicit refs (e.g. Event@2.0.0), require exact version match.\n // For unversioned refs, treat any compiled version as satisfying the reference.\n if (!compiledIds.has(key) && !stubIds.has(key) && !(!stmt.version && compiledIds.has(anyVersionKey))) {\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 }\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 chVersion = ch.channelVersion || DEFAULT_STUB_VERSION;\n const chKey = getResourceVersionKey('channel', chName, chVersion);\n const chAnyVersionKey = getResourceNameKey('channel', chName);\n if (compiledIds.has(chKey) || stubIds.has(chKey)) continue;\n if (!ch.channelVersion && compiledIds.has(chAnyVersionKey)) continue;\n\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 continue;\n }\n\n if (stmt.$type === 'WritesToStmt' || stmt.$type === 'ReadsFromStmt') {\n const containerName = stmt.ref?.name;\n if (!containerName) continue;\n\n const containerVersion = stmt.ref?.version || DEFAULT_STUB_VERSION;\n const containerKey = getResourceVersionKey('container', containerName, containerVersion);\n const containerAnyVersionKey = getResourceNameKey('container', containerName);\n if (compiledIds.has(containerKey) || stubIds.has(containerKey)) continue;\n if (!stmt.ref?.version && compiledIds.has(containerAnyVersionKey)) continue;\n\n const containerFolder = nested && parentPath ? `${parentPath}/containers` : 'containers';\n stubIds.add(containerKey);\n stubs.push({\n type: 'container',\n id: containerName,\n version: containerVersion,\n frontmatter: {\n id: containerName,\n name: containerName,\n version: containerVersion,\n },\n markdown: '',\n path: `${containerFolder}/${containerName}/versioned/${containerVersion}/index.md`,\n });\n }\n }\n }\n }\n\n processDefinitions(program.definitions);\n\n return stubs;\n}\n\nfunction getVersionFromBody(body: any[] | undefined): string | undefined {\n if (!body) return undefined;\n const versionStmt = body.find((stmt) => stmt?.$type === 'VersionStmt');\n return versionStmt?.value;\n}\n\nfunction buildServiceOutputPath(serviceName: string, body: any[] | undefined, nested: boolean, parentPath: string): string {\n const folder = nested && parentPath ? `${parentPath}/services` : 'services';\n const version = getVersionFromBody(body);\n if (version) return `${folder}/${serviceName}/versioned/${version}/index.md`;\n return `${folder}/${serviceName}/index.md`;\n}\n\nfunction extractServiceContainerRefs(\n program: any,\n nested: boolean = false\n): Map<string, { writesTo?: Array<{ id: string; version?: string }>; readsFrom?: Array<{ id: string; version?: string }> }> {\n const refsByPath = new Map<\n string,\n { writesTo?: Array<{ id: string; version?: string }>; readsFrom?: Array<{ id: string; version?: string }> }\n >();\n\n function processDefinitions(definitions: any[], parentPath: string = ''): void {\n for (const def of definitions || []) {\n if (def.$type === 'VisualizerDef' && def.body) {\n processDefinitions(def.body, parentPath);\n continue;\n }\n\n if (def.$type === 'DomainDef') {\n const domainPath = nested ? `domains/${def.name}` : '';\n const domainBody = def.body || [];\n const domainServices = domainBody.filter((d: any) => d.$type === 'ServiceDef');\n processDefinitions(domainServices, domainPath);\n\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 body = def.body || [];\n const writesTo = body\n .filter((stmt: any) => stmt.$type === 'WritesToStmt' && stmt.ref?.name)\n .map((stmt: any) => ({\n id: stmt.ref.name,\n ...(stmt.ref.version ? { version: stmt.ref.version } : {}),\n }));\n\n const readsFrom = body\n .filter((stmt: any) => stmt.$type === 'ReadsFromStmt' && stmt.ref?.name)\n .map((stmt: any) => ({\n id: stmt.ref.name,\n ...(stmt.ref.version ? { version: stmt.ref.version } : {}),\n }));\n\n if (writesTo.length === 0 && readsFrom.length === 0) continue;\n\n const path = buildServiceOutputPath(def.name, body, nested, parentPath);\n refsByPath.set(path, {\n ...(writesTo.length > 0 ? { writesTo } : {}),\n ...(readsFrom.length > 0 ? { readsFrom } : {}),\n });\n }\n }\n\n processDefinitions(program.definitions || []);\n return refsByPath;\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 dataProduct: 'data-products',\n diagram: 'diagrams',\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 'container':\n return sdk.writeDataStore;\n case 'dataProduct':\n return sdk.writeDataProduct;\n case 'diagram':\n return sdk.writeDiagram;\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 'container':\n return sdk.getDataStore;\n case 'dataProduct':\n return sdk.getDataProduct;\n case 'diagram':\n return sdk.getDiagram;\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 parsed = await parseDSL(source, { nested });\n const outputs = parsed.outputs;\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 const readerCache = new Map<string, Promise<any>>();\n\n const readResourceCached = async (\n reader: ((id: string, version?: string) => Promise<any>) | null,\n type: string,\n id: string,\n version?: string\n ): Promise<any> => {\n if (!reader) return undefined;\n const cacheKey = getResourceVersionKey(type, id, version);\n if (!readerCache.has(cacheKey)) {\n readerCache.set(\n cacheKey,\n reader(id, version).catch(() => undefined)\n );\n }\n return await readerCache.get(cacheKey)!;\n };\n\n const invalidateReaderCache = (type: string, id: string, version?: string): void => {\n // We only read \"latest\" (no version) and the current version in this import path,\n // so targeted invalidation avoids scanning the full cache for every write.\n readerCache.delete(getResourceVersionKey(type, id));\n readerCache.delete(getResourceVersionKey(type, id, version));\n };\n\n const resources = outputs.map(parseCompiledOutput);\n const serviceContainerRefsByPath = extractServiceContainerRefs(parsed.program, nested);\n\n for (const resource of resources) {\n if (resource.type !== 'service') continue;\n const refs = serviceContainerRefsByPath.get(resource.path);\n if (!refs) continue;\n resource.frontmatter = {\n ...resource.frontmatter,\n ...refs,\n };\n }\n\n // Create stub resources for referenced messages that weren't compiled as standalone\n const compiledIds = new Set<string>();\n for (const resource of resources) {\n compiledIds.add(getResourceNameKey(resource.type, resource.id));\n compiledIds.add(getResourceVersionKey(resource.type, resource.id, resource.version));\n }\n const stubs = hasReferenceStatements(source) ? await extractMessageStubs(parsed.program, 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 readResourceCached(reader, resource.type, resource.id, resource.version);\n if (existing) {\n result.updated.push(label);\n } else {\n const latest = await readResourceCached(reader, resource.type, resource.id);\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 = await readResourceCached(reader, resource.type, resource.id, resource.version);\n const latest = !existing && resource.version ? await readResourceCached(reader, resource.type, resource.id) : undefined;\n const versionedFrom =\n !existing && resource.version && latest?.version && latest.version !== resource.version ? latest.version : undefined;\n\n const incomingMarkdown = resource.markdown;\n const hasIncomingMarkdown = incomingMarkdown.trim().length > 0;\n let markdown = incomingMarkdown;\n\n // Preserve existing markdown when DSL import has no markdown body.\n if (!hasIncomingMarkdown) {\n if (existing?.markdown) {\n markdown = existing.markdown;\n } else if (!existing && latest?.markdown) {\n // If importing a newer version without markdown, carry forward latest markdown.\n markdown = latest.markdown;\n }\n }\n\n // Add <NodeGraph /> to markdown for newly created resources (not updates)\n if (!existing && TYPES_WITH_NODE_GRAPH.has(resource.type)) {\n if (!markdown) {\n markdown = '<NodeGraph />';\n } else if (!markdown.includes('<NodeGraph />')) {\n markdown = `${markdown}\\n\\n<NodeGraph />`;\n }\n }\n\n const resourceData = {\n ...mergeImportedFrontmatter(resource.type, resource.frontmatter, existing, latest),\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: Boolean(versionedFrom),\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 invalidateReaderCache(resource.type, resource.id, resource.version);\n\n if (existing) {\n result.updated.push(label);\n } else {\n result.created.push(label);\n if (versionedFrom) {\n result.versioned.push(`${resource.type} ${resource.id}@${versionedFrom}`);\n }\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 container: { color: c.white, label: 'container', order: 7 },\n dataProduct: { color: c.white, label: 'data product', order: 8 },\n diagram: { color: c.white, label: 'diagram', order: 9 },\n user: { color: c.blue, label: 'user', order: 10 },\n team: { color: c.blue, label: 'team', order: 11 },\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","/**\n * DSL-managed frontmatter keys by resource type.\n *\n * Keys listed here are controlled by DSL import and should not be preserved\n * from existing frontmatter when omitted by the incoming DSL.\n */\nconst MESSAGE_MANAGED_KEYS: ReadonlySet<string> = new Set(['id', 'name', 'version', 'owners', 'deprecated', 'draft', 'summary']);\n\nexport const DSL_MANAGED_KEYS_BY_TYPE: Record<string, ReadonlySet<string>> = {\n domain: new Set(['id', 'name', 'version', 'owners', 'deprecated', 'draft', 'summary', 'services', 'domains']),\n event: MESSAGE_MANAGED_KEYS,\n command: MESSAGE_MANAGED_KEYS,\n query: MESSAGE_MANAGED_KEYS,\n};\n"],"mappings":"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","names":["import_node_fs","import_node_path","createSDK","import_sdk","createSDK","import_node_fs","import_sdk","version","createSDK","dsl","open","import_node_fs","import_node_path","import_sdk","program","matter","version","resolve","createSDK","result"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/executor.ts","../../src/cli/parser.ts","../../src/cli/list.ts","../../src/cli/export.ts","../../src/cli/import.ts","../../src/cli/dsl-managed-keys.ts"],"sourcesContent":["#!/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 EventCatalog Canvas', 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];\nconst SUPPORTED_RESOURCE_TYPES = RESOURCE_TYPES.join(', ');\n\nconst PLURAL_MAP: Record<string, ResourceType> = {\n events: 'event',\n commands: 'command',\n queries: 'query',\n services: 'service',\n domains: 'domain',\n};\n\nconst KNOWN_UNSUPPORTED_EXPORT_TYPES = new Set([\n 'channel',\n 'channels',\n 'team',\n 'teams',\n 'user',\n 'users',\n 'container',\n 'containers',\n 'data-product',\n 'data-products',\n 'dataproduct',\n 'dataproducts',\n 'diagram',\n 'diagrams',\n 'flow',\n 'flows',\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 assertSupportedExportType(resource: string, type: ResourceType): void {\n const lower = resource.toLowerCase();\n\n if (KNOWN_UNSUPPORTED_EXPORT_TYPES.has(lower)) {\n throw new Error(\n `Resource type '${resource}' is not yet supported for DSL export. Supported types: ${SUPPORTED_RESOURCE_TYPES}`\n );\n }\n\n if (!RESOURCE_TYPES.includes(type)) {\n throw new Error(`Invalid resource type '${resource}'. Must be one of: ${SUPPORTED_RESOURCE_TYPES}`);\n }\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\n/**\n * Groups DSL blocks by resource type and orders them with section headers.\n *\n * Raw toDSL output may interleave different resource types (e.g. teams, channels,\n * services, events). This splits on blank lines, buckets each block by its leading\n * keyword, then reassembles in SECTION_ORDER with \"// EVENTS\" style headers.\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\ninterface ResourceDefinition {\n keyword: string;\n id: string;\n version?: string;\n}\n\n/**\n * Extracts resource definitions from DSL text by scanning for top-level\n * `<keyword> <id> {` lines and reading the version from the block body.\n */\nfunction extractResourceDefinitions(dsl: string, filterTypes: string[]): ResourceDefinition[] {\n const results: ResourceDefinition[] = [];\n const lines = dsl.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimStart();\n const parts = trimmed.split(/\\s/);\n const keyword = parts[0];\n const id = parts[1];\n if (!filterTypes.includes(keyword)) continue;\n if (!id || !trimmed.endsWith('{')) continue;\n\n // Look ahead inside the block for a `version X.Y.Z` line\n let version: string | undefined;\n for (let j = i + 1; j < lines.length; j++) {\n const inner = lines[j].trim();\n if (inner === '}') break;\n const vMatch = inner.match(/^version\\s+(.+)$/);\n if (vMatch) {\n version = vMatch[1];\n break;\n }\n }\n results.push({ keyword, id, version });\n }\n\n return results;\n}\n\n/**\n * Builds a `visualizer main { ... }` block listing all resource definitions\n * found in the DSL output.\n *\n * When multiple versions of the same resource exist (e.g. two versions of\n * OrderService), references are version-qualified (`service OrderService@1.0.0`)\n * to avoid ambiguity. Single-version resources use bare ids.\n */\nfunction buildVisualizerBlock(dsl: string, name: string, filterTypes: ResourceType | ResourceType[]): string {\n const types = Array.isArray(filterTypes) ? filterTypes : [filterTypes];\n const definitions = extractResourceDefinitions(dsl, types);\n\n if (definitions.length === 0) return '';\n\n // Count occurrences of each keyword+id to detect duplicates needing version qualification\n const counts = new Map<string, number>();\n for (const def of definitions) {\n const key = `${def.keyword}:${def.id}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n\n const entries = definitions.map((def) => {\n const key = `${def.keyword}:${def.id}`;\n const needsVersion = (counts.get(key) || 0) > 1 && def.version;\n const ref = needsVersion ? `${def.id}@${def.version}` : def.id;\n return ` ${def.keyword} ${ref}`;\n });\n\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 // Independent collection fetches/conversions can run in parallel.\n // Promise.all preserves RESOURCE_TYPES order in the resulting array.\n const dslParts = (\n await Promise.all(\n RESOURCE_TYPES.map(async (type) => {\n const fetcher = getCollectionFetcher(sdk, type);\n const resources = await fetcher({ latestOnly: true });\n if (!resources || resources.length === 0) return '';\n return sdk.toDSL(resources, { type, hydrate });\n })\n )\n ).filter((dsl): dsl is string => Boolean(dsl));\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 EventCatalog Canvas...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Canvas`);\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 assertSupportedExportType(resource, type);\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 EventCatalog Canvas...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Canvas`);\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 assertSupportedExportType(resource, type);\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\n // When hydrating, toDSL pulls in related resources (services, channels, owners)\n // so we group by type with section headers and widen the visualizer filter to\n // include all resource types that may appear in the hydrated output.\n const grouped = hydrate ? groupDSLBlocks(rawDsl) : rawDsl;\n const vizTypes: ResourceType[] = hydrate ? [...RESOURCE_TYPES] : [type];\n const vizBlock = buildVisualizerBlock(grouped, `View of ${id}`, vizTypes);\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 EventCatalog Canvas...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Canvas`);\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';\nimport { DSL_MANAGED_KEYS_BY_TYPE } from './dsl-managed-keys';\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\nfunction normalizeImportedFrontmatter(type: string, frontmatter: Record<string, any>): Record<string, any> {\n const normalized = { ...frontmatter };\n\n // SDK/container schema uses snake_case fields.\n if (type === 'container') {\n if (normalized.container_type === undefined && normalized.containerType !== undefined) {\n normalized.container_type = normalized.containerType;\n delete normalized.containerType;\n }\n if (normalized.access_mode === undefined && normalized.accessMode !== undefined) {\n normalized.access_mode = normalized.accessMode;\n delete normalized.accessMode;\n }\n // Default container_type to 'database' if not specified in the DSL\n if (!normalized.container_type) {\n normalized.container_type = 'database';\n }\n }\n\n return normalized;\n}\n\nfunction toFrontmatter(resource: any): Record<string, any> {\n if (!resource || typeof resource !== 'object') return {};\n const { markdown: _markdown, ...frontmatter } = resource;\n return frontmatter;\n}\n\nfunction mergeImportedFrontmatter(\n type: string,\n incomingFrontmatter: Record<string, any>,\n existing?: any,\n latest?: any\n): Record<string, any> {\n const normalizedIncoming = normalizeImportedFrontmatter(type, incomingFrontmatter);\n const managedKeys = DSL_MANAGED_KEYS_BY_TYPE[type];\n\n if (!managedKeys) {\n return normalizedIncoming;\n }\n\n const baseFrontmatter = toFrontmatter(existing ?? latest);\n const preservedFrontmatter = { ...baseFrontmatter };\n\n for (const key of managedKeys) {\n delete preservedFrontmatter[key];\n }\n\n return {\n ...preservedFrontmatter,\n ...normalizedIncoming,\n };\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(\n source: string,\n options?: { nested?: boolean }\n): Promise<{ outputs: { path: string; content: string }[]; program: any }> {\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, program };\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';\nconst NO_VERSION_KEY = '__no_version__';\n\nfunction getResourceNameKey(type: string, id: string): string {\n return `${type}:${id}`;\n}\n\nfunction getResourceVersionKey(type: string, id: string, version?: string): string {\n return `${type}:${id}@${version || NO_VERSION_KEY}`;\n}\n\nfunction hasReferenceStatements(source: string): boolean {\n return /\\b(?:sends|receives|writes-to|reads-from)\\b/.test(source);\n}\n\n/**\n * Extract resource stubs from service references that weren't compiled as standalone resources.\n * Uses the DSL AST to determine message types accurately.\n */\nasync function extractMessageStubs(program: any, compiledIds: Set<string>, nested: boolean = false): Promise<ParsedResource[]> {\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') {\n const msgType = stmt.messageType; // 'event', 'command', or 'query'\n const msgName = stmt.messageName;\n const hasBody = stmt.body && stmt.body.length > 0;\n const version = stmt.version || DEFAULT_STUB_VERSION;\n\n if (!hasBody) {\n const folder = MESSAGE_TYPE_FOLDER[msgType];\n if (folder) {\n const key = getResourceVersionKey(msgType, msgName, version);\n const anyVersionKey = getResourceNameKey(msgType, msgName);\n\n // For explicit refs (e.g. Event@2.0.0), require exact version match.\n // For unversioned refs, treat any compiled version as satisfying the reference.\n if (!compiledIds.has(key) && !stubIds.has(key) && !(!stmt.version && compiledIds.has(anyVersionKey))) {\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 }\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 chVersion = ch.channelVersion || DEFAULT_STUB_VERSION;\n const chKey = getResourceVersionKey('channel', chName, chVersion);\n const chAnyVersionKey = getResourceNameKey('channel', chName);\n if (compiledIds.has(chKey) || stubIds.has(chKey)) continue;\n if (!ch.channelVersion && compiledIds.has(chAnyVersionKey)) continue;\n\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 continue;\n }\n\n if (stmt.$type === 'WritesToStmt' || stmt.$type === 'ReadsFromStmt') {\n const containerName = stmt.ref?.name;\n if (!containerName) continue;\n\n const containerVersion = stmt.ref?.version || DEFAULT_STUB_VERSION;\n const containerKey = getResourceVersionKey('container', containerName, containerVersion);\n const containerAnyVersionKey = getResourceNameKey('container', containerName);\n if (compiledIds.has(containerKey) || stubIds.has(containerKey)) continue;\n if (!stmt.ref?.version && compiledIds.has(containerAnyVersionKey)) continue;\n\n const containerFolder = nested && parentPath ? `${parentPath}/containers` : 'containers';\n stubIds.add(containerKey);\n stubs.push({\n type: 'container',\n id: containerName,\n version: containerVersion,\n frontmatter: {\n id: containerName,\n name: containerName,\n version: containerVersion,\n },\n markdown: '',\n path: `${containerFolder}/${containerName}/versioned/${containerVersion}/index.md`,\n });\n }\n }\n }\n }\n\n processDefinitions(program.definitions);\n\n return stubs;\n}\n\nfunction getVersionFromBody(body: any[] | undefined): string | undefined {\n if (!body) return undefined;\n const versionStmt = body.find((stmt) => stmt?.$type === 'VersionStmt');\n return versionStmt?.value;\n}\n\nfunction buildServiceOutputPath(serviceName: string, body: any[] | undefined, nested: boolean, parentPath: string): string {\n const folder = nested && parentPath ? `${parentPath}/services` : 'services';\n const version = getVersionFromBody(body);\n if (version) return `${folder}/${serviceName}/versioned/${version}/index.md`;\n return `${folder}/${serviceName}/index.md`;\n}\n\nfunction extractServiceContainerRefs(\n program: any,\n nested: boolean = false\n): Map<string, { writesTo?: Array<{ id: string; version?: string }>; readsFrom?: Array<{ id: string; version?: string }> }> {\n const refsByPath = new Map<\n string,\n { writesTo?: Array<{ id: string; version?: string }>; readsFrom?: Array<{ id: string; version?: string }> }\n >();\n\n function processDefinitions(definitions: any[], parentPath: string = ''): void {\n for (const def of definitions || []) {\n if (def.$type === 'VisualizerDef' && def.body) {\n processDefinitions(def.body, parentPath);\n continue;\n }\n\n if (def.$type === 'DomainDef') {\n const domainPath = nested ? `domains/${def.name}` : '';\n const domainBody = def.body || [];\n const domainServices = domainBody.filter((d: any) => d.$type === 'ServiceDef');\n processDefinitions(domainServices, domainPath);\n\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 body = def.body || [];\n const writesTo = body\n .filter((stmt: any) => stmt.$type === 'WritesToStmt' && stmt.ref?.name)\n .map((stmt: any) => ({\n id: stmt.ref.name,\n ...(stmt.ref.version ? { version: stmt.ref.version } : {}),\n }));\n\n const readsFrom = body\n .filter((stmt: any) => stmt.$type === 'ReadsFromStmt' && stmt.ref?.name)\n .map((stmt: any) => ({\n id: stmt.ref.name,\n ...(stmt.ref.version ? { version: stmt.ref.version } : {}),\n }));\n\n if (writesTo.length === 0 && readsFrom.length === 0) continue;\n\n const path = buildServiceOutputPath(def.name, body, nested, parentPath);\n refsByPath.set(path, {\n ...(writesTo.length > 0 ? { writesTo } : {}),\n ...(readsFrom.length > 0 ? { readsFrom } : {}),\n });\n }\n }\n\n processDefinitions(program.definitions || []);\n return refsByPath;\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 dataProduct: 'data-products',\n diagram: 'diagrams',\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 'container':\n return sdk.writeDataStore;\n case 'dataProduct':\n return sdk.writeDataProduct;\n case 'diagram':\n return sdk.writeDiagram;\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 'container':\n return sdk.getDataStore;\n case 'dataProduct':\n return sdk.getDataProduct;\n case 'diagram':\n return sdk.getDiagram;\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 parsed = await parseDSL(source, { nested });\n const outputs = parsed.outputs;\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 const readerCache = new Map<string, Promise<any>>();\n\n const readResourceCached = async (\n reader: ((id: string, version?: string) => Promise<any>) | null,\n type: string,\n id: string,\n version?: string\n ): Promise<any> => {\n if (!reader) return undefined;\n const cacheKey = getResourceVersionKey(type, id, version);\n if (!readerCache.has(cacheKey)) {\n readerCache.set(\n cacheKey,\n reader(id, version).catch(() => undefined)\n );\n }\n return await readerCache.get(cacheKey)!;\n };\n\n const invalidateReaderCache = (type: string, id: string, version?: string): void => {\n // We only read \"latest\" (no version) and the current version in this import path,\n // so targeted invalidation avoids scanning the full cache for every write.\n readerCache.delete(getResourceVersionKey(type, id));\n readerCache.delete(getResourceVersionKey(type, id, version));\n };\n\n const resources = outputs.map(parseCompiledOutput);\n const serviceContainerRefsByPath = extractServiceContainerRefs(parsed.program, nested);\n\n for (const resource of resources) {\n if (resource.type !== 'service') continue;\n const refs = serviceContainerRefsByPath.get(resource.path);\n if (!refs) continue;\n resource.frontmatter = {\n ...resource.frontmatter,\n ...refs,\n };\n }\n\n // Create stub resources for referenced messages that weren't compiled as standalone\n const compiledIds = new Set<string>();\n for (const resource of resources) {\n compiledIds.add(getResourceNameKey(resource.type, resource.id));\n compiledIds.add(getResourceVersionKey(resource.type, resource.id, resource.version));\n }\n const stubs = hasReferenceStatements(source) ? await extractMessageStubs(parsed.program, 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 readResourceCached(reader, resource.type, resource.id, resource.version);\n if (existing) {\n result.updated.push(label);\n } else {\n const latest = await readResourceCached(reader, resource.type, resource.id);\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 = await readResourceCached(reader, resource.type, resource.id, resource.version);\n const latest = !existing && resource.version ? await readResourceCached(reader, resource.type, resource.id) : undefined;\n const versionedFrom =\n !existing && resource.version && latest?.version && latest.version !== resource.version ? latest.version : undefined;\n\n const incomingMarkdown = resource.markdown;\n const hasIncomingMarkdown = incomingMarkdown.trim().length > 0;\n let markdown = incomingMarkdown;\n\n // Preserve existing markdown when DSL import has no markdown body.\n if (!hasIncomingMarkdown) {\n if (existing?.markdown) {\n markdown = existing.markdown;\n } else if (!existing && latest?.markdown) {\n // If importing a newer version without markdown, carry forward latest markdown.\n markdown = latest.markdown;\n }\n }\n\n // Add <NodeGraph /> to markdown for newly created resources (not updates)\n if (!existing && TYPES_WITH_NODE_GRAPH.has(resource.type)) {\n if (!markdown) {\n markdown = '<NodeGraph />';\n } else if (!markdown.includes('<NodeGraph />')) {\n markdown = `${markdown}\\n\\n<NodeGraph />`;\n }\n }\n\n const resourceData = {\n ...mergeImportedFrontmatter(resource.type, resource.frontmatter, existing, latest),\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: Boolean(versionedFrom),\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 invalidateReaderCache(resource.type, resource.id, resource.version);\n\n if (existing) {\n result.updated.push(label);\n } else {\n result.created.push(label);\n if (versionedFrom) {\n result.versioned.push(`${resource.type} ${resource.id}@${versionedFrom}`);\n }\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 container: { color: c.white, label: 'container', order: 7 },\n dataProduct: { color: c.white, label: 'data product', order: 8 },\n diagram: { color: c.white, label: 'diagram', order: 9 },\n user: { color: c.blue, label: 'user', order: 10 },\n team: { color: c.blue, label: 'team', order: 11 },\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","/**\n * DSL-managed frontmatter keys by resource type.\n *\n * Keys listed here are controlled by DSL import and should not be preserved\n * from existing frontmatter when omitted by the incoming DSL.\n */\nconst MESSAGE_MANAGED_KEYS: ReadonlySet<string> = new Set(['id', 'name', 'version', 'owners', 'deprecated', 'draft', 'summary']);\n\nexport const DSL_MANAGED_KEYS_BY_TYPE: Record<string, ReadonlySet<string>> = {\n domain: new Set(['id', 'name', 'version', 'owners', 'deprecated', 'draft', 'summary', 'services', 'domains']),\n event: MESSAGE_MANAGED_KEYS,\n command: MESSAGE_MANAGED_KEYS,\n query: MESSAGE_MANAGED_KEYS,\n};\n"],"mappings":"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","names":["import_node_fs","import_node_path","createSDK","import_sdk","createSDK","import_node_fs","import_sdk","version","createSDK","dsl","open","import_node_fs","import_node_path","import_sdk","program","matter","version","resolve","createSDK","result"]}
@@ -309,9 +309,9 @@ ${vizBlock}` : grouped;
309
309
  const encoded = Buffer.from(dsl).toString("base64");
310
310
  const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;
311
311
  await open(playgroundUrl);
312
- lines.push("", ` Opening in EventCatalog Modelling...`);
312
+ lines.push("", ` Opening in EventCatalog Canvas...`);
313
313
  } else {
314
- lines.push("", ` Tip: Use --playground to open in EventCatalog Modelling`);
314
+ lines.push("", ` Tip: Use --playground to open in EventCatalog Canvas`);
315
315
  }
316
316
  lines.push("");
317
317
  return lines.join("\n");
@@ -343,9 +343,9 @@ ${vizBlock}` : grouped;
343
343
  const encoded = Buffer.from(dsl).toString("base64");
344
344
  const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;
345
345
  await open(playgroundUrl);
346
- lines.push("", ` Opening in EventCatalog Modelling...`);
346
+ lines.push("", ` Opening in EventCatalog Canvas...`);
347
347
  } else {
348
- lines.push("", ` Tip: Use --playground to open in EventCatalog Modelling`);
348
+ lines.push("", ` Tip: Use --playground to open in EventCatalog Canvas`);
349
349
  }
350
350
  lines.push("");
351
351
  return lines.join("\n");
@@ -381,9 +381,9 @@ ${vizBlock}` : grouped;
381
381
  const encoded = Buffer.from(dsl).toString("base64");
382
382
  const playgroundUrl = `https://playground.eventcatalog.dev/?code=${encoded}`;
383
383
  await open(playgroundUrl);
384
- lines.push("", ` Opening in EventCatalog Modelling...`);
384
+ lines.push("", ` Opening in EventCatalog Canvas...`);
385
385
  } else {
386
- lines.push("", ` Tip: Use --playground to open in EventCatalog Modelling`);
386
+ lines.push("", ` Tip: Use --playground to open in EventCatalog Canvas`);
387
387
  }
388
388
  lines.push("");
389
389
  return lines.join("\n");
@@ -418,6 +418,9 @@ function normalizeImportedFrontmatter(type, frontmatter) {
418
418
  normalized.access_mode = normalized.accessMode;
419
419
  delete normalized.accessMode;
420
420
  }
421
+ if (!normalized.container_type) {
422
+ normalized.container_type = "database";
423
+ }
421
424
  }
422
425
  return normalized;
423
426
  }
@@ -1160,7 +1163,7 @@ program.command("list").description("List all available SDK functions").action((
1160
1163
  process.exit(1);
1161
1164
  }
1162
1165
  });
1163
- program.command("export").description("Export a catalog resource to EventCatalog DSL (.ec) format").option("-a, --all", "Export the entire catalog (all resource types)", false).option("-r, --resource <type>", "Resource type (event, command, query, service, domain)").option("--id <id>", "Resource ID (omit to export all resources of the given type)").option("-v, --version <version>", "Resource version (defaults to latest)").option("--hydrate", "Include referenced resources (messages, channels, owners)", false).option("--stdout", "Print to stdout instead of writing a file", false).option("--playground", "Open the exported DSL in EventCatalog Modelling", false).option("-o, --output <path>", "Output file path (defaults to <id>.ec or catalog.ec)").action(async (opts) => {
1166
+ program.command("export").description("Export a catalog resource to EventCatalog DSL (.ec) format").option("-a, --all", "Export the entire catalog (all resource types)", false).option("-r, --resource <type>", "Resource type (event, command, query, service, domain)").option("--id <id>", "Resource ID (omit to export all resources of the given type)").option("-v, --version <version>", "Resource version (defaults to latest)").option("--hydrate", "Include referenced resources (messages, channels, owners)", false).option("--stdout", "Print to stdout instead of writing a file", false).option("--playground", "Open the exported DSL in EventCatalog Canvas", false).option("-o, --output <path>", "Output file path (defaults to <id>.ec or catalog.ec)").action(async (opts) => {
1164
1167
  try {
1165
1168
  const globalOpts = program.opts();
1166
1169
  const dir = globalOpts.dir || ".";