@eventcatalog/cli 0.6.1 → 0.6.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.mjs +1 -1
- package/dist/cli/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/cli/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// ../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.
|
|
3
|
+
// ../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.9_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js
|
|
4
4
|
import path from "path";
|
|
5
5
|
import { fileURLToPath } from "url";
|
|
6
6
|
var getFilename = () => fileURLToPath(import.meta.url);
|
package/dist/cli/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js","../../src/cli/index.ts","../../src/cli/executor.ts","../../src/cli/parser.ts","../../src/cli/list.ts","../../src/cli/export.ts","../../src/cli/import.ts","../../src/cli/dsl-managed-keys.ts","../../src/cli/snapshot.ts","../../src/cli/governance/rules.ts","../../src/cli/governance/actions.ts","../../src/cli/governance/format.ts","../../src/cli/governance/check.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { executeFunction } from './executor';\nimport { listFunctions, formatListOutput } from './list';\nimport { exportResource, exportCatalog } from './export';\nimport { importDSL } from './import';\nimport { snapshotCreate, snapshotDiff, snapshotList } from './snapshot';\nimport { governanceCheck } from './governance';\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 Compass', 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// Snapshot command group\nconst snapshot = program.command('snapshot').description('Create, diff, and list catalog snapshots');\n\nsnapshot\n .command('create')\n .description('Take a point-in-time snapshot of the catalog')\n .option('--label <label>', 'Human-readable label (default: ISO timestamp)')\n .option('-o, --output <path>', 'Output directory for the snapshot file')\n .option('--stdout', 'Print JSON to stdout instead of writing a file', false)\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await snapshotCreate({ label: opts.label, output: opts.output, stdout: opts.stdout, dir });\n console.log(result);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nsnapshot\n .command('diff <fileA> <fileB>')\n .description('Compare two snapshot files and output a structured diff')\n .option('--format <format>', 'Output format: text or json', 'text')\n .action(async (fileA: string, fileB: string, opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await snapshotDiff({ fileA, fileB, format: opts.format, dir });\n console.log(result);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nsnapshot\n .command('list')\n .description('List all snapshots in the catalog')\n .option('--format <format>', 'Output format: text or json', 'text')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await snapshotList({ format: opts.format, dir });\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// Governance command group\nconst governance = program.command('governance').description('Run governance rules against catalog changes');\n\ngovernance\n .command('check')\n .description('Compare catalog against a base branch and evaluate governance rules')\n .option('--base <branch>', 'Base branch to compare against (default: main)')\n .option('--target <branch>', 'Target branch to compare (default: current working directory)')\n .option('--format <format>', 'Output format: text or json', 'text')\n .option('--status <status>', 'Status label to include in webhook payloads (e.g. proposed, approved)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await governanceCheck({\n base: opts.base,\n target: opts.target,\n format: opts.format,\n status: opts.status,\n dir,\n });\n console.log(result.output);\n process.exitCode = result.exitCode;\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://compass.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in EventCatalog Compass...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Compass`);\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://compass.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in EventCatalog Compass...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Compass`);\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://compass.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in EventCatalog Compass...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Compass`);\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","import { resolve } from 'node:path';\nimport { rmSync } from 'node:fs';\nimport createSDK from '@eventcatalog/sdk';\n\nexport const snapshotCreate = async (opts: { label?: string; output?: string; stdout?: boolean; dir: string }) => {\n const dir = resolve(opts.dir);\n const sdk = createSDK(dir);\n\n const result = await sdk.createSnapshot({\n label: opts.label,\n outputDir: opts.output ? resolve(opts.output) : undefined,\n });\n\n if (opts.stdout) {\n rmSync(result.filePath, { force: true });\n return JSON.stringify(result.snapshot, null, 2);\n }\n\n const resources = result.snapshot.resources;\n const counts = [\n resources.services.length && `${resources.services.length} services`,\n resources.messages.events.length && `${resources.messages.events.length} events`,\n resources.messages.commands.length && `${resources.messages.commands.length} commands`,\n resources.messages.queries.length && `${resources.messages.queries.length} queries`,\n resources.domains.length && `${resources.domains.length} domains`,\n resources.channels.length && `${resources.channels.length} channels`,\n ]\n .filter(Boolean)\n .join(', ');\n\n return `Snapshot created: ${result.filePath}\\nResources: ${counts}`;\n};\n\nconst formatDiffText = (diff: any): string => {\n const lines: string[] = [];\n\n const labelA = diff.snapshotA.label;\n const labelB = diff.snapshotB.label;\n lines.push(`Comparing: ${labelA} vs ${labelB}`);\n lines.push('');\n\n if (diff.resources.length > 0) {\n lines.push(`Resources (${diff.resources.length} changes):`);\n for (const r of diff.resources) {\n const prefix = r.changeType === 'added' ? '+' : r.changeType === 'removed' ? '-' : r.changeType === 'versioned' ? '^' : '~';\n const version = r.changeType === 'versioned' ? `${r.previousVersion} -> ${r.newVersion}` : r.version;\n const fields = r.changedFields ? ` (${r.changedFields.join(', ')})` : '';\n lines.push(` ${prefix} ${r.resourceId}@${version} [${r.type}] ${r.changeType}${fields}`);\n }\n lines.push('');\n }\n\n if (diff.relationships.length > 0) {\n lines.push(`Relationships (${diff.relationships.length} changes):`);\n for (const r of diff.relationships) {\n const prefix = r.changeType === 'added' ? '+' : '-';\n lines.push(\n ` ${prefix} ${r.serviceId} --${r.direction}--> ${r.resourceId}${r.resourceVersion ? `@${r.resourceVersion}` : ''}`\n );\n }\n lines.push('');\n }\n\n if (diff.summary.totalChanges === 0) {\n lines.push('No changes detected.');\n } else {\n lines.push(`Summary: ${diff.resources.length} resource changes, ${diff.relationships.length} relationship changes`);\n }\n\n return lines.join('\\n');\n};\n\nexport const snapshotDiff = async (opts: { fileA: string; fileB: string; format?: string; dir: string }) => {\n const dir = resolve(opts.dir);\n const sdk = createSDK(dir);\n\n const diff = await sdk.diffSnapshots(resolve(opts.fileA), resolve(opts.fileB));\n\n if (opts.format === 'json') {\n return JSON.stringify(diff, null, 2);\n }\n\n return formatDiffText(diff);\n};\n\nexport const snapshotList = async (opts: { format?: string; dir: string }) => {\n const dir = resolve(opts.dir);\n const sdk = createSDK(dir);\n\n const snapshots = await sdk.listSnapshots();\n\n if (opts.format === 'json') {\n return JSON.stringify(snapshots, null, 2);\n }\n\n if (snapshots.length === 0) {\n return 'No snapshots found.';\n }\n\n const lines = ['Snapshots:', ''];\n for (const s of snapshots) {\n const git = s.git ? ` (${s.git.branch} ${s.git.commit})` : '';\n lines.push(` ${s.label} ${s.createdAt}${git}`);\n lines.push(` ${s.filePath}`);\n }\n\n return lines.join('\\n');\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport yaml from 'js-yaml';\nimport { satisfies, validRange } from 'semver';\nimport createSDK from '@eventcatalog/sdk';\nimport type { SnapshotDiff, RelationshipChange, CatalogSnapshot, ResourceChange } from '@eventcatalog/sdk';\nimport type {\n GovernanceConfig,\n GovernanceTrigger,\n GovernanceResult,\n DeprecationChange,\n SchemaChange,\n BreakingSchemaChange,\n} from './types';\nimport { detectBreakingChanges } from '@eventcatalog/breaking-changes';\nimport type { CompatibilityStrategy } from '@eventcatalog/breaking-changes';\n\nexport const loadGovernanceConfig = (catalogDir: string): GovernanceConfig => {\n const yamlPath = path.join(catalogDir, 'governance.yaml');\n const ymlPath = path.join(catalogDir, 'governance.yml');\n\n const configPath = fs.existsSync(yamlPath) ? yamlPath : fs.existsSync(ymlPath) ? ymlPath : null;\n\n if (!configPath) {\n return { rules: [] };\n }\n\n const content = fs.readFileSync(configPath, 'utf-8');\n const parsed = yaml.load(content) as GovernanceConfig;\n const rules = parsed?.rules || [];\n\n for (const rule of rules) {\n for (const action of rule.actions) {\n if (action.type === 'fail' && action.message !== undefined && typeof action.message !== 'string') {\n throw new Error(`Invalid \"message\" in fail action for rule \"${rule.name}\". Must be a string.`);\n }\n }\n }\n\n if (parsed?.compatibility?.strategy) {\n const validStrategies = new Set(['BACKWARD', 'FORWARD', 'FULL', 'NONE']);\n if (!validStrategies.has(parsed.compatibility.strategy)) {\n throw new Error(\n `Invalid compatibility strategy \"${parsed.compatibility.strategy}\". Must be one of: BACKWARD, FORWARD, FULL, NONE.`\n );\n }\n }\n\n return {\n ...(parsed?.compatibility && { compatibility: parsed.compatibility }),\n rules,\n };\n};\n\nconst TRIGGER_FILTERS: Partial<Record<GovernanceTrigger, (change: RelationshipChange) => boolean>> = {\n consumer_added: (c) => c.direction === 'receives' && c.changeType === 'added',\n consumer_removed: (c) => c.direction === 'receives' && c.changeType === 'removed',\n producer_added: (c) => c.direction === 'sends' && c.changeType === 'added',\n producer_removed: (c) => c.direction === 'sends' && c.changeType === 'removed',\n};\n\nexport const buildServiceMessageSets = (\n snapshot: CatalogSnapshot\n): { produces: Map<string, Set<string>>; consumes: Map<string, Set<string>> } => {\n const produces = new Map<string, Set<string>>();\n const consumes = new Map<string, Set<string>>();\n\n for (const service of snapshot.resources.services) {\n const serviceId = service.id as string;\n if (service.sends) {\n const ids = new Set<string>();\n for (const s of service.sends) ids.add(s.id as string);\n produces.set(serviceId, ids);\n }\n if (service.receives) {\n const ids = new Set<string>();\n for (const r of service.receives) ids.add(r.id as string);\n consumes.set(serviceId, ids);\n }\n }\n\n return { produces, consumes };\n};\n\ntype ServiceMessageSets = ReturnType<typeof buildServiceMessageSets>;\n\nconst matchesResourceId = (\n resourceId: string,\n serviceId: string | undefined,\n resources: string[],\n messageSets?: ServiceMessageSets\n): boolean => {\n return resources.some((r) => {\n if (r === '*') return true;\n if (r.startsWith('service:')) {\n if (serviceId) return serviceId === r.slice(8);\n // For deprecation: match if the specified service produces this message\n return messageSets?.produces.get(r.slice(8))?.has(resourceId) ?? false;\n }\n if (r.startsWith('message:')) return resourceId === r.slice(8);\n if (r.startsWith('produces:')) return messageSets?.produces.get(r.slice(9))?.has(resourceId) ?? false;\n if (r.startsWith('consumes:')) return messageSets?.consumes.get(r.slice(9))?.has(resourceId) ?? false;\n return false;\n });\n};\n\nconst REMOVED_TRIGGERS: Set<GovernanceTrigger> = new Set(['consumer_removed', 'producer_removed']);\n\nconst MESSAGE_RESOURCE_TYPES = new Set(['event', 'command', 'query']);\n\nconst buildMessageMap = (snapshot: CatalogSnapshot): Map<string, Record<string, any>> => {\n const map = new Map<string, Record<string, any>>();\n for (const msg of snapshot.resources.messages.events) map.set(msg.id as string, msg);\n for (const msg of snapshot.resources.messages.commands) map.set(msg.id as string, msg);\n for (const msg of snapshot.resources.messages.queries) map.set(msg.id as string, msg);\n return map;\n};\n\ntype ServiceEntry = { id: string; version: string; owners?: string[] };\n\nconst buildServiceIndex = (snapshot: CatalogSnapshot, direction: 'sends' | 'receives'): Map<string, ServiceEntry[]> => {\n const index = new Map<string, ServiceEntry[]>();\n for (const service of snapshot.resources.services) {\n const pointers = service[direction] as Array<{ id: string }> | undefined;\n if (!pointers) continue;\n for (const pointer of pointers) {\n let entries = index.get(pointer.id);\n if (!entries) {\n entries = [];\n index.set(pointer.id, entries);\n }\n const entry: ServiceEntry = {\n id: service.id as string,\n version: service.version as string,\n };\n if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n entry.owners = service.owners as string[];\n }\n entries.push(entry);\n }\n }\n return index;\n};\n\nconst getMessageTypeKey = (resourceId: string, type: string): string => `${type}:${resourceId}`;\n\nconst buildLatestMessageVersionMap = (snapshot: CatalogSnapshot): Map<string, string> => {\n const versions = new Map<string, string>();\n\n for (const event of snapshot.resources.messages.events) {\n versions.set(getMessageTypeKey(event.id as string, 'event'), event.version as string);\n }\n for (const command of snapshot.resources.messages.commands) {\n versions.set(getMessageTypeKey(command.id as string, 'command'), command.version as string);\n }\n for (const query of snapshot.resources.messages.queries) {\n versions.set(getMessageTypeKey(query.id as string, 'query'), query.version as string);\n }\n\n return versions;\n};\n\nconst getTargetMessageVersion = (resourceChange: ResourceChange): string => {\n if (resourceChange.changeType === 'versioned') {\n return resourceChange.newVersion || resourceChange.version;\n }\n return resourceChange.version;\n};\n\nconst pointerTargetsChangedVersion = (\n pointer: { id: string; version?: string },\n resourceChange: ResourceChange,\n latestMessageVersions: Map<string, string>\n): boolean => {\n if (pointer.id !== resourceChange.resourceId) return false;\n\n const targetVersion = getTargetMessageVersion(resourceChange);\n const pointerVersion = pointer.version;\n\n if (!pointerVersion || pointerVersion === 'latest') {\n const latestVersion = latestMessageVersions.get(getMessageTypeKey(resourceChange.resourceId, resourceChange.type));\n if (!latestVersion) return true;\n return latestVersion === targetVersion;\n }\n\n if (validRange(pointerVersion)) {\n try {\n return satisfies(targetVersion, pointerVersion);\n } catch {\n return false;\n }\n }\n\n return pointerVersion === targetVersion;\n};\n\nconst getServicesForSchemaChange = (\n snapshot: CatalogSnapshot,\n direction: 'sends' | 'receives',\n resourceChange: ResourceChange,\n latestMessageVersions: Map<string, string>\n): ServiceEntry[] => {\n const matches: ServiceEntry[] = [];\n\n for (const service of snapshot.resources.services) {\n const pointers = service[direction] as Array<{ id: string; version?: string }> | undefined;\n if (!pointers) continue;\n\n const hasMatch = pointers.some((pointer) => pointerTargetsChangedVersion(pointer, resourceChange, latestMessageVersions));\n if (!hasMatch) continue;\n\n const entry: ServiceEntry = {\n id: service.id as string,\n version: service.version as string,\n };\n\n if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n entry.owners = service.owners as string[];\n }\n\n matches.push(entry);\n }\n\n return matches;\n};\n\nconst matchesSchemaChangeResource = (schemaChange: SchemaChange, resources: string[]): boolean => {\n return resources.some((resource) => {\n if (resource === '*') return true;\n if (resource.startsWith('message:')) return schemaChange.resourceChange.resourceId === resource.slice(8);\n if (resource.startsWith('consumes:'))\n return schemaChange.consumerServices.some((service) => service.id === resource.slice(9));\n if (resource.startsWith('produces:'))\n return schemaChange.producerServices.some((service) => service.id === resource.slice(9));\n if (resource.startsWith('service:')) return schemaChange.producerServices.some((service) => service.id === resource.slice(8));\n return false;\n });\n};\n\nconst evaluateDeprecationRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot: CatalogSnapshot,\n targetMessageSets: ServiceMessageSets,\n baseSnapshot?: CatalogSnapshot\n): GovernanceResult[] => {\n const deprecationRules = config.rules.filter((rule) => rule.when.includes('message_deprecated'));\n if (deprecationRules.length === 0) return [];\n\n const targetMessages = buildMessageMap(targetSnapshot);\n const baseMessages = baseSnapshot ? buildMessageMap(baseSnapshot) : undefined;\n const producerIndex = buildServiceIndex(targetSnapshot, 'sends');\n\n // Find messages that were newly deprecated\n const deprecatedResources = diff.resources.filter((rc) => {\n if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n if (!rc.changedFields?.includes('deprecated')) return false;\n\n // Confirm the message is deprecated in the target (not un-deprecated)\n const targetMessage = targetMessages.get(rc.resourceId);\n if (!targetMessage || !targetMessage.deprecated) return false;\n\n // Confirm it was NOT deprecated in the base\n if (baseMessages) {\n const baseMessage = baseMessages.get(rc.resourceId);\n if (baseMessage && baseMessage.deprecated) return false;\n }\n\n return true;\n });\n\n if (deprecatedResources.length === 0) return [];\n\n const results: GovernanceResult[] = [];\n\n for (const rule of deprecationRules) {\n const matched: DeprecationChange[] = [];\n\n for (const rc of deprecatedResources) {\n if (!matchesResourceId(rc.resourceId, undefined, rule.resources, targetMessageSets)) continue;\n\n const producers = producerIndex.get(rc.resourceId) || [];\n matched.push({ resourceChange: rc, producerServices: producers });\n }\n\n if (matched.length > 0) {\n results.push({ rule, trigger: 'message_deprecated', matchedChanges: [], deprecationChanges: matched });\n }\n }\n\n return results;\n};\n\nconst evaluateSchemaChangeRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot: CatalogSnapshot\n): GovernanceResult[] => {\n const schemaRules = config.rules.filter((rule) => rule.when.includes('schema_changed'));\n if (schemaRules.length === 0) return [];\n\n const schemaChangedResources = diff.resources.filter((rc) => {\n if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n return rc.changedFields?.includes('schemaHash');\n });\n\n if (schemaChangedResources.length === 0) return [];\n\n const latestMessageVersions = buildLatestMessageVersionMap(targetSnapshot);\n const schemaChanges = schemaChangedResources.map((resourceChange) => ({\n resourceChange,\n producerServices: getServicesForSchemaChange(targetSnapshot, 'sends', resourceChange, latestMessageVersions),\n consumerServices: getServicesForSchemaChange(targetSnapshot, 'receives', resourceChange, latestMessageVersions),\n }));\n\n const results: GovernanceResult[] = [];\n\n for (const rule of schemaRules) {\n const matched = schemaChanges.filter((schemaChange) => matchesSchemaChangeResource(schemaChange, rule.resources));\n\n if (matched.length > 0) {\n results.push({ rule, trigger: 'schema_changed', matchedChanges: [], schemaChanges: matched });\n }\n }\n\n return results;\n};\n\nconst evaluateBreakingSchemaChangeRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot: CatalogSnapshot\n): GovernanceResult[] => {\n const breakingRules = config.rules.filter((rule) => rule.when.includes('schema_breaking_change'));\n if (breakingRules.length === 0) return [];\n\n const strategy = config.compatibility?.strategy;\n if (!strategy || strategy === 'NONE') return [];\n\n const schemaChangedResources = diff.resources.filter((rc) => {\n if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n return rc.changedFields?.includes('schemaHash');\n });\n\n if (schemaChangedResources.length === 0) return [];\n\n const latestMessageVersions = buildLatestMessageVersionMap(targetSnapshot);\n const breakingSchemaChanges: BreakingSchemaChange[] = schemaChangedResources.map((resourceChange) => ({\n resourceChange,\n producerServices: getServicesForSchemaChange(targetSnapshot, 'sends', resourceChange, latestMessageVersions),\n consumerServices: getServicesForSchemaChange(targetSnapshot, 'receives', resourceChange, latestMessageVersions),\n breakingChanges: [],\n }));\n\n const results: GovernanceResult[] = [];\n\n for (const rule of breakingRules) {\n const matched = breakingSchemaChanges.filter((sc) => matchesSchemaChangeResource(sc, rule.resources));\n if (matched.length > 0) {\n results.push({ rule, trigger: 'schema_breaking_change', matchedChanges: [], breakingSchemaChanges: matched });\n }\n }\n\n return results;\n};\n\nexport const evaluateGovernanceRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot?: CatalogSnapshot,\n baseSnapshot?: CatalogSnapshot\n): GovernanceResult[] => {\n const results: GovernanceResult[] = [];\n const targetMessageSets = targetSnapshot ? buildServiceMessageSets(targetSnapshot) : undefined;\n const baseMessageSets = baseSnapshot ? buildServiceMessageSets(baseSnapshot) : undefined;\n\n for (const rule of config.rules) {\n for (const trigger of rule.when) {\n const filter = TRIGGER_FILTERS[trigger];\n if (!filter) continue;\n\n // For removed triggers, resolve produces:/consumes: prefixes against\n // the base snapshot where the relationship still existed.\n const messageSets = REMOVED_TRIGGERS.has(trigger) && baseMessageSets ? baseMessageSets : targetMessageSets;\n\n const matchedChanges = diff.relationships.filter(\n (c) => filter(c) && matchesResourceId(c.resourceId, c.serviceId, rule.resources, messageSets)\n );\n\n if (matchedChanges.length > 0) {\n results.push({ rule, trigger, matchedChanges });\n }\n }\n }\n\n // Evaluate deprecation rules separately (they operate on resource changes, not relationship changes)\n if (targetSnapshot && targetMessageSets) {\n results.push(...evaluateDeprecationRules(diff, config, targetSnapshot, targetMessageSets, baseSnapshot));\n results.push(...evaluateSchemaChangeRules(diff, config, targetSnapshot));\n results.push(...evaluateBreakingSchemaChangeRules(diff, config, targetSnapshot));\n }\n\n return results;\n};\n\nconst PRODUCER_TRIGGERS: Set<GovernanceTrigger> = new Set(['producer_added', 'producer_removed']);\n\nexport const isProducerTrigger = (trigger: GovernanceTrigger): boolean => PRODUCER_TRIGGERS.has(trigger);\n\nexport const getChangeVerb = (trigger: GovernanceTrigger, changeType: 'added' | 'removed'): string => {\n const producer = isProducerTrigger(trigger);\n return changeType === 'added'\n ? producer\n ? 'now producing'\n : 'now consuming'\n : producer\n ? 'no longer producing'\n : 'no longer consuming';\n};\n\nexport const resolveEnvVars = (value: string): string => {\n return value.replace(/\\$([A-Z_][A-Z0-9_]*)/g, (match, varName) => {\n const envValue = process.env[varName];\n if (envValue === undefined) {\n throw new Error(`Environment variable ${varName} is not set`);\n }\n return envValue;\n });\n};\n\ntype SDK = ReturnType<typeof createSDK>;\n\nconst readSchemaDetails = async (\n sdk: SDK,\n resourceId: string,\n version: string,\n type: string\n): Promise<{ content?: string; schemaPath?: string; schemaHash?: string }> => {\n if (!MESSAGE_RESOURCE_TYPES.has(type)) return {};\n try {\n const schema = await sdk.getSchemaForMessage(resourceId, version);\n if (!schema) return {};\n return {\n content: schema.schema,\n schemaPath: schema.fileName,\n schemaHash: createHash('sha256').update(schema.schema).digest('hex'),\n };\n } catch {\n return {};\n }\n};\n\nexport const enrichSchemaContent = async (\n results: GovernanceResult[],\n baseCatalogDir: string,\n targetCatalogDir: string,\n compatibilityStrategy?: CompatibilityStrategy\n): Promise<void> => {\n const baseSDK = createSDK(baseCatalogDir);\n const targetSDK = createSDK(targetCatalogDir);\n\n const promises: Promise<void>[] = [];\n\n for (const result of results) {\n if (!result.schemaChanges) continue;\n for (const sc of result.schemaChanges) {\n const { resourceId, version, type, changeType, previousVersion, newVersion } = sc.resourceChange;\n const baseVersion = changeType === 'versioned' ? previousVersion || version : version;\n const targetVersion = changeType === 'versioned' ? newVersion || version : version;\n promises.push(\n (async () => {\n const [before, after] = await Promise.all([\n readSchemaDetails(baseSDK, resourceId, baseVersion, type),\n readSchemaDetails(targetSDK, resourceId, targetVersion, type),\n ]);\n sc.before = before.content;\n sc.after = after.content;\n sc.beforeSchemaPath = before.schemaPath;\n sc.afterSchemaPath = after.schemaPath;\n sc.beforeSchemaHash = before.schemaHash;\n sc.afterSchemaHash = after.schemaHash;\n })()\n );\n }\n }\n\n for (const result of results) {\n if (!result.breakingSchemaChanges || !compatibilityStrategy) continue;\n for (const bsc of result.breakingSchemaChanges) {\n const { resourceId, version, type, changeType, previousVersion, newVersion } = bsc.resourceChange;\n const baseVersion = changeType === 'versioned' ? previousVersion || version : version;\n const targetVersion = changeType === 'versioned' ? newVersion || version : version;\n promises.push(\n (async () => {\n const [before, after] = await Promise.all([\n readSchemaDetails(baseSDK, resourceId, baseVersion, type),\n readSchemaDetails(targetSDK, resourceId, targetVersion, type),\n ]);\n bsc.before = before.content;\n bsc.after = after.content;\n bsc.beforeSchemaPath = before.schemaPath;\n bsc.afterSchemaPath = after.schemaPath;\n bsc.beforeSchemaHash = before.schemaHash;\n bsc.afterSchemaHash = after.schemaHash;\n\n if (before.content && after.content) {\n let beforeSchema: object | undefined;\n let afterSchema: object | undefined;\n try {\n beforeSchema = JSON.parse(before.content);\n afterSchema = JSON.parse(after.content);\n } catch {\n // Schema is not valid JSON — skip breaking change detection\n }\n if (beforeSchema && afterSchema) {\n bsc.breakingChanges = detectBreakingChanges(beforeSchema, afterSchema, compatibilityStrategy);\n }\n }\n })()\n );\n }\n }\n\n await Promise.all(promises);\n};\n","import { randomUUID } from 'node:crypto';\nimport type { CatalogSnapshot } from '@eventcatalog/sdk';\nimport type { CompatibilityStrategy } from '@eventcatalog/breaking-changes';\nimport type { GovernanceResult } from './types';\nimport { resolveEnvVars, isProducerTrigger, getChangeVerb } from './rules';\n\nexport type MessageTypeMap = Map<string, string>;\nexport type ServiceOwnersMap = Map<string, string[]>;\n\nexport type GovernanceActionOptions = {\n messageTypes?: MessageTypeMap;\n status?: string;\n serviceOwners?: ServiceOwnersMap;\n baseRef?: string;\n targetRef?: string;\n compatibilityStrategy?: CompatibilityStrategy;\n};\n\nexport const buildMessageTypeMap = (snapshot: CatalogSnapshot): MessageTypeMap => {\n const map: MessageTypeMap = new Map();\n for (const event of snapshot.resources.messages.events) {\n map.set(event.id as string, 'event');\n }\n for (const command of snapshot.resources.messages.commands) {\n map.set(command.id as string, 'command');\n }\n for (const query of snapshot.resources.messages.queries) {\n map.set(query.id as string, 'query');\n }\n return map;\n};\n\nexport const buildServiceOwnersMap = (snapshot: CatalogSnapshot): ServiceOwnersMap => {\n const map: ServiceOwnersMap = new Map();\n for (const service of snapshot.resources.services) {\n if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n map.set(service.id as string, service.owners as string[]);\n }\n }\n return map;\n};\n\nexport const executeGovernanceActions = async (\n results: GovernanceResult[],\n opts: GovernanceActionOptions = {}\n): Promise<string[]> => {\n const { messageTypes, status, serviceOwners, baseRef, targetRef, compatibilityStrategy } = opts;\n const webhookCalls: Array<{ urlTemplate: string; request: Promise<Response> }> = [];\n const now = new Date().toISOString();\n\n for (const result of results) {\n for (const action of result.rule.actions) {\n if (action.type !== 'webhook') continue;\n\n const url = resolveEnvVars(action.url);\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n if (action.headers) {\n for (const [key, value] of Object.entries(action.headers)) {\n headers[key] = resolveEnvVars(value);\n }\n }\n\n // Handle schema changes\n if (result.schemaChanges && result.schemaChanges.length > 0) {\n for (const sc of result.schemaChanges) {\n const messageType = messageTypes?.get(sc.resourceChange.resourceId) || 'message';\n\n const payload = {\n specversion: '1.0',\n type: 'eventcatalog.governance.schema_changed',\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n summary: `Schema changed for ${messageType} ${sc.resourceChange.resourceId}`,\n message: {\n id: sc.resourceChange.resourceId,\n version: sc.resourceChange.version,\n type: messageType,\n },\n schema: {\n beforeHash: sc.beforeSchemaHash ?? null,\n afterHash: sc.afterSchemaHash ?? null,\n beforePath: sc.beforeSchemaPath ?? null,\n afterPath: sc.afterSchemaPath ?? null,\n },\n refs: {\n base: baseRef ?? null,\n target: targetRef ?? null,\n },\n consumers: sc.consumerServices,\n producers: sc.producerServices,\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n continue;\n }\n\n // Handle breaking schema changes\n if (result.breakingSchemaChanges && result.breakingSchemaChanges.length > 0) {\n for (const bsc of result.breakingSchemaChanges) {\n const messageType = messageTypes?.get(bsc.resourceChange.resourceId) || 'message';\n\n const payload = {\n specversion: '1.0',\n type: 'eventcatalog.governance.schema_breaking_change',\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n ...(compatibilityStrategy && { compatibilityStrategy }),\n summary: `Breaking schema change detected for ${messageType} ${bsc.resourceChange.resourceId}`,\n message: {\n id: bsc.resourceChange.resourceId,\n version: bsc.resourceChange.version,\n type: messageType,\n },\n schema: {\n beforeHash: bsc.beforeSchemaHash ?? null,\n afterHash: bsc.afterSchemaHash ?? null,\n beforePath: bsc.beforeSchemaPath ?? null,\n afterPath: bsc.afterSchemaPath ?? null,\n },\n breakingChanges: bsc.breakingChanges,\n refs: {\n base: baseRef ?? null,\n target: targetRef ?? null,\n },\n consumers: bsc.consumerServices,\n producers: bsc.producerServices,\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n continue;\n }\n\n // Handle deprecation changes\n if (result.deprecationChanges && result.deprecationChanges.length > 0) {\n for (const dc of result.deprecationChanges) {\n const messageType = messageTypes?.get(dc.resourceChange.resourceId) || 'message';\n\n const producers =\n dc.producerServices.length > 0\n ? dc.producerServices\n : [{ id: 'unknown', version: 'unknown' } as { id: string; version: string; owners?: string[] }];\n\n for (const producer of producers) {\n const payload = {\n specversion: '1.0',\n type: `eventcatalog.governance.message_deprecated`,\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n summary: `${dc.resourceChange.resourceId} (${messageType}) has been deprecated by ${producer.id}`,\n producer: {\n id: producer.id,\n version: producer.version,\n ...(producer.owners && { owners: producer.owners }),\n },\n message: {\n id: dc.resourceChange.resourceId,\n version: dc.resourceChange.version,\n type: messageType,\n },\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n }\n continue;\n }\n\n // Handle relationship changes\n for (const change of result.matchedChanges) {\n const verb = getChangeVerb(result.trigger, change.changeType);\n const messageType = messageTypes?.get(change.resourceId) || 'message';\n const serviceRole = isProducerTrigger(result.trigger) ? 'producer' : 'consumer';\n\n const payload = {\n specversion: '1.0',\n type: `eventcatalog.governance.${result.trigger}`,\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n summary: `${change.serviceId} is ${verb} the ${messageType} ${change.resourceId}`,\n [serviceRole]: {\n id: change.serviceId,\n version: change.serviceVersion,\n ...(serviceOwners?.get(change.serviceId) && { owners: serviceOwners.get(change.serviceId) }),\n },\n message: {\n id: change.resourceId,\n version: change.resourceVersion,\n type: messageType,\n },\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n }\n }\n\n const settled = await Promise.allSettled(webhookCalls.map((c) => c.request));\n\n return settled.map((result, i) => {\n const url = webhookCalls[i].urlTemplate;\n if (result.status === 'fulfilled') {\n const res = result.value;\n if (!res.ok) {\n return ` Webhook failed: ${url} ✗ (HTTP ${res.status})`;\n }\n return ` Webhook sent: ${url} ✓`;\n }\n return ` Webhook failed: ${url} ✗ (${result.reason instanceof Error ? result.reason.message : String(result.reason)})`;\n });\n};\n","import type { GovernanceResult } from './types';\nimport { getChangeVerb } from './rules';\n\nexport const formatGovernanceOutput = (results: GovernanceResult[]): string => {\n if (results.length === 0) {\n return 'No governance rules triggered. Catalog is compliant.';\n }\n\n const lines: string[] = ['Governance:', ''];\n\n for (const result of results) {\n lines.push(` Rule \"${result.rule.name}\" triggered (${result.trigger}):`);\n\n if (result.schemaChanges && result.schemaChanges.length > 0) {\n for (const sc of result.schemaChanges) {\n const consumers = sc.consumerServices.length > 0 ? sc.consumerServices.map((c) => c.id).join(', ') : 'no known consumers';\n lines.push(\n ` ! Schema changed for ${sc.resourceChange.resourceId} (${sc.resourceChange.type}) — consumers: ${consumers}`\n );\n }\n } else if (result.deprecationChanges && result.deprecationChanges.length > 0) {\n for (const dc of result.deprecationChanges) {\n const producers = dc.producerServices.length > 0 ? dc.producerServices.map((p) => p.id).join(', ') : 'unknown producer';\n lines.push(` ! ${dc.resourceChange.resourceId} (${dc.resourceChange.type}) deprecated by ${producers}`);\n }\n } else {\n for (const change of result.matchedChanges) {\n const prefix = change.changeType === 'added' ? '+' : '-';\n const verb = getChangeVerb(result.trigger, change.changeType);\n lines.push(` ${prefix} ${change.serviceId} is ${verb} ${change.resourceId}`);\n }\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n};\n\nexport const formatFailureOutput = (failures: Array<{ ruleName: string; messages: string[] }>): string => {\n if (failures.length === 0) return '';\n\n const lines: string[] = [];\n\n for (const f of failures) {\n lines.push(`FAILED: ${f.ruleName}`);\n for (const msg of f.messages) {\n lines.push(` ${msg}`);\n }\n }\n\n return lines.join('\\n');\n};\n","import path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { mkdtempSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport dotenv from 'dotenv';\nimport createSDK from '@eventcatalog/sdk';\nimport { isEventCatalogScaleEnabled } from '@eventcatalog/license';\nimport { loadGovernanceConfig, evaluateGovernanceRules, enrichSchemaContent, resolveEnvVars } from './rules';\nimport { formatGovernanceOutput, formatFailureOutput } from './format';\nimport { executeGovernanceActions, buildMessageTypeMap, buildServiceOwnersMap } from './actions';\nimport type { GovernanceCheckResult } from './types';\n\nexport type GovernanceCheckOptions = {\n base?: string;\n target?: string;\n format?: string;\n status?: string;\n dir: string;\n};\n\nconst BRANCH_NAME_RE = /^[a-zA-Z0-9._\\-/]+$/;\n\nconst extractBranchToTempDir = (branch: string, catalogDir: string, tempDirs: string[]): string => {\n if (!BRANCH_NAME_RE.test(branch)) {\n throw new Error(`Invalid branch name: \"${branch}\"`);\n }\n const tmpDir = mkdtempSync(path.join(tmpdir(), 'ec-governance-'));\n tempDirs.push(tmpDir);\n try {\n execSync(`git archive ${branch} | tar -x -C ${tmpDir}`, { cwd: catalogDir, stdio: 'pipe' });\n } catch {\n throw new Error(`Failed to extract branch \"${branch}\". Is it a valid git branch?`);\n }\n return tmpDir;\n};\n\nexport const governanceCheck = async (opts: GovernanceCheckOptions): Promise<GovernanceCheckResult> => {\n const dir = path.resolve(opts.dir);\n\n // Load .env file from catalog directory (contains license key, webhook secrets, etc.)\n dotenv.config({ path: path.join(dir, '.env') });\n\n const isScale = await isEventCatalogScaleEnabled();\n if (!isScale) {\n throw new Error('Governance requires an EventCatalog Scale plan. Learn more at https://eventcatalog.dev/pricing');\n }\n\n const baseBranch = opts.base || 'main';\n\n const tempDirs: string[] = [];\n const trackTempDir = (prefix: string): string => {\n const d = mkdtempSync(path.join(tmpdir(), prefix));\n tempDirs.push(d);\n return d;\n };\n\n try {\n const baseTmpDir = extractBranchToTempDir(baseBranch, dir, tempDirs);\n\n const baseSnapshotDir = trackTempDir('ec-snap-base-');\n const targetSnapshotDir = trackTempDir('ec-snap-target-');\n\n const baseSDK = createSDK(baseTmpDir);\n const baseResult = await baseSDK.createSnapshot({ label: `base-${baseBranch}`, outputDir: baseSnapshotDir });\n\n let targetResult;\n let targetCatalogDir: string;\n if (opts.target) {\n targetCatalogDir = extractBranchToTempDir(opts.target, dir, tempDirs);\n const targetSDK = createSDK(targetCatalogDir);\n targetResult = await targetSDK.createSnapshot({ label: `target-${opts.target}`, outputDir: targetSnapshotDir });\n } else {\n targetCatalogDir = dir;\n const targetSDK = createSDK(dir);\n targetResult = await targetSDK.createSnapshot({ label: 'current', outputDir: targetSnapshotDir });\n }\n\n const diff = await baseSDK.diffSnapshots(baseResult.filePath, targetResult.filePath);\n\n const config = loadGovernanceConfig(dir);\n\n if (config.rules.length === 0) {\n return { output: 'No governance.yaml (or governance.yml) found or no rules defined.', exitCode: 0, failures: [] };\n }\n\n const results = evaluateGovernanceRules(diff, config, targetResult.snapshot, baseResult.snapshot);\n\n // Populate before/after schema content for any schema_changed results\n await enrichSchemaContent(results, baseTmpDir, targetCatalogDir, config.compatibility?.strategy);\n\n // Remove schema_breaking_change results where no actual breaking changes were found\n const filteredResults = results.filter((r) => {\n if (r.trigger !== 'schema_breaking_change') return true;\n if (!r.breakingSchemaChanges) return false;\n r.breakingSchemaChanges = r.breakingSchemaChanges.filter((bsc) => bsc.breakingChanges.length > 0);\n return r.breakingSchemaChanges.length > 0;\n });\n\n // Mark results that have fail actions and collect their messages\n for (const result of filteredResults) {\n const failActions = result.rule.actions.filter((a) => a.type === 'fail');\n if (failActions.length > 0) {\n result.failed = true;\n result.failMessages = failActions\n .map((a) => ('message' in a && a.message ? resolveEnvVars(a.message) : undefined))\n .filter((m): m is string => m !== undefined);\n }\n }\n\n // Always execute actions (webhooks) regardless of output format\n const messageTypes = buildMessageTypeMap(targetResult.snapshot);\n const serviceOwners = buildServiceOwnersMap(targetResult.snapshot);\n const actionOutput = await executeGovernanceActions(filteredResults, {\n messageTypes,\n status: opts.status,\n serviceOwners,\n baseRef: baseBranch,\n targetRef: opts.target || 'working-directory',\n compatibilityStrategy: config.compatibility?.strategy,\n });\n\n // Collect failures\n const failures = filteredResults\n .filter((r) => r.failed)\n .map((r) => ({ ruleName: r.rule.name, messages: r.failMessages || [] }));\n\n if (opts.format === 'json') {\n const jsonOutput = {\n baseBranch,\n target: opts.target || 'working directory',\n results: filteredResults,\n summary: {\n rulesTriggered: filteredResults.length,\n failures: failures.length,\n passed: failures.length === 0,\n },\n diff: diff.summary,\n };\n return { output: JSON.stringify(jsonOutput, null, 2), exitCode: failures.length > 0 ? 1 : 0, failures };\n }\n\n const targetLabel = opts.target || 'working directory';\n const lines: string[] = [`Governance check: comparing ${targetLabel} against ${baseBranch}`, ''];\n\n lines.push(formatGovernanceOutput(filteredResults));\n\n if (actionOutput.length > 0) {\n lines.push('');\n lines.push(...actionOutput);\n }\n\n if (filteredResults.length > 0) {\n const webhookCount = actionOutput.filter((l) => l.includes('Webhook sent')).length;\n const parts = [`${filteredResults.length} rule${filteredResults.length === 1 ? '' : 's'} triggered`];\n if (webhookCount > 0) parts.push(`${webhookCount} webhook${webhookCount === 1 ? '' : 's'} sent`);\n lines.push('');\n lines.push(parts.join(', ') + '.');\n }\n\n // Append failure output\n const failureOutput = formatFailureOutput(failures);\n if (failureOutput) {\n lines.push('');\n lines.push(failureOutput);\n }\n\n return { output: lines.join('\\n'), exitCode: failures.length > 0 ? 1 : 0, failures };\n } finally {\n for (const d of tempDirs) {\n rmSync(d, { recursive: true, force: true });\n }\n }\n};\n"],"mappings":"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","names":["readFileSync","resolve","createSDK","createSDK","version","dsl","existsSync","writeFileSync","resolve","createSDK","program","path","version","resolve","writeFileSync","existsSync","createSDK","resolve","createSDK","version","path","createSDK","c","snapshot","version","randomUUID","snapshot","randomUUID","c","c","path","rmSync","createSDK","path","createSDK","rmSync","resolve","readFileSync","result"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.9_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js","../../src/cli/index.ts","../../src/cli/executor.ts","../../src/cli/parser.ts","../../src/cli/list.ts","../../src/cli/export.ts","../../src/cli/import.ts","../../src/cli/dsl-managed-keys.ts","../../src/cli/snapshot.ts","../../src/cli/governance/rules.ts","../../src/cli/governance/actions.ts","../../src/cli/governance/format.ts","../../src/cli/governance/check.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { executeFunction } from './executor';\nimport { listFunctions, formatListOutput } from './list';\nimport { exportResource, exportCatalog } from './export';\nimport { importDSL } from './import';\nimport { snapshotCreate, snapshotDiff, snapshotList } from './snapshot';\nimport { governanceCheck } from './governance';\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 Compass', 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// Snapshot command group\nconst snapshot = program.command('snapshot').description('Create, diff, and list catalog snapshots');\n\nsnapshot\n .command('create')\n .description('Take a point-in-time snapshot of the catalog')\n .option('--label <label>', 'Human-readable label (default: ISO timestamp)')\n .option('-o, --output <path>', 'Output directory for the snapshot file')\n .option('--stdout', 'Print JSON to stdout instead of writing a file', false)\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await snapshotCreate({ label: opts.label, output: opts.output, stdout: opts.stdout, dir });\n console.log(result);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nsnapshot\n .command('diff <fileA> <fileB>')\n .description('Compare two snapshot files and output a structured diff')\n .option('--format <format>', 'Output format: text or json', 'text')\n .action(async (fileA: string, fileB: string, opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await snapshotDiff({ fileA, fileB, format: opts.format, dir });\n console.log(result);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\nsnapshot\n .command('list')\n .description('List all snapshots in the catalog')\n .option('--format <format>', 'Output format: text or json', 'text')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await snapshotList({ format: opts.format, dir });\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// Governance command group\nconst governance = program.command('governance').description('Run governance rules against catalog changes');\n\ngovernance\n .command('check')\n .description('Compare catalog against a base branch and evaluate governance rules')\n .option('--base <branch>', 'Base branch to compare against (default: main)')\n .option('--target <branch>', 'Target branch to compare (default: current working directory)')\n .option('--format <format>', 'Output format: text or json', 'text')\n .option('--status <status>', 'Status label to include in webhook payloads (e.g. proposed, approved)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts() as any;\n const dir = globalOpts.dir || '.';\n const result = await governanceCheck({\n base: opts.base,\n target: opts.target,\n format: opts.format,\n status: opts.status,\n dir,\n });\n console.log(result.output);\n process.exitCode = result.exitCode;\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://compass.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in EventCatalog Compass...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Compass`);\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://compass.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in EventCatalog Compass...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Compass`);\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://compass.eventcatalog.dev/?code=${encoded}`;\n await open(playgroundUrl);\n lines.push('', ` Opening in EventCatalog Compass...`);\n } else {\n lines.push('', ` Tip: Use --playground to open in EventCatalog Compass`);\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","import { resolve } from 'node:path';\nimport { rmSync } from 'node:fs';\nimport createSDK from '@eventcatalog/sdk';\n\nexport const snapshotCreate = async (opts: { label?: string; output?: string; stdout?: boolean; dir: string }) => {\n const dir = resolve(opts.dir);\n const sdk = createSDK(dir);\n\n const result = await sdk.createSnapshot({\n label: opts.label,\n outputDir: opts.output ? resolve(opts.output) : undefined,\n });\n\n if (opts.stdout) {\n rmSync(result.filePath, { force: true });\n return JSON.stringify(result.snapshot, null, 2);\n }\n\n const resources = result.snapshot.resources;\n const counts = [\n resources.services.length && `${resources.services.length} services`,\n resources.messages.events.length && `${resources.messages.events.length} events`,\n resources.messages.commands.length && `${resources.messages.commands.length} commands`,\n resources.messages.queries.length && `${resources.messages.queries.length} queries`,\n resources.domains.length && `${resources.domains.length} domains`,\n resources.channels.length && `${resources.channels.length} channels`,\n ]\n .filter(Boolean)\n .join(', ');\n\n return `Snapshot created: ${result.filePath}\\nResources: ${counts}`;\n};\n\nconst formatDiffText = (diff: any): string => {\n const lines: string[] = [];\n\n const labelA = diff.snapshotA.label;\n const labelB = diff.snapshotB.label;\n lines.push(`Comparing: ${labelA} vs ${labelB}`);\n lines.push('');\n\n if (diff.resources.length > 0) {\n lines.push(`Resources (${diff.resources.length} changes):`);\n for (const r of diff.resources) {\n const prefix = r.changeType === 'added' ? '+' : r.changeType === 'removed' ? '-' : r.changeType === 'versioned' ? '^' : '~';\n const version = r.changeType === 'versioned' ? `${r.previousVersion} -> ${r.newVersion}` : r.version;\n const fields = r.changedFields ? ` (${r.changedFields.join(', ')})` : '';\n lines.push(` ${prefix} ${r.resourceId}@${version} [${r.type}] ${r.changeType}${fields}`);\n }\n lines.push('');\n }\n\n if (diff.relationships.length > 0) {\n lines.push(`Relationships (${diff.relationships.length} changes):`);\n for (const r of diff.relationships) {\n const prefix = r.changeType === 'added' ? '+' : '-';\n lines.push(\n ` ${prefix} ${r.serviceId} --${r.direction}--> ${r.resourceId}${r.resourceVersion ? `@${r.resourceVersion}` : ''}`\n );\n }\n lines.push('');\n }\n\n if (diff.summary.totalChanges === 0) {\n lines.push('No changes detected.');\n } else {\n lines.push(`Summary: ${diff.resources.length} resource changes, ${diff.relationships.length} relationship changes`);\n }\n\n return lines.join('\\n');\n};\n\nexport const snapshotDiff = async (opts: { fileA: string; fileB: string; format?: string; dir: string }) => {\n const dir = resolve(opts.dir);\n const sdk = createSDK(dir);\n\n const diff = await sdk.diffSnapshots(resolve(opts.fileA), resolve(opts.fileB));\n\n if (opts.format === 'json') {\n return JSON.stringify(diff, null, 2);\n }\n\n return formatDiffText(diff);\n};\n\nexport const snapshotList = async (opts: { format?: string; dir: string }) => {\n const dir = resolve(opts.dir);\n const sdk = createSDK(dir);\n\n const snapshots = await sdk.listSnapshots();\n\n if (opts.format === 'json') {\n return JSON.stringify(snapshots, null, 2);\n }\n\n if (snapshots.length === 0) {\n return 'No snapshots found.';\n }\n\n const lines = ['Snapshots:', ''];\n for (const s of snapshots) {\n const git = s.git ? ` (${s.git.branch} ${s.git.commit})` : '';\n lines.push(` ${s.label} ${s.createdAt}${git}`);\n lines.push(` ${s.filePath}`);\n }\n\n return lines.join('\\n');\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport yaml from 'js-yaml';\nimport { satisfies, validRange } from 'semver';\nimport createSDK from '@eventcatalog/sdk';\nimport type { SnapshotDiff, RelationshipChange, CatalogSnapshot, ResourceChange } from '@eventcatalog/sdk';\nimport type {\n GovernanceConfig,\n GovernanceTrigger,\n GovernanceResult,\n DeprecationChange,\n SchemaChange,\n BreakingSchemaChange,\n} from './types';\nimport { detectBreakingChanges } from '@eventcatalog/breaking-changes';\nimport type { CompatibilityStrategy } from '@eventcatalog/breaking-changes';\n\nexport const loadGovernanceConfig = (catalogDir: string): GovernanceConfig => {\n const yamlPath = path.join(catalogDir, 'governance.yaml');\n const ymlPath = path.join(catalogDir, 'governance.yml');\n\n const configPath = fs.existsSync(yamlPath) ? yamlPath : fs.existsSync(ymlPath) ? ymlPath : null;\n\n if (!configPath) {\n return { rules: [] };\n }\n\n const content = fs.readFileSync(configPath, 'utf-8');\n const parsed = yaml.load(content) as GovernanceConfig;\n const rules = parsed?.rules || [];\n\n for (const rule of rules) {\n for (const action of rule.actions) {\n if (action.type === 'fail' && action.message !== undefined && typeof action.message !== 'string') {\n throw new Error(`Invalid \"message\" in fail action for rule \"${rule.name}\". Must be a string.`);\n }\n }\n }\n\n if (parsed?.compatibility?.strategy) {\n const validStrategies = new Set(['BACKWARD', 'FORWARD', 'FULL', 'NONE']);\n if (!validStrategies.has(parsed.compatibility.strategy)) {\n throw new Error(\n `Invalid compatibility strategy \"${parsed.compatibility.strategy}\". Must be one of: BACKWARD, FORWARD, FULL, NONE.`\n );\n }\n }\n\n return {\n ...(parsed?.compatibility && { compatibility: parsed.compatibility }),\n rules,\n };\n};\n\nconst TRIGGER_FILTERS: Partial<Record<GovernanceTrigger, (change: RelationshipChange) => boolean>> = {\n consumer_added: (c) => c.direction === 'receives' && c.changeType === 'added',\n consumer_removed: (c) => c.direction === 'receives' && c.changeType === 'removed',\n producer_added: (c) => c.direction === 'sends' && c.changeType === 'added',\n producer_removed: (c) => c.direction === 'sends' && c.changeType === 'removed',\n};\n\nexport const buildServiceMessageSets = (\n snapshot: CatalogSnapshot\n): { produces: Map<string, Set<string>>; consumes: Map<string, Set<string>> } => {\n const produces = new Map<string, Set<string>>();\n const consumes = new Map<string, Set<string>>();\n\n for (const service of snapshot.resources.services) {\n const serviceId = service.id as string;\n if (service.sends) {\n const ids = new Set<string>();\n for (const s of service.sends) ids.add(s.id as string);\n produces.set(serviceId, ids);\n }\n if (service.receives) {\n const ids = new Set<string>();\n for (const r of service.receives) ids.add(r.id as string);\n consumes.set(serviceId, ids);\n }\n }\n\n return { produces, consumes };\n};\n\ntype ServiceMessageSets = ReturnType<typeof buildServiceMessageSets>;\n\nconst matchesResourceId = (\n resourceId: string,\n serviceId: string | undefined,\n resources: string[],\n messageSets?: ServiceMessageSets\n): boolean => {\n return resources.some((r) => {\n if (r === '*') return true;\n if (r.startsWith('service:')) {\n if (serviceId) return serviceId === r.slice(8);\n // For deprecation: match if the specified service produces this message\n return messageSets?.produces.get(r.slice(8))?.has(resourceId) ?? false;\n }\n if (r.startsWith('message:')) return resourceId === r.slice(8);\n if (r.startsWith('produces:')) return messageSets?.produces.get(r.slice(9))?.has(resourceId) ?? false;\n if (r.startsWith('consumes:')) return messageSets?.consumes.get(r.slice(9))?.has(resourceId) ?? false;\n return false;\n });\n};\n\nconst REMOVED_TRIGGERS: Set<GovernanceTrigger> = new Set(['consumer_removed', 'producer_removed']);\n\nconst MESSAGE_RESOURCE_TYPES = new Set(['event', 'command', 'query']);\n\nconst buildMessageMap = (snapshot: CatalogSnapshot): Map<string, Record<string, any>> => {\n const map = new Map<string, Record<string, any>>();\n for (const msg of snapshot.resources.messages.events) map.set(msg.id as string, msg);\n for (const msg of snapshot.resources.messages.commands) map.set(msg.id as string, msg);\n for (const msg of snapshot.resources.messages.queries) map.set(msg.id as string, msg);\n return map;\n};\n\ntype ServiceEntry = { id: string; version: string; owners?: string[] };\n\nconst buildServiceIndex = (snapshot: CatalogSnapshot, direction: 'sends' | 'receives'): Map<string, ServiceEntry[]> => {\n const index = new Map<string, ServiceEntry[]>();\n for (const service of snapshot.resources.services) {\n const pointers = service[direction] as Array<{ id: string }> | undefined;\n if (!pointers) continue;\n for (const pointer of pointers) {\n let entries = index.get(pointer.id);\n if (!entries) {\n entries = [];\n index.set(pointer.id, entries);\n }\n const entry: ServiceEntry = {\n id: service.id as string,\n version: service.version as string,\n };\n if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n entry.owners = service.owners as string[];\n }\n entries.push(entry);\n }\n }\n return index;\n};\n\nconst getMessageTypeKey = (resourceId: string, type: string): string => `${type}:${resourceId}`;\n\nconst buildLatestMessageVersionMap = (snapshot: CatalogSnapshot): Map<string, string> => {\n const versions = new Map<string, string>();\n\n for (const event of snapshot.resources.messages.events) {\n versions.set(getMessageTypeKey(event.id as string, 'event'), event.version as string);\n }\n for (const command of snapshot.resources.messages.commands) {\n versions.set(getMessageTypeKey(command.id as string, 'command'), command.version as string);\n }\n for (const query of snapshot.resources.messages.queries) {\n versions.set(getMessageTypeKey(query.id as string, 'query'), query.version as string);\n }\n\n return versions;\n};\n\nconst getTargetMessageVersion = (resourceChange: ResourceChange): string => {\n if (resourceChange.changeType === 'versioned') {\n return resourceChange.newVersion || resourceChange.version;\n }\n return resourceChange.version;\n};\n\nconst pointerTargetsChangedVersion = (\n pointer: { id: string; version?: string },\n resourceChange: ResourceChange,\n latestMessageVersions: Map<string, string>\n): boolean => {\n if (pointer.id !== resourceChange.resourceId) return false;\n\n const targetVersion = getTargetMessageVersion(resourceChange);\n const pointerVersion = pointer.version;\n\n if (!pointerVersion || pointerVersion === 'latest') {\n const latestVersion = latestMessageVersions.get(getMessageTypeKey(resourceChange.resourceId, resourceChange.type));\n if (!latestVersion) return true;\n return latestVersion === targetVersion;\n }\n\n if (validRange(pointerVersion)) {\n try {\n return satisfies(targetVersion, pointerVersion);\n } catch {\n return false;\n }\n }\n\n return pointerVersion === targetVersion;\n};\n\nconst getServicesForSchemaChange = (\n snapshot: CatalogSnapshot,\n direction: 'sends' | 'receives',\n resourceChange: ResourceChange,\n latestMessageVersions: Map<string, string>\n): ServiceEntry[] => {\n const matches: ServiceEntry[] = [];\n\n for (const service of snapshot.resources.services) {\n const pointers = service[direction] as Array<{ id: string; version?: string }> | undefined;\n if (!pointers) continue;\n\n const hasMatch = pointers.some((pointer) => pointerTargetsChangedVersion(pointer, resourceChange, latestMessageVersions));\n if (!hasMatch) continue;\n\n const entry: ServiceEntry = {\n id: service.id as string,\n version: service.version as string,\n };\n\n if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n entry.owners = service.owners as string[];\n }\n\n matches.push(entry);\n }\n\n return matches;\n};\n\nconst matchesSchemaChangeResource = (schemaChange: SchemaChange, resources: string[]): boolean => {\n return resources.some((resource) => {\n if (resource === '*') return true;\n if (resource.startsWith('message:')) return schemaChange.resourceChange.resourceId === resource.slice(8);\n if (resource.startsWith('consumes:'))\n return schemaChange.consumerServices.some((service) => service.id === resource.slice(9));\n if (resource.startsWith('produces:'))\n return schemaChange.producerServices.some((service) => service.id === resource.slice(9));\n if (resource.startsWith('service:')) return schemaChange.producerServices.some((service) => service.id === resource.slice(8));\n return false;\n });\n};\n\nconst evaluateDeprecationRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot: CatalogSnapshot,\n targetMessageSets: ServiceMessageSets,\n baseSnapshot?: CatalogSnapshot\n): GovernanceResult[] => {\n const deprecationRules = config.rules.filter((rule) => rule.when.includes('message_deprecated'));\n if (deprecationRules.length === 0) return [];\n\n const targetMessages = buildMessageMap(targetSnapshot);\n const baseMessages = baseSnapshot ? buildMessageMap(baseSnapshot) : undefined;\n const producerIndex = buildServiceIndex(targetSnapshot, 'sends');\n\n // Find messages that were newly deprecated\n const deprecatedResources = diff.resources.filter((rc) => {\n if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n if (!rc.changedFields?.includes('deprecated')) return false;\n\n // Confirm the message is deprecated in the target (not un-deprecated)\n const targetMessage = targetMessages.get(rc.resourceId);\n if (!targetMessage || !targetMessage.deprecated) return false;\n\n // Confirm it was NOT deprecated in the base\n if (baseMessages) {\n const baseMessage = baseMessages.get(rc.resourceId);\n if (baseMessage && baseMessage.deprecated) return false;\n }\n\n return true;\n });\n\n if (deprecatedResources.length === 0) return [];\n\n const results: GovernanceResult[] = [];\n\n for (const rule of deprecationRules) {\n const matched: DeprecationChange[] = [];\n\n for (const rc of deprecatedResources) {\n if (!matchesResourceId(rc.resourceId, undefined, rule.resources, targetMessageSets)) continue;\n\n const producers = producerIndex.get(rc.resourceId) || [];\n matched.push({ resourceChange: rc, producerServices: producers });\n }\n\n if (matched.length > 0) {\n results.push({ rule, trigger: 'message_deprecated', matchedChanges: [], deprecationChanges: matched });\n }\n }\n\n return results;\n};\n\nconst evaluateSchemaChangeRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot: CatalogSnapshot\n): GovernanceResult[] => {\n const schemaRules = config.rules.filter((rule) => rule.when.includes('schema_changed'));\n if (schemaRules.length === 0) return [];\n\n const schemaChangedResources = diff.resources.filter((rc) => {\n if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n return rc.changedFields?.includes('schemaHash');\n });\n\n if (schemaChangedResources.length === 0) return [];\n\n const latestMessageVersions = buildLatestMessageVersionMap(targetSnapshot);\n const schemaChanges = schemaChangedResources.map((resourceChange) => ({\n resourceChange,\n producerServices: getServicesForSchemaChange(targetSnapshot, 'sends', resourceChange, latestMessageVersions),\n consumerServices: getServicesForSchemaChange(targetSnapshot, 'receives', resourceChange, latestMessageVersions),\n }));\n\n const results: GovernanceResult[] = [];\n\n for (const rule of schemaRules) {\n const matched = schemaChanges.filter((schemaChange) => matchesSchemaChangeResource(schemaChange, rule.resources));\n\n if (matched.length > 0) {\n results.push({ rule, trigger: 'schema_changed', matchedChanges: [], schemaChanges: matched });\n }\n }\n\n return results;\n};\n\nconst evaluateBreakingSchemaChangeRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot: CatalogSnapshot\n): GovernanceResult[] => {\n const breakingRules = config.rules.filter((rule) => rule.when.includes('schema_breaking_change'));\n if (breakingRules.length === 0) return [];\n\n const strategy = config.compatibility?.strategy;\n if (!strategy || strategy === 'NONE') return [];\n\n const schemaChangedResources = diff.resources.filter((rc) => {\n if (!MESSAGE_RESOURCE_TYPES.has(rc.type)) return false;\n return rc.changedFields?.includes('schemaHash');\n });\n\n if (schemaChangedResources.length === 0) return [];\n\n const latestMessageVersions = buildLatestMessageVersionMap(targetSnapshot);\n const breakingSchemaChanges: BreakingSchemaChange[] = schemaChangedResources.map((resourceChange) => ({\n resourceChange,\n producerServices: getServicesForSchemaChange(targetSnapshot, 'sends', resourceChange, latestMessageVersions),\n consumerServices: getServicesForSchemaChange(targetSnapshot, 'receives', resourceChange, latestMessageVersions),\n breakingChanges: [],\n }));\n\n const results: GovernanceResult[] = [];\n\n for (const rule of breakingRules) {\n const matched = breakingSchemaChanges.filter((sc) => matchesSchemaChangeResource(sc, rule.resources));\n if (matched.length > 0) {\n results.push({ rule, trigger: 'schema_breaking_change', matchedChanges: [], breakingSchemaChanges: matched });\n }\n }\n\n return results;\n};\n\nexport const evaluateGovernanceRules = (\n diff: SnapshotDiff,\n config: GovernanceConfig,\n targetSnapshot?: CatalogSnapshot,\n baseSnapshot?: CatalogSnapshot\n): GovernanceResult[] => {\n const results: GovernanceResult[] = [];\n const targetMessageSets = targetSnapshot ? buildServiceMessageSets(targetSnapshot) : undefined;\n const baseMessageSets = baseSnapshot ? buildServiceMessageSets(baseSnapshot) : undefined;\n\n for (const rule of config.rules) {\n for (const trigger of rule.when) {\n const filter = TRIGGER_FILTERS[trigger];\n if (!filter) continue;\n\n // For removed triggers, resolve produces:/consumes: prefixes against\n // the base snapshot where the relationship still existed.\n const messageSets = REMOVED_TRIGGERS.has(trigger) && baseMessageSets ? baseMessageSets : targetMessageSets;\n\n const matchedChanges = diff.relationships.filter(\n (c) => filter(c) && matchesResourceId(c.resourceId, c.serviceId, rule.resources, messageSets)\n );\n\n if (matchedChanges.length > 0) {\n results.push({ rule, trigger, matchedChanges });\n }\n }\n }\n\n // Evaluate deprecation rules separately (they operate on resource changes, not relationship changes)\n if (targetSnapshot && targetMessageSets) {\n results.push(...evaluateDeprecationRules(diff, config, targetSnapshot, targetMessageSets, baseSnapshot));\n results.push(...evaluateSchemaChangeRules(diff, config, targetSnapshot));\n results.push(...evaluateBreakingSchemaChangeRules(diff, config, targetSnapshot));\n }\n\n return results;\n};\n\nconst PRODUCER_TRIGGERS: Set<GovernanceTrigger> = new Set(['producer_added', 'producer_removed']);\n\nexport const isProducerTrigger = (trigger: GovernanceTrigger): boolean => PRODUCER_TRIGGERS.has(trigger);\n\nexport const getChangeVerb = (trigger: GovernanceTrigger, changeType: 'added' | 'removed'): string => {\n const producer = isProducerTrigger(trigger);\n return changeType === 'added'\n ? producer\n ? 'now producing'\n : 'now consuming'\n : producer\n ? 'no longer producing'\n : 'no longer consuming';\n};\n\nexport const resolveEnvVars = (value: string): string => {\n return value.replace(/\\$([A-Z_][A-Z0-9_]*)/g, (match, varName) => {\n const envValue = process.env[varName];\n if (envValue === undefined) {\n throw new Error(`Environment variable ${varName} is not set`);\n }\n return envValue;\n });\n};\n\ntype SDK = ReturnType<typeof createSDK>;\n\nconst readSchemaDetails = async (\n sdk: SDK,\n resourceId: string,\n version: string,\n type: string\n): Promise<{ content?: string; schemaPath?: string; schemaHash?: string }> => {\n if (!MESSAGE_RESOURCE_TYPES.has(type)) return {};\n try {\n const schema = await sdk.getSchemaForMessage(resourceId, version);\n if (!schema) return {};\n return {\n content: schema.schema,\n schemaPath: schema.fileName,\n schemaHash: createHash('sha256').update(schema.schema).digest('hex'),\n };\n } catch {\n return {};\n }\n};\n\nexport const enrichSchemaContent = async (\n results: GovernanceResult[],\n baseCatalogDir: string,\n targetCatalogDir: string,\n compatibilityStrategy?: CompatibilityStrategy\n): Promise<void> => {\n const baseSDK = createSDK(baseCatalogDir);\n const targetSDK = createSDK(targetCatalogDir);\n\n const promises: Promise<void>[] = [];\n\n for (const result of results) {\n if (!result.schemaChanges) continue;\n for (const sc of result.schemaChanges) {\n const { resourceId, version, type, changeType, previousVersion, newVersion } = sc.resourceChange;\n const baseVersion = changeType === 'versioned' ? previousVersion || version : version;\n const targetVersion = changeType === 'versioned' ? newVersion || version : version;\n promises.push(\n (async () => {\n const [before, after] = await Promise.all([\n readSchemaDetails(baseSDK, resourceId, baseVersion, type),\n readSchemaDetails(targetSDK, resourceId, targetVersion, type),\n ]);\n sc.before = before.content;\n sc.after = after.content;\n sc.beforeSchemaPath = before.schemaPath;\n sc.afterSchemaPath = after.schemaPath;\n sc.beforeSchemaHash = before.schemaHash;\n sc.afterSchemaHash = after.schemaHash;\n })()\n );\n }\n }\n\n for (const result of results) {\n if (!result.breakingSchemaChanges || !compatibilityStrategy) continue;\n for (const bsc of result.breakingSchemaChanges) {\n const { resourceId, version, type, changeType, previousVersion, newVersion } = bsc.resourceChange;\n const baseVersion = changeType === 'versioned' ? previousVersion || version : version;\n const targetVersion = changeType === 'versioned' ? newVersion || version : version;\n promises.push(\n (async () => {\n const [before, after] = await Promise.all([\n readSchemaDetails(baseSDK, resourceId, baseVersion, type),\n readSchemaDetails(targetSDK, resourceId, targetVersion, type),\n ]);\n bsc.before = before.content;\n bsc.after = after.content;\n bsc.beforeSchemaPath = before.schemaPath;\n bsc.afterSchemaPath = after.schemaPath;\n bsc.beforeSchemaHash = before.schemaHash;\n bsc.afterSchemaHash = after.schemaHash;\n\n if (before.content && after.content) {\n let beforeSchema: object | undefined;\n let afterSchema: object | undefined;\n try {\n beforeSchema = JSON.parse(before.content);\n afterSchema = JSON.parse(after.content);\n } catch {\n // Schema is not valid JSON — skip breaking change detection\n }\n if (beforeSchema && afterSchema) {\n bsc.breakingChanges = detectBreakingChanges(beforeSchema, afterSchema, compatibilityStrategy);\n }\n }\n })()\n );\n }\n }\n\n await Promise.all(promises);\n};\n","import { randomUUID } from 'node:crypto';\nimport type { CatalogSnapshot } from '@eventcatalog/sdk';\nimport type { CompatibilityStrategy } from '@eventcatalog/breaking-changes';\nimport type { GovernanceResult } from './types';\nimport { resolveEnvVars, isProducerTrigger, getChangeVerb } from './rules';\n\nexport type MessageTypeMap = Map<string, string>;\nexport type ServiceOwnersMap = Map<string, string[]>;\n\nexport type GovernanceActionOptions = {\n messageTypes?: MessageTypeMap;\n status?: string;\n serviceOwners?: ServiceOwnersMap;\n baseRef?: string;\n targetRef?: string;\n compatibilityStrategy?: CompatibilityStrategy;\n};\n\nexport const buildMessageTypeMap = (snapshot: CatalogSnapshot): MessageTypeMap => {\n const map: MessageTypeMap = new Map();\n for (const event of snapshot.resources.messages.events) {\n map.set(event.id as string, 'event');\n }\n for (const command of snapshot.resources.messages.commands) {\n map.set(command.id as string, 'command');\n }\n for (const query of snapshot.resources.messages.queries) {\n map.set(query.id as string, 'query');\n }\n return map;\n};\n\nexport const buildServiceOwnersMap = (snapshot: CatalogSnapshot): ServiceOwnersMap => {\n const map: ServiceOwnersMap = new Map();\n for (const service of snapshot.resources.services) {\n if (service.owners && Array.isArray(service.owners) && service.owners.length > 0) {\n map.set(service.id as string, service.owners as string[]);\n }\n }\n return map;\n};\n\nexport const executeGovernanceActions = async (\n results: GovernanceResult[],\n opts: GovernanceActionOptions = {}\n): Promise<string[]> => {\n const { messageTypes, status, serviceOwners, baseRef, targetRef, compatibilityStrategy } = opts;\n const webhookCalls: Array<{ urlTemplate: string; request: Promise<Response> }> = [];\n const now = new Date().toISOString();\n\n for (const result of results) {\n for (const action of result.rule.actions) {\n if (action.type !== 'webhook') continue;\n\n const url = resolveEnvVars(action.url);\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n if (action.headers) {\n for (const [key, value] of Object.entries(action.headers)) {\n headers[key] = resolveEnvVars(value);\n }\n }\n\n // Handle schema changes\n if (result.schemaChanges && result.schemaChanges.length > 0) {\n for (const sc of result.schemaChanges) {\n const messageType = messageTypes?.get(sc.resourceChange.resourceId) || 'message';\n\n const payload = {\n specversion: '1.0',\n type: 'eventcatalog.governance.schema_changed',\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n summary: `Schema changed for ${messageType} ${sc.resourceChange.resourceId}`,\n message: {\n id: sc.resourceChange.resourceId,\n version: sc.resourceChange.version,\n type: messageType,\n },\n schema: {\n beforeHash: sc.beforeSchemaHash ?? null,\n afterHash: sc.afterSchemaHash ?? null,\n beforePath: sc.beforeSchemaPath ?? null,\n afterPath: sc.afterSchemaPath ?? null,\n },\n refs: {\n base: baseRef ?? null,\n target: targetRef ?? null,\n },\n consumers: sc.consumerServices,\n producers: sc.producerServices,\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n continue;\n }\n\n // Handle breaking schema changes\n if (result.breakingSchemaChanges && result.breakingSchemaChanges.length > 0) {\n for (const bsc of result.breakingSchemaChanges) {\n const messageType = messageTypes?.get(bsc.resourceChange.resourceId) || 'message';\n\n const payload = {\n specversion: '1.0',\n type: 'eventcatalog.governance.schema_breaking_change',\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n ...(compatibilityStrategy && { compatibilityStrategy }),\n summary: `Breaking schema change detected for ${messageType} ${bsc.resourceChange.resourceId}`,\n message: {\n id: bsc.resourceChange.resourceId,\n version: bsc.resourceChange.version,\n type: messageType,\n },\n schema: {\n beforeHash: bsc.beforeSchemaHash ?? null,\n afterHash: bsc.afterSchemaHash ?? null,\n beforePath: bsc.beforeSchemaPath ?? null,\n afterPath: bsc.afterSchemaPath ?? null,\n },\n breakingChanges: bsc.breakingChanges,\n refs: {\n base: baseRef ?? null,\n target: targetRef ?? null,\n },\n consumers: bsc.consumerServices,\n producers: bsc.producerServices,\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n continue;\n }\n\n // Handle deprecation changes\n if (result.deprecationChanges && result.deprecationChanges.length > 0) {\n for (const dc of result.deprecationChanges) {\n const messageType = messageTypes?.get(dc.resourceChange.resourceId) || 'message';\n\n const producers =\n dc.producerServices.length > 0\n ? dc.producerServices\n : [{ id: 'unknown', version: 'unknown' } as { id: string; version: string; owners?: string[] }];\n\n for (const producer of producers) {\n const payload = {\n specversion: '1.0',\n type: `eventcatalog.governance.message_deprecated`,\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n summary: `${dc.resourceChange.resourceId} (${messageType}) has been deprecated by ${producer.id}`,\n producer: {\n id: producer.id,\n version: producer.version,\n ...(producer.owners && { owners: producer.owners }),\n },\n message: {\n id: dc.resourceChange.resourceId,\n version: dc.resourceChange.version,\n type: messageType,\n },\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n }\n continue;\n }\n\n // Handle relationship changes\n for (const change of result.matchedChanges) {\n const verb = getChangeVerb(result.trigger, change.changeType);\n const messageType = messageTypes?.get(change.resourceId) || 'message';\n const serviceRole = isProducerTrigger(result.trigger) ? 'producer' : 'consumer';\n\n const payload = {\n specversion: '1.0',\n type: `eventcatalog.governance.${result.trigger}`,\n source: 'eventcatalog/governance',\n id: randomUUID(),\n time: now,\n datacontenttype: 'application/json',\n data: {\n schemaVersion: 1,\n ...(status && { status }),\n summary: `${change.serviceId} is ${verb} the ${messageType} ${change.resourceId}`,\n [serviceRole]: {\n id: change.serviceId,\n version: change.serviceVersion,\n ...(serviceOwners?.get(change.serviceId) && { owners: serviceOwners.get(change.serviceId) }),\n },\n message: {\n id: change.resourceId,\n version: change.resourceVersion,\n type: messageType,\n },\n },\n };\n\n webhookCalls.push({\n urlTemplate: action.url,\n request: fetch(url, { method: 'POST', headers, body: JSON.stringify(payload) }),\n });\n }\n }\n }\n\n const settled = await Promise.allSettled(webhookCalls.map((c) => c.request));\n\n return settled.map((result, i) => {\n const url = webhookCalls[i].urlTemplate;\n if (result.status === 'fulfilled') {\n const res = result.value;\n if (!res.ok) {\n return ` Webhook failed: ${url} ✗ (HTTP ${res.status})`;\n }\n return ` Webhook sent: ${url} ✓`;\n }\n return ` Webhook failed: ${url} ✗ (${result.reason instanceof Error ? result.reason.message : String(result.reason)})`;\n });\n};\n","import type { GovernanceResult } from './types';\nimport { getChangeVerb } from './rules';\n\nexport const formatGovernanceOutput = (results: GovernanceResult[]): string => {\n if (results.length === 0) {\n return 'No governance rules triggered. Catalog is compliant.';\n }\n\n const lines: string[] = ['Governance:', ''];\n\n for (const result of results) {\n lines.push(` Rule \"${result.rule.name}\" triggered (${result.trigger}):`);\n\n if (result.schemaChanges && result.schemaChanges.length > 0) {\n for (const sc of result.schemaChanges) {\n const consumers = sc.consumerServices.length > 0 ? sc.consumerServices.map((c) => c.id).join(', ') : 'no known consumers';\n lines.push(\n ` ! Schema changed for ${sc.resourceChange.resourceId} (${sc.resourceChange.type}) — consumers: ${consumers}`\n );\n }\n } else if (result.deprecationChanges && result.deprecationChanges.length > 0) {\n for (const dc of result.deprecationChanges) {\n const producers = dc.producerServices.length > 0 ? dc.producerServices.map((p) => p.id).join(', ') : 'unknown producer';\n lines.push(` ! ${dc.resourceChange.resourceId} (${dc.resourceChange.type}) deprecated by ${producers}`);\n }\n } else {\n for (const change of result.matchedChanges) {\n const prefix = change.changeType === 'added' ? '+' : '-';\n const verb = getChangeVerb(result.trigger, change.changeType);\n lines.push(` ${prefix} ${change.serviceId} is ${verb} ${change.resourceId}`);\n }\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n};\n\nexport const formatFailureOutput = (failures: Array<{ ruleName: string; messages: string[] }>): string => {\n if (failures.length === 0) return '';\n\n const lines: string[] = [];\n\n for (const f of failures) {\n lines.push(`FAILED: ${f.ruleName}`);\n for (const msg of f.messages) {\n lines.push(` ${msg}`);\n }\n }\n\n return lines.join('\\n');\n};\n","import path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { mkdtempSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport dotenv from 'dotenv';\nimport createSDK from '@eventcatalog/sdk';\nimport { isEventCatalogScaleEnabled } from '@eventcatalog/license';\nimport { loadGovernanceConfig, evaluateGovernanceRules, enrichSchemaContent, resolveEnvVars } from './rules';\nimport { formatGovernanceOutput, formatFailureOutput } from './format';\nimport { executeGovernanceActions, buildMessageTypeMap, buildServiceOwnersMap } from './actions';\nimport type { GovernanceCheckResult } from './types';\n\nexport type GovernanceCheckOptions = {\n base?: string;\n target?: string;\n format?: string;\n status?: string;\n dir: string;\n};\n\nconst BRANCH_NAME_RE = /^[a-zA-Z0-9._\\-/]+$/;\n\nconst extractBranchToTempDir = (branch: string, catalogDir: string, tempDirs: string[]): string => {\n if (!BRANCH_NAME_RE.test(branch)) {\n throw new Error(`Invalid branch name: \"${branch}\"`);\n }\n const tmpDir = mkdtempSync(path.join(tmpdir(), 'ec-governance-'));\n tempDirs.push(tmpDir);\n try {\n execSync(`git archive ${branch} | tar -x -C ${tmpDir}`, { cwd: catalogDir, stdio: 'pipe' });\n } catch {\n throw new Error(`Failed to extract branch \"${branch}\". Is it a valid git branch?`);\n }\n return tmpDir;\n};\n\nexport const governanceCheck = async (opts: GovernanceCheckOptions): Promise<GovernanceCheckResult> => {\n const dir = path.resolve(opts.dir);\n\n // Load .env file from catalog directory (contains license key, webhook secrets, etc.)\n dotenv.config({ path: path.join(dir, '.env') });\n\n const isScale = await isEventCatalogScaleEnabled();\n if (!isScale) {\n throw new Error('Governance requires an EventCatalog Scale plan. Learn more at https://eventcatalog.dev/pricing');\n }\n\n const baseBranch = opts.base || 'main';\n\n const tempDirs: string[] = [];\n const trackTempDir = (prefix: string): string => {\n const d = mkdtempSync(path.join(tmpdir(), prefix));\n tempDirs.push(d);\n return d;\n };\n\n try {\n const baseTmpDir = extractBranchToTempDir(baseBranch, dir, tempDirs);\n\n const baseSnapshotDir = trackTempDir('ec-snap-base-');\n const targetSnapshotDir = trackTempDir('ec-snap-target-');\n\n const baseSDK = createSDK(baseTmpDir);\n const baseResult = await baseSDK.createSnapshot({ label: `base-${baseBranch}`, outputDir: baseSnapshotDir });\n\n let targetResult;\n let targetCatalogDir: string;\n if (opts.target) {\n targetCatalogDir = extractBranchToTempDir(opts.target, dir, tempDirs);\n const targetSDK = createSDK(targetCatalogDir);\n targetResult = await targetSDK.createSnapshot({ label: `target-${opts.target}`, outputDir: targetSnapshotDir });\n } else {\n targetCatalogDir = dir;\n const targetSDK = createSDK(dir);\n targetResult = await targetSDK.createSnapshot({ label: 'current', outputDir: targetSnapshotDir });\n }\n\n const diff = await baseSDK.diffSnapshots(baseResult.filePath, targetResult.filePath);\n\n const config = loadGovernanceConfig(dir);\n\n if (config.rules.length === 0) {\n return { output: 'No governance.yaml (or governance.yml) found or no rules defined.', exitCode: 0, failures: [] };\n }\n\n const results = evaluateGovernanceRules(diff, config, targetResult.snapshot, baseResult.snapshot);\n\n // Populate before/after schema content for any schema_changed results\n await enrichSchemaContent(results, baseTmpDir, targetCatalogDir, config.compatibility?.strategy);\n\n // Remove schema_breaking_change results where no actual breaking changes were found\n const filteredResults = results.filter((r) => {\n if (r.trigger !== 'schema_breaking_change') return true;\n if (!r.breakingSchemaChanges) return false;\n r.breakingSchemaChanges = r.breakingSchemaChanges.filter((bsc) => bsc.breakingChanges.length > 0);\n return r.breakingSchemaChanges.length > 0;\n });\n\n // Mark results that have fail actions and collect their messages\n for (const result of filteredResults) {\n const failActions = result.rule.actions.filter((a) => a.type === 'fail');\n if (failActions.length > 0) {\n result.failed = true;\n result.failMessages = failActions\n .map((a) => ('message' in a && a.message ? resolveEnvVars(a.message) : undefined))\n .filter((m): m is string => m !== undefined);\n }\n }\n\n // Always execute actions (webhooks) regardless of output format\n const messageTypes = buildMessageTypeMap(targetResult.snapshot);\n const serviceOwners = buildServiceOwnersMap(targetResult.snapshot);\n const actionOutput = await executeGovernanceActions(filteredResults, {\n messageTypes,\n status: opts.status,\n serviceOwners,\n baseRef: baseBranch,\n targetRef: opts.target || 'working-directory',\n compatibilityStrategy: config.compatibility?.strategy,\n });\n\n // Collect failures\n const failures = filteredResults\n .filter((r) => r.failed)\n .map((r) => ({ ruleName: r.rule.name, messages: r.failMessages || [] }));\n\n if (opts.format === 'json') {\n const jsonOutput = {\n baseBranch,\n target: opts.target || 'working directory',\n results: filteredResults,\n summary: {\n rulesTriggered: filteredResults.length,\n failures: failures.length,\n passed: failures.length === 0,\n },\n diff: diff.summary,\n };\n return { output: JSON.stringify(jsonOutput, null, 2), exitCode: failures.length > 0 ? 1 : 0, failures };\n }\n\n const targetLabel = opts.target || 'working directory';\n const lines: string[] = [`Governance check: comparing ${targetLabel} against ${baseBranch}`, ''];\n\n lines.push(formatGovernanceOutput(filteredResults));\n\n if (actionOutput.length > 0) {\n lines.push('');\n lines.push(...actionOutput);\n }\n\n if (filteredResults.length > 0) {\n const webhookCount = actionOutput.filter((l) => l.includes('Webhook sent')).length;\n const parts = [`${filteredResults.length} rule${filteredResults.length === 1 ? '' : 's'} triggered`];\n if (webhookCount > 0) parts.push(`${webhookCount} webhook${webhookCount === 1 ? '' : 's'} sent`);\n lines.push('');\n lines.push(parts.join(', ') + '.');\n }\n\n // Append failure output\n const failureOutput = formatFailureOutput(failures);\n if (failureOutput) {\n lines.push('');\n lines.push(failureOutput);\n }\n\n return { output: lines.join('\\n'), exitCode: failures.length > 0 ? 1 : 0, failures };\n } finally {\n for (const d of tempDirs) {\n rmSync(d, { recursive: true, force: true });\n }\n }\n};\n"],"mappings":";;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,IAAM,cAAc,MAAM,cAAc,YAAY,GAAG;AACvD,IAAM,aAAa,MAAM,KAAK,QAAQ,YAAY,CAAC;AAE5C,IAAM,YAA4B,2BAAW;;;ACLpD,SAAS,eAAe;AACxB,SAAS,gBAAAA,qBAAoB;AAC7B,SAAS,WAAAC,gBAAe;;;ACJxB,SAAS,kBAAkB;;;ACIpB,SAAS,eAAe,SAA0B;AACvD,SAAO,QAAQ,IAAI,CAAC,KAAK,UAAU;AAEjC,QAAK,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KAAO,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GAAI;AAC5F,UAAI;AACF,eAAO,KAAK,MAAM,GAAG;AAAA,MACvB,SAAS,OAAO;AAGd,YAAI,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;AAC1C,gBAAM,IAAI,MAAM,4BAA4B,QAAQ,CAAC,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,QACpH;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,QAAQ,OAAQ,QAAO;AAC3B,QAAI,QAAQ,QAAS,QAAO;AAG5B,QAAI,kBAAkB,KAAK,GAAG,GAAG;AAC/B,aAAO,OAAO,GAAG;AAAA,IACnB;AAGA,WAAO;AAAA,EACT,CAAC;AACH;;;AD/BA,OAAO,eAAe;AAKtB,eAAsB,gBAAgB,YAAoB,cAAsB,SAAiC;AAE/G,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,UAAM,IAAI,MAAM,gCAAgC,UAAU,EAAE;AAAA,EAC9D;AAGA,QAAM,MAAM,UAAU,UAAU;AAGhC,MAAI,EAAE,gBAAgB,MAAM;AAC1B,UAAM,IAAI,MAAM,aAAa,YAAY,kEAAkE;AAAA,EAC7G;AAEA,QAAM,KAAM,IAAY,YAAY;AAGpC,MAAI,OAAO,OAAO,YAAY;AAC5B,UAAM,IAAI,MAAM,IAAI,YAAY,+BAA+B;AAAA,EACjE;AAGA,QAAM,aAAa,eAAe,OAAO;AAGzC,MAAI;AACF,WAAO,MAAM,GAAG,GAAG,UAAU;AAAA,EAC/B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,oBAAoB,YAAY,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EAChH;AACF;;;AErCA,OAAOC,gBAAe;AASf,SAAS,cAAc,aAAqB,KAA2B;AAE5E,QAAM,MAAMA,WAAU,UAAU;AAGhC,QAAM,gBAAgB,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,QAAQ,OAAQ,IAAY,GAAG,MAAM,UAAU;AAG9F,QAAM,aAAmC;AAAA,IACvC,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,IACV,UAAU,CAAC;AAAA,IACX,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,IACV,UAAU,CAAC;AAAA,IACX,YAAY,CAAC;AAAA,IACb,cAAc,CAAC;AAAA,IACf,OAAO,CAAC;AAAA,IACR,OAAO,CAAC;AAAA,IACR,eAAe,CAAC;AAAA,IAChB,UAAU,CAAC;AAAA,IACX,WAAW,CAAC;AAAA,EACd;AAEA,gBAAc,QAAQ,CAAC,SAAS;AAC9B,QAAI,KAAK,SAAS,OAAO,EAAG,YAAW,QAAQ,EAAE,KAAK,IAAI;AAAA,aACjD,KAAK,SAAS,SAAS,EAAG,YAAW,UAAU,EAAE,KAAK,IAAI;AAAA,aAC1D,KAAK,SAAS,OAAO,EAAG,YAAW,SAAS,EAAE,KAAK,IAAI;AAAA,aACvD,KAAK,SAAS,SAAS,EAAG,YAAW,UAAU,EAAE,KAAK,IAAI;AAAA,aAC1D,KAAK,SAAS,SAAS,EAAG,YAAW,UAAU,EAAE,KAAK,IAAI;AAAA,aAC1D,KAAK,SAAS,QAAQ,EAAG,YAAW,SAAS,EAAE,KAAK,IAAI;AAAA,aACxD,KAAK,SAAS,QAAQ,EAAG,YAAW,UAAU,EAAE,KAAK,IAAI;AAAA,aACzD,KAAK,SAAS,WAAW,EAAG,YAAW,YAAY,EAAE,KAAK,IAAI;AAAA,aAC9D,KAAK,SAAS,aAAa,EAAG,YAAW,cAAc,EAAE,KAAK,IAAI;AAAA,aAClE,KAAK,SAAS,MAAM,EAAG,YAAW,OAAO,EAAE,KAAK,IAAI;AAAA,aACpD,KAAK,SAAS,MAAM,EAAG,YAAW,OAAO,EAAE,KAAK,IAAI;AAAA,aACpD,KAAK,SAAS,WAAW,EAAG,YAAW,aAAa,EAAE,KAAK,IAAI;AAAA,aAC/D,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,WAAW;AAC1F,iBAAW,UAAU,EAAE,KAAK,IAAI;AAAA,QAC7B,YAAW,WAAW,EAAE,KAAK,IAAI;AAAA,EACxC,CAAC;AAGD,SAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,QAAQ;AACvC,QAAI,WAAW,GAAG,EAAE,WAAW,GAAG;AAChC,aAAO,WAAW,GAAG;AAAA,IACvB;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAKO,SAAS,iBAAiB,WAAyC;AACxE,MAAI,SAAS;AAEb,SAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,CAAC,UAAU,KAAK,MAAM;AACvD,cAAU,GAAG,QAAQ;AAAA;AACrB,UAAM,KAAK,EAAE,QAAQ,CAAC,SAAS;AAC7B,gBAAU,OAAO,IAAI;AAAA;AAAA,IACvB,CAAC;AACD,cAAU;AAAA,EACZ,CAAC;AAED,SAAO;AACT;;;AC7EA,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,OAAO,UAAU;AACjB,OAAOC,gBAAe;AAEtB,IAAM,iBAAiB,CAAC,SAAS,WAAW,SAAS,WAAW,QAAQ;AAExE,IAAM,2BAA2B,eAAe,KAAK,IAAI;AAEzD,IAAM,aAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AACX;AAEA,IAAM,iCAAiC,oBAAI,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAaD,SAAS,sBAAsB,UAAgC;AAC7D,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,WAAW,KAAK,EAAG,QAAO,WAAW,KAAK;AAC9C,SAAO;AACT;AAEA,SAAS,0BAA0B,UAAkB,MAA0B;AAC7E,QAAM,QAAQ,SAAS,YAAY;AAEnC,MAAI,+BAA+B,IAAI,KAAK,GAAG;AAC7C,UAAM,IAAI;AAAA,MACR,kBAAkB,QAAQ,2DAA2D,wBAAwB;AAAA,IAC/G;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,SAAS,IAAI,GAAG;AAClC,UAAM,IAAI,MAAM,0BAA0B,QAAQ,sBAAsB,wBAAwB,EAAE;AAAA,EACpG;AACF;AAEA,SAAS,mBAAmB,KAAmC,MAAoB;AACjF,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,EACf;AACF;AAEA,SAAS,qBAAqB,KAAmC,MAAoB;AACnF,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,EACf;AACF;AAEA,SAAS,UAAU,MAA4B;AAC7C,MAAI,SAAS,QAAS,QAAO;AAC7B,SAAO,GAAG,IAAI;AAChB;AAEA,IAAM,gBAAgB,CAAC,QAAQ,QAAQ,WAAW,SAAS,WAAW,SAAS,WAAW,QAAQ;AAElG,IAAM,iBAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AACV;AASA,SAAS,eAAe,KAAqB;AAC3C,QAAM,SAAS,IAAI,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AACvD,QAAM,UAAoC,CAAC;AAE3C,aAAW,SAAS,QAAQ;AAC1B,UAAM,YAAY,MAAM,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;AACjD,UAAM,MAAM,cAAc,cAAc,WAAW;AACnD,QAAI,CAAC,QAAQ,GAAG,EAAG,SAAQ,GAAG,IAAI,CAAC;AACnC,YAAQ,GAAG,EAAE,KAAK,KAAK;AAAA,EACzB;AAEA,QAAM,WAAqB,CAAC;AAC5B,aAAW,QAAQ,eAAe;AAChC,QAAI,CAAC,QAAQ,IAAI,KAAK,QAAQ,IAAI,EAAE,WAAW,EAAG;AAClD,UAAM,QAAQ,eAAe,IAAI,KAAK,KAAK,YAAY;AACvD,aAAS,KAAK,MAAM,KAAK;AAAA,EAAK,QAAQ,IAAI,EAAE,KAAK,MAAM,CAAC,EAAE;AAC1D,WAAO,QAAQ,IAAI;AAAA,EACrB;AAGA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,QAAQ,KAAK,YAAY;AAC/B,aAAS,KAAK,MAAM,KAAK;AAAA,EAAK,MAAM,KAAK,MAAM,CAAC,EAAE;AAAA,EACpD;AAEA,SAAO,SAAS,KAAK,MAAM;AAC7B;AAYA,SAAS,2BAA2B,KAAa,aAA6C;AAC5F,QAAM,UAAgC,CAAC;AACvC,QAAM,QAAQ,IAAI,MAAM,IAAI;AAE5B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,UAAU,MAAM,CAAC,EAAE,UAAU;AACnC,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,KAAK,MAAM,CAAC;AAClB,QAAI,CAAC,YAAY,SAAS,OAAO,EAAG;AACpC,QAAI,CAAC,MAAM,CAAC,QAAQ,SAAS,GAAG,EAAG;AAGnC,QAAIC;AACJ,aAAS,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACzC,YAAM,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC5B,UAAI,UAAU,IAAK;AACnB,YAAM,SAAS,MAAM,MAAM,kBAAkB;AAC7C,UAAI,QAAQ;AACV,QAAAA,WAAU,OAAO,CAAC;AAClB;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,EAAE,SAAS,IAAI,SAAAA,SAAQ,CAAC;AAAA,EACvC;AAEA,SAAO;AACT;AAUA,SAAS,qBAAqB,KAAa,MAAc,aAAoD;AAC3G,QAAM,QAAQ,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW;AACrE,QAAM,cAAc,2BAA2B,KAAK,KAAK;AAEzD,MAAI,YAAY,WAAW,EAAG,QAAO;AAGrC,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,OAAO,aAAa;AAC7B,UAAM,MAAM,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AACpC,WAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC5C;AAEA,QAAM,UAAU,YAAY,IAAI,CAAC,QAAQ;AACvC,UAAM,MAAM,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AACpC,UAAM,gBAAgB,OAAO,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI;AACvD,UAAM,MAAM,eAAe,GAAG,IAAI,EAAE,IAAI,IAAI,OAAO,KAAK,IAAI;AAC5D,WAAO,KAAK,IAAI,OAAO,IAAI,GAAG;AAAA,EAChC,CAAC;AAED,SAAO;AAAA;AAAA,UAAgC,IAAI;AAAA,EAAM,QAAQ,KAAK,IAAI,CAAC;AAAA;AACrE;AAEA,eAAsB,cAAc,SAA2D;AAC7F,QAAM,EAAE,UAAU,OAAO,SAAS,OAAO,aAAa,OAAO,QAAQ,IAAI,IAAI;AAE7E,QAAM,MAAMD,WAAU,GAAG;AAGzB,QAAM,YACJ,MAAM,QAAQ;AAAA,IACZ,eAAe,IAAI,OAAO,SAAS;AACjC,YAAM,UAAU,qBAAqB,KAAK,IAAI;AAC9C,YAAM,YAAY,MAAM,QAAQ,EAAE,YAAY,KAAK,CAAC;AACpD,UAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,aAAO,IAAI,MAAM,WAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH,GACA,OAAO,CAACE,SAAuB,QAAQA,IAAG,CAAC;AAE7C,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,qCAAqC,GAAG,GAAG;AAAA,EAC7D;AAEA,QAAM,WAAW,SAAS,KAAK,MAAM;AACrC,QAAM,UAAU,eAAe,QAAQ;AACvC,QAAM,WAAW,qBAAqB,SAAS,gBAAgB,CAAC,GAAG,cAAc,CAAC;AAClF,QAAM,MAAM,WAAW,GAAG,OAAO;AAAA,EAAK,QAAQ,KAAK;AAEnD,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,UAAU;AAC3B,QAAM,WAAW,QAAQ,QAAQ;AACjC,gBAAc,UAAU,MAAM,MAAM,OAAO;AAE3C,QAAM,QAAQ,CAAC,IAAI,8BAA8B,QAAQ,EAAE;AAE3D,MAAI,YAAY;AACd,UAAM,UAAU,OAAO,KAAK,GAAG,EAAE,SAAS,QAAQ;AAClD,UAAM,gBAAgB,0CAA0C,OAAO;AACvE,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,IAAI,sCAAsC;AAAA,EACvD,OAAO;AACL,UAAM,KAAK,IAAI,yDAAyD;AAAA,EAC1E;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,UAAU,SAAyC;AACvE,QAAM,EAAE,UAAU,UAAU,OAAO,SAAS,OAAO,aAAa,OAAO,QAAQ,IAAI,IAAI;AAEvF,QAAM,OAAO,sBAAsB,QAAQ;AAC3C,4BAA0B,UAAU,IAAI;AAExC,QAAM,SAAS,UAAU,IAAI;AAC7B,QAAM,MAAMF,WAAU,GAAG;AAEzB,QAAM,UAAU,qBAAqB,KAAK,IAAI;AAC9C,QAAM,eAAgB,MAAM,QAAQ,EAAE,YAAY,KAAK,CAAC,KAAM,CAAC;AAE/D,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI,MAAM,MAAM,MAAM,yBAAyB,GAAG,GAAG;AAAA,EAC7D;AAEA,QAAM,SAAS,MAAM,IAAI,MAAM,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC9D,QAAM,UAAU,eAAe,MAAM;AACrC,QAAM,WAAW,qBAAqB,SAAS,OAAO,MAAM,IAAI,IAAI;AACpE,QAAM,MAAM,WAAW,GAAG,OAAO;AAAA,EAAK,QAAQ,KAAK;AAEnD,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,UAAU,GAAG,MAAM;AACpC,QAAM,WAAW,QAAQ,QAAQ;AACjC,gBAAc,UAAU,MAAM,MAAM,OAAO;AAE3C,QAAM,QAAQ,CAAC,IAAI,cAAc,aAAa,MAAM,IAAI,MAAM,OAAO,QAAQ,EAAE;AAE/E,MAAI,YAAY;AACd,UAAM,UAAU,OAAO,KAAK,GAAG,EAAE,SAAS,QAAQ;AAClD,UAAM,gBAAgB,0CAA0C,OAAO;AACvE,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,IAAI,sCAAsC;AAAA,EACvD,OAAO;AACL,UAAM,KAAK,IAAI,yDAAyD;AAAA,EAC1E;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,eAAe,SAAyC;AAC5E,QAAM,EAAE,UAAU,IAAI,SAAAC,UAAS,UAAU,OAAO,SAAS,OAAO,aAAa,OAAO,QAAQ,IAAI,IAAI;AAEpG,MAAI,CAAC,IAAI;AACP,WAAO,UAAU,OAAO;AAAA,EAC1B;AAEA,QAAM,OAAO,sBAAsB,QAAQ;AAC3C,4BAA0B,UAAU,IAAI;AAExC,QAAM,MAAMD,WAAU,GAAG;AAEzB,QAAM,UAAU,mBAAmB,KAAK,IAAI;AAC5C,QAAM,OAAO,MAAM,QAAQ,IAAIC,QAAO;AAEtC,MAAI,CAAC,MAAM;AACT,UAAM,aAAaA,WAAU,IAAIA,QAAO,KAAK;AAC7C,UAAM,IAAI,MAAM,GAAG,QAAQ,KAAK,EAAE,GAAG,UAAU,8BAA8B,GAAG,GAAG;AAAA,EACrF;AAEA,QAAM,SAAS,MAAM,IAAI,MAAM,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKtD,QAAM,UAAU,UAAU,eAAe,MAAM,IAAI;AACnD,QAAM,WAA2B,UAAU,CAAC,GAAG,cAAc,IAAI,CAAC,IAAI;AACtE,QAAM,WAAW,qBAAqB,SAAS,WAAW,EAAE,IAAI,QAAQ;AACxE,QAAM,MAAM,WAAW,GAAG,OAAO;AAAA,EAAK,QAAQ,KAAK;AAEnD,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,UAAU,GAAG,EAAE;AAChC,QAAM,WAAW,QAAQ,QAAQ;AACjC,gBAAc,UAAU,MAAM,MAAM,OAAO;AAE3C,QAAM,QAAQ,CAAC,IAAI,cAAc,IAAI,KAAK,EAAE,QAAQ,QAAQ,EAAE;AAE9D,MAAI,YAAY;AACd,UAAM,UAAU,OAAO,KAAK,GAAG,EAAE,SAAS,QAAQ;AAClD,UAAM,gBAAgB,0CAA0C,OAAO;AACvE,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,IAAI,sCAAsC;AAAA,EACvD,OAAO;AACL,UAAM,KAAK,IAAI,yDAAyD;AAAA,EAC1E;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC7WA,SAAS,cAAc,cAAAE,aAAY,WAAW,iBAAAC,gBAAe,oBAAoB;AACjF,SAAS,WAAAC,UAAS,YAAY;AAC9B,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,OAAO,YAAY;AACnB,OAAOC,gBAAe;;;ACCtB,IAAM,uBAA4C,oBAAI,IAAI,CAAC,MAAM,QAAQ,WAAW,UAAU,cAAc,SAAS,SAAS,CAAC;AAExH,IAAM,2BAAgE;AAAA,EAC3E,QAAQ,oBAAI,IAAI,CAAC,MAAM,QAAQ,WAAW,UAAU,cAAc,SAAS,WAAW,YAAY,SAAS,CAAC;AAAA,EAC5G,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AACT;;;ADoBA,SAAS,6BAA6B,MAAc,aAAuD;AACzG,QAAM,aAAa,EAAE,GAAG,YAAY;AAGpC,MAAI,SAAS,aAAa;AACxB,QAAI,WAAW,mBAAmB,UAAa,WAAW,kBAAkB,QAAW;AACrF,iBAAW,iBAAiB,WAAW;AACvC,aAAO,WAAW;AAAA,IACpB;AACA,QAAI,WAAW,gBAAgB,UAAa,WAAW,eAAe,QAAW;AAC/E,iBAAW,cAAc,WAAW;AACpC,aAAO,WAAW;AAAA,IACpB;AAEA,QAAI,CAAC,WAAW,gBAAgB;AAC9B,iBAAW,iBAAiB;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,UAAoC;AACzD,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO,CAAC;AACvD,QAAM,EAAE,UAAU,WAAW,GAAG,YAAY,IAAI;AAChD,SAAO;AACT;AAEA,SAAS,yBACP,MACA,qBACA,UACA,QACqB;AACrB,QAAM,qBAAqB,6BAA6B,MAAM,mBAAmB;AACjF,QAAM,cAAc,yBAAyB,IAAI;AAEjD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,cAAc,YAAY,MAAM;AACxD,QAAM,uBAAuB,EAAE,GAAG,gBAAgB;AAElD,aAAW,OAAO,aAAa;AAC7B,WAAO,qBAAqB,GAAG;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,IAAM,4BAAoD;AAAA,EACxD,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AACT;AAEA,eAAe,SACb,QACA,SACyE;AACzE,QAAM,EAAE,kBAAkB,QAAQ,IAAI,MAAM,OAAO,+BAA+B;AAClF,QAAM,EAAE,iBAAiB,IAAI,IAAI,MAAM,OAAO,SAAS;AAEvD,QAAM,WAAW,iBAAiB,eAAe;AACjD,QAAM,MAAM,IAAI,MAAM,kBAAkB,KAAK,IAAI,CAAC,KAAK;AACvD,QAAM,WAAW,SAAS,OAAO,UAAU,uBAAuB,WAAW,QAAQ,GAAG;AACxF,WAAS,OAAO,UAAU,iBAAiB,YAAY,QAAQ;AAC/D,QAAM,SAAS,OAAO,UAAU,gBAAgB,MAAM,CAAC,QAAQ,CAAC;AAEhE,QAAM,eAAe,SAAS,YAAY;AAC1C,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,WAAW,aAAa,IAAI,CAAC,MAAW,UAAU,EAAE,OAAO,aAAa,GAAG,KAAK,EAAE,OAAO,EAAE;AACjG,UAAM,IAAI,MAAM;AAAA,EAAkB,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,EACzD;AAEA,QAAMC,WAAU,SAAS,YAAY;AACrC,QAAM,UAAU,QAAQA,UAAS,EAAE,QAAQ,SAAS,OAAO,CAAC;AAE5D,MAAI;AACF,aAAS,OAAO,UAAU,iBAAiB,eAAe,GAAG;AAAA,EAC/D,QAAQ;AAAA,EAER;AAEA,SAAO,EAAE,SAAS,SAAAA,SAAQ;AAC5B;AAWA,SAAS,0BAA0BC,OAAsB;AACvD,QAAM,WAAWA,MAAK,MAAM,GAAG;AAC/B,MAAI,iBAAiB,SAAS,CAAC;AAC/B,aAAW,OAAO,UAAU;AAC1B,QAAI,0BAA0B,GAAG,GAAG;AAClC,uBAAiB;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAA2D;AACtF,QAAM,EAAE,MAAM,aAAa,SAAS,SAAS,IAAI,OAAO,OAAO,OAAO;AAEtE,QAAM,aAAa,0BAA0B,OAAO,IAAI;AACxD,QAAM,OAAO,0BAA0B,UAAU,KAAK;AAEtD,SAAO;AAAA,IACL;AAAA,IACA,IAAI,YAAY;AAAA,IAChB,SAAS,YAAY;AAAA,IACrB;AAAA,IACA,UAAU,SAAS,KAAK;AAAA,IACxB,MAAM,OAAO;AAAA,EACf;AACF;AAEA,IAAM,sBAA8C;AAAA,EAClD,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX;AAEA,IAAM,uBAAuB;AAC7B,IAAM,iBAAiB;AAEvB,SAAS,mBAAmB,MAAc,IAAoB;AAC5D,SAAO,GAAG,IAAI,IAAI,EAAE;AACtB;AAEA,SAAS,sBAAsB,MAAc,IAAYC,UAA0B;AACjF,SAAO,GAAG,IAAI,IAAI,EAAE,IAAIA,YAAW,cAAc;AACnD;AAEA,SAAS,uBAAuB,QAAyB;AACvD,SAAO,8CAA8C,KAAK,MAAM;AAClE;AAMA,eAAe,oBAAoBF,UAAc,aAA0B,SAAkB,OAAkC;AAC7H,QAAM,QAA0B,CAAC;AACjC,QAAM,UAAU,oBAAI,IAAY;AAEhC,WAAS,mBAAmB,aAAoB,aAAqB,IAAI;AACvE,eAAW,OAAO,aAAa;AAE7B,UAAI,IAAI,UAAU,mBAAmB,IAAI,MAAM;AAC7C,2BAAmB,IAAI,MAAM,UAAU;AACvC;AAAA,MACF;AAGA,UAAI,IAAI,UAAU,aAAa;AAC7B,cAAM,aAAa,SAAS,WAAW,IAAI,IAAI,KAAK;AACpD,cAAM,aAAa,IAAI,QAAQ,CAAC;AAGhC,cAAM,iBAAiB,WAAW,OAAO,CAAC,MAAW,EAAE,UAAU,YAAY;AAC7E,2BAAmB,gBAAgB,UAAU;AAG7C,cAAM,aAAa,WAAW,OAAO,CAAC,MAAW,EAAE,UAAU,cAAc;AAC3E,mBAAW,OAAO,YAAY;AAC5B,gBAAM,UAAU,SAAS,WAAW,IAAI,IAAI,eAAe,IAAI,IAAI,KAAK;AACxE,gBAAM,eAAe,IAAI,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,UAAU,YAAY;AAChF,6BAAmB,aAAa,OAAO;AAAA,QACzC;AACA;AAAA,MACF;AAEA,UAAI,IAAI,UAAU,aAAc;AAEhC,YAAM,cAAc,SAAU,aAAa,GAAG,UAAU,aAAa,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAM;AAE5G,YAAM,OAAO,IAAI,QAAQ,CAAC;AAC1B,iBAAW,QAAQ,MAAM;AACvB,YAAI,KAAK,UAAU,eAAe,KAAK,UAAU,gBAAgB;AAC/D,gBAAM,UAAU,KAAK;AACrB,gBAAM,UAAU,KAAK;AACrB,gBAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,SAAS;AAChD,gBAAME,WAAU,KAAK,WAAW;AAEhC,cAAI,CAAC,SAAS;AACZ,kBAAM,SAAS,oBAAoB,OAAO;AAC1C,gBAAI,QAAQ;AACV,oBAAM,MAAM,sBAAsB,SAAS,SAASA,QAAO;AAC3D,oBAAM,gBAAgB,mBAAmB,SAAS,OAAO;AAIzD,kBAAI,CAAC,YAAY,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,KAAK,EAAE,CAAC,KAAK,WAAW,YAAY,IAAI,aAAa,IAAI;AACpG,sBAAM,aAAa,UAAU,cAAc,GAAG,WAAW,IAAI,MAAM,KAAK;AAExE,wBAAQ,IAAI,GAAG;AACf,sBAAM,KAAK;AAAA,kBACT,MAAM;AAAA,kBACN,IAAI;AAAA,kBACJ,SAAAA;AAAA,kBACA,aAAa;AAAA,oBACX,IAAI;AAAA,oBACJ,MAAM;AAAA,oBACN,SAAAA;AAAA,kBACF;AAAA,kBACA,UAAU;AAAA,kBACV,MAAM,GAAG,UAAU,IAAI,OAAO,cAAcA,QAAO;AAAA,gBACrD,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAGA,cAAI,KAAK,eAAe;AACtB,kBAAM,WAAW,KAAK,cAAc,YAAY,CAAC;AACjD,uBAAW,MAAM,UAAU;AACzB,oBAAM,SAAS,GAAG;AAClB,oBAAM,YAAY,GAAG,kBAAkB;AACvC,oBAAM,QAAQ,sBAAsB,WAAW,QAAQ,SAAS;AAChE,oBAAM,kBAAkB,mBAAmB,WAAW,MAAM;AAC5D,kBAAI,YAAY,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAG;AAClD,kBAAI,CAAC,GAAG,kBAAkB,YAAY,IAAI,eAAe,EAAG;AAE5D,oBAAM,WAAW,UAAU,aAAa,GAAG,UAAU,cAAc;AACnE,sBAAQ,IAAI,KAAK;AACjB,oBAAM,KAAK;AAAA,gBACT,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,SAAS;AAAA,gBACT,aAAa;AAAA,kBACX,IAAI;AAAA,kBACJ,MAAM;AAAA,kBACN,SAAS;AAAA,gBACX;AAAA,gBACA,UAAU;AAAA,gBACV,MAAM,GAAG,QAAQ,IAAI,MAAM,cAAc,SAAS;AAAA,cACpD,CAAC;AAAA,YACH;AAAA,UACF;AACA;AAAA,QACF;AAEA,YAAI,KAAK,UAAU,kBAAkB,KAAK,UAAU,iBAAiB;AACnE,gBAAM,gBAAgB,KAAK,KAAK;AAChC,cAAI,CAAC,cAAe;AAEpB,gBAAM,mBAAmB,KAAK,KAAK,WAAW;AAC9C,gBAAM,eAAe,sBAAsB,aAAa,eAAe,gBAAgB;AACvF,gBAAM,yBAAyB,mBAAmB,aAAa,aAAa;AAC5E,cAAI,YAAY,IAAI,YAAY,KAAK,QAAQ,IAAI,YAAY,EAAG;AAChE,cAAI,CAAC,KAAK,KAAK,WAAW,YAAY,IAAI,sBAAsB,EAAG;AAEnE,gBAAM,kBAAkB,UAAU,aAAa,GAAG,UAAU,gBAAgB;AAC5E,kBAAQ,IAAI,YAAY;AACxB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,aAAa;AAAA,cACX,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,YACA,UAAU;AAAA,YACV,MAAM,GAAG,eAAe,IAAI,aAAa,cAAc,gBAAgB;AAAA,UACzE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,qBAAmBF,SAAQ,WAAW;AAEtC,SAAO;AACT;AAEA,SAAS,mBAAmB,MAA6C;AACvE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,cAAc,KAAK,KAAK,CAAC,SAAS,MAAM,UAAU,aAAa;AACrE,SAAO,aAAa;AACtB;AAEA,SAAS,uBAAuB,aAAqB,MAAyB,QAAiB,YAA4B;AACzH,QAAM,SAAS,UAAU,aAAa,GAAG,UAAU,cAAc;AACjE,QAAME,WAAU,mBAAmB,IAAI;AACvC,MAAIA,SAAS,QAAO,GAAG,MAAM,IAAI,WAAW,cAAcA,QAAO;AACjE,SAAO,GAAG,MAAM,IAAI,WAAW;AACjC;AAEA,SAAS,4BACPF,UACA,SAAkB,OACwG;AAC1H,QAAM,aAAa,oBAAI,IAGrB;AAEF,WAAS,mBAAmB,aAAoB,aAAqB,IAAU;AAC7E,eAAW,OAAO,eAAe,CAAC,GAAG;AACnC,UAAI,IAAI,UAAU,mBAAmB,IAAI,MAAM;AAC7C,2BAAmB,IAAI,MAAM,UAAU;AACvC;AAAA,MACF;AAEA,UAAI,IAAI,UAAU,aAAa;AAC7B,cAAM,aAAa,SAAS,WAAW,IAAI,IAAI,KAAK;AACpD,cAAM,aAAa,IAAI,QAAQ,CAAC;AAChC,cAAM,iBAAiB,WAAW,OAAO,CAAC,MAAW,EAAE,UAAU,YAAY;AAC7E,2BAAmB,gBAAgB,UAAU;AAE7C,cAAM,aAAa,WAAW,OAAO,CAAC,MAAW,EAAE,UAAU,cAAc;AAC3E,mBAAW,OAAO,YAAY;AAC5B,gBAAM,UAAU,SAAS,WAAW,IAAI,IAAI,eAAe,IAAI,IAAI,KAAK;AACxE,gBAAM,eAAe,IAAI,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,UAAU,YAAY;AAChF,6BAAmB,aAAa,OAAO;AAAA,QACzC;AACA;AAAA,MACF;AAEA,UAAI,IAAI,UAAU,aAAc;AAEhC,YAAM,OAAO,IAAI,QAAQ,CAAC;AAC1B,YAAM,WAAW,KACd,OAAO,CAAC,SAAc,KAAK,UAAU,kBAAkB,KAAK,KAAK,IAAI,EACrE,IAAI,CAAC,UAAe;AAAA,QACnB,IAAI,KAAK,IAAI;AAAA,QACb,GAAI,KAAK,IAAI,UAAU,EAAE,SAAS,KAAK,IAAI,QAAQ,IAAI,CAAC;AAAA,MAC1D,EAAE;AAEJ,YAAM,YAAY,KACf,OAAO,CAAC,SAAc,KAAK,UAAU,mBAAmB,KAAK,KAAK,IAAI,EACtE,IAAI,CAAC,UAAe;AAAA,QACnB,IAAI,KAAK,IAAI;AAAA,QACb,GAAI,KAAK,IAAI,UAAU,EAAE,SAAS,KAAK,IAAI,QAAQ,IAAI,CAAC;AAAA,MAC1D,EAAE;AAEJ,UAAI,SAAS,WAAW,KAAK,UAAU,WAAW,EAAG;AAErD,YAAMC,QAAO,uBAAuB,IAAI,MAAM,MAAM,QAAQ,UAAU;AACtE,iBAAW,IAAIA,OAAM;AAAA,QACnB,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,QAC1C,GAAI,UAAU,SAAS,IAAI,EAAE,UAAU,IAAI,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,qBAAmBD,SAAQ,eAAe,CAAC,CAAC;AAC5C,SAAO;AACT;AASA,IAAM,kBAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AACR;AAcA,SAAS,eAAe,cAAsB,cAA8B;AAE1E,QAAM,UAAU,aACb,QAAQ,kCAAkC,EAAE,EAC5C,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,SAAS,EAAE;AAEtB,QAAM,aAAa,gBAAgB,YAAY;AAC/C,MAAI,CAAC,WAAY,QAAO;AAIxB,MAAI,QAAQ,WAAW,GAAG,UAAU,GAAG,GAAG;AACxC,UAAM,WAAW,QAAQ,MAAM,WAAW,SAAS,CAAC;AAEpD,QAAI,CAAC,SAAS,SAAS,GAAG,EAAG,QAAO;AACpC,WAAO;AAAA,EACT;AAIA,SAAO,MAAM,OAAO;AACtB;AAEA,IAAM,wBAAwB,oBAAI,IAAI,CAAC,SAAS,WAAW,SAAS,WAAW,UAAU,WAAW,MAAM,CAAC;AAI3G,SAAS,UAAU,KAAU,MAAwE;AACnG,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,UAAU,KAAU,MAAuE;AAClG,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI;AAAA,IACb;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,cAAc,SAAmC;AAC/D,SAAO,IAAI,QAAQ,CAACG,aAAY;AAC9B,UAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,OAAG,SAAS,GAAG,OAAO,KAAK,CAAC,WAAW;AACrC,SAAG,MAAM;AACT,YAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,MAAAA,SAAQ,eAAe,MAAM,eAAe,OAAO,eAAe,KAAK;AAAA,IACzE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,YAAY,SAAiB,cAAuC;AAClF,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,UAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,OAAG,SAAS,GAAG,OAAO,KAAK,CAAC,WAAW;AACrC,SAAG,MAAM;AACT,MAAAA,SAAQ,OAAO,KAAK,KAAK,YAAY;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,YAAY,KAAa,mBAA2B,mBAAyB;AAC3F,QAAM,aAAaA,SAAQ,GAAG;AAC9B,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAGzC,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,cAAc;AAAA,MACZ,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC1B;AAAA,EACF;AACA,EAAAC,eAAc,KAAK,YAAY,cAAc,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI,MAAM,OAAO;AAGpG,QAAM,MAAM,WAAW;AACvB,QAAM,SAAS;AAAA;AAAA;AAAA;AAAA,uBAIM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAU7B,GAAG;AAAA;AAAA;AAGX,EAAAA,eAAc,KAAK,YAAY,wBAAwB,GAAG,QAAQ,OAAO;AAGzE,QAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BlB,EAAAA,eAAc,KAAK,YAAY,YAAY,GAAG,WAAW,OAAO;AAGhE,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUhB,EAAAA,eAAc,KAAK,YAAY,MAAM,GAAG,SAAS,OAAO;AAGxD,EAAAA,eAAc,KAAK,YAAY,QAAQ,GAAG,oCAAoC,OAAO;AAGrF,YAAU,KAAK,YAAY,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACzD,eAAa,KAAK,WAAW,UAAU,GAAG,KAAK,YAAY,UAAU,UAAU,CAAC;AAClF;AAEA,eAAsB,UAAU,SAAyC;AACvE,QAAM,EAAE,OAAO,QAAQ,OAAO,SAAS,OAAO,OAAO,OAAO,SAAS,OAAO,IAAI,IAAI;AACpF,QAAM,SAAS,CAAC;AAEhB,MAAI;AAEJ,MAAI,OAAO;AACT,aAAS,MAAM,UAAU;AAAA,EAC3B,WAAW,SAAS,MAAM,SAAS,GAAG;AACpC,UAAM,QAAkB,CAAC;AACzB,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAWD,SAAQ,IAAI;AAC7B,UAAI,CAACE,YAAW,QAAQ,GAAG;AACzB,cAAM,IAAI,MAAM,mBAAmB,QAAQ,EAAE;AAAA,MAC/C;AACA,YAAM,KAAK,aAAa,UAAU,OAAO,CAAC;AAAA,IAC5C;AACA,aAAS,MAAM,KAAK,MAAM;AAAA,EAC5B,OAAO;AACL,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAGA,QAAM,aAAaF,SAAQ,GAAG;AAC9B,MAAI,UAAU;AACd,MAAI,CAAC,UAAU,CAACE,YAAW,KAAK,YAAY,wBAAwB,CAAC,KAAK,QAAQ,MAAM,OAAO;AAC7F,UAAM,YAAY,MAAM,cAAc,oCAAoC,UAAU,SAAS;AAC7F,QAAI,WAAW;AACb,YAAM,mBAAmB,MAAM,YAAY,wCAAwC,iBAAiB;AACpG,kBAAY,KAAK,gBAAgB;AACjC,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,SAAS,QAAQ,EAAE,OAAO,CAAC;AAChD,QAAM,UAAU,OAAO;AAEvB,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,MAAMC,WAAU,UAAU;AAChC,QAAM,SAAuB,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE;AACnF,QAAM,cAAc,oBAAI,IAA0B;AAElD,QAAM,qBAAqB,OACzB,QACA,MACA,IACAJ,aACiB;AACjB,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,WAAW,sBAAsB,MAAM,IAAIA,QAAO;AACxD,QAAI,CAAC,YAAY,IAAI,QAAQ,GAAG;AAC9B,kBAAY;AAAA,QACV;AAAA,QACA,OAAO,IAAIA,QAAO,EAAE,MAAM,MAAM,MAAS;AAAA,MAC3C;AAAA,IACF;AACA,WAAO,MAAM,YAAY,IAAI,QAAQ;AAAA,EACvC;AAEA,QAAM,wBAAwB,CAAC,MAAc,IAAYA,aAA2B;AAGlF,gBAAY,OAAO,sBAAsB,MAAM,EAAE,CAAC;AAClD,gBAAY,OAAO,sBAAsB,MAAM,IAAIA,QAAO,CAAC;AAAA,EAC7D;AAEA,QAAM,YAAY,QAAQ,IAAI,mBAAmB;AACjD,QAAM,6BAA6B,4BAA4B,OAAO,SAAS,MAAM;AAErF,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,SAAS,UAAW;AACjC,UAAM,OAAO,2BAA2B,IAAI,SAAS,IAAI;AACzD,QAAI,CAAC,KAAM;AACX,aAAS,cAAc;AAAA,MACrB,GAAG,SAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAAA,EACF;AAGA,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,YAAY,WAAW;AAChC,gBAAY,IAAI,mBAAmB,SAAS,MAAM,SAAS,EAAE,CAAC;AAC9D,gBAAY,IAAI,sBAAsB,SAAS,MAAM,SAAS,IAAI,SAAS,OAAO,CAAC;AAAA,EACrF;AACA,QAAM,QAAQ,uBAAuB,MAAM,IAAI,MAAM,oBAAoB,OAAO,SAAS,aAAa,MAAM,IAAI,CAAC;AACjH,YAAU,KAAK,GAAG,KAAK;AAEvB,aAAW,YAAY,WAAW;AAChC,UAAM,QAAQ,SAAS,UAAU,GAAG,SAAS,IAAI,IAAI,SAAS,EAAE,IAAI,SAAS,OAAO,KAAK,GAAG,SAAS,IAAI,IAAI,SAAS,EAAE;AAExH,QAAI,QAAQ;AACV,YAAM,SAAS,UAAU,KAAK,SAAS,IAAI;AAC3C,UAAI,QAAQ;AACV,cAAM,WAAW,MAAM,mBAAmB,QAAQ,SAAS,MAAM,SAAS,IAAI,SAAS,OAAO;AAC9F,YAAI,UAAU;AACZ,iBAAO,QAAQ,KAAK,KAAK;AAAA,QAC3B,OAAO;AACL,gBAAM,SAAS,MAAM,mBAAmB,QAAQ,SAAS,MAAM,SAAS,EAAE;AAC1E,cAAI,UAAU,OAAO,WAAW,OAAO,YAAY,SAAS,SAAS;AACnE,mBAAO,UAAU,KAAK,GAAG,SAAS,IAAI,IAAI,SAAS,EAAE,IAAI,OAAO,OAAO,EAAE;AAAA,UAC3E;AACA,iBAAO,QAAQ,KAAK,KAAK;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,eAAO,QAAQ,KAAK,KAAK;AAAA,MAC3B;AACA;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,KAAK,SAAS,IAAI;AAC3C,QAAI,CAAC,QAAQ;AACX,aAAO,OAAO,KAAK,GAAG,KAAK,gCAAgC,SAAS,IAAI,GAAG;AAC3E;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,UAAU,KAAK,SAAS,IAAI;AAC3C,YAAM,WAAW,MAAM,mBAAmB,QAAQ,SAAS,MAAM,SAAS,IAAI,SAAS,OAAO;AAC9F,YAAM,SAAS,CAAC,YAAY,SAAS,UAAU,MAAM,mBAAmB,QAAQ,SAAS,MAAM,SAAS,EAAE,IAAI;AAC9G,YAAM,gBACJ,CAAC,YAAY,SAAS,WAAW,QAAQ,WAAW,OAAO,YAAY,SAAS,UAAU,OAAO,UAAU;AAE7G,YAAM,mBAAmB,SAAS;AAClC,YAAM,sBAAsB,iBAAiB,KAAK,EAAE,SAAS;AAC7D,UAAI,WAAW;AAGf,UAAI,CAAC,qBAAqB;AACxB,YAAI,UAAU,UAAU;AACtB,qBAAW,SAAS;AAAA,QACtB,WAAW,CAAC,YAAY,QAAQ,UAAU;AAExC,qBAAW,OAAO;AAAA,QACpB;AAAA,MACF;AAGA,UAAI,CAAC,YAAY,sBAAsB,IAAI,SAAS,IAAI,GAAG;AACzD,YAAI,CAAC,UAAU;AACb,qBAAW;AAAA,QACb,WAAW,CAAC,SAAS,SAAS,eAAe,GAAG;AAC9C,qBAAW,GAAG,QAAQ;AAAA;AAAA;AAAA,QACxB;AAAA,MACF;AAEA,YAAM,eAAe;AAAA,QACnB,GAAG,yBAAyB,SAAS,MAAM,SAAS,aAAa,UAAU,MAAM;AAAA,QACjF;AAAA,MACF;AAIA,YAAM,eAAoC;AAAA,QACxC,UAAU;AAAA,QACV,wBAAwB,QAAQ,aAAa;AAAA,MAC/C;AAEA,UAAI,CAAC,YAAY,QAAQ;AACvB,cAAM,UAAU,eAAe,SAAS,MAAM,SAAS,IAAI;AAC3D,YAAI,SAAS;AACX,uBAAa,OAAO;AAAA,QACtB;AAAA,MACF;AAEA,YAAM,OAAO,cAAc,YAAY;AACvC,4BAAsB,SAAS,MAAM,SAAS,IAAI,SAAS,OAAO;AAElE,UAAI,UAAU;AACZ,eAAO,QAAQ,KAAK,KAAK;AAAA,MAC3B,OAAO;AACL,eAAO,QAAQ,KAAK,KAAK;AACzB,YAAI,eAAe;AACjB,iBAAO,UAAU,KAAK,GAAG,SAAS,IAAI,IAAI,SAAS,EAAE,IAAI,aAAa,EAAE;AAAA,QAC1E;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,OAAO,KAAK,GAAG,KAAK,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IAC1F;AAAA,EACF;AAEA,MAAI,SAAS,aAAa,QAAQ,MAAM;AACxC,MAAI,SAAS;AACX,cAAU,+BAA+B,UAAU;AAAA;AAAA,EACrD;AACA,SAAO;AACT;AAGA,IAAM,IAAI;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,cAA+E;AAAA,EACnF,QAAQ,EAAE,OAAO,EAAE,SAAS,OAAO,UAAU,OAAO,EAAE;AAAA,EACtD,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,WAAW,OAAO,EAAE;AAAA,EACrD,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,SAAS,OAAO,EAAE;AAAA,EAClD,SAAS,EAAE,OAAO,EAAE,QAAQ,OAAO,WAAW,OAAO,EAAE;AAAA,EACvD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,SAAS,OAAO,EAAE;AAAA,EACjD,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,WAAW,OAAO,EAAE;AAAA,EACrD,MAAM,EAAE,OAAO,EAAE,OAAO,OAAO,QAAQ,OAAO,EAAE;AAAA,EAChD,WAAW,EAAE,OAAO,EAAE,OAAO,OAAO,aAAa,OAAO,EAAE;AAAA,EAC1D,aAAa,EAAE,OAAO,EAAE,OAAO,OAAO,gBAAgB,OAAO,EAAE;AAAA,EAC/D,SAAS,EAAE,OAAO,EAAE,OAAO,OAAO,WAAW,OAAO,EAAE;AAAA,EACtD,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,GAAG;AAAA,EAChD,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,QAAQ,OAAO,GAAG;AAClD;AAEA,IAAM,sBAAsB,EAAE,OAAO,EAAE,OAAO,OAAO,YAAY,OAAO,GAAG;AAK3E,SAAS,WAAW,OAA+C;AACjE,QAAM,WAAW,MAAM,QAAQ,GAAG;AAClC,MAAI,aAAa,GAAI,QAAO,EAAE,MAAM,IAAI,MAAM,MAAM;AACpD,SAAO,EAAE,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,MAAM,MAAM,MAAM,WAAW,CAAC,EAAE;AAC3E;AAKA,SAAS,YAAY,QAAyC;AAC5D,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,SAAS,QAAQ;AAC1B,UAAM,EAAE,MAAM,KAAK,IAAI,WAAW,KAAK;AACvC,QAAI,CAAC,OAAO,IAAI,IAAI,EAAG,QAAO,IAAI,MAAM,CAAC,CAAC;AAC1C,WAAO,IAAI,IAAI,EAAG,KAAK,IAAI;AAAA,EAC7B;AACA,QAAM,SAAS,IAAI;AAAA,IACjB,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AACnC,YAAM,UAAU,YAAY,EAAE,CAAC,CAAC,KAAK,qBAAqB;AAC1D,YAAM,UAAU,YAAY,EAAE,CAAC,CAAC,KAAK,qBAAqB;AAC1D,aAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AACA,aAAW,CAAC,EAAE,KAAK,KAAK,QAAQ;AAC9B,UAAM,KAAK;AAAA,EACb;AACA,SAAO;AACT;AAKA,SAAS,UAAU,MAAsB;AACvC,QAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAM,SAAS,IAAI,IAAI,KAAK;AAE5B,SAAO,GAAG,IAAI,KAAK,UAAU,MAAM,GAAG,EAAE,KAAK;AAC/C;AAEA,SAAS,mBAAmB,QAA4B;AACtD,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAS,YAAY,MAAM;AAEjC,aAAW,CAAC,MAAM,KAAK,KAAK,QAAQ;AAClC,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,UAAM,SAAS,MAAM,WAAW,IAAI,IAAI,QAAQ,GAAG,IAAI,KAAK;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM,UAAU,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,MAAM,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE;AAC9E,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,MAAM,IAAI,KAAK,SAAI,EAAE,KAAK,KAAK,IAAI,EAAE;AAAA,IAClD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,QAAsB,QAAyB;AACnE,QAAM,QAAkB,CAAC,EAAE;AAC3B,QAAM,SAAS,SAAS,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI,UAAU,EAAE,KAAK,MAAM;AACnE,QAAM,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,SAAS,OAAO,UAAU;AAE/E,MAAI,QAAQ,KAAK,OAAO,OAAO,SAAS,GAAG;AACzC,UAAM,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,kBAAkB,EAAE,KAAK,EAAE;AAC1D,UAAM,KAAK,KAAK,EAAE,GAAG,GAAG,SAAI,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE;AAAA,EACpD;AAEA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,UAAM,OAAO,SAAS,iBAAiB;AACvC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,QAAQ,MAAM,eAAe,EAAE,KAAK,EAAE;AAC1F,UAAM,KAAK,GAAG,mBAAmB,OAAO,OAAO,CAAC;AAAA,EAClD;AAEA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,UAAM,OAAO,SAAS,iBAAiB;AACvC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,EAAE,IAAI,GAAG,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,QAAQ,MAAM,eAAe,EAAE,KAAK,EAAE;AACzF,UAAM,KAAK,GAAG,mBAAmB,OAAO,OAAO,CAAC;AAAA,EAClD;AAEA,MAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,UAAM,OAAO,SAAS,kBAAkB;AACxC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,UAAK,IAAI,IAAI,OAAO,UAAU,MAAM,wBAAwB,EAAE,KAAK,EAAE;AACtG,UAAM,KAAK,GAAG,mBAAmB,OAAO,SAAS,CAAC;AAAA,EACpD;AAEA,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,EAAE,GAAG,GAAG,EAAE,IAAI,UAAK,OAAO,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE;AAC5E,eAAW,KAAK,OAAO,QAAQ;AAC7B,YAAM,KAAK,MAAM,EAAE,GAAG,SAAI,EAAE,KAAK,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,WAAW,KAAK,OAAO,QAAQ,WAAW,KAAK,OAAO,OAAO,WAAW,GAAG;AAC5F,UAAM,KAAK,KAAK,EAAE,GAAG,yBAAyB,EAAE,KAAK,EAAE;AAAA,EACzD;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,YAA6B;AACpC,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC;AACtD,YAAQ,MAAM,GAAG,OAAO,MAAMA,SAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,CAAC,CAAC;AAC9E,YAAQ,MAAM,GAAG,SAAS,MAAM;AAAA,EAClC,CAAC;AACH;;;AEr9BA,SAAS,WAAAI,gBAAe;AACxB,SAAS,cAAc;AACvB,OAAOC,gBAAe;AAEf,IAAM,iBAAiB,OAAO,SAA6E;AAChH,QAAM,MAAMD,SAAQ,KAAK,GAAG;AAC5B,QAAM,MAAMC,WAAU,GAAG;AAEzB,QAAM,SAAS,MAAM,IAAI,eAAe;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,SAASD,SAAQ,KAAK,MAAM,IAAI;AAAA,EAClD,CAAC;AAED,MAAI,KAAK,QAAQ;AACf,WAAO,OAAO,UAAU,EAAE,OAAO,KAAK,CAAC;AACvC,WAAO,KAAK,UAAU,OAAO,UAAU,MAAM,CAAC;AAAA,EAChD;AAEA,QAAM,YAAY,OAAO,SAAS;AAClC,QAAM,SAAS;AAAA,IACb,UAAU,SAAS,UAAU,GAAG,UAAU,SAAS,MAAM;AAAA,IACzD,UAAU,SAAS,OAAO,UAAU,GAAG,UAAU,SAAS,OAAO,MAAM;AAAA,IACvE,UAAU,SAAS,SAAS,UAAU,GAAG,UAAU,SAAS,SAAS,MAAM;AAAA,IAC3E,UAAU,SAAS,QAAQ,UAAU,GAAG,UAAU,SAAS,QAAQ,MAAM;AAAA,IACzE,UAAU,QAAQ,UAAU,GAAG,UAAU,QAAQ,MAAM;AAAA,IACvD,UAAU,SAAS,UAAU,GAAG,UAAU,SAAS,MAAM;AAAA,EAC3D,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,SAAO,qBAAqB,OAAO,QAAQ;AAAA,aAAgB,MAAM;AACnE;AAEA,IAAM,iBAAiB,CAAC,SAAsB;AAC5C,QAAM,QAAkB,CAAC;AAEzB,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,KAAK,cAAc,MAAM,OAAO,MAAM,EAAE;AAC9C,QAAM,KAAK,EAAE;AAEb,MAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,UAAM,KAAK,cAAc,KAAK,UAAU,MAAM,YAAY;AAC1D,eAAW,KAAK,KAAK,WAAW;AAC9B,YAAM,SAAS,EAAE,eAAe,UAAU,MAAM,EAAE,eAAe,YAAY,MAAM,EAAE,eAAe,cAAc,MAAM;AACxH,YAAME,WAAU,EAAE,eAAe,cAAc,GAAG,EAAE,eAAe,OAAO,EAAE,UAAU,KAAK,EAAE;AAC7F,YAAM,SAAS,EAAE,gBAAgB,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,MAAM;AACtE,YAAM,KAAK,KAAK,MAAM,IAAI,EAAE,UAAU,IAAIA,QAAO,MAAM,EAAE,IAAI,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE;AAAA,IAC3F;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,KAAK,cAAc,SAAS,GAAG;AACjC,UAAM,KAAK,kBAAkB,KAAK,cAAc,MAAM,YAAY;AAClE,eAAW,KAAK,KAAK,eAAe;AAClC,YAAM,SAAS,EAAE,eAAe,UAAU,MAAM;AAChD,YAAM;AAAA,QACJ,KAAK,MAAM,IAAI,EAAE,SAAS,MAAM,EAAE,SAAS,OAAO,EAAE,UAAU,GAAG,EAAE,kBAAkB,IAAI,EAAE,eAAe,KAAK,EAAE;AAAA,MACnH;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,KAAK,QAAQ,iBAAiB,GAAG;AACnC,UAAM,KAAK,sBAAsB;AAAA,EACnC,OAAO;AACL,UAAM,KAAK,YAAY,KAAK,UAAU,MAAM,sBAAsB,KAAK,cAAc,MAAM,uBAAuB;AAAA,EACpH;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,IAAM,eAAe,OAAO,SAAyE;AAC1G,QAAM,MAAMF,SAAQ,KAAK,GAAG;AAC5B,QAAM,MAAMC,WAAU,GAAG;AAEzB,QAAM,OAAO,MAAM,IAAI,cAAcD,SAAQ,KAAK,KAAK,GAAGA,SAAQ,KAAK,KAAK,CAAC;AAE7E,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACrC;AAEA,SAAO,eAAe,IAAI;AAC5B;AAEO,IAAM,eAAe,OAAO,SAA2C;AAC5E,QAAM,MAAMA,SAAQ,KAAK,GAAG;AAC5B,QAAM,MAAMC,WAAU,GAAG;AAEzB,QAAM,YAAY,MAAM,IAAI,cAAc;AAE1C,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,EAC1C;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,CAAC,cAAc,EAAE;AAC/B,aAAW,KAAK,WAAW;AACzB,UAAM,MAAM,EAAE,MAAM,KAAK,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,MAAM;AAC3D,UAAM,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,SAAS,GAAG,GAAG,EAAE;AAC/C,UAAM,KAAK,OAAO,EAAE,QAAQ,EAAE;AAAA,EAChC;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC3GA,OAAO,QAAQ;AACf,OAAOE,WAAU;AACjB,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,WAAW,kBAAkB;AACtC,OAAOC,gBAAe;AAUtB,SAAS,6BAA6B;AAG/B,IAAM,uBAAuB,CAAC,eAAyC;AAC5E,QAAM,WAAWD,MAAK,KAAK,YAAY,iBAAiB;AACxD,QAAM,UAAUA,MAAK,KAAK,YAAY,gBAAgB;AAEtD,QAAM,aAAa,GAAG,WAAW,QAAQ,IAAI,WAAW,GAAG,WAAW,OAAO,IAAI,UAAU;AAE3F,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB;AAEA,QAAM,UAAU,GAAG,aAAa,YAAY,OAAO;AACnD,QAAM,SAAS,KAAK,KAAK,OAAO;AAChC,QAAM,QAAQ,QAAQ,SAAS,CAAC;AAEhC,aAAW,QAAQ,OAAO;AACxB,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,OAAO,SAAS,UAAU,OAAO,YAAY,UAAa,OAAO,OAAO,YAAY,UAAU;AAChG,cAAM,IAAI,MAAM,8CAA8C,KAAK,IAAI,sBAAsB;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe,UAAU;AACnC,UAAM,kBAAkB,oBAAI,IAAI,CAAC,YAAY,WAAW,QAAQ,MAAM,CAAC;AACvE,QAAI,CAAC,gBAAgB,IAAI,OAAO,cAAc,QAAQ,GAAG;AACvD,YAAM,IAAI;AAAA,QACR,mCAAmC,OAAO,cAAc,QAAQ;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,QAAQ,iBAAiB,EAAE,eAAe,OAAO,cAAc;AAAA,IACnE;AAAA,EACF;AACF;AAEA,IAAM,kBAA+F;AAAA,EACnG,gBAAgB,CAACE,OAAMA,GAAE,cAAc,cAAcA,GAAE,eAAe;AAAA,EACtE,kBAAkB,CAACA,OAAMA,GAAE,cAAc,cAAcA,GAAE,eAAe;AAAA,EACxE,gBAAgB,CAACA,OAAMA,GAAE,cAAc,WAAWA,GAAE,eAAe;AAAA,EACnE,kBAAkB,CAACA,OAAMA,GAAE,cAAc,WAAWA,GAAE,eAAe;AACvE;AAEO,IAAM,0BAA0B,CACrCC,cAC+E;AAC/E,QAAM,WAAW,oBAAI,IAAyB;AAC9C,QAAM,WAAW,oBAAI,IAAyB;AAE9C,aAAW,WAAWA,UAAS,UAAU,UAAU;AACjD,UAAM,YAAY,QAAQ;AAC1B,QAAI,QAAQ,OAAO;AACjB,YAAM,MAAM,oBAAI,IAAY;AAC5B,iBAAW,KAAK,QAAQ,MAAO,KAAI,IAAI,EAAE,EAAY;AACrD,eAAS,IAAI,WAAW,GAAG;AAAA,IAC7B;AACA,QAAI,QAAQ,UAAU;AACpB,YAAM,MAAM,oBAAI,IAAY;AAC5B,iBAAW,KAAK,QAAQ,SAAU,KAAI,IAAI,EAAE,EAAY;AACxD,eAAS,IAAI,WAAW,GAAG;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,SAAS;AAC9B;AAIA,IAAM,oBAAoB,CACxB,YACA,WACA,WACA,gBACY;AACZ,SAAO,UAAU,KAAK,CAAC,MAAM;AAC3B,QAAI,MAAM,IAAK,QAAO;AACtB,QAAI,EAAE,WAAW,UAAU,GAAG;AAC5B,UAAI,UAAW,QAAO,cAAc,EAAE,MAAM,CAAC;AAE7C,aAAO,aAAa,SAAS,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,UAAU,KAAK;AAAA,IACnE;AACA,QAAI,EAAE,WAAW,UAAU,EAAG,QAAO,eAAe,EAAE,MAAM,CAAC;AAC7D,QAAI,EAAE,WAAW,WAAW,EAAG,QAAO,aAAa,SAAS,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,UAAU,KAAK;AAChG,QAAI,EAAE,WAAW,WAAW,EAAG,QAAO,aAAa,SAAS,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,UAAU,KAAK;AAChG,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,mBAA2C,oBAAI,IAAI,CAAC,oBAAoB,kBAAkB,CAAC;AAEjG,IAAM,yBAAyB,oBAAI,IAAI,CAAC,SAAS,WAAW,OAAO,CAAC;AAEpE,IAAM,kBAAkB,CAACA,cAAgE;AACvF,QAAM,MAAM,oBAAI,IAAiC;AACjD,aAAW,OAAOA,UAAS,UAAU,SAAS,OAAQ,KAAI,IAAI,IAAI,IAAc,GAAG;AACnF,aAAW,OAAOA,UAAS,UAAU,SAAS,SAAU,KAAI,IAAI,IAAI,IAAc,GAAG;AACrF,aAAW,OAAOA,UAAS,UAAU,SAAS,QAAS,KAAI,IAAI,IAAI,IAAc,GAAG;AACpF,SAAO;AACT;AAIA,IAAM,oBAAoB,CAACA,WAA2B,cAAiE;AACrH,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,aAAW,WAAWA,UAAS,UAAU,UAAU;AACjD,UAAM,WAAW,QAAQ,SAAS;AAClC,QAAI,CAAC,SAAU;AACf,eAAW,WAAW,UAAU;AAC9B,UAAI,UAAU,MAAM,IAAI,QAAQ,EAAE;AAClC,UAAI,CAAC,SAAS;AACZ,kBAAU,CAAC;AACX,cAAM,IAAI,QAAQ,IAAI,OAAO;AAAA,MAC/B;AACA,YAAM,QAAsB;AAAA,QAC1B,IAAI,QAAQ;AAAA,QACZ,SAAS,QAAQ;AAAA,MACnB;AACA,UAAI,QAAQ,UAAU,MAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,OAAO,SAAS,GAAG;AAChF,cAAM,SAAS,QAAQ;AAAA,MACzB;AACA,cAAQ,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,YAAoB,SAAyB,GAAG,IAAI,IAAI,UAAU;AAE7F,IAAM,+BAA+B,CAACA,cAAmD;AACvF,QAAM,WAAW,oBAAI,IAAoB;AAEzC,aAAW,SAASA,UAAS,UAAU,SAAS,QAAQ;AACtD,aAAS,IAAI,kBAAkB,MAAM,IAAc,OAAO,GAAG,MAAM,OAAiB;AAAA,EACtF;AACA,aAAW,WAAWA,UAAS,UAAU,SAAS,UAAU;AAC1D,aAAS,IAAI,kBAAkB,QAAQ,IAAc,SAAS,GAAG,QAAQ,OAAiB;AAAA,EAC5F;AACA,aAAW,SAASA,UAAS,UAAU,SAAS,SAAS;AACvD,aAAS,IAAI,kBAAkB,MAAM,IAAc,OAAO,GAAG,MAAM,OAAiB;AAAA,EACtF;AAEA,SAAO;AACT;AAEA,IAAM,0BAA0B,CAAC,mBAA2C;AAC1E,MAAI,eAAe,eAAe,aAAa;AAC7C,WAAO,eAAe,cAAc,eAAe;AAAA,EACrD;AACA,SAAO,eAAe;AACxB;AAEA,IAAM,+BAA+B,CACnC,SACA,gBACA,0BACY;AACZ,MAAI,QAAQ,OAAO,eAAe,WAAY,QAAO;AAErD,QAAM,gBAAgB,wBAAwB,cAAc;AAC5D,QAAM,iBAAiB,QAAQ;AAE/B,MAAI,CAAC,kBAAkB,mBAAmB,UAAU;AAClD,UAAM,gBAAgB,sBAAsB,IAAI,kBAAkB,eAAe,YAAY,eAAe,IAAI,CAAC;AACjH,QAAI,CAAC,cAAe,QAAO;AAC3B,WAAO,kBAAkB;AAAA,EAC3B;AAEA,MAAI,WAAW,cAAc,GAAG;AAC9B,QAAI;AACF,aAAO,UAAU,eAAe,cAAc;AAAA,IAChD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,mBAAmB;AAC5B;AAEA,IAAM,6BAA6B,CACjCA,WACA,WACA,gBACA,0BACmB;AACnB,QAAM,UAA0B,CAAC;AAEjC,aAAW,WAAWA,UAAS,UAAU,UAAU;AACjD,UAAM,WAAW,QAAQ,SAAS;AAClC,QAAI,CAAC,SAAU;AAEf,UAAM,WAAW,SAAS,KAAK,CAAC,YAAY,6BAA6B,SAAS,gBAAgB,qBAAqB,CAAC;AACxH,QAAI,CAAC,SAAU;AAEf,UAAM,QAAsB;AAAA,MAC1B,IAAI,QAAQ;AAAA,MACZ,SAAS,QAAQ;AAAA,IACnB;AAEA,QAAI,QAAQ,UAAU,MAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,OAAO,SAAS,GAAG;AAChF,YAAM,SAAS,QAAQ;AAAA,IACzB;AAEA,YAAQ,KAAK,KAAK;AAAA,EACpB;AAEA,SAAO;AACT;AAEA,IAAM,8BAA8B,CAAC,cAA4B,cAAiC;AAChG,SAAO,UAAU,KAAK,CAAC,aAAa;AAClC,QAAI,aAAa,IAAK,QAAO;AAC7B,QAAI,SAAS,WAAW,UAAU,EAAG,QAAO,aAAa,eAAe,eAAe,SAAS,MAAM,CAAC;AACvG,QAAI,SAAS,WAAW,WAAW;AACjC,aAAO,aAAa,iBAAiB,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAS,MAAM,CAAC,CAAC;AACzF,QAAI,SAAS,WAAW,WAAW;AACjC,aAAO,aAAa,iBAAiB,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAS,MAAM,CAAC,CAAC;AACzF,QAAI,SAAS,WAAW,UAAU,EAAG,QAAO,aAAa,iBAAiB,KAAK,CAAC,YAAY,QAAQ,OAAO,SAAS,MAAM,CAAC,CAAC;AAC5H,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,2BAA2B,CAC/B,MACA,QACA,gBACA,mBACA,iBACuB;AACvB,QAAM,mBAAmB,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,KAAK,SAAS,oBAAoB,CAAC;AAC/F,MAAI,iBAAiB,WAAW,EAAG,QAAO,CAAC;AAE3C,QAAM,iBAAiB,gBAAgB,cAAc;AACrD,QAAM,eAAe,eAAe,gBAAgB,YAAY,IAAI;AACpE,QAAM,gBAAgB,kBAAkB,gBAAgB,OAAO;AAG/D,QAAM,sBAAsB,KAAK,UAAU,OAAO,CAAC,OAAO;AACxD,QAAI,CAAC,uBAAuB,IAAI,GAAG,IAAI,EAAG,QAAO;AACjD,QAAI,CAAC,GAAG,eAAe,SAAS,YAAY,EAAG,QAAO;AAGtD,UAAM,gBAAgB,eAAe,IAAI,GAAG,UAAU;AACtD,QAAI,CAAC,iBAAiB,CAAC,cAAc,WAAY,QAAO;AAGxD,QAAI,cAAc;AAChB,YAAM,cAAc,aAAa,IAAI,GAAG,UAAU;AAClD,UAAI,eAAe,YAAY,WAAY,QAAO;AAAA,IACpD;AAEA,WAAO;AAAA,EACT,CAAC;AAED,MAAI,oBAAoB,WAAW,EAAG,QAAO,CAAC;AAE9C,QAAM,UAA8B,CAAC;AAErC,aAAW,QAAQ,kBAAkB;AACnC,UAAM,UAA+B,CAAC;AAEtC,eAAW,MAAM,qBAAqB;AACpC,UAAI,CAAC,kBAAkB,GAAG,YAAY,QAAW,KAAK,WAAW,iBAAiB,EAAG;AAErF,YAAM,YAAY,cAAc,IAAI,GAAG,UAAU,KAAK,CAAC;AACvD,cAAQ,KAAK,EAAE,gBAAgB,IAAI,kBAAkB,UAAU,CAAC;AAAA,IAClE;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,KAAK,EAAE,MAAM,SAAS,sBAAsB,gBAAgB,CAAC,GAAG,oBAAoB,QAAQ,CAAC;AAAA,IACvG;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,4BAA4B,CAChC,MACA,QACA,mBACuB;AACvB,QAAM,cAAc,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,KAAK,SAAS,gBAAgB,CAAC;AACtF,MAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AAEtC,QAAM,yBAAyB,KAAK,UAAU,OAAO,CAAC,OAAO;AAC3D,QAAI,CAAC,uBAAuB,IAAI,GAAG,IAAI,EAAG,QAAO;AACjD,WAAO,GAAG,eAAe,SAAS,YAAY;AAAA,EAChD,CAAC;AAED,MAAI,uBAAuB,WAAW,EAAG,QAAO,CAAC;AAEjD,QAAM,wBAAwB,6BAA6B,cAAc;AACzE,QAAM,gBAAgB,uBAAuB,IAAI,CAAC,oBAAoB;AAAA,IACpE;AAAA,IACA,kBAAkB,2BAA2B,gBAAgB,SAAS,gBAAgB,qBAAqB;AAAA,IAC3G,kBAAkB,2BAA2B,gBAAgB,YAAY,gBAAgB,qBAAqB;AAAA,EAChH,EAAE;AAEF,QAAM,UAA8B,CAAC;AAErC,aAAW,QAAQ,aAAa;AAC9B,UAAM,UAAU,cAAc,OAAO,CAAC,iBAAiB,4BAA4B,cAAc,KAAK,SAAS,CAAC;AAEhH,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,KAAK,EAAE,MAAM,SAAS,kBAAkB,gBAAgB,CAAC,GAAG,eAAe,QAAQ,CAAC;AAAA,IAC9F;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,oCAAoC,CACxC,MACA,QACA,mBACuB;AACvB,QAAM,gBAAgB,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,KAAK,SAAS,wBAAwB,CAAC;AAChG,MAAI,cAAc,WAAW,EAAG,QAAO,CAAC;AAExC,QAAM,WAAW,OAAO,eAAe;AACvC,MAAI,CAAC,YAAY,aAAa,OAAQ,QAAO,CAAC;AAE9C,QAAM,yBAAyB,KAAK,UAAU,OAAO,CAAC,OAAO;AAC3D,QAAI,CAAC,uBAAuB,IAAI,GAAG,IAAI,EAAG,QAAO;AACjD,WAAO,GAAG,eAAe,SAAS,YAAY;AAAA,EAChD,CAAC;AAED,MAAI,uBAAuB,WAAW,EAAG,QAAO,CAAC;AAEjD,QAAM,wBAAwB,6BAA6B,cAAc;AACzE,QAAM,wBAAgD,uBAAuB,IAAI,CAAC,oBAAoB;AAAA,IACpG;AAAA,IACA,kBAAkB,2BAA2B,gBAAgB,SAAS,gBAAgB,qBAAqB;AAAA,IAC3G,kBAAkB,2BAA2B,gBAAgB,YAAY,gBAAgB,qBAAqB;AAAA,IAC9G,iBAAiB,CAAC;AAAA,EACpB,EAAE;AAEF,QAAM,UAA8B,CAAC;AAErC,aAAW,QAAQ,eAAe;AAChC,UAAM,UAAU,sBAAsB,OAAO,CAAC,OAAO,4BAA4B,IAAI,KAAK,SAAS,CAAC;AACpG,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,KAAK,EAAE,MAAM,SAAS,0BAA0B,gBAAgB,CAAC,GAAG,uBAAuB,QAAQ,CAAC;AAAA,IAC9G;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,0BAA0B,CACrC,MACA,QACA,gBACA,iBACuB;AACvB,QAAM,UAA8B,CAAC;AACrC,QAAM,oBAAoB,iBAAiB,wBAAwB,cAAc,IAAI;AACrF,QAAM,kBAAkB,eAAe,wBAAwB,YAAY,IAAI;AAE/E,aAAW,QAAQ,OAAO,OAAO;AAC/B,eAAW,WAAW,KAAK,MAAM;AAC/B,YAAM,SAAS,gBAAgB,OAAO;AACtC,UAAI,CAAC,OAAQ;AAIb,YAAM,cAAc,iBAAiB,IAAI,OAAO,KAAK,kBAAkB,kBAAkB;AAEzF,YAAM,iBAAiB,KAAK,cAAc;AAAA,QACxC,CAACD,OAAM,OAAOA,EAAC,KAAK,kBAAkBA,GAAE,YAAYA,GAAE,WAAW,KAAK,WAAW,WAAW;AAAA,MAC9F;AAEA,UAAI,eAAe,SAAS,GAAG;AAC7B,gBAAQ,KAAK,EAAE,MAAM,SAAS,eAAe,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,kBAAkB,mBAAmB;AACvC,YAAQ,KAAK,GAAG,yBAAyB,MAAM,QAAQ,gBAAgB,mBAAmB,YAAY,CAAC;AACvG,YAAQ,KAAK,GAAG,0BAA0B,MAAM,QAAQ,cAAc,CAAC;AACvE,YAAQ,KAAK,GAAG,kCAAkC,MAAM,QAAQ,cAAc,CAAC;AAAA,EACjF;AAEA,SAAO;AACT;AAEA,IAAM,oBAA4C,oBAAI,IAAI,CAAC,kBAAkB,kBAAkB,CAAC;AAEzF,IAAM,oBAAoB,CAAC,YAAwC,kBAAkB,IAAI,OAAO;AAEhG,IAAM,gBAAgB,CAAC,SAA4B,eAA4C;AACpG,QAAM,WAAW,kBAAkB,OAAO;AAC1C,SAAO,eAAe,UAClB,WACE,kBACA,kBACF,WACE,wBACA;AACR;AAEO,IAAM,iBAAiB,CAAC,UAA0B;AACvD,SAAO,MAAM,QAAQ,yBAAyB,CAAC,OAAO,YAAY;AAChE,UAAM,WAAW,QAAQ,IAAI,OAAO;AACpC,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,MAAM,wBAAwB,OAAO,aAAa;AAAA,IAC9D;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAIA,IAAM,oBAAoB,OACxB,KACA,YACAE,UACA,SAC4E;AAC5E,MAAI,CAAC,uBAAuB,IAAI,IAAI,EAAG,QAAO,CAAC;AAC/C,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,oBAAoB,YAAYA,QAAO;AAChE,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,YAAY,WAAW,QAAQ,EAAE,OAAO,OAAO,MAAM,EAAE,OAAO,KAAK;AAAA,IACrE;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,IAAM,sBAAsB,OACjC,SACA,gBACA,kBACA,0BACkB;AAClB,QAAM,UAAUH,WAAU,cAAc;AACxC,QAAM,YAAYA,WAAU,gBAAgB;AAE5C,QAAM,WAA4B,CAAC;AAEnC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,cAAe;AAC3B,eAAW,MAAM,OAAO,eAAe;AACrC,YAAM,EAAE,YAAY,SAAAG,UAAS,MAAM,YAAY,iBAAiB,WAAW,IAAI,GAAG;AAClF,YAAM,cAAc,eAAe,cAAc,mBAAmBA,WAAUA;AAC9E,YAAM,gBAAgB,eAAe,cAAc,cAAcA,WAAUA;AAC3E,eAAS;AAAA,SACN,YAAY;AACX,gBAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,YACxC,kBAAkB,SAAS,YAAY,aAAa,IAAI;AAAA,YACxD,kBAAkB,WAAW,YAAY,eAAe,IAAI;AAAA,UAC9D,CAAC;AACD,aAAG,SAAS,OAAO;AACnB,aAAG,QAAQ,MAAM;AACjB,aAAG,mBAAmB,OAAO;AAC7B,aAAG,kBAAkB,MAAM;AAC3B,aAAG,mBAAmB,OAAO;AAC7B,aAAG,kBAAkB,MAAM;AAAA,QAC7B,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,yBAAyB,CAAC,sBAAuB;AAC7D,eAAW,OAAO,OAAO,uBAAuB;AAC9C,YAAM,EAAE,YAAY,SAAAA,UAAS,MAAM,YAAY,iBAAiB,WAAW,IAAI,IAAI;AACnF,YAAM,cAAc,eAAe,cAAc,mBAAmBA,WAAUA;AAC9E,YAAM,gBAAgB,eAAe,cAAc,cAAcA,WAAUA;AAC3E,eAAS;AAAA,SACN,YAAY;AACX,gBAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,YACxC,kBAAkB,SAAS,YAAY,aAAa,IAAI;AAAA,YACxD,kBAAkB,WAAW,YAAY,eAAe,IAAI;AAAA,UAC9D,CAAC;AACD,cAAI,SAAS,OAAO;AACpB,cAAI,QAAQ,MAAM;AAClB,cAAI,mBAAmB,OAAO;AAC9B,cAAI,kBAAkB,MAAM;AAC5B,cAAI,mBAAmB,OAAO;AAC9B,cAAI,kBAAkB,MAAM;AAE5B,cAAI,OAAO,WAAW,MAAM,SAAS;AACnC,gBAAI;AACJ,gBAAI;AACJ,gBAAI;AACF,6BAAe,KAAK,MAAM,OAAO,OAAO;AACxC,4BAAc,KAAK,MAAM,MAAM,OAAO;AAAA,YACxC,QAAQ;AAAA,YAER;AACA,gBAAI,gBAAgB,aAAa;AAC/B,kBAAI,kBAAkB,sBAAsB,cAAc,aAAa,qBAAqB;AAAA,YAC9F;AAAA,UACF;AAAA,QACF,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,QAAQ;AAC5B;;;AC7gBA,SAAS,cAAAC,mBAAkB;AAkBpB,IAAM,sBAAsB,CAACC,cAA8C;AAChF,QAAM,MAAsB,oBAAI,IAAI;AACpC,aAAW,SAASA,UAAS,UAAU,SAAS,QAAQ;AACtD,QAAI,IAAI,MAAM,IAAc,OAAO;AAAA,EACrC;AACA,aAAW,WAAWA,UAAS,UAAU,SAAS,UAAU;AAC1D,QAAI,IAAI,QAAQ,IAAc,SAAS;AAAA,EACzC;AACA,aAAW,SAASA,UAAS,UAAU,SAAS,SAAS;AACvD,QAAI,IAAI,MAAM,IAAc,OAAO;AAAA,EACrC;AACA,SAAO;AACT;AAEO,IAAM,wBAAwB,CAACA,cAAgD;AACpF,QAAM,MAAwB,oBAAI,IAAI;AACtC,aAAW,WAAWA,UAAS,UAAU,UAAU;AACjD,QAAI,QAAQ,UAAU,MAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,OAAO,SAAS,GAAG;AAChF,UAAI,IAAI,QAAQ,IAAc,QAAQ,MAAkB;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,2BAA2B,OACtC,SACA,OAAgC,CAAC,MACX;AACtB,QAAM,EAAE,cAAc,QAAQ,eAAe,SAAS,WAAW,sBAAsB,IAAI;AAC3F,QAAM,eAA2E,CAAC;AAClF,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,aAAW,UAAU,SAAS;AAC5B,eAAW,UAAU,OAAO,KAAK,SAAS;AACxC,UAAI,OAAO,SAAS,UAAW;AAE/B,YAAM,MAAM,eAAe,OAAO,GAAG;AACrC,YAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAE7E,UAAI,OAAO,SAAS;AAClB,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,OAAO,GAAG;AACzD,kBAAQ,GAAG,IAAI,eAAe,KAAK;AAAA,QACrC;AAAA,MACF;AAGA,UAAI,OAAO,iBAAiB,OAAO,cAAc,SAAS,GAAG;AAC3D,mBAAW,MAAM,OAAO,eAAe;AACrC,gBAAM,cAAc,cAAc,IAAI,GAAG,eAAe,UAAU,KAAK;AAEvE,gBAAM,UAAU;AAAA,YACd,aAAa;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,IAAIC,YAAW;AAAA,YACf,MAAM;AAAA,YACN,iBAAiB;AAAA,YACjB,MAAM;AAAA,cACJ,eAAe;AAAA,cACf,GAAI,UAAU,EAAE,OAAO;AAAA,cACvB,SAAS,sBAAsB,WAAW,IAAI,GAAG,eAAe,UAAU;AAAA,cAC1E,SAAS;AAAA,gBACP,IAAI,GAAG,eAAe;AAAA,gBACtB,SAAS,GAAG,eAAe;AAAA,gBAC3B,MAAM;AAAA,cACR;AAAA,cACA,QAAQ;AAAA,gBACN,YAAY,GAAG,oBAAoB;AAAA,gBACnC,WAAW,GAAG,mBAAmB;AAAA,gBACjC,YAAY,GAAG,oBAAoB;AAAA,gBACnC,WAAW,GAAG,mBAAmB;AAAA,cACnC;AAAA,cACA,MAAM;AAAA,gBACJ,MAAM,WAAW;AAAA,gBACjB,QAAQ,aAAa;AAAA,cACvB;AAAA,cACA,WAAW,GAAG;AAAA,cACd,WAAW,GAAG;AAAA,YAChB;AAAA,UACF;AAEA,uBAAa,KAAK;AAAA,YAChB,aAAa,OAAO;AAAA,YACpB,SAAS,MAAM,KAAK,EAAE,QAAQ,QAAQ,SAAS,MAAM,KAAK,UAAU,OAAO,EAAE,CAAC;AAAA,UAChF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAGA,UAAI,OAAO,yBAAyB,OAAO,sBAAsB,SAAS,GAAG;AAC3E,mBAAW,OAAO,OAAO,uBAAuB;AAC9C,gBAAM,cAAc,cAAc,IAAI,IAAI,eAAe,UAAU,KAAK;AAExE,gBAAM,UAAU;AAAA,YACd,aAAa;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,IAAIA,YAAW;AAAA,YACf,MAAM;AAAA,YACN,iBAAiB;AAAA,YACjB,MAAM;AAAA,cACJ,eAAe;AAAA,cACf,GAAI,UAAU,EAAE,OAAO;AAAA,cACvB,GAAI,yBAAyB,EAAE,sBAAsB;AAAA,cACrD,SAAS,uCAAuC,WAAW,IAAI,IAAI,eAAe,UAAU;AAAA,cAC5F,SAAS;AAAA,gBACP,IAAI,IAAI,eAAe;AAAA,gBACvB,SAAS,IAAI,eAAe;AAAA,gBAC5B,MAAM;AAAA,cACR;AAAA,cACA,QAAQ;AAAA,gBACN,YAAY,IAAI,oBAAoB;AAAA,gBACpC,WAAW,IAAI,mBAAmB;AAAA,gBAClC,YAAY,IAAI,oBAAoB;AAAA,gBACpC,WAAW,IAAI,mBAAmB;AAAA,cACpC;AAAA,cACA,iBAAiB,IAAI;AAAA,cACrB,MAAM;AAAA,gBACJ,MAAM,WAAW;AAAA,gBACjB,QAAQ,aAAa;AAAA,cACvB;AAAA,cACA,WAAW,IAAI;AAAA,cACf,WAAW,IAAI;AAAA,YACjB;AAAA,UACF;AAEA,uBAAa,KAAK;AAAA,YAChB,aAAa,OAAO;AAAA,YACpB,SAAS,MAAM,KAAK,EAAE,QAAQ,QAAQ,SAAS,MAAM,KAAK,UAAU,OAAO,EAAE,CAAC;AAAA,UAChF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAGA,UAAI,OAAO,sBAAsB,OAAO,mBAAmB,SAAS,GAAG;AACrE,mBAAW,MAAM,OAAO,oBAAoB;AAC1C,gBAAM,cAAc,cAAc,IAAI,GAAG,eAAe,UAAU,KAAK;AAEvE,gBAAM,YACJ,GAAG,iBAAiB,SAAS,IACzB,GAAG,mBACH,CAAC,EAAE,IAAI,WAAW,SAAS,UAAU,CAAuD;AAElG,qBAAW,YAAY,WAAW;AAChC,kBAAM,UAAU;AAAA,cACd,aAAa;AAAA,cACb,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,IAAIA,YAAW;AAAA,cACf,MAAM;AAAA,cACN,iBAAiB;AAAA,cACjB,MAAM;AAAA,gBACJ,eAAe;AAAA,gBACf,GAAI,UAAU,EAAE,OAAO;AAAA,gBACvB,SAAS,GAAG,GAAG,eAAe,UAAU,KAAK,WAAW,4BAA4B,SAAS,EAAE;AAAA,gBAC/F,UAAU;AAAA,kBACR,IAAI,SAAS;AAAA,kBACb,SAAS,SAAS;AAAA,kBAClB,GAAI,SAAS,UAAU,EAAE,QAAQ,SAAS,OAAO;AAAA,gBACnD;AAAA,gBACA,SAAS;AAAA,kBACP,IAAI,GAAG,eAAe;AAAA,kBACtB,SAAS,GAAG,eAAe;AAAA,kBAC3B,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAEA,yBAAa,KAAK;AAAA,cAChB,aAAa,OAAO;AAAA,cACpB,SAAS,MAAM,KAAK,EAAE,QAAQ,QAAQ,SAAS,MAAM,KAAK,UAAU,OAAO,EAAE,CAAC;AAAA,YAChF,CAAC;AAAA,UACH;AAAA,QACF;AACA;AAAA,MACF;AAGA,iBAAW,UAAU,OAAO,gBAAgB;AAC1C,cAAM,OAAO,cAAc,OAAO,SAAS,OAAO,UAAU;AAC5D,cAAM,cAAc,cAAc,IAAI,OAAO,UAAU,KAAK;AAC5D,cAAM,cAAc,kBAAkB,OAAO,OAAO,IAAI,aAAa;AAErE,cAAM,UAAU;AAAA,UACd,aAAa;AAAA,UACb,MAAM,2BAA2B,OAAO,OAAO;AAAA,UAC/C,QAAQ;AAAA,UACR,IAAIA,YAAW;AAAA,UACf,MAAM;AAAA,UACN,iBAAiB;AAAA,UACjB,MAAM;AAAA,YACJ,eAAe;AAAA,YACf,GAAI,UAAU,EAAE,OAAO;AAAA,YACvB,SAAS,GAAG,OAAO,SAAS,OAAO,IAAI,QAAQ,WAAW,IAAI,OAAO,UAAU;AAAA,YAC/E,CAAC,WAAW,GAAG;AAAA,cACb,IAAI,OAAO;AAAA,cACX,SAAS,OAAO;AAAA,cAChB,GAAI,eAAe,IAAI,OAAO,SAAS,KAAK,EAAE,QAAQ,cAAc,IAAI,OAAO,SAAS,EAAE;AAAA,YAC5F;AAAA,YACA,SAAS;AAAA,cACP,IAAI,OAAO;AAAA,cACX,SAAS,OAAO;AAAA,cAChB,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,qBAAa,KAAK;AAAA,UAChB,aAAa,OAAO;AAAA,UACpB,SAAS,MAAM,KAAK,EAAE,QAAQ,QAAQ,SAAS,MAAM,KAAK,UAAU,OAAO,EAAE,CAAC;AAAA,QAChF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,QAAQ,WAAW,aAAa,IAAI,CAACC,OAAMA,GAAE,OAAO,CAAC;AAE3E,SAAO,QAAQ,IAAI,CAAC,QAAQ,MAAM;AAChC,UAAM,MAAM,aAAa,CAAC,EAAE;AAC5B,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,MAAM,OAAO;AACnB,UAAI,CAAC,IAAI,IAAI;AACX,eAAO,qBAAqB,GAAG,iBAAY,IAAI,MAAM;AAAA,MACvD;AACA,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AACA,WAAO,qBAAqB,GAAG,YAAO,OAAO,kBAAkB,QAAQ,OAAO,OAAO,UAAU,OAAO,OAAO,MAAM,CAAC;AAAA,EACtH,CAAC;AACH;;;ACrPO,IAAM,yBAAyB,CAAC,YAAwC;AAC7E,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC,eAAe,EAAE;AAE1C,aAAW,UAAU,SAAS;AAC5B,UAAM,KAAK,WAAW,OAAO,KAAK,IAAI,gBAAgB,OAAO,OAAO,IAAI;AAExE,QAAI,OAAO,iBAAiB,OAAO,cAAc,SAAS,GAAG;AAC3D,iBAAW,MAAM,OAAO,eAAe;AACrC,cAAM,YAAY,GAAG,iBAAiB,SAAS,IAAI,GAAG,iBAAiB,IAAI,CAACC,OAAMA,GAAE,EAAE,EAAE,KAAK,IAAI,IAAI;AACrG,cAAM;AAAA,UACJ,4BAA4B,GAAG,eAAe,UAAU,KAAK,GAAG,eAAe,IAAI,uBAAkB,SAAS;AAAA,QAChH;AAAA,MACF;AAAA,IACF,WAAW,OAAO,sBAAsB,OAAO,mBAAmB,SAAS,GAAG;AAC5E,iBAAW,MAAM,OAAO,oBAAoB;AAC1C,cAAM,YAAY,GAAG,iBAAiB,SAAS,IAAI,GAAG,iBAAiB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,IAAI;AACrG,cAAM,KAAK,SAAS,GAAG,eAAe,UAAU,KAAK,GAAG,eAAe,IAAI,mBAAmB,SAAS,EAAE;AAAA,MAC3G;AAAA,IACF,OAAO;AACL,iBAAW,UAAU,OAAO,gBAAgB;AAC1C,cAAM,SAAS,OAAO,eAAe,UAAU,MAAM;AACrD,cAAM,OAAO,cAAc,OAAO,SAAS,OAAO,UAAU;AAC5D,cAAM,KAAK,OAAO,MAAM,IAAI,OAAO,SAAS,OAAO,IAAI,IAAI,OAAO,UAAU,EAAE;AAAA,MAChF;AAAA,IACF;AAEA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,IAAM,sBAAsB,CAAC,aAAsE;AACxG,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,QAAkB,CAAC;AAEzB,aAAW,KAAK,UAAU;AACxB,UAAM,KAAK,WAAW,EAAE,QAAQ,EAAE;AAClC,eAAW,OAAO,EAAE,UAAU;AAC5B,YAAM,KAAK,KAAK,GAAG,EAAE;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACpDA,OAAOC,WAAU;AACjB,SAAS,gBAAgB;AACzB,SAAS,aAAa,UAAAC,eAAc;AACpC,SAAS,cAAc;AACvB,OAAO,YAAY;AACnB,OAAOC,gBAAe;AACtB,SAAS,kCAAkC;AAc3C,IAAM,iBAAiB;AAEvB,IAAM,yBAAyB,CAAC,QAAgB,YAAoB,aAA+B;AACjG,MAAI,CAAC,eAAe,KAAK,MAAM,GAAG;AAChC,UAAM,IAAI,MAAM,yBAAyB,MAAM,GAAG;AAAA,EACpD;AACA,QAAM,SAAS,YAAYC,MAAK,KAAK,OAAO,GAAG,gBAAgB,CAAC;AAChE,WAAS,KAAK,MAAM;AACpB,MAAI;AACF,aAAS,eAAe,MAAM,gBAAgB,MAAM,IAAI,EAAE,KAAK,YAAY,OAAO,OAAO,CAAC;AAAA,EAC5F,QAAQ;AACN,UAAM,IAAI,MAAM,6BAA6B,MAAM,8BAA8B;AAAA,EACnF;AACA,SAAO;AACT;AAEO,IAAM,kBAAkB,OAAO,SAAiE;AACrG,QAAM,MAAMA,MAAK,QAAQ,KAAK,GAAG;AAGjC,SAAO,OAAO,EAAE,MAAMA,MAAK,KAAK,KAAK,MAAM,EAAE,CAAC;AAE9C,QAAM,UAAU,MAAM,2BAA2B;AACjD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gGAAgG;AAAA,EAClH;AAEA,QAAM,aAAa,KAAK,QAAQ;AAEhC,QAAM,WAAqB,CAAC;AAC5B,QAAM,eAAe,CAAC,WAA2B;AAC/C,UAAM,IAAI,YAAYA,MAAK,KAAK,OAAO,GAAG,MAAM,CAAC;AACjD,aAAS,KAAK,CAAC;AACf,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,aAAa,uBAAuB,YAAY,KAAK,QAAQ;AAEnE,UAAM,kBAAkB,aAAa,eAAe;AACpD,UAAM,oBAAoB,aAAa,iBAAiB;AAExD,UAAM,UAAUC,WAAU,UAAU;AACpC,UAAM,aAAa,MAAM,QAAQ,eAAe,EAAE,OAAO,QAAQ,UAAU,IAAI,WAAW,gBAAgB,CAAC;AAE3G,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,QAAQ;AACf,yBAAmB,uBAAuB,KAAK,QAAQ,KAAK,QAAQ;AACpE,YAAM,YAAYA,WAAU,gBAAgB;AAC5C,qBAAe,MAAM,UAAU,eAAe,EAAE,OAAO,UAAU,KAAK,MAAM,IAAI,WAAW,kBAAkB,CAAC;AAAA,IAChH,OAAO;AACL,yBAAmB;AACnB,YAAM,YAAYA,WAAU,GAAG;AAC/B,qBAAe,MAAM,UAAU,eAAe,EAAE,OAAO,WAAW,WAAW,kBAAkB,CAAC;AAAA,IAClG;AAEA,UAAM,OAAO,MAAM,QAAQ,cAAc,WAAW,UAAU,aAAa,QAAQ;AAEnF,UAAM,SAAS,qBAAqB,GAAG;AAEvC,QAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,aAAO,EAAE,QAAQ,qEAAqE,UAAU,GAAG,UAAU,CAAC,EAAE;AAAA,IAClH;AAEA,UAAM,UAAU,wBAAwB,MAAM,QAAQ,aAAa,UAAU,WAAW,QAAQ;AAGhG,UAAM,oBAAoB,SAAS,YAAY,kBAAkB,OAAO,eAAe,QAAQ;AAG/F,UAAM,kBAAkB,QAAQ,OAAO,CAAC,MAAM;AAC5C,UAAI,EAAE,YAAY,yBAA0B,QAAO;AACnD,UAAI,CAAC,EAAE,sBAAuB,QAAO;AACrC,QAAE,wBAAwB,EAAE,sBAAsB,OAAO,CAAC,QAAQ,IAAI,gBAAgB,SAAS,CAAC;AAChG,aAAO,EAAE,sBAAsB,SAAS;AAAA,IAC1C,CAAC;AAGD,eAAW,UAAU,iBAAiB;AACpC,YAAM,cAAc,OAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AACvE,UAAI,YAAY,SAAS,GAAG;AAC1B,eAAO,SAAS;AAChB,eAAO,eAAe,YACnB,IAAI,CAAC,MAAO,aAAa,KAAK,EAAE,UAAU,eAAe,EAAE,OAAO,IAAI,MAAU,EAChF,OAAO,CAAC,MAAmB,MAAM,MAAS;AAAA,MAC/C;AAAA,IACF;AAGA,UAAM,eAAe,oBAAoB,aAAa,QAAQ;AAC9D,UAAM,gBAAgB,sBAAsB,aAAa,QAAQ;AACjE,UAAM,eAAe,MAAM,yBAAyB,iBAAiB;AAAA,MACnE;AAAA,MACA,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,SAAS;AAAA,MACT,WAAW,KAAK,UAAU;AAAA,MAC1B,uBAAuB,OAAO,eAAe;AAAA,IAC/C,CAAC;AAGD,UAAM,WAAW,gBACd,OAAO,CAAC,MAAM,EAAE,MAAM,EACtB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,MAAM,UAAU,EAAE,gBAAgB,CAAC,EAAE,EAAE;AAEzE,QAAI,KAAK,WAAW,QAAQ;AAC1B,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,QAAQ,KAAK,UAAU;AAAA,QACvB,SAAS;AAAA,QACT,SAAS;AAAA,UACP,gBAAgB,gBAAgB;AAAA,UAChC,UAAU,SAAS;AAAA,UACnB,QAAQ,SAAS,WAAW;AAAA,QAC9B;AAAA,QACA,MAAM,KAAK;AAAA,MACb;AACA,aAAO,EAAE,QAAQ,KAAK,UAAU,YAAY,MAAM,CAAC,GAAG,UAAU,SAAS,SAAS,IAAI,IAAI,GAAG,SAAS;AAAA,IACxG;AAEA,UAAM,cAAc,KAAK,UAAU;AACnC,UAAM,QAAkB,CAAC,+BAA+B,WAAW,YAAY,UAAU,IAAI,EAAE;AAE/F,UAAM,KAAK,uBAAuB,eAAe,CAAC;AAElD,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,GAAG,YAAY;AAAA,IAC5B;AAEA,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,eAAe,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,cAAc,CAAC,EAAE;AAC5E,YAAM,QAAQ,CAAC,GAAG,gBAAgB,MAAM,QAAQ,gBAAgB,WAAW,IAAI,KAAK,GAAG,YAAY;AACnG,UAAI,eAAe,EAAG,OAAM,KAAK,GAAG,YAAY,WAAW,iBAAiB,IAAI,KAAK,GAAG,OAAO;AAC/F,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG;AAAA,IACnC;AAGA,UAAM,gBAAgB,oBAAoB,QAAQ;AAClD,QAAI,eAAe;AACjB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,aAAa;AAAA,IAC1B;AAEA,WAAO,EAAE,QAAQ,MAAM,KAAK,IAAI,GAAG,UAAU,SAAS,SAAS,IAAI,IAAI,GAAG,SAAS;AAAA,EACrF,UAAE;AACA,eAAW,KAAK,UAAU;AACxB,MAAAC,QAAO,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAC5C;AAAA,EACF;AACF;;;AX/JA,IAAI,UAAU;AACd,IAAI;AACF,QAAM,kBAAkBC,SAAQ,WAAW,oBAAoB;AAC/D,QAAM,cAAc,KAAK,MAAMC,cAAa,iBAAiB,OAAO,CAAC;AACrE,YAAU,YAAY;AACxB,QAAQ;AAER;AAEA,QACG,KAAK,cAAc,EACnB,YAAY,qCAAqC,EACjD,QAAQ,OAAO,EACf,OAAO,oBAAoB,mEAAmE,GAAG;AAGpG,QACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,OAAO,MAAM;AACZ,MAAI;AACF,UAAM,YAAY,cAAc,GAAG;AACnC,UAAM,SAAS,iBAAiB,SAAS;AACzC,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAChG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,QAAQ,EAChB,YAAY,4DAA4D,EACxE,OAAO,aAAa,kDAAkD,KAAK,EAC3E,OAAO,yBAAyB,wDAAwD,EACxF,OAAO,aAAa,8DAA8D,EAClF,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,aAAa,6DAA6D,KAAK,EACtF,OAAO,YAAY,6CAA6C,KAAK,EACrE,OAAO,gBAAgB,iDAAiD,KAAK,EAC7E,OAAO,uBAAuB,sDAAsD,EACpF,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,MAAM,WAAW,OAAO;AAE9B,QAAI,KAAK,KAAK;AACZ,YAAMC,UAAS,MAAM,cAAc;AAAA,QACjC,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb;AAAA,MACF,CAAC;AACD,cAAQ,IAAIA,OAAM;AAClB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,UAAU;AAClB,cAAQ,MAAM,wCAAwC;AACtD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC,UAAU,KAAK;AAAA,MACf,IAAI,KAAK;AAAA,MACT,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,2DAA2D,EACvE,OAAO,WAAW,uBAAuB,KAAK,EAC9C,OAAO,aAAa,qCAAqC,KAAK,EAC9D,OAAO,UAAU,yEAAyE,KAAK,EAC/F,OAAO,aAAa,oCAAoC,EACxD,OAAO,OAAO,OAAiB,SAAS;AACvC,MAAI;AACF,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,MAAM,WAAW,OAAO;AAE9B,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,OAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,MAClC,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,QAAQ,CAAC,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,0CAA0C;AAEnG,SACG,QAAQ,QAAQ,EAChB,YAAY,8CAA8C,EAC1D,OAAO,mBAAmB,+CAA+C,EACzE,OAAO,uBAAuB,wCAAwC,EACtE,OAAO,YAAY,kDAAkD,KAAK,EAC1E,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,SAAS,MAAM,eAAe,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,QAAQ,KAAK,QAAQ,IAAI,CAAC;AACxG,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,sBAAsB,EAC9B,YAAY,yDAAyD,EACrE,OAAO,qBAAqB,+BAA+B,MAAM,EACjE,OAAO,OAAO,OAAe,OAAe,SAAS;AACpD,MAAI;AACF,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,SAAS,MAAM,aAAa,EAAE,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC5E,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,OAAO,qBAAqB,+BAA+B,MAAM,EACjE,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,SAAS,MAAM,aAAa,EAAE,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC9D,YAAQ,IAAI,MAAM;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,aAAa,QAAQ,QAAQ,YAAY,EAAE,YAAY,8CAA8C;AAE3G,WACG,QAAQ,OAAO,EACf,YAAY,qEAAqE,EACjF,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,qBAAqB,+DAA+D,EAC3F,OAAO,qBAAqB,+BAA+B,MAAM,EACjE,OAAO,qBAAqB,uEAAuE,EACnG,OAAO,OAAO,SAAS;AACtB,MAAI;AACF,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,MAAM,WAAW,OAAO;AAC9B,UAAM,SAAS,MAAM,gBAAgB;AAAA,MACnC,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,OAAO,MAAM;AACzB,YAAQ,WAAW,OAAO;AAAA,EAC5B,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,QAAQ,UAAU,sBAAsB,EAAE,OAAO,OAAO,cAAsB,SAAmB;AAC/F,MAAI;AACF,UAAM,UAAU,QAAQ,KAAK;AAC7B,UAAM,MAAM,QAAQ,OAAO;AAC3B,UAAM,SAAS,MAAM,gBAAgB,KAAK,cAAc,IAAI;AAC5D,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7C,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAED,QAAQ,MAAM,QAAQ,IAAI;AAG1B,IAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,UAAQ,WAAW;AACrB;","names":["readFileSync","resolve","createSDK","createSDK","version","dsl","existsSync","writeFileSync","resolve","createSDK","program","path","version","resolve","writeFileSync","existsSync","createSDK","resolve","createSDK","version","path","createSDK","c","snapshot","version","randomUUID","snapshot","randomUUID","c","c","path","rmSync","createSDK","path","createSDK","rmSync","resolve","readFileSync","result"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventcatalog/cli",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "CLI for EventCatalog",
|
|
5
5
|
"bin": {
|
|
6
6
|
"eventcatalog": "./dist/cli/index.js"
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"open": "^11.0.0",
|
|
33
33
|
"semver": "^7.7.2",
|
|
34
34
|
"@eventcatalog/breaking-changes": "0.2.0",
|
|
35
|
-
"@eventcatalog/language-server": "0.8.
|
|
36
|
-
"@eventcatalog/sdk": "2.
|
|
35
|
+
"@eventcatalog/language-server": "0.8.14",
|
|
36
|
+
"@eventcatalog/sdk": "2.21.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/js-yaml": "^4.0.9",
|