{"id":47372219,"url":"https://github.com/Effect-TS/tsgo","last_synced_at":"2026-04-02T09:01:21.651Z","repository":{"id":343676766,"uuid":"1178615808","full_name":"Effect-TS/tsgo","owner":"Effect-TS","description":"TypeScript-go enhanced with the Effect LSP experience","archived":false,"fork":false,"pushed_at":"2026-03-26T10:30:30.000Z","size":6279,"stargazers_count":49,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T11:56:05.293Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/Effect-TS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["mikearnaldi","gcanti"]}},"created_at":"2026-03-11T07:37:28.000Z","updated_at":"2026-03-26T10:30:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Effect-TS/tsgo","commit_stats":null,"previous_names":["effect-ts/tsgo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Effect-TS/tsgo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Effect-TS%2Ftsgo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Effect-TS%2Ftsgo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Effect-TS%2Ftsgo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Effect-TS%2Ftsgo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Effect-TS","download_url":"https://codeload.github.com/Effect-TS/tsgo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Effect-TS%2Ftsgo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31302337,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T08:44:45.220Z","status":"ssl_error","status_checked_at":"2026-04-02T08:44:41.603Z","response_time":89,"last_error":"SSL_read: 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":[],"created_at":"2026-03-19T05:00:43.782Z","updated_at":"2026-04-02T09:01:21.643Z","avatar_url":"https://github.com/Effect-TS.png","language":"Go","funding_links":["https://github.com/sponsors/mikearnaldi","https://github.com/sponsors/gcanti"],"categories":["Go"],"sub_categories":[],"readme":"# Effect Language Service (TypeScript-Go)\n\nA wrapper around [TypeScript-Go](https://github.com/nicolo-ribaudo/TypeScript-Go) that builds the Effect Language Service, providing Effect-TS diagnostics and quick fixes.\nThis project targets **Effect V4** (codename: \"smol\") primarily and also Effect V3.\n\n## Currently in Alpha\nThe TypeScript-Go version of the Effect LSP should be considered in Alpha. Expect breaking changes between releases and some missing features compared to previous version.\nSome of them are currently on hold due to not yet complete pipeline on the upstream TypeScript repository.\n\n## Installation\n\nThe setup of the TSGO version of the LSP can be performed via the command line interface:\n\n```bash\nnpx @effect/tsgo setup\n```\n\nThis will guide you through the installation process, which includes:\n1. Adding the `@effect/tsgo` dependency to your project.\n2. Configuring your `tsconfig.json` to use the Effect Language Service plugin.\n3. Adjusting plugin options to your preference.\n4. Hinting at any additional editor configuration needed to ensure the LSP is active.\n\n\u003e [!NOTE]\n\u003e At the moment, you still need the standard native TypeScript install (`@typescript/native-preview`) alongside `@effect/tsgo`.\n\n## Diagnostic Status\n\nSome diagnostics are off by default or have a default severity of suggestion, but you can always enable them or change their default severity in the plugin options.\n\n\u003c!-- diagnostics-table:start --\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\u003cth\u003eDiagnostic\u003c/th\u003e\u003cth\u003eSev\u003c/th\u003e\u003cth\u003eFix\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003cth\u003ev3\u003c/th\u003e\u003cth\u003ev4\u003c/th\u003e\u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\u003ctd colspan=\"6\"\u003e\u003cstrong\u003eCorrectness\u003c/strong\u003e \u003cem\u003eWrong, unsafe, or structurally invalid code patterns.\u003c/em\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eanyUnknownInErrorContext\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDetects \u0026#39;any\u0026#39; or \u0026#39;unknown\u0026#39; types in Effect error or requirements channels\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eclassSelfMismatch\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eEnsures Self type parameter matches the class name in ServiceMap/Service/Tag/Schema classes\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eduplicatePackage\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when multiple versions of an Effect-related package are detected in the program\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectFnImplicitAny\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eMirrors noImplicitAny for unannotated Effect.fn, Effect.fnUntraced, and Effect.fnUntracedEager callback parameters when no outer contextual function type exists. Requires TS\u0026#39;s noImplicitAny: true\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003efloatingEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDetects Effect values that are neither yielded nor assigned\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003egenericEffectServices\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003ePrevents services with type parameters that cannot be discriminated at runtime\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emissingEffectContext\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDetects Effect values with unhandled context requirements\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emissingEffectError\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eDetects Effect values with unhandled error types\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emissingLayerContext\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDetects Layer values with unhandled context requirements\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emissingReturnYieldStar\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using return yield* for Effects that never succeed\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emissingStarInYieldEffectGen\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eDetects bare yield (without *) inside Effect generator scopes\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003enonObjectEffectServiceType\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eEnsures Effect.Service types are objects, not primitives\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eoutdatedApi\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDetects usage of APIs that have been removed or renamed in Effect v4\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eoverriddenSchemaConstructor\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e❌\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003ePrevents overriding constructors in Schema classes which breaks decoding behavior\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd colspan=\"6\"\u003e\u003cstrong\u003eAnti-pattern\u003c/strong\u003e \u003cem\u003eDiscouraged patterns that often lead to bugs or confusing behavior.\u003c/em\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003ecatchUnfailableEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using error handling on Effects that never fail\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectFnIife\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eEffect.fn or Effect.fnUntraced is called as an IIFE; use Effect.gen instead\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectGenUsesAdapter\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using the deprecated adapter parameter in Effect.gen\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectInFailure\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when an Effect is used inside an Effect failure channel\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectInVoidSuccess\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDetects nested Effects in void success channels that may cause unexecuted effects\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalErrorInEffectCatch\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when catch callbacks return global Error type instead of typed errors\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalErrorInEffectFailure\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when the global Error type is used in an Effect failure channel\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003elayerMergeAllWithDependencies\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eDetects interdependencies in Layer.mergeAll calls where one layer provides a service that another layer requires\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eleakingRequirements\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDetects implementation services leaked in service methods\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emultipleEffectProvide\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eWarns against chaining Effect.provide calls which can cause service lifecycle issues\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003ereturnEffectInGen\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eWarns when returning an Effect in a generator causes nested Effect\u0026lt;Effect\u0026lt;...\u0026gt;\u0026gt;\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003erunEffectInsideEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Runtime or Effect.run*With methods instead of Effect.run* inside Effect contexts\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eschemaSyncInEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eSuggests using Effect-based Schema methods instead of sync methods inside Effect generators\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003escopeInLayerEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Layer.scoped instead of Layer.effect when Scope is in requirements\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003estrictEffectProvide\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using Effect.provide with layers outside of application entry points\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003etryCatchInEffectGen\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eDiscourages try/catch in Effect generators in favor of Effect error handling\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eunknownInEffectCatch\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e⚠️\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when catch callbacks return unknown instead of typed errors\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd colspan=\"6\"\u003e\u003cstrong\u003eEffect-native\u003c/strong\u003e \u003cem\u003ePrefer Effect-native APIs and abstractions when available.\u003c/em\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eextendsNativeError\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when a class directly extends the native Error class\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalConsole\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using console methods outside Effect generators instead of Effect.log/Logger\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalConsoleInEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using console methods inside Effect generators instead of Effect.log/Logger\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalDate\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using Date.now() or new Date() outside Effect generators instead of Clock/DateTime\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalDateInEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using Date.now() or new Date() inside Effect generators instead of Clock/DateTime\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalFetch\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using the global fetch function outside Effect generators instead of the Effect HTTP client\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalFetchInEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using the global fetch function inside Effect generators instead of the Effect HTTP client\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalRandom\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using Math.random() outside Effect generators instead of the Random service\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalRandomInEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using Math.random() inside Effect generators instead of the Random service\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalTimers\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using setTimeout/setInterval outside Effect generators instead of Effect.sleep/Schedule\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eglobalTimersInEffect\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when using setTimeout/setInterval inside Effect generators instead of Effect.sleep/Schedule\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003einstanceOfSchema\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Schema.is instead of instanceof for Effect Schema types\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003enodeBuiltinImport\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eWarns when importing Node.js built-in modules that have Effect-native counterparts\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003epreferSchemaOverJson\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eSuggests using Effect Schema for JSON operations instead of JSON.parse/JSON.stringify\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd colspan=\"6\"\u003e\u003cstrong\u003eStyle\u003c/strong\u003e \u003cem\u003eCleanup, consistency, and idiomatic Effect code.\u003c/em\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003ecatchAllToMapError\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Effect.mapError instead of Effect.catch + Effect.fail\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003edeterministicKeys\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eEnforces deterministic naming for service/tag/error identifiers based on class names\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectFnOpportunity\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Effect.fn for functions that return an Effect\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectMapVoid\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Effect.asVoid instead of Effect.map(() =\u0026gt; void 0), Effect.map(() =\u0026gt; undefined), or Effect.map(() =\u0026gt; {})\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eeffectSucceedWithVoid\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Effect.void instead of Effect.succeed(undefined) or Effect.succeed(void 0)\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emissedPipeableOpportunity\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using .pipe() for nested function calls\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003emissingEffectServiceDependency\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eChecks that Effect.Service dependencies satisfy all required layer inputs\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eredundantSchemaTagIdentifier\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests removing redundant identifier argument when it equals the tag value in Schema.TaggedClass/TaggedError/TaggedRequest\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eschemaStructWithTag\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests using Schema.TaggedStruct instead of Schema.Struct with _tag field\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eschemaUnionOfLiterals\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests combining multiple Schema.Literal calls in Schema.Union into a single Schema.Literal\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eserviceNotAsClass\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eWarns when ServiceMap.Service is used as a variable instead of a class declaration\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003estrictBooleanExpressions\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e➖\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eEnforces boolean types in conditional expressions for type safety\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eunnecessaryEffectGen\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests removing Effect.gen when it contains only a single return statement\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eunnecessaryFailYieldableError\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSuggests yielding yieldable errors directly instead of wrapping with Effect.fail\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eunnecessaryPipe\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eRemoves pipe calls with no arguments\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003e\u003ccode\u003eunnecessaryPipeChain\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e💡\u003c/td\u003e\u003ctd\u003e🔧\u003c/td\u003e\u003ctd\u003eSimplifies chained pipe calls into a single pipe call\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003ctd\u003e✓\u003c/td\u003e\u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n`➖` off by default, `❌` error, `⚠️` warning, `💬` message, `💡` suggestion, `🔧` quick fix available\n\u003c!-- diagnostics-table:end --\u003e\n\n## Refactor Status\n\n| Refactor | V3 | V4 | Notes |\n|----------|----|----|-------|\n| `asyncAwaitToFn` | ✅ | ✅ | Convert async/await to Effect.fn |\n| `asyncAwaitToFnTryPromise` | ✅ | ✅ | Convert async/await to Effect.fn with Error ADT + tryPromise |\n| `asyncAwaitToGen` | ✅ | ✅ | Convert async/await to Effect.gen |\n| `asyncAwaitToGenTryPromise` | ✅ | ✅ | Convert async/await to Effect.gen with Error ADT + tryPromise |\n| `debugPerformance` | ❌ | ❌ | Insert performance timing debug comments |\n| `effectGenToFn` | ✅ | ✅ | Convert Effect.gen to Effect.fn |\n| `functionToArrow` | ✅ | ✅ | Convert function declaration to arrow function |\n| `layerMagic` | ✅ | ✅ | Auto-compose layers with correct merge/provide |\n| `makeSchemaOpaque` | ✅ | ✅ | Convert Schema to opaque type aliases |\n| `makeSchemaOpaqueWithNs` | ✅ | ✅ | Convert Schema to opaque types with namespace |\n| `pipeableToDatafirst` | ✅ | ✅ | Convert pipeable calls to data-first style |\n| `removeUnnecessaryEffectGen` | ✅ | ✅ | Remove redundant Effect.gen wrapper |\n| `structuralTypeToSchema` | ✅ | ✅ | Generate recursive Schema from type alias |\n| `toggleLazyConst` | ✅ | ✅ | Toggle lazy/eager const declarations |\n| `togglePipeStyle` | ✅ | ✅ | Toggle pipe(x, f) vs x.pipe(f) |\n| `toggleReturnTypeAnnotation` | ✅ | ✅ | Add/remove return type annotation |\n| `toggleTypeAnnotation` | ✅ | ✅ | Add/remove variable type annotation |\n| `typeToEffectSchema` | ✅ | ✅ | Generate Effect.Schema from type alias |\n| `typeToEffectSchemaClass` | ✅ | ✅ | Generate Schema.Class from type alias |\n| `wrapWithEffectGen` | ✅ | ✅ | Wrap expression in Effect.gen |\n| `wrapWithPipe` | ❌ | ✅ | Wrap selection in pipe(...) |\n| `writeTagClassAccessors` | ✅ | ➖ | Generate static accessors for Effect.Service/Tag classes |\n\n### Completion Status\n\n| Completion | V3 | V4 | Notes |\n|------------|----|----|-------|\n| `contextSelfInClasses` | ✅ | ➖ | Context.Tag self-type snippets in extends clauses (V3-only) |\n| `effectDataClasses` | ✅ | ✅ | Data class constructor snippets in extends clauses |\n| `effectSchemaSelfInClasses` | ✅ | ✅ | Schema/Model class constructor snippets in extends clauses |\n| `effectSelfInClasses` | ✅ | ➖ | Effect.Service/Effect.Tag self-type snippets in extends clauses (V3-only) |\n| `genFunctionStar` | ✅ | ✅ | `gen(function*(){})` snippet when dot-accessing `.gen` on objects with callable gen property |\n| `effectCodegensComment` | ✅ | ✅ | `@effect-codegens` directive snippet in comments with codegen name choices |\n| `effectDiagnosticsComment` | ✅ | ✅ | `@effect-diagnostics` / `@effect-diagnostics-next-line` directive snippets in comments |\n| `rpcMakeClasses` | ✅ | ➖ | `Rpc.make` constructor snippet in extends clauses (V3-only) |\n| `schemaBrand` | ✅ | ➖ | `brand(\"varName\")` snippet when dot-accessing Schema in variable declarations (V3-only) |\n| `serviceMapSelfInClasses` | ✅ | ✅ | Service map self-type snippets in extends clauses |\n\n### Codegen Status\n\n| Codegen | V3 | V4 | Notes |\n|---------|----|----|-------|\n| `accessors` | ❌ | ❌ | Generate Service accessor methods from comment directive |\n| `annotate` | ❌ | ❌ | Generate type annotations from comment directive |\n| `typeToSchema` | ❌ | ❌ | Generate Schema from type alias comment directive |\n\n### Rename Status\n\n| Rename | V3 | V4 | Notes |\n|--------|----|----|-------|\n| `keyStrings` | ❌ | ❌ | Extend rename to include key string literals in Effect classes |\n\n## Best Practices\n\n### Relationship to Official TypeScript-Go (`tsgo`)\n\nEffect-tsgo is a **superset** of the official [TypeScript-Go](https://github.com/nicolo-ribaudo/TypeScript-Go) — it embeds a pinned version of `tsgo` with a small patch set on top and adds the Effect language service. This means `effect-tsgo` provides all standard TypeScript-Go functionality plus Effect-specific diagnostics, quick fixes, and refactors.\n\n**Use `effect-tsgo` instead of `tsgo`, not alongside it.** Running both in parallel will produce duplicate diagnostics and degrade editor performance. Configure your editor to use `effect-tsgo` as your sole TypeScript language server.\n\n### Version Pinning\n\nEach release of `effect-tsgo` is built against a specific upstream `tsgo` commit. The pinned commit is recorded in `flake.nix` (`typescript-go-src`). When upstream `tsgo` releases new features or fixes, `effect-tsgo` will adopt them in a subsequent release after validating compatibility with the Effect diagnostics layer.\n\n### When to Upgrade\n\n- Upgrade `effect-tsgo` when a new release includes upstream `tsgo` fixes you need or new Effect diagnostics you want.\n- There is no need to track upstream `tsgo` releases separately — `effect-tsgo` is the single binary to manage.\n\n## Plugin Options\n\n\u003c!-- example-config:start --\u003e\n```jsonc\n{\n  \"compilerOptions\": {\n    \"plugins\": [\n      {\n        \"name\": \"@effect/language-service\",\n        // Controls Effect refactors. (default: true)\n        \"refactors\": true,\n        // Controls Effect diagnostics. (default: true)\n        \"diagnostics\": true,\n        // When false, suggestion-level Effect diagnostics are omitted from tsc CLI output. (default: true)\n        \"includeSuggestionsInTsc\": true,\n        // Controls Effect quickinfo. (default: true)\n        \"quickinfo\": true,\n        // Controls Effect completions. (default: true)\n        \"completions\": true,\n        // Controls Effect goto references support. (default: true)\n        \"goto\": true,\n        // Controls Effect rename helpers. (default: true)\n        \"renames\": true,\n        // When true, suggestion diagnostics do not affect the tsc exit code. (default: true)\n        \"ignoreEffectSuggestionsInTscExitCode\": true,\n        // When true, warning diagnostics do not affect the tsc exit code. (default: false)\n        \"ignoreEffectWarningsInTscExitCode\": false,\n        // When true, error diagnostics do not affect the tsc exit code. (default: false)\n        \"ignoreEffectErrorsInTscExitCode\": false,\n        // When true, disabled diagnostics are still processed so directives can re-enable them. (default: false)\n        \"skipDisabledOptimization\": false,\n        // Mermaid rendering service for layer graph links. Accepts mermaid.live, mermaid.com, or a custom URL. (default: \"mermaid.live\")\n        \"mermaidProvider\": \"mermaid.live\",\n        // When true, suppresses external Mermaid links in hover output. (default: false)\n        \"noExternal\": false,\n        // How many levels deep the layer graph extraction follows symbol references. (default: 0)\n        \"layerGraphFollowDepth\": 0,\n        // When true, suppresses redundant return-type inlay hints on supported Effect generator functions. (default: false)\n        \"inlays\": false,\n        // Package names that should prefer namespace imports. (default: [])\n        \"namespaceImportPackages\": [],\n        // Package names that should prefer barrel named imports. (default: [])\n        \"barrelImportPackages\": [],\n        // Package-level import aliases keyed by package name. (default: {})\n        \"importAliases\": {},\n        // Controls whether named reexports are followed at package top-level. (default: \"ignore\")\n        \"topLevelNamedReexports\": \"ignore\",\n        // Configures key pattern formulas for the deterministicKeys rule. (default: [{\"target\":\"service\",\"pattern\":\"default\",\"skipLeadingPath\":[\"src/\"]},{\"target\":\"custom\",\"pattern\":\"default\",\"skipLeadingPath\":[\"src/\"]}])\n        \"keyPatterns\": [\n          {\n            \"target\": \"service\",\n            \"pattern\": \"default\",\n            \"skipLeadingPath\": [\n              \"src/\"\n            ]\n          },\n          {\n            \"target\": \"custom\",\n            \"pattern\": \"default\",\n            \"skipLeadingPath\": [\n              \"src/\"\n            ]\n          }\n        ],\n        // Enables matching constructors with @effect-identifier annotations. (default: false)\n        \"extendedKeyDetection\": false,\n        // Minimum number of contiguous pipeable transformations to trigger missedPipeableOpportunity. (default: 2)\n        \"pipeableMinArgCount\": 2,\n        // Package names allowed to have multiple versions without triggering duplicatePackage. (default: [])\n        \"allowedDuplicatedPackages\": [],\n        // Controls which effectFnOpportunity quickfix variants are offered. (default: [\"span\"])\n        \"effectFn\": [\n          \"span\"\n        ],\n        // Maps rule names to severity levels. Use {} to enable diagnostics with rule defaults. (default: {})\n        \"diagnosticSeverity\": {},\n        // Ordered per-file diagnostic option overrides. (default: [{\"include\":[\"src/**/*.ts\"],\"options\":{\"diagnosticSeverity\":{\"floatingEffect\":\"error\"}}}])\n        \"overrides\": [\n          {\n            \"include\": [\n              \"src/**/*.ts\"\n            ],\n            \"options\": {\n              \"diagnosticSeverity\": {\n                \"floatingEffect\": \"error\"\n              }\n            }\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\u003c!-- example-config:end --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEffect-TS%2Ftsgo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FEffect-TS%2Ftsgo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEffect-TS%2Ftsgo/lists"}