{"id":13463781,"url":"https://github.com/swvl/express-versioned-route","last_synced_at":"2025-03-16T20:15:08.990Z","repository":{"id":38081428,"uuid":"244823136","full_name":"swvl/express-versioned-route","owner":"swvl","description":"Simple express.js 4.x extension, to add support for versioned routes.","archived":false,"fork":false,"pushed_at":"2023-03-04T06:19:14.000Z","size":2710,"stargazers_count":7,"open_issues_count":21,"forks_count":1,"subscribers_count":47,"default_branch":"master","last_synced_at":"2025-03-06T09:57:01.643Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://swvl.github.io/express-versioned-route/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swvl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-03-04T06:18:55.000Z","updated_at":"2024-10-16T04:56:55.000Z","dependencies_parsed_at":"2024-01-13T17:54:52.079Z","dependency_job_id":"d133bfeb-2f5c-46a3-bd94-c218c62d3906","html_url":"https://github.com/swvl/express-versioned-route","commit_stats":{"total_commits":67,"total_committers":7,"mean_commits":9.571428571428571,"dds":0.4029850746268657,"last_synced_commit":"0664d9c4ef6c1678f522a063aea67603ec089110"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swvl%2Fexpress-versioned-route","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swvl%2Fexpress-versioned-route/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swvl%2Fexpress-versioned-route/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swvl%2Fexpress-versioned-route/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swvl","download_url":"https://codeload.github.com/swvl/express-versioned-route/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243926072,"owners_count":20369910,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T14:00:28.463Z","updated_at":"2025-03-16T20:15:08.964Z","avatar_url":"https://github.com/swvl.png","language":"JavaScript","funding_links":[],"categories":["Projects"],"sub_categories":["Web and Publishing"],"readme":"# Express-Versioned-Route\n\nSimple express.js 4.x extension, to add support for versioned routes.\n\n[![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)\n[![codecov](https://codecov.io/gh/swvl/express-versioned-route/branch/master/graph/badge.svg)](https://codecov.io/gh/swvl/express-versioned-route)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=security_rating)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=sqale_index)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=bugs)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=code_smells)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=duplicated_lines_density)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=swvl_express-versioned-route\u0026metric=ncloc)](https://sonarcloud.io/dashboard?id=swvl_express-versioned-route)\n\n## Highlights\n\n- Versioning the same route\n- Loading time validation\n- Custom middlewares for each version\n- Built-in soft deprecation policy\n- Case insensitive name matching\n- Minimal overhead ( less than 0.15ms/request )\n- Dynamic routing based on client headers\n- Client can choose specific version using `accept-version` header\n\n## installation\n- Update your .npmrc file: `echo \"@swvl:registry=https://npm.pkg.github.com\" \u003e\u003e .npmrc`\n- Then install the package: `npm install @swvl/express-versioned-route`\n\n## Usage\n\n```js\nconst searchVersionDef = versionsDef()({\n  versions: {\n    simpleSearch: ['2020-Q1', searchMW1, searchMW2, searchHandlerV1],\n    dynamicSearch: [dynamicSearchMW1, dynamicSearchMW2, searchHandlerV2, 'default'],\n    superSearch: [searchHandlerV3],\n    deepSearch: [searchHandlerV4],\n  },\n  Android: [\n    [400, 'simpleSearch'],\n    [450, 'dynamicSearch'],\n    [500, 'superSearch'],\n  ],\n  iOS: [\n    [400, 'simpleSearch'],\n    [460, 'dynamicSearch'],\n  ],\n});\n\napp.get('/search', mw1, mw2, searchVersionDef);\n```\n\n#### Expected user headers\n\n* device-os \u0026 build-number\n* accept-version\n\n[![Try it live on RunKit](https://badge.runkitcdn.com/@swvl/express-versioned-route.svg)](https://runkit.com/swvl/express-versioned-route)\n\n## Options\n\nGlobal options can be passed as 1st parameter for versionsDef function, or configured as part of versionsDef specs\n\n#### Example\n```js\nconst searchVersionDef = versionsDef(globalOptions)({\n  versions: {\n    ...\n  }\n  ...,\n  options: {\n    ...\n  }\n});\n```\n\n#### Supported options\n\n\u003ctable\u003e\n\u003ctr\u003e\n  \u003ctd\u003e \u003cb\u003e prop name \u003c/b\u003e \u003c/td\u003e\n  \u003ctd\u003e \u003cb\u003e description \u003c/b\u003e \u003c/td\u003e\n  \u003ctd\u003e \u003cb\u003e default \u003c/b\u003e \u003c/td\u003e\n\u003c/tr\u003e\n  \n\u003ctr\u003e\n  \u003ctd\u003e onDeprecated \u003c/td\u003e\n  \u003ctd\u003e callback  \u003c/td\u003e\n  \u003ctd\u003e\n    \u003cpre\u003e\n(versionName, req)=\u003e {} \n    \u003c/pre\u003e\n  \u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n  \u003ctd\u003e allowClientRequestFallbackToDefaultVersion \u003c/td\u003e\n  \u003ctd\u003e invalid client headers will fallback to default version instead of 404 \u003c/td\u003e\n  \u003ctd\u003e true \u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n  \u003ctd\u003e onClientSelection \u003c/td\u003e\n  \u003ctd\u003e configure how client should be selected based on req \u003c/td\u003e\n  \u003ctd\u003e \n    \u003cpre\u003e\nonClientSelection: req =\u003e {\n  return {\n    name: req.headers['device-os'],\n    buildNumber: req.headers['build-number'],\n  };\n}\n    \u003c/pre\u003e\n  \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\n## License\n\n[Apache-2.0](\u003chttps://tldrlegal.com/license/apache-license-2.0-(apache-2.0)\u003e)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswvl%2Fexpress-versioned-route","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswvl%2Fexpress-versioned-route","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswvl%2Fexpress-versioned-route/lists"}