File size: 2,094 Bytes
048b1e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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',
        })
      }
    },
  }),
})