{"id":13847201,"url":"https://github.com/gadget-inc/wds","last_synced_at":"2026-01-24T09:07:57.434Z","repository":{"id":38376727,"uuid":"322363944","full_name":"gadget-inc/wds","owner":"gadget-inc","description":"Real fast development reloading for server side TypeScript projects.","archived":false,"fork":false,"pushed_at":"2025-10-15T17:06:10.000Z","size":1146,"stargazers_count":114,"open_issues_count":11,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-11-18T14:38:44.617Z","etag":null,"topics":["nodejs","nodemon","typescript"],"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/gadget-inc.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":"Contributing.md","funding":null,"license":"LICENSE.txt","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-12-17T17:19:30.000Z","updated_at":"2025-10-15T17:06:14.000Z","dependencies_parsed_at":"2024-02-11T19:55:17.583Z","dependency_job_id":"490c948d-db38-490e-87d0-96d34c1d06a5","html_url":"https://github.com/gadget-inc/wds","commit_stats":{"total_commits":139,"total_committers":10,"mean_commits":13.9,"dds":0.3453237410071942,"last_synced_commit":"66f6d4e65bdfbf2b38429cc44c6478607d0314eb"},"previous_names":["gadget-inc/esbuild-dev"],"tags_count":127,"template":false,"template_full_name":null,"purl":"pkg:github/gadget-inc/wds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gadget-inc%2Fwds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gadget-inc%2Fwds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gadget-inc%2Fwds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gadget-inc%2Fwds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gadget-inc","download_url":"https://codeload.github.com/gadget-inc/wds/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gadget-inc%2Fwds/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28722121,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T08:27:05.734Z","status":"ssl_error","status_checked_at":"2026-01-24T08:27:01.197Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["nodejs","nodemon","typescript"],"created_at":"2024-08-04T18:01:13.008Z","updated_at":"2026-01-24T09:07:57.430Z","avatar_url":"https://github.com/gadget-inc.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# wds\n\nA reloading dev server for server side TypeScript projects. Compiles TypeScript _real_ fast, on demand, using ESM loaders and `require.extensions`. Similar to and inspired by `ts-node-dev` and `tsx`.\n\nwds stands for Whirlwind (or web) Development Server.\n\n## Examples\n\nAfter installing `wds`, you can use it like you might use the `node` command line program:\n\n```shell\n# run one script with wds compiling TS to JS\nwds some-script.ts\n\n# run one server with wds `watch` mode, re-running the server on any file changes\nwds --watch some-server.ts\n\n# run one script with node command line arguments that you'd normally pass to `node`\nwds --inspect some-test.test.ts\n```\n\n## Features\n\n- Builds and runs TypeScript really fast using [`swc`](https://github.com/swc-project/swc)\n- Incrementally rebuilds only what has changed in `--watch` mode, restarting the process on file changes\n- Full support for CommonJS and ESM packages (subject to node's own interoperability rules)\n- Great support for really huge projects and monorepos\n- Caches transformed files on disk for warm startups on process reload (with expiry when config or source changes)\n- Execute commands on demand with the `--commands` mode\n- Plays nice with node.js command line flags like `--inspect` or `--prof`\n- Supports node.js `ipc` channels between the process starting `wds` and the node.js process started by `wds`.\n- Produces sourcemaps which Just Work™️ by default for debugging with many editors (VSCode, IntelliJ, etc)\n- Monorepo aware, allowing for different configuration per package and only compiling what is actually required from the monorepo context\n\n## Motivation\n\nYou deserve to get stuff done. You deserve a fast iteration loop. If you're writing TypeScript for node, you still deserve to have a fast iteration loop, but with big codebases, `tsc` can get quite slow. Instead, you can use a fast TS =\u003e JS transpiler like `swc` to quickly reload your runtime code and get to the point where you know if your code is working as fast as possible. This means a small sacrifice: `tsc` no longer typechecks your code as you run it, and so you must supplement with typechecking in your editor or in CI.\n\nThis tool prioritizes rebooting a node.js TypeScript project as fast as possible. This means it _doesn't_ typecheck. Type checking gets prohibitively slow at scale, so we recommend using this separate typechecker approach that still gives you valuable feedback out of band. That way, you don't have to wait for it to see if your change actually worked. We usually don't run anything other than VSCode's TypeScript integration locally, and then run a full `tsc --noEmit` in CI.\n\n## Usage\n\n```text\nOptions:\n      --help       Show help                                           [boolean]\n      --version    Show version number                                 [boolean]\n  -c, --commands   Trigger commands by watching for them on stdin. Prevents\n                   stdin from being forwarded to the process. Only command right\n                   now is `rs` to restart the server. [boolean] [default: false]\n  -w, --watch      Trigger restarts by watching for changes to required files\n                                                      [boolean] [default: false]\n  -s, --supervise  Supervise and restart the process when it exits indefinitely\n                                                      [boolean] [default: false]\n```\n\n## Configuration\n\nConfiguration for `wds` is done by adding a `wds.js` file to your pacakge root, and optionally a `.swcrc` file if using `swc` as your compiler backend.\n\nAn `wds.js` file needs to export an object like so:\n\n```javascript\nmodule.exports = {\n  // which file extensions to build, defaults to .js, .jsx, .ts, .tsx extensions\n  extensions: [\".tsx\", \".ts\", \".mdx\"],\n\n  // file paths to explicitly not transform for speed, defaults to [], plus whatever the compiler backend excludes by default, which is `node_modules` for swc\n  ignore: [\"spec/integration/**/node_modules\", \"spec/**/*.spec.ts\", \"cypress/\", \"public/\"],\n};\n```\n\n### When using `swc` (the default)\n\n`swc` is the fastest TypeScript compiler we've found and is the default compiler `wds` uses. `wds` sets up a default `swc` config suitable for compiling to JS for running in Node:\n\n```jsonc\n{\n  \"jsc\": {\n    \"parser\": {\n      \"syntax\": \"typescript\",\n      \"decorators\": true,\n      \"dynamicImport\": true\n    },\n    \"target\": \"es2020\"\n  },\n  \"module\": {\n    \"type\": \"commonjs\",\n    // turn on lazy imports for maximum reboot performance\n    \"lazy\": true\n  }\n}\n```\n\n**Note**: the above config is _different_ than the default swc config. It's been honed to give maximum performance for server start time, but can be adjusted by creating your own `.swcrc` file.\n\nConfiguring `swc`'s compiler options with with `wds` can be done using the `wds.js` file. Create a file named `wds.js` in the root of your repository with content like this:\n\n```javascript\n// wds.js\nmodule.exports = {\n  swc: {\n    env: {\n      targets: {\n        node: 12,\n      },\n    },\n  },\n};\n```\n\nYou can also use `swc`'s built in configuration mechanism which is an `.swcrc` file. Using an `.swcrc` file is useful in order to share `swc` configuration between `wds` and other tools that might use `swc` under the hood as well, like `@swc/jest`. To stop using `wds`'s default config and use the config from a `.swcrc` file, you must configure wds to do so using `wds.js` like so:\n\n```javascript\n// in wds.js\nmodule.exports = {\n  swc: \".swcrc\",\n};\n```\n\nAnd then, you can use `swc`'s standard syntax for the `.swcrc` file\n\n```jsonc\n// in .swcrc, these are the defaults wds uses\n{\n  \"jsc\": {\n    \"parser\": {\n      \"syntax\": \"typescript\",\n      \"decorators\": true,\n      \"dynamicImport\": true\n    },\n    \"target\": \"es2022\"\n  },\n  \"module\": {\n    \"type\": \"commonjs\",\n    // turn on lazy imports for maximum reboot performance\n    \"lazy\": true\n  }\n}\n```\n\nRefer to [the SWC docs](https://swc.rs/docs/configuration/swcrc) for more info.\n\n# Comparison to `ts-node-dev`\n\n`ts-node-dev` (and `ts-node`) accomplish a similar feat but are often 5-10x slower than `wds` in big projects. They are loaded with features and will keep up with new TypeScript features much better as they use the mainline TypeScript compiler sources, and we think they make lots of sense! Because they use TypeScript proper for compilation though, even with `--transpile-only`, they are destined to be slower than `swc`. `wds` is for the times where you care a lot more about performance and are ok with the tradeoffs `swc` makes, like not supporting `const enum` and being a touch behind on supporting new TypeScript releases.\n\n# Comparison to `tsx`\n\n`tsx` is a great, low-config TypeScript runner with a similar just-transpile-and-dont-typecheck approach. But, it has slower startup when run for the first time, and fewer fancy optimizations for restarting really large projects that use the `lazy: true` option in SWC to maximize reload speed. `wds` shines brightest when used as Gadget uses it against a many-million line TypeScript monorepo.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgadget-inc%2Fwds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgadget-inc%2Fwds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgadget-inc%2Fwds/lists"}