import { createRule, getFriendlyName, paramMessage } from '@typespec/compiler' export const friendlyNameRule = createRule({ name: 'friendly-name', severity: 'error', description: 'Ensure friendlyName decorator.', messages: { default: paramMessage`The ${'type'} ${'name'} must have a friendlyName decorator.`, avoid: paramMessage`The ${'type'} ${'name'} should not have a friendlyName decorator.`, }, create: (context) => ({ interface: (node) => { const hasFriendlyName = !!getFriendlyName(context.program, node) const isEndpointsOrOperations = node.name.endsWith('Endpoints') || node.name.endsWith('Operations') if (isEndpointsOrOperations && hasFriendlyName) { context.reportDiagnostic({ format: { type: node.kind, name: node.name, }, target: node, messageId: 'avoid', }) return } if (!isEndpointsOrOperations && !hasFriendlyName) { context.reportDiagnostic({ format: { type: node.kind, name: node.name, }, target: node, messageId: 'default', }) } }, model: (node) => { if (node.name && !getFriendlyName(context.program, node)) { context.reportDiagnostic({ format: { type: node.kind, name: node.name, }, target: node, messageId: 'default', }) } }, enum: (node) => { if (node.name && !getFriendlyName(context.program, node)) { context.reportDiagnostic({ format: { type: node.kind, name: node.name, }, target: node, messageId: 'default', }) } }, union: (node) => { if (node.name && !getFriendlyName(context.program, node)) { context.reportDiagnostic({ format: { type: node.kind, name: node.name, }, target: node, messageId: 'default', }) } }, }), })