UNPKG

@patchworkdev/pdk

Version:

Patchwork Development Kit

90 lines (89 loc) 4.72 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateTypescriptSchemas = generateTypescriptSchemas; const promises_1 = __importDefault(require("fs/promises")); const path_1 = __importDefault(require("path")); const error_1 = require("../../common/helpers/error"); const logger_1 = require("../../common/helpers/logger"); async function getSchemaJsonFiles(directory) { const files = []; try { const entries = await promises_1.default.readdir(directory, { withFileTypes: true }); for (const entry of entries) { const filePath = path_1.default.join(directory, entry.name); if (entry.isDirectory()) { logger_1.logger.debug('Scanning directory:', filePath); const subFiles = await getSchemaJsonFiles(filePath); files.push(...subFiles); } else if (entry.isFile() && entry.name.endsWith('-schema.json')) { logger_1.logger.debug('Found contract schema file:', entry.name); files.push(filePath); } } return files; } catch (error) { logger_1.logger.error(`Error scanning directory ${directory}:`, error); throw new error_1.PDKError(error_1.ErrorCode.DIR_NOT_FOUND, `Failed to scan directory ${directory}`); } } async function generateTypescriptSchemas(configPath) { const buildOutDir = path_1.default.join(path_1.default.dirname(configPath), 'contracts', 'src'); const srcDir = path_1.default.join(path_1.default.dirname(configPath), 'ponder', 'schemas'); logger_1.logger.debug('Build output directory:', buildOutDir); logger_1.logger.debug('Schema output directory:', srcDir); try { // Ensure ABI directory exists await promises_1.default.mkdir(srcDir, { recursive: true }); // Get all ABI JSON files const files = await getSchemaJsonFiles(buildOutDir); logger_1.logger.debug('Found schema files:', files.length); // Clean existing ABI directory const outFiles = await promises_1.default.readdir(srcDir); logger_1.logger.debug('Cleaning existing schema files:', outFiles.length); for (const file of outFiles) { if (file === 'README') continue; const filePath = path_1.default.join(srcDir, file); await promises_1.default.unlink(filePath); logger_1.logger.debug('Removed file:', file); } const indexList = []; // Generate new schema files for (const file of files) { const baseName = path_1.default.basename(file, '.json').replace('-schema', ''); try { // Read the content of the .abi.json file const fileContent = await promises_1.default.readFile(file, { encoding: 'utf8' }); // Generate the content for the .abi.ts file let tsContent = `import { ContractJSONSchema } from '@patchworkdev/pdk/utils';\n\n`; tsContent += `export const ${baseName}Schema = ${fileContent.trim()} as const satisfies ContractJSONSchema;\n`; indexList.push(baseName); // Write the .abi.ts file const outputPath = path_1.default.join(srcDir, `${baseName}.schema.ts`); await promises_1.default.writeFile(outputPath, tsContent); logger_1.logger.debug(`Generated: ${baseName}.ts`); } catch (error) { logger_1.logger.error(`Failed to process schema file ${baseName}:`, error); throw new error_1.PDKError(error_1.ErrorCode.PDK_ERROR, `Failed to process schema file ${baseName}`); } } let indexContent = indexList.map((c) => `import { ${c}Schema } from './${c}.schema';\n`).join(''); indexContent += `export const ContractSchemas = {\n`; indexList.forEach((c) => (indexContent += `\t${c}: ${c}Schema,\n`)); indexContent += `};\n`; indexContent += `export type ContractSchemasMap = typeof ContractSchemas;\n`; // Write the index file await promises_1.default.writeFile(path_1.default.join(srcDir, 'index.ts'), indexContent); logger_1.logger.info('Successfully generated all TypeScript schemas'); } catch (error) { logger_1.logger.error('Failed to generate TypeScript schemas:', error); throw error instanceof error_1.PDKError ? error : new error_1.PDKError(error_1.ErrorCode.UNKNOWN_ERROR, 'Failed to generate TypeScript schemas'); } }