UNPKG

@decaf-ts/fabric-weaver

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