import * as Exit from "effect/Exit"; import * as Schema from "effect/Schema"; import { T3ProjectFile, T3_PROJECT_FILE_SCHEMA_URL } from "@t3tools/contracts"; import { fromLenientJson } from "./schemaJson.ts"; /** * Codec between the raw `t3.json` file contents (lenient JSONC string) and the * decoded {@link T3ProjectFile}. */ export const T3ProjectFileFromJson = fromLenientJson(T3ProjectFile); const decodeT3ProjectFile = Schema.decodeExit(T3ProjectFileFromJson); /** * Decode raw `t3.json` contents, treating invalid or malformed files as * absent. Clients use this to read optional defaults (scripts, thread env * mode) without surfacing decode errors to the user. */ export function parseT3ProjectFile(contents: string): T3ProjectFile | null { const decoded = decodeT3ProjectFile(contents); return Exit.isSuccess(decoded) ? decoded.value : null; } /** * Build the publishable JSON Schema document for `t3.json` (draft 2020-12). * * Served from the marketing site at {@link T3_PROJECT_FILE_SCHEMA_URL} so * editors get LSP support via a `$schema` reference. */ export function buildT3ProjectFileJsonSchema(): Record { const document = Schema.toJsonSchemaDocument(T3ProjectFile); const jsonSchema: Record = { $schema: "https://json-schema.org/draft/2020-12/schema", $id: T3_PROJECT_FILE_SCHEMA_URL, ...document.schema, }; if (document.definitions && Object.keys(document.definitions).length > 0) { jsonSchema.$defs = document.definitions; } return jsonSchema; }