diff --git a/.changeset/cache-generated-shims.md b/.changeset/cache-generated-shims.md
deleted file mode 100644
index e71b1f60..00000000
--- a/.changeset/cache-generated-shims.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@effect/tsgo": patch
----
-
-Cache generated TypeScript-Go shims by their effective inputs during local repository setup and CI runs.
diff --git a/.changeset/non-interactive-setup.md b/.changeset/non-interactive-setup.md
deleted file mode 100644
index 9f44abb3..00000000
--- a/.changeset/non-interactive-setup.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@effect/tsgo": minor
----
-
-Add a non-interactive `setup` workflow with explicit project, integration, diagnostic, editor, preview, and apply options. Setup now also recommends running the package manager install command whenever it changes `package.json`.
diff --git a/.changeset/quiet-trees-flow.md b/.changeset/quiet-trees-flow.md
new file mode 100644
index 00000000..ea288cf9
--- /dev/null
+++ b/.changeset/quiet-trees-flow.md
@@ -0,0 +1,5 @@
+---
+"@effect/tsgo": patch
+---
+
+Exclude type-only heritage nodes from execution flow graphs across supported TypeScript versions.
diff --git a/.github/workflows/update-upstreams.yml b/.github/workflows/update-upstreams.yml
index 5990f029..2b813bee 100644
--- a/.github/workflows/update-upstreams.yml
+++ b/.github/workflows/update-upstreams.yml
@@ -33,6 +33,8 @@ jobs:
- name: Update upstream metadata
id: upstream
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: pnpm exec repoctl upstream update
- name: Open metadata update pull request
@@ -40,12 +42,13 @@ jobs:
if: steps.upstream.outputs.has_changes == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ PR_BODY: ${{ steps.upstream.outputs.description }}
run: |
pnpm exec repoctl github open-pr-if-changed \
--base main \
--head update-upstreams \
--title 'chore: update upstreams' \
- --body 'Automated update of TypeScript-Go upstream component tags.' \
+ --body "$PR_BODY" \
--commit-message 'chore: update upstream metadata' \
--check generation_check_id='Generate TypeScript next tag'
@@ -85,12 +88,13 @@ jobs:
if: steps.upstream.outputs.has_changes == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ PR_BODY: ${{ steps.upstream.outputs.description }}
run: |
pnpm exec repoctl github open-pr-if-changed \
--base main \
--head update-upstreams \
--title 'chore: update upstreams' \
- --body 'Automated update of upstream metadata, generated TypeScript next-tag sources, and Nix inputs.' \
+ --body "$PR_BODY" \
--commit-message 'chore: generate TypeScript next tag' \
--check validation_check_id='Validate TypeScript next tag'
diff --git a/.github/workflows/validate-oxlint.yml b/.github/workflows/validate-oxlint.yml
index 808089e3..679694c5 100644
--- a/.github/workflows/validate-oxlint.yml
+++ b/.github/workflows/validate-oxlint.yml
@@ -68,6 +68,9 @@ jobs:
--version "${{ matrix.oxlint.version }}"
--target linux-x64
+ - name: Build @effect/tsgo package
+ run: pnpm --filter @effect/tsgo build
+
- name: Smoke test Oxlint runtime
env:
TSGOLINT_PATH: ${{ steps.tsgolint.outputs.artifact_path }}
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index 58d3eda2..3577d61c 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -51,5 +51,13 @@ jobs:
if: matrix.repoctl
run: pnpm run check:repoctl && pnpm run test:repoctl
+ - name: Install golangci-lint
+ if: matrix.repoctl
+ run: go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.9.0
+
+ - name: Lint
+ if: matrix.repoctl
+ run: pnpm lint
+
- name: Test
run: pnpm exec repoctl test
diff --git a/README.md b/README.md
index 467db20c..c3922582 100644
--- a/README.md
+++ b/README.md
@@ -29,7 +29,7 @@ The Effect LSP doubles as a tool to perform type-aware linting of Effect code, a
Linting can occur either during the `tsc` typecheck phase (with the benefit of running typechecking only once and caching the output), or via a dedicated `npx @effect/tsgo diagnostics --project tsconfig.json` command (with typechecking occurring again), or via the Oxlint Patch.
-See the Oxlint Setup guide for instructions on how to install and configure Oxlint with the Effect LSP.
+See the Oxlint Setup guide for instructions on how to install and configure Oxlint with the Effect LSP.
When running in `tsc` mode, the Effect diagnostics are emitted as standard TypeScript diagnostics, and can be configured to affect the `tsc` exit code through the options `ignoreEffectSuggestionsInTscExitCode`, `ignoreEffectWarningsInTscExitCode`, and `ignoreEffectErrorsInTscExitCode`.
@@ -46,104 +46,104 @@ Some diagnostics are off by default or have a default severity of suggestion, bu
| Correctness Wrong, unsafe, or structurally invalid code patterns. |
- anyUnknownInErrorContext | Detects 'any' or 'unknown' types in Effect error or requirements channels |
- classSelfMismatch | Ensures Self type parameter matches the class name in Context/Service/Tag/Schema classes |
- duplicatePackage | Warns when multiple versions of an Effect-related package are detected in the program |
- effectFnImplicitAny | Mirrors noImplicitAny for unannotated Effect.fn, Effect.fnUntraced, and Effect.fnUntracedEager callback parameters when no outer contextual function type exists. Requires TS's noImplicitAny: true |
- floatingEffect | Detects Effect values that are neither yielded nor assigned |
- floatingEffectInVitest | Detects Effects returned from non-Effect-aware Vitest callbacks |
- genericEffectServices | Prevents services with type parameters that cannot be discriminated at runtime |
- missingEffectContext | Detects Effect values with unhandled context requirements |
- missingEffectError | Detects Effect values with unhandled error types |
- missingLayerContext | Detects Layer values with unhandled context requirements |
- missingReturnYieldStar | Suggests using return yield* for Effects that never succeed |
- missingStarInYieldEffectGen | Detects bare yield (without *) inside Effect generator scopes |
- nonObjectEffectServiceType | Ensures Effect.Service types are objects, not primitives |
- outdatedApi | Detects usage of APIs that have been removed or renamed in Effect v4 |
- overriddenSchemaConstructor | Prevents overriding constructors in Schema classes which breaks decoding behavior |
- promiseInEffectSuccess | Detects Promise types in Effect success channels where they are not awaited |
- schemaLiteralNonFinite | Reports statically known non-finite numbers passed to Schema literal constructors |
- schemaOpaqueInstanceMember | Disallows instance members in classes extending Schema.Opaque |
+ anyUnknownInErrorContext | Detects 'any' or 'unknown' types in Effect error or requirements channels |
+ classSelfMismatch | Ensures Self type parameter matches the class name in Context/Service/Tag/Schema classes |
+ duplicatePackage | Warns when multiple versions of an Effect-related package are detected in the program |
+ effectFnImplicitAny | Mirrors noImplicitAny for unannotated Effect.fn, Effect.fnUntraced, and Effect.fnUntracedEager callback parameters when no outer contextual function type exists. Requires TS's noImplicitAny: true |
+ floatingEffect | Detects Effect values that are neither yielded nor assigned |
+ floatingEffectInVitest | Detects Effects returned from non-Effect-aware Vitest callbacks |
+ genericEffectServices | Prevents services with type parameters that cannot be discriminated at runtime |
+ missingEffectContext | Detects Effect values with unhandled context requirements |
+ missingEffectError | Detects Effect values with unhandled error types |
+ missingLayerContext | Detects Layer values with unhandled context requirements |
+ missingReturnYieldStar | Suggests using return yield* for Effects that never succeed |
+ missingStarInYieldEffectGen | Detects bare yield (without *) inside Effect generator scopes |
+ nonObjectEffectServiceType | Ensures Effect.Service types are objects, not primitives |
+ outdatedApi | Detects usage of APIs that have been removed or renamed in Effect v4 |
+ overriddenSchemaConstructor | Prevents overriding constructors in Schema classes which breaks decoding behavior |
+ promiseInEffectSuccess | Detects Promise types in Effect success channels where they are not awaited |
+ schemaLiteralNonFinite | Reports statically known non-finite numbers passed to Schema literal constructors |
+ schemaOpaqueInstanceMember | Disallows instance members in classes extending Schema.Opaque |
| Anti-pattern Discouraged patterns that often lead to bugs or confusing behavior. |
- catchUnfailableEffect | Warns when using error handling on Effects that never fail |
- effectFnIife | Effect.fn or Effect.fnUntraced is called as an IIFE; use Effect.gen instead |
- effectGenUsesAdapter | Warns when using the deprecated adapter parameter in Effect.gen |
- effectInFailure | Warns when an Effect is used inside an Effect failure channel |
- effectInVoidSuccess | Detects nested Effects in void success channels that may cause unexecuted effects |
- globalErrorInEffectCatch | Warns when catch callbacks return global Error type instead of typed errors |
- globalErrorInEffectFailure | Warns when the global Error type is used in an Effect failure channel |
- layerMergeAllWithDependencies | Detects interdependencies in Layer.mergeAll calls where one layer provides a service that another layer requires |
- lazyEffect | Suggests avoiding exported zero-argument functions and service members that lazily return Effect or Stream values |
- lazyPromiseInEffectSync | Warns when Effect.sync lazily returns a Promise instead of using an async Effect constructor |
- leakingRequirements | Detects implementation services leaked in service methods |
- multipleEffectProvide | Warns against chaining Effect.provide calls which can cause service lifecycle issues |
- preferUnsafeConstructor | Suggests replacing Effect.runSync of a pure effect constructor with the synchronous *Unsafe variant exported by the same module |
- returnEffectInGen | Warns when returning an Effect in a generator causes nested Effect<Effect<...>> |
- runEffectInsideEffect | Suggests using Runtime or Effect.run*With methods instead of Effect.run* inside Effect contexts |
- schemaSyncInEffect | Suggests using Effect-based Schema methods instead of sync methods inside Effect generators |
- scopeInLayerEffect | Suggests using Layer.scoped instead of Layer.effect when Scope is in requirements |
- strictEffectProvide | Warns when using Effect.provide with layers outside of application entry points |
- tryCatchInEffectGen | Discourages try/catch in Effect generators in favor of Effect error handling |
- unknownInEffectCatch | Warns when catch callbacks return unknown instead of typed errors |
+ catchUnfailableEffect | Warns when using error handling on Effects that never fail |
+ effectFnIife | Effect.fn or Effect.fnUntraced is called as an IIFE; use Effect.gen instead |
+ effectGenUsesAdapter | Warns when using the deprecated adapter parameter in Effect.gen |
+ effectInFailure | Warns when an Effect is used inside an Effect failure channel |
+ effectInVoidSuccess | Detects nested Effects in void success channels that may cause unexecuted effects |
+ globalErrorInEffectCatch | Warns when catch callbacks return global Error type instead of typed errors |
+ globalErrorInEffectFailure | Warns when the global Error type is used in an Effect failure channel |
+ layerMergeAllWithDependencies | Detects interdependencies in Layer.mergeAll calls where one layer provides a service that another layer requires |
+ lazyEffect | Suggests avoiding exported zero-argument functions and service members that lazily return Effect or Stream values |
+ lazyPromiseInEffectSync | Warns when Effect.sync lazily returns a Promise instead of using an async Effect constructor |
+ leakingRequirements | Detects implementation services leaked in service methods |
+ multipleEffectProvide | Warns against chaining Effect.provide calls which can cause service lifecycle issues |
+ preferUnsafeConstructor | Suggests replacing Effect.runSync of a pure effect constructor with the synchronous *Unsafe variant exported by the same module |
+ returnEffectInGen | Warns when returning an Effect in a generator causes nested Effect<Effect<...>> |
+ runEffectInsideEffect | Suggests using Runtime or Effect.run*With methods instead of Effect.run* inside Effect contexts |
+ schemaSyncInEffect | Suggests using Effect-based Schema methods instead of sync methods inside Effect generators |
+ scopeInLayerEffect | Suggests using Layer.scoped instead of Layer.effect when Scope is in requirements |
+ strictEffectProvide | Warns when using Effect.provide with layers outside of application entry points |
+ tryCatchInEffectGen | Discourages try/catch in Effect generators in favor of Effect error handling |
+ unknownInEffectCatch | Warns when catch callbacks return unknown instead of typed errors |
| Effect-native Prefer Effect-native APIs and abstractions when available. |
- abortControllerInEffect | Warns when manually constructing AbortController inside Effect generators instead of using Effect.abortSignal |
- asyncFunction | Warns when declaring async functions and suggests using Effect values and Effect.gen for async control flow |
- cryptoRandomUUID | Warns when using crypto.randomUUID() outside Effect generators instead of the Effect Random module, which uses Effect-injected randomness rather than the crypto module behind the scenes |
- cryptoRandomUUIDInEffect | Warns when using crypto.randomUUID() inside Effect generators instead of the Effect Random module, which uses Effect-injected randomness rather than the crypto module behind the scenes |
- extendsNativeError | Warns when a class directly extends the native Error class |
- globalConsole | Warns when using console methods outside Effect generators instead of Effect.log/Logger |
- globalConsoleInEffect | Warns when using console methods inside Effect generators instead of Effect.log/Logger |
- globalDate | Warns when using Date.now() or new Date() outside Effect generators instead of Clock/DateTime |
- globalDateInEffect | Warns when using Date.now() or new Date() inside Effect generators instead of Clock/DateTime |
- globalFetch | Warns when using the global fetch function outside Effect generators instead of the Effect HTTP client |
- globalFetchInEffect | Warns when using the global fetch function inside Effect generators instead of the Effect HTTP client |
- globalRandom | Warns when using Math.random() outside Effect generators instead of the Random service |
- globalRandomInEffect | Warns when using Math.random() inside Effect generators instead of the Random service |
- globalTimers | Warns when using setTimeout/setInterval outside Effect generators instead of Effect.sleep/Schedule |
- globalTimersInEffect | Warns when using setTimeout/setInterval inside Effect generators instead of Effect.sleep/Schedule |
- instanceOfSchema | Suggests using Schema.is instead of instanceof for Effect Schema types |
- newPromise | Warns when constructing promises with new Promise instead of using Effect APIs |
- nodeBuiltinImport | Warns when importing Node.js built-in modules that have Effect-native counterparts |
- preferSchemaOverJson | Suggests using Effect Schema for JSON operations instead of JSON.parse/JSON.stringify |
- processEnv | Warns when reading process.env outside Effect generators instead of using Effect Config |
- processEnvInEffect | Warns when reading process.env inside Effect generators instead of using Effect Config |
- unsafeEffectTypeAssertion | Detects unsafe type assertions that narrow Effect, Stream, or Layer error or requirements channels |
+ abortControllerInEffect | Warns when manually constructing AbortController inside Effect generators instead of using Effect.abortSignal |
+ asyncFunction | Warns when declaring async functions and suggests using Effect values and Effect.gen for async control flow |
+ cryptoRandomUUID | Warns when using crypto.randomUUID() outside Effect generators instead of the Effect Random module, which uses Effect-injected randomness rather than the crypto module behind the scenes |
+ cryptoRandomUUIDInEffect | Warns when using crypto.randomUUID() inside Effect generators instead of the Effect Random module, which uses Effect-injected randomness rather than the crypto module behind the scenes |
+ extendsNativeError | Warns when a class directly extends the native Error class |
+ globalConsole | Warns when using console methods outside Effect generators instead of Effect.log/Logger |
+ globalConsoleInEffect | Warns when using console methods inside Effect generators instead of Effect.log/Logger |
+ globalDate | Warns when using Date.now() or new Date() outside Effect generators instead of Clock/DateTime |
+ globalDateInEffect | Warns when using Date.now() or new Date() inside Effect generators instead of Clock/DateTime |
+ globalFetch | Warns when using the global fetch function outside Effect generators instead of the Effect HTTP client |
+ globalFetchInEffect | Warns when using the global fetch function inside Effect generators instead of the Effect HTTP client |
+ globalRandom | Warns when using Math.random() outside Effect generators instead of the Random service |
+ globalRandomInEffect | Warns when using Math.random() inside Effect generators instead of the Random service |
+ globalTimers | Warns when using setTimeout/setInterval outside Effect generators instead of Effect.sleep/Schedule |
+ globalTimersInEffect | Warns when using setTimeout/setInterval inside Effect generators instead of Effect.sleep/Schedule |
+ instanceOfSchema | Suggests using Schema.is instead of instanceof for Effect Schema types |
+ newPromise | Warns when constructing promises with new Promise instead of using Effect APIs |
+ nodeBuiltinImport | Warns when importing Node.js built-in modules that have Effect-native counterparts |
+ preferSchemaOverJson | Suggests using Effect Schema for JSON operations instead of JSON.parse/JSON.stringify |
+ processEnv | Warns when reading process.env outside Effect generators instead of using Effect Config |
+ processEnvInEffect | Warns when reading process.env inside Effect generators instead of using Effect Config |
+ unsafeEffectTypeAssertion | Detects unsafe type assertions that narrow Effect, Stream, or Layer error or requirements channels |
| Style Cleanup, consistency, and idiomatic Effect code. |
- catchAllToMapError | Suggests using Effect.mapError instead of Effect.catch + Effect.fail |
- catchChainToFirstSuccessOf | Suggests Effect.firstSuccessOf for consecutive error-independent Effect.catch fallbacks when the error type is preserved |
- catchTagToCatchReason | Suggests Effect.catchReason or Effect.catchReasons for handlers that re-fail unmatched reason._tag branches |
- catchToIgnore | Suggests using Effect.ignore or Effect.ignoreCause instead of Effect.catch/catchCause returning Effect.void |
- catchToOrElseSucceed | Suggests using Effect.orElseSucceed instead of Effect.catch + Effect.succeed |
- deterministicKeys | Enforces deterministic naming for service/tag/error identifiers based on class names |
- effectDoNotation | Suggests using Effect.gen or Effect.fn instead of the Effect.Do notation helpers |
- effectFnOpportunity | Suggests using Effect.fn for functions that return an Effect |
- effectMapFlatten | Suggests using Effect.flatMap instead of Effect.map followed by Effect.flatten in piping flows |
- effectMapVoid | Suggests using Effect.asVoid instead of Effect.map(() => void 0), Effect.map(() => undefined), or Effect.map(() => {}) |
- effectSucceedWithVoid | Suggests using Effect.void instead of Effect.succeed(undefined) or Effect.succeed(void 0) |
- flatMapToMap | Suggests using Effect.map instead of Effect.flatMap when the callback only wraps its result with Effect.succeed |
- missedPipeableOpportunity | Suggests using .pipe() for nested function calls |
- missingEffectServiceDependency | Checks that Effect.Service dependencies satisfy all required layer inputs |
- missingPipeableSignature | Reports exported fixed-arity functions whose call signatures have no corresponding pipeable overload |
- multipleCatchTag | Suggests collapsing consecutive Effect.catchTag transformations into a single Effect.catchTags call when semantics stay equivalent |
- nestedEffectGenYield | Warns when yielding a nested bare Effect.gen inside an existing Effect generator context |
- newSchemaClass | Suggests using Schema make instead of new for Schema classes |
- preferSchemaTypeProperty | Disallows Schema.Schema.Type<typeof X> in favor of typeof X.Type |
- preferTypedSchemaDecoder | Suggests typed Schema decoders when the input is assignable to the schema's Encoded type |
- redundantMapError | Suggests hoisting a repeated trailing Effect.mapError from every yield in an Effect generator |
- redundantOrDie | Suggests hoisting a repeated trailing Effect.orDie from every yield in an Effect generator |
- redundantSchemaTagIdentifier | Suggests removing redundant identifier argument when it equals the tag value in Schema.TaggedClass/TaggedError/TaggedRequest |
- schemaNumber | Suggests Schema.Finite and Schema.FiniteFromString instead of Schema.Number APIs when describing domain numbers |
- schemaStructWithTag | Suggests using Schema.TaggedStruct instead of Schema.Struct with _tag field |
- schemaUnionOfLiterals | Suggests combining multiple Schema.Literal calls in Schema.Union into a single Schema.Literal |
- serviceNotAsClass | Warns when Context.Service is used as a variable instead of a class declaration |
- strictBooleanExpressions | Enforces boolean types in conditional expressions for type safety |
- syncToSucceed | Suggests using Effect.succeed instead of Effect.sync when the thunk returns a constant value |
- unnecessaryArrowBlock | Suggests using a concise arrow body when the block only returns an expression |
- unnecessaryEffectGen | Suggests removing Effect.gen when it contains only a single return statement |
- unnecessaryFailYieldableError | Suggests yielding yieldable errors directly instead of wrapping with Effect.fail |
- unnecessaryPipe | Removes pipe calls with no arguments |
- unnecessaryPipeChain | Simplifies chained pipe calls into a single pipe call |
- unnecessaryTypeofType | Suggests replacing typeof Schema.Type style annotations with the matching named type when available |
+ catchAllToMapError | Suggests using Effect.mapError instead of Effect.catch + Effect.fail |
+ catchChainToFirstSuccessOf | Suggests Effect.firstSuccessOf for consecutive error-independent Effect.catch fallbacks when the error type is preserved |
+ catchTagToCatchReason | Suggests Effect.catchReason or Effect.catchReasons for handlers that re-fail unmatched reason._tag branches |
+ catchToIgnore | Suggests using Effect.ignore or Effect.ignoreCause instead of Effect.catch/catchCause returning Effect.void |
+ catchToOrElseSucceed | Suggests using Effect.orElseSucceed instead of Effect.catch + Effect.succeed |
+ deterministicKeys | Enforces deterministic naming for service/tag/error identifiers based on class names |
+ effectDoNotation | Suggests using Effect.gen or Effect.fn instead of the Effect.Do notation helpers |
+ effectFnOpportunity | Suggests using Effect.fn for functions that return an Effect |
+ effectMapFlatten | Suggests using Effect.flatMap instead of Effect.map followed by Effect.flatten in piping flows |
+ effectMapVoid | Suggests using Effect.asVoid instead of Effect.map(() => void 0), Effect.map(() => undefined), or Effect.map(() => {}) |
+ effectSucceedWithVoid | Suggests using Effect.void instead of Effect.succeed(undefined) or Effect.succeed(void 0) |
+ flatMapToMap | Suggests using Effect.map instead of Effect.flatMap when the callback only wraps its result with Effect.succeed |
+ missedPipeableOpportunity | Suggests using .pipe() for nested function calls |
+ missingEffectServiceDependency | Checks that Effect.Service dependencies satisfy all required layer inputs |
+ missingPipeableSignature | Reports exported fixed-arity functions whose call signatures have no corresponding pipeable overload |
+ multipleCatchTag | Suggests collapsing consecutive Effect.catchTag transformations into a single Effect.catchTags call when semantics stay equivalent |
+ nestedEffectGenYield | Warns when yielding a nested bare Effect.gen inside an existing Effect generator context |
+ newSchemaClass | Suggests using Schema make instead of new for Schema classes |
+ preferSchemaTypeProperty | Disallows Schema.Schema.Type<typeof X> in favor of typeof X.Type |
+ preferTypedSchemaDecoder | Suggests typed Schema decoders when the input is assignable to the schema's Encoded type |
+ redundantMapError | Suggests hoisting a repeated trailing Effect.mapError from every yield in an Effect generator |
+ redundantOrDie | Suggests hoisting a repeated trailing Effect.orDie from every yield in an Effect generator |
+ redundantSchemaTagIdentifier | Suggests removing redundant identifier argument when it equals the tag value in Schema.TaggedClass/TaggedError/TaggedRequest |
+ schemaNumber | Suggests Schema.Finite and Schema.FiniteFromString instead of Schema.Number APIs when describing domain numbers |
+ schemaStructWithTag | Suggests using Schema.TaggedStruct instead of Schema.Struct with _tag field |
+ schemaUnionOfLiterals | Suggests combining multiple Schema.Literal calls in Schema.Union into a single Schema.Literal |
+ serviceNotAsClass | Warns when Context.Service is used as a variable instead of a class declaration |
+ strictBooleanExpressions | Enforces boolean types in conditional expressions for type safety |
+ syncToSucceed | Suggests using Effect.succeed instead of Effect.sync when the thunk returns a constant value |
+ unnecessaryArrowBlock | Suggests using a concise arrow body when the block only returns an expression |
+ unnecessaryEffectGen | Suggests removing Effect.gen when it contains only a single return statement |
+ unnecessaryFailYieldableError | Suggests yielding yieldable errors directly instead of wrapping with Effect.fail |
+ unnecessaryPipe | Removes pipe calls with no arguments |
+ unnecessaryPipeChain | Simplifies chained pipe calls into a single pipe call |
+ unnecessaryTypeofType | Suggests replacing typeof Schema.Type style annotations with the matching named type when available |
diff --git a/_packages/tsgo-darwin-arm64/CHANGELOG.md b/_packages/tsgo-darwin-arm64/CHANGELOG.md
index 57050fb6..d043b398 100644
--- a/_packages/tsgo-darwin-arm64/CHANGELOG.md
+++ b/_packages/tsgo-darwin-arm64/CHANGELOG.md
@@ -1,5 +1,19 @@
# @effect/tsgo-darwin-arm64
+## 0.36.4
+
+## 0.36.3
+
+## 0.36.2
+
+## 0.36.1
+
+## 0.36.0
+
+## 0.35.0
+
+## 0.34.0
+
## 0.33.0
## 0.32.1
diff --git a/_packages/tsgo-darwin-arm64/package.json b/_packages/tsgo-darwin-arm64/package.json
index e265f9d6..2394146b 100644
--- a/_packages/tsgo-darwin-arm64/package.json
+++ b/_packages/tsgo-darwin-arm64/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo-darwin-arm64",
- "version": "0.33.0",
+ "version": "0.36.4",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
"repository": {
diff --git a/_packages/tsgo-darwin-x64/CHANGELOG.md b/_packages/tsgo-darwin-x64/CHANGELOG.md
index 7cf90a27..760cca23 100644
--- a/_packages/tsgo-darwin-x64/CHANGELOG.md
+++ b/_packages/tsgo-darwin-x64/CHANGELOG.md
@@ -1,5 +1,19 @@
# @effect/tsgo-darwin-x64
+## 0.36.4
+
+## 0.36.3
+
+## 0.36.2
+
+## 0.36.1
+
+## 0.36.0
+
+## 0.35.0
+
+## 0.34.0
+
## 0.33.0
## 0.32.1
diff --git a/_packages/tsgo-darwin-x64/package.json b/_packages/tsgo-darwin-x64/package.json
index 62662e98..a5b6c9e1 100644
--- a/_packages/tsgo-darwin-x64/package.json
+++ b/_packages/tsgo-darwin-x64/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo-darwin-x64",
- "version": "0.33.0",
+ "version": "0.36.4",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
"repository": {
diff --git a/_packages/tsgo-linux-arm/CHANGELOG.md b/_packages/tsgo-linux-arm/CHANGELOG.md
index bea7cf56..7f21b730 100644
--- a/_packages/tsgo-linux-arm/CHANGELOG.md
+++ b/_packages/tsgo-linux-arm/CHANGELOG.md
@@ -1,5 +1,19 @@
# @effect/tsgo-linux-arm
+## 0.36.4
+
+## 0.36.3
+
+## 0.36.2
+
+## 0.36.1
+
+## 0.36.0
+
+## 0.35.0
+
+## 0.34.0
+
## 0.33.0
## 0.32.1
diff --git a/_packages/tsgo-linux-arm/package.json b/_packages/tsgo-linux-arm/package.json
index c6cb4e72..977f9886 100644
--- a/_packages/tsgo-linux-arm/package.json
+++ b/_packages/tsgo-linux-arm/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo-linux-arm",
- "version": "0.33.0",
+ "version": "0.36.4",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
"repository": {
diff --git a/_packages/tsgo-linux-arm64/CHANGELOG.md b/_packages/tsgo-linux-arm64/CHANGELOG.md
index f3f659fe..ad7b51ff 100644
--- a/_packages/tsgo-linux-arm64/CHANGELOG.md
+++ b/_packages/tsgo-linux-arm64/CHANGELOG.md
@@ -1,5 +1,19 @@
# @effect/tsgo-linux-arm64
+## 0.36.4
+
+## 0.36.3
+
+## 0.36.2
+
+## 0.36.1
+
+## 0.36.0
+
+## 0.35.0
+
+## 0.34.0
+
## 0.33.0
## 0.32.1
diff --git a/_packages/tsgo-linux-arm64/package.json b/_packages/tsgo-linux-arm64/package.json
index d018c2a8..38ddca9c 100644
--- a/_packages/tsgo-linux-arm64/package.json
+++ b/_packages/tsgo-linux-arm64/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo-linux-arm64",
- "version": "0.33.0",
+ "version": "0.36.4",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
"repository": {
diff --git a/_packages/tsgo-linux-x64/CHANGELOG.md b/_packages/tsgo-linux-x64/CHANGELOG.md
index 4c2d061c..276d50d0 100644
--- a/_packages/tsgo-linux-x64/CHANGELOG.md
+++ b/_packages/tsgo-linux-x64/CHANGELOG.md
@@ -1,5 +1,19 @@
# @effect/tsgo-linux-x64
+## 0.36.4
+
+## 0.36.3
+
+## 0.36.2
+
+## 0.36.1
+
+## 0.36.0
+
+## 0.35.0
+
+## 0.34.0
+
## 0.33.0
## 0.32.1
diff --git a/_packages/tsgo-linux-x64/package.json b/_packages/tsgo-linux-x64/package.json
index 9581b7c4..478b0eb7 100644
--- a/_packages/tsgo-linux-x64/package.json
+++ b/_packages/tsgo-linux-x64/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo-linux-x64",
- "version": "0.33.0",
+ "version": "0.36.4",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
"repository": {
diff --git a/_packages/tsgo-win32-arm64/CHANGELOG.md b/_packages/tsgo-win32-arm64/CHANGELOG.md
index 14860086..9db3546e 100644
--- a/_packages/tsgo-win32-arm64/CHANGELOG.md
+++ b/_packages/tsgo-win32-arm64/CHANGELOG.md
@@ -1,5 +1,19 @@
# @effect/tsgo-win32-arm64
+## 0.36.4
+
+## 0.36.3
+
+## 0.36.2
+
+## 0.36.1
+
+## 0.36.0
+
+## 0.35.0
+
+## 0.34.0
+
## 0.33.0
## 0.32.1
diff --git a/_packages/tsgo-win32-arm64/package.json b/_packages/tsgo-win32-arm64/package.json
index 27767b2d..3f112fe1 100644
--- a/_packages/tsgo-win32-arm64/package.json
+++ b/_packages/tsgo-win32-arm64/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo-win32-arm64",
- "version": "0.33.0",
+ "version": "0.36.4",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
"repository": {
diff --git a/_packages/tsgo-win32-x64/CHANGELOG.md b/_packages/tsgo-win32-x64/CHANGELOG.md
index 0275fde8..90d54829 100644
--- a/_packages/tsgo-win32-x64/CHANGELOG.md
+++ b/_packages/tsgo-win32-x64/CHANGELOG.md
@@ -1,5 +1,19 @@
# @effect/tsgo-win32-x64
+## 0.36.4
+
+## 0.36.3
+
+## 0.36.2
+
+## 0.36.1
+
+## 0.36.0
+
+## 0.35.0
+
+## 0.34.0
+
## 0.33.0
## 0.32.1
diff --git a/_packages/tsgo-win32-x64/package.json b/_packages/tsgo-win32-x64/package.json
index f80a20d3..83f2ebaf 100644
--- a/_packages/tsgo-win32-x64/package.json
+++ b/_packages/tsgo-win32-x64/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo-win32-x64",
- "version": "0.33.0",
+ "version": "0.36.4",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
"repository": {
diff --git a/_packages/tsgo/.gitignore b/_packages/tsgo/.gitignore
index f2276e5f..5baa34a7 100644
--- a/_packages/tsgo/.gitignore
+++ b/_packages/tsgo/.gitignore
@@ -2,4 +2,5 @@ dist/
node_modules/
README.md
oxlint-schema.json
+oxlint-presets/
schema.json
diff --git a/_packages/tsgo/CHANGELOG.md b/_packages/tsgo/CHANGELOG.md
index d2a37649..71487b0b 100644
--- a/_packages/tsgo/CHANGELOG.md
+++ b/_packages/tsgo/CHANGELOG.md
@@ -1,5 +1,70 @@
# @effect/tsgo
+## 0.36.4
+
+### Patch Changes
+
+- 7a616ec: Allow declaration emit with `noEmitOnError` when all diagnostics are ignored Effect diagnostics.
+
+## 0.36.3
+
+### Patch Changes
+
+- 73f7f28: Refresh patched binaries when an updated `@effect/tsgo` package provides a different replacement artifact.
+- 9190801: Update Effect v4 dependencies and embedded test fixtures to `4.0.0-beta.107`.
+
+## 0.36.2
+
+### Patch Changes
+
+- 8362acc: Extend the walker-rule prefilter to call expressions.
+
+ A call expression's type is its resolved signature's return type, and both the signature and that return type are already cached from the main check phase. `NodeCouldBeStrictEffect` now consults them for call nodes and skips the expensive flow-analysis re-check when the declared return type conclusively cannot be a strict Effect. Signature-less calls, optional chains, and every inconclusive return type stay conservative, and `promiseInEffectSuccess` no longer computes a location type for calls only to discard it. Emitted diagnostics are unchanged; on a large Effect monorepo build this removes a further ~4.6% of wall time on top of the reference-node prefilter, bringing the total Effect diagnostics overhead versus a pristine tsgo build of the same commit down to ~17%.
+- 9020153: Skip diagnostic rules below the minimum visible severity before executing them.
+
+ In `tsc` CLI mode without `includeSuggestionsInTsc`, suggestion- and message-severity diagnostics are dropped from the output after rules run. The rule runner now receives the minimum severity the caller can surface and skips such rules up front, avoiding their type-checker queries entirely. A rule below the threshold still runs when any directive in the file references it (for example `// @effect-diagnostics ruleName:error` or a wildcard), since directives can raise its severity and must be tracked for `unusedDirective` reporting. Emitted diagnostics are unchanged; on a large Effect monorepo build this removes roughly 1–2s of check time.
+- 257af25: Skip flow-analysis type queries for references that conclusively cannot be an Effect.
+
+ The `effectInFailure` and `promiseInEffectSuccess` rules walk every node of a file and query its flow type just to test whether it is a strict Effect type. The new `TypeParser.NodeCouldBeStrictEffect` prefilter inspects the referenced symbol's declared type first — flow narrowing can only refine the declared type, so a declared type that conclusively contains no possibly-Effect constituent (primitives, plain objects with a different type name, unions thereof) can never produce a strict Effect flow type, and the expensive query is skipped. The predicate is conservative: `any`/`unknown`, type parameters, conditionals, symbol-less types, and deep unions always fall through to the full query. Emitted diagnostics are unchanged; on a large Effect monorepo build this removes ~10% of build wall time (~2.7s of ~26.8s).
+
+## 0.36.1
+
+### Patch Changes
+
+- 4db1d4b: Preserve existing indentation and newline styles when setup updates JSON configuration files.
+- c154a04: Update the TypeScript next tag to [`typescript@next`](https://www.npmjs.com/package/typescript/v/7.1.0-dev.20260808.1), which ships [`typescript-go`](https://github.com/microsoft/typescript-go/commit/24fabe95acba758c05fcb349bf427a3a0c8ad676) commit `24fabe95acba758c05fcb349bf427a3a0c8ad676`, and update the TypeScript latest tag to [`typescript@latest`](https://www.npmjs.com/package/typescript/v/7.0.2).
+
+## 0.36.0
+
+### Minor Changes
+
+- 8423f68: Add recommended and category-specific shared configurations for Oxlint.
+
+## 0.35.0
+
+### Minor Changes
+
+- f25821b: Generate detailed upstream update pull request descriptions with explicit version changes and the TypeScript-Go commits introduced by the update.
+
+### Patch Changes
+
+- 3fe06c8: Avoid false positive TS2731 diagnostics for symbol-valued interpolations in tagged template literals when Effect diagnostic rules traverse the template expression.
+- 989964b: Prevent `preferTypedSchemaDecoder` from panicking when a decoder input is produced by a preceding call or pipe transformation.
+- 86c30b1: Persist Effect plugin options in TypeScript build information so incremental builds recheck semantic diagnostics when extended tsconfig plugin settings change.
+- b8e7314: Update the TypeScript next tag to [`typescript@next`](https://www.npmjs.com/package/typescript/v/7.1.0-dev.20260806.1), which ships [`typescript-go`](https://github.com/microsoft/typescript-go/commit/86cc4767d4ebadb9b7845d0ab8eb2b05785c3fee) commit `86cc4767d4ebadb9b7845d0ab8eb2b05785c3fee`, and update the TypeScript latest tag to [`typescript@latest`](https://www.npmjs.com/package/typescript/v/7.0.2).
+
+## 0.34.0
+
+### Minor Changes
+
+- 974513e: Add a non-interactive `setup` workflow with explicit project, integration, diagnostic, editor, preview, and apply options. Setup now also recommends running the package manager install command whenever it changes `package.json`.
+
+### Patch Changes
+
+- ba4ec9a: Cache generated TypeScript-Go shims by their effective inputs during local repository setup and CI runs.
+- 6d0ffda: Remove unused internal helpers and add dead-code analysis to the repository lint workflow.
+- 892021a: Use absolute GitHub URLs for links in the published README so documentation links remain clickable on npm.
+
## 0.33.0
### Minor Changes
diff --git a/_packages/tsgo/package.json b/_packages/tsgo/package.json
index bff941b3..74ed4bec 100644
--- a/_packages/tsgo/package.json
+++ b/_packages/tsgo/package.json
@@ -1,6 +1,6 @@
{
"name": "@effect/tsgo",
- "version": "0.33.0",
+ "version": "0.36.4",
"type": "module",
"description": "Effect Language Service for TypeScript-Go — Effect-specific diagnostics and hover features.",
"license": "MIT",
@@ -31,12 +31,20 @@
"./lib/getExePath": {
"types": "./lib/getExePath.d.ts",
"default": "./lib/getExePath.js"
+ },
+ "./oxlint-presets": {
+ "types": "./oxlint-presets/index.d.ts",
+ "default": "./oxlint-presets/index.js"
+ },
+ "./oxlint-presets/*.json": {
+ "default": "./oxlint-presets/*.json"
}
},
"files": [
"dist/",
"lib/",
"README.md",
+ "oxlint-presets/",
"oxlint-schema.json",
"schema.json"
],
@@ -50,12 +58,12 @@
"@effect/tsgo-darwin-arm64": "workspace:*"
},
"devDependencies": {
- "@effect/platform-node": "^4.0.0-beta.104",
- "@effect/platform-node-shared": "^4.0.0-beta.104",
+ "@effect/platform-node": "^4.0.0-beta.107",
+ "@effect/platform-node-shared": "^4.0.0-beta.107",
"@types/node": "^24.3.0",
"tsdown": "^0.20.1",
"typescript": "^5.9.2",
- "effect": "^4.0.0-beta.104",
+ "effect": "^4.0.0-beta.107",
"vitest": "^3.2.1"
}
}
diff --git a/_packages/tsgo/src/cli/setup/changes.ts b/_packages/tsgo/src/cli/setup/changes.ts
index 1f4c9c41..e1ce5f73 100644
--- a/_packages/tsgo/src/cli/setup/changes.ts
+++ b/_packages/tsgo/src/cli/setup/changes.ts
@@ -90,23 +90,70 @@ function deleteNodeFromList