From e611144e090db446218263e7753ba49f620d453a Mon Sep 17 00:00:00 2001 From: Ryan Bas Date: Mon, 11 May 2026 22:28:03 -0600 Subject: [PATCH] refactor: use Schema.TaggedStruct for discriminated unions Replace Schema.Struct with _tag literal fields with Schema.TaggedStruct, the idiomatic Effect pattern for discriminated unions. Silences TS34 language service warnings and enables optimized union decoding. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/lib/auth-event.schema.ts | 24 +++++++------------ packages/treeshake-check/src/lib/schemas.ts | 6 ++--- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/packages/devtools-types/src/lib/auth-event.schema.ts b/packages/devtools-types/src/lib/auth-event.schema.ts index f7be7ba..74865de 100644 --- a/packages/devtools-types/src/lib/auth-event.schema.ts +++ b/packages/devtools-types/src/lib/auth-event.schema.ts @@ -38,8 +38,7 @@ export const CorsFlagSchema = Schema.Struct({ export type CorsFlag = Schema.Schema.Type; -export const NetworkDataSchema = Schema.Struct({ - _tag: Schema.Literal('network'), +export const NetworkDataSchema = Schema.TaggedStruct('network', { url: Schema.String, method: Schema.String, status: Schema.Number, @@ -63,8 +62,7 @@ export const SdkAuthorizationSchema = Schema.Struct({ state: Schema.optional(Schema.String), }); -export const SdkDataSchema = Schema.Struct({ - _tag: Schema.Literal('sdk'), +export const SdkDataSchema = Schema.TaggedStruct('sdk', { nodeStatus: Schema.String, previousStatus: Schema.optional(Schema.String), interactionId: Schema.optional(Schema.String), @@ -82,26 +80,22 @@ export const SdkDataSchema = Schema.Struct({ responseBody: Schema.optional(Schema.Unknown), }); -export const SdkConfigDataSchema = Schema.Struct({ - _tag: Schema.Literal('sdk-config'), +export const SdkConfigDataSchema = Schema.TaggedStruct('sdk-config', { config: Schema.Unknown, }); -export const DomDataSchema = Schema.Struct({ - _tag: Schema.Literal('dom'), +export const DomDataSchema = Schema.TaggedStruct('dom', { element: Schema.optional(Schema.String), url: Schema.optional(Schema.String), }); -export const SessionDataSchema = Schema.Struct({ - _tag: Schema.Literal('session'), +export const SessionDataSchema = Schema.TaggedStruct('session', { key: Schema.String, before: Schema.optional(Schema.String), after: Schema.optional(Schema.String), }); -export const JourneyDataSchema = Schema.Struct({ - _tag: Schema.Literal('journey'), +export const JourneyDataSchema = Schema.TaggedStruct('journey', { stepType: Schema.Union( Schema.Literal('Step'), Schema.Literal('LoginSuccess'), @@ -120,8 +114,7 @@ export const JourneyDataSchema = Schema.Struct({ errorReason: Schema.optional(Schema.String), }); -export const OidcDataSchema = Schema.Struct({ - _tag: Schema.Literal('oidc'), +export const OidcDataSchema = Schema.TaggedStruct('oidc', { phase: Schema.Union( Schema.Literal('authorize'), Schema.Literal('exchange'), @@ -164,8 +157,7 @@ export const OidcErrorSchema = Schema.Struct({ errorDescription: Schema.optional(Schema.String), }); -export const OidcSemanticsSchema = Schema.Struct({ - _tag: Schema.Literal('oidc-semantics'), +export const OidcSemanticsSchema = Schema.TaggedStruct('oidc-semantics', { oidcPhase: Schema.Union( Schema.Literal('discovery'), Schema.Literal('authorize'), diff --git a/packages/treeshake-check/src/lib/schemas.ts b/packages/treeshake-check/src/lib/schemas.ts index 5836aa2..ae858c3 100644 --- a/packages/treeshake-check/src/lib/schemas.ts +++ b/packages/treeshake-check/src/lib/schemas.ts @@ -86,12 +86,10 @@ export type PackageJsonHints = typeof PackageJsonHints.Type; // ─── Top-level result ──────────────────────────────────────────────────────── export const TreeshakeResult = Schema.Union( - Schema.Struct({ - _tag: Schema.Literal('FullyTreeshakeable'), + Schema.TaggedStruct('FullyTreeshakeable', { hints: PackageJsonHints, }), - Schema.Struct({ - _tag: Schema.Literal('HasSideEffects'), + Schema.TaggedStruct('HasSideEffects', { totalOriginalBytes: Schema.Number, totalRenderedBytes: Schema.Number, modules: Schema.Array(ModuleAnalysis),