UNPKG

@openzeppelin/upgrade-safe-transpiler

Version:

Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.

120 lines 6.52 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 minimatch_1 = require("minimatch"); 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 prepare_peer_project_1 = require("./prepare-peer-project"); 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 peer_import_1 = require("./transformations/peer-import"); 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 add_namespace_struct_1 = require("./transformations/add-namespace-struct"); 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.initializablePath) { outputPaths.initializable = options.initializablePath; } return outputPaths; } async function transpile(solcInput, solcOutput, paths, options = {}) { const outputPaths = getExtraOutputPaths(paths, options); const alreadyInitializable = (0, find_already_initializable_1.findAlreadyInitializable)(solcOutput, options.initializablePath); const excludeSet = new Set([...alreadyInitializable, ...Object.values(outputPaths)]); const excludeMatch = (0, matcher_1.matcher)(options.exclude ?? []); const namespaceInclude = (source) => { const namespaced = options.namespaced ?? false; const namespaceExclude = options.namespaceExclude ?? []; return namespaced && !namespaceExclude.some(p => (0, minimatch_1.minimatch)(source, p)); }; const transform = new transform_1.Transform(solcInput, solcOutput, { exclude: source => excludeSet.has(source) || (excludeMatch(source) ?? (0, rename_1.isRenamed)(source)), }); if (options.peerProject !== undefined) { (0, prepare_peer_project_1.preparePeerProject)(transform, options.peerProject); } 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((0, fix_import_directives_1.fixImportDirectives)(options.peerProject !== undefined)); transform.apply((0, append_initializable_import_1.appendInitializableImport)(outputPaths.initializable)); transform.apply(fix_new_statement_1.fixNewStatement); transform.apply((0, transform_constructor_1.transformConstructor)(namespaceInclude)); transform.apply(transform_constructor_1.removeLeftoverConstructorHead); transform.apply((0, add_required_public_initializers_1.addRequiredPublicInitializer)(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(peer_import_1.peerImport); if (options.namespaced) { transform.apply((0, add_namespace_struct_1.addNamespaceStruct)(namespaceInclude)); } else { 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.initializablePath !== undefined ? transpileInitializable(solcInput, solcOutput, paths, { ...options, initializablePath: 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), }); if (!options.skipWithInit) { outputFiles.push({ source: (0, generate_with_init_1.generateWithInit)(transform, outputPaths.withInit, options.solcVersion), path: outputPaths.withInit, fileName: path_1.default.basename(outputPaths.withInit), }); } return outputFiles; } exports.transpile = transpile; function transpileInitializable(solcInput, solcOutput, paths, options) { const transform = new transform_1.Transform(solcInput, solcOutput); transform.apply(function* (ast, tools) { if (ast.absolutePath === options.initializablePath) { yield* (0, rename_identifiers_1.renameIdentifiers)(ast, tools); yield* (0, fix_import_directives_1.fixImportDirectives)(options.peerProject !== undefined)(ast, tools); } }); return transform.results()[options.initializablePath]; } //# sourceMappingURL=index.js.map