@eventcatalog/linter 1.0.23 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/common.ts","../src/schemas/domain.ts","../src/schemas/service.ts","../src/schemas/message.ts","../src/schemas/channel.ts","../src/schemas/flow.ts","../src/schemas/entity.ts","../src/schemas/user.ts","../src/schemas/team.ts","../src/schemas/data-store.ts","../src/schemas/index.ts","../src/scanner/index.ts","../src/parser/index.ts","../src/validators/schema-validator.ts","../src/validators/reference-validator.ts","../src/validators/best-practices-validator.ts","../src/validators/index.ts","../src/reporters/index.ts","../src/config/index.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const badgeSchema = z.object({\n content: z.string(),\n backgroundColor: z.string(),\n textColor: z.string(),\n icon: z.string().optional(),\n});\n\nexport const ownerReferenceSchema = z\n .union([\n // The ID of the user or team\n z.string(),\n // The full object with the ID and collection (keep compatibility with `reference`)\n z.object({\n id: z.string(),\n collection: z.enum(['users', 'teams']),\n }),\n ])\n .transform(\n // This transformation is needed to keep compatibility with `reference`.\n // The utilities `getTeams` and `getUsers` rely on this transformation.\n (lookup) => ({ id: typeof lookup === 'string' ? lookup : lookup.id })\n );\n\nexport const specificationSchema = z.union([\n z.object({\n openapiPath: z.string().optional(),\n asyncapiPath: z.string().optional(),\n }),\n z.array(\n z.object({\n type: z.enum(['openapi', 'asyncapi']),\n path: z.string(),\n name: z.string().optional(),\n })\n ),\n]);\n\nexport const repositorySchema = z.object({\n language: z.string().optional(),\n url: z.string().optional(),\n});\n\nexport const draftSchema = z.union([\n z.boolean(),\n z.object({\n title: z.string().optional(),\n message: z.string(),\n }),\n]);\n\nexport const deprecatedSchema = z.union([\n z.object({\n message: z.string().optional(),\n date: z.union([z.string(), z.date()]).optional(),\n }),\n z.boolean().optional(),\n]);\n\nexport const pointerSchema = z.object({\n id: z.string(),\n version: z.string().optional().default('latest'),\n});\n\nexport const resourcePointerSchema = z.object({\n id: z.string(),\n version: z.string().optional().default('latest'),\n type: z.enum(['service', 'event', 'command', 'query', 'flow', 'channel', 'domain', 'user', 'team']),\n});\n\nexport const channelPointerSchema = z\n .object({\n parameters: z.record(z.string()).optional(),\n })\n .merge(pointerSchema);\n\nexport const resourceReferenceSchema = pointerSchema;\n\nexport const semverSchema = z.string().refine((version) => {\n // Allow common patterns used in EventCatalog\n if (version === 'latest') return true;\n\n // Allow x patterns like 0.0.x, 1.x, 2.1.x but not x.x.x\n if (version.includes('.x')) {\n const xPattern = /^\\d+(\\.\\d+)*\\.x$/;\n return xPattern.test(version);\n }\n\n // Allow semver ranges like ^1.0.0, ~1.2.0\n if (version.startsWith('^') || version.startsWith('~')) {\n const rangeVersion = version.substring(1);\n const semverRegex = /^\\d+\\.\\d+\\.\\d+(-[\\w\\d-.]+)?(\\+[\\w\\d-.]+)?$/;\n return semverRegex.test(rangeVersion);\n }\n\n // For strict semver, use a regex that matches the semver spec\n const semverRegex = /^\\d+\\.\\d+\\.\\d+(-[\\w\\d-.]+)?(\\+[\\w\\d-.]+)?$/;\n return semverRegex.test(version);\n}, 'Invalid semantic version format');\n\nexport const sidebarSchema = z\n .object({\n label: z.string().optional(),\n badge: z.string().optional(),\n })\n .optional();\n\nexport const stylesSchema = z\n .object({\n icon: z.string().optional(),\n node: z\n .object({\n color: z.string().optional(),\n label: z.string().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const resourceGroupSchema = z\n .array(\n z.object({\n id: z.string().optional(),\n title: z.string().optional(),\n items: z.array(resourcePointerSchema),\n limit: z.number().optional().default(10),\n sidebar: z.boolean().optional().default(true),\n })\n )\n .optional();\n\nexport const catalogMetadataSchema = z\n .object({\n path: z.string(),\n filePath: z.string(),\n astroContentFilePath: z.string(),\n publicPath: z.string(),\n type: z.string(),\n })\n .optional();\n\nexport const baseSchema = z.object({\n id: z.string(),\n name: z.string(),\n summary: z.string().optional(),\n version: semverSchema,\n draft: z.union([z.boolean(), z.object({ title: z.string().optional(), message: z.string() })]).optional(),\n badges: z.array(badgeSchema).optional(),\n owners: z.array(ownerReferenceSchema).optional(),\n schemaPath: z.string().optional(),\n sidebar: sidebarSchema,\n repository: repositorySchema.optional(),\n specifications: specificationSchema.optional(),\n hidden: z.boolean().optional(),\n resourceGroups: resourceGroupSchema,\n styles: stylesSchema,\n deprecated: deprecatedSchema.optional(),\n visualiser: z.boolean().optional(),\n versions: z.array(z.string()).optional(),\n latestVersion: z.string().optional(),\n catalog: catalogMetadataSchema,\n});\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nexport const domainSchema = z\n .object({\n services: z.array(pointerSchema).optional(),\n domains: z.array(pointerSchema).optional(),\n entities: z.array(pointerSchema).optional(),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nexport const serviceSchema = z\n .object({\n sends: z.array(pointerSchema).optional(),\n receives: z.array(pointerSchema).optional(),\n entities: z.array(pointerSchema).optional(),\n writesTo: z.array(pointerSchema).optional(),\n readsFrom: z.array(pointerSchema).optional(),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema, channelPointerSchema } from './common';\n\nconst baseMessageSchema = z\n .object({\n producers: z.array(z.any()).optional(), // reference('services')\n consumers: z.array(z.any()).optional(), // reference('services')\n channels: z.array(channelPointerSchema).optional(),\n messageChannels: z.array(z.any()).optional(), // reference('channels')\n })\n .merge(baseSchema);\n\nexport const eventSchema = baseMessageSchema;\nexport const commandSchema = baseMessageSchema;\nexport const querySchema = baseMessageSchema;\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nconst parameterSchema = z.object({\n enum: z.array(z.string()).optional(),\n default: z.string().optional(),\n examples: z.array(z.string()).optional(),\n description: z.string().optional(),\n});\n\nexport const channelSchema = z\n .object({\n address: z.string().optional(),\n protocols: z.array(z.string()).optional(),\n parameters: z.record(parameterSchema).optional(),\n messages: z.array(z.object({ collection: z.string(), name: z.string(), ...pointerSchema.shape })).optional(),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nconst flowStep = z\n .union([\n z.union([z.string(), z.number()]),\n z\n .object({\n id: z.union([z.string(), z.number()]),\n label: z.string().optional(),\n })\n .optional(),\n ])\n .optional();\n\nconst flowStepSchema = z\n .object({\n id: z.union([z.string(), z.number()]),\n type: z.enum(['node', 'message', 'user', 'actor']).optional(),\n title: z.string(),\n summary: z.string().optional(),\n message: pointerSchema.optional(),\n service: pointerSchema.optional(),\n flow: pointerSchema.optional(),\n actor: z\n .object({\n name: z.string(),\n })\n .optional(),\n custom: z\n .object({\n title: z.string(),\n icon: z.string().optional(),\n type: z.string().optional(),\n summary: z.string().optional(),\n url: z.string().url().optional(),\n color: z.string().optional(),\n properties: z.record(z.union([z.string(), z.number()])).optional(),\n height: z.number().optional(),\n menu: z\n .array(\n z.object({\n label: z.string(),\n url: z.string().url().optional(),\n })\n )\n .optional(),\n })\n .optional(),\n externalSystem: z\n .object({\n name: z.string(),\n summary: z.string().optional(),\n url: z.string().url().optional(),\n })\n .optional(),\n next_step: flowStep,\n next_steps: z.array(flowStep).optional(),\n })\n .refine((data) => {\n if (data.next_step && data.next_steps) return false;\n const typesUsed = [data.message, data.service, data.flow, data.actor, data.custom].filter((v) => v).length;\n return typesUsed === 0 || typesUsed === 1;\n });\n\nexport const flowSchema = z\n .object({\n steps: z.array(flowStepSchema),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema } from './common';\n\nconst propertySchema = z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n references: z.string().optional(),\n referencesIdentifier: z.string().optional(),\n relationType: z.string().optional(),\n});\n\nexport const entitySchema = z\n .object({\n aggregateRoot: z.boolean().optional(),\n identifier: z.string().optional(),\n properties: z.array(propertySchema).optional(),\n services: z.array(z.any()).optional(), // reference('services')\n domains: z.array(z.any()).optional(), // reference('domains')\n })\n .merge(baseSchema);\n","import { z } from 'zod';\n\nexport const userSchema = z.object({\n id: z.string(),\n name: z.string(),\n avatarUrl: z.string().optional(),\n role: z.string().optional(),\n hidden: z.boolean().optional(),\n email: z.string().email().optional(),\n slackDirectMessageUrl: z.string().optional(),\n msTeamsDirectMessageUrl: z.string().optional(),\n ownedDomains: z.array(z.any()).optional(), // reference('domains')\n ownedServices: z.array(z.any()).optional(), // reference('services')\n ownedEvents: z.array(z.any()).optional(), // reference('events')\n ownedCommands: z.array(z.any()).optional(), // reference('commands')\n ownedQueries: z.array(z.any()).optional(), // reference('queries')\n associatedTeams: z.array(z.any()).optional(), // reference('teams')\n});\n","import { z } from 'zod';\n\nexport const teamSchema = z.object({\n id: z.string(),\n name: z.string(),\n summary: z.string().optional(),\n email: z.string().email().optional(),\n hidden: z.boolean().optional(),\n slackDirectMessageUrl: z.string().optional(),\n msTeamsDirectMessageUrl: z.string().optional(),\n members: z.array(z.any()).optional(), // reference('users')\n ownedCommands: z.array(z.any()).optional(), // reference('commands')\n ownedQueries: z.array(z.any()).optional(), // reference('queries')\n ownedDomains: z.array(z.any()).optional(), // reference('domains')\n ownedServices: z.array(z.any()).optional(), // reference('services')\n ownedEvents: z.array(z.any()).optional(), // reference('events')\n});\n","import { z } from 'zod';\nimport { baseSchema } from './common';\n\nexport const dataStoreSchema = z\n .object({\n container_type: z.enum(['database', 'cache', 'objectStore', 'searchIndex', 'dataWarehouse', 'dataLake', 'externalSaaS']),\n technology: z.string().optional(),\n authoritative: z.boolean().optional(),\n access_mode: z.enum(['read', 'write', 'readWrite', 'appendOnly']),\n classification: z.enum(['public', 'internal', 'confidential', 'regulated']),\n residency: z.string().optional(),\n retention: z.string().optional(),\n })\n .merge(baseSchema);\n","export * from './common';\nexport * from './domain';\nexport * from './service';\nexport * from './message';\nexport * from './channel';\nexport * from './flow';\nexport * from './entity';\nexport * from './user';\nexport * from './team';\nexport * from './data-store';\n\nimport { domainSchema } from './domain';\nimport { serviceSchema } from './service';\nimport { eventSchema, commandSchema, querySchema } from './message';\nimport { channelSchema } from './channel';\nimport { flowSchema } from './flow';\nimport { entitySchema } from './entity';\nimport { userSchema } from './user';\nimport { teamSchema } from './team';\nimport { dataStoreSchema } from './data-store';\n\nexport const schemas = {\n domain: domainSchema,\n service: serviceSchema,\n event: eventSchema,\n command: commandSchema,\n query: querySchema,\n channel: channelSchema,\n flow: flowSchema,\n entity: entitySchema,\n user: userSchema,\n team: teamSchema,\n dataStore: dataStoreSchema,\n} as const;\n\nexport type ResourceType = keyof typeof schemas;\n","import fg from 'fast-glob';\nimport path from 'path';\nimport { ResourceType } from '../schemas';\n\nexport interface CatalogFile {\n path: string;\n relativePath: string;\n resourceType: ResourceType;\n resourceId: string;\n version?: string;\n}\n\nconst RESOURCE_PATTERNS: Record<ResourceType, string[]> = {\n domain: [\n 'domains/*/index.{md,mdx}',\n 'domains/*/versioned/*/index.{md,mdx}',\n 'domains/*/subdomains/*/index.{md,mdx}',\n 'domains/*/subdomains/*/versioned/*/index.{md,mdx}',\n ],\n service: [\n 'domains/*/services/*/index.{md,mdx}',\n 'domains/*/services/*/versioned/*/index.{md,mdx}',\n 'domains/*/subdomains/*/services/*/index.{md,mdx}',\n 'domains/*/subdomains/*/services/*/versioned/*/index.{md,mdx}',\n 'services/*/index.{md,mdx}',\n 'services/*/versioned/*/index.{md,mdx}',\n ],\n event: ['**/events/*/index.{md,mdx}', '**/events/*/versioned/*/index.{md,mdx}'],\n command: ['**/commands/*/index.{md,mdx}', '**/commands/*/versioned/*/index.{md,mdx}'],\n query: ['**/queries/*/index.{md,mdx}', '**/queries/*/versioned/*/index.{md,mdx}'],\n channel: ['**/channels/*/index.{md,mdx}', '**/channels/*/versioned/*/index.{md,mdx}'],\n flow: ['**/flows/*/index.{md,mdx}', '**/flows/*/versioned/*/index.{md,mdx}'],\n entity: ['**/entities/*/index.{md,mdx}', '**/entities/*/versioned/*/index.{md,mdx}'],\n user: ['users/*.{md,mdx}'],\n team: ['teams/*.{md,mdx}'],\n dataStore: ['**/containers/*/index.{md,mdx}', '**/containers/*/versioned/*/index.{md,mdx}'],\n};\n\nexport const extractResourceInfo = (filePath: string, resourceType: ResourceType): { id: string; version?: string } => {\n // Normalize path separators to forward slashes for consistent parsing across platforms\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n const relativePath = normalizedPath.split('/');\n\n if (resourceType === 'user' || resourceType === 'team') {\n const filename = path.basename(filePath, path.extname(filePath));\n return { id: filename };\n }\n\n // Find the resource type directory in the path\n const resourceTypePattern = `${resourceType}s`;\n const resourceTypeIndex = relativePath.findIndex((part) => part === resourceTypePattern);\n\n if (resourceTypeIndex === -1) {\n // Fallback to original logic if pattern not found\n const parts = relativePath.slice(1, -1);\n return { id: parts[parts.length - 1] };\n }\n\n // Extract parts after the resource type directory, excluding index.mdx\n const parts = relativePath.slice(resourceTypeIndex + 1, -1);\n\n if (parts.length === 0) {\n return { id: 'unknown' };\n }\n\n // Check for versioned structure: resourceId/versioned/version/index.mdx\n if (parts.length >= 3 && parts[parts.length - 2] === 'versioned') {\n const version = parts[parts.length - 1];\n const resourceId = parts.slice(0, -2).join('/');\n return { id: resourceId, version };\n }\n\n // Check for domain versioned structure: domains/domainId/versioned/version/index.mdx\n if (resourceType === 'domain' && parts.length >= 2) {\n const versionedIndex = parts.findIndex((part) => part === 'versioned');\n if (versionedIndex !== -1 && versionedIndex < parts.length - 1) {\n const version = parts[versionedIndex + 1];\n const resourceId = parts.slice(0, versionedIndex).join('/');\n return { id: resourceId, version };\n }\n }\n\n // Standard structure: resourceId/index.mdx\n if (parts.length === 1) {\n return { id: parts[0] };\n }\n\n // Handle subdomain structure or nested resources\n return { id: parts.join('/') };\n};\n\nexport const scanCatalogFiles = async (rootDir: string): Promise<CatalogFile[]> => {\n const files: CatalogFile[] = [];\n\n for (const [resourceType, patterns] of Object.entries(RESOURCE_PATTERNS)) {\n const foundFiles = await fg(patterns, {\n cwd: rootDir,\n absolute: true,\n onlyFiles: true,\n followSymbolicLinks: false,\n });\n\n for (const filePath of foundFiles) {\n const relativePath = path.relative(rootDir, filePath);\n const { id, version } = extractResourceInfo(relativePath, resourceType as ResourceType);\n\n files.push({\n path: filePath,\n relativePath,\n resourceType: resourceType as ResourceType,\n resourceId: id,\n version,\n });\n }\n }\n\n return files;\n};\n","import fs from 'fs/promises';\nimport matter from 'gray-matter';\nimport { CatalogFile } from '../scanner';\n\nexport interface ParsedFile {\n file: CatalogFile;\n frontmatter: Record<string, unknown>;\n content: string;\n raw: string;\n}\n\nexport interface ParseError {\n file: CatalogFile;\n error: Error;\n}\n\nexport const parseFrontmatter = async (file: CatalogFile): Promise<ParsedFile | ParseError> => {\n try {\n const fileContent = await fs.readFile(file.path, 'utf-8');\n const { data, content } = matter(fileContent);\n\n return {\n file,\n frontmatter: data,\n content,\n raw: fileContent,\n };\n } catch (error) {\n return {\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n};\n\nexport const parseAllFiles = async (\n files: CatalogFile[]\n): Promise<{\n parsed: ParsedFile[];\n errors: ParseError[];\n}> => {\n const results = await Promise.all(files.map(parseFrontmatter));\n\n const parsed: ParsedFile[] = [];\n const errors: ParseError[] = [];\n\n for (const result of results) {\n if ('error' in result) {\n errors.push(result);\n } else {\n parsed.push(result);\n }\n }\n\n return { parsed, errors };\n};\n","import { z } from 'zod';\nimport { schemas } from '../schemas';\nimport { ParsedFile } from '../parser';\nimport { ValidationError } from '../types';\n\nexport const validateSchema = (parsedFile: ParsedFile): ValidationError[] => {\n const { file, frontmatter } = parsedFile;\n const schema = schemas[file.resourceType];\n const errors: ValidationError[] = [];\n\n try {\n schema.parse(frontmatter);\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.issues) {\n const field = issue.path.join('.');\n let message = issue.message;\n\n if (issue.code === 'invalid_type') {\n message = `Expected ${issue.expected}, but received ${issue.received}`;\n }\n\n let rule = 'schema/required-fields';\n if (issue.code === 'invalid_type') {\n rule = 'schema/valid-type';\n } else if (issue.code === 'invalid_string' && issue.validation === 'email') {\n rule = 'schema/valid-email';\n } else if (field && field.includes('version')) {\n rule = 'schema/valid-semver';\n }\n\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: field || undefined,\n message: field ? `${field}: ${message}` : message,\n file: file.relativePath,\n rule,\n });\n }\n } else {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n message: error instanceof Error ? error.message : String(error),\n file: file.relativePath,\n rule: 'schema/validation-error',\n });\n }\n }\n\n return errors;\n};\n\nexport const validateAllSchemas = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n for (const parsedFile of parsedFiles) {\n errors.push(...validateSchema(parsedFile));\n }\n\n return errors;\n};\n","import { ParsedFile } from '../parser';\nimport { ValidationError, ResourceReference } from '../types';\nimport { ResourceType } from '../schemas';\nimport { CatalogDependencies } from '../config';\nimport semver from 'semver';\n\ninterface ResourceIndex {\n [resourceType: string]: {\n [resourceId: string]: Set<string>;\n };\n}\n\nexport const buildResourceIndex = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ResourceIndex => {\n const index: ResourceIndex = {};\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n const { resourceType } = file;\n\n // Use the frontmatter id field if present, otherwise fall back to filename/directory\n // This handles cases where:\n // - Filename is \"aSmith.mdx\" but frontmatter has id: \"asmith\"\n // - Directory is \"e-commerce\" but frontmatter has id: \"E-Commerce\"\n // - Directory is \"UserService\" but frontmatter has id: \"user-service\" (SentenceCase vs kebab-case)\n let resourceId = file.resourceId;\n if (frontmatter.id && typeof frontmatter.id === 'string') {\n resourceId = frontmatter.id;\n }\n\n if (!index[resourceType]) {\n index[resourceType] = {};\n }\n\n if (!index[resourceType][resourceId]) {\n index[resourceType][resourceId] = new Set();\n }\n\n if (frontmatter.version && typeof frontmatter.version === 'string') {\n index[resourceType][resourceId].add(frontmatter.version);\n } else {\n index[resourceType][resourceId].add('latest');\n }\n }\n\n // Add dependency entries to the index\n if (dependencies) {\n for (const [resourceType, entries] of Object.entries(dependencies)) {\n if (!index[resourceType]) {\n index[resourceType] = {};\n }\n for (const entry of entries) {\n if (!index[resourceType][entry.id]) {\n index[resourceType][entry.id] = new Set();\n }\n index[resourceType][entry.id].add(entry.version || 'latest');\n }\n }\n }\n\n return index;\n};\n\nconst checkResourceExists = (ref: ResourceReference, resourceType: ResourceType, index: ResourceIndex): boolean => {\n const resourceVersions = index[resourceType]?.[ref.id];\n\n if (!resourceVersions || resourceVersions.size === 0) {\n return false;\n }\n\n if (!ref.version) {\n return true;\n }\n\n const refVersion = ref.version === 'latest' ? ref.version : ref.version;\n const availableVersions = Array.from(resourceVersions);\n\n // Handle 'latest' specifically\n if (refVersion === 'latest') {\n return availableVersions.includes('latest') || availableVersions.length > 0;\n }\n\n // Check for exact match first\n if (availableVersions.includes(refVersion)) {\n return true;\n }\n\n // Handle semver patterns like '0.0.x', '^1.0.0', '~1.2.0', etc.\n try {\n // Filter out 'latest' from available versions for semver matching\n const semverVersions = availableVersions.filter((v) => v !== 'latest' && semver.valid(v));\n\n // Check if any available version satisfies the requested version pattern\n for (const availableVersion of semverVersions) {\n if (semver.satisfies(availableVersion, refVersion)) {\n return true;\n }\n }\n\n // Special handling for patterns like '0.0.x' which aren't standard semver ranges\n if (refVersion.includes('.x')) {\n const pattern = refVersion.replace(/\\.x/g, '');\n for (const availableVersion of semverVersions) {\n if (availableVersion.startsWith(pattern)) {\n return true;\n }\n }\n }\n\n return false;\n } catch (error) {\n // If semver parsing fails, fall back to exact string match\n return availableVersions.includes(refVersion);\n }\n};\n\ninterface ReferenceInfo {\n ref: ResourceReference;\n possibleTypes: ResourceType[];\n field: string;\n}\n\nconst extractReferences = (parsedFile: ParsedFile): ReferenceInfo[] => {\n const { file, frontmatter } = parsedFile;\n const references: ReferenceInfo[] = [];\n\n if (file.resourceType === 'domain') {\n if (frontmatter.services && Array.isArray(frontmatter.services)) {\n frontmatter.services.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['service'], field: 'services' });\n });\n }\n if (frontmatter.domains && Array.isArray(frontmatter.domains)) {\n frontmatter.domains.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['domain'], field: 'domains' });\n });\n }\n if (frontmatter.entities && Array.isArray(frontmatter.entities)) {\n frontmatter.entities.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['entity'], field: 'entities' });\n });\n }\n }\n\n if (file.resourceType === 'service') {\n if (frontmatter.sends && Array.isArray(frontmatter.sends)) {\n frontmatter.sends.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['event', 'command', 'query'], field: 'sends' });\n });\n }\n if (frontmatter.receives && Array.isArray(frontmatter.receives)) {\n frontmatter.receives.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['event', 'command', 'query'], field: 'receives' });\n });\n }\n if (frontmatter.entities && Array.isArray(frontmatter.entities)) {\n frontmatter.entities.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['entity'], field: 'entities' });\n });\n }\n if (frontmatter.writesTo && Array.isArray(frontmatter.writesTo)) {\n frontmatter.writesTo.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['dataStore'], field: 'writesTo' });\n });\n }\n if (frontmatter.readsFrom && Array.isArray(frontmatter.readsFrom)) {\n frontmatter.readsFrom.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['dataStore'], field: 'readsFrom' });\n });\n }\n }\n\n if (file.resourceType === 'flow' && frontmatter.steps && Array.isArray(frontmatter.steps)) {\n frontmatter.steps.forEach((step: Record<string, unknown>, index: number) => {\n if (step.message) {\n references.push({\n ref: step.message as ResourceReference,\n possibleTypes: ['event', 'command', 'query'],\n field: `steps[${index}].message`,\n });\n }\n if (step.service) {\n references.push({ ref: step.service as ResourceReference, possibleTypes: ['service'], field: `steps[${index}].service` });\n }\n });\n }\n\n if (file.resourceType === 'entity' && frontmatter.properties && Array.isArray(frontmatter.properties)) {\n frontmatter.properties.forEach((prop: Record<string, unknown>, index: number) => {\n if (prop.references) {\n references.push({\n ref: { id: prop.references as string },\n possibleTypes: ['entity'],\n field: `properties[${index}].references`,\n });\n }\n });\n }\n\n if (frontmatter.owners && Array.isArray(frontmatter.owners)) {\n frontmatter.owners.forEach((owner: string) => {\n references.push({ ref: { id: owner }, possibleTypes: ['user', 'team'], field: 'owners' });\n });\n }\n\n if (file.resourceType === 'team' && frontmatter.members && Array.isArray(frontmatter.members)) {\n frontmatter.members.forEach((member: string) => {\n references.push({ ref: { id: member }, possibleTypes: ['user'], field: 'members' });\n });\n }\n\n return references;\n};\n\n// Extract channel references from sends/receives to/from arrays\nconst extractChannelReferences = (parsedFile: ParsedFile): ReferenceInfo[] => {\n const { file, frontmatter } = parsedFile;\n const references: ReferenceInfo[] = [];\n\n if (file.resourceType !== 'service' && file.resourceType !== 'domain') {\n return references;\n }\n\n const extractFromPointers = (pointers: any[], parentField: string) => {\n if (!Array.isArray(pointers)) return;\n pointers.forEach((pointer: any, idx: number) => {\n if (pointer.to && Array.isArray(pointer.to)) {\n pointer.to.forEach((channelRef: any, cIdx: number) => {\n if (channelRef && channelRef.id) {\n references.push({\n ref: { id: channelRef.id, version: channelRef.version },\n possibleTypes: ['channel'],\n field: `${parentField}[${idx}].to[${cIdx}]`,\n });\n }\n });\n }\n if (pointer.from && Array.isArray(pointer.from)) {\n pointer.from.forEach((channelRef: any, cIdx: number) => {\n if (channelRef && channelRef.id) {\n references.push({\n ref: { id: channelRef.id, version: channelRef.version },\n possibleTypes: ['channel'],\n field: `${parentField}[${idx}].from[${cIdx}]`,\n });\n }\n });\n }\n });\n };\n\n if (frontmatter.sends && Array.isArray(frontmatter.sends)) {\n extractFromPointers(frontmatter.sends, 'sends');\n }\n if (frontmatter.receives && Array.isArray(frontmatter.receives)) {\n extractFromPointers(frontmatter.receives, 'receives');\n }\n\n return references;\n};\n\nexport const validateReferences = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ValidationError[] => {\n const index = buildResourceIndex(parsedFiles, dependencies);\n const errors: ValidationError[] = [];\n\n for (const parsedFile of parsedFiles) {\n const references = extractReferences(parsedFile);\n\n for (const { ref, possibleTypes, field } of references) {\n const found = possibleTypes.some((type) => checkResourceExists(ref, type, index));\n\n if (!found) {\n const versionStr = ref.version ? ` (version: ${ref.version})` : '';\n const typeStr = possibleTypes.length === 1 ? possibleTypes[0] : possibleTypes.join('/');\n\n let rule = 'refs/resource-exists';\n if (field === 'owners') {\n rule = 'refs/owner-exists';\n } else if (field === 'writesTo' || field === 'readsFrom') {\n rule = 'refs/container-exists';\n } else if (ref.version) {\n rule = 'refs/valid-version-range';\n }\n\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field,\n message: `Referenced ${typeStr} \"${ref.id}\"${versionStr} does not exist`,\n file: parsedFile.file.relativePath,\n rule,\n });\n }\n }\n\n // Validate channel references from sends/receives to/from\n const channelRefs = extractChannelReferences(parsedFile);\n for (const { ref, possibleTypes, field } of channelRefs) {\n const found = possibleTypes.some((type) => checkResourceExists(ref, type, index));\n\n if (!found) {\n const versionStr = ref.version ? ` (version: ${ref.version})` : '';\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field,\n message: `Referenced channel \"${ref.id}\"${versionStr} does not exist`,\n file: parsedFile.file.relativePath,\n rule: 'refs/channel-exists',\n });\n }\n }\n }\n\n return errors;\n};\n\n// Detect messages (events/commands/queries) with no producer and no consumer\nexport const validateOrphanMessages = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ValidationError[] => {\n const errors: ValidationError[] = [];\n const messageTypes: ResourceType[] = ['event', 'command', 'query'];\n\n // Collect all message IDs\n const messageFiles = parsedFiles.filter((pf) => messageTypes.includes(pf.file.resourceType));\n\n if (messageFiles.length === 0) return errors;\n\n // Build sets of produced and consumed message IDs\n const producedMessages = new Set<string>();\n const consumedMessages = new Set<string>();\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n\n if (file.resourceType === 'service' || file.resourceType === 'domain') {\n if (frontmatter.sends && Array.isArray(frontmatter.sends)) {\n frontmatter.sends.forEach((ref: any) => {\n if (ref && ref.id) producedMessages.add(ref.id);\n });\n }\n if (frontmatter.receives && Array.isArray(frontmatter.receives)) {\n frontmatter.receives.forEach((ref: any) => {\n if (ref && ref.id) consumedMessages.add(ref.id);\n });\n }\n }\n\n // Also check producers/consumers fields on messages themselves\n if (messageTypes.includes(file.resourceType)) {\n if (frontmatter.producers && Array.isArray(frontmatter.producers) && frontmatter.producers.length > 0) {\n const msgId = (frontmatter.id as string) || file.resourceId;\n producedMessages.add(msgId);\n }\n if (frontmatter.consumers && Array.isArray(frontmatter.consumers) && frontmatter.consumers.length > 0) {\n const msgId = (frontmatter.id as string) || file.resourceId;\n consumedMessages.add(msgId);\n }\n }\n }\n\n // Also consider dependency messages as having producers/consumers\n if (dependencies) {\n for (const [type, entries] of Object.entries(dependencies)) {\n if (messageTypes.includes(type as ResourceType)) {\n entries.forEach((entry) => {\n // Dependencies are external, treat them as having both producers and consumers\n producedMessages.add(entry.id);\n consumedMessages.add(entry.id);\n });\n }\n }\n }\n\n // Check each message for orphan status\n for (const parsedFile of messageFiles) {\n const msgId = (parsedFile.frontmatter.id as string) || parsedFile.file.resourceId;\n const isProduced = producedMessages.has(msgId);\n const isConsumed = consumedMessages.has(msgId);\n\n if (!isProduced && !isConsumed) {\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field: 'id',\n message: `${parsedFile.file.resourceType} \"${msgId}\" has no producer and no consumer`,\n file: parsedFile.file.relativePath,\n rule: 'refs/orphan-messages',\n });\n }\n }\n\n return errors;\n};\n\n// Detect references to deprecated resources\nexport const validateDeprecatedReferences = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Build an index of deprecated resources\n const deprecatedIndex: Record<string, Set<string>> = {};\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n if (frontmatter.deprecated && frontmatter.deprecated !== false) {\n const resourceId = (frontmatter.id as string) || file.resourceId;\n const key = `${file.resourceType}:${resourceId}`;\n if (!deprecatedIndex[key]) {\n deprecatedIndex[key] = new Set();\n }\n if (frontmatter.version && typeof frontmatter.version === 'string') {\n deprecatedIndex[key].add(frontmatter.version);\n } else {\n deprecatedIndex[key].add('*'); // All versions deprecated\n }\n }\n }\n\n if (Object.keys(deprecatedIndex).length === 0) return errors;\n\n const isDeprecated = (type: string, id: string, version?: string): boolean => {\n const key = `${type}:${id}`;\n const versions = deprecatedIndex[key];\n if (!versions) return false;\n if (versions.has('*')) return true;\n if (version && versions.has(version)) return true;\n // For 'latest' or no version, check if any version is deprecated\n if (!version || version === 'latest') return versions.size > 0;\n return false;\n };\n\n for (const parsedFile of parsedFiles) {\n const references = extractReferences(parsedFile);\n\n for (const { ref, possibleTypes, field } of references) {\n // Skip owner references for this check\n if (field === 'owners' || field === 'members') continue;\n\n for (const type of possibleTypes) {\n if (isDeprecated(type, ref.id, ref.version)) {\n const versionStr = ref.version ? ` (version: ${ref.version})` : '';\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field,\n message: `Referenced ${type} \"${ref.id}\"${versionStr} is deprecated`,\n file: parsedFile.file.relativePath,\n rule: 'versions/no-deprecated-references',\n });\n break; // Only report once per reference\n }\n }\n }\n }\n\n return errors;\n};\n\n// Detect duplicate resource IDs (same type, same id, same version)\nexport const validateDuplicateResourceIds = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Track seen resources: key = \"type:id:version\", value = file path\n const seen: Record<string, string> = {};\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n const resourceId = (frontmatter.id as string) || file.resourceId;\n const version = (frontmatter.version as string) || 'latest';\n const key = `${file.resourceType}:${resourceId}:${version}`;\n\n if (seen[key]) {\n errors.push({\n type: 'reference',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'id',\n message: `Duplicate ${file.resourceType} \"${resourceId}\" (version: ${version}) — also defined in ${seen[key]}`,\n file: file.relativePath,\n rule: 'structure/duplicate-resource-ids',\n });\n } else {\n seen[key] = file.relativePath;\n }\n }\n\n return errors;\n};\n","import { ParsedFile } from '../parser';\nimport { ValidationError } from '../types';\n\nexport const validateBestPractices = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter, content } = parsedFile;\n\n // Check for required summary\n if (!frontmatter.summary || (typeof frontmatter.summary === 'string' && frontmatter.summary.trim() === '')) {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'summary',\n message: 'Summary is required for better documentation',\n file: file.relativePath,\n severity: 'error',\n rule: 'best-practices/summary-required',\n });\n }\n\n // Check for required owners (skip users and teams - they are owners, not owned)\n if (\n file.resourceType !== 'user' &&\n file.resourceType !== 'team' &&\n (!frontmatter.owners || !Array.isArray(frontmatter.owners) || frontmatter.owners.length === 0)\n ) {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'owners',\n message: 'At least one owner is required',\n file: file.relativePath,\n severity: 'error',\n rule: 'best-practices/owner-required',\n });\n }\n\n // Check for required description (markdown body content)\n if (!content || content.trim() === '') {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'description',\n message: 'Resource should have a markdown description (body content) beyond just frontmatter',\n file: file.relativePath,\n severity: 'warning',\n rule: 'best-practices/description-required',\n });\n }\n\n // Check for required schemaPath on messages (events, commands, queries)\n if (\n (file.resourceType === 'event' || file.resourceType === 'command' || file.resourceType === 'query') &&\n !frontmatter.schemaPath\n ) {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'schemaPath',\n message: `${file.resourceType} should have a schemaPath defined for consumers to understand the contract`,\n file: file.relativePath,\n severity: 'warning',\n rule: 'best-practices/schema-required',\n });\n }\n }\n\n return errors;\n};\n","export * from './schema-validator';\nexport * from './reference-validator';\nexport * from './best-practices-validator';\n\nimport { ParsedFile } from '../parser';\nimport { ValidationError } from '../types';\nimport { CatalogDependencies } from '../config';\nimport { validateAllSchemas } from './schema-validator';\nimport {\n validateReferences,\n validateOrphanMessages,\n validateDeprecatedReferences,\n validateDuplicateResourceIds,\n} from './reference-validator';\nimport { validateBestPractices } from './best-practices-validator';\n\nexport const validateCatalog = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ValidationError[] => {\n const schemaErrors = validateAllSchemas(parsedFiles);\n const referenceErrors = validateReferences(parsedFiles, dependencies);\n const orphanErrors = validateOrphanMessages(parsedFiles, dependencies);\n const deprecatedRefErrors = validateDeprecatedReferences(parsedFiles);\n const duplicateErrors = validateDuplicateResourceIds(parsedFiles);\n const bestPracticeErrors = validateBestPractices(parsedFiles);\n\n return [\n ...schemaErrors,\n ...referenceErrors,\n ...orphanErrors,\n ...deprecatedRefErrors,\n ...duplicateErrors,\n ...bestPracticeErrors,\n ];\n};\n","import chalk from 'chalk';\nimport { ValidationError } from '../types';\nimport { ParseError } from '../parser';\n\nexport interface ReportSummary {\n totalErrors: number;\n totalWarnings: number;\n schemaErrors: number;\n referenceErrors: number;\n parseErrors: number;\n filesChecked: number;\n filesWithErrors: number;\n}\n\nexport const formatError = (error: ValidationError, showFilename: boolean = true): string => {\n const lineInfo = error.line ? chalk.dim(`:${error.line}:1`) : '';\n const filename = showFilename ? `${chalk.dim(error.file)}${lineInfo}` : '';\n\n const isWarning = error.severity === 'warning';\n const severity = isWarning ? chalk.yellow('warning') : chalk.red('error');\n const icon = isWarning ? chalk.yellow('⚠') : chalk.red('✖');\n const errorCode = getErrorCode(error);\n const field = error.field ? chalk.dim(`[${error.field}]`) : '';\n\n const parts = [];\n if (filename) parts.push(filename);\n parts.push(icon, severity, error.message, field, chalk.dim(errorCode));\n\n return parts.filter(Boolean).join(' ');\n};\n\nconst getErrorCode = (error: ValidationError): string => {\n if (error.rule) {\n return `(${error.rule})`;\n }\n\n // Fallback to generic error codes\n if (error.type === 'schema') {\n if (error.field) {\n if (error.message.includes('Required')) return '(@eventcatalog/required-field)';\n if (error.message.includes('Expected')) return '(@eventcatalog/invalid-type)';\n return '(@eventcatalog/schema-validation)';\n }\n return '(@eventcatalog/schema)';\n }\n if (error.type === 'reference') {\n return '(@eventcatalog/invalid-reference)';\n }\n return '(@eventcatalog/unknown)';\n};\n\nexport const formatParseError = (error: ParseError, showFilename: boolean = true): string => {\n const filename = showFilename ? chalk.dim(error.file.relativePath) : '';\n const severity = chalk.red('error');\n const message = `Parse error: ${error.error.message}`;\n const errorCode = chalk.dim('(@eventcatalog/parse-error)');\n\n const parts = [];\n if (filename) parts.push(filename);\n parts.push(chalk.red('✖'), severity, message, errorCode);\n\n return parts.filter(Boolean).join(' ');\n};\n\nexport const groupErrorsByFile = (errors: ValidationError[]): Map<string, ValidationError[]> => {\n const grouped = new Map<string, ValidationError[]>();\n\n for (const error of errors) {\n if (!grouped.has(error.file)) {\n grouped.set(error.file, []);\n }\n grouped.get(error.file)!.push(error);\n }\n\n return grouped;\n};\n\nexport const reportErrors = (\n validationErrors: ValidationError[],\n parseErrors: ParseError[],\n verbose: boolean = false\n): ReportSummary => {\n const allErrors = [\n ...validationErrors,\n ...parseErrors.map((pe) => ({\n type: 'parse' as const,\n resource: pe.file.resourceType || 'unknown',\n message: pe.error.message,\n file: pe.file.relativePath,\n line: undefined,\n })),\n ];\n\n const schemaErrors = validationErrors.filter((e) => e.type === 'schema');\n const referenceErrors = validationErrors.filter((e) => e.type === 'reference');\n const warnings = validationErrors.filter((e) => e.severity === 'warning');\n const errors = [...validationErrors.filter((e) => e.severity !== 'warning'), ...parseErrors];\n const totalErrors = errors.length;\n const totalWarnings = warnings.length;\n\n if (totalErrors === 0 && totalWarnings === 0) {\n console.log(chalk.green('✔ No problems found!'));\n return {\n totalErrors: 0,\n totalWarnings: 0,\n schemaErrors: 0,\n referenceErrors: 0,\n parseErrors: 0,\n filesChecked: 0,\n filesWithErrors: 0,\n };\n }\n\n const grouped = groupErrorsByFile(validationErrors);\n const parseErrorsGrouped = groupParseErrorsByFile(parseErrors);\n const allFiles = new Set([...grouped.keys(), ...parseErrorsGrouped.keys()]);\n\n console.log(); // Empty line\n\n // Report by file for better readability\n for (const file of Array.from(allFiles).sort()) {\n const fileErrors = grouped.get(file) || [];\n const fileParseErrors = parseErrorsGrouped.get(file) || [];\n const fileErrorCount = fileErrors.length + fileParseErrors.length;\n\n if (fileErrorCount === 0) continue;\n\n // File header (ESLint-style)\n console.log(chalk.underline(file));\n\n // Parse errors first\n for (const error of fileParseErrors) {\n console.log(` ${formatParseError(error, false)}`);\n }\n\n // Then validation errors\n for (const error of fileErrors) {\n console.log(` ${formatError(error, false)}`);\n }\n\n // File summary\n const fileWarnings = fileErrors.filter((e) => e.severity === 'warning').length;\n const fileActualErrors = fileErrorCount - fileWarnings;\n const problemText = fileErrorCount === 1 ? 'problem' : 'problems';\n const summaryColor = fileActualErrors > 0 ? chalk.red : chalk.yellow;\n const summaryIcon = fileActualErrors > 0 ? '✖' : '⚠';\n console.log(summaryColor(`\\n${summaryIcon} ${fileErrorCount} ${problemText}\\n`));\n }\n\n // Overall summary (ESLint-style)\n const filesWithErrors = allFiles.size;\n const totalProblems = totalErrors + totalWarnings;\n const problemText = totalProblems === 1 ? 'problem' : 'problems';\n const fileText = filesWithErrors === 1 ? 'file' : 'files';\n\n const summaryColor = totalErrors > 0 ? chalk.red.bold : chalk.yellow.bold;\n const summaryIcon = totalErrors > 0 ? '✖' : '⚠';\n\n console.log(summaryColor(`${summaryIcon} ${totalProblems} ${problemText} (${totalErrors} errors, ${totalWarnings} warnings)`));\n console.log(chalk.dim(` ${filesWithErrors} ${fileText} checked`));\n\n return {\n totalErrors,\n totalWarnings,\n schemaErrors: schemaErrors.length,\n referenceErrors: referenceErrors.length,\n parseErrors: parseErrors.length,\n filesChecked: allFiles.size,\n filesWithErrors,\n };\n};\n\nconst groupParseErrorsByFile = (errors: ParseError[]): Map<string, ParseError[]> => {\n const grouped = new Map<string, ParseError[]>();\n\n for (const error of errors) {\n const file = error.file.relativePath;\n if (!grouped.has(file)) {\n grouped.set(file, []);\n }\n grouped.get(file)!.push(error);\n }\n\n return grouped;\n};\n","import fs from 'fs';\nimport path from 'path';\nimport { ValidationError } from '../types';\n\nexport type RuleSeverity = 'error' | 'warn' | 'off';\n\nexport interface RuleConfig {\n severity: RuleSeverity;\n options?: Record<string, any>;\n}\n\nexport interface ConfigOverride {\n files: string[];\n rules: Record<string, RuleSeverity | [RuleSeverity, Record<string, any>]>;\n}\n\nexport interface LinterConfig {\n rules: Record<string, RuleSeverity | [RuleSeverity, Record<string, any>]>;\n ignorePatterns?: string[];\n overrides?: ConfigOverride[];\n}\n\nexport const DEFAULT_IGNORE_PATTERNS: string[] = ['dependencies/**'];\n\nexport const DEFAULT_RULES: Record<string, RuleSeverity> = {\n 'schema/required-fields': 'error',\n 'schema/valid-semver': 'error',\n 'schema/valid-email': 'error',\n 'refs/owner-exists': 'error',\n 'refs/valid-version-range': 'error',\n 'refs/resource-exists': 'error',\n 'refs/channel-exists': 'error',\n 'refs/container-exists': 'error',\n 'refs/orphan-messages': 'warn',\n 'best-practices/summary-required': 'error',\n 'best-practices/owner-required': 'error',\n 'best-practices/description-required': 'warn',\n 'best-practices/schema-required': 'warn',\n 'naming/service-id-format': 'error',\n 'naming/event-id-format': 'error',\n 'versions/consistent-format': 'error',\n 'versions/no-deprecated': 'error',\n 'versions/no-deprecated-references': 'warn',\n 'structure/duplicate-resource-ids': 'error',\n};\n\nexport interface DependencyEntry {\n id: string;\n version?: string;\n}\n\nexport type CatalogDependencies = Record<string, DependencyEntry[]>;\n\nconst PLURAL_TO_SINGULAR: Record<string, string> = {\n events: 'event',\n commands: 'command',\n queries: 'query',\n services: 'service',\n domains: 'domain',\n entities: 'entity',\n channels: 'channel',\n flows: 'flow',\n users: 'user',\n teams: 'team',\n};\n\nexport const loadEventCatalogConfig = (rootDir: string): CatalogDependencies => {\n const configPath = path.join(rootDir, 'eventcatalog.config.js');\n\n if (!fs.existsSync(configPath)) {\n return {};\n }\n\n try {\n delete require.cache[require.resolve(configPath)];\n const config = require(configPath);\n\n if (!config.dependencies || typeof config.dependencies !== 'object') {\n return {};\n }\n\n const dependencies: CatalogDependencies = {};\n\n for (const [pluralKey, entries] of Object.entries(config.dependencies)) {\n const singularType = PLURAL_TO_SINGULAR[pluralKey];\n if (!singularType || !Array.isArray(entries)) continue;\n\n dependencies[singularType] = (entries as any[])\n .filter((entry) => entry && typeof entry.id === 'string')\n .map((entry) => ({ id: entry.id, version: entry.version }));\n }\n\n return dependencies;\n } catch (error) {\n console.warn(`Warning: Could not load eventcatalog.config.js: ${error instanceof Error ? error.message : String(error)}`);\n return {};\n }\n};\n\nexport const loadConfig = (rootDir: string): LinterConfig => {\n const configPath = path.join(rootDir, '.eventcatalogrc.js');\n\n if (!fs.existsSync(configPath)) {\n // Return default config if no config file exists\n return {\n rules: DEFAULT_RULES,\n ignorePatterns: DEFAULT_IGNORE_PATTERNS,\n overrides: [],\n };\n }\n\n try {\n // Clear module cache to ensure fresh load\n delete require.cache[require.resolve(configPath)];\n const config = require(configPath);\n\n // Merge with defaults\n const mergedConfig: LinterConfig = {\n rules: { ...DEFAULT_RULES, ...config.rules },\n ignorePatterns: [...DEFAULT_IGNORE_PATTERNS, ...(config.ignorePatterns || [])],\n overrides: config.overrides || [],\n };\n\n return mergedConfig;\n } catch (error) {\n console.warn(`Warning: Could not load .eventcatalogrc.js: ${error instanceof Error ? error.message : String(error)}`);\n return {\n rules: DEFAULT_RULES,\n ignorePatterns: DEFAULT_IGNORE_PATTERNS,\n overrides: [],\n };\n }\n};\n\nexport const parseRuleConfig = (rule: RuleSeverity | [RuleSeverity, Record<string, any>]): RuleConfig => {\n if (Array.isArray(rule)) {\n return {\n severity: rule[0],\n options: rule[1],\n };\n }\n return {\n severity: rule,\n options: {},\n };\n};\n\nexport const shouldIgnoreFile = (filePath: string, ignorePatterns: string[]): boolean => {\n if (!ignorePatterns || ignorePatterns.length === 0) {\n return false;\n }\n\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n\n for (const pattern of ignorePatterns) {\n // Simple glob matching for now\n const regex = new RegExp(pattern.replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^/]*'));\n if (regex.test(normalizedPath)) {\n return true;\n }\n }\n\n return false;\n};\n\nexport const getEffectiveRules = (filePath: string, config: LinterConfig): Record<string, RuleConfig> => {\n let effectiveRules = { ...config.rules };\n\n // Apply overrides\n if (config.overrides) {\n for (const override of config.overrides) {\n const matchesFile = override.files.some((pattern) => {\n const regex = new RegExp(pattern.replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^/]*'));\n return regex.test(filePath);\n });\n\n if (matchesFile) {\n effectiveRules = { ...effectiveRules, ...override.rules };\n }\n }\n }\n\n // Parse rules into RuleConfig objects\n const parsedRules: Record<string, RuleConfig> = {};\n for (const [ruleName, ruleValue] of Object.entries(effectiveRules)) {\n parsedRules[ruleName] = parseRuleConfig(ruleValue);\n }\n\n return parsedRules;\n};\n\nexport const applyRuleSeverity = (errors: ValidationError[], rules: Record<string, RuleConfig>): ValidationError[] => {\n const result: ValidationError[] = [];\n\n for (const error of errors) {\n // Map validation errors to rule names\n const ruleName = mapErrorToRuleName(error);\n const rule = rules[ruleName];\n\n if (!rule || rule.severity === 'off') {\n continue; // Skip disabled rules\n }\n\n result.push({\n ...error,\n severity: rule.severity === 'warn' ? ('warning' as const) : ('error' as const),\n });\n }\n\n return result;\n};\n\nconst mapErrorToRuleName = (error: ValidationError): string => {\n // Use explicit rule if set by the validator\n if (error.rule) {\n return error.rule;\n }\n\n // Map validation errors to rule names based on the error type and content\n if (error.type === 'schema') {\n // Check field-specific rules first\n if (error.field === 'summary') {\n return 'best-practices/summary-required';\n }\n if (error.field === 'owners') {\n return 'best-practices/owner-required';\n }\n\n // Check message content for specific validation types\n if (error.message.includes('email') || error.message.includes('Invalid email')) {\n return 'schema/valid-email';\n }\n if (error.message.includes('version') || error.message.includes('semantic')) {\n return 'schema/valid-semver';\n }\n if (error.message.includes('Required') || error.message.includes('Expected')) {\n return 'schema/required-fields';\n }\n\n return 'schema/required-fields';\n }\n\n if (error.type === 'reference') {\n if (error.message.includes('user') || error.message.includes('team')) {\n return 'refs/owner-exists';\n }\n if (error.message.includes('version')) {\n return 'refs/valid-version-range';\n }\n return 'refs/resource-exists';\n }\n\n return 'schema/required-fields';\n};\n"],"mappings":"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","names":["semverRegex","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","parts","z","z","problemText","summaryColor","summaryIcon","fs","path","path","fs"]}
1
+ {"version":3,"sources":["../src/schemas/common.ts","../src/schemas/domain.ts","../src/schemas/service.ts","../src/schemas/message.ts","../src/schemas/channel.ts","../src/schemas/flow.ts","../src/schemas/entity.ts","../src/schemas/user.ts","../src/schemas/team.ts","../src/schemas/data-store.ts","../src/schemas/index.ts","../src/scanner/index.ts","../src/parser/index.ts","../src/validators/schema-validator.ts","../src/validators/reference-validator.ts","../src/validators/best-practices-validator.ts","../src/validators/index.ts","../src/reporters/index.ts","../src/config/index.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const badgeSchema = z.object({\n content: z.string(),\n backgroundColor: z.string(),\n textColor: z.string(),\n icon: z.string().optional(),\n url: z.string().optional(),\n});\n\nexport const ownerReferenceSchema = z\n .union([\n // The ID of the user or team\n z.string(),\n // The full object with the ID and collection (keep compatibility with `reference`)\n z.object({\n id: z.string(),\n collection: z.enum(['users', 'teams']),\n }),\n ])\n .transform(\n // This transformation is needed to keep compatibility with `reference`.\n // The utilities `getTeams` and `getUsers` rely on this transformation.\n (lookup) => ({ id: typeof lookup === 'string' ? lookup : lookup.id })\n );\n\nexport const specificationSchema = z.union([\n z.object({\n openapiPath: z.string().optional(),\n asyncapiPath: z.string().optional(),\n }),\n z.array(\n z.object({\n type: z.enum(['openapi', 'asyncapi']),\n path: z.string(),\n name: z.string().optional(),\n })\n ),\n]);\n\nexport const repositorySchema = z.object({\n language: z.string().optional(),\n url: z.string().optional(),\n});\n\nexport const draftSchema = z.union([\n z.boolean(),\n z.object({\n title: z.string().optional(),\n message: z.string(),\n }),\n]);\n\nexport const deprecatedSchema = z.union([\n z.object({\n message: z.string().optional(),\n date: z.union([z.string(), z.date()]).optional(),\n }),\n z.boolean().optional(),\n]);\n\nexport const pointerSchema = z.object({\n id: z.string(),\n version: z.string().optional().default('latest'),\n});\n\nexport const resourcePointerSchema = z.object({\n id: z.string(),\n version: z.string().optional().default('latest'),\n type: z.enum(['service', 'event', 'command', 'query', 'flow', 'channel', 'domain', 'user', 'team']),\n});\n\nexport const channelPointerSchema = z\n .object({\n parameters: z.record(z.string()).optional(),\n })\n .merge(pointerSchema);\n\nexport const resourceReferenceSchema = pointerSchema;\n\nexport const semverSchema = z.string().refine((version) => {\n // Allow common patterns used in EventCatalog\n if (version === 'latest') return true;\n\n // Allow x patterns like 0.0.x, 1.x, 2.1.x but not x.x.x\n if (version.includes('.x')) {\n const xPattern = /^\\d+(\\.\\d+)*\\.x$/;\n return xPattern.test(version);\n }\n\n // Allow semver ranges like ^1.0.0, ~1.2.0\n if (version.startsWith('^') || version.startsWith('~')) {\n const rangeVersion = version.substring(1);\n const semverRegex = /^\\d+\\.\\d+\\.\\d+(-[\\w\\d-.]+)?(\\+[\\w\\d-.]+)?$/;\n return semverRegex.test(rangeVersion);\n }\n\n // For strict semver, use a regex that matches the semver spec\n const semverRegex = /^\\d+\\.\\d+\\.\\d+(-[\\w\\d-.]+)?(\\+[\\w\\d-.]+)?$/;\n return semverRegex.test(version);\n}, 'Invalid semantic version format');\n\nexport const sidebarSchema = z\n .object({\n label: z.string().optional(),\n badge: z.string().optional(),\n })\n .optional();\n\nexport const stylesSchema = z\n .object({\n icon: z.string().optional(),\n node: z\n .object({\n color: z.string().optional(),\n label: z.string().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const resourceGroupSchema = z\n .array(\n z.object({\n id: z.string().optional(),\n title: z.string().optional(),\n items: z.array(resourcePointerSchema),\n limit: z.number().optional().default(10),\n sidebar: z.boolean().optional().default(true),\n })\n )\n .optional();\n\nexport const catalogMetadataSchema = z\n .object({\n path: z.string(),\n filePath: z.string(),\n astroContentFilePath: z.string(),\n publicPath: z.string(),\n type: z.string(),\n })\n .optional();\n\nexport const baseSchema = z.object({\n id: z.string(),\n name: z.string(),\n summary: z.string().optional(),\n version: semverSchema,\n draft: z.union([z.boolean(), z.object({ title: z.string().optional(), message: z.string() })]).optional(),\n badges: z.array(badgeSchema).optional(),\n owners: z.array(ownerReferenceSchema).optional(),\n schemaPath: z.string().optional(),\n sidebar: sidebarSchema,\n repository: repositorySchema.optional(),\n specifications: specificationSchema.optional(),\n hidden: z.boolean().optional(),\n resourceGroups: resourceGroupSchema,\n styles: stylesSchema,\n deprecated: deprecatedSchema.optional(),\n visualiser: z.boolean().optional(),\n versions: z.array(z.string()).optional(),\n latestVersion: z.string().optional(),\n catalog: catalogMetadataSchema,\n});\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nexport const domainSchema = z\n .object({\n services: z.array(pointerSchema).optional(),\n domains: z.array(pointerSchema).optional(),\n entities: z.array(pointerSchema).optional(),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nexport const serviceSchema = z\n .object({\n sends: z.array(pointerSchema).optional(),\n receives: z.array(pointerSchema).optional(),\n entities: z.array(pointerSchema).optional(),\n writesTo: z.array(pointerSchema).optional(),\n readsFrom: z.array(pointerSchema).optional(),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema, channelPointerSchema } from './common';\n\nconst baseMessageSchema = z\n .object({\n producers: z.array(z.any()).optional(), // reference('services')\n consumers: z.array(z.any()).optional(), // reference('services')\n channels: z.array(channelPointerSchema).optional(),\n messageChannels: z.array(z.any()).optional(), // reference('channels')\n })\n .merge(baseSchema);\n\nexport const eventSchema = baseMessageSchema;\nexport const commandSchema = baseMessageSchema;\nexport const querySchema = baseMessageSchema;\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nconst parameterSchema = z.object({\n enum: z.array(z.string()).optional(),\n default: z.string().optional(),\n examples: z.array(z.string()).optional(),\n description: z.string().optional(),\n});\n\nexport const channelSchema = z\n .object({\n address: z.string().optional(),\n protocols: z.array(z.string()).optional(),\n parameters: z.record(parameterSchema).optional(),\n messages: z.array(z.object({ collection: z.string(), name: z.string(), ...pointerSchema.shape })).optional(),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema, pointerSchema } from './common';\n\nconst flowStep = z\n .union([\n z.union([z.string(), z.number()]),\n z\n .object({\n id: z.union([z.string(), z.number()]),\n label: z.string().optional(),\n })\n .optional(),\n ])\n .optional();\n\nconst flowStepSchema = z\n .object({\n id: z.union([z.string(), z.number()]),\n type: z.enum(['node', 'message', 'user', 'actor']).optional(),\n title: z.string(),\n summary: z.string().optional(),\n message: pointerSchema.optional(),\n service: pointerSchema.optional(),\n flow: pointerSchema.optional(),\n actor: z\n .object({\n name: z.string(),\n })\n .optional(),\n custom: z\n .object({\n title: z.string(),\n icon: z.string().optional(),\n type: z.string().optional(),\n summary: z.string().optional(),\n url: z.string().url().optional(),\n color: z.string().optional(),\n properties: z.record(z.union([z.string(), z.number()])).optional(),\n height: z.number().optional(),\n menu: z\n .array(\n z.object({\n label: z.string(),\n url: z.string().url().optional(),\n })\n )\n .optional(),\n })\n .optional(),\n externalSystem: z\n .object({\n name: z.string(),\n summary: z.string().optional(),\n url: z.string().url().optional(),\n })\n .optional(),\n next_step: flowStep,\n next_steps: z.array(flowStep).optional(),\n })\n .refine((data) => {\n if (data.next_step && data.next_steps) return false;\n const typesUsed = [data.message, data.service, data.flow, data.actor, data.custom].filter((v) => v).length;\n return typesUsed === 0 || typesUsed === 1;\n });\n\nexport const flowSchema = z\n .object({\n steps: z.array(flowStepSchema),\n })\n .merge(baseSchema);\n","import { z } from 'zod';\nimport { baseSchema } from './common';\n\nconst propertySchema = z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n references: z.string().optional(),\n referencesIdentifier: z.string().optional(),\n relationType: z.string().optional(),\n});\n\nexport const entitySchema = z\n .object({\n aggregateRoot: z.boolean().optional(),\n identifier: z.string().optional(),\n properties: z.array(propertySchema).optional(),\n services: z.array(z.any()).optional(), // reference('services')\n domains: z.array(z.any()).optional(), // reference('domains')\n })\n .merge(baseSchema);\n","import { z } from 'zod';\n\nexport const userSchema = z.object({\n id: z.string(),\n name: z.string(),\n avatarUrl: z.string().optional(),\n role: z.string().optional(),\n hidden: z.boolean().optional(),\n email: z.string().email().optional(),\n slackDirectMessageUrl: z.string().optional(),\n msTeamsDirectMessageUrl: z.string().optional(),\n ownedDomains: z.array(z.any()).optional(), // reference('domains')\n ownedServices: z.array(z.any()).optional(), // reference('services')\n ownedEvents: z.array(z.any()).optional(), // reference('events')\n ownedCommands: z.array(z.any()).optional(), // reference('commands')\n ownedQueries: z.array(z.any()).optional(), // reference('queries')\n associatedTeams: z.array(z.any()).optional(), // reference('teams')\n});\n","import { z } from 'zod';\n\nexport const teamSchema = z.object({\n id: z.string(),\n name: z.string(),\n summary: z.string().optional(),\n email: z.string().email().optional(),\n hidden: z.boolean().optional(),\n slackDirectMessageUrl: z.string().optional(),\n msTeamsDirectMessageUrl: z.string().optional(),\n members: z.array(z.any()).optional(), // reference('users')\n ownedCommands: z.array(z.any()).optional(), // reference('commands')\n ownedQueries: z.array(z.any()).optional(), // reference('queries')\n ownedDomains: z.array(z.any()).optional(), // reference('domains')\n ownedServices: z.array(z.any()).optional(), // reference('services')\n ownedEvents: z.array(z.any()).optional(), // reference('events')\n});\n","import { z } from 'zod';\nimport { baseSchema } from './common';\n\nexport const dataStoreSchema = z\n .object({\n container_type: z.enum(['database', 'cache', 'objectStore', 'searchIndex', 'dataWarehouse', 'dataLake', 'externalSaaS']),\n technology: z.string().optional(),\n authoritative: z.boolean().optional(),\n access_mode: z.enum(['read', 'write', 'readWrite', 'appendOnly']),\n classification: z.enum(['public', 'internal', 'confidential', 'regulated']),\n residency: z.string().optional(),\n retention: z.string().optional(),\n })\n .merge(baseSchema);\n","export * from './common';\nexport * from './domain';\nexport * from './service';\nexport * from './message';\nexport * from './channel';\nexport * from './flow';\nexport * from './entity';\nexport * from './user';\nexport * from './team';\nexport * from './data-store';\n\nimport { domainSchema } from './domain';\nimport { serviceSchema } from './service';\nimport { eventSchema, commandSchema, querySchema } from './message';\nimport { channelSchema } from './channel';\nimport { flowSchema } from './flow';\nimport { entitySchema } from './entity';\nimport { userSchema } from './user';\nimport { teamSchema } from './team';\nimport { dataStoreSchema } from './data-store';\n\nexport const schemas = {\n domain: domainSchema,\n service: serviceSchema,\n event: eventSchema,\n command: commandSchema,\n query: querySchema,\n channel: channelSchema,\n flow: flowSchema,\n entity: entitySchema,\n user: userSchema,\n team: teamSchema,\n dataStore: dataStoreSchema,\n} as const;\n\nexport type ResourceType = keyof typeof schemas;\n","import fg from 'fast-glob';\nimport path from 'path';\nimport { ResourceType } from '../schemas';\n\nexport interface CatalogFile {\n path: string;\n relativePath: string;\n resourceType: ResourceType;\n resourceId: string;\n version?: string;\n}\n\nconst RESOURCE_PATTERNS: Record<ResourceType, string[]> = {\n domain: [\n 'domains/*/index.{md,mdx}',\n 'domains/*/versioned/*/index.{md,mdx}',\n 'domains/*/subdomains/*/index.{md,mdx}',\n 'domains/*/subdomains/*/versioned/*/index.{md,mdx}',\n ],\n service: [\n 'domains/*/services/*/index.{md,mdx}',\n 'domains/*/services/*/versioned/*/index.{md,mdx}',\n 'domains/*/subdomains/*/services/*/index.{md,mdx}',\n 'domains/*/subdomains/*/services/*/versioned/*/index.{md,mdx}',\n 'services/*/index.{md,mdx}',\n 'services/*/versioned/*/index.{md,mdx}',\n ],\n event: ['**/events/*/index.{md,mdx}', '**/events/*/versioned/*/index.{md,mdx}'],\n command: ['**/commands/*/index.{md,mdx}', '**/commands/*/versioned/*/index.{md,mdx}'],\n query: ['**/queries/*/index.{md,mdx}', '**/queries/*/versioned/*/index.{md,mdx}'],\n channel: ['**/channels/*/index.{md,mdx}', '**/channels/*/versioned/*/index.{md,mdx}'],\n flow: ['**/flows/*/index.{md,mdx}', '**/flows/*/versioned/*/index.{md,mdx}'],\n entity: ['**/entities/*/index.{md,mdx}', '**/entities/*/versioned/*/index.{md,mdx}'],\n user: ['users/*.{md,mdx}'],\n team: ['teams/*.{md,mdx}'],\n dataStore: ['**/containers/*/index.{md,mdx}', '**/containers/*/versioned/*/index.{md,mdx}'],\n};\n\nexport const extractResourceInfo = (filePath: string, resourceType: ResourceType): { id: string; version?: string } => {\n // Normalize path separators to forward slashes for consistent parsing across platforms\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n const relativePath = normalizedPath.split('/');\n\n if (resourceType === 'user' || resourceType === 'team') {\n const filename = path.basename(filePath, path.extname(filePath));\n return { id: filename };\n }\n\n // Find the resource type directory in the path\n const resourceTypePattern = `${resourceType}s`;\n const resourceTypeIndex = relativePath.findIndex((part) => part === resourceTypePattern);\n\n if (resourceTypeIndex === -1) {\n // Fallback to original logic if pattern not found\n const parts = relativePath.slice(1, -1);\n return { id: parts[parts.length - 1] };\n }\n\n // Extract parts after the resource type directory, excluding index.mdx\n const parts = relativePath.slice(resourceTypeIndex + 1, -1);\n\n if (parts.length === 0) {\n return { id: 'unknown' };\n }\n\n // Check for versioned structure: resourceId/versioned/version/index.mdx\n if (parts.length >= 3 && parts[parts.length - 2] === 'versioned') {\n const version = parts[parts.length - 1];\n const resourceId = parts.slice(0, -2).join('/');\n return { id: resourceId, version };\n }\n\n // Check for domain versioned structure: domains/domainId/versioned/version/index.mdx\n if (resourceType === 'domain' && parts.length >= 2) {\n const versionedIndex = parts.findIndex((part) => part === 'versioned');\n if (versionedIndex !== -1 && versionedIndex < parts.length - 1) {\n const version = parts[versionedIndex + 1];\n const resourceId = parts.slice(0, versionedIndex).join('/');\n return { id: resourceId, version };\n }\n }\n\n // Standard structure: resourceId/index.mdx\n if (parts.length === 1) {\n return { id: parts[0] };\n }\n\n // Handle subdomain structure or nested resources\n return { id: parts.join('/') };\n};\n\nexport const scanCatalogFiles = async (rootDir: string): Promise<CatalogFile[]> => {\n const files: CatalogFile[] = [];\n\n for (const [resourceType, patterns] of Object.entries(RESOURCE_PATTERNS)) {\n const foundFiles = await fg(patterns, {\n cwd: rootDir,\n absolute: true,\n onlyFiles: true,\n followSymbolicLinks: false,\n });\n\n for (const filePath of foundFiles) {\n const relativePath = path.relative(rootDir, filePath);\n const { id, version } = extractResourceInfo(relativePath, resourceType as ResourceType);\n\n files.push({\n path: filePath,\n relativePath,\n resourceType: resourceType as ResourceType,\n resourceId: id,\n version,\n });\n }\n }\n\n return files;\n};\n","import fs from 'fs/promises';\nimport matter from 'gray-matter';\nimport { CatalogFile } from '../scanner';\n\nexport interface ParsedFile {\n file: CatalogFile;\n frontmatter: Record<string, unknown>;\n content: string;\n raw: string;\n}\n\nexport interface ParseError {\n file: CatalogFile;\n error: Error;\n}\n\nexport const parseFrontmatter = async (file: CatalogFile): Promise<ParsedFile | ParseError> => {\n try {\n const fileContent = await fs.readFile(file.path, 'utf-8');\n const { data, content } = matter(fileContent);\n\n return {\n file,\n frontmatter: data,\n content,\n raw: fileContent,\n };\n } catch (error) {\n return {\n file,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n};\n\nexport const parseAllFiles = async (\n files: CatalogFile[]\n): Promise<{\n parsed: ParsedFile[];\n errors: ParseError[];\n}> => {\n const results = await Promise.all(files.map(parseFrontmatter));\n\n const parsed: ParsedFile[] = [];\n const errors: ParseError[] = [];\n\n for (const result of results) {\n if ('error' in result) {\n errors.push(result);\n } else {\n parsed.push(result);\n }\n }\n\n return { parsed, errors };\n};\n","import { z } from 'zod';\nimport { schemas } from '../schemas';\nimport { ParsedFile } from '../parser';\nimport { ValidationError } from '../types';\n\nexport const validateSchema = (parsedFile: ParsedFile): ValidationError[] => {\n const { file, frontmatter } = parsedFile;\n const schema = schemas[file.resourceType];\n const errors: ValidationError[] = [];\n\n try {\n schema.parse(frontmatter);\n } catch (error) {\n if (error instanceof z.ZodError) {\n for (const issue of error.issues) {\n const field = issue.path.join('.');\n let message = issue.message;\n\n if (issue.code === 'invalid_type') {\n message = `Expected ${issue.expected}, but received ${issue.received}`;\n }\n\n let rule = 'schema/required-fields';\n if (issue.code === 'invalid_type') {\n rule = 'schema/valid-type';\n } else if (issue.code === 'invalid_string' && issue.validation === 'email') {\n rule = 'schema/valid-email';\n } else if (field && field.includes('version')) {\n rule = 'schema/valid-semver';\n }\n\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: field || undefined,\n message: field ? `${field}: ${message}` : message,\n file: file.relativePath,\n rule,\n });\n }\n } else {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n message: error instanceof Error ? error.message : String(error),\n file: file.relativePath,\n rule: 'schema/validation-error',\n });\n }\n }\n\n return errors;\n};\n\nexport const validateAllSchemas = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n for (const parsedFile of parsedFiles) {\n errors.push(...validateSchema(parsedFile));\n }\n\n return errors;\n};\n","import { ParsedFile } from '../parser';\nimport { ValidationError, ResourceReference } from '../types';\nimport { ResourceType } from '../schemas';\nimport { CatalogDependencies } from '../config';\nimport semver from 'semver';\n\ninterface ResourceIndex {\n [resourceType: string]: {\n [resourceId: string]: Set<string>;\n };\n}\n\nexport const buildResourceIndex = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ResourceIndex => {\n const index: ResourceIndex = {};\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n const { resourceType } = file;\n\n // Use the frontmatter id field if present, otherwise fall back to filename/directory\n // This handles cases where:\n // - Filename is \"aSmith.mdx\" but frontmatter has id: \"asmith\"\n // - Directory is \"e-commerce\" but frontmatter has id: \"E-Commerce\"\n // - Directory is \"UserService\" but frontmatter has id: \"user-service\" (SentenceCase vs kebab-case)\n let resourceId = file.resourceId;\n if (frontmatter.id && typeof frontmatter.id === 'string') {\n resourceId = frontmatter.id;\n }\n\n if (!index[resourceType]) {\n index[resourceType] = {};\n }\n\n if (!index[resourceType][resourceId]) {\n index[resourceType][resourceId] = new Set();\n }\n\n if (frontmatter.version && typeof frontmatter.version === 'string') {\n index[resourceType][resourceId].add(frontmatter.version);\n } else {\n index[resourceType][resourceId].add('latest');\n }\n }\n\n // Add dependency entries to the index\n if (dependencies) {\n for (const [resourceType, entries] of Object.entries(dependencies)) {\n if (!index[resourceType]) {\n index[resourceType] = {};\n }\n for (const entry of entries) {\n if (!index[resourceType][entry.id]) {\n index[resourceType][entry.id] = new Set();\n }\n index[resourceType][entry.id].add(entry.version || 'latest');\n }\n }\n }\n\n return index;\n};\n\nconst checkResourceExists = (ref: ResourceReference, resourceType: ResourceType, index: ResourceIndex): boolean => {\n const resourceVersions = index[resourceType]?.[ref.id];\n\n if (!resourceVersions || resourceVersions.size === 0) {\n return false;\n }\n\n if (!ref.version) {\n return true;\n }\n\n const refVersion = ref.version === 'latest' ? ref.version : ref.version;\n const availableVersions = Array.from(resourceVersions);\n\n // Handle 'latest' specifically\n if (refVersion === 'latest') {\n return availableVersions.includes('latest') || availableVersions.length > 0;\n }\n\n // Check for exact match first\n if (availableVersions.includes(refVersion)) {\n return true;\n }\n\n // Handle semver patterns like '0.0.x', '^1.0.0', '~1.2.0', etc.\n try {\n // Filter out 'latest' from available versions for semver matching\n const semverVersions = availableVersions.filter((v) => v !== 'latest' && semver.valid(v));\n\n // Check if any available version satisfies the requested version pattern\n for (const availableVersion of semverVersions) {\n if (semver.satisfies(availableVersion, refVersion)) {\n return true;\n }\n }\n\n // Special handling for patterns like '0.0.x' which aren't standard semver ranges\n if (refVersion.includes('.x')) {\n const pattern = refVersion.replace(/\\.x/g, '');\n for (const availableVersion of semverVersions) {\n if (availableVersion.startsWith(pattern)) {\n return true;\n }\n }\n }\n\n return false;\n } catch (error) {\n // If semver parsing fails, fall back to exact string match\n return availableVersions.includes(refVersion);\n }\n};\n\ninterface ReferenceInfo {\n ref: ResourceReference;\n possibleTypes: ResourceType[];\n field: string;\n}\n\nconst extractReferences = (parsedFile: ParsedFile): ReferenceInfo[] => {\n const { file, frontmatter } = parsedFile;\n const references: ReferenceInfo[] = [];\n\n if (file.resourceType === 'domain') {\n if (frontmatter.services && Array.isArray(frontmatter.services)) {\n frontmatter.services.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['service'], field: 'services' });\n });\n }\n if (frontmatter.domains && Array.isArray(frontmatter.domains)) {\n frontmatter.domains.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['domain'], field: 'domains' });\n });\n }\n if (frontmatter.entities && Array.isArray(frontmatter.entities)) {\n frontmatter.entities.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['entity'], field: 'entities' });\n });\n }\n }\n\n if (file.resourceType === 'service') {\n if (frontmatter.sends && Array.isArray(frontmatter.sends)) {\n frontmatter.sends.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['event', 'command', 'query'], field: 'sends' });\n });\n }\n if (frontmatter.receives && Array.isArray(frontmatter.receives)) {\n frontmatter.receives.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['event', 'command', 'query'], field: 'receives' });\n });\n }\n if (frontmatter.entities && Array.isArray(frontmatter.entities)) {\n frontmatter.entities.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['entity'], field: 'entities' });\n });\n }\n if (frontmatter.writesTo && Array.isArray(frontmatter.writesTo)) {\n frontmatter.writesTo.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['dataStore'], field: 'writesTo' });\n });\n }\n if (frontmatter.readsFrom && Array.isArray(frontmatter.readsFrom)) {\n frontmatter.readsFrom.forEach((ref: ResourceReference) => {\n references.push({ ref, possibleTypes: ['dataStore'], field: 'readsFrom' });\n });\n }\n }\n\n if (file.resourceType === 'flow' && frontmatter.steps && Array.isArray(frontmatter.steps)) {\n frontmatter.steps.forEach((step: Record<string, unknown>, index: number) => {\n if (step.message) {\n references.push({\n ref: step.message as ResourceReference,\n possibleTypes: ['event', 'command', 'query'],\n field: `steps[${index}].message`,\n });\n }\n if (step.service) {\n references.push({ ref: step.service as ResourceReference, possibleTypes: ['service'], field: `steps[${index}].service` });\n }\n });\n }\n\n if (file.resourceType === 'entity' && frontmatter.properties && Array.isArray(frontmatter.properties)) {\n frontmatter.properties.forEach((prop: Record<string, unknown>, index: number) => {\n if (prop.references) {\n references.push({\n ref: { id: prop.references as string },\n possibleTypes: ['entity'],\n field: `properties[${index}].references`,\n });\n }\n });\n }\n\n if (frontmatter.owners && Array.isArray(frontmatter.owners)) {\n frontmatter.owners.forEach((owner: string) => {\n references.push({ ref: { id: owner }, possibleTypes: ['user', 'team'], field: 'owners' });\n });\n }\n\n if (file.resourceType === 'team' && frontmatter.members && Array.isArray(frontmatter.members)) {\n frontmatter.members.forEach((member: string) => {\n references.push({ ref: { id: member }, possibleTypes: ['user'], field: 'members' });\n });\n }\n\n return references;\n};\n\n// Extract channel references from sends/receives to/from arrays\nconst extractChannelReferences = (parsedFile: ParsedFile): ReferenceInfo[] => {\n const { file, frontmatter } = parsedFile;\n const references: ReferenceInfo[] = [];\n\n if (file.resourceType !== 'service' && file.resourceType !== 'domain') {\n return references;\n }\n\n const extractFromPointers = (pointers: any[], parentField: string) => {\n if (!Array.isArray(pointers)) return;\n pointers.forEach((pointer: any, idx: number) => {\n if (pointer.to && Array.isArray(pointer.to)) {\n pointer.to.forEach((channelRef: any, cIdx: number) => {\n if (channelRef && channelRef.id) {\n references.push({\n ref: { id: channelRef.id, version: channelRef.version },\n possibleTypes: ['channel'],\n field: `${parentField}[${idx}].to[${cIdx}]`,\n });\n }\n });\n }\n if (pointer.from && Array.isArray(pointer.from)) {\n pointer.from.forEach((channelRef: any, cIdx: number) => {\n if (channelRef && channelRef.id) {\n references.push({\n ref: { id: channelRef.id, version: channelRef.version },\n possibleTypes: ['channel'],\n field: `${parentField}[${idx}].from[${cIdx}]`,\n });\n }\n });\n }\n });\n };\n\n if (frontmatter.sends && Array.isArray(frontmatter.sends)) {\n extractFromPointers(frontmatter.sends, 'sends');\n }\n if (frontmatter.receives && Array.isArray(frontmatter.receives)) {\n extractFromPointers(frontmatter.receives, 'receives');\n }\n\n return references;\n};\n\nexport const validateReferences = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ValidationError[] => {\n const index = buildResourceIndex(parsedFiles, dependencies);\n const errors: ValidationError[] = [];\n\n for (const parsedFile of parsedFiles) {\n const references = extractReferences(parsedFile);\n\n for (const { ref, possibleTypes, field } of references) {\n const found = possibleTypes.some((type) => checkResourceExists(ref, type, index));\n\n if (!found) {\n const versionStr = ref.version ? ` (version: ${ref.version})` : '';\n const typeStr = possibleTypes.length === 1 ? possibleTypes[0] : possibleTypes.join('/');\n\n let rule = 'refs/resource-exists';\n if (field === 'owners') {\n rule = 'refs/owner-exists';\n } else if (field === 'writesTo' || field === 'readsFrom') {\n rule = 'refs/container-exists';\n } else if (ref.version) {\n rule = 'refs/valid-version-range';\n }\n\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field,\n message: `Referenced ${typeStr} \"${ref.id}\"${versionStr} does not exist`,\n file: parsedFile.file.relativePath,\n rule,\n });\n }\n }\n\n // Validate channel references from sends/receives to/from\n const channelRefs = extractChannelReferences(parsedFile);\n for (const { ref, possibleTypes, field } of channelRefs) {\n const found = possibleTypes.some((type) => checkResourceExists(ref, type, index));\n\n if (!found) {\n const versionStr = ref.version ? ` (version: ${ref.version})` : '';\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field,\n message: `Referenced channel \"${ref.id}\"${versionStr} does not exist`,\n file: parsedFile.file.relativePath,\n rule: 'refs/channel-exists',\n });\n }\n }\n }\n\n return errors;\n};\n\n// Detect messages (events/commands/queries) with no producer and no consumer\nexport const validateOrphanMessages = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ValidationError[] => {\n const errors: ValidationError[] = [];\n const messageTypes: ResourceType[] = ['event', 'command', 'query'];\n\n // Collect all message IDs\n const messageFiles = parsedFiles.filter((pf) => messageTypes.includes(pf.file.resourceType));\n\n if (messageFiles.length === 0) return errors;\n\n // Build sets of produced and consumed message IDs\n const producedMessages = new Set<string>();\n const consumedMessages = new Set<string>();\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n\n if (file.resourceType === 'service' || file.resourceType === 'domain') {\n if (frontmatter.sends && Array.isArray(frontmatter.sends)) {\n frontmatter.sends.forEach((ref: any) => {\n if (ref && ref.id) producedMessages.add(ref.id);\n });\n }\n if (frontmatter.receives && Array.isArray(frontmatter.receives)) {\n frontmatter.receives.forEach((ref: any) => {\n if (ref && ref.id) consumedMessages.add(ref.id);\n });\n }\n }\n\n // Also check producers/consumers fields on messages themselves\n if (messageTypes.includes(file.resourceType)) {\n if (frontmatter.producers && Array.isArray(frontmatter.producers) && frontmatter.producers.length > 0) {\n const msgId = (frontmatter.id as string) || file.resourceId;\n producedMessages.add(msgId);\n }\n if (frontmatter.consumers && Array.isArray(frontmatter.consumers) && frontmatter.consumers.length > 0) {\n const msgId = (frontmatter.id as string) || file.resourceId;\n consumedMessages.add(msgId);\n }\n }\n }\n\n // Also consider dependency messages as having producers/consumers\n if (dependencies) {\n for (const [type, entries] of Object.entries(dependencies)) {\n if (messageTypes.includes(type as ResourceType)) {\n entries.forEach((entry) => {\n // Dependencies are external, treat them as having both producers and consumers\n producedMessages.add(entry.id);\n consumedMessages.add(entry.id);\n });\n }\n }\n }\n\n // Check each message for orphan status\n for (const parsedFile of messageFiles) {\n const msgId = (parsedFile.frontmatter.id as string) || parsedFile.file.resourceId;\n const isProduced = producedMessages.has(msgId);\n const isConsumed = consumedMessages.has(msgId);\n\n if (!isProduced && !isConsumed) {\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field: 'id',\n message: `${parsedFile.file.resourceType} \"${msgId}\" has no producer and no consumer`,\n file: parsedFile.file.relativePath,\n rule: 'refs/orphan-messages',\n });\n }\n }\n\n return errors;\n};\n\n// Detect references to deprecated resources\nexport const validateDeprecatedReferences = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Build an index of deprecated resources\n const deprecatedIndex: Record<string, Set<string>> = {};\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n if (frontmatter.deprecated && frontmatter.deprecated !== false) {\n const resourceId = (frontmatter.id as string) || file.resourceId;\n const key = `${file.resourceType}:${resourceId}`;\n if (!deprecatedIndex[key]) {\n deprecatedIndex[key] = new Set();\n }\n if (frontmatter.version && typeof frontmatter.version === 'string') {\n deprecatedIndex[key].add(frontmatter.version);\n } else {\n deprecatedIndex[key].add('*'); // All versions deprecated\n }\n }\n }\n\n if (Object.keys(deprecatedIndex).length === 0) return errors;\n\n const isDeprecated = (type: string, id: string, version?: string): boolean => {\n const key = `${type}:${id}`;\n const versions = deprecatedIndex[key];\n if (!versions) return false;\n if (versions.has('*')) return true;\n if (version && versions.has(version)) return true;\n // For 'latest' or no version, check if any version is deprecated\n if (!version || version === 'latest') return versions.size > 0;\n return false;\n };\n\n for (const parsedFile of parsedFiles) {\n const references = extractReferences(parsedFile);\n\n for (const { ref, possibleTypes, field } of references) {\n // Skip owner references for this check\n if (field === 'owners' || field === 'members') continue;\n\n for (const type of possibleTypes) {\n if (isDeprecated(type, ref.id, ref.version)) {\n const versionStr = ref.version ? ` (version: ${ref.version})` : '';\n errors.push({\n type: 'reference',\n resource: `${parsedFile.file.resourceType}/${parsedFile.file.resourceId}`,\n field,\n message: `Referenced ${type} \"${ref.id}\"${versionStr} is deprecated`,\n file: parsedFile.file.relativePath,\n rule: 'versions/no-deprecated-references',\n });\n break; // Only report once per reference\n }\n }\n }\n }\n\n return errors;\n};\n\n// Detect duplicate resource IDs (same type, same id, same version)\nexport const validateDuplicateResourceIds = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Track seen resources: key = \"type:id:version\", value = file path\n const seen: Record<string, string> = {};\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter } = parsedFile;\n const resourceId = (frontmatter.id as string) || file.resourceId;\n const version = (frontmatter.version as string) || 'latest';\n const key = `${file.resourceType}:${resourceId}:${version}`;\n\n if (seen[key]) {\n errors.push({\n type: 'reference',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'id',\n message: `Duplicate ${file.resourceType} \"${resourceId}\" (version: ${version}) — also defined in ${seen[key]}`,\n file: file.relativePath,\n rule: 'structure/duplicate-resource-ids',\n });\n } else {\n seen[key] = file.relativePath;\n }\n }\n\n return errors;\n};\n","import { ParsedFile } from '../parser';\nimport { ValidationError } from '../types';\n\nexport const validateBestPractices = (parsedFiles: ParsedFile[]): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n for (const parsedFile of parsedFiles) {\n const { file, frontmatter, content } = parsedFile;\n\n // Check for required summary\n if (!frontmatter.summary || (typeof frontmatter.summary === 'string' && frontmatter.summary.trim() === '')) {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'summary',\n message: 'Summary is required for better documentation',\n file: file.relativePath,\n severity: 'error',\n rule: 'best-practices/summary-required',\n });\n }\n\n // Check for required owners (skip users and teams - they are owners, not owned)\n if (\n file.resourceType !== 'user' &&\n file.resourceType !== 'team' &&\n (!frontmatter.owners || !Array.isArray(frontmatter.owners) || frontmatter.owners.length === 0)\n ) {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'owners',\n message: 'At least one owner is required',\n file: file.relativePath,\n severity: 'error',\n rule: 'best-practices/owner-required',\n });\n }\n\n // Check for required description (markdown body content)\n if (!content || content.trim() === '') {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'description',\n message: 'Resource should have a markdown description (body content) beyond just frontmatter',\n file: file.relativePath,\n severity: 'warning',\n rule: 'best-practices/description-required',\n });\n }\n\n // Check for required schemaPath on messages (events, commands, queries)\n if (\n (file.resourceType === 'event' || file.resourceType === 'command' || file.resourceType === 'query') &&\n !frontmatter.schemaPath\n ) {\n errors.push({\n type: 'schema',\n resource: `${file.resourceType}/${file.resourceId}`,\n field: 'schemaPath',\n message: `${file.resourceType} should have a schemaPath defined for consumers to understand the contract`,\n file: file.relativePath,\n severity: 'warning',\n rule: 'best-practices/schema-required',\n });\n }\n }\n\n return errors;\n};\n","export * from './schema-validator';\nexport * from './reference-validator';\nexport * from './best-practices-validator';\n\nimport { ParsedFile } from '../parser';\nimport { ValidationError } from '../types';\nimport { CatalogDependencies } from '../config';\nimport { validateAllSchemas } from './schema-validator';\nimport {\n validateReferences,\n validateOrphanMessages,\n validateDeprecatedReferences,\n validateDuplicateResourceIds,\n} from './reference-validator';\nimport { validateBestPractices } from './best-practices-validator';\n\nexport const validateCatalog = (parsedFiles: ParsedFile[], dependencies?: CatalogDependencies): ValidationError[] => {\n const schemaErrors = validateAllSchemas(parsedFiles);\n const referenceErrors = validateReferences(parsedFiles, dependencies);\n const orphanErrors = validateOrphanMessages(parsedFiles, dependencies);\n const deprecatedRefErrors = validateDeprecatedReferences(parsedFiles);\n const duplicateErrors = validateDuplicateResourceIds(parsedFiles);\n const bestPracticeErrors = validateBestPractices(parsedFiles);\n\n return [\n ...schemaErrors,\n ...referenceErrors,\n ...orphanErrors,\n ...deprecatedRefErrors,\n ...duplicateErrors,\n ...bestPracticeErrors,\n ];\n};\n","import chalk from 'chalk';\nimport { ValidationError } from '../types';\nimport { ParseError } from '../parser';\n\nexport interface ReportSummary {\n totalErrors: number;\n totalWarnings: number;\n schemaErrors: number;\n referenceErrors: number;\n parseErrors: number;\n filesChecked: number;\n filesWithErrors: number;\n}\n\nexport const formatError = (error: ValidationError, showFilename: boolean = true): string => {\n const lineInfo = error.line ? chalk.dim(`:${error.line}:1`) : '';\n const filename = showFilename ? `${chalk.dim(error.file)}${lineInfo}` : '';\n\n const isWarning = error.severity === 'warning';\n const severity = isWarning ? chalk.yellow('warning') : chalk.red('error');\n const icon = isWarning ? chalk.yellow('⚠') : chalk.red('✖');\n const errorCode = getErrorCode(error);\n const field = error.field ? chalk.dim(`[${error.field}]`) : '';\n\n const parts = [];\n if (filename) parts.push(filename);\n parts.push(icon, severity, error.message, field, chalk.dim(errorCode));\n\n return parts.filter(Boolean).join(' ');\n};\n\nconst getErrorCode = (error: ValidationError): string => {\n if (error.rule) {\n return `(${error.rule})`;\n }\n\n // Fallback to generic error codes\n if (error.type === 'schema') {\n if (error.field) {\n if (error.message.includes('Required')) return '(@eventcatalog/required-field)';\n if (error.message.includes('Expected')) return '(@eventcatalog/invalid-type)';\n return '(@eventcatalog/schema-validation)';\n }\n return '(@eventcatalog/schema)';\n }\n if (error.type === 'reference') {\n return '(@eventcatalog/invalid-reference)';\n }\n return '(@eventcatalog/unknown)';\n};\n\nexport const formatParseError = (error: ParseError, showFilename: boolean = true): string => {\n const filename = showFilename ? chalk.dim(error.file.relativePath) : '';\n const severity = chalk.red('error');\n const message = `Parse error: ${error.error.message}`;\n const errorCode = chalk.dim('(@eventcatalog/parse-error)');\n\n const parts = [];\n if (filename) parts.push(filename);\n parts.push(chalk.red('✖'), severity, message, errorCode);\n\n return parts.filter(Boolean).join(' ');\n};\n\nexport const groupErrorsByFile = (errors: ValidationError[]): Map<string, ValidationError[]> => {\n const grouped = new Map<string, ValidationError[]>();\n\n for (const error of errors) {\n if (!grouped.has(error.file)) {\n grouped.set(error.file, []);\n }\n grouped.get(error.file)!.push(error);\n }\n\n return grouped;\n};\n\nexport const reportErrors = (\n validationErrors: ValidationError[],\n parseErrors: ParseError[],\n verbose: boolean = false\n): ReportSummary => {\n const allErrors = [\n ...validationErrors,\n ...parseErrors.map((pe) => ({\n type: 'parse' as const,\n resource: pe.file.resourceType || 'unknown',\n message: pe.error.message,\n file: pe.file.relativePath,\n line: undefined,\n })),\n ];\n\n const schemaErrors = validationErrors.filter((e) => e.type === 'schema');\n const referenceErrors = validationErrors.filter((e) => e.type === 'reference');\n const warnings = validationErrors.filter((e) => e.severity === 'warning');\n const errors = [...validationErrors.filter((e) => e.severity !== 'warning'), ...parseErrors];\n const totalErrors = errors.length;\n const totalWarnings = warnings.length;\n\n if (totalErrors === 0 && totalWarnings === 0) {\n console.log(chalk.green('✔ No problems found!'));\n return {\n totalErrors: 0,\n totalWarnings: 0,\n schemaErrors: 0,\n referenceErrors: 0,\n parseErrors: 0,\n filesChecked: 0,\n filesWithErrors: 0,\n };\n }\n\n const grouped = groupErrorsByFile(validationErrors);\n const parseErrorsGrouped = groupParseErrorsByFile(parseErrors);\n const allFiles = new Set([...grouped.keys(), ...parseErrorsGrouped.keys()]);\n\n console.log(); // Empty line\n\n // Report by file for better readability\n for (const file of Array.from(allFiles).sort()) {\n const fileErrors = grouped.get(file) || [];\n const fileParseErrors = parseErrorsGrouped.get(file) || [];\n const fileErrorCount = fileErrors.length + fileParseErrors.length;\n\n if (fileErrorCount === 0) continue;\n\n // File header (ESLint-style)\n console.log(chalk.underline(file));\n\n // Parse errors first\n for (const error of fileParseErrors) {\n console.log(` ${formatParseError(error, false)}`);\n }\n\n // Then validation errors\n for (const error of fileErrors) {\n console.log(` ${formatError(error, false)}`);\n }\n\n // File summary\n const fileWarnings = fileErrors.filter((e) => e.severity === 'warning').length;\n const fileActualErrors = fileErrorCount - fileWarnings;\n const problemText = fileErrorCount === 1 ? 'problem' : 'problems';\n const summaryColor = fileActualErrors > 0 ? chalk.red : chalk.yellow;\n const summaryIcon = fileActualErrors > 0 ? '✖' : '⚠';\n console.log(summaryColor(`\\n${summaryIcon} ${fileErrorCount} ${problemText}\\n`));\n }\n\n // Overall summary (ESLint-style)\n const filesWithErrors = allFiles.size;\n const totalProblems = totalErrors + totalWarnings;\n const problemText = totalProblems === 1 ? 'problem' : 'problems';\n const fileText = filesWithErrors === 1 ? 'file' : 'files';\n\n const summaryColor = totalErrors > 0 ? chalk.red.bold : chalk.yellow.bold;\n const summaryIcon = totalErrors > 0 ? '✖' : '⚠';\n\n console.log(summaryColor(`${summaryIcon} ${totalProblems} ${problemText} (${totalErrors} errors, ${totalWarnings} warnings)`));\n console.log(chalk.dim(` ${filesWithErrors} ${fileText} checked`));\n\n return {\n totalErrors,\n totalWarnings,\n schemaErrors: schemaErrors.length,\n referenceErrors: referenceErrors.length,\n parseErrors: parseErrors.length,\n filesChecked: allFiles.size,\n filesWithErrors,\n };\n};\n\nconst groupParseErrorsByFile = (errors: ParseError[]): Map<string, ParseError[]> => {\n const grouped = new Map<string, ParseError[]>();\n\n for (const error of errors) {\n const file = error.file.relativePath;\n if (!grouped.has(file)) {\n grouped.set(file, []);\n }\n grouped.get(file)!.push(error);\n }\n\n return grouped;\n};\n","import fs from 'fs';\nimport path from 'path';\nimport { ValidationError } from '../types';\n\nexport type RuleSeverity = 'error' | 'warn' | 'off';\n\nexport interface RuleConfig {\n severity: RuleSeverity;\n options?: Record<string, any>;\n}\n\nexport interface ConfigOverride {\n files: string[];\n rules: Record<string, RuleSeverity | [RuleSeverity, Record<string, any>]>;\n}\n\nexport interface LinterConfig {\n rules: Record<string, RuleSeverity | [RuleSeverity, Record<string, any>]>;\n ignorePatterns?: string[];\n overrides?: ConfigOverride[];\n}\n\nexport const DEFAULT_IGNORE_PATTERNS: string[] = ['dependencies/**'];\n\nexport const DEFAULT_RULES: Record<string, RuleSeverity> = {\n 'schema/required-fields': 'error',\n 'schema/valid-semver': 'error',\n 'schema/valid-email': 'error',\n 'refs/owner-exists': 'error',\n 'refs/valid-version-range': 'error',\n 'refs/resource-exists': 'error',\n 'refs/channel-exists': 'error',\n 'refs/container-exists': 'error',\n 'refs/orphan-messages': 'warn',\n 'best-practices/summary-required': 'error',\n 'best-practices/owner-required': 'error',\n 'best-practices/description-required': 'warn',\n 'best-practices/schema-required': 'warn',\n 'naming/service-id-format': 'error',\n 'naming/event-id-format': 'error',\n 'versions/consistent-format': 'error',\n 'versions/no-deprecated': 'error',\n 'versions/no-deprecated-references': 'warn',\n 'structure/duplicate-resource-ids': 'error',\n};\n\nexport interface DependencyEntry {\n id: string;\n version?: string;\n}\n\nexport type CatalogDependencies = Record<string, DependencyEntry[]>;\n\nconst PLURAL_TO_SINGULAR: Record<string, string> = {\n events: 'event',\n commands: 'command',\n queries: 'query',\n services: 'service',\n domains: 'domain',\n entities: 'entity',\n channels: 'channel',\n flows: 'flow',\n users: 'user',\n teams: 'team',\n};\n\nexport const loadEventCatalogConfig = (rootDir: string): CatalogDependencies => {\n const configPath = path.join(rootDir, 'eventcatalog.config.js');\n\n if (!fs.existsSync(configPath)) {\n return {};\n }\n\n try {\n delete require.cache[require.resolve(configPath)];\n const config = require(configPath);\n\n if (!config.dependencies || typeof config.dependencies !== 'object') {\n return {};\n }\n\n const dependencies: CatalogDependencies = {};\n\n for (const [pluralKey, entries] of Object.entries(config.dependencies)) {\n const singularType = PLURAL_TO_SINGULAR[pluralKey];\n if (!singularType || !Array.isArray(entries)) continue;\n\n dependencies[singularType] = (entries as any[])\n .filter((entry) => entry && typeof entry.id === 'string')\n .map((entry) => ({ id: entry.id, version: entry.version }));\n }\n\n return dependencies;\n } catch (error) {\n console.warn(`Warning: Could not load eventcatalog.config.js: ${error instanceof Error ? error.message : String(error)}`);\n return {};\n }\n};\n\nexport const loadConfig = (rootDir: string): LinterConfig => {\n const configPath = path.join(rootDir, '.eventcatalogrc.js');\n\n if (!fs.existsSync(configPath)) {\n // Return default config if no config file exists\n return {\n rules: DEFAULT_RULES,\n ignorePatterns: DEFAULT_IGNORE_PATTERNS,\n overrides: [],\n };\n }\n\n try {\n // Clear module cache to ensure fresh load\n delete require.cache[require.resolve(configPath)];\n const config = require(configPath);\n\n // Merge with defaults\n const mergedConfig: LinterConfig = {\n rules: { ...DEFAULT_RULES, ...config.rules },\n ignorePatterns: [...DEFAULT_IGNORE_PATTERNS, ...(config.ignorePatterns || [])],\n overrides: config.overrides || [],\n };\n\n return mergedConfig;\n } catch (error) {\n console.warn(`Warning: Could not load .eventcatalogrc.js: ${error instanceof Error ? error.message : String(error)}`);\n return {\n rules: DEFAULT_RULES,\n ignorePatterns: DEFAULT_IGNORE_PATTERNS,\n overrides: [],\n };\n }\n};\n\nexport const parseRuleConfig = (rule: RuleSeverity | [RuleSeverity, Record<string, any>]): RuleConfig => {\n if (Array.isArray(rule)) {\n return {\n severity: rule[0],\n options: rule[1],\n };\n }\n return {\n severity: rule,\n options: {},\n };\n};\n\nexport const shouldIgnoreFile = (filePath: string, ignorePatterns: string[]): boolean => {\n if (!ignorePatterns || ignorePatterns.length === 0) {\n return false;\n }\n\n const normalizedPath = filePath.replace(/\\\\/g, '/');\n\n for (const pattern of ignorePatterns) {\n // Simple glob matching for now\n const regex = new RegExp(pattern.replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^/]*'));\n if (regex.test(normalizedPath)) {\n return true;\n }\n }\n\n return false;\n};\n\nexport const getEffectiveRules = (filePath: string, config: LinterConfig): Record<string, RuleConfig> => {\n let effectiveRules = { ...config.rules };\n\n // Apply overrides\n if (config.overrides) {\n for (const override of config.overrides) {\n const matchesFile = override.files.some((pattern) => {\n const regex = new RegExp(pattern.replace(/\\*\\*/g, '.*').replace(/\\*/g, '[^/]*'));\n return regex.test(filePath);\n });\n\n if (matchesFile) {\n effectiveRules = { ...effectiveRules, ...override.rules };\n }\n }\n }\n\n // Parse rules into RuleConfig objects\n const parsedRules: Record<string, RuleConfig> = {};\n for (const [ruleName, ruleValue] of Object.entries(effectiveRules)) {\n parsedRules[ruleName] = parseRuleConfig(ruleValue);\n }\n\n return parsedRules;\n};\n\nexport const applyRuleSeverity = (errors: ValidationError[], rules: Record<string, RuleConfig>): ValidationError[] => {\n const result: ValidationError[] = [];\n\n for (const error of errors) {\n // Map validation errors to rule names\n const ruleName = mapErrorToRuleName(error);\n const rule = rules[ruleName];\n\n if (!rule || rule.severity === 'off') {\n continue; // Skip disabled rules\n }\n\n result.push({\n ...error,\n severity: rule.severity === 'warn' ? ('warning' as const) : ('error' as const),\n });\n }\n\n return result;\n};\n\nconst mapErrorToRuleName = (error: ValidationError): string => {\n // Use explicit rule if set by the validator\n if (error.rule) {\n return error.rule;\n }\n\n // Map validation errors to rule names based on the error type and content\n if (error.type === 'schema') {\n // Check field-specific rules first\n if (error.field === 'summary') {\n return 'best-practices/summary-required';\n }\n if (error.field === 'owners') {\n return 'best-practices/owner-required';\n }\n\n // Check message content for specific validation types\n if (error.message.includes('email') || error.message.includes('Invalid email')) {\n return 'schema/valid-email';\n }\n if (error.message.includes('version') || error.message.includes('semantic')) {\n return 'schema/valid-semver';\n }\n if (error.message.includes('Required') || error.message.includes('Expected')) {\n return 'schema/required-fields';\n }\n\n return 'schema/required-fields';\n }\n\n if (error.type === 'reference') {\n if (error.message.includes('user') || error.message.includes('team')) {\n return 'refs/owner-exists';\n }\n if (error.message.includes('version')) {\n return 'refs/valid-version-range';\n }\n return 'refs/resource-exists';\n }\n\n return 'schema/required-fields';\n};\n"],"mappings":"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","names":["semverRegex","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","parts","z","z","problemText","summaryColor","summaryIcon","fs","path","path","fs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eventcatalog/linter",
3
- "version": "1.0.23",
3
+ "version": "1.0.24",
4
4
  "description": "A linter for EventCatalog to validate frontmatter and resource references",
5
5
  "repository": {
6
6
  "type": "git",
@@ -33,7 +33,7 @@
33
33
  "ora": "^8.0.1",
34
34
  "semver": "^7.7.2",
35
35
  "zod": "^3.25.76",
36
- "@eventcatalog/sdk": "2.21.1"
36
+ "@eventcatalog/sdk": "2.21.2"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^20.10.5",