UNPKG

@gnus.ai/upgrade-safe-transpiler-diamond

Version:

Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe using Diamond Pattern (EIP-2535).

123 lines 7.84 kB
"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"); const add_diamond_storage_1 = require("./transformations/add-diamond-storage"); const add_diamond_access_1 = require("./transformations/add-diamond-access"); const remove_state_variables_1 = require("./transformations/remove-state-variables"); const add_public_getters_1 = require("./transformations/add-public-getters"); 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 : []); // build a final array of files to return const outputFiles = []; 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, transform_constructor_1.transformConstructor)((options === null || options === void 0 ? void 0 : options.extractStorage) || false)); 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(remove_immutable_1.removeImmutable); if (!(options === null || options === void 0 ? void 0 : options.extractStorage)) { transform.apply(purge_var_inits_1.removeStateVarInits); transform.apply(add_storage_gaps_1.addStorageGaps); } else { transform.apply(add_diamond_access_1.addDiamondAccess); transform.apply((0, add_diamond_storage_1.addDiamondStorage)(outputFiles)); transform.apply(add_public_getters_1.addPublicGetters); transform.apply(remove_state_variables_1.removeStateVariables); } transform.apply((0, append_initializable_import_1.appendInitializableImport)(outputPaths.initializable)); transform.apply(fix_new_statement_1.fixNewStatement); 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, (options === null || options === void 0 ? void 0 : options.extractStorage) || false, outputFiles) : fs_1.default.readFileSync(require.resolve((options === null || options === void 0 ? void 0 : options.extractStorage) ? '../InitializableFacet.sol' : '../Initializable.sol'), 'utf8'); outputFiles.push({ source: initializableSource, path: outputPaths.initializable, fileName: path_1.default.basename(outputPaths.initializable), }); if ((options === null || options === void 0 ? void 0 : options.extractStorage) && (options === null || options === void 0 ? void 0 : options.initializablePath) === undefined) { const initFacetStorage = fs_1.default.readFileSync(require.resolve('../InitializableFacetStorage.sol'), 'utf8'); outputFiles.push({ source: initFacetStorage, path: path_1.default.dirname(outputPaths.initializable) + path_1.default.sep + 'InitializableStorage.sol', fileName: 'InitializableStorage.sol', }); } 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, extractStorage, outputFiles) { 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); if (extractStorage) { yield* (0, add_diamond_access_1.addDiamondAccess)(ast, tools); yield* (0, add_diamond_storage_1.addDiamondStorage)(outputFiles)(ast, tools); yield* (0, remove_state_variables_1.removeStateVariables)(ast, tools); } } }); return transform.results()[initializablePath]; } //# sourceMappingURL=index.js.map