Skip to content

Commit 2bf7df2

Browse files
ryanbas21claude
andcommitted
fix(dead-export-finder): replace JSON.parse with Schema.parseJson
Resolves TS44 preferSchemaOverJson diagnostic by using Effect Schema for JSON parsing in workspace-detector.ts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c38172a commit 2bf7df2

1 file changed

Lines changed: 13 additions & 15 deletions

File tree

packages/dead-export-finder/src/lib/workspace-detector.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { Context, Data, Effect, Layer, Array as Arr, Option, pipe } from 'effect';
1+
import { Context, Data, Effect, Layer, Array as Arr, Option, pipe, Schema } from 'effect';
22
import { FileSystem, Path } from '@effect/platform';
33
import fg from 'fast-glob';
44
import YAML from 'yaml';
55
import type { PackageInfo, WorkspaceType } from './schemas.js';
66
import { WorkspaceNotFoundError } from './errors.js';
77

8+
const JsonRecord = Schema.parseJson(Schema.Record({ key: Schema.String, value: Schema.Unknown }));
9+
810
// ─── Result type ──────────────────────────────────────────────────────────────
911

1012
export interface WorkspaceResult {
@@ -74,16 +76,12 @@ const readPackageInfo = (
7476
if (!exists) return Effect.succeed(null);
7577
return pipe(
7678
fs.readFileString(pkgPath, 'utf-8'),
77-
Effect.map((contents): PackageInfo | null => {
78-
try {
79-
const parsed = JSON.parse(contents) as Record<string, unknown>;
80-
const name =
81-
typeof parsed['name'] === 'string' ? parsed['name'] : pathSvc.basename(pkgDir);
82-
const entryPoints = extractEntryPoints(parsed);
83-
return { name, root: pkgDir, entryPoints: [...entryPoints] } as PackageInfo;
84-
} catch {
85-
return null;
86-
}
79+
Effect.flatMap((contents) => Schema.decodeUnknown(JsonRecord)(contents)),
80+
Effect.map((parsed): PackageInfo | null => {
81+
const name =
82+
typeof parsed['name'] === 'string' ? parsed['name'] : pathSvc.basename(pkgDir);
83+
const entryPoints = extractEntryPoints(parsed);
84+
return { name, root: pkgDir, entryPoints: [...entryPoints] } as PackageInfo;
8785
}),
8886
Effect.catchAll(() => Effect.succeed(null)),
8987
);
@@ -306,10 +304,10 @@ export const WorkspaceDetectorLive = Layer.effect(
306304
fs.readFileString(pathSvc.join(cwd, 'package.json'), 'utf-8'),
307305
Effect.orDie,
308306
Effect.flatMap((raw) =>
309-
Effect.try({
310-
try: () => JSON.parse(raw) as Record<string, unknown>,
311-
catch: () => new WorkspaceNotFoundError({ cwd }),
312-
}),
307+
pipe(
308+
Schema.decodeUnknown(JsonRecord)(raw),
309+
Effect.mapError(() => new WorkspaceNotFoundError({ cwd })),
310+
),
313311
),
314312
Effect.flatMap((rootPkg) =>
315313
pipe(

0 commit comments

Comments
 (0)