{"id":31195174,"url":"https://github.com/p-j/eapi","last_synced_at":"2025-09-20T02:22:21.892Z","repository":{"id":42081987,"uuid":"312585973","full_name":"p-j/eapi","owner":"p-j","description":"Edge API, building APIs on the Edge with Cloudflare Workers. Building blocks to work with the EAPI Worker Template.","archived":false,"fork":false,"pushed_at":"2023-11-13T03:42:28.000Z","size":727,"stargazers_count":14,"open_issues_count":2,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-08-13T03:30:03.520Z","etag":null,"topics":["cloudflare-worker","cloudflare-workers","eapi","eapi-packages","edge","middleware","middlewares-functions","typescript","typescript-definitions"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/p-j.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-11-13T13:40:19.000Z","updated_at":"2023-05-15T16:39:44.000Z","dependencies_parsed_at":"2023-10-11T00:46:43.420Z","dependency_job_id":"16921c62-31fd-4710-ae39-b26fcc4a98e7","html_url":"https://github.com/p-j/eapi","commit_stats":{"total_commits":166,"total_committers":10,"mean_commits":16.6,"dds":"0.37951807228915657","last_synced_commit":"e43f1f19eab45627d9d8735ae44a4a33fad9910d"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"purl":"pkg:github/p-j/eapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/p-j%2Feapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/p-j%2Feapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/p-j%2Feapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/p-j%2Feapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/p-j","download_url":"https://codeload.github.com/p-j/eapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/p-j%2Feapi/sbom","scorecard":{"id":716646,"data":{"date":"2025-08-11","repo":{"name":"github.com/p-j/eapi","commit":"e43f1f19eab45627d9d8735ae44a4a33fad9910d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/p-j/eapi/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/p-j/eapi/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/p-j/eapi/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/p-j/eapi/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/p-j/eapi/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/p-j/eapi/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/p-j/eapi/release.yml/main?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Code-Review","score":0,"reason":"Found 0/5 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"27 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-3j8f-xvm3-ffx4","Warn: Project is vulnerable to: GHSA-j9fq-vwqv-2fm2","Warn: Project is vulnerable to: GHSA-pqw5-jmp5-px4v","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T09:54:00.369Z","repository_id":42081987,"created_at":"2025-08-22T09:54:00.369Z","updated_at":"2025-08-22T09:54:00.369Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276033097,"owners_count":25573478,"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","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["cloudflare-worker","cloudflare-workers","eapi","eapi-packages","edge","middleware","middlewares-functions","typescript","typescript-definitions"],"created_at":"2025-09-20T02:22:17.615Z","updated_at":"2025-09-20T02:22:21.883Z","avatar_url":"https://github.com/p-j.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EAPI\n\n\u003e EAPI for Edge API, or Extremelly Awesome Programming Interface, you decide 😎\n\n[![lerna](https://img.shields.io/badge/build%20with-lerna-cc00ff?style=flat-square)](https://lerna.js.org/)\n[![lerna](https://img.shields.io/badge/released%20with-changeset-blue?style=flat-square)](https://github.com/atlassian/changesets/)\n[![codecov](https://img.shields.io/codecov/c/github/p-j/eapi?style=flat-square)](https://codecov.io/gh/p-j/eapi)\n[![Build Status](https://img.shields.io/github/workflow/status/p-j/eapi/Build?style=flat-square)](https://github.com/p-j/eapi/actions?query=workflow%3ABuild)\n[![License](https://img.shields.io/github/license/p-j/eapi?style=flat-square)](./LICENSE)\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fp-j%2Feapi.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fp-j%2Feapi?ref=badge_shield)\n\n## What are EAPI packages?\n\nIt's a collection of common building blocks you can use to build scalable and composable API at the Edge using [Cloudflare Workers](https://workers.cloudflare.com/) and TypeScript.\n\nWhile EAPI packages are meant to work together with [`p-j/worker-eapi-template`](https://github.com/p-j/worker-eapi-template), you can also use them as standalone functions as [demonstrated below](https://github.com/p-j/eapi#standalone).\n\n| Package                                                                        | Description                                  | Version                                                                                                                                                     | Changelog                                                                                                                                        |\n| ------------------------------------------------------------------------------ | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |\n| [`@p-j/eapi-middleware-cache`](./packages/eapi-middleware-cache)               | Configure browser \u0026 CDN cache                | [![version](https://img.shields.io/npm/v/@p-j/eapi-middleware-cache?style=flat-square)](https://npmjs.com/package/@p-j/eapi-middleware-cache)               | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-middleware-cache)        |\n| [`@p-j/eapi-middleware-cors`](./packages/eapi-middleware-cors)                 | Validate Origin \u0026 Apply CORS Headers         | [![version](https://img.shields.io/npm/v/@p-j/eapi-middleware-cors?style=flat-square)](https://npmjs.com/package/@p-j/eapi-middleware-cors)                 | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-middleware-cors)         |\n| [`@p-j/eapi-middleware-errorhandler`](./packages/eapi-middleware-errorhandler) | Catch exceptions, forward them or print them | [![version](https://img.shields.io/npm/v/@p-j/eapi-middleware-errorhandler?style=flat-square)](https://npmjs.com/package/@p-j/eapi-middleware-errorhandler) | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-middleware-errorhandler) |\n| [`@p-j/eapi-middleware-redirect`](./packages/eapi-middleware-redirect)         | Redirect, Rewrite or Proxy Requests          | [![version](https://img.shields.io/npm/v/@p-j/eapi-middleware-redirect?style=flat-square)](https://npmjs.com/package/@p-j/eapi-middleware-redirect)         | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-middleware-redirect)     |\n| [`@p-j/eapi-middleware-headers`](./packages/eapi-middleware-headers)           | Add/Remove headers on Request \u0026 Response     | [![version](https://img.shields.io/npm/v/@p-j/eapi-middleware-headers?style=flat-square)](https://npmjs.com/package/@p-j/eapi-middleware-headers)           | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-middleware-headers)      |\n| [`@p-j/eapi-util-applymiddlewares`](./packages/eapi-util-applymiddlewares)     | A utility to combine multiple middlewares    | [![version](https://img.shields.io/npm/v/@p-j/eapi-util-applymiddlewares?style=flat-square)](https://npmjs.com/package/@p-j/eapi-util-applymiddlewares)     | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-util-applymiddlewares)   |\n| [`@p-j/eapi-util-fetcheventhandler`](./packages/eapi-util-fetcheventhandler)   | Apply global middlewares \u0026 Match Routes      | [![version](https://img.shields.io/npm/v/@p-j/eapi-util-fetcheventhandler?style=flat-square)](https://npmjs.com/package/@p-j/eapi-util-fetcheventhandler)   | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-util-fetcheventhandler)  |\n| [`@p-j/eapi-types`](./packages/eapi-types)                                     | Common TypeScript typings for EAPI projects  | [![version](https://img.shields.io/npm/v/@p-j/eapi-types?style=flat-square)](https://npmjs.com/package/@p-j/eapi-types)                                     | [![changelog](https://img.shields.io/badge/changelog-%2B-lightgrey?style=flat-square)](https://changelogs.xyz/@p-j/eapi-types)                   |\n\n## Usage\n\n### Middlewares\n\n`eapi-middleware-*` packages are providing Middleware Factory, that, given a number of options, will return actual Middlewares functions.\nThe middlewares functions can then be applied to the request handler `middlware(requestHandler)` and returns an enhanced request handler.\nThe [type definitions](https://github.com/p-j/eapi/blob/main/packages/eapi-types/index.d.ts) can help you better understand how things work together.\n\n#### With [`@p-j/worker-eapi-template`](https://github.com/p-j/worker-eapi-template)\n\nThat's the recommended way of using this middlewares as it was built with this integration in mind.\nThis example is already setup in [`@p-j/worker-eapi-template`](https://github.com/p-j/worker-eapi-template)\n\n```ts\n// src/router.ts\n\nimport { Router } from 'tiny-request-router'\nimport { withCache } from '@p-j/eapi-middleware-cache'\nimport { withErrorHandler } from '@p-j/eapi-middleware-errorhandler'\nimport { applyMiddlewares } from '@p-j/eapi-util-applymiddlewares'\n\nconst TTL_30MINUTES = 60 * 30\n\nfunction requestHandler({ event, request, params }: RequestContext): Response {\n  return new Response('Hello World!')\n}\n\n/**\n * Route definitions\n */\nexport const router = new Router()\nrouter.all(\n  '/',\n  applyMiddlewares(\n    requestHandler,\n    withErrorHandler({ enableDebug: true }),\n    withCache({\n      cacheControl: `public, max-age=${TTL_30MINUTES}`,\n      cdnTtl: TTL_30MINUTES,\n    }),\n  ),\n)\n\n// The router is then used to match request in the src/index.ts\n```\n\n#### With EAPI toolkit\n\nCombining some of the EAPI tools while not embracing the whole template, you can build an extensible setup that allow you to easily apply a variaty of middlewares.\n\n```ts\nimport { withCache } from '@p-j/eapi-middleware-cache'\nimport { applyMiddlewares } from '@p-j/eapi-util-applymiddlewares'\nimport { withAwesomeMiddleware } from './withAwesomeMiddleware'\n\nfunction requestHandler({ event, request, params }: RequestContext): Response {\n  return new Response('Hello World!')\n}\n\naddEventListener('fetch', (event) =\u003e {\n  const requestContext = { event, request: event.request, params: {} }\n  // apply all the middlewares on top of the original handler\n  const handler = applyMiddlewares(\n    requestHandler,\n    withCache({\n      cacheControl: 'public, max-age=3600',\n      cdnTtl: 3600,\n    }),\n    withAwesomeMiddleware(),\n  )\n  // use the enhanced handler to respond\n  event.respondWith(handler(requestContext))\n})\n```\n\n#### Standalone\n\nWhile this middleware is intended to be used with [`@p-j/worker-eapi-template`](https://github.com/p-j/worker-eapi-template), you can also make use of it without any other EAPI dependency.\n\n```ts\nimport { withCache } from '@p-j/eapi-middleware-cache'\n\nfunction requestHandler({ event, request, params }: RequestContext): Response {\n  return new Response('Hello World!')\n}\n\n// withCache is a Middleware Factory, here we get back a \"pre configured\" middleware\nconst cacheForOneHour = withCache({ cacheControl: 'public; max-age=3600' })\n// apply the middleware to the request handler\nconst finalRequestHandler = cacheForOneHour(requestHandler)\n\naddEventListener('fetch', (event) =\u003e {\n  // The only constraints is that the RequestHandler needs to take in a RequestContext\n  const requestContext = { event, request: event.request, params: {} }\n  // use the enhanced request handler to build the response\n  event.respondWith(finaleRequestHandler(requestContext))\n})\n```\n\n## API\n\n- [`@p-j/eapi-middleware-cache`](./packages/eapi-middleware-cache)\n- [`@p-j/eapi-middleware-cors`](./packages/eapi-middleware-cors)\n- [`@p-j/eapi-middleware-errorhandler`](./packages/eapi-middleware-errorHandler)\n- [`@p-j/eapi-middleware-redirect`](./packages/eapi-middleware-redirect)\n- [`@p-j/eapi-middleware-headers`](./packages/eapi-middleware-headers)\n- [`@p-j/eapi-util-applymiddlewares`](./packages/eapi-util-applyMiddlewares)\n- [`@p-j/eapi-util-fetcheventhandler`](./packages/eapi-util-fetchEventHandler)\n\n## Types\n\n- [`@p-j/eapi-types`](./packages/eapy-types)\n\n## Contributing\n\n### Creating your own Middleware\n\nAs you create your own middlewares to extend your application a few things should be considered:\n\n#### Making use of factory functions\n\nBy convention and to facilitate evolution without breaking changes, middleware are usually returned by a factory function, even if at the beginning they don't take in any options.\n\nYou may want to consider doing the same for your own middlewares, especially if you plan on opensourcing them.\n\n#### Making use of the provided types\n\nWhile nothing prevents you from using all the eapi-\\* packages in a Javascript project, using TypeScript will a whole lot to the table with very limited friction. You can check [`@p-j/worker-eapi-template`](https://github.com/p-j/worker-eapi-template) as an example or inspiration for your own configuration.\n\n[`@p-j/eapi-types`](./packages/eapi-types) contains types that are useful for building compatible functions. You may want to depend on it to ensure compatibility.\n\n#### Making them discoverable\n\nFeel free to use the eapi-\\* naming if your middleware is compatible, and the eapi tag on github \u0026 npm to ensure discoverability.\n\n### Contributing to this repository\n\nPull Request are welcome to add more middlewares, utility or request handler to this collection.\n\n## License\n\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fp-j%2Feapi.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fp-j%2Feapi?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fp-j%2Feapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fp-j%2Feapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fp-j%2Feapi/lists"}