UNPKG

@decaf-ts/fabric-weaver

Version:
102 lines 16.4 kB
import { ENTRY_PLACEHOLDER, NAME_PLACEHOLDER, VERSION_PLACEHOLDER, } from "../constants/constants"; import fs from "fs"; import { Logging } from "@decaf-ts/logging"; import path from "path"; import ts from "typescript"; export function resolvePath(inputPath) { return path.isAbsolute(inputPath) ? inputPath : path.resolve(process.cwd(), inputPath); } export function compileStandaloneFile(filePath, outDir) { const compilerOptions = { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.CommonJS, allowJs: true, checkJs: true, declaration: false, declarationMap: false, emitDeclarationOnly: false, isolatedModules: true, sourceMap: false, removeComments: true, strict: true, skipLibCheck: true, resolveJsonModule: true, forceConsistentCasingInFileNames: true, experimentalDecorators: true, emitDecoratorMetadata: true, moduleResolution: ts.ModuleResolutionKind.NodeJs, noImplicitAny: true, useDefineForClassFields: true, allowSyntheticDefaultImports: true, esModuleInterop: false, outDir, }; const host = ts.createCompilerHost(compilerOptions); host.writeFile = (fileName, content) => { const outputPath = path.join(outDir, path.basename(fileName)); fs.writeFileSync(outputPath, content); console.log(`Written: ${outputPath}`); }; const program = ts.createProgram([path.join(resolvePath(filePath))], compilerOptions, host); const emitResult = program.emit(); const diagnostics = ts .getPreEmitDiagnostics(program) .concat(emitResult.diagnostics); diagnostics.forEach((diagnostic) => { if (diagnostic.file && diagnostic.start !== undefined) { const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"); console.log(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`); } else { console.log(ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")); } }); const exitCode = emitResult.emitSkipped ? 1 : 0; overrideContractImports(outDir); console.log(`Process exited with code ${exitCode}`); } export function overrideContractImports(folderPath) { folderPath = resolvePath(folderPath); const files = fs.readdirSync(folderPath); files.forEach((file) => { const filePath = path.join(folderPath, file); console.log(filePath); if (fs.statSync(filePath).isFile() && file.toLowerCase().endsWith(".js")) { // Read file content const content = fs.readFileSync(filePath, "utf8"); // Parse/transform const newContent = overrideDoubleDotImports(content); // Write back to file fs.writeFileSync(filePath, newContent, "utf8"); } }); } export function overrideDoubleDotImports(code) { return code.replace(/require\(\s*["']((?:\.\.\/)+(?:[^/"']+\/)*([^/"']+)|\.\/(?:[^/"']+\/)*([^/"']+))["']\s*\)/g, (match, p1, p2, p3) => { const lastSegment = p2 || p3; return `require("./${lastSegment}")`; }); } export async function addPackage(contractName, version, destinationDirectory) { const log = Logging.for(addPackage); const inputFiles = ["package.json", "package-lock.json"]; fs.mkdirSync(resolvePath(destinationDirectory), { recursive: true }); for (const file of inputFiles) { const inputPath = path.join(__dirname, "../..", "assets", file); if (!fs.existsSync(inputPath)) { log.info(`File not found: ${inputPath}`); continue; } const content = fs.readFileSync(inputPath, "utf-8"); const replacedContent = content .replaceAll(new RegExp(VERSION_PLACEHOLDER, "g"), version.toString()) .replaceAll(new RegExp(NAME_PLACEHOLDER, "g"), contractName.toLowerCase()) .replaceAll(new RegExp(ENTRY_PLACEHOLDER, "g"), `${contractName.toLowerCase()}.js`); fs.writeFileSync(path.join(resolvePath(destinationDirectory), file), replacedContent, "utf-8"); log.info(`Add ${file} to ${destinationDirectory} for contract ${contractName}`); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL2NvbnRyYWN0cy9jb21waWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixHQUNwQixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU1QixNQUFNLFVBQVUsV0FBVyxDQUFDLFNBQWlCO0lBQzNDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDL0IsQ0FBQyxDQUFDLFNBQVM7UUFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLE1BQWM7SUFDcEUsTUFBTSxlQUFlLEdBQXVCO1FBQzFDLE1BQU0sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU07UUFDOUIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUTtRQUM5QixPQUFPLEVBQUUsSUFBSTtRQUNiLE9BQU8sRUFBRSxJQUFJO1FBQ2IsV0FBVyxFQUFFLEtBQUs7UUFDbEIsY0FBYyxFQUFFLEtBQUs7UUFDckIsbUJBQW1CLEVBQUUsS0FBSztRQUMxQixlQUFlLEVBQUUsSUFBSTtRQUNyQixTQUFTLEVBQUUsS0FBSztRQUNoQixjQUFjLEVBQUUsSUFBSTtRQUNwQixNQUFNLEVBQUUsSUFBSTtRQUNaLFlBQVksRUFBRSxJQUFJO1FBQ2xCLGlCQUFpQixFQUFFLElBQUk7UUFDdkIs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SUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDOUIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN6QyxTQUFTO1FBQ1gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXBELE1BQU0sZUFBZSxHQUFHLE9BQU87YUFDNUIsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNwRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3pFLFVBQVUsQ0FDVCxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsRUFDbEMsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FDbkMsQ0FBQztRQUVKLEVBQUUsQ0FBQyxhQUFhLENBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxJQUFJLENBQUMsRUFDbEQsZUFBZSxFQUNmLE9BQU8sQ0FDUixDQUFDO1FBRUYsR0FBRyxDQUFDLElBQUksQ0FDTixPQUFPLElBQUksT0FBTyxvQkFBb0IsaUJBQWlCLFlBQVksRUFBRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFTlRSWV9QTEFDRUhPTERFUixcbiAgTkFNRV9QTEFDRUhPTERFUixcbiAgVkVSU0lPTl9QTEFDRUhPTERFUixcbn0gZnJvbSBcIi4uL2NvbnN0YW50cy9jb25zdGFudHNcIjtcblxuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGgoaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aClcbiAgICA/IGlucHV0UGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGlucHV0UGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlU3RhbmRhbG9uZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgb3V0RGlyOiBzdHJpbmcpIHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zOiB0cy5Db21waWxlck9wdGlvbnMgPSB7XG4gICAgdGFyZ2V0OiB0cy5TY3JpcHRUYXJnZXQuRVMyMDIyLFxuICAgIG1vZHVsZTogdHMuTW9kdWxlS2luZC5Db21tb25KUyxcbiAgICBhbGxvd0pzOiB0cnVlLFxuICAgIGNoZWNrSnM6IHRydWUsXG4gICAgZGVjbGFyYXRpb246IGZhbHNlLFxuICAgIGRlY2xhcmF0aW9uTWFwOiBmYWxzZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiBmYWxzZSxcbiAgICBpc29sYXRlZE1vZHVsZXM6IHRydWUsXG4gICAgc291cmNlTWFwOiBmYWxzZSxcbiAgICByZW1vdmVDb21tZW50czogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgIGZvcmNlQ29uc2lzdGVudENhc2luZ0luRmlsZU5hbWVzOiB0cnVlLFxuICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgZW1pdERlY29yYXRvck1ldGFkYXRhOiB0cnVlLFxuICAgIG1vZHVsZVJlc29sdXRpb246IHRzLk1vZHVsZVJlc29sdXRpb25LaW5kLk5vZGVKcyxcbiAgICBub0ltcGxpY2l0QW55OiB0cnVlLFxuICAgIHVzZURlZmluZUZvckNsYXNzRmllbGRzOiB0cnVlLFxuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgZXNNb2R1bGVJbnRlcm9wOiBmYWxzZSxcbiAgICBvdXREaXIsXG4gIH07XG5cbiAgY29uc3QgaG9zdCA9IHRzLmNyZWF0ZUNvbXBpbGVySG9zdChjb21waWxlck9wdGlvbnMpO1xuICBob3N0LndyaXRlRmlsZSA9IChmaWxlTmFtZSwgY29udGVudCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4ob3V0RGlyLCBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lKSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBjb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgV3JpdHRlbjogJHtvdXRwdXRQYXRofWApO1xuICB9O1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKFxuICAgIFtwYXRoLmpvaW4ocmVzb2x2ZVBhdGgoZmlsZVBhdGgpKV0sXG4gICAgY29tcGlsZXJPcHRpb25zLFxuICAgIGhvc3RcbiAgKTtcbiAgY29uc3QgZW1pdFJlc3VsdCA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGRpYWdub3N0aWNzID0gdHNcbiAgICAuZ2V0UHJlRW1pdERpYWdub3N0aWNzKHByb2dyYW0pXG4gICAgLmNvbmNhdChlbWl0UmVzdWx0LmRpYWdub3N0aWNzKTtcblxuICBkaWFnbm9zdGljcy5mb3JFYWNoKChkaWFnbm9zdGljKSA9PiB7XG4gICAgaWYgKGRpYWdub3N0aWMuZmlsZSAmJiBkaWFnbm9zdGljLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgbGluZSwgY2hhcmFjdGVyIH0gPSBkaWFnbm9zdGljLmZpbGUuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oXG4gICAgICAgIGRpYWdub3N0aWMuc3RhcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdHMuZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dChcbiAgICAgICAgZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCxcbiAgICAgICAgXCJcXG5cIlxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgJHtkaWFnbm9zdGljLmZpbGUuZmlsZU5hbWV9ICgke2xpbmUgKyAxfSwke2NoYXJhY3RlciArIDF9KTogJHttZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICB0cy5mbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGRpYWdub3N0aWMubWVzc2FnZVRleHQsIFwiXFxuXCIpXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZXhpdENvZGUgPSBlbWl0UmVzdWx0LmVtaXRTa2lwcGVkID8gMSA6IDA7XG5cbiAgb3ZlcnJpZGVDb250cmFjdEltcG9ydHMob3V0RGlyKTtcbiAgY29uc29sZS5sb2coYFByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2V4aXRDb2RlfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVDb250cmFjdEltcG9ydHMoZm9sZGVyUGF0aDogc3RyaW5nKSB7XG4gIGZvbGRlclBhdGggPSByZXNvbHZlUGF0aChmb2xkZXJQYXRoKTtcbiAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhmb2xkZXJQYXRoKTtcblxuICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZm9sZGVyUGF0aCwgZmlsZSk7XG4gICAgY29uc29sZS5sb2coZmlsZVBhdGgpO1xuXG4gICAgaWYgKGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5pc0ZpbGUoKSAmJiBmaWxlLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXCIuanNcIikpIHtcbiAgICAgIC8vIFJlYWQgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCBcInV0ZjhcIik7XG5cbiAgICAgIC8vIFBhcnNlL3RyYW5zZm9ybVxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IG92ZXJyaWRlRG91YmxlRG90SW1wb3J0cyhjb250ZW50KTtcblxuICAgICAgLy8gV3JpdGUgYmFjayB0byBmaWxlXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50LCBcInV0ZjhcIik7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJyaWRlRG91YmxlRG90SW1wb3J0cyhjb2RlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGNvZGUucmVwbGFjZShcbiAgICAvcmVxdWlyZVxcKFxccypbXCInXSgoPzpcXC5cXC5cXC8pKyg/OlteL1wiJ10rXFwvKSooW14vXCInXSspfFxcLlxcLyg/OlteL1wiJ10rXFwvKSooW14vXCInXSspKVtcIiddXFxzKlxcKS9nLFxuICAgIChtYXRjaCwgcDEsIHAyLCBwMykgPT4ge1xuICAgICAgY29uc3QgbGFzdFNlZ21lbnQgPSBwMiB8fCBwMztcbiAgICAgIHJldHVybiBgcmVxdWlyZShcIi4vJHtsYXN0U2VnbWVudH1cIilgO1xuICAgIH1cbiAgKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFxuICBjb250cmFjdE5hbWU6IHN0cmluZyxcbiAgdmVyc2lvbjogc3RyaW5nLFxuICBkZXN0aW5hdGlvbkRpcmVjdG9yeTogc3RyaW5nXG4pIHtcbiAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoYWRkUGFja2FnZSk7XG4gIGNvbnN0IGlucHV0RmlsZXMgPSBbXCJwYWNrYWdlLmpzb25cIiwgXCJwYWNrYWdlLWxvY2suanNvblwiXTtcblxuICBmcy5ta2RpclN5bmMocmVzb2x2ZVBhdGgoZGVzdGluYXRpb25EaXJlY3RvcnkpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgaW5wdXRGaWxlcykge1xuICAgIGNvbnN0IGlucHV0UGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vLi5cIiwgXCJhc3NldHNcIiwgZmlsZSk7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaW5wdXRQYXRoKSkge1xuICAgICAgbG9nLmluZm8oYEZpbGUgbm90IGZvdW5kOiAke2lucHV0UGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5wdXRQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgY29uc3QgcmVwbGFjZWRDb250ZW50ID0gY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwobmV3IFJlZ0V4cChWRVJTSU9OX1BMQUNFSE9MREVSLCBcImdcIiksIHZlcnNpb24udG9TdHJpbmcoKSlcbiAgICAgIC5yZXBsYWNlQWxsKG5ldyBSZWdFeHAoTkFNRV9QTEFDRUhPTERFUiwgXCJnXCIpLCBjb250cmFjdE5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIC5yZXBsYWNlQWxsKFxuICAgICAgICBuZXcgUmVnRXhwKEVOVFJZX1BMQUNFSE9MREVSLCBcImdcIiksXG4gICAgICAgIGAke2NvbnRyYWN0TmFtZS50b0xvd2VyQ2FzZSgpfS5qc2BcbiAgICAgICk7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKHJlc29sdmVQYXRoKGRlc3RpbmF0aW9uRGlyZWN0b3J5KSwgZmlsZSksXG4gICAgICByZXBsYWNlZENvbnRlbnQsXG4gICAgICBcInV0Zi04XCJcbiAgICApO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgQWRkICR7ZmlsZX0gdG8gJHtkZXN0aW5hdGlvbkRpcmVjdG9yeX0gZm9yIGNvbnRyYWN0ICR7Y29udHJhY3ROYW1lfWBcbiAgICApO1xuICB9XG59XG4iXX0=