@decaf-ts/fabric-weaver
Version:
template for ts projects
102 lines • 16.4 kB
JavaScript
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=