UNPKG

@apisyouwonthate/style-guide

Version:

Make your HTTP APIs better, faster, stronger, whether they are still being designed (API Design-First) or your organization has flopped various mismatched APIs into production and now you're thinking some consistency would be nice. Using Spectral and Open

1 lines 22.3 kB
{"version":3,"sources":["../src/ruleset.ts","../node_modules/@stoplight/types/dist/index.mjs"],"sourcesContent":["/*\n * These rules dictate actual content of the API: headers, URL conventions, and general\n * Good Ideas™ for HTTP APIs, mainly from the books/blogs on apisyouwonthate.com\n */\n\nimport {\n enumeration,\n truthy,\n undefined as undefinedFunc,\n pattern,\n schema,\n} from \"@stoplight/spectral-functions\";\nimport { oas2, oas3 } from \"@stoplight/spectral-formats\";\nimport { DiagnosticSeverity } from \"@stoplight/types\";\n\nexport default {\n rules: {\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"api-home\": {\n message: \"APIs MUST have a root path (`/`) defined.\",\n description:\n \"Good documentation is always welcome, but API consumers should be able to get a pretty long way through interaction with the API alone. They should at least know they're looking at the right place instead of getting a 404 or random 500 error as is common in some APIs.\\n\\nThere are various efforts around to standardize the home document, but the best is probably this one: https://webconcepts.info/specs/IETF/I-D/nottingham-json-home\",\n given: \"$.paths\",\n then: {\n field: \"/\",\n function: truthy,\n },\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"api-home-get\": {\n message: \"APIs root path (`/`) MUST have a GET operation.\",\n description:\n \"Good documentation is always welcome, but API consumers should be able to get a pretty long way through interaction with the API alone. They should at least know they're looking at the right place instead of getting a 404 or random 500 error as is common in some APIs.\\n\\nThere are various efforts around to standardize the home document, but the best is probably this one: https://webconcepts.info/specs/IETF/I-D/nottingham-json-home\",\n given: \"$.paths[/]\",\n then: {\n field: \"get\",\n function: truthy,\n },\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"api-health\": {\n message: \"APIs MUST have a health path (`/health`) defined.\",\n description:\n \"Creating a `/health` endpoint is a simple solution for pull-based monitoring and manually checking the status of an API. To learn more about health check endpoints see https://apisyouwonthate.com/blog/health-checks-with-kubernetes.\",\n given: \"$.paths\",\n then: {\n field: \"/health\",\n function: truthy,\n },\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"api-health-format\": {\n message:\n \"Health path (`/health`) SHOULD support Health Check Response Format\",\n description:\n \"Use existing standards (and draft standards) wherever possible, like the draft standard for health checks: https://datatracker.ietf.org/doc/html/draft-inadarei-api-health-check. To learn more about health check endpoints see https://apisyouwonthate.com/blog/health-checks-with-kubernetes.\",\n formats: [oas3],\n given: \"$.paths[/health]..responses[*].content.*~\",\n then: {\n function: enumeration,\n functionOptions: {\n values: [\"application/health+json\"],\n },\n },\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"paths-kebab-case\": {\n message:\n \"{{property}} should be kebab-case (lower case and separated with hyphens).\",\n description:\n \"Naming conventions don't particular matter, and picking something consistent is the most important thing. So let's pick kebab-case for paths, because... well it's nice and why not.\",\n given: \"$.paths[*]~\",\n then: {\n function: pattern,\n functionOptions: {\n match: \"^(/|[a-z0-9-.]+|{[a-zA-Z0-9_]+})+$\",\n },\n },\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"no-numeric-ids\": {\n message: \"Please avoid exposing IDs as an integer, UUIDs are preferred.\",\n description:\n \"Using auto-incrementing IDs in your API means people can download your entire database with a for() loop, whether its public or protected. Using UUID, ULID, snowflake, etc. can help to avoid this, or at least slow them down, depending on how you have your API set up.\\n\\nThis is recommended by the OWASP API Security Project. https://github.com/OWASP/API-Security/blob/master/2019/en/src/0xa1-broken-object-level-authorization.md.\\n\\nLearn more about this over here. https://phil.tech/2015/auto-incrementing-to-destruction/\",\n given:\n '$.paths..parameters[*][?(@property === \"name\" && (@ === \"id\" || @.match(/(_id|Id|-id)$/)))]^.schema',\n then: {\n function: schema,\n functionOptions: {\n schema: {\n type: \"object\",\n not: {\n properties: {\n type: {\n const: \"integer\",\n },\n },\n },\n properties: {\n format: {\n const: \"uuid\",\n },\n },\n },\n },\n },\n severity: DiagnosticSeverity.Error,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"no-http-basic\": {\n message: \"Please consider a more secure alternative to HTTP Basic.\",\n description:\n \"HTTP Basic is an inherently insecure way to pass credentials to the API. They're placed in the URL in base64 which can be decrypted easily. Even if you're using a token, there are far better ways to handle passing tokens to an API which are less likely to leak.\\n\\nSee OWASP advice. https://github.com/OWASP/API-Security/blob/master/2019/en/src/0xa2-broken-user-authentication.md\",\n given: \"$.components.securitySchemes[*]\",\n then: {\n field: \"scheme\",\n function: pattern,\n functionOptions: {\n notMatch: \"basic\",\n },\n },\n severity: DiagnosticSeverity.Error,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"no-x-headers\": {\n message: 'Header `{{property}}` should not start with \"X-\".',\n description:\n \"Headers starting with X- is an awkward convention which is entirely unnecessary. There is probably a standard for what you're trying to do, so it would be better to use that. If there is not a standard already perhaps there's a draft that you could help mature through use and feedback.\\n\\nSee what you can find on https://standards.rest.\\n\\nMore about X- headers here: https://tools.ietf.org/html/rfc6648.\",\n given: \"$..parameters[?(@.in === 'header')].name\",\n then: {\n function: pattern,\n functionOptions: {\n notMatch: \"^(x|X)-\",\n },\n },\n severity: DiagnosticSeverity.Error,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"no-x-response-headers\": {\n message: 'Header `{{property}}` should not start with \"X-\".',\n description:\n \"Headers starting with X- is an awkward convention which is entirely unnecessary. There is probably a standard for what you're trying to do, so it would be better to use that. If there is not a standard already perhaps there's a draft that you could help mature through use and feedback.\\n\\nSee what you can find on https://standards.rest.\\n\\nMore about X- headers here: https://tools.ietf.org/html/rfc6648.\",\n given: \"$..headers.*~\",\n then: {\n function: pattern,\n functionOptions: {\n notMatch: \"^(x|X)-\",\n },\n },\n severity: DiagnosticSeverity.Error,\n },\n\n // Author: Andrzej (https://github.com/jerzyn)\n \"request-GET-no-body-oas2\": {\n message: \"A `GET` request MUST NOT accept a request body.\",\n description:\n \"Defining a request body on a HTTP GET is technically possible in some implementations, but is increasingly frowned upon due to the confusion that comes from unspecified behavior in the HTTP specification.\",\n given: \"$.paths..get.parameters..in\",\n then: {\n function: pattern,\n functionOptions: {\n notMatch: \"/^body$/\",\n },\n },\n severity: DiagnosticSeverity.Error,\n formats: [oas2],\n },\n\n // Author: Andrzej (https://github.com/jerzyn)\n \"request-GET-no-body-oas3\": {\n message: \"A `GET` request MUST NOT accept a request body.\",\n description:\n \"Defining a request body on a HTTP GET is in some implementations, but is increasingly frowned upon due to the confusion that comes from unspecified behavior in the HTTP specification.\",\n given: \"$.paths..get.requestBody\",\n then: {\n function: undefinedFunc,\n },\n formats: [oas3],\n severity: DiagnosticSeverity.Error,\n },\n\n // Author: Andrzej (https://github.com/jerzyn)\n \"hosts-https-only-oas2\": {\n message: \"Schemes MUST be https and no other protocol is allowed.\",\n description:\n \"Using http in production is reckless, advised against by OWASP API Security, and generally unnecessary thanks to free SSL on loads of hosts, gateways like Cloudflare, and OSS tools like Lets Encrypt.\",\n given: \"$.schemes\",\n then: {\n function: schema,\n functionOptions: {\n schema: {\n type: \"array\",\n items: {\n type: \"string\",\n const: \"https\",\n },\n },\n },\n },\n severity: DiagnosticSeverity.Error,\n formats: [oas2],\n },\n\n // Author: Andrzej (https://github.com/jerzyn)\n \"hosts-https-only-oas3\": {\n message: \"Servers MUST be https and no other protocol is allowed.\",\n description:\n \"Using http in production is reckless, advised against by OWASP API Security, and generally unnecessary thanks to free SSL on loads of hosts, gateways like Cloudflare, and OSS tools like Lets Encrypt.\",\n given: \"$.servers..url\",\n then: {\n function: pattern,\n functionOptions: {\n match: \"/^https:/\",\n },\n },\n formats: [oas3],\n severity: DiagnosticSeverity.Error,\n },\n\n // Author: Andrzej (https://github.com/jerzyn)\n \"request-support-json-oas3\": {\n message:\n \"Every request SHOULD support at least one `application/json` content type.\",\n description:\n \"Maybe you've got an XML heavy API or you're using a special binary format like BSON or CSON. That's lovely, but supporting JSON too is going to help a lot of people avoid a lot of confusion, and probably make you more money than you spend on supporting it.\",\n given: \"$.paths[*][*].requestBody.content\",\n then: {\n function: schema,\n functionOptions: {\n schema: {\n type: \"object\",\n properties: {\n \"application/json\": true,\n },\n required: [\"application/json\"],\n },\n },\n },\n formats: [oas3],\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Phil Sturgeon (https://github.com/philsturgeon)\n \"no-unknown-error-format\": {\n message: \"Error response should use a standard error format.\",\n description:\n \"Error responses can be unique snowflakes, different to every API, but standards exist to make them consistent, which reduces surprises and increase interoperability. Please use either RFC 7807 (https://tools.ietf.org/html/rfc7807) or the JSON:API Error format (https://jsonapi.org/format/#error-objects).\",\n given: \"$.paths[*]..responses[?(@property.match(/^(4|5)/))].content.*~\",\n then: {\n function: enumeration,\n functionOptions: {\n values: [\n \"application/vnd.api+json\",\n \"application/problem+json\",\n \"application/problem+xml\",\n ],\n },\n },\n formats: [oas3],\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Nauman Ali (https://github.com/naumanali-stoplight)\n \"no-global-versioning\": {\n message: \"Server URL should not contain global versions.\",\n description:\n \"Using global versions just forces all your clients to do a lot more work for each upgrade. Please consider using API Evolution instead.\\n\\nMore: https://apisyouwonthate.com/blog/api-evolution-for-rest-http-apis.\",\n given: \"$.servers[*].url\",\n then: {\n function: pattern,\n functionOptions: {\n notMatch: \"/v[1-9]+\",\n },\n },\n formats: [oas3],\n severity: DiagnosticSeverity.Warning,\n },\n\n // Author: Advanced API & Integrations Team (https://www.oneadvanced.com/)\n \"no-file-extensions-in-paths\": {\n message:\n \"Paths must not include file extensions such as .json, .xml, .html and .txt.\",\n description:\n \"Paths must not include file extensions such as `.json`, `.xml`, `.html` and `.txt`. Use the OpenAPI `content` keyword to tell consumers which Media Types are available.\",\n given: \"$.paths[*]~\",\n then: {\n function: pattern,\n functionOptions: {\n notMatch: \".(json|xml|html|txt)$\",\n },\n },\n severity: DiagnosticSeverity.Error,\n },\n\n // Author: Advanced API & Integrations Team (https://www.oneadvanced.com/)\n \"no-security-schemes-defined\": {\n message: \"All APIs MUST have a security scheme defined.\",\n description:\n \"This API definition does not have any security scheme defined, which means the entire API is open to the public. That's probably not what you want, even if all the data is read-only. Setting lower rate limits for the public and letting known consumers use more resources is a handy path to monetization, and helps know who your power users are when changes need feedback or migration, even if not just good practice.\",\n given: \"$..components\",\n then: {\n field: \"securitySchemes\",\n function: truthy,\n },\n formats: [oas3],\n severity: DiagnosticSeverity.Error,\n },\n },\n};\n","var HttpParamStyles;\n(function (HttpParamStyles) {\n HttpParamStyles[\"Simple\"] = \"simple\";\n HttpParamStyles[\"Matrix\"] = \"matrix\";\n HttpParamStyles[\"Label\"] = \"label\";\n HttpParamStyles[\"Form\"] = \"form\";\n HttpParamStyles[\"CommaDelimited\"] = \"commaDelimited\";\n HttpParamStyles[\"SpaceDelimited\"] = \"spaceDelimited\";\n HttpParamStyles[\"PipeDelimited\"] = \"pipeDelimited\";\n HttpParamStyles[\"DeepObject\"] = \"deepObject\";\n})(HttpParamStyles || (HttpParamStyles = {}));\n\n/**\n * Represents the severity of diagnostics.\n */\nvar DiagnosticSeverity;\n(function (DiagnosticSeverity) {\n /**\n * Something not allowed by the rules of a language or other means.\n */\n DiagnosticSeverity[DiagnosticSeverity[\"Error\"] = 0] = \"Error\";\n /**\n * Something suspicious but allowed.\n */\n DiagnosticSeverity[DiagnosticSeverity[\"Warning\"] = 1] = \"Warning\";\n /**\n * Something to inform about but not a problem.\n */\n DiagnosticSeverity[DiagnosticSeverity[\"Information\"] = 2] = \"Information\";\n /**\n * Something to hint to a better way of doing it, like proposing\n * a refactoring.\n */\n DiagnosticSeverity[DiagnosticSeverity[\"Hint\"] = 3] = \"Hint\";\n})(DiagnosticSeverity || (DiagnosticSeverity = {}));\n\n/**\n * Stoplight node types\n */\nvar NodeType;\n(function (NodeType) {\n NodeType[\"Article\"] = \"article\";\n NodeType[\"HttpService\"] = \"http_service\";\n NodeType[\"HttpServer\"] = \"http_server\";\n NodeType[\"HttpOperation\"] = \"http_operation\";\n NodeType[\"Model\"] = \"model\";\n NodeType[\"Generic\"] = \"generic\";\n NodeType[\"Unknown\"] = \"unknown\";\n NodeType[\"TableOfContents\"] = \"table_of_contents\";\n NodeType[\"SpectralRuleset\"] = \"spectral_ruleset\";\n NodeType[\"Styleguide\"] = \"styleguide\";\n NodeType[\"Image\"] = \"image\";\n})(NodeType || (NodeType = {}));\n/**\n * Node data formats\n */\nvar NodeFormat;\n(function (NodeFormat) {\n NodeFormat[\"Json\"] = \"json\";\n NodeFormat[\"Markdown\"] = \"markdown\";\n NodeFormat[\"Yaml\"] = \"yaml\";\n NodeFormat[\"Apng\"] = \"apng\";\n NodeFormat[\"Avif\"] = \"avif\";\n NodeFormat[\"Bmp\"] = \"bmp\";\n NodeFormat[\"Gif\"] = \"gif\";\n NodeFormat[\"Jpeg\"] = \"jpeg\";\n NodeFormat[\"Png\"] = \"png\";\n NodeFormat[\"Svg\"] = \"svg\";\n NodeFormat[\"Webp\"] = \"webp\";\n})(NodeFormat || (NodeFormat = {}));\n\nexport { DiagnosticSeverity, HttpParamStyles, NodeFormat, NodeType };\n"],"mappings":"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","names":["HttpParamStyles","DiagnosticSeverity","NodeType","NodeFormat"]}