{"id":14155629,"url":"https://github.com/kravetsone/elysia-autoload","last_synced_at":"2025-04-04T19:10:57.918Z","repository":{"id":214218609,"uuid":"735385540","full_name":"kravetsone/elysia-autoload","owner":"kravetsone","description":"Plugin for Elysia which autoload all routes in directory and code-generate types for Eden","archived":false,"fork":false,"pushed_at":"2025-01-07T20:44:41.000Z","size":267,"stargazers_count":91,"open_issues_count":4,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-31T04:02:43.019Z","etag":null,"topics":["autoload","bun","directory","elysia-plugin","elysiajs","nextjs","plugin","router"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/elysia-autoload","language":"TypeScript","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/kravetsone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-24T18:15:30.000Z","updated_at":"2025-03-11T19:59:55.000Z","dependencies_parsed_at":"2023-12-28T21:21:13.081Z","dependency_job_id":"c561e76e-8adf-4d30-b085-7a444e60382a","html_url":"https://github.com/kravetsone/elysia-autoload","commit_stats":{"total_commits":89,"total_committers":4,"mean_commits":22.25,"dds":0.2359550561797753,"last_synced_commit":"ff4d4785bce70fc544b144a809f70982e77a4814"},"previous_names":["kravetsone/elysia-autoload"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kravetsone%2Felysia-autoload","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kravetsone%2Felysia-autoload/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kravetsone%2Felysia-autoload/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kravetsone%2Felysia-autoload/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kravetsone","download_url":"https://codeload.github.com/kravetsone/elysia-autoload/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247234921,"owners_count":20905854,"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":["autoload","bun","directory","elysia-plugin","elysiajs","nextjs","plugin","router"],"created_at":"2024-08-17T08:04:36.046Z","updated_at":"2025-04-04T19:10:57.901Z","avatar_url":"https://github.com/kravetsone.png","language":"TypeScript","funding_links":[],"categories":["nextjs","TypeScript"],"sub_categories":[],"readme":"# elysia-autoload\n\n\u003cdiv align=\"center\"\u003e\n\n[![npm](https://img.shields.io/npm/v/elysia-autoload?logo=npm\u0026style=flat\u0026labelColor=000\u0026color=3b82f6)](https://www.npmjs.org/package/elysia-autoload)\n[![npm downloads](https://img.shields.io/npm/dw/elysia-autoload?logo=npm\u0026style=flat\u0026labelColor=000\u0026color=3b82f6)](https://www.npmjs.org/package/elysia-autoload)\n\n\u003c!-- [![JSR](https://jsr.io/badges/elysia-autoload)](https://jsr.io/elysia-autoload)\n[![JSR Score](https://jsr.io/badges/elysia-autoload/score)](https://jsr.io/elysia-autoload) --\u003e\n\n\u003c/div\u003e\n\nPlugin for [Elysia](https://elysiajs.com/) which autoload all routes in directory and code-generate types for [Eden](https://elysiajs.com/eden/overview.html) with [`Bun.build`](#bun-build-usage) and **Node adapter** support!\n\n## Installation\n\n### Start new project with [create-elysiajs](https://github.com/kravetsone/create-elysiajs)\n\n```bash\nbun create elysiajs \u003cdirectory-name\u003e\n```\n\nand select `Autoload` in plugins\n\n### Manual\n\n```bash\nbun install elysia-autoload\n```\n\n## Usage\n\n## Register the plugin\n\n```ts\nimport { Elysia } from \"elysia\";\nimport { autoload } from \"elysia-autoload\";\n\nconst app = new Elysia().use(await autoload()).listen(3000);\n\nexport type ElysiaApp = typeof app;\n```\n\n\u003e [!IMPORTANT]\n\u003e We strictly recommend use `await` when registering plugin\n\u003e\n\u003e Read more about [Lazy-load plugins](https://elysiajs.com/patterns/lazy-loading-module.html)\n\n## Create route\n\n```ts\n// routes/index.ts\nimport type { ElysiaApp } from \"app\";\n\nexport default (app: ElysiaApp) =\u003e app.get(\"\", { hello: \"world\" });\n```\n\n### Directory structure\n\nGuide how `elysia-autoload` match routes\n\n```\n├── app.ts\n├── routes\n    ├── index.ts // index routes\n    ├── posts\n        ├── index.ts\n        └── [id].ts // dynamic params\n    ├── likes\n        └── [...].ts // wildcard\n    ├── domains\n        ├── @[...] // wildcard with @ prefix\n            └──index.ts\n    ├── frontend\n        └──index.tsx // usage of tsx extension\n    ├── events\n        └──(post).ts // post and get will not be in the link\n        └──(get).ts\n    └── users.ts\n└── package.json\n```\n\n-   /routes/index.ts → /\n-   /routes/posts/index.ts → /posts\n-   /routes/posts/[id].ts → /posts/:id\n-   /routes/users.ts → /users\n-   /routes/likes/[...].ts → /likes/\\*\n-   /routes/domains/@[...]/index.ts → /domains/@\\*\n-   /routes/frontend/index.tsx → /frontend\n-   /routes/events/(post).ts → /events\n-   /routes/events/(get).ts → /events\n\n## Options\n\n| Key      | Type                                       | Default                            | Description                                                                         |\n| -------- | ------------------------------------------ | ---------------------------------- | ----------------------------------------------------------------------------------- |\n| pattern? | string                                     | \"\\*\\*\\/\\*.{ts,tsx,js,jsx,mjs,cjs}\" | [Glob patterns](\u003chttps://en.wikipedia.org/wiki/Glob_(programming)\u003e)                 |\n| dir?     | string                                     | \"./routes\"                         | The folder where routes are located                                                 |\n| prefix?  | string                                     |                                    | Prefix for routes                                                                   |\n| types?   | boolean \\| [Types Options](#types-options) | false                              | Options to configure type code-generation. if boolean - enables/disables generation |\n| schema?  | Function                                   |                                    | Handler for providing routes guard schema                                           |\n\n### Types Options\n\n| Key        | Type               | Default             | Description                                                                             |\n| ---------- | ------------------ | ------------------- | --------------------------------------------------------------------------------------- |\n| output?    | string \\| string[] | \"./routes-types.ts\" | Type code-generation output. It can be an array                                         |\n| typeName?  | string             | \"Routes\"            | Name for code-generated global type for [Eden](https://elysiajs.com/eden/overview.html) |\n| useExport? | boolean            | false               | Use export instead of global type                                                       |\n\n### Usage of types code-generation for [Eden](https://elysiajs.com/eden/overview.html)\n\n```ts\n// app.ts\nimport { Elysia } from \"elysia\";\nimport { autoload } from \"elysia-autoload\";\n\nconst app = new Elysia()\n    .use(\n        await autoload({\n            types: {\n                output: \"./routes.ts\",\n                typeName: \"Routes\",\n            }, // or pass true for use default params\n        })\n    )\n    .listen(3000);\n\nexport type ElysiaApp = typeof app;\n```\n\n```ts\n// client.ts\n\nimport { treaty } from \"@elysiajs/eden\";\n\n// Routes are a global type so you don't need to import it.\n\nconst app = treaty\u003cRoutes\u003e(\"http://localhost:3002\");\n\nconst { data } = await app.test[\"some-path-param\"].get({\n    query: {\n        key: 2,\n    },\n});\n\nconsole.log(data);\n```\n\n`routes.ts` will be:\n\n```ts\n// @filename: routes.ts\n\nimport type { ElysiaWithBaseUrl } from \"elysia-autoload\";\nimport type Route0 from \"./routes/index\";\nimport type Route1 from \"./routes/test/[some]/index\";\n\ndeclare global {\n    export type Routes = ElysiaWithBaseUrl\u003c\"/api\", typeof Route0\u003e \u0026\n        ElysiaWithBaseUrl\u003c\"/api/test/:some\", typeof Route1\u003e;\n}\n```\n\nExample of app with types code-generation you can see in [example](https://github.com/kravetsone/elysia-autoload/tree/main/example)\n\n### [Bun build](https://bun.sh/docs/bundler) usage\n\nYou can use this plugin with [`Bun.build`](https://bun.sh/docs/bundler), thanks to [esbuild-plugin-autoload](https://github.com/kravetsone/esbuild-plugin-autoload)!\n\n```ts\n// @filename: build.ts\nimport { autoload } from \"esbuild-plugin-autoload\"; // default import also supported\n\nawait Bun.build({\n    entrypoints: [\"src/index.ts\"],\n    target: \"bun\",\n    outdir: \"out\",\n    plugins: [autoload()],\n}).then(console.log);\n```\n\nThen, build it with `bun build.ts` and run with `bun out/index.ts`.\n\n### [Bun compile](https://bun.sh/docs/bundler/executables) usage\n\nYou can bundle and then compile it into a [single executable binary file](https://bun.sh/docs/bundler/executables)\n\n```ts\nimport { autoload } from \"esbuild-plugin-autoload\"; // default import also supported\n\nawait Bun.build({\n    entrypoints: [\"src/index.ts\"],\n    target: \"bun\",\n    outdir: \"out\",\n    plugins: [autoload()],\n}).then(console.log);\n\nawait Bun.$`bun build --compile out/index.js`;\n```\n\n\u003e [!WARNING]\n\u003e You cannot use it in `bun build --compile` mode without extra step ([Feature issue](https://github.com/oven-sh/bun/issues/11895))\n\n[Read more](https://github.com/kravetsone/esbuild-plugin-autoload)\n\n### Usage of schema handler\n\n```ts\nimport swagger from \"@elysiajs/swagger\";\nimport Elysia from \"elysia\";\nimport { autoload } from \"elysia-autoload\";\n\nconst app = new Elysia()\n    .use(\n        await autoload({\n            schema: ({ path, url }) =\u003e {\n                const tag = url.split(\"/\").at(1)!;\n\n                return {\n                    beforeHandle: ({ request }) =\u003e {\n                        console.log(request.url);\n                    },\n                    detail: {\n                        description: `Route autoloaded from ${path}`,\n                        tags: [tag],\n                    },\n                };\n            },\n        })\n    )\n    .use(swagger());\n\nexport type ElysiaApp = typeof app;\n\napp.listen(3001, console.log);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkravetsone%2Felysia-autoload","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkravetsone%2Felysia-autoload","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkravetsone%2Felysia-autoload/lists"}