|
| 1 | +extends: [[spectral:oas, all], [spectral:asyncapi, all]] |
| 2 | +rules: |
| 3 | + operation-tags: off |
| 4 | + operation-operationId: off |
| 5 | + operation-success-response: error |
| 6 | + |
| 7 | + # ----------------------------# |
| 8 | + # Mojis OAS v2.0, v3.0 rules # |
| 9 | + # ----------------------------# |
| 10 | + |
| 11 | + mojis-paths-kebab-case: |
| 12 | + description: All YAML/JSON paths MUST follow kebab-case |
| 13 | + severity: warn |
| 14 | + recommended: true |
| 15 | + message: "{{property}} is not kebab-case: {{error}}" |
| 16 | + given: $.paths[*]~ |
| 17 | + then: |
| 18 | + function: pattern |
| 19 | + functionOptions: |
| 20 | + match: "^\/([a-z0-9]+(-[a-z0-9]+)*)?(\/[a-z0-9]+(-[a-z0-9]+)*|\/{.+})*$" # doesn't allow /asasd{asdas}sadas pattern or not closed braces |
| 21 | + |
| 22 | + mojis-path-parameters-camelCase-alphanumeric: |
| 23 | + description: Path parameters MUST follow camelCase |
| 24 | + severity: warn |
| 25 | + recommended: true |
| 26 | + message: "{{property}} path parameter is not camelCase: {{error}}" |
| 27 | + given: $..parameters[?(@.in == 'path')].name |
| 28 | + then: |
| 29 | + function: pattern |
| 30 | + functionOptions: |
| 31 | + match: "^[a-z][a-zA-Z0-9]+$" |
| 32 | + |
| 33 | + mojis-definitions-camelCase-alphanumeric: |
| 34 | + description: All YAML/JSON definitions MUST follow fields-camelCase and be ASCII alphanumeric characters or `_` or `$`. |
| 35 | + severity: error |
| 36 | + recommended: true |
| 37 | + message: "{{property}} MUST follow camelCase and be ASCII alphanumeric characters or `_` or `$`." |
| 38 | + given: $.definitions[*]~ |
| 39 | + then: |
| 40 | + function: pattern |
| 41 | + functionOptions: |
| 42 | + match: "/^[a-z$_]{1}[A-Z09$_]*/" |
| 43 | + |
| 44 | + mojis-properties-camelCase-alphanumeric: |
| 45 | + description: All JSON Schema properties MUST follow fields-camelCase and be ASCII alphanumeric characters or `_` or `$`. |
| 46 | + severity: error |
| 47 | + recommended: true |
| 48 | + message: "{{property}} MUST follow camelCase and be ASCII alphanumeric characters or `_` or `$`." |
| 49 | + given: $.definitions..properties[*]~ |
| 50 | + then: |
| 51 | + function: pattern |
| 52 | + functionOptions: |
| 53 | + match: "/^[a-z$_]{1}[A-Z09$_]*/" |
| 54 | + |
| 55 | + mojis-request-GET-no-body: |
| 56 | + description: "A 'GET' request MUST NOT accept a 'body` parameter" |
| 57 | + severity: error |
| 58 | + given: $.paths..get.parameters..in |
| 59 | + then: |
| 60 | + function: pattern |
| 61 | + functionOptions: |
| 62 | + notMatch: /^body$/ |
| 63 | + |
| 64 | + mojis-headers-no-x-headers: |
| 65 | + description: "All 'HTTP' headers SHOULD NOT include 'X-' headers (https://tools.ietf.org/html/rfc6648)." |
| 66 | + severity: warn |
| 67 | + given: "$..parameters[?(@.in == 'header')].name" |
| 68 | + message: "HTTP headers SHOULD NOT include 'X-' prefix." |
| 69 | + recommended: true |
| 70 | + type: style |
| 71 | + then: |
| 72 | + function: pattern |
| 73 | + functionOptions: |
| 74 | + notMatch: "/^(x|X)-/" |
| 75 | + |
| 76 | + mojis-headers-hyphenated-pascal-case: |
| 77 | + description: All `HTTP` headers MUST use `Hyphenated-Pascal-Case` notation |
| 78 | + severity: error |
| 79 | + given: "$..parameters[?(@.in == 'header')].name" |
| 80 | + message: "'HTTP' headers MUST follow 'Hyphenated-Pascal-Case' notation" |
| 81 | + recommended: true |
| 82 | + type: style |
| 83 | + then: |
| 84 | + function: pattern |
| 85 | + functionOptions: |
| 86 | + match: "/^([A-Z][a-z0-9]-)*([A-Z][a-z0-9])+/" |
| 87 | + |
| 88 | + # ----------------------# |
| 89 | + # Mojis OAS v2.0 rules # |
| 90 | + # ----------------------# |
| 91 | + |
| 92 | + mojis-oas2-protocol-https-only: |
| 93 | + description: ALL requests MUST go through `https` protocol only |
| 94 | + formats: |
| 95 | + - oas2 |
| 96 | + recommended: true |
| 97 | + severity: error |
| 98 | + type: style |
| 99 | + message: Schemes MUST be https and no other value is allowed. |
| 100 | + given: $ |
| 101 | + then: |
| 102 | + field: schemes |
| 103 | + function: schema |
| 104 | + functionOptions: |
| 105 | + schema: |
| 106 | + type: array |
| 107 | + items: |
| 108 | + type: string |
| 109 | + enum: [https] |
| 110 | + maxItems: 1 |
| 111 | + |
| 112 | + mojis-oas2-request-support-json: |
| 113 | + description: Every request SHOULD support `application/json` media type |
| 114 | + formats: |
| 115 | + - oas2 |
| 116 | + severity: warn |
| 117 | + message: "{{description}}: {{error}}" |
| 118 | + recommended: true |
| 119 | + given: $..consumes |
| 120 | + then: |
| 121 | + function: schema |
| 122 | + functionOptions: |
| 123 | + schema: |
| 124 | + type: array |
| 125 | + contains: |
| 126 | + type: string |
| 127 | + enum: |
| 128 | + - application/json |
| 129 | + |
| 130 | + mojis-oas2-example-exists-in-parameters: |
| 131 | + description: All models MUST have a valid example. |
| 132 | + severity: error |
| 133 | + recommended: true |
| 134 | + formats: |
| 135 | + - oas2 |
| 136 | + message: "{{ property }} MUST have a valid example." |
| 137 | + given: "$..parameters..[?(@.in == 'body' && (@.example || @.schema.$ref))]" |
| 138 | + then: |
| 139 | + function: truthy |
| 140 | + |
| 141 | + mojis-oas2-response-error-problem: # schemas and/or produces |
| 142 | + description: All error responses MUST be of media type `application/problem+json` |
| 143 | + severity: error |
| 144 | + formats: |
| 145 | + - oas2 |
| 146 | + given: $.paths..responses[?( @property >= 400 && @property < 600 )] |
| 147 | + recommended: true |
| 148 | + type: style |
| 149 | + message: "Error response document MUST follow application/problem+json: {{error}}" |
| 150 | + then: |
| 151 | + field: schema.example |
| 152 | + function: schema |
| 153 | + functionOptions: |
| 154 | + schema: |
| 155 | + title: Problem Details for HTTP APIs |
| 156 | + description: Definition of [RFC7807](https://tools.ietf.org/html/rfc7807) problem detail |
| 157 | + type: object |
| 158 | + properties: |
| 159 | + type: |
| 160 | + type: string |
| 161 | + title: |
| 162 | + type: string |
| 163 | + status: |
| 164 | + type: number |
| 165 | + detail: |
| 166 | + type: string |
| 167 | + instance: |
| 168 | + type: string |
| 169 | + required: |
| 170 | + - title |
| 171 | + - detail |
| 172 | + |
| 173 | + # ----------------------# |
| 174 | + # Mojis OAS v3.0 rules # |
| 175 | + # ----------------------# |
| 176 | + |
| 177 | + mojis-oas3-request-support-json: |
| 178 | + description: Every request MUST support `application/json` media type |
| 179 | + formats: |
| 180 | + - oas3 |
| 181 | + recommended: true |
| 182 | + severity: error |
| 183 | + message: "{{description}}: {{error}}" |
| 184 | + given: $.paths.[*].requestBody.content[?(@property.indexOf('json') === -1)]^ |
| 185 | + then: |
| 186 | + function: falsy |
| 187 | + |
| 188 | + mojis-oas3-protocol-https-only: |
| 189 | + description: ALL requests MUST go through `https` protocol only |
| 190 | + formats: |
| 191 | + - oas3 |
| 192 | + recommended: true |
| 193 | + severity: error |
| 194 | + message: Servers MUST be https and no other protocol is allowed. |
| 195 | + given: $.servers..url |
| 196 | + then: |
| 197 | + function: pattern |
| 198 | + functionOptions: |
| 199 | + match: "/^https:/" |
0 commit comments