├── .gitignore ├── .npmignore ├── README.md ├── bp.json ├── export-schema.ts ├── handleZodError.ts ├── index.ts ├── package-lock.json ├── package.json ├── schema.json ├── schema.ts ├── tsconfig.json ├── tsup.config.ts └── validate.ts /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | node_modules 3 | dist -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Source files 2 | *.ts 3 | !*.d.ts 4 | validate.ts 5 | bp.json 6 | schema.json 7 | 8 | # Configuration files 9 | tsconfig.json 10 | tsup.config.ts 11 | .gitignore 12 | .github 13 | 14 | # Development files 15 | node_modules 16 | .vscode 17 | .idea 18 | .DS_Store 19 | 20 | # Test files 21 | test 22 | tests 23 | __tests__ 24 | *.test.ts 25 | *.spec.ts 26 | 27 | # Example files 28 | examples 29 | example 30 | *.example.* 31 | 32 | # Documentation files (except README.md which is automatically included) 33 | docs 34 | 35 | # Build artifacts 36 | *.tsbuildinfo 37 | 38 | # Misc 39 | .env* 40 | *.log 41 | npm-debug.log* 42 | yarn-debug.log* 43 | yarn-error.log* 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Antelope BP Information Standard 2 | 3 | **JSON Standard for Block Producer Information on Antelope (former EOSIO) Blockchains** 4 | 5 | This is a proposed standard for Block Producer candidates to publish as the URL field of the `regproducer` action on 6 | the `eosio.system` contract. 7 | 8 | The current revision **v1.1.0** adds [Zod](https://github.com/colinhacks/zod) for schema validation, providing improved type safety and better error messages, while maintaining compatibility with the original JSON Schema. 9 | 10 | ### Recent Changes 11 | 12 | - **v1.1.0**: 13 | - Added Zod-based schema validation alongside the existing JSON Schema 14 | - Published as npm package `@eosrio/bp-info-standard` 15 | - Added improved error handling with detailed validation messages 16 | - Enhanced TypeScript support with full type inference 17 | 18 | The current `schema.json` is compliant with JSON schema [Draft 2019-09](https://json-schema.org/specification-links.html#2019-09-formerly-known-as-draft-8) 19 | 20 | - producer_account_name: Name of producer account 21 | - org: {Object} 22 | - candidate_name: Producer/organization name 23 | - website: Block producer website 24 | - code_of_conduct: Full URL to page, 25 | - ownership_disclosure: Full URL to page, 26 | - email: Contact email 27 | - github_user: Operational GitHub username (or array or usernames) 28 | - chain_resources: Website with chain related resources (snapshots & backups) 29 | - other_resources: [Array] - List of other relevant URLs 30 | - branding: {Object} - Logo images 31 | - logo_256: Entire url to image 256x256px 32 | - logo_1024: Entire url to image 1024x1024px 33 | - logo_svg: Entire url to image svg 34 | - location: {Object} - Organization location 35 | - name: Location in human-readable format [City, State] 36 | - country: Country code [XX] in accordance 37 | to [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) 38 | - latitude: Latitude in decimal degrees 39 | - longitude: Longitude in decimal degrees 40 | }, 41 | - social: {Object} - NOT THE ENTIRE URL, only usernames on social networks, 42 | - keybase: Username 43 | - telegram: Username or group 44 | - twitter: Username 45 | - github: Username 46 | - youtube: Channel address 47 | - facebook: Page/group address 48 | - hive: Username without @ 49 | - reddit: Username 50 | - wechat: Username 51 | - nodes: [Array] 52 | - location: Node location 53 | - name: Node location in human-readable format [City, State] 54 | - country: Node country code [XX] 55 | - latitude: Node latitude in decimal degrees 56 | - longitude: Node longitude in decimal degrees 57 | - node_type: Type of service `producer/query/seed` or an array of choices `["query","seed"]` 58 | - producer: Node with signing key 59 | - query: Node that provides HTTP(S) APIs to the public 60 | - seed: Node that provides P2P access to the public 61 | - full: `true/false` Indicates if the data is provided since the first block or trimmed at some point 62 | - p2p_endpoint: Leap P2P endpoint `host:port` 63 | - api_endpoint: Leap/Service HTTP endpoint `http://host:port` 64 | - ssl_endpoint: Leap/Service HTTPS endpoint `https://host:port` 65 | - features: [Array] 66 | - features supported by the `api_endpoint` or `ssl_endpoint` on query nodes, refer to 67 | the [list of features](https://github.com/eosrio/bp-info-standard#api-features) 68 | - metadata: {Object} 69 | - feature key: {Object} - Metadata for a specific feature 70 | 71 | ### How to use it if you are Block Producer Candidate 72 | 73 | Create a file named `bp.json` in the root of your domain. For instance `https://yourwebsite.com/bp.json` When you 74 | register your producer using the `system.regproducer` action, the url field should be filled 75 | with `https://yourwebsite.com`. **Do not put the bp.json file in the url.** 76 | 77 | ### Overriding data for specific chains 78 | 79 | The recommended way to specify multiple bp.json files under the same domain is to use the a `chains.json` file pointing 80 | to each `.json` file according to the chain_id, for example: 81 | 82 | ```json 83 | { 84 | "chains": { 85 | "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906": "/bp.json", 86 | "1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4": "/wax.json", 87 | "4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11": "/telos.json", 88 | "21dcae42c0182200e93f954a074011f9048a7624c6fe81d3c9541a614a88bd1c": "/fio.json", 89 | "38b1d7815474d0c60683ecbea321d723e83f5da6ae5f1c1f9fecc69d9ba96465": "/libre.json", 90 | "0000000000000000000000000000000000000000000000000000000000000123": "/other_chain.json" 91 | } 92 | } 93 | ``` 94 | 95 | It's posible to not include the slash on the sub-url value, as it is implied we are building an url. 96 | 97 | You can also override properties of the base `bp.json` file by creating a chain specific json file next to your base. 98 | 99 | ``` 100 | --/ 101 | ----index.html 102 | ----chains.json 103 | ----bp.json 104 | ----chainA.json 105 | ----chainB.json 106 | ----bp.${chain_id}.json 107 | ----bp.aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906.json 108 | ``` 109 | 110 | The `bp.json` and `bp.${chain_id}.json` will be merged and any property inside of the chain specific json file will 111 | override the base properties. 112 | 113 | ### API Features 114 | 115 | For query type nodes one or more features from the list below must be added: 116 | 117 | - `chain-api`: basic eosio::chain_api_plugin (/v1/chain/*) 118 | - `account-query`: (/v1/chain/get_accounts_by_authorizers) 119 | - `history-v1`: (/v1/history/*) 120 | - `hyperion-v2`: (/v2/*) 121 | - `dfuse` 122 | - `fio-api` 123 | - `snapshot-api` 124 | - `dsp-api` 125 | - `atomic-assets-api` 126 | - `light-api` 127 | - `ipfs` 128 | - `firehose` 129 | - `substreams` 130 | 131 | ### Useful Links 132 | 133 | One can check for data validity using: https://www.jsonschemavalidator.net/ 134 | 135 | ## Using as a Library 136 | 137 | This package can be used as a library to validate BP information in your JavaScript/TypeScript projects. 138 | 139 | ### Installation 140 | 141 | ```bash 142 | npm install @eosrio/bp-info-standard 143 | ``` 144 | 145 | ### Usage 146 | 147 | #### Validating BP Information 148 | 149 | ```typescript 150 | import { BPInfoSchema } from '@eosrio/bp-info-standard'; 151 | 152 | // Your BP information object 153 | const bpInfo = { 154 | producer_account_name: 'producername', 155 | org: { 156 | candidate_name: 'My Organization', 157 | website: 'https://example.com', 158 | code_of_conduct: 'https://example.com/code', 159 | ownership_disclosure: 'https://example.com/ownership', 160 | email: 'contact@example.com', 161 | location: { 162 | name: 'New York, USA', 163 | country: 'US' 164 | }, 165 | chain_resources: 'https://example.com/resources' 166 | }, 167 | nodes: [ 168 | { 169 | location: { 170 | name: 'New York, USA', 171 | country: 'US' 172 | }, 173 | node_type: 'producer', 174 | full: true 175 | } 176 | ] 177 | }; 178 | 179 | // Validate the BP information 180 | const result = BPInfoSchema.safeParse(bpInfo); 181 | 182 | if (result.success) { 183 | console.log('BP information is valid!'); 184 | // Use the validated data 185 | const validatedData = result.data; 186 | } else { 187 | console.log('BP information is invalid!'); 188 | // Handle validation errors 189 | console.error(result.error); 190 | } 191 | ``` 192 | 193 | #### Handling Validation Errors 194 | 195 | ```typescript 196 | import { BPInfoSchema, handleZodError } from '@eosrio/bp-info-standard'; 197 | 198 | // Your BP information object 199 | const bpInfo = { /* ... */ }; 200 | 201 | // Validate the BP information 202 | const result = BPInfoSchema.safeParse(bpInfo); 203 | 204 | if (!result.success) { 205 | // Format the validation errors 206 | const errorMessages = handleZodError(result.error, { 207 | logToConsole: true, 208 | originalObject: bpInfo 209 | }); 210 | 211 | // Display the error messages 212 | errorMessages.forEach(message => console.log(message)); 213 | } 214 | ``` 215 | 216 | For more information about Zod schema validation, refer to the [Zod documentation](https://github.com/colinhacks/zod). 217 | -------------------------------------------------------------------------------- /bp.json: -------------------------------------------------------------------------------- 1 | { 2 | "producer_account_name": "", 3 | "org": { 4 | "candidate_name": "", 5 | "website": "", 6 | "code_of_conduct": "", 7 | "ownership_disclosure": "", 8 | "email": "", 9 | "github_user": "", 10 | "chain_resources": "", 11 | "other_resources": [], 12 | "branding": { 13 | "logo_256": "", 14 | "logo_1024": "", 15 | "logo_svg": "" 16 | }, 17 | "location": { 18 | "name": "", 19 | "country": "", 20 | "latitude": 0, 21 | "longitude": 0 22 | }, 23 | "social": { 24 | "keybase": "", 25 | "telegram": "", 26 | "twitter": "", 27 | "github": "", 28 | "youtube": "", 29 | "facebook": "", 30 | "hive": "", 31 | "reddit": "", 32 | "wechat": "" 33 | } 34 | }, 35 | "nodes": [ 36 | { 37 | "location": { 38 | "name": "", 39 | "country": "", 40 | "latitude": 0, 41 | "longitude": 0 42 | }, 43 | "full": false, 44 | "node_type": "producer", 45 | "p2p_endpoint": "", 46 | "api_endpoint": "", 47 | "ssl_endpoint": "" 48 | }, 49 | { 50 | "location": { 51 | "name": "", 52 | "country": "", 53 | "latitude": 0, 54 | "longitude": 0 55 | }, 56 | "full": true, 57 | "node_type": "seed", 58 | "p2p_endpoint": "", 59 | "api_endpoint": "", 60 | "ssl_endpoint": "" 61 | }, 62 | { 63 | "location": { 64 | "name": "", 65 | "country": "", 66 | "latitude": 0, 67 | "longitude": 0 68 | }, 69 | "full": true, 70 | "node_type": "query", 71 | "p2p_endpoint": "", 72 | "api_endpoint": "", 73 | "ssl_endpoint": "", 74 | "features": [ 75 | "chain-api" 76 | ], 77 | "metadata": { 78 | "chain-api": { 79 | "read-mode": "head" 80 | } 81 | } 82 | } 83 | ] 84 | } 85 | -------------------------------------------------------------------------------- /export-schema.ts: -------------------------------------------------------------------------------- 1 | import {BPInfoSchema} from "./schema"; 2 | import * as z from 'zod'; 3 | 4 | const jsonSchema = z.toJSONSchema(BPInfoSchema); 5 | console.log(JSON.stringify(jsonSchema, null, 2)); -------------------------------------------------------------------------------- /handleZodError.ts: -------------------------------------------------------------------------------- 1 | import {ZodError} from "zod/dist/esm"; 2 | 3 | /** 4 | * Formats ZodError into user-friendly error messages 5 | * @param error The ZodError instance 6 | * @param options Configuration options 7 | * @param options.logToConsole Whether to log errors to console (default: false) 8 | * @returns Array of formatted error messages 9 | */ 10 | export function handleZodError( 11 | error: ZodError, 12 | options: { logToConsole?: boolean, originalObject?: any } = {} 13 | ): string[] { 14 | const {logToConsole = false} = options; 15 | const messages: string[] = ["Validation failed with the following errors:"]; 16 | 17 | if (error.issues && Array.isArray(error.issues)) { 18 | error.issues.forEach(issue => { 19 | const fieldPath = issue.path.join('.'); 20 | messages.push(`- Field: ${fieldPath || 'root'}`); 21 | if (options.originalObject) { 22 | // get value from fieldPath 23 | const value = fieldPath.split('.').reduce((obj, key) => obj[key], options.originalObject); 24 | messages.push(` Value: ${JSON.stringify(value)}`); 25 | } 26 | messages.push(` Error: ${issue.message}`); 27 | 28 | // Extract and display expected values for different error types 29 | if (issue.code === 'invalid_union' && Array.isArray(issue.errors)) { 30 | // Look through all union errors for enum values 31 | issue.errors.forEach(errorGroup => { 32 | if (Array.isArray(errorGroup)) { 33 | errorGroup.forEach(err => { 34 | // Check for invalid_value errors with values array (enum case) 35 | if (err.code === 'invalid_value' && Array.isArray(err.values)) { 36 | messages.push(` Expected values: ${err.values.join(' | ')}`); 37 | } 38 | // Check for invalid_type errors with expected type 39 | else if (err.code === 'invalid_type' && err.expected) { 40 | messages.push(` Expected type: ${err.expected}`); 41 | } 42 | }); 43 | } 44 | }); 45 | } 46 | // Handle direct invalid_value errors (non-union case) 47 | else if (issue.code === 'invalid_value' && Array.isArray(issue.values)) { 48 | messages.push(` Expected values: ${issue.values.join(' | ')}`); 49 | } 50 | // Handle direct invalid_type errors 51 | else if (issue.code === 'invalid_type' && issue.expected) { 52 | messages.push(` Expected type: ${issue.expected}`); 53 | } 54 | }); 55 | } else { 56 | messages.push(`Error structure is different than expected: ${JSON.stringify(error)}`); 57 | } 58 | 59 | // Log to console if requested 60 | if (logToConsole) { 61 | messages.forEach(msg => console.error(msg)); 62 | } 63 | 64 | return messages; 65 | } -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | import {ZodError} from 'zod'; 2 | 3 | // Main entry point for the bp-info-standard library 4 | export {BPInfoSchema} from './schema'; 5 | export {handleZodError} from './handleZodError'; 6 | 7 | // Re-export ZodError type 8 | export {ZodError}; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bp-info-standard", 3 | "version": "1.0.5", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "bp-info-standard", 9 | "version": "1.0.5", 10 | "license": "ISC", 11 | "dependencies": { 12 | "zod": "^4.0.0-beta.20250505T195954" 13 | }, 14 | "devDependencies": { 15 | "tsup": "^8.4.0", 16 | "tsx": "^4.19.4", 17 | "typescript": "^5.8.3" 18 | } 19 | }, 20 | "node_modules/@esbuild/aix-ppc64": { 21 | "version": "0.25.4", 22 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 23 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 24 | "cpu": [ 25 | "ppc64" 26 | ], 27 | "dev": true, 28 | "license": "MIT", 29 | "optional": true, 30 | "os": [ 31 | "aix" 32 | ], 33 | "engines": { 34 | "node": ">=18" 35 | } 36 | }, 37 | "node_modules/@esbuild/android-arm": { 38 | "version": "0.25.4", 39 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 40 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 41 | "cpu": [ 42 | "arm" 43 | ], 44 | "dev": true, 45 | "license": "MIT", 46 | "optional": true, 47 | "os": [ 48 | "android" 49 | ], 50 | "engines": { 51 | "node": ">=18" 52 | } 53 | }, 54 | "node_modules/@esbuild/android-arm64": { 55 | "version": "0.25.4", 56 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 57 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 58 | "cpu": [ 59 | "arm64" 60 | ], 61 | "dev": true, 62 | "license": "MIT", 63 | "optional": true, 64 | "os": [ 65 | "android" 66 | ], 67 | "engines": { 68 | "node": ">=18" 69 | } 70 | }, 71 | "node_modules/@esbuild/android-x64": { 72 | "version": "0.25.4", 73 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 74 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 75 | "cpu": [ 76 | "x64" 77 | ], 78 | "dev": true, 79 | "license": "MIT", 80 | "optional": true, 81 | "os": [ 82 | "android" 83 | ], 84 | "engines": { 85 | "node": ">=18" 86 | } 87 | }, 88 | "node_modules/@esbuild/darwin-arm64": { 89 | "version": "0.25.4", 90 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 91 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 92 | "cpu": [ 93 | "arm64" 94 | ], 95 | "dev": true, 96 | "license": "MIT", 97 | "optional": true, 98 | "os": [ 99 | "darwin" 100 | ], 101 | "engines": { 102 | "node": ">=18" 103 | } 104 | }, 105 | "node_modules/@esbuild/darwin-x64": { 106 | "version": "0.25.4", 107 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 108 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 109 | "cpu": [ 110 | "x64" 111 | ], 112 | "dev": true, 113 | "license": "MIT", 114 | "optional": true, 115 | "os": [ 116 | "darwin" 117 | ], 118 | "engines": { 119 | "node": ">=18" 120 | } 121 | }, 122 | "node_modules/@esbuild/freebsd-arm64": { 123 | "version": "0.25.4", 124 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 125 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 126 | "cpu": [ 127 | "arm64" 128 | ], 129 | "dev": true, 130 | "license": "MIT", 131 | "optional": true, 132 | "os": [ 133 | "freebsd" 134 | ], 135 | "engines": { 136 | "node": ">=18" 137 | } 138 | }, 139 | "node_modules/@esbuild/freebsd-x64": { 140 | "version": "0.25.4", 141 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 142 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 143 | "cpu": [ 144 | "x64" 145 | ], 146 | "dev": true, 147 | "license": "MIT", 148 | "optional": true, 149 | "os": [ 150 | "freebsd" 151 | ], 152 | "engines": { 153 | "node": ">=18" 154 | } 155 | }, 156 | "node_modules/@esbuild/linux-arm": { 157 | "version": "0.25.4", 158 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 159 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 160 | "cpu": [ 161 | "arm" 162 | ], 163 | "dev": true, 164 | "license": "MIT", 165 | "optional": true, 166 | "os": [ 167 | "linux" 168 | ], 169 | "engines": { 170 | "node": ">=18" 171 | } 172 | }, 173 | "node_modules/@esbuild/linux-arm64": { 174 | "version": "0.25.4", 175 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 176 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 177 | "cpu": [ 178 | "arm64" 179 | ], 180 | "dev": true, 181 | "license": "MIT", 182 | "optional": true, 183 | "os": [ 184 | "linux" 185 | ], 186 | "engines": { 187 | "node": ">=18" 188 | } 189 | }, 190 | "node_modules/@esbuild/linux-ia32": { 191 | "version": "0.25.4", 192 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 193 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 194 | "cpu": [ 195 | "ia32" 196 | ], 197 | "dev": true, 198 | "license": "MIT", 199 | "optional": true, 200 | "os": [ 201 | "linux" 202 | ], 203 | "engines": { 204 | "node": ">=18" 205 | } 206 | }, 207 | "node_modules/@esbuild/linux-loong64": { 208 | "version": "0.25.4", 209 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 210 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 211 | "cpu": [ 212 | "loong64" 213 | ], 214 | "dev": true, 215 | "license": "MIT", 216 | "optional": true, 217 | "os": [ 218 | "linux" 219 | ], 220 | "engines": { 221 | "node": ">=18" 222 | } 223 | }, 224 | "node_modules/@esbuild/linux-mips64el": { 225 | "version": "0.25.4", 226 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 227 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 228 | "cpu": [ 229 | "mips64el" 230 | ], 231 | "dev": true, 232 | "license": "MIT", 233 | "optional": true, 234 | "os": [ 235 | "linux" 236 | ], 237 | "engines": { 238 | "node": ">=18" 239 | } 240 | }, 241 | "node_modules/@esbuild/linux-ppc64": { 242 | "version": "0.25.4", 243 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 244 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 245 | "cpu": [ 246 | "ppc64" 247 | ], 248 | "dev": true, 249 | "license": "MIT", 250 | "optional": true, 251 | "os": [ 252 | "linux" 253 | ], 254 | "engines": { 255 | "node": ">=18" 256 | } 257 | }, 258 | "node_modules/@esbuild/linux-riscv64": { 259 | "version": "0.25.4", 260 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 261 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 262 | "cpu": [ 263 | "riscv64" 264 | ], 265 | "dev": true, 266 | "license": "MIT", 267 | "optional": true, 268 | "os": [ 269 | "linux" 270 | ], 271 | "engines": { 272 | "node": ">=18" 273 | } 274 | }, 275 | "node_modules/@esbuild/linux-s390x": { 276 | "version": "0.25.4", 277 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 278 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 279 | "cpu": [ 280 | "s390x" 281 | ], 282 | "dev": true, 283 | "license": "MIT", 284 | "optional": true, 285 | "os": [ 286 | "linux" 287 | ], 288 | "engines": { 289 | "node": ">=18" 290 | } 291 | }, 292 | "node_modules/@esbuild/linux-x64": { 293 | "version": "0.25.4", 294 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 295 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 296 | "cpu": [ 297 | "x64" 298 | ], 299 | "dev": true, 300 | "license": "MIT", 301 | "optional": true, 302 | "os": [ 303 | "linux" 304 | ], 305 | "engines": { 306 | "node": ">=18" 307 | } 308 | }, 309 | "node_modules/@esbuild/netbsd-arm64": { 310 | "version": "0.25.4", 311 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 312 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 313 | "cpu": [ 314 | "arm64" 315 | ], 316 | "dev": true, 317 | "license": "MIT", 318 | "optional": true, 319 | "os": [ 320 | "netbsd" 321 | ], 322 | "engines": { 323 | "node": ">=18" 324 | } 325 | }, 326 | "node_modules/@esbuild/netbsd-x64": { 327 | "version": "0.25.4", 328 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 329 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 330 | "cpu": [ 331 | "x64" 332 | ], 333 | "dev": true, 334 | "license": "MIT", 335 | "optional": true, 336 | "os": [ 337 | "netbsd" 338 | ], 339 | "engines": { 340 | "node": ">=18" 341 | } 342 | }, 343 | "node_modules/@esbuild/openbsd-arm64": { 344 | "version": "0.25.4", 345 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 346 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 347 | "cpu": [ 348 | "arm64" 349 | ], 350 | "dev": true, 351 | "license": "MIT", 352 | "optional": true, 353 | "os": [ 354 | "openbsd" 355 | ], 356 | "engines": { 357 | "node": ">=18" 358 | } 359 | }, 360 | "node_modules/@esbuild/openbsd-x64": { 361 | "version": "0.25.4", 362 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 363 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 364 | "cpu": [ 365 | "x64" 366 | ], 367 | "dev": true, 368 | "license": "MIT", 369 | "optional": true, 370 | "os": [ 371 | "openbsd" 372 | ], 373 | "engines": { 374 | "node": ">=18" 375 | } 376 | }, 377 | "node_modules/@esbuild/sunos-x64": { 378 | "version": "0.25.4", 379 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 380 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 381 | "cpu": [ 382 | "x64" 383 | ], 384 | "dev": true, 385 | "license": "MIT", 386 | "optional": true, 387 | "os": [ 388 | "sunos" 389 | ], 390 | "engines": { 391 | "node": ">=18" 392 | } 393 | }, 394 | "node_modules/@esbuild/win32-arm64": { 395 | "version": "0.25.4", 396 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 397 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 398 | "cpu": [ 399 | "arm64" 400 | ], 401 | "dev": true, 402 | "license": "MIT", 403 | "optional": true, 404 | "os": [ 405 | "win32" 406 | ], 407 | "engines": { 408 | "node": ">=18" 409 | } 410 | }, 411 | "node_modules/@esbuild/win32-ia32": { 412 | "version": "0.25.4", 413 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 414 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 415 | "cpu": [ 416 | "ia32" 417 | ], 418 | "dev": true, 419 | "license": "MIT", 420 | "optional": true, 421 | "os": [ 422 | "win32" 423 | ], 424 | "engines": { 425 | "node": ">=18" 426 | } 427 | }, 428 | "node_modules/@esbuild/win32-x64": { 429 | "version": "0.25.4", 430 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 431 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 432 | "cpu": [ 433 | "x64" 434 | ], 435 | "dev": true, 436 | "license": "MIT", 437 | "optional": true, 438 | "os": [ 439 | "win32" 440 | ], 441 | "engines": { 442 | "node": ">=18" 443 | } 444 | }, 445 | "node_modules/@isaacs/cliui": { 446 | "version": "8.0.2", 447 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 448 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 449 | "dev": true, 450 | "license": "ISC", 451 | "dependencies": { 452 | "string-width": "^5.1.2", 453 | "string-width-cjs": "npm:string-width@^4.2.0", 454 | "strip-ansi": "^7.0.1", 455 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 456 | "wrap-ansi": "^8.1.0", 457 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 458 | }, 459 | "engines": { 460 | "node": ">=12" 461 | } 462 | }, 463 | "node_modules/@jridgewell/gen-mapping": { 464 | "version": "0.3.8", 465 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 466 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 467 | "dev": true, 468 | "license": "MIT", 469 | "dependencies": { 470 | "@jridgewell/set-array": "^1.2.1", 471 | "@jridgewell/sourcemap-codec": "^1.4.10", 472 | "@jridgewell/trace-mapping": "^0.3.24" 473 | }, 474 | "engines": { 475 | "node": ">=6.0.0" 476 | } 477 | }, 478 | "node_modules/@jridgewell/resolve-uri": { 479 | "version": "3.1.2", 480 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 481 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 482 | "dev": true, 483 | "license": "MIT", 484 | "engines": { 485 | "node": ">=6.0.0" 486 | } 487 | }, 488 | "node_modules/@jridgewell/set-array": { 489 | "version": "1.2.1", 490 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 491 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 492 | "dev": true, 493 | "license": "MIT", 494 | "engines": { 495 | "node": ">=6.0.0" 496 | } 497 | }, 498 | "node_modules/@jridgewell/sourcemap-codec": { 499 | "version": "1.5.0", 500 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 501 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 502 | "dev": true, 503 | "license": "MIT" 504 | }, 505 | "node_modules/@jridgewell/trace-mapping": { 506 | "version": "0.3.25", 507 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 508 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 509 | "dev": true, 510 | "license": "MIT", 511 | "dependencies": { 512 | "@jridgewell/resolve-uri": "^3.1.0", 513 | "@jridgewell/sourcemap-codec": "^1.4.14" 514 | } 515 | }, 516 | "node_modules/@pkgjs/parseargs": { 517 | "version": "0.11.0", 518 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 519 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 520 | "dev": true, 521 | "license": "MIT", 522 | "optional": true, 523 | "engines": { 524 | "node": ">=14" 525 | } 526 | }, 527 | "node_modules/@rollup/rollup-android-arm-eabi": { 528 | "version": "4.40.2", 529 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", 530 | "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", 531 | "cpu": [ 532 | "arm" 533 | ], 534 | "dev": true, 535 | "license": "MIT", 536 | "optional": true, 537 | "os": [ 538 | "android" 539 | ] 540 | }, 541 | "node_modules/@rollup/rollup-android-arm64": { 542 | "version": "4.40.2", 543 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", 544 | "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", 545 | "cpu": [ 546 | "arm64" 547 | ], 548 | "dev": true, 549 | "license": "MIT", 550 | "optional": true, 551 | "os": [ 552 | "android" 553 | ] 554 | }, 555 | "node_modules/@rollup/rollup-darwin-arm64": { 556 | "version": "4.40.2", 557 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", 558 | "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", 559 | "cpu": [ 560 | "arm64" 561 | ], 562 | "dev": true, 563 | "license": "MIT", 564 | "optional": true, 565 | "os": [ 566 | "darwin" 567 | ] 568 | }, 569 | "node_modules/@rollup/rollup-darwin-x64": { 570 | "version": "4.40.2", 571 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", 572 | "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", 573 | "cpu": [ 574 | "x64" 575 | ], 576 | "dev": true, 577 | "license": "MIT", 578 | "optional": true, 579 | "os": [ 580 | "darwin" 581 | ] 582 | }, 583 | "node_modules/@rollup/rollup-freebsd-arm64": { 584 | "version": "4.40.2", 585 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", 586 | "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", 587 | "cpu": [ 588 | "arm64" 589 | ], 590 | "dev": true, 591 | "license": "MIT", 592 | "optional": true, 593 | "os": [ 594 | "freebsd" 595 | ] 596 | }, 597 | "node_modules/@rollup/rollup-freebsd-x64": { 598 | "version": "4.40.2", 599 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", 600 | "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", 601 | "cpu": [ 602 | "x64" 603 | ], 604 | "dev": true, 605 | "license": "MIT", 606 | "optional": true, 607 | "os": [ 608 | "freebsd" 609 | ] 610 | }, 611 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 612 | "version": "4.40.2", 613 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", 614 | "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", 615 | "cpu": [ 616 | "arm" 617 | ], 618 | "dev": true, 619 | "license": "MIT", 620 | "optional": true, 621 | "os": [ 622 | "linux" 623 | ] 624 | }, 625 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 626 | "version": "4.40.2", 627 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", 628 | "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", 629 | "cpu": [ 630 | "arm" 631 | ], 632 | "dev": true, 633 | "license": "MIT", 634 | "optional": true, 635 | "os": [ 636 | "linux" 637 | ] 638 | }, 639 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 640 | "version": "4.40.2", 641 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", 642 | "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", 643 | "cpu": [ 644 | "arm64" 645 | ], 646 | "dev": true, 647 | "license": "MIT", 648 | "optional": true, 649 | "os": [ 650 | "linux" 651 | ] 652 | }, 653 | "node_modules/@rollup/rollup-linux-arm64-musl": { 654 | "version": "4.40.2", 655 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", 656 | "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", 657 | "cpu": [ 658 | "arm64" 659 | ], 660 | "dev": true, 661 | "license": "MIT", 662 | "optional": true, 663 | "os": [ 664 | "linux" 665 | ] 666 | }, 667 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 668 | "version": "4.40.2", 669 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", 670 | "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", 671 | "cpu": [ 672 | "loong64" 673 | ], 674 | "dev": true, 675 | "license": "MIT", 676 | "optional": true, 677 | "os": [ 678 | "linux" 679 | ] 680 | }, 681 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 682 | "version": "4.40.2", 683 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", 684 | "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", 685 | "cpu": [ 686 | "ppc64" 687 | ], 688 | "dev": true, 689 | "license": "MIT", 690 | "optional": true, 691 | "os": [ 692 | "linux" 693 | ] 694 | }, 695 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 696 | "version": "4.40.2", 697 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", 698 | "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", 699 | "cpu": [ 700 | "riscv64" 701 | ], 702 | "dev": true, 703 | "license": "MIT", 704 | "optional": true, 705 | "os": [ 706 | "linux" 707 | ] 708 | }, 709 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 710 | "version": "4.40.2", 711 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", 712 | "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", 713 | "cpu": [ 714 | "riscv64" 715 | ], 716 | "dev": true, 717 | "license": "MIT", 718 | "optional": true, 719 | "os": [ 720 | "linux" 721 | ] 722 | }, 723 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 724 | "version": "4.40.2", 725 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", 726 | "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", 727 | "cpu": [ 728 | "s390x" 729 | ], 730 | "dev": true, 731 | "license": "MIT", 732 | "optional": true, 733 | "os": [ 734 | "linux" 735 | ] 736 | }, 737 | "node_modules/@rollup/rollup-linux-x64-gnu": { 738 | "version": "4.40.2", 739 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", 740 | "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", 741 | "cpu": [ 742 | "x64" 743 | ], 744 | "dev": true, 745 | "license": "MIT", 746 | "optional": true, 747 | "os": [ 748 | "linux" 749 | ] 750 | }, 751 | "node_modules/@rollup/rollup-linux-x64-musl": { 752 | "version": "4.40.2", 753 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", 754 | "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", 755 | "cpu": [ 756 | "x64" 757 | ], 758 | "dev": true, 759 | "license": "MIT", 760 | "optional": true, 761 | "os": [ 762 | "linux" 763 | ] 764 | }, 765 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 766 | "version": "4.40.2", 767 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", 768 | "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", 769 | "cpu": [ 770 | "arm64" 771 | ], 772 | "dev": true, 773 | "license": "MIT", 774 | "optional": true, 775 | "os": [ 776 | "win32" 777 | ] 778 | }, 779 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 780 | "version": "4.40.2", 781 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", 782 | "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", 783 | "cpu": [ 784 | "ia32" 785 | ], 786 | "dev": true, 787 | "license": "MIT", 788 | "optional": true, 789 | "os": [ 790 | "win32" 791 | ] 792 | }, 793 | "node_modules/@rollup/rollup-win32-x64-msvc": { 794 | "version": "4.40.2", 795 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", 796 | "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", 797 | "cpu": [ 798 | "x64" 799 | ], 800 | "dev": true, 801 | "license": "MIT", 802 | "optional": true, 803 | "os": [ 804 | "win32" 805 | ] 806 | }, 807 | "node_modules/@types/estree": { 808 | "version": "1.0.7", 809 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 810 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 811 | "dev": true, 812 | "license": "MIT" 813 | }, 814 | "node_modules/@zod/core": { 815 | "version": "0.11.6", 816 | "resolved": "https://registry.npmjs.org/@zod/core/-/core-0.11.6.tgz", 817 | "integrity": "sha512-03Bv82fFSfjDAvMfdHHdGSS6SOJs0iCcJlWJv1kJHRtoTT02hZpyip/2Lk6oo4l4FtjuwTrsEQTwg/LD8I7dJA==", 818 | "license": "MIT", 819 | "funding": { 820 | "url": "https://github.com/sponsors/colinhacks" 821 | } 822 | }, 823 | "node_modules/ansi-regex": { 824 | "version": "6.1.0", 825 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 826 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 827 | "dev": true, 828 | "license": "MIT", 829 | "engines": { 830 | "node": ">=12" 831 | }, 832 | "funding": { 833 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 834 | } 835 | }, 836 | "node_modules/ansi-styles": { 837 | "version": "6.2.1", 838 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 839 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 840 | "dev": true, 841 | "license": "MIT", 842 | "engines": { 843 | "node": ">=12" 844 | }, 845 | "funding": { 846 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 847 | } 848 | }, 849 | "node_modules/any-promise": { 850 | "version": "1.3.0", 851 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 852 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 853 | "dev": true, 854 | "license": "MIT" 855 | }, 856 | "node_modules/balanced-match": { 857 | "version": "1.0.2", 858 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 859 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 860 | "dev": true, 861 | "license": "MIT" 862 | }, 863 | "node_modules/brace-expansion": { 864 | "version": "2.0.1", 865 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 866 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 867 | "dev": true, 868 | "license": "MIT", 869 | "dependencies": { 870 | "balanced-match": "^1.0.0" 871 | } 872 | }, 873 | "node_modules/bundle-require": { 874 | "version": "5.1.0", 875 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", 876 | "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", 877 | "dev": true, 878 | "license": "MIT", 879 | "dependencies": { 880 | "load-tsconfig": "^0.2.3" 881 | }, 882 | "engines": { 883 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 884 | }, 885 | "peerDependencies": { 886 | "esbuild": ">=0.18" 887 | } 888 | }, 889 | "node_modules/cac": { 890 | "version": "6.7.14", 891 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 892 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 893 | "dev": true, 894 | "license": "MIT", 895 | "engines": { 896 | "node": ">=8" 897 | } 898 | }, 899 | "node_modules/chokidar": { 900 | "version": "4.0.3", 901 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 902 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 903 | "dev": true, 904 | "license": "MIT", 905 | "dependencies": { 906 | "readdirp": "^4.0.1" 907 | }, 908 | "engines": { 909 | "node": ">= 14.16.0" 910 | }, 911 | "funding": { 912 | "url": "https://paulmillr.com/funding/" 913 | } 914 | }, 915 | "node_modules/color-convert": { 916 | "version": "2.0.1", 917 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 918 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 919 | "dev": true, 920 | "license": "MIT", 921 | "dependencies": { 922 | "color-name": "~1.1.4" 923 | }, 924 | "engines": { 925 | "node": ">=7.0.0" 926 | } 927 | }, 928 | "node_modules/color-name": { 929 | "version": "1.1.4", 930 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 931 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 932 | "dev": true, 933 | "license": "MIT" 934 | }, 935 | "node_modules/commander": { 936 | "version": "4.1.1", 937 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 938 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 939 | "dev": true, 940 | "license": "MIT", 941 | "engines": { 942 | "node": ">= 6" 943 | } 944 | }, 945 | "node_modules/consola": { 946 | "version": "3.4.2", 947 | "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", 948 | "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", 949 | "dev": true, 950 | "license": "MIT", 951 | "engines": { 952 | "node": "^14.18.0 || >=16.10.0" 953 | } 954 | }, 955 | "node_modules/cross-spawn": { 956 | "version": "7.0.6", 957 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 958 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 959 | "dev": true, 960 | "license": "MIT", 961 | "dependencies": { 962 | "path-key": "^3.1.0", 963 | "shebang-command": "^2.0.0", 964 | "which": "^2.0.1" 965 | }, 966 | "engines": { 967 | "node": ">= 8" 968 | } 969 | }, 970 | "node_modules/debug": { 971 | "version": "4.4.1", 972 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 973 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 974 | "dev": true, 975 | "license": "MIT", 976 | "dependencies": { 977 | "ms": "^2.1.3" 978 | }, 979 | "engines": { 980 | "node": ">=6.0" 981 | }, 982 | "peerDependenciesMeta": { 983 | "supports-color": { 984 | "optional": true 985 | } 986 | } 987 | }, 988 | "node_modules/eastasianwidth": { 989 | "version": "0.2.0", 990 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 991 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 992 | "dev": true, 993 | "license": "MIT" 994 | }, 995 | "node_modules/emoji-regex": { 996 | "version": "9.2.2", 997 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 998 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 999 | "dev": true, 1000 | "license": "MIT" 1001 | }, 1002 | "node_modules/esbuild": { 1003 | "version": "0.25.4", 1004 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 1005 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 1006 | "dev": true, 1007 | "hasInstallScript": true, 1008 | "license": "MIT", 1009 | "bin": { 1010 | "esbuild": "bin/esbuild" 1011 | }, 1012 | "engines": { 1013 | "node": ">=18" 1014 | }, 1015 | "optionalDependencies": { 1016 | "@esbuild/aix-ppc64": "0.25.4", 1017 | "@esbuild/android-arm": "0.25.4", 1018 | "@esbuild/android-arm64": "0.25.4", 1019 | "@esbuild/android-x64": "0.25.4", 1020 | "@esbuild/darwin-arm64": "0.25.4", 1021 | "@esbuild/darwin-x64": "0.25.4", 1022 | "@esbuild/freebsd-arm64": "0.25.4", 1023 | "@esbuild/freebsd-x64": "0.25.4", 1024 | "@esbuild/linux-arm": "0.25.4", 1025 | "@esbuild/linux-arm64": "0.25.4", 1026 | "@esbuild/linux-ia32": "0.25.4", 1027 | "@esbuild/linux-loong64": "0.25.4", 1028 | "@esbuild/linux-mips64el": "0.25.4", 1029 | "@esbuild/linux-ppc64": "0.25.4", 1030 | "@esbuild/linux-riscv64": "0.25.4", 1031 | "@esbuild/linux-s390x": "0.25.4", 1032 | "@esbuild/linux-x64": "0.25.4", 1033 | "@esbuild/netbsd-arm64": "0.25.4", 1034 | "@esbuild/netbsd-x64": "0.25.4", 1035 | "@esbuild/openbsd-arm64": "0.25.4", 1036 | "@esbuild/openbsd-x64": "0.25.4", 1037 | "@esbuild/sunos-x64": "0.25.4", 1038 | "@esbuild/win32-arm64": "0.25.4", 1039 | "@esbuild/win32-ia32": "0.25.4", 1040 | "@esbuild/win32-x64": "0.25.4" 1041 | } 1042 | }, 1043 | "node_modules/fdir": { 1044 | "version": "6.4.4", 1045 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", 1046 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 1047 | "dev": true, 1048 | "license": "MIT", 1049 | "peerDependencies": { 1050 | "picomatch": "^3 || ^4" 1051 | }, 1052 | "peerDependenciesMeta": { 1053 | "picomatch": { 1054 | "optional": true 1055 | } 1056 | } 1057 | }, 1058 | "node_modules/foreground-child": { 1059 | "version": "3.3.1", 1060 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 1061 | "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 1062 | "dev": true, 1063 | "license": "ISC", 1064 | "dependencies": { 1065 | "cross-spawn": "^7.0.6", 1066 | "signal-exit": "^4.0.1" 1067 | }, 1068 | "engines": { 1069 | "node": ">=14" 1070 | }, 1071 | "funding": { 1072 | "url": "https://github.com/sponsors/isaacs" 1073 | } 1074 | }, 1075 | "node_modules/fsevents": { 1076 | "version": "2.3.3", 1077 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1078 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1079 | "dev": true, 1080 | "hasInstallScript": true, 1081 | "license": "MIT", 1082 | "optional": true, 1083 | "os": [ 1084 | "darwin" 1085 | ], 1086 | "engines": { 1087 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1088 | } 1089 | }, 1090 | "node_modules/get-tsconfig": { 1091 | "version": "4.10.0", 1092 | "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", 1093 | "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", 1094 | "dev": true, 1095 | "license": "MIT", 1096 | "dependencies": { 1097 | "resolve-pkg-maps": "^1.0.0" 1098 | }, 1099 | "funding": { 1100 | "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 1101 | } 1102 | }, 1103 | "node_modules/glob": { 1104 | "version": "10.4.5", 1105 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1106 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1107 | "dev": true, 1108 | "license": "ISC", 1109 | "dependencies": { 1110 | "foreground-child": "^3.1.0", 1111 | "jackspeak": "^3.1.2", 1112 | "minimatch": "^9.0.4", 1113 | "minipass": "^7.1.2", 1114 | "package-json-from-dist": "^1.0.0", 1115 | "path-scurry": "^1.11.1" 1116 | }, 1117 | "bin": { 1118 | "glob": "dist/esm/bin.mjs" 1119 | }, 1120 | "funding": { 1121 | "url": "https://github.com/sponsors/isaacs" 1122 | } 1123 | }, 1124 | "node_modules/is-fullwidth-code-point": { 1125 | "version": "3.0.0", 1126 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1127 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1128 | "dev": true, 1129 | "license": "MIT", 1130 | "engines": { 1131 | "node": ">=8" 1132 | } 1133 | }, 1134 | "node_modules/isexe": { 1135 | "version": "2.0.0", 1136 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1137 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1138 | "dev": true, 1139 | "license": "ISC" 1140 | }, 1141 | "node_modules/jackspeak": { 1142 | "version": "3.4.3", 1143 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1144 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1145 | "dev": true, 1146 | "license": "BlueOak-1.0.0", 1147 | "dependencies": { 1148 | "@isaacs/cliui": "^8.0.2" 1149 | }, 1150 | "funding": { 1151 | "url": "https://github.com/sponsors/isaacs" 1152 | }, 1153 | "optionalDependencies": { 1154 | "@pkgjs/parseargs": "^0.11.0" 1155 | } 1156 | }, 1157 | "node_modules/joycon": { 1158 | "version": "3.1.1", 1159 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", 1160 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", 1161 | "dev": true, 1162 | "license": "MIT", 1163 | "engines": { 1164 | "node": ">=10" 1165 | } 1166 | }, 1167 | "node_modules/lilconfig": { 1168 | "version": "3.1.3", 1169 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 1170 | "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 1171 | "dev": true, 1172 | "license": "MIT", 1173 | "engines": { 1174 | "node": ">=14" 1175 | }, 1176 | "funding": { 1177 | "url": "https://github.com/sponsors/antonk52" 1178 | } 1179 | }, 1180 | "node_modules/lines-and-columns": { 1181 | "version": "1.2.4", 1182 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1183 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1184 | "dev": true, 1185 | "license": "MIT" 1186 | }, 1187 | "node_modules/load-tsconfig": { 1188 | "version": "0.2.5", 1189 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", 1190 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", 1191 | "dev": true, 1192 | "license": "MIT", 1193 | "engines": { 1194 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1195 | } 1196 | }, 1197 | "node_modules/lodash.sortby": { 1198 | "version": "4.7.0", 1199 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1200 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", 1201 | "dev": true, 1202 | "license": "MIT" 1203 | }, 1204 | "node_modules/lru-cache": { 1205 | "version": "10.4.3", 1206 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1207 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1208 | "dev": true, 1209 | "license": "ISC" 1210 | }, 1211 | "node_modules/minimatch": { 1212 | "version": "9.0.5", 1213 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1214 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1215 | "dev": true, 1216 | "license": "ISC", 1217 | "dependencies": { 1218 | "brace-expansion": "^2.0.1" 1219 | }, 1220 | "engines": { 1221 | "node": ">=16 || 14 >=14.17" 1222 | }, 1223 | "funding": { 1224 | "url": "https://github.com/sponsors/isaacs" 1225 | } 1226 | }, 1227 | "node_modules/minipass": { 1228 | "version": "7.1.2", 1229 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1230 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1231 | "dev": true, 1232 | "license": "ISC", 1233 | "engines": { 1234 | "node": ">=16 || 14 >=14.17" 1235 | } 1236 | }, 1237 | "node_modules/ms": { 1238 | "version": "2.1.3", 1239 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1240 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1241 | "dev": true, 1242 | "license": "MIT" 1243 | }, 1244 | "node_modules/mz": { 1245 | "version": "2.7.0", 1246 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1247 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1248 | "dev": true, 1249 | "license": "MIT", 1250 | "dependencies": { 1251 | "any-promise": "^1.0.0", 1252 | "object-assign": "^4.0.1", 1253 | "thenify-all": "^1.0.0" 1254 | } 1255 | }, 1256 | "node_modules/object-assign": { 1257 | "version": "4.1.1", 1258 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1259 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1260 | "dev": true, 1261 | "license": "MIT", 1262 | "engines": { 1263 | "node": ">=0.10.0" 1264 | } 1265 | }, 1266 | "node_modules/package-json-from-dist": { 1267 | "version": "1.0.1", 1268 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1269 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1270 | "dev": true, 1271 | "license": "BlueOak-1.0.0" 1272 | }, 1273 | "node_modules/path-key": { 1274 | "version": "3.1.1", 1275 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1276 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1277 | "dev": true, 1278 | "license": "MIT", 1279 | "engines": { 1280 | "node": ">=8" 1281 | } 1282 | }, 1283 | "node_modules/path-scurry": { 1284 | "version": "1.11.1", 1285 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1286 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1287 | "dev": true, 1288 | "license": "BlueOak-1.0.0", 1289 | "dependencies": { 1290 | "lru-cache": "^10.2.0", 1291 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1292 | }, 1293 | "engines": { 1294 | "node": ">=16 || 14 >=14.18" 1295 | }, 1296 | "funding": { 1297 | "url": "https://github.com/sponsors/isaacs" 1298 | } 1299 | }, 1300 | "node_modules/picocolors": { 1301 | "version": "1.1.1", 1302 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1303 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1304 | "dev": true, 1305 | "license": "ISC" 1306 | }, 1307 | "node_modules/picomatch": { 1308 | "version": "4.0.2", 1309 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1310 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1311 | "dev": true, 1312 | "license": "MIT", 1313 | "engines": { 1314 | "node": ">=12" 1315 | }, 1316 | "funding": { 1317 | "url": "https://github.com/sponsors/jonschlinkert" 1318 | } 1319 | }, 1320 | "node_modules/pirates": { 1321 | "version": "4.0.7", 1322 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", 1323 | "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", 1324 | "dev": true, 1325 | "license": "MIT", 1326 | "engines": { 1327 | "node": ">= 6" 1328 | } 1329 | }, 1330 | "node_modules/postcss-load-config": { 1331 | "version": "6.0.1", 1332 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", 1333 | "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", 1334 | "dev": true, 1335 | "funding": [ 1336 | { 1337 | "type": "opencollective", 1338 | "url": "https://opencollective.com/postcss/" 1339 | }, 1340 | { 1341 | "type": "github", 1342 | "url": "https://github.com/sponsors/ai" 1343 | } 1344 | ], 1345 | "license": "MIT", 1346 | "dependencies": { 1347 | "lilconfig": "^3.1.1" 1348 | }, 1349 | "engines": { 1350 | "node": ">= 18" 1351 | }, 1352 | "peerDependencies": { 1353 | "jiti": ">=1.21.0", 1354 | "postcss": ">=8.0.9", 1355 | "tsx": "^4.8.1", 1356 | "yaml": "^2.4.2" 1357 | }, 1358 | "peerDependenciesMeta": { 1359 | "jiti": { 1360 | "optional": true 1361 | }, 1362 | "postcss": { 1363 | "optional": true 1364 | }, 1365 | "tsx": { 1366 | "optional": true 1367 | }, 1368 | "yaml": { 1369 | "optional": true 1370 | } 1371 | } 1372 | }, 1373 | "node_modules/punycode": { 1374 | "version": "2.3.1", 1375 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1376 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1377 | "dev": true, 1378 | "license": "MIT", 1379 | "engines": { 1380 | "node": ">=6" 1381 | } 1382 | }, 1383 | "node_modules/readdirp": { 1384 | "version": "4.1.2", 1385 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 1386 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 1387 | "dev": true, 1388 | "license": "MIT", 1389 | "engines": { 1390 | "node": ">= 14.18.0" 1391 | }, 1392 | "funding": { 1393 | "type": "individual", 1394 | "url": "https://paulmillr.com/funding/" 1395 | } 1396 | }, 1397 | "node_modules/resolve-from": { 1398 | "version": "5.0.0", 1399 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1400 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 1401 | "dev": true, 1402 | "license": "MIT", 1403 | "engines": { 1404 | "node": ">=8" 1405 | } 1406 | }, 1407 | "node_modules/resolve-pkg-maps": { 1408 | "version": "1.0.0", 1409 | "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 1410 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 1411 | "dev": true, 1412 | "license": "MIT", 1413 | "funding": { 1414 | "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 1415 | } 1416 | }, 1417 | "node_modules/rollup": { 1418 | "version": "4.40.2", 1419 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", 1420 | "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", 1421 | "dev": true, 1422 | "license": "MIT", 1423 | "dependencies": { 1424 | "@types/estree": "1.0.7" 1425 | }, 1426 | "bin": { 1427 | "rollup": "dist/bin/rollup" 1428 | }, 1429 | "engines": { 1430 | "node": ">=18.0.0", 1431 | "npm": ">=8.0.0" 1432 | }, 1433 | "optionalDependencies": { 1434 | "@rollup/rollup-android-arm-eabi": "4.40.2", 1435 | "@rollup/rollup-android-arm64": "4.40.2", 1436 | "@rollup/rollup-darwin-arm64": "4.40.2", 1437 | "@rollup/rollup-darwin-x64": "4.40.2", 1438 | "@rollup/rollup-freebsd-arm64": "4.40.2", 1439 | "@rollup/rollup-freebsd-x64": "4.40.2", 1440 | "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", 1441 | "@rollup/rollup-linux-arm-musleabihf": "4.40.2", 1442 | "@rollup/rollup-linux-arm64-gnu": "4.40.2", 1443 | "@rollup/rollup-linux-arm64-musl": "4.40.2", 1444 | "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", 1445 | "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", 1446 | "@rollup/rollup-linux-riscv64-gnu": "4.40.2", 1447 | "@rollup/rollup-linux-riscv64-musl": "4.40.2", 1448 | "@rollup/rollup-linux-s390x-gnu": "4.40.2", 1449 | "@rollup/rollup-linux-x64-gnu": "4.40.2", 1450 | "@rollup/rollup-linux-x64-musl": "4.40.2", 1451 | "@rollup/rollup-win32-arm64-msvc": "4.40.2", 1452 | "@rollup/rollup-win32-ia32-msvc": "4.40.2", 1453 | "@rollup/rollup-win32-x64-msvc": "4.40.2", 1454 | "fsevents": "~2.3.2" 1455 | } 1456 | }, 1457 | "node_modules/shebang-command": { 1458 | "version": "2.0.0", 1459 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1460 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1461 | "dev": true, 1462 | "license": "MIT", 1463 | "dependencies": { 1464 | "shebang-regex": "^3.0.0" 1465 | }, 1466 | "engines": { 1467 | "node": ">=8" 1468 | } 1469 | }, 1470 | "node_modules/shebang-regex": { 1471 | "version": "3.0.0", 1472 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1473 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1474 | "dev": true, 1475 | "license": "MIT", 1476 | "engines": { 1477 | "node": ">=8" 1478 | } 1479 | }, 1480 | "node_modules/signal-exit": { 1481 | "version": "4.1.0", 1482 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1483 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1484 | "dev": true, 1485 | "license": "ISC", 1486 | "engines": { 1487 | "node": ">=14" 1488 | }, 1489 | "funding": { 1490 | "url": "https://github.com/sponsors/isaacs" 1491 | } 1492 | }, 1493 | "node_modules/source-map": { 1494 | "version": "0.8.0-beta.0", 1495 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 1496 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 1497 | "dev": true, 1498 | "license": "BSD-3-Clause", 1499 | "dependencies": { 1500 | "whatwg-url": "^7.0.0" 1501 | }, 1502 | "engines": { 1503 | "node": ">= 8" 1504 | } 1505 | }, 1506 | "node_modules/string-width": { 1507 | "version": "5.1.2", 1508 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1509 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1510 | "dev": true, 1511 | "license": "MIT", 1512 | "dependencies": { 1513 | "eastasianwidth": "^0.2.0", 1514 | "emoji-regex": "^9.2.2", 1515 | "strip-ansi": "^7.0.1" 1516 | }, 1517 | "engines": { 1518 | "node": ">=12" 1519 | }, 1520 | "funding": { 1521 | "url": "https://github.com/sponsors/sindresorhus" 1522 | } 1523 | }, 1524 | "node_modules/string-width-cjs": { 1525 | "name": "string-width", 1526 | "version": "4.2.3", 1527 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1528 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1529 | "dev": true, 1530 | "license": "MIT", 1531 | "dependencies": { 1532 | "emoji-regex": "^8.0.0", 1533 | "is-fullwidth-code-point": "^3.0.0", 1534 | "strip-ansi": "^6.0.1" 1535 | }, 1536 | "engines": { 1537 | "node": ">=8" 1538 | } 1539 | }, 1540 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1541 | "version": "5.0.1", 1542 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1543 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1544 | "dev": true, 1545 | "license": "MIT", 1546 | "engines": { 1547 | "node": ">=8" 1548 | } 1549 | }, 1550 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1551 | "version": "8.0.0", 1552 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1553 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1554 | "dev": true, 1555 | "license": "MIT" 1556 | }, 1557 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1558 | "version": "6.0.1", 1559 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1560 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1561 | "dev": true, 1562 | "license": "MIT", 1563 | "dependencies": { 1564 | "ansi-regex": "^5.0.1" 1565 | }, 1566 | "engines": { 1567 | "node": ">=8" 1568 | } 1569 | }, 1570 | "node_modules/strip-ansi": { 1571 | "version": "7.1.0", 1572 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1573 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1574 | "dev": true, 1575 | "license": "MIT", 1576 | "dependencies": { 1577 | "ansi-regex": "^6.0.1" 1578 | }, 1579 | "engines": { 1580 | "node": ">=12" 1581 | }, 1582 | "funding": { 1583 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1584 | } 1585 | }, 1586 | "node_modules/strip-ansi-cjs": { 1587 | "name": "strip-ansi", 1588 | "version": "6.0.1", 1589 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1590 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1591 | "dev": true, 1592 | "license": "MIT", 1593 | "dependencies": { 1594 | "ansi-regex": "^5.0.1" 1595 | }, 1596 | "engines": { 1597 | "node": ">=8" 1598 | } 1599 | }, 1600 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1601 | "version": "5.0.1", 1602 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1603 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1604 | "dev": true, 1605 | "license": "MIT", 1606 | "engines": { 1607 | "node": ">=8" 1608 | } 1609 | }, 1610 | "node_modules/sucrase": { 1611 | "version": "3.35.0", 1612 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 1613 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 1614 | "dev": true, 1615 | "license": "MIT", 1616 | "dependencies": { 1617 | "@jridgewell/gen-mapping": "^0.3.2", 1618 | "commander": "^4.0.0", 1619 | "glob": "^10.3.10", 1620 | "lines-and-columns": "^1.1.6", 1621 | "mz": "^2.7.0", 1622 | "pirates": "^4.0.1", 1623 | "ts-interface-checker": "^0.1.9" 1624 | }, 1625 | "bin": { 1626 | "sucrase": "bin/sucrase", 1627 | "sucrase-node": "bin/sucrase-node" 1628 | }, 1629 | "engines": { 1630 | "node": ">=16 || 14 >=14.17" 1631 | } 1632 | }, 1633 | "node_modules/thenify": { 1634 | "version": "3.3.1", 1635 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1636 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1637 | "dev": true, 1638 | "license": "MIT", 1639 | "dependencies": { 1640 | "any-promise": "^1.0.0" 1641 | } 1642 | }, 1643 | "node_modules/thenify-all": { 1644 | "version": "1.6.0", 1645 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1646 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 1647 | "dev": true, 1648 | "license": "MIT", 1649 | "dependencies": { 1650 | "thenify": ">= 3.1.0 < 4" 1651 | }, 1652 | "engines": { 1653 | "node": ">=0.8" 1654 | } 1655 | }, 1656 | "node_modules/tinyexec": { 1657 | "version": "0.3.2", 1658 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 1659 | "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 1660 | "dev": true, 1661 | "license": "MIT" 1662 | }, 1663 | "node_modules/tinyglobby": { 1664 | "version": "0.2.13", 1665 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", 1666 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 1667 | "dev": true, 1668 | "license": "MIT", 1669 | "dependencies": { 1670 | "fdir": "^6.4.4", 1671 | "picomatch": "^4.0.2" 1672 | }, 1673 | "engines": { 1674 | "node": ">=12.0.0" 1675 | }, 1676 | "funding": { 1677 | "url": "https://github.com/sponsors/SuperchupuDev" 1678 | } 1679 | }, 1680 | "node_modules/tr46": { 1681 | "version": "1.0.1", 1682 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 1683 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", 1684 | "dev": true, 1685 | "license": "MIT", 1686 | "dependencies": { 1687 | "punycode": "^2.1.0" 1688 | } 1689 | }, 1690 | "node_modules/tree-kill": { 1691 | "version": "1.2.2", 1692 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 1693 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 1694 | "dev": true, 1695 | "license": "MIT", 1696 | "bin": { 1697 | "tree-kill": "cli.js" 1698 | } 1699 | }, 1700 | "node_modules/ts-interface-checker": { 1701 | "version": "0.1.13", 1702 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 1703 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 1704 | "dev": true, 1705 | "license": "Apache-2.0" 1706 | }, 1707 | "node_modules/tsup": { 1708 | "version": "8.4.0", 1709 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.4.0.tgz", 1710 | "integrity": "sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==", 1711 | "dev": true, 1712 | "license": "MIT", 1713 | "dependencies": { 1714 | "bundle-require": "^5.1.0", 1715 | "cac": "^6.7.14", 1716 | "chokidar": "^4.0.3", 1717 | "consola": "^3.4.0", 1718 | "debug": "^4.4.0", 1719 | "esbuild": "^0.25.0", 1720 | "joycon": "^3.1.1", 1721 | "picocolors": "^1.1.1", 1722 | "postcss-load-config": "^6.0.1", 1723 | "resolve-from": "^5.0.0", 1724 | "rollup": "^4.34.8", 1725 | "source-map": "0.8.0-beta.0", 1726 | "sucrase": "^3.35.0", 1727 | "tinyexec": "^0.3.2", 1728 | "tinyglobby": "^0.2.11", 1729 | "tree-kill": "^1.2.2" 1730 | }, 1731 | "bin": { 1732 | "tsup": "dist/cli-default.js", 1733 | "tsup-node": "dist/cli-node.js" 1734 | }, 1735 | "engines": { 1736 | "node": ">=18" 1737 | }, 1738 | "peerDependencies": { 1739 | "@microsoft/api-extractor": "^7.36.0", 1740 | "@swc/core": "^1", 1741 | "postcss": "^8.4.12", 1742 | "typescript": ">=4.5.0" 1743 | }, 1744 | "peerDependenciesMeta": { 1745 | "@microsoft/api-extractor": { 1746 | "optional": true 1747 | }, 1748 | "@swc/core": { 1749 | "optional": true 1750 | }, 1751 | "postcss": { 1752 | "optional": true 1753 | }, 1754 | "typescript": { 1755 | "optional": true 1756 | } 1757 | } 1758 | }, 1759 | "node_modules/tsx": { 1760 | "version": "4.19.4", 1761 | "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", 1762 | "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", 1763 | "dev": true, 1764 | "license": "MIT", 1765 | "dependencies": { 1766 | "esbuild": "~0.25.0", 1767 | "get-tsconfig": "^4.7.5" 1768 | }, 1769 | "bin": { 1770 | "tsx": "dist/cli.mjs" 1771 | }, 1772 | "engines": { 1773 | "node": ">=18.0.0" 1774 | }, 1775 | "optionalDependencies": { 1776 | "fsevents": "~2.3.3" 1777 | } 1778 | }, 1779 | "node_modules/typescript": { 1780 | "version": "5.8.3", 1781 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 1782 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 1783 | "dev": true, 1784 | "license": "Apache-2.0", 1785 | "bin": { 1786 | "tsc": "bin/tsc", 1787 | "tsserver": "bin/tsserver" 1788 | }, 1789 | "engines": { 1790 | "node": ">=14.17" 1791 | } 1792 | }, 1793 | "node_modules/webidl-conversions": { 1794 | "version": "4.0.2", 1795 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 1796 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", 1797 | "dev": true, 1798 | "license": "BSD-2-Clause" 1799 | }, 1800 | "node_modules/whatwg-url": { 1801 | "version": "7.1.0", 1802 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 1803 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 1804 | "dev": true, 1805 | "license": "MIT", 1806 | "dependencies": { 1807 | "lodash.sortby": "^4.7.0", 1808 | "tr46": "^1.0.1", 1809 | "webidl-conversions": "^4.0.2" 1810 | } 1811 | }, 1812 | "node_modules/which": { 1813 | "version": "2.0.2", 1814 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1815 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1816 | "dev": true, 1817 | "license": "ISC", 1818 | "dependencies": { 1819 | "isexe": "^2.0.0" 1820 | }, 1821 | "bin": { 1822 | "node-which": "bin/node-which" 1823 | }, 1824 | "engines": { 1825 | "node": ">= 8" 1826 | } 1827 | }, 1828 | "node_modules/wrap-ansi": { 1829 | "version": "8.1.0", 1830 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1831 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1832 | "dev": true, 1833 | "license": "MIT", 1834 | "dependencies": { 1835 | "ansi-styles": "^6.1.0", 1836 | "string-width": "^5.0.1", 1837 | "strip-ansi": "^7.0.1" 1838 | }, 1839 | "engines": { 1840 | "node": ">=12" 1841 | }, 1842 | "funding": { 1843 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1844 | } 1845 | }, 1846 | "node_modules/wrap-ansi-cjs": { 1847 | "name": "wrap-ansi", 1848 | "version": "7.0.0", 1849 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1850 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1851 | "dev": true, 1852 | "license": "MIT", 1853 | "dependencies": { 1854 | "ansi-styles": "^4.0.0", 1855 | "string-width": "^4.1.0", 1856 | "strip-ansi": "^6.0.0" 1857 | }, 1858 | "engines": { 1859 | "node": ">=10" 1860 | }, 1861 | "funding": { 1862 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1863 | } 1864 | }, 1865 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1866 | "version": "5.0.1", 1867 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1868 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1869 | "dev": true, 1870 | "license": "MIT", 1871 | "engines": { 1872 | "node": ">=8" 1873 | } 1874 | }, 1875 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 1876 | "version": "4.3.0", 1877 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1878 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1879 | "dev": true, 1880 | "license": "MIT", 1881 | "dependencies": { 1882 | "color-convert": "^2.0.1" 1883 | }, 1884 | "engines": { 1885 | "node": ">=8" 1886 | }, 1887 | "funding": { 1888 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1889 | } 1890 | }, 1891 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1892 | "version": "8.0.0", 1893 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1894 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1895 | "dev": true, 1896 | "license": "MIT" 1897 | }, 1898 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1899 | "version": "4.2.3", 1900 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1901 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1902 | "dev": true, 1903 | "license": "MIT", 1904 | "dependencies": { 1905 | "emoji-regex": "^8.0.0", 1906 | "is-fullwidth-code-point": "^3.0.0", 1907 | "strip-ansi": "^6.0.1" 1908 | }, 1909 | "engines": { 1910 | "node": ">=8" 1911 | } 1912 | }, 1913 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1914 | "version": "6.0.1", 1915 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1916 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1917 | "dev": true, 1918 | "license": "MIT", 1919 | "dependencies": { 1920 | "ansi-regex": "^5.0.1" 1921 | }, 1922 | "engines": { 1923 | "node": ">=8" 1924 | } 1925 | }, 1926 | "node_modules/zod": { 1927 | "version": "4.0.0-beta.20250505T195954", 1928 | "resolved": "https://registry.npmjs.org/zod/-/zod-4.0.0-beta.20250505T195954.tgz", 1929 | "integrity": "sha512-iB8WvxkobVIXMARvQu20fKvbS7mUTiYRpcD8OQV1xjRhxO0EEpYIRJBk6yfBzHAHEdOSDh3SxDITr5Eajr2vtg==", 1930 | "license": "MIT", 1931 | "dependencies": { 1932 | "@zod/core": "0.11.6" 1933 | }, 1934 | "funding": { 1935 | "url": "https://github.com/sponsors/colinhacks" 1936 | } 1937 | } 1938 | } 1939 | } 1940 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@eosrio/bp-info-standard", 3 | "version": "1.1.0", 4 | "description": "JSON Standard for Block Producer Information on the EOS Blockchain", 5 | "main": "dist/index.js", 6 | "module": "dist/index.js", 7 | "types": "dist/index.d.ts", 8 | "files": [ 9 | "dist" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/eosrio/bp-info-standard.git" 14 | }, 15 | "scripts": { 16 | "validate": "tsx validate.ts", 17 | "build": "tsup", 18 | "exportSchema": "tsx export-schema.ts", 19 | "prepublishOnly": "npm run build" 20 | }, 21 | "author": "", 22 | "license": "ISC", 23 | "dependencies": { 24 | "zod": "^4.0.0-beta.20250505T195954" 25 | }, 26 | "devDependencies": { 27 | "tsup": "^8.4.0", 28 | "tsx": "^4.19.4", 29 | "typescript": "^5.8.3" 30 | }, 31 | "type": "module", 32 | "exports": { 33 | ".": { 34 | "types": "./dist/index.d.ts", 35 | "import": "./dist/index.js", 36 | "require": "./dist/index.cjs", 37 | "default": "./dist/index.js" 38 | } 39 | }, 40 | "keywords": [ 41 | "eos", 42 | "blockchain", 43 | "block-producer", 44 | "validation", 45 | "schema" 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "BlockProducer", 3 | "description": "Information about a block producer on AntelopeIO blockchains", 4 | "$schema": "https://json-schema.org/draft/2019-09/schema", 5 | "$defs": { 6 | "location": { 7 | "type": "object", 8 | "required": [ 9 | "name", 10 | "country" 11 | ], 12 | "properties": { 13 | "name": { 14 | "description": "Location in human readable format [City, State]", 15 | "type": "string" 16 | }, 17 | "country": { 18 | "description": "ISO 3166-1 alpha 2 country code [XX]", 19 | "type": "string", 20 | "maxLength": 2, 21 | "minLength": 2, 22 | "pattern": "^[A-Z]+$" 23 | }, 24 | "latitude": { 25 | "description": "Latitude in decimal degrees", 26 | "type": "number" 27 | }, 28 | "longitude": { 29 | "description": "Longitude in decimal degrees", 30 | "type": "number" 31 | } 32 | } 33 | }, 34 | "required_url": { 35 | "type": "string", 36 | "format": "uri", 37 | "pattern": "^https?://.+[^\/]$" 38 | }, 39 | "optional_url": { 40 | "type": "string", 41 | "if": { 42 | "pattern": ".+" 43 | }, 44 | "then": { 45 | "format": "uri", 46 | "pattern": "^https?://.+[^\/]$" 47 | } 48 | }, 49 | "username": { 50 | "type": "string", 51 | "pattern": "^[\\w\\d_\\-\\.]*$" 52 | }, 53 | "facebook_username": { 54 | "type": "string", 55 | "pattern": "^[\\w\\d_\\-\\./]*$" 56 | }, 57 | "youtube_username": { 58 | "type": "string", 59 | "pattern": "^[\\w\\d_\\-\\./]*$" 60 | }, 61 | "features": { 62 | "type": "string", 63 | "enum": [ 64 | "chain-api", 65 | "account-query", 66 | "history-v1", 67 | "hyperion-v2", 68 | "dfuse", 69 | "fio-api", 70 | "snapshot-api", 71 | "dsp-api", 72 | "atomic-assets-api", 73 | "firehose", 74 | "light-api", 75 | "ipfs", 76 | "substreams" 77 | ] 78 | } 79 | }, 80 | "type": "object", 81 | "required": [ 82 | "producer_account_name", 83 | "org", 84 | "nodes" 85 | ], 86 | "additionalProperties": false, 87 | "properties": { 88 | "producer_account_name": { 89 | "$id": "/properties/producer_account_name", 90 | "description": "Producer account name", 91 | "type": "string", 92 | "maxLength": 12, 93 | "minLength": 1, 94 | "pattern": "^[\\.12345a-z]+$" 95 | }, 96 | "org": { 97 | "type": "object", 98 | "properties": { 99 | "location": { 100 | "$ref": "#/$defs/location", 101 | "description": "Organization location" 102 | }, 103 | "candidate_name": { 104 | "$id": "/properties/org/properties/candidate_name", 105 | "description": "Producer/organization name", 106 | "type": "string" 107 | }, 108 | "website": { 109 | "$ref": "#/$defs/required_url", 110 | "description": "Organization website" 111 | }, 112 | "code_of_conduct": { 113 | "$ref": "#/$defs/optional_url", 114 | "description": "Link to Code of Conduct" 115 | }, 116 | "ownership_disclosure": { 117 | "$ref": "#/$defs/optional_url", 118 | "description": "Link to company ownership disclosure" 119 | }, 120 | "email": { 121 | "$id": "/properties/org/properties/email", 122 | "description": "Organization email", 123 | "type": "string", 124 | "format": "email" 125 | }, 126 | "github_user": { 127 | "$id": "/properties/org/properties/github_user", 128 | "description": "Operational github username", 129 | "oneOf": [ 130 | { 131 | "type": "array", 132 | "uniqueItems": true, 133 | "items": { 134 | "type": "string", 135 | "pattern": "^[\\w\\d_\\-\\.]*$" 136 | } 137 | }, 138 | { 139 | "type": "string", 140 | "pattern": "^[\\w\\d_\\-\\.]*$" 141 | } 142 | ] 143 | }, 144 | "branding": { 145 | "type": "object", 146 | "properties": { 147 | "logo_256": { 148 | "$ref": "#/$defs/optional_url", 149 | "description": "Link to Organization logo [PNG format, 256x256]" 150 | }, 151 | "logo_1024": { 152 | "$ref": "#/$defs/optional_url", 153 | "description": "Link to Organization logo [PNG format, 1024x1024]" 154 | }, 155 | "logo_svg": { 156 | "$ref": "#/$defs/optional_url", 157 | "description": "Link to Organization logo [SVG format]" 158 | } 159 | } 160 | }, 161 | "social": { 162 | "type": "object", 163 | "properties": { 164 | "facebook": { 165 | "$ref": "#/$defs/facebook_username", 166 | "description": "group/page address only, not the entire url" 167 | }, 168 | "github": { 169 | "$ref": "#/$defs/username", 170 | "description": "username only" 171 | }, 172 | "keybase": { 173 | "$ref": "#/$defs/username", 174 | "description": "username only" 175 | }, 176 | "reddit": { 177 | "$ref": "#/$defs/username", 178 | "description": "username only" 179 | }, 180 | "hive": { 181 | "$ref": "#/$defs/username", 182 | "description": "username only, WITHOUT @" 183 | }, 184 | "telegram": { 185 | "$ref": "#/$defs/username", 186 | "description": "username only" 187 | }, 188 | "twitter": { 189 | "$ref": "#/$defs/username", 190 | "description": "username only" 191 | }, 192 | "wechat": { 193 | "$ref": "#/$defs/username", 194 | "description": "username only" 195 | }, 196 | "youtube": { 197 | "$ref": "#/$defs/youtube_username", 198 | "description": "channel address only" 199 | }, 200 | "medium": { 201 | "$ref": "#/$defs/username", 202 | "description": "medium username only" 203 | }, 204 | "discord": { 205 | "$ref": "#/$defs/username", 206 | "description": "discord" 207 | } 208 | } 209 | }, 210 | "chain_resources": { 211 | "$ref": "#/$defs/optional_url", 212 | "description": "URL with chain snapshots and other downloads" 213 | }, 214 | "other_resources": { 215 | "type": "array", 216 | "uniqueItems": true, 217 | "description": "URLs to other relevant resources", 218 | "items": { 219 | "$ref": "#/$defs/optional_url" 220 | } 221 | } 222 | }, 223 | "required": [ 224 | "location", 225 | "candidate_name", 226 | "website" 227 | ] 228 | }, 229 | "nodes": { 230 | "type": "array", 231 | "uniqueItems": true, 232 | "items": { 233 | "type": "object", 234 | "required": [ 235 | "node_type", 236 | "full" 237 | ], 238 | "properties": { 239 | "location": { 240 | "$ref": "#/$defs/location", 241 | "description": "Node location" 242 | }, 243 | "node_type": { 244 | "description": "Type of service", 245 | "oneOf": [ 246 | { 247 | "type": "array", 248 | "uniqueItems": true, 249 | "items": { 250 | "type": "string", 251 | "enum": [ 252 | "producer", 253 | "query", 254 | "seed" 255 | ] 256 | } 257 | }, 258 | { 259 | "type": "string", 260 | "enum": [ 261 | "producer", 262 | "query", 263 | "seed" 264 | ] 265 | } 266 | ] 267 | }, 268 | "full": { 269 | "description": "Provides full data history", 270 | "type": "boolean" 271 | }, 272 | "p2p_endpoint": { 273 | "description": "Leap P2P endpoint (host:port)", 274 | "type": "string" 275 | }, 276 | "api_endpoint": { 277 | "description": "Service HTTP endpoint (http://host:port)", 278 | "type": "string", 279 | "if": { 280 | "pattern": ".+" 281 | }, 282 | "then": { 283 | "format": "uri", 284 | "pattern": "^http://" 285 | } 286 | }, 287 | "ssl_endpoint": { 288 | "description": "Service HTTPS endpoint (https://host:port)", 289 | "type": "string", 290 | "if": { 291 | "pattern": ".+" 292 | }, 293 | "then": { 294 | "format": "uri", 295 | "pattern": "^https://" 296 | } 297 | }, 298 | "features": { 299 | "type": "array", 300 | "uniqueItems": true, 301 | "items": { 302 | "$ref": "#/$defs/features" 303 | } 304 | }, 305 | "metadata": { 306 | "type": "object", 307 | "propertyNames": { 308 | "$ref": "#/$defs/features" 309 | } 310 | } 311 | } 312 | } 313 | } 314 | } 315 | } 316 | -------------------------------------------------------------------------------- /schema.ts: -------------------------------------------------------------------------------- 1 | import {z} from "zod" 2 | 3 | const optionalUrl = z.url().optional() 4 | const accountName = z.string().max(12).regex(new RegExp("^[.12345a-z]+$")) 5 | const nodeTypes = z.enum(["producer", "query", "seed"]); 6 | const location = z.object({ 7 | name: z.string().describe("Location in human readable format [City, State]"), 8 | country: z.string().describe("Country in ISO 3166-1 alpha-2 format [XX]"), 9 | latitude: z.number().min(-90).max(90).optional(), 10 | longitude: z.number().min(-180).max(180).optional() 11 | }); 12 | const username = z.string().regex(new RegExp("^[\\w_\\-.]*$")); 13 | const usernameSlash = z.string().regex(new RegExp("^[\\w_\\-./]*$")); 14 | 15 | // Regular expression for validating a standard hostname. 16 | // This regex allows for domain names with letters, numbers, and hyphens, 17 | // separated by dots, and ending with a top-level domain of at least two characters. 18 | const hostnameRegex = new RegExp('^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$'); 19 | 20 | const hostPortSchemaNative = z.string().refine((value) => { 21 | const parts = value.split(':'); 22 | if (parts.length !== 2) { 23 | return false; 24 | } 25 | const host = parts[0]; 26 | const portStr = parts[1]; 27 | const isIp = z.union([z.ipv4(), z.ipv6()]).safeParse(host).success; 28 | const isHostname = hostnameRegex.test(host); 29 | if (!isIp && !isHostname) { 30 | return false; 31 | } 32 | const port = parseInt(portStr, 10); 33 | return !(isNaN(port) || port < 0 || port > 65535); 34 | }, { 35 | message: 'Invalid host:port format. Must be in the format "host:port" where host is a valid IP address or hostname and port is a number between 0 and 65535.', 36 | }); 37 | 38 | export const BPInfoSchema = z.object({ 39 | producer_account_name: accountName.describe("Producer account name"), 40 | org: z.object({ 41 | location: location.describe("Organization location"), 42 | candidate_name: z.string().describe("Producer/organization name"), 43 | website: optionalUrl.describe("Organization website"), 44 | code_of_conduct: optionalUrl.describe("Link to Code of Conduct"), 45 | ownership_disclosure: optionalUrl.describe("Link to company ownership disclosure"), 46 | email: z.email().describe("Organization email").optional(), 47 | github_user: z.union([ 48 | z.array(z.string().regex(new RegExp("^[\\w_\\-.]*$"))), 49 | z.string().regex(new RegExp("^[\\w_\\-.]*$")) 50 | ]).describe("Operational github username").optional(), 51 | branding: z.object({ 52 | logo_256: optionalUrl.describe("Link to Organization logo [PNG format, 256x256]"), 53 | logo_1024: optionalUrl.describe("Link to Organization logo [PNG format, 1024x1024]"), 54 | logo_svg: optionalUrl.describe("Link to Organization logo [SVG format]") 55 | }).optional(), 56 | social: z.object({ 57 | facebook: usernameSlash.describe("group/page address only, not the entire url").optional(), 58 | github: username.describe("username only").optional(), 59 | keybase: username.describe("username only").optional(), 60 | reddit: username.describe("username only").optional(), 61 | hive: username.describe("username only, WITHOUT @").optional(), 62 | telegram: username.describe("username only").optional(), 63 | twitter: username.describe("username only").optional(), 64 | wechat: username.describe("username only").optional(), 65 | youtube: usernameSlash.describe("channel address only").optional(), 66 | medium: username.describe("medium username only").optional(), 67 | discord: username.describe("discord").optional() 68 | }).optional(), 69 | chain_resources: optionalUrl.describe("URL with chain snapshots and other downloads"), 70 | other_resources: z.array(optionalUrl).describe("URLs to other relevant resources").optional() 71 | }), 72 | nodes: z.array(z.object({ 73 | location: location.describe("Node location").optional(), 74 | node_type: z.union([z.array(nodeTypes), nodeTypes]).describe("Type of service"), 75 | full: z.boolean().describe("Provides full data history"), 76 | p2p_endpoint: hostPortSchemaNative.describe("Leap P2P endpoint (host:port)").optional(), 77 | api_endpoint: z.url().describe("Service HTTP endpoint (http://host:port)").optional(), 78 | ssl_endpoint: z.string().describe("Service HTTPS endpoint (https://host:port)").optional(), 79 | features: z.array(z.any()).optional(), 80 | metadata: z.record(z.string(), z.any()).optional() 81 | }).refine( 82 | (node) => { 83 | // If node_type is "seed" or includes "seed", p2p_endpoint must be provided 84 | const isSeedNode = 85 | node.node_type === "seed" || 86 | (Array.isArray(node.node_type) && node.node_type.includes("seed")); 87 | 88 | // If it's a seed node, p2p_endpoint must be defined 89 | return !isSeedNode || (isSeedNode && node.p2p_endpoint !== undefined); 90 | }, 91 | { 92 | message: "p2p_endpoint is required for seed nodes", 93 | path: ["p2p_endpoint"] // This will make the error appear on the p2p_endpoint field 94 | } 95 | ).refine( 96 | (node) => { 97 | // If node_type is "query" or includes "query", either api_endpoint or ssl_endpoint must be provided 98 | const isQueryNode = 99 | node.node_type === "query" || 100 | (Array.isArray(node.node_type) && node.node_type.includes("query")); 101 | 102 | // If it's a query node, either api_endpoint or ssl_endpoint must be defined 103 | return !isQueryNode || (isQueryNode && (node.api_endpoint !== undefined || node.ssl_endpoint !== undefined)); 104 | }, 105 | { 106 | message: "Either api_endpoint or ssl_endpoint is required for query nodes", 107 | path: ["api_endpoint"] // This will make the error appear on the api_endpoint field 108 | } 109 | )) 110 | }).strict().describe("Information about a block producer on AntelopeIO blockchains") 111 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "declaration": true, 10 | "outDir": "dist", 11 | "rootDir": "." 12 | }, 13 | "include": ["*.ts"], 14 | "exclude": ["node_modules", "dist"] 15 | } 16 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | entry: ['index.ts'], 5 | format: ['cjs', 'esm'], 6 | dts: true, 7 | splitting: false, 8 | sourcemap: true, 9 | clean: true, 10 | minify: true, 11 | treeshake: true, 12 | external: ['zod'], 13 | }); -------------------------------------------------------------------------------- /validate.ts: -------------------------------------------------------------------------------- 1 | import {BPInfoSchema, handleZodError, ZodError} from '.'; 2 | 3 | fetch('https://eosrio.io/bp.json').then(res => res.json()).then(json => { 4 | try { 5 | const producerInfo = BPInfoSchema.parse(json); 6 | console.log(producerInfo.producer_account_name); 7 | console.log(producerInfo.org); 8 | console.log(producerInfo.nodes); 9 | } catch (e) { 10 | if (e instanceof ZodError) { 11 | handleZodError(e, {logToConsole: true, originalObject: json}); 12 | } 13 | } 14 | }) 15 | --------------------------------------------------------------------------------