From 2d4bcdb6fe8e089014eda82e174360c07ad4a19a Mon Sep 17 00:00:00 2001 From: Mark Bennett Date: Mon, 09 Feb 2026 21:03:38 +0000 Subject: [PATCH] Add multiformats dependency and lexicon post-processing script - Add multiformats@9.9.0 as direct dependency for CID type support - Create scripts/fix-lexicon-imports.js to post-process generated lexicons: - Adds .js extensions to relative imports for ES module compatibility - Rewrites 'multiformats/cid' imports to 'multiformats' main export (fixes TypeScript NodeNext module resolution issues) - Update codegen script to run post-processor automatically This resolves TypeScript compilation errors with generated AT Protocol lexicon code while maintaining strict type checking in application code. Co-Authored-By: Claude Sonnet 4.5 --- package-lock.json | 1 + package.json | 3 ++- scripts/fix-lexicon-imports.js | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 file(s) changed, 71 insertion(s)(+), 1 deletion(s)(-) diff --git a/package-lock.json b/package-lock.json --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@napi-rs/keyring": "^1.2.0", "commander": "^12.1.0", "cosmiconfig": "^9.0.0", + "multiformats": "^9.9.0", "simple-git": "^3.30.0", "zod": "^4.3.6" }, diff --git a/package.json b/package.json --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "format": "biome format --write .", "typecheck": "tsc --noEmit", "prepublishOnly": "npm run build", - "codegen": "npx lex gen-api --yes ./src/lexicon ./lexicons/sh/tangled/**/*.json", + "codegen": "npx lex gen-api --yes ./src/lexicon ./lexicons/sh/tangled/**/*.json && node scripts/fix-lexicon-imports.js", "update-lexicons": "./scripts/update-lexicons.sh" }, "engines": { @@ -38,6 +38,7 @@ "@napi-rs/keyring": "^1.2.0", "commander": "^12.1.0", "cosmiconfig": "^9.0.0", + "multiformats": "^9.9.0", "simple-git": "^3.30.0", "zod": "^4.3.6" }, diff --git a/scripts/fix-lexicon-imports.js b/scripts/fix-lexicon-imports.js new file mode 100644 --- /dev/null +++ b/scripts/fix-lexicon-imports.js @@ -0,0 +1,68 @@ +#!/usr/bin/env node +/** + * Post-process generated lexicon files to fix imports for ES modules + * + * This script: + * 1. Adds .js extensions to relative imports + * 2. Fixes multiformats/cid imports to use main package export + * 3. Ensures proper TypeScript compatibility with NodeNext module resolution + */ + +import { readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; + +// Recursively find all .ts files in a directory +function findTsFiles(dir, fileList = []) { + const files = readdirSync(dir); + + for (const file of files) { + const filePath = join(dir, file); + const stat = statSync(filePath); + + if (stat.isDirectory()) { + findTsFiles(filePath, fileList); + } else if (file.endsWith('.ts')) { + fileList.push(filePath); + } + } + + return fileList; +} + +// Find all generated TypeScript files in src/lexicon +const files = findTsFiles('src/lexicon'); + +let filesFixed = 0; +let totalChanges = 0; + +for (const file of files) { + const content = readFileSync(file, 'utf-8'); + let modified = content; + let fileChanges = 0; + + // Fix multiformats/cid import to use main package export + // TypeScript can't resolve the subpath export with NodeNext resolution + const multiformatsCidRegex = /from\s+['"]multiformats\/cid['"]/g; + if (multiformatsCidRegex.test(modified)) { + modified = modified.replace(multiformatsCidRegex, "from 'multiformats'"); + fileChanges++; + } + + // Fix relative imports without .js extension + // Match: from '../../something' or from "../something" + // But don't match if it already has an extension + const relativeImportRegex = /from\s+['"](\.\.[^'"]*?)(? { + fileChanges++; + return `from '${path}.js'`; + }); + + if (fileChanges > 0) { + writeFileSync(file, modified, 'utf-8'); + filesFixed++; + totalChanges += fileChanges; + console.log(`āœ“ Fixed ${fileChanges} import(s) in ${file}`); + } +} + +console.log(`\nāœ“ Fixed ${totalChanges} imports in ${filesFixed} files`); -- tangled.sh