diff --git a/etc/facadeBuilder/.gitginore b/etc/facadeBuilder/.gitginore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/etc/facadeBuilder/.gitginore @@ -0,0 +1 @@ +node_modules diff --git a/etc/facadeBuilder/README.md b/etc/facadeBuilder/README.md new file mode 100644 index 00000000..7093fe0c --- /dev/null +++ b/etc/facadeBuilder/README.md @@ -0,0 +1,140 @@ +# how to generate facade +- `cp facade.yaml ../../` +- Write the configuration based on the following YAML Specification. +- `node ./facadeBuilder.js` + +# How to build everytime you change facadeBuilder.ts +- `npm run exec` + +# Solidity Bundle Configuration YAML Specification + +## Overview + +This YAML specification is specifically designed for Solidity smart contract bundle configurations, providing a flexible way to define contract facades and exclusion rules. + +## Structure + +### Bundle Properties + +| Property | Type | Description | Required | Default Behavior | +|----------|------|-------------|----------|-----------------| +| `bundleName` | String | Human-readable name of the Solidity bundle | ✓ | - | +| `bundleDirName` | String | Directory name for the bundle | × | Falls back to `bundleName` | +| `facades` | List | Definitions of contract facades | ✓ | - | + +### Facade Properties for Solidity + +| Property | Type | Description | Required | +|----------|------|-------------|----------| +| `name` | String | Name of the contract facade | ✓ | +| `excludeFileNames` | List of Strings | Solidity contract files to exclude | × | +| `excludeFunctionNames` | List of Strings | Function names to exclude from the facade | × | + +## Project Structure + +### Required Directory Layout +``` +project/ +├── src/ +│ └── {bundleDirName}/ +│ ├── functions/ # Contains contract function implementations +│ ├── interfaces/ # Contains error and event interface definitions +│ └── storage/ +│ └── Schema.sol # Base schema contract +└── generated/ # Output directory for generated facades +``` + +### Interface File Naming Conventions +- Error interface files must match pattern: `(I)?.*Errors.sol` +- Event interface files must match pattern: `(I)?.*Events.sol` + +## Generated Facade Contract Specifications + +### Contract Structure +1. SPDX License Identifier: MIT +2. Solidity version: ^0.8.24 +3. Imports: + - Schema.sol from bundleDirName + - All error and event interfaces +4. Contract inheritance: Extends Schema and all imported interfaces + +### Function Generation Rules +- Skip functions that are: + - Unnamed (constructor, fallback, receive) + - Start with "test" + - Named "setUp" + - Marked as private or internal + - Listed in excludeFunctionNames +- Default visibility is "public" if not specified + +## Versioning System + +### Version Format +- Format: `{facadeName}V{major}_{minor}_{patch}.sol` +- Example: `TextDAOFacadeV1_0_0.sol` + +### Version Increment Rules +1. Major Version (X.0.0): + - Incremented when function signatures change (name or parameters) + - Resets minor and patch versions to 0 +2. Minor Version (0.X.0): + - Incremented when errors or events change + - Resets patch version to 0 +3. Patch Version (0.0.X): + - Reserved for future use + +## Examples + +### Solidity Contract Bundle Configuration +```yaml +- bundleName: "TextDAO" + facades: + - name: "TextDAOFacade" + excludeFileNames: + - "OnlyAdminCheats.sol" + excludeFunctionNames: + - "adminOnly" + - "internalUpgrade" +``` + +### Multiple Facade Configuration +```yaml +- bundleName: "GovernanceContract" + facades: + - name: "PublicFacade" + excludeFileNames: + - "AdminControls.sol" + excludeFunctionNames: + - "emergencyStop" + + - name: "AdminFacade" + excludeFileNames: + - "PublicInteractions.sol" +``` + +## Solidity-Specific Considerations + +### File Exclusions +- Typically used to separate administrative or sensitive contract files +- Can exclude utility contracts, test contracts, or partial implementations +- Helps in managing contract visibility and access + +### Function Exclusions +- Prevents exposure of internal or administrative functions +- Useful for creating restricted interfaces +- Supports creating different levels of contract access + +## Validation Rules + +1. `bundleName` must be a non-empty string +2. If `bundleDirName` is not provided, use `bundleName` as the directory name +3. Each bundle must have at least one facade +4. Exclusions apply to Solidity (`.sol`) files and function names +5. Excluded elements are removed from the generated facade interface + +## Best Practices + +- Use clear naming conventions for contracts and functions +- Be intentional about what is included or excluded +- Consider security implications of facade design +- Align exclusions with access control and contract architecture \ No newline at end of file diff --git a/etc/facadeBuilder/facade.yaml b/etc/facadeBuilder/facade.yaml new file mode 100644 index 00000000..0898afad --- /dev/null +++ b/etc/facadeBuilder/facade.yaml @@ -0,0 +1,4 @@ +- bundleName: "MetacontractStandards" + bundleDirName: "std" + facades: + - name: "MetacontractStandardFacade" diff --git a/etc/facadeBuilder/facadeBuilder.js b/etc/facadeBuilder/facadeBuilder.js new file mode 100644 index 00000000..be752838 --- /dev/null +++ b/etc/facadeBuilder/facadeBuilder.js @@ -0,0 +1,680 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var parser_1 = require("@solidity-parser/parser"); +var fs = require("fs-extra"); +var path = require("path"); +var yaml = require("js-yaml"); +// 新しいクラスを作成 +var FacadeBuilder = /** @class */ (function () { + function FacadeBuilder(facadeConfigPath, facadeDir, projectRoot) { + this.facadeConfigPath = facadeConfigPath; + this.facadeDir = facadeDir; + this.projectRoot = projectRoot; + } + FacadeBuilder.prototype.build = function () { + return __awaiter(this, void 0, void 0, function () { + var facadeConfigs, facadeFiles, _i, facadeConfigs_1, config; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + process.chdir(this.projectRoot); + return [4 /*yield*/, fs.ensureDir(path.resolve(this.facadeDir))]; + case 1: + _a.sent(); + return [4 /*yield*/, this.loadConfigurations()]; + case 2: + facadeConfigs = _a.sent(); + return [4 /*yield*/, getSolidityFiles(this.facadeDir)]; + case 3: + facadeFiles = _a.sent(); + _i = 0, facadeConfigs_1 = facadeConfigs; + _a.label = 4; + case 4: + if (!(_i < facadeConfigs_1.length)) return [3 /*break*/, 7]; + config = facadeConfigs_1[_i]; + return [4 /*yield*/, this.processBuilderConfig(config, facadeFiles)]; + case 5: + _a.sent(); + _a.label = 6; + case 6: + _i++; + return [3 /*break*/, 4]; + case 7: return [2 /*return*/]; + } + }); + }); + }; + FacadeBuilder.prototype.loadConfigurations = function () { + return __awaiter(this, void 0, void 0, function () { + var configContent, configRaws, _i, configRaws_1, configRaw, _a, _b, facade, config, err_1; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _c.trys.push([0, 2, , 3]); + return [4 /*yield*/, fs.readFile(this.facadeConfigPath, 'utf8')]; + case 1: + configContent = _c.sent(); + configRaws = yaml.load(configContent); + for (_i = 0, configRaws_1 = configRaws; _i < configRaws_1.length; _i++) { + configRaw = configRaws_1[_i]; + if (!configRaw.bundleDirName) { + configRaw.bundleDirName = configRaw.bundleName; + } + // Ensure excludeFileNames and excludeFunctionNames are arrays + for (_a = 0, _b = configRaw.facades; _a < _b.length; _a++) { + facade = _b[_a]; + if (!facade.excludeFileNames) { + facade.excludeFileNames = []; + } + if (!facade.excludeFunctionNames) { + facade.excludeFunctionNames = []; + } + } + } + config = configRaws; + return [2 /*return*/, config]; + case 2: + err_1 = _c.sent(); + console.error("Could not load facade configuration from ".concat(this.facadeConfigPath, ".")); + process.exit(1); + return [3 /*break*/, 3]; + case 3: return [2 /*return*/]; + } + }); + }); + }; + FacadeBuilder.prototype.processBuilderConfig = function (config, existingFacadeFiles) { + return __awaiter(this, void 0, void 0, function () { + var sourceFiles, _i, _a, facade, facadeObject, generatedCode, latestFacade, latestObject, latestCode, latestAst, err_2, majorDiff, minorErrorDiff, minorEventDiff; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + validateFacadeConfig(config); + return [4 /*yield*/, this.collectSourceFiles(config.bundleDirName)]; + case 1: + sourceFiles = _b.sent(); + _i = 0, _a = config.facades; + _b.label = 2; + case 2: + if (!(_i < _a.length)) return [3 /*break*/, 13]; + facade = _a[_i]; + return [4 /*yield*/, this.extractFacadeObjects(sourceFiles, facade)]; + case 3: + facadeObject = _b.sent(); + return [4 /*yield*/, this.generateFacadeContract(facadeObject, facade, config)]; + case 4: + generatedCode = _b.sent(); + latestFacade = getLatestVersionFile(existingFacadeFiles, facade.name); + if (!(latestFacade === null)) return [3 /*break*/, 6]; + return [4 /*yield*/, this.writeFacadeContract(facade.name, [1, 0, 0], generatedCode)]; + case 5: + _b.sent(); + process.exit(1); + _b.label = 6; + case 6: + latestObject = { + files: [], + errors: [], + events: [], + functions: [] + }; + _b.label = 7; + case 7: + _b.trys.push([7, 9, , 10]); + return [4 /*yield*/, fs.readFile(latestFacade.file, 'utf8')]; + case 8: + latestCode = _b.sent(); + latestAst = (0, parser_1.parse)(latestCode, { tolerant: true }); + // Extract functions from the AST + traverseASTs(latestAst, latestObject, latestFacade.file, facade); + return [3 /*break*/, 10]; + case 9: + err_2 = _b.sent(); + console.error("Error parsing ".concat(latestFacade.file, ":"), err_2); + process.exit(1); + return [3 /*break*/, 10]; + case 10: + majorDiff = getSymmetricDifference(facadeObject.functions, latestObject.functions, ["name", "parameters"]); + if (majorDiff.length > 0) { + latestFacade.version[0]++; + } + minorErrorDiff = getSymmetricDifference(facadeObject.errors, latestObject.errors, ["name", "parameters"]); + minorEventDiff = getSymmetricDifference(facadeObject.events, latestObject.events, ["name", "parameters"]); + if (minorErrorDiff.length > 0 || minorEventDiff.length > 0) { + latestFacade.version[1]++; + } + return [4 /*yield*/, this.writeFacadeContract(facade.name, latestFacade.version, generatedCode)]; + case 11: + _b.sent(); + _b.label = 12; + case 12: + _i++; + return [3 /*break*/, 2]; + case 13: return [2 /*return*/]; + } + }); + }); + }; + FacadeBuilder.prototype.collectSourceFiles = function (bundleDirName) { + return __awaiter(this, void 0, void 0, function () { + var functionDir, interfaceDir; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + functionDir = "./src/".concat(bundleDirName, "/functions"); + interfaceDir = "./src/".concat(bundleDirName, "/interfaces"); + _a = {}; + return [4 /*yield*/, getSolidityFiles(functionDir)]; + case 1: + _a.functionFiles = _b.sent(); + return [4 /*yield*/, getSolidityFiles(interfaceDir)]; + case 2: return [2 /*return*/, (_a.interfaceFiles = _b.sent(), + _a)]; + } + }); + }); + }; + FacadeBuilder.prototype.extractFacadeObjects = function (sourceFiles, facade) { + return __awaiter(this, void 0, void 0, function () { + var facadeObject, regex, _i, _a, file, fileName, content, ast, _b, _c, file, fileName, content, ast; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + facadeObject = { + files: [], + errors: [], + events: [], + functions: [] + }; + regex = /^(I)?.*(Errors|Events)\.sol$/; + _i = 0, _a = sourceFiles.interfaceFiles; + _d.label = 1; + case 1: + if (!(_i < _a.length)) return [3 /*break*/, 4]; + file = _a[_i]; + fileName = path.basename(file); + if (!regex.test(fileName)) { + return [3 /*break*/, 3]; + } + facadeObject.files.push({ name: fileName.replace(/\.sol$/, ""), origin: file.replace(/\\/g, '/') }); + return [4 /*yield*/, fs.readFile(file, 'utf8')]; + case 2: + content = _d.sent(); + try { + ast = (0, parser_1.parse)(content, { tolerant: true }); + // Extract functions from the AST + traverseASTs(ast, facadeObject, fileName, facade, true); + } + catch (err) { + console.error("Error parsing ".concat(file, ":"), err); + } + _d.label = 3; + case 3: + _i++; + return [3 /*break*/, 1]; + case 4: + _b = 0, _c = sourceFiles.functionFiles; + _d.label = 5; + case 5: + if (!(_b < _c.length)) return [3 /*break*/, 8]; + file = _c[_b]; + fileName = path.basename(file); + // Exclude files based on facade configuration + if (facade.excludeFileNames.includes(fileName)) { + return [3 /*break*/, 7]; + } + return [4 /*yield*/, fs.readFile(file, 'utf8')]; + case 6: + content = _d.sent(); + try { + ast = (0, parser_1.parse)(content, { tolerant: true }); + // Extract functions from the AST + traverseASTs(ast, facadeObject, fileName, facade); + } + catch (err) { + console.error("Error parsing ".concat(file, ":"), err); + } + _d.label = 7; + case 7: + _b++; + return [3 /*break*/, 5]; + case 8: return [2 /*return*/, facadeObject]; + } + }); + }); + }; + FacadeBuilder.prototype.generateFacadeContract = function (objects, facade, config) { + return __awaiter(this, void 0, void 0, function () { + var facadeFilePath, code, _i, _a, file, _b, _c, error, _d, _e, event_1, _f, _g, func; + return __generator(this, function (_h) { + facadeFilePath = path.join(this.facadeDir, "".concat(facade.name, ".sol")); + code = "// SPDX-License-Identifier: MIT\n pragma solidity ^0.8.24;\n \n import {Schema} from \"src/".concat(config.bundleDirName, "/storage/Schema.sol\";\n "); + for (_i = 0, _a = objects.files; _i < _a.length; _i++) { + file = _a[_i]; + code += "import {".concat(file.name, "} from \"").concat(file.origin, "\";\n"); + } + code += "\ncontract ".concat(facade.name, " is Schema, ").concat(objects.files.map(function (file) { return file.name; }).join(', '), " {\n"); + for (_b = 0, _c = objects.errors; _b < _c.length; _b++) { + error = _c[_b]; + if (error.imported) { + continue; + } + code += generateError(error); + } + code += "\n"; + for (_d = 0, _e = objects.events; _d < _e.length; _d++) { + event_1 = _e[_d]; + if (event_1.imported) { + continue; + } + code += generateEvent(event_1); + } + code += "\n"; + for (_f = 0, _g = objects.functions; _f < _g.length; _f++) { + func = _g[_f]; + code += generateFunctionSignature(func); + } + code += "}\n"; + return [2 /*return*/, code]; + }); + }); + }; + FacadeBuilder.prototype.writeFacadeContract = function (facadeName, version, code) { + return __awaiter(this, void 0, void 0, function () { + var facadeFilePath; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + facadeFilePath = path.join(this.facadeDir, "".concat(facadeName, "V").concat(version[0], "_").concat(version[1], "_").concat(version[2], ".sol")); + return [4 /*yield*/, fs.writeFile(facadeFilePath, code)]; + case 1: + _a.sent(); + console.log("Facade contract generated at ".concat(facadeFilePath)); + return [2 /*return*/]; + } + }); + }); + }; + return FacadeBuilder; +}()); +// メイン関数を簡素化 +function main() { + return __awaiter(this, void 0, void 0, function () { + var facadeConfigPath, facadeDir, projectRoot, builder, error_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + facadeConfigPath = './facade.yaml'; + facadeDir = './generated'; + projectRoot = path.resolve(__dirname, '../../'); + builder = new FacadeBuilder(facadeConfigPath, facadeDir, projectRoot); + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, builder.build()]; + case 2: + _a.sent(); + return [3 /*break*/, 4]; + case 3: + error_1 = _a.sent(); + console.error('Facade generation failed:', error_1); + process.exit(1); + return [3 /*break*/, 4]; + case 4: return [2 /*return*/]; + } + }); + }); +} +// async function main1() { +// const facadeDir = './generated'; +// const projectRoot = path.resolve(__dirname, '../../'); +// process.chdir(projectRoot); +// // Ensure output directory exists +// await fs.ensureDir(path.resolve(facadeDir)); +// const facadeFiles = await getSolidityFiles(facadeDir); +// // Load facade configuration +// const facadeConfigs: FacadeConfig[] = []; +// for (const facadeConfig of facadeConfigs) { +// validateFacadeConfig(facadeConfig); +// const functionDir = `./src/${facadeConfig.bundleDirName}/functions`; // Adjust the path as needed +// const interfaceDir = `./src/${facadeConfig.bundleDirName}/interfaces`; // Adjust the path as needed +// // Recursively read all Solidity files in the source directory +// const functionFiles = await getSolidityFiles(functionDir); +// const interfaceFiles = await getSolidityFiles(interfaceDir); +// const regex = /^(I)?.*(Errors|Events)\.sol$/; +// // Process each facade +// for (const facade of facadeConfig.facades) { +// const facadeObject: FacadeObjects = { +// files: [], +// errors: [], +// events: [], +// functions: [] +// }; +// for (const file of interfaceFiles) { +// const fileName = path.basename(file); +// if (!regex.test(fileName)) { +// continue; +// } +// facadeObject.files.push({ name: fileName.replace(/\.sol$/, ""), origin: file.replace(/\\/g, '/') }); +// const content = await fs.readFile(file, 'utf8'); +// try { +// const ast = parse(content, { tolerant: true }); +// // Extract functions from the AST +// traverseASTs(ast, facadeObject, fileName, facade, true); +// } catch (err) { +// console.error(`Error parsing ${file}:`, err); +// } +// } +// for (const file of functionFiles) { +// const fileName = path.basename(file); +// // Exclude files based on facade configuration +// if (facade.excludeFileNames.includes(fileName)) { +// continue; +// } +// const content = await fs.readFile(file, 'utf8'); +// try { +// const ast = parse(content, { tolerant: true }); +// // Extract functions from the AST +// traverseASTs(ast, facadeObject, fileName, facade); +// } catch (err) { +// console.error(`Error parsing ${file}:`, err); +// } +// } +// // Generate facade contract +// const generatedCode = await generateFacadeContract(facadeObject, facade, facadeConfig); +// const latestFacade = getLatestVersionFile(facadeFiles, facade.name); +// if (latestFacade === null) { +// writeFacadeContract(facade.name, [1, 0, 0], generatedCode); +// process.exit(1); +// } +// const latestObject: FacadeObjects = { +// files: [], +// errors: [], +// events: [], +// functions: [] +// }; +// try { +// const generatedAst = parse(generatedCode, { tolerant: true }); +// // Extract functions from the AST +// traverseASTs(generatedAst, latestObject, latestFacade.file, facade); +// } catch (err) { +// console.error(`Error parsing ${latestFacade.file}:`, err); +// process.exit(1); +// } +// const majorDiff = getSymmetricDifference(facadeObject.functions, latestObject.functions, ["name", "parameters"]); +// if (majorDiff.length > 0) { +// latestFacade.version[0]++; +// } +// let minorDiff = getSymmetricDifference(facadeObject.errors, latestObject.errors, ["name", "parameters"]); +// if (minorDiff.length > 0) { +// latestFacade.version[1]++; +// } +// minorDiff = getSymmetricDifference(facadeObject.events, latestObject.events, ["name", "parameters"]); +// if (minorDiff.length > 0) { +// latestFacade.version[1]++; +// } +// writeFacadeContract(facade.name, latestFacade.version, generatedCode); +// } +// } +// } +function validateFacadeConfig(facadeConfig) { + // Ensure required fields are present + if (!facadeConfig.bundleName || !facadeConfig.bundleDirName) { + console.error('Error: bundleName and bundleDirName are required in facade.yaml'); + process.exit(1); + } + if (!facadeConfig.facades || facadeConfig.facades.length === 0) { + console.error('Error: At least one facade must be defined in facade.yaml'); + process.exit(1); + } + for (var _i = 0, _a = facadeConfig.facades; _i < _a.length; _i++) { + var facade = _a[_i]; + if (!facade.name) { + console.error('Error: Each facade must have a name'); + process.exit(1); + } + } +} +function getSolidityFiles(dir) { + return __awaiter(this, void 0, void 0, function () { + var files, items, _i, items_1, item, fullPath, stat, subFiles; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + files = []; + return [4 /*yield*/, fs.readdir(dir)]; + case 1: + items = _a.sent(); + _i = 0, items_1 = items; + _a.label = 2; + case 2: + if (!(_i < items_1.length)) return [3 /*break*/, 7]; + item = items_1[_i]; + fullPath = path.join(dir, item); + return [4 /*yield*/, fs.stat(fullPath)]; + case 3: + stat = _a.sent(); + if (!stat.isDirectory()) return [3 /*break*/, 5]; + return [4 /*yield*/, getSolidityFiles(fullPath)]; + case 4: + subFiles = _a.sent(); + files = files.concat(subFiles); + return [3 /*break*/, 6]; + case 5: + if (stat.isFile() && path.extname(item) === '.sol') { + files.push(fullPath); + } + _a.label = 6; + case 6: + _i++; + return [3 /*break*/, 2]; + case 7: return [2 /*return*/, files]; + } + }); + }); +} +function getLatestVersionFile(files, baseName) { + var regex = new RegExp("^".concat(baseName, "(?:V(\\d+)_(\\d+)_(\\d+))?\\.sol$")); + return files + .map(function (file) { + var match = path.basename(file).match(regex); + if (match) { + var _a = match.map(Number), _ = _a[0], major = _a[1], minor = _a[2], patch = _a[3]; + return { + file: file, + version: [major || 1, minor || 0, patch || 0], + }; + } + return null; + }) + .filter(function (item) { return item !== null; }) + .sort(function (a, b) { + // バージョン配列を比較 (降順) + for (var i = 0; i < 3; i++) { + if (b.version[i] !== a.version[i]) { + return b.version[i] - a.version[i]; + } + } + return 0; + })[0] || null; +} +function getSymmetricDifference(array1, array2, keys) { + var isMatch = function (a, b) { return keys.every(function (key) { return a[key] === b[key]; }); }; + // A ∪ B + var union = __spreadArray(__spreadArray([], array1, true), array2, true); + // A ∩ B + var intersection = array1.filter(function (item1) { + return array2.some(function (item2) { return isMatch(item1, item2); }); + }); + // A ∪ B - A ∩ B + return union.filter(function (item) { + return !intersection.some(function (intersectItem) { return isMatch(item, intersectItem); }); + }); +} +function traverseASTs(ast, facadeObjects, origin, facade, imported) { + if (imported === void 0) { imported = false; } + if (ast.type === 'FunctionDefinition' && ast.isConstructor === false) { + extractFunctions(ast, facadeObjects.functions, origin, facade); + } + else if (ast.type === 'ContractDefinition') { + // Traverse contract sub-nodes + for (var _i = 0, _a = ast.subNodes; _i < _a.length; _i++) { + var subNode = _a[_i]; + traverseASTs(subNode, facadeObjects, origin, facade, imported); + } + } + else if (ast.type === 'SourceUnit') { + // Traverse source unit nodes + for (var _b = 0, _c = ast.children; _b < _c.length; _b++) { + var child = _c[_b]; + traverseASTs(child, facadeObjects, origin, facade, imported); + } + } + else if (ast.type === 'CustomErrorDefinition') { + extractErrors(ast, facadeObjects.errors, origin, imported); + } + else if (ast.type === 'EventDefinition') { + extractEvents(ast, facadeObjects.events, origin, imported); + } +} +function extractErrors(ast, errors, origin, imported) { + var error = { + name: ast.name, + parameters: ast.parameters + .map(function (param) { return getParameter(param); }) + .join(', '), + origin: origin, + imported: imported + }; + errors.push(error); +} +function extractEvents(ast, events, origin, imported) { + var event = { + name: ast.name, + parameters: ast.parameters + .map(function (param) { return getParameter(param); }) + .join(', '), + origin: origin, + imported: imported + }; + events.push(event); +} +function extractFunctions(ast, functions, origin, facade) { + // Skip functions based on the criteria + if (!ast.name || // Skip unnamed functions (constructor, fallback, receive) + ast.name.startsWith('test') || + ast.name === 'setUp' || + ast.visibility === 'private' || + ast.visibility === 'internal' || + facade.excludeFunctionNames.includes(ast.name)) { + return; + } + var func = { + name: ast.name, + visibility: ast.visibility || 'default', + stateMutability: ast.stateMutability || '', + parameters: ast.parameters + .map(function (param) { return getParameter(param); }) + .join(', '), + returnParameters: ast.returnParameters + ? ast.returnParameters + .map(function (param) { return getParameter(param); }) + .join(', ') + : '', + origin: origin, // Set the origin to the file name + }; + // Add to functions array + functions.push(func); +} +function getParameter(param) { + var typeName = getTypeName(param.typeName); + return "".concat(typeName).concat(param.storageLocation ? ' ' + param.storageLocation : '').concat(param.name ? ' ' + param.name : ''); +} +function getTypeName(typeName) { + if (!typeName) + return ''; + if (typeName.type === 'ElementaryTypeName') { + return typeName.name; + } + else if (typeName.type === 'UserDefinedTypeName') { + return typeName.namePath; + } + else if (typeName.type === 'Mapping') { + return "mapping(".concat(getTypeName(typeName.keyType), " => ").concat(getTypeName(typeName.valueType), ")"); + } + else if (typeName.type === 'ArrayTypeName') { + return "".concat(getTypeName(typeName.baseTypeName), "[]"); + } + else if (typeName.type === 'FunctionTypeName') { + // Simplify function type names for parameters + return 'function'; + } + else { + return 'unknown'; + } +} +function generateError(error) { + return " error ".concat(error.name, "(").concat(error.parameters, ");\n"); +} +function generateEvent(event) { + return " event ".concat(event.name, "(").concat(event.parameters, ");\n"); +} +function generateFunctionSignature(func) { + var visibility = func.visibility !== 'default' ? func.visibility : 'public'; + var stateMutability = func.stateMutability + ? ' ' + func.stateMutability + : ''; + var returns = func.returnParameters + ? " returns (".concat(func.returnParameters, ")") + : ''; + return " function ".concat(func.name, "(").concat(func.parameters, ") ").concat(visibility).concat(stateMutability).concat(returns, " {}\n"); +} +main().catch(function (err) { + console.error('Error:', err); +}); diff --git a/etc/facadeBuilder/facadeBuilder.ts b/etc/facadeBuilder/facadeBuilder.ts new file mode 100644 index 00000000..2ad315de --- /dev/null +++ b/etc/facadeBuilder/facadeBuilder.ts @@ -0,0 +1,624 @@ +import { parse } from '@solidity-parser/parser'; +import * as fs from 'fs-extra'; +import * as path from 'path'; +import * as yaml from 'js-yaml'; + +// Load facade configuration +interface FacadeConfig { + bundleName: string; + bundleDirName: string; + facades: FacadeDefinition[]; +} + +interface FacadeDefinition { + name: string; + excludeFileNames: string[]; + excludeFunctionNames: string[]; +} + +interface FacadeObjects { + files: FileSignature[], + errors: ErrorSignature[], + events: EventSignature[], + functions: FunctionSignature[], +} + +interface FileSignature { + name: string; + origin: string; // Name of the origin file +} +interface ErrorSignature { + name: string; + parameters: string; + origin: string; // Name of the origin file + imported: boolean; +} +interface EventSignature { + name: string; + parameters: string; + origin: string; // Name of the origin file + imported: boolean; +} +interface FunctionSignature { + name: string; + visibility: string; + stateMutability: string; + parameters: string; + returnParameters: string; + origin: string; // Name of the origin file +} + +// 新しいクラスを作成 +class FacadeBuilder { + private facadeConfigPath: string; + private facadeDir: string; + private projectRoot: string; + + constructor(facadeConfigPath: string, facadeDir: string, projectRoot: string) { + this.facadeConfigPath = facadeConfigPath; + this.facadeDir = facadeDir; + this.projectRoot = projectRoot; + } + + async build() { + process.chdir(this.projectRoot); + await fs.ensureDir(path.resolve(this.facadeDir)); + + const facadeConfigs = await this.loadConfigurations(); + const facadeFiles = await getSolidityFiles(this.facadeDir); + + for (const config of facadeConfigs) { + await this.processBuilderConfig(config, facadeFiles); + } + } + + private async loadConfigurations(): Promise { + try { + const configContent = await fs.readFile(this.facadeConfigPath, 'utf8'); + const configRaws = yaml.load(configContent) as any; + + for (let configRaw of configRaws) { + if (!configRaw.bundleDirName) { + configRaw.bundleDirName = configRaw.bundleName + } + // Ensure excludeFileNames and excludeFunctionNames are arrays + for (const facade of configRaw.facades) { + if (!facade.excludeFileNames) { + facade.excludeFileNames = []; + } + if (!facade.excludeFunctionNames) { + facade.excludeFunctionNames = []; + } + } + } + + const config = configRaws as FacadeConfig[]; + return config; + } catch (err) { + console.error(`Could not load facade configuration from ${this.facadeConfigPath}.`); + process.exit(1); + } + } + + private async processBuilderConfig( + config: FacadeConfig, + existingFacadeFiles: string[] + ) { + validateFacadeConfig(config); + + const sourceFiles = await this.collectSourceFiles(config.bundleDirName); + + for (const facade of config.facades) { + const facadeObject = await this.extractFacadeObjects(sourceFiles, facade); + const generatedCode = await this.generateFacadeContract( + facadeObject, + facade, + config, + ); + const latestFacade = getLatestVersionFile(existingFacadeFiles, facade.name); + if (latestFacade === null) { + await this.writeFacadeContract(facade.name, [1, 0, 0], generatedCode); + process.exit(1); + } + const latestObject: FacadeObjects = { + files: [], + errors: [], + events: [], + functions: [] + }; + try { + const latestCode = await fs.readFile(latestFacade.file, 'utf8'); + const latestAst = parse(latestCode, { tolerant: true }); + + // Extract functions from the AST + traverseASTs(latestAst, latestObject, latestFacade.file, facade); + } catch (err) { + console.error(`Error parsing ${latestFacade.file}:`, err); + process.exit(1); + } + const majorDiff = getSymmetricDifference(facadeObject.functions, latestObject.functions, ["name", "parameters"]); + if (majorDiff.length > 0) { + latestFacade.version[0]++; + } + const minorErrorDiff = getSymmetricDifference(facadeObject.errors, latestObject.errors, ["name", "parameters"]); + const minorEventDiff = getSymmetricDifference(facadeObject.events, latestObject.events, ["name", "parameters"]); + if (minorErrorDiff.length > 0 || minorEventDiff.length > 0) { + latestFacade.version[1]++; + } + + await this.writeFacadeContract(facade.name, latestFacade.version, generatedCode); + } + } + + private async collectSourceFiles(bundleDirName: string) { + const functionDir = `./src/${bundleDirName}/functions`; + const interfaceDir = `./src/${bundleDirName}/interfaces`; + + return { + functionFiles: await getSolidityFiles(functionDir), + interfaceFiles: await getSolidityFiles(interfaceDir) + }; + } + + private async extractFacadeObjects( + sourceFiles: { functionFiles: string[], interfaceFiles: string[] }, + facade: FacadeDefinition + ): Promise { + const facadeObject: FacadeObjects = { + files: [], + errors: [], + events: [], + functions: [] + }; + const regex = /^(I)?.*(Errors|Events)\.sol$/; + + for (const file of sourceFiles.interfaceFiles) { + const fileName = path.basename(file); + + if (!regex.test(fileName)) { + continue; + } + + facadeObject.files.push({ name: fileName.replace(/\.sol$/, ""), origin: file.replace(/\\/g, '/') }); + + const content = await fs.readFile(file, 'utf8'); + try { + const ast = parse(content, { tolerant: true }); + + // Extract functions from the AST + traverseASTs(ast, facadeObject, fileName, facade, true); + } catch (err) { + console.error(`Error parsing ${file}:`, err); + } + } + + for (const file of sourceFiles.functionFiles) { + const fileName = path.basename(file); + + // Exclude files based on facade configuration + if (facade.excludeFileNames.includes(fileName)) { + continue; + } + + const content = await fs.readFile(file, 'utf8'); + try { + const ast = parse(content, { tolerant: true }); + + // Extract functions from the AST + traverseASTs(ast, facadeObject, fileName, facade); + } catch (err) { + console.error(`Error parsing ${file}:`, err); + } + } + + return facadeObject; + } + + private async generateFacadeContract( + objects: FacadeObjects, + facade: FacadeDefinition, + config: FacadeConfig + ): Promise { + const facadeFilePath = path.join(this.facadeDir, `${facade.name}.sol`); + let code = `// SPDX-License-Identifier: MIT + pragma solidity ^0.8.24; + + import {Schema} from "src/${config.bundleDirName}/storage/Schema.sol"; + `; + + for (const file of objects.files) { + code += `import {${file.name}} from "${file.origin}";\n`; + } + + code += `\ncontract ${facade.name} is Schema, ${objects.files.map((file) => file.name).join(', ')} {\n`; + + for (const error of objects.errors) { + if (error.imported) { + continue; + } + code += generateError(error); + } + code += `\n`; + for (const event of objects.events) { + if (event.imported) { + continue; + } + code += generateEvent(event); + } + code += `\n`; + for (const func of objects.functions) { + code += generateFunctionSignature(func); + } + + code += `}\n`; + + return code; + } + + private async writeFacadeContract(facadeName: string, version: number[], code: string) { + // Write the facade contract to the output file + const facadeFilePath = path.join(this.facadeDir, `${facadeName}V${version[0]}_${version[1]}_${version[2]}.sol`); + await fs.writeFile(facadeFilePath, code); + console.log(`Facade contract generated at ${facadeFilePath}`); + } +} + +// メイン関数を簡素化 +async function main() { + const facadeConfigPath = './facade.yaml'; + const facadeDir = './generated'; + const projectRoot = path.resolve(__dirname, '../../'); + + const builder = new FacadeBuilder(facadeConfigPath, facadeDir, projectRoot); + + try { + await builder.build(); + } catch (error) { + console.error('Facade generation failed:', error); + process.exit(1); + } +} + +// async function main1() { +// const facadeDir = './generated'; +// const projectRoot = path.resolve(__dirname, '../../'); +// process.chdir(projectRoot); + +// // Ensure output directory exists +// await fs.ensureDir(path.resolve(facadeDir)); +// const facadeFiles = await getSolidityFiles(facadeDir); + +// // Load facade configuration +// const facadeConfigs: FacadeConfig[] = []; + +// for (const facadeConfig of facadeConfigs) { +// validateFacadeConfig(facadeConfig); + +// const functionDir = `./src/${facadeConfig.bundleDirName}/functions`; // Adjust the path as needed +// const interfaceDir = `./src/${facadeConfig.bundleDirName}/interfaces`; // Adjust the path as needed +// // Recursively read all Solidity files in the source directory +// const functionFiles = await getSolidityFiles(functionDir); +// const interfaceFiles = await getSolidityFiles(interfaceDir); + +// const regex = /^(I)?.*(Errors|Events)\.sol$/; + +// // Process each facade +// for (const facade of facadeConfig.facades) { +// const facadeObject: FacadeObjects = { +// files: [], +// errors: [], +// events: [], +// functions: [] +// }; + +// for (const file of interfaceFiles) { +// const fileName = path.basename(file); + +// if (!regex.test(fileName)) { +// continue; +// } + +// facadeObject.files.push({ name: fileName.replace(/\.sol$/, ""), origin: file.replace(/\\/g, '/') }); + +// const content = await fs.readFile(file, 'utf8'); +// try { +// const ast = parse(content, { tolerant: true }); + +// // Extract functions from the AST +// traverseASTs(ast, facadeObject, fileName, facade, true); +// } catch (err) { +// console.error(`Error parsing ${file}:`, err); +// } +// } + +// for (const file of functionFiles) { +// const fileName = path.basename(file); + +// // Exclude files based on facade configuration +// if (facade.excludeFileNames.includes(fileName)) { +// continue; +// } + +// const content = await fs.readFile(file, 'utf8'); +// try { +// const ast = parse(content, { tolerant: true }); + +// // Extract functions from the AST +// traverseASTs(ast, facadeObject, fileName, facade); +// } catch (err) { +// console.error(`Error parsing ${file}:`, err); +// } +// } + +// // Generate facade contract +// const generatedCode = await generateFacadeContract(facadeObject, facade, facadeConfig); + +// const latestFacade = getLatestVersionFile(facadeFiles, facade.name); +// if (latestFacade === null) { +// writeFacadeContract(facade.name, [1, 0, 0], generatedCode); +// process.exit(1); +// } + +// const latestObject: FacadeObjects = { +// files: [], +// errors: [], +// events: [], +// functions: [] +// }; +// try { +// const generatedAst = parse(generatedCode, { tolerant: true }); + +// // Extract functions from the AST +// traverseASTs(generatedAst, latestObject, latestFacade.file, facade); +// } catch (err) { +// console.error(`Error parsing ${latestFacade.file}:`, err); +// process.exit(1); +// } +// const majorDiff = getSymmetricDifference(facadeObject.functions, latestObject.functions, ["name", "parameters"]); +// if (majorDiff.length > 0) { +// latestFacade.version[0]++; +// } +// let minorDiff = getSymmetricDifference(facadeObject.errors, latestObject.errors, ["name", "parameters"]); +// if (minorDiff.length > 0) { +// latestFacade.version[1]++; +// } +// minorDiff = getSymmetricDifference(facadeObject.events, latestObject.events, ["name", "parameters"]); +// if (minorDiff.length > 0) { +// latestFacade.version[1]++; +// } +// writeFacadeContract(facade.name, latestFacade.version, generatedCode); +// } +// } +// } + +function validateFacadeConfig(facadeConfig: FacadeConfig) { + // Ensure required fields are present + if (!facadeConfig.bundleName || !facadeConfig.bundleDirName) { + console.error('Error: bundleName and bundleDirName are required in facade.yaml'); + process.exit(1); + } + + if (!facadeConfig.facades || facadeConfig.facades.length === 0) { + console.error('Error: At least one facade must be defined in facade.yaml'); + process.exit(1); + } + + for (const facade of facadeConfig.facades) { + if (!facade.name) { + console.error('Error: Each facade must have a name'); + process.exit(1); + } + } +} + +async function getSolidityFiles(dir: string): Promise { + let files: string[] = []; + const items = await fs.readdir(dir); + + for (const item of items) { + const fullPath = path.join(dir, item); + const stat = await fs.stat(fullPath); + + if (stat.isDirectory()) { + const subFiles = await getSolidityFiles(fullPath); + files = files.concat(subFiles); + } else if (stat.isFile() && path.extname(item) === '.sol') { + files.push(fullPath); + } + } + + return files; +} + +function getLatestVersionFile(files: string[], baseName: string): { file: string; version: number[] } | null { + const regex = new RegExp(`^${baseName}(?:V(\\d+)_(\\d+)_(\\d+))?\\.sol$`); + + return files + .map(file => { + const match = path.basename(file).match(regex); + if (match) { + const [_, major, minor, patch] = match.map(Number); + return { + file, + version: [major || 1, minor || 0, patch || 0], + }; + } + return null; + }) + .filter((item): item is { file: string; version: number[] } => item !== null) + .sort((a, b) => { + // バージョン配列を比較 (降順) + for (let i = 0; i < 3; i++) { + if (b.version[i] !== a.version[i]) { + return b.version[i] - a.version[i]; + } + } + return 0; + })[0] || null; +} + +function getSymmetricDifference( + array1: T[], + array2: T[], + keys: (keyof T)[] +): T[] { + const isMatch = (a: T, b: T) => keys.every(key => a[key] === b[key]); + + // A ∪ B + const union = [...array1, ...array2]; + // A ∩ B + const intersection = array1.filter(item1 => + array2.some(item2 => isMatch(item1, item2)) + ); + + // A ∪ B - A ∩ B + return union.filter(item => + !intersection.some(intersectItem => isMatch(item, intersectItem)) + ); +} + +function traverseASTs( + ast: any, + facadeObjects: FacadeObjects, + origin: string, + facade: FacadeDefinition, + imported: boolean = false +) { + if (ast.type === 'FunctionDefinition' && ast.isConstructor === false) { + extractFunctions(ast, facadeObjects.functions, origin, facade); + } else if (ast.type === 'ContractDefinition') { + // Traverse contract sub-nodes + for (const subNode of ast.subNodes) { + traverseASTs(subNode, facadeObjects, origin, facade, imported); + } + } else if (ast.type === 'SourceUnit') { + // Traverse source unit nodes + for (const child of ast.children) { + traverseASTs(child, facadeObjects, origin, facade, imported); + } + } else if (ast.type === 'CustomErrorDefinition') { + extractErrors(ast, facadeObjects.errors, origin, imported); + } else if (ast.type === 'EventDefinition') { + extractEvents(ast, facadeObjects.events, origin, imported); + } +} + +function extractErrors( + ast: any, + errors: ErrorSignature[], + origin: string, + imported: boolean +) { + const error: ErrorSignature = { + name: ast.name, + parameters: ast.parameters + .map((param: any) => getParameter(param)) + .join(', '), + origin: origin, + imported: imported + }; + errors.push(error); +} + +function extractEvents( + ast: any, + events: EventSignature[], + origin: string, + imported: boolean +) { + const event: EventSignature = { + name: ast.name, + parameters: ast.parameters + .map((param: any) => getParameter(param)) + .join(', '), + origin: origin, + imported: imported + }; + events.push(event); +} + +function extractFunctions( + ast: any, + functions: FunctionSignature[], + origin: string, + facade: FacadeDefinition +) { + // Skip functions based on the criteria + if ( + !ast.name || // Skip unnamed functions (constructor, fallback, receive) + ast.name.startsWith('test') || + ast.name === 'setUp' || + ast.visibility === 'private' || + ast.visibility === 'internal' || + facade.excludeFunctionNames.includes(ast.name) + ) { + return; + } + + const func: FunctionSignature = { + name: ast.name, + visibility: ast.visibility || 'default', + stateMutability: ast.stateMutability || '', + parameters: ast.parameters + .map((param: any) => getParameter(param)) + .join(', '), + returnParameters: ast.returnParameters + ? ast.returnParameters + .map((param: any) => getParameter(param)) + .join(', ') + : '', + origin: origin, // Set the origin to the file name + }; + + // Add to functions array + functions.push(func); +} + +function getParameter(param: any): string { + const typeName = getTypeName(param.typeName); + return `${typeName}${param.storageLocation ? ' ' + param.storageLocation : ''}${param.name ? ' ' + param.name : '' + }`; +} + +function getTypeName(typeName: any): string { + if (!typeName) return ''; + if (typeName.type === 'ElementaryTypeName') { + return typeName.name; + } else if (typeName.type === 'UserDefinedTypeName') { + return typeName.namePath; + } else if (typeName.type === 'Mapping') { + return `mapping(${getTypeName(typeName.keyType)} => ${getTypeName( + typeName.valueType, + )})`; + } else if (typeName.type === 'ArrayTypeName') { + return `${getTypeName(typeName.baseTypeName)}[]`; + } else if (typeName.type === 'FunctionTypeName') { + // Simplify function type names for parameters + return 'function'; + } else { + return 'unknown'; + } +} + +function generateError(error: ErrorSignature) { + return ` error ${error.name}(${error.parameters});\n` +} +function generateEvent(event: EventSignature) { + return ` event ${event.name}(${event.parameters});\n` +} +function generateFunctionSignature(func: FunctionSignature): string { + const visibility = + func.visibility !== 'default' ? func.visibility : 'public'; + const stateMutability = func.stateMutability + ? ' ' + func.stateMutability + : ''; + const returns = func.returnParameters + ? ` returns (${func.returnParameters})` + : ''; + return ` function ${func.name}(${func.parameters}) ${visibility}${stateMutability}${returns} {}\n`; +} + +main().catch((err) => { + console.error('Error:', err); +}); + diff --git a/etc/facadeBuilder/package-lock.json b/etc/facadeBuilder/package-lock.json new file mode 100644 index 00000000..4ee871f3 --- /dev/null +++ b/etc/facadeBuilder/package-lock.json @@ -0,0 +1,1621 @@ +{ + "name": "facadeBuilder", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@solidity-parser/parser": "^0.19.0", + "@types/fs-extra": "^11.0.4", + "@types/js-yaml": "^4.0.9", + "fs-extra": "^11.2.0", + "js-yaml": "^4.1.0", + "path": "^0.12.7", + "pkg": "^5.8.1", + "typescript": "^5.6.2" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", + "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", + "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dev": true, + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-fetch/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + } + } +} diff --git a/etc/facadeBuilder/package.json b/etc/facadeBuilder/package.json new file mode 100644 index 00000000..c7a5c5d2 --- /dev/null +++ b/etc/facadeBuilder/package.json @@ -0,0 +1,21 @@ +{ + "bin": "generateFacades.js", + "pkg": { + "scripts": [ + "node_modules/solidity-parser-antlr/**" + ] + }, + "scripts": { + "exec": "npx tsc ./facadeBuilder.ts && node ./facadeBuilder.js" + }, + "devDependencies": { + "@solidity-parser/parser": "^0.19.0", + "@types/fs-extra": "^11.0.4", + "@types/js-yaml": "^4.0.9", + "fs-extra": "^11.2.0", + "js-yaml": "^4.1.0", + "path": "^0.12.7", + "pkg": "^5.8.1", + "typescript": "^5.6.2" + } +} diff --git a/facade.yaml b/facade.yaml new file mode 100644 index 00000000..4128a5b4 --- /dev/null +++ b/facade.yaml @@ -0,0 +1,4 @@ +- bundleName: "MetacontractStandards" + bundleDirName: "std" + facades: + - name: "MetacontractStandardFacade" \ No newline at end of file diff --git a/lib/forge-std b/lib/forge-std index e4aef94c..5a802d7c 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit e4aef94c1768803a16fe19f7ce8b65defd027cfd +Subproject commit 5a802d7c10abb4bbfb3e7214c75052ef9e6a06f8 diff --git a/lib/ucs-contracts b/lib/ucs-contracts index fddfe14d..d2d57094 160000 --- a/lib/ucs-contracts +++ b/lib/ucs-contracts @@ -1 +1 @@ -Subproject commit fddfe14d21ce28ac0a015f474ef406706ddf773a +Subproject commit d2d57094a7cc5e784b3cbb3feb85a43ea0052d02 diff --git a/script/facade.sh b/script/facade.sh new file mode 100755 index 00000000..f52943b8 --- /dev/null +++ b/script/facade.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Determine the OS +OS="$(uname -s)" +ARCH="$(uname -m)" + +EXECUTABLE="" + +case "$OS" in + Darwin) + if [ "$ARCH" = "x86_64" ]; then + EXECUTABLE="facade-macos-x64" + elif [ "$ARCH" = "arm64" ] || [ "$ARCH" = "aarch64" ]; then + EXECUTABLE="facade-macos-arm64" + else + echo "Unsupported architecture: $ARCH" + exit 1 + fi + ;; + Linux) + if [ "$ARCH" = "x86_64" ]; then + EXECUTABLE="facade-linux-x64" + else + echo "Unsupported architecture: $ARCH" + exit 1 + fi + ;; + *) + echo "Unsupported OS: $OS" + exit 1 + ;; +esac + +# Run the executable +if [ -x "./etc/facadeBuilder/$EXECUTABLE" ]; then + "./etc/facadeBuilder/$EXECUTABLE" "$@" +else + echo "Executable not found or not executable: ./bin/$EXECUTABLE" + exit 1 +fi +