import assert from "node:assert/strict"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { pathToFileURL } from "node:url"; import ts from "../../web/node_modules/typescript/lib/typescript.js"; const [sourceArg, outputArg] = process.argv.slice(2); if (!sourceArg || !outputArg) throw new Error("usage: node generate-asset-catalog-compatibility.mjs V2_JSON OUTPUT_JSON"); const root = path.resolve(import.meta.dirname, "../.."); const temporary = fs.mkdtempSync(path.join(os.tmpdir(), "asset-catalog-compatibility-generator-")); const sources = ["asset-path.ts", "capability-gates.ts", "asset-library-io.ts", "asset-catalog-v2.ts", "asset-catalog-compatibility.ts"]; try { for (const sourceName of sources) { const sourcePath = path.join(root, "web/protocol", sourceName); const result = ts.transpileModule(fs.readFileSync(sourcePath, "utf8"), { compilerOptions: { module: ts.ModuleKind.ES2022, target: ts.ScriptTarget.ES2022 }, fileName: sourcePath, reportDiagnostics: true, }); assert.deepEqual(result.diagnostics, []); fs.writeFileSync(path.join(temporary, sourceName.replace(/\.ts$/, ".mjs")), result.outputText.replaceAll(/from "\.\/([a-z0-9-]+)"/g, 'from "./$1.mjs"')); } const compatibility = await import(pathToFileURL(path.join(temporary, "asset-catalog-compatibility.mjs"))); const value = JSON.parse(fs.readFileSync(path.resolve(sourceArg), "utf8")); const output = { read: await compatibility.inspectAssetCatalogForLegacyReader(value, "READ"), catalogWrite: await compatibility.inspectAssetCatalogForLegacyReader(value, "CATALOG_WRITE"), assetWrite: await compatibility.inspectAssetCatalogForLegacyReader(value, "ASSET_WRITE"), save: await compatibility.inspectAssetCatalogForLegacyReader(value, "SAVE"), future: await compatibility.inspectAssetCatalogForLegacyReader({ schemaVersion: 3 }, "READ"), }; fs.mkdirSync(path.dirname(path.resolve(outputArg)), { recursive: true }); fs.writeFileSync(path.resolve(outputArg), `${JSON.stringify(output, null, 2)}\n`); process.stdout.write("asset-catalog-compatibility-generated read=READ_ONLY writes=3/BLOCKED future=BLOCKED\n"); } finally { fs.rmSync(temporary, { recursive: true, force: true }); }