Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Emit effect-app schema facades at .d.ts (parity with tsc) - #2

Open
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors
Open

Emit effect-app schema facades at .d.ts (parity with tsc)#2
patroza wants to merge 16 commits into
mainfrom
r/dts-emit-more-ctors

Conversation

@patroza

@patrozapatroza commented Jun 21, 2026

Copy link
Copy Markdown
Member

Port the effect-app schema facade declaration emit to typescript-go.
(we actually apply on top of effect's tsgo fork effect-app/tsgo#1)

What changes:

  • Emits compact facade-shaped declarations for effect-app schema classes and struct schema values.
  • Adds resolver support for serializing class schema static property types as type literals.
  • Normalizes generated import types so existing namespace imports are preferred before falling back to import("...") type references.
  • Replaces legacy Encoded extends S.StructNestedEncoded<typeof SameModel> placeholders by materializing the parsed heritage type directly, matching the TypeScript emitter path.

Validation against scanner:

  • Built and published release binaries as effect-app/tsgo@v0.14.5-effect-app.4 from this PR head (49e73f3).
  • Installed scanner with the .4 release and ran ./node_modules/.bin/tsgo --version: Version 0.14.5-effect-app.4.
  • Ran scanner API declaration build with MACS_TS_COMPILER=tsgo node scripts/tsgo-or-tsc.mjs --build api/tsconfig.src.json --force --stopBuildOnErrors --singleThreaded.
  • Result: build passes and api/dist has 0 remaining StructNestedEncoded placeholders, matching patched tsc.

Four-way scanner comparison:

  • patched tsc: passes, 0 placeholders, ~47s wall
  • patched tsgo .4 single-threaded: passes, 0 placeholders, ~16.5s wall
  • stock TypeScript 6.0.3: passes, 244 placeholders
  • stock tsgo single-threaded: passes, 244 placeholders

Remaining tsc-vs-tsgo declaration differences are the existing printer/type-serialization drift: union/member ordering, import qualifier choices, and .tsbuildinfo/map churn. The schema placeholder behavior is now on par.


Shipped via the Effect language-service tsgo

This PR is the canonical facade-emit implementation. It is regenerated verbatim into the Effect language-service tsgo as _patches/029-031 in effect-app/tsgo#1 — that LS-enabled build is what macs/scanner actually downloads (binary carries both the Effect LSP and these facades).

Keep in sync: when this PR's head changes, regenerate effect-app/tsgo _patches/029-031 from it (same upstream base commit dc37b524, so the diff applies directly).

@patrozapatroza changed the title Facade Class/Error schema declarations (parity with tsc)Emit effect-app schema facades at .d.ts (parity with tsc)Jun 22, 2026
@patroza
patroza changed the base branch from codex/schema-dts-facade to mainJune 22, 2026 07:38
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
Re-expresses our effect-app/typescript-go#2 feature (class/error/struct schema
facade declaration emit) as three `_patches/` entries, authored against the
exact `typescript-go` submodule commit this repo pins (dc37b5249) — the same
commit our codex baseline branched from, so they apply cleanly:
029-transformers-declarations-effect-schema.patch (declaration transformer)
030-checker-emitresolver-effect-schema.patch (CreateTypeOf* resolver)
031-printer-emitresolver-effect-schema.patch (EmitResolver interface)
The feature is purely additive (no overlap with Effect patches 001-028). After
`setup-repo` applies 001-031 and regenerates diagnostics, `go build ./cmd/tsgo`
yields a tsgo with Effect's LSP hooks AND our .d.ts emitter. Verified on the
macs/scanner src tree: 0 errors, 145 Effect LSP diagnostics (hooks live), and
56 StructFacade + 10 OpaqueClassFacade + 46 OpaqueErrorFacadeClass (emitter live).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patroza added a commit to effect-app/tsgo that referenced this pull request Jun 22, 2026
…ffect-app.5
Regenerate the .d.ts schema-facade patches verbatim from the canonical Go
implementation in effect-app/typescript-go PR #2 (head a9dd01c, base dc37b524 ==
this submodule pin), restoring four improvements the earlier partial port
dropped:
- generated import normalization (prefer namespace imports over import("..."))
- legacy `Encoded extends S.StructNestedEncoded` materialization
- static-member rewriting (fields -> X.Fields, mapFields/copy signatures)
- `Fields` interface in the generated namespace
029 transform.go +920 -> +1148; 030/031 unchanged in substance. Verified against
scanner api decl build: exit 0, 0 StructNestedEncoded placeholders, 415 `Fields`
interfaces emitted, Effect language service diagnostics live.
Set the binary version suffix to semver build metadata on the upstream 7.x base:
core.SetVersionSuffix("+effect-app.5") -> `tsgo --version` = 7.0.0-dev+effect-app.5
(replaces the old 0.14.x-effect-app.N scheme). Bump the counter per gz release.
Source: effect-app/typescript-go#2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
patrozaand others added 15 commits July 2, 2026 08:39
Mirror effect-app/TypeScript#3 in the Go declaration transformer: detect the
schema constructor family from class heritage and emit the matching facade
base instead of always S.OpaqueFacade.
- S.Class/TaggedClass -> S.OpaqueClassFacade
- S.ErrorClass/Tagged... -> S.OpaqueErrorFacadeClass
- S.Opaque/OpaqueFacade -> S.OpaqueFacade (unchanged; requests stay here)
The brand (6th facade arg) is lifted from the source base when present: the
class/error families build on S.EnhancedClass<Self, Schema, Inherited> whose
3rd arg is the brand (e.g. Cause.YieldableError for errors). Opaque keeps {}.
Scanner parity with tsc: 46 OpaqueErrorFacadeClass + 10 OpaqueClassFacade,
brand preserved, 0 errors, 13 EnhancedClass residual.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror effect-app/TypeScript struct faceting in the Go declaration transformer.
A `const X = S.Struct(...)` / `S.TaggedStruct(...)` model is retyped from the
giant inline `S.Struct<{...}>` to a compact scanner-local
`import("#lib/StructFacade").StructFacade<X, X.Encoded, X.Make,
X.DecodingServices, X.EncodingServices, X.Fields>`, with a sibling `interface X`
(decoded Self) and a type-only `declare namespace X` (Fields/Encoded/Make/
services). Both are type-space, so they merge with the `const X` value without a
value collision; the source's `export type X = typeof X.Type` companion is
dropped in favour of the interface.
Adds the EmitResolver method CreateTypeOfStructSchemaProperty (reads a property
off the const's initializer type and serializes the resolved type, so `never`
services stay `never`).
Scanner src tree on par with tsc: 56 structs faceted, 0 errors, byte-identical
struct emit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the tsc fix: the facade base is S.Bottom-based, so 'identifier: string'
was dropped from faceted class/error models. Add it to the static members.
Scanner: 0 errors, identifier present, 10 OpaqueClassFacade + 46
OpaqueErrorFacadeClass + 56 StructFacade unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…erface (parity)
Mirror tsc: identifier now on the effect-app facade interfaces; not hand-emitted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror tsc: struct models emit `S.StructFacade<...>` via the file's `S` import
(effect-app >= beta.279), not an import-type. Add docs/effect-schema-facade-emit.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Output byte-identical to the tsc fork.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@patroza
patrozaforce-pushed the r/dts-emit-more-ctors branch from a9dd01c to 1dfe5cbCompareJuly 2, 2026 06:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@patroza