@solvprotocol/upgrade-safe-transpiler
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.
98 lines • 5.93 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.transpile = void 0;
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const lodash_1 = require("lodash");
const matcher_1 = require("./utils/matcher");
const rename_1 = require("./rename");
const transform_1 = require("./transform");
const generate_with_init_1 = require("./generate-with-init");
const find_already_initializable_1 = require("./find-already-initializable");
const fix_import_directives_1 = require("./transformations/fix-import-directives");
const rename_identifiers_1 = require("./transformations/rename-identifiers");
const prepend_initializable_base_1 = require("./transformations/prepend-initializable-base");
const purge_var_inits_1 = require("./transformations/purge-var-inits");
const remove_immutable_1 = require("./transformations/remove-immutable");
const remove_inheritance_list_args_1 = require("./transformations/remove-inheritance-list-args");
const rename_contract_definition_1 = require("./transformations/rename-contract-definition");
const append_initializable_import_1 = require("./transformations/append-initializable-import");
const fix_new_statement_1 = require("./transformations/fix-new-statement");
const add_required_public_initializers_1 = require("./transformations/add-required-public-initializers");
const add_storage_gaps_1 = require("./transformations/add-storage-gaps");
const rename_inheritdoc_1 = require("./transformations/rename-inheritdoc");
const transform_constructor_1 = require("./transformations/transform-constructor");
function getExtraOutputPaths(paths, options) {
const outputPaths = (0, lodash_1.mapValues)({
initializable: 'Initializable.sol',
withInit: 'mocks/WithInit.sol',
}, s => path_1.default.relative(paths.root, path_1.default.join(paths.sources, s)));
if (options === null || options === void 0 ? void 0 : options.initializablePath) {
outputPaths.initializable = options === null || options === void 0 ? void 0 : options.initializablePath;
}
return outputPaths;
}
async function transpile(solcInput, solcOutput, paths, options) {
var _a;
const outputPaths = getExtraOutputPaths(paths, options);
const alreadyInitializable = (0, find_already_initializable_1.findAlreadyInitializable)(solcOutput, options === null || options === void 0 ? void 0 : options.initializablePath);
const excludeSet = new Set([...alreadyInitializable, ...Object.values(outputPaths)]);
const excludeMatch = (0, matcher_1.matcher)((_a = options === null || options === void 0 ? void 0 : options.exclude) !== null && _a !== void 0 ? _a : []);
const transform = new transform_1.Transform(solcInput, solcOutput, {
exclude: source => { var _a; return excludeSet.has(source) || ((_a = excludeMatch(source)) !== null && _a !== void 0 ? _a : (0, rename_1.isRenamed)(source)); },
});
transform.apply(rename_identifiers_1.renameIdentifiers);
transform.apply(rename_contract_definition_1.renameContractDefinition);
transform.apply(rename_inheritdoc_1.renameInheritdoc);
transform.apply(prepend_initializable_base_1.prependInitializableBase);
transform.apply(fix_import_directives_1.fixImportDirectives);
transform.apply((0, append_initializable_import_1.appendInitializableImport)(outputPaths.initializable));
transform.apply(fix_new_statement_1.fixNewStatement);
transform.apply(transform_constructor_1.transformConstructor);
transform.apply(transform_constructor_1.removeLeftoverConstructorHead);
transform.apply((0, add_required_public_initializers_1.addRequiredPublicInitializer)(options === null || options === void 0 ? void 0 : options.publicInitializers));
transform.apply(remove_inheritance_list_args_1.removeInheritanceListArguments);
transform.apply(purge_var_inits_1.removeStateVarInits);
transform.apply(remove_immutable_1.removeImmutable);
transform.apply(add_storage_gaps_1.addStorageGaps);
// build a final array of files to return
const outputFiles = [];
const results = transform.results();
for (const file in results) {
const transformedSource = results[file];
outputFiles.push({
source: transformedSource,
path: (0, rename_1.renamePath)(file),
fileName: path_1.default.basename(file),
});
}
const initializableSource = (options === null || options === void 0 ? void 0 : options.initializablePath) !== undefined
? transpileInitializable(solcInput, solcOutput, paths, options === null || options === void 0 ? void 0 : options.initializablePath)
: fs_1.default.readFileSync(require.resolve('../Initializable.sol'), 'utf8');
outputFiles.push({
source: initializableSource,
path: outputPaths.initializable,
fileName: path_1.default.basename(outputPaths.initializable),
});
outputFiles.push({
source: (0, generate_with_init_1.generateWithInit)(transform, outputPaths.withInit, options === null || options === void 0 ? void 0 : options.solcVersion),
path: outputPaths.withInit,
fileName: path_1.default.basename(outputPaths.withInit),
});
return outputFiles;
}
exports.transpile = transpile;
function transpileInitializable(solcInput, solcOutput, paths, initializablePath) {
const transform = new transform_1.Transform(solcInput, solcOutput);
transform.apply(function* (ast, tools) {
if (ast.absolutePath === initializablePath) {
yield* (0, rename_identifiers_1.renameIdentifiers)(ast, tools);
yield* (0, fix_import_directives_1.fixImportDirectives)(ast, tools);
}
});
return transform.results()[initializablePath];
}
//# sourceMappingURL=index.js.map