@patchworkdev/pdk
Version:
Patchwork Development Kit
90 lines (89 loc) • 4.72 kB
JavaScript
;
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');
}
}