From 058085e419ffd93ae52ab83bd14f7babdf1c2647 Mon Sep 17 00:00:00 2001 From: rabi-siddique Date: Wed, 18 Dec 2024 09:41:58 +0500 Subject: [PATCH] refactor: use zx for creating vaults --- .github/actions/createVault/action.yml | 19 +- .github/actions/createVault/createVault.mjs | 77 +++++++++ .github/workflows/liquidation.yml | 170 +++++++++--------- package.json | 4 +- yarn.lock | 182 ++++++++++++++++++++ 5 files changed, 349 insertions(+), 103 deletions(-) create mode 100644 .github/actions/createVault/createVault.mjs diff --git a/.github/actions/createVault/action.yml b/.github/actions/createVault/action.yml index 3460914a..1ad3c0ac 100644 --- a/.github/actions/createVault/action.yml +++ b/.github/actions/createVault/action.yml @@ -21,20 +21,5 @@ inputs: required: true runs: - using: 'composite' - steps: - - name: Create Vault - shell: bash - run: | - createVaultCommand="/usr/src/agoric-sdk/packages/agoric-cli/bin/agops vaults open --wantMinted \"${{ inputs.wantMinted }}\" --giveCollateral \"${{ inputs.giveCollateral }}\" > /tmp/want-ist.json" - echo "Executing create vault command in the container..." - - docker exec ${{ inputs.containerName }} /bin/bash -c "env AGORIC_NET=${{ inputs.agoricNet }} timeout ${{ inputs.commandTimeout }} $createVaultCommand" - - - name: Broadcast Offer - shell: bash - run: | - broadcastCommand="/usr/src/agoric-sdk/packages/agoric-cli/bin/agops perf satisfaction --executeOffer /tmp/want-ist.json --from \"${{ inputs.userKey }}\" --keyring-backend=test" - echo "Executing broadcast command in the container..." - - docker exec ${{ inputs.containerName }} /bin/bash -c "env AGORIC_NET=${{ inputs.agoricNet }} timeout ${{ inputs.commandTimeout }} $broadcastCommand" + using: 'node20' + main: 'createVault.mjs' diff --git a/.github/actions/createVault/createVault.mjs b/.github/actions/createVault/createVault.mjs new file mode 100644 index 00000000..c2c124c8 --- /dev/null +++ b/.github/actions/createVault/createVault.mjs @@ -0,0 +1,77 @@ +import { $ } from 'execa'; + + +const execa = require('execa'); + +async function setAtomPrice() { + try { + const { stdout } = await execa('docker', [ + 'exec', + 'agd', + '/usr/src/agoric-sdk/packages/agoric-cli/bin/agops', + 'oracle', + 'setPrice', + '--keys', 'gov1,gov2', + '--pair', 'ATOM.USD', + '--price', '12.34', + '--keyring-backend', 'test' + ]); + console.log('Output:', stdout); + } catch (error) { + console.error('Error:', error); + } +} + +setAtomPrice(); + + + +const createVault = async (containerName, agoricNet, commandTimeout, userKey, wantMinted, giveCollateral) => { + console.log('Starting the vault creation process...'); + const agops = '/usr/src/agoric-sdk/packages/agoric-cli/bin/agops'; + + let res = await $`docker ps`; + console.log('test.........', res); + + res = await $`ls /usr/`; + console.log('usr.........', res); + + res = await $`ls /usr/src`; + console.log('src.........', res); + + // res = await $`find / -type d -name "agoric-sdk" 2>/dev/null`; + // console.log('sdk dir.........', res); + + const createVaultCommand = `${agops} vaults open --wantMinted \"${wantMinted}\" --giveCollateral \"${giveCollateral}\" > /tmp/want-ist.json`; + const executeCreateVaultCommand = `docker exec ${containerName} /bin/bash -c "env AGORIC_NET=${agoricNet} timeout ${commandTimeout} ${createVaultCommand}"`; + try { + if (!containerName || !agoricNet || !commandTimeout || !userKey || !wantMinted || !giveCollateral) { + console.error('Missing required parameters.'); + process.exit(1); + } + + // Improved logging for debugging + console.log(`Command to execute: ${executeCreateVaultCommand}`); + + await $`${executeCreateVaultCommand}`; + console.log('Executing broadcast command...'); + const broadcastCommand = `timeout ${commandTimeout} ${agops} perf satisfaction --executeOffer /tmp/want-ist.json --from ${userKey} --keyring-backend=test`; + const executeBroadcastCommand = `docker exec ${containerName} AGORIC_NET=${agoricNet} ${broadcastCommand}`; + + await $`${executeBroadcastCommand}`; + console.log('Offer broadcast successfully.'); + } catch (error) { + console.error('Error during vault creation:', error); + process.exit(1); + } +}; + +const containerName = process.env.INPUT_CONTAINERNAME; +const agoricNet = process.env.INPUT_AGORICNET; +const commandTimeout = process.env.INPUT_COMMANDTIMEOUT; +const userKey = process.env.INPUT_USERKEY; +const wantMinted = process.env.INPUT_WANTMINTED; +const giveCollateral = process.env.INPUT_GIVECOLLATERAL; + +console.log('ARGS:', { containerName, agoricNet, commandTimeout, userKey, wantMinted, giveCollateral }); +createVault(containerName, agoricNet, commandTimeout, userKey, wantMinted, giveCollateral); diff --git a/.github/workflows/liquidation.yml b/.github/workflows/liquidation.yml index 8ca224be..1b297d7a 100644 --- a/.github/workflows/liquidation.yml +++ b/.github/workflows/liquidation.yml @@ -23,29 +23,29 @@ jobs: - name: Install dependencies run: yarn install - - name: Start subql indexer - env: - AGORIC_NET: ci - run: yarn dev - - - name: Print initial logs of all containers - run: | - echo "Fetching initial logs for all containers..." - containers=$(docker ps --format '{{.ID}}') - for container in $containers; do - echo "Fetching initial logs for container $container..." - docker logs $container - done - - - name: Set ATOM Price to 12.34 - run: | - docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 12.34 --keyring-backend=test - - - name: Get active vaults - uses: ./.github/actions/getActiveVaults - with: - apiUrl: 'http://localhost:3000/' - expectedVaults: 7 + # - name: Start subql indexer + # env: + # AGORIC_NET: ci + # run: yarn dev + + # - name: Print initial logs of all containers + # run: | + # echo "Fetching initial logs for all containers..." + # containers=$(docker ps --format '{{.ID}}') + # for container in $containers; do + # echo "Fetching initial logs for container $container..." + # docker logs $container + # done + + # - name: Set ATOM Price to 12.34 + # run: | + # docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 12.34 --keyring-backend=test + + # - name: Get active vaults + # uses: ./.github/actions/getActiveVaults + # with: + # apiUrl: 'http://localhost:3000/' + # expectedVaults: 7 - name: Create Vault with 100 Minted and 15 Collateral uses: ./.github/actions/createVault @@ -57,65 +57,65 @@ jobs: commandTimeout: '120' containerName: 'agd' - - name: Create Vault with 103 Minted and 15 Collateral - uses: ./.github/actions/createVault - with: - wantMinted: '103' - giveCollateral: '15' - userKey: 'gov3' - agoricNet: 'local' - commandTimeout: '120' - containerName: 'agd' - - - name: Create Vault with 105 Minted and 15 Collateral - uses: ./.github/actions/createVault - with: - wantMinted: '105' - giveCollateral: '15' - userKey: 'gov3' - agoricNet: 'local' - commandTimeout: '120' - containerName: 'agd' - - - name: Get active vaults - uses: ./.github/actions/getActiveVaults - with: - apiUrl: 'http://localhost:3000/' - expectedVaults: 10 - - - name: Place bid for 90IST - uses: ./.github/actions/placeBid - with: - fromAddress: 'gov1' - giveAmount: '90IST' - priceOrDiscount: '9' - commandType: 'by-price' - agoricNet: 'local' - commandTimeout: '120' - containerName: 'agd' - - - name: Place bid for 80IST - uses: ./.github/actions/placeBid - with: - fromAddress: 'gov1' - giveAmount: '80IST' - priceOrDiscount: '10' - commandType: 'by-discount' - agoricNet: 'local' - commandTimeout: '120' - containerName: 'agd' - - - name: Place bid for 150IST - uses: ./.github/actions/placeBid - with: - fromAddress: 'gov1' - giveAmount: '150IST' - priceOrDiscount: '15' - commandType: 'by-discount' - agoricNet: 'local' - commandTimeout: '120' - containerName: 'agd' - - - name: Set ATOM Price to 9.99 - run: | - docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 9.99 --keyring-backend=test + # - name: Create Vault with 103 Minted and 15 Collateral + # uses: ./.github/actions/createVault + # with: + # wantMinted: '103' + # giveCollateral: '15' + # userKey: 'gov3' + # agoricNet: 'local' + # commandTimeout: '120' + # containerName: 'agd' + + # - name: Create Vault with 105 Minted and 15 Collateral + # uses: ./.github/actions/createVault + # with: + # wantMinted: '105' + # giveCollateral: '15' + # userKey: 'gov3' + # agoricNet: 'local' + # commandTimeout: '120' + # containerName: 'agd' + + # - name: Get active vaults + # uses: ./.github/actions/getActiveVaults + # with: + # apiUrl: 'http://localhost:3000/' + # expectedVaults: 10 + + # - name: Place bid for 90IST + # uses: ./.github/actions/placeBid + # with: + # fromAddress: 'gov1' + # giveAmount: '90IST' + # priceOrDiscount: '9' + # commandType: 'by-price' + # agoricNet: 'local' + # commandTimeout: '120' + # containerName: 'agd' + + # - name: Place bid for 80IST + # uses: ./.github/actions/placeBid + # with: + # fromAddress: 'gov1' + # giveAmount: '80IST' + # priceOrDiscount: '10' + # commandType: 'by-discount' + # agoricNet: 'local' + # commandTimeout: '120' + # containerName: 'agd' + + # - name: Place bid for 150IST + # uses: ./.github/actions/placeBid + # with: + # fromAddress: 'gov1' + # giveAmount: '150IST' + # priceOrDiscount: '15' + # commandType: 'by-discount' + # agoricNet: 'local' + # commandTimeout: '120' + # containerName: 'agd' + + # - name: Set ATOM Price to 9.99 + # run: | + # docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 9.99 --keyring-backend=test diff --git a/package.json b/package.json index fc659b91..d735cec7 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,11 @@ "@subql/cli": "^5.4.0", "@subql/node-cosmos": "4.2.1", "@subql/testing": "latest", + "execa": "^9.5.2", "prettier": "^3.4.2", "starknet": "6.11.0", - "typescript": "^5.7.2" + "typescript": "^5.7.2", + "zx": "^8.2.4" }, "dependencies": { "@subql/types-cosmos": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index 4c0e2d2d..9dfadb54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3156,6 +3156,13 @@ __metadata: languageName: node linkType: hard +"@sec-ant/readable-stream@npm:^0.4.1": + version: 0.4.1 + resolution: "@sec-ant/readable-stream@npm:0.4.1" + checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.24.1": version: 0.24.51 resolution: "@sinclair/typebox@npm:0.24.51" @@ -3170,6 +3177,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b + languageName: node + linkType: hard + "@starknet-io/types-js@npm:^0.7.7, starknet-types-07@npm:@starknet-io/types-js@^0.7.7": version: 0.7.10 resolution: "@starknet-io/types-js@npm:0.7.10" @@ -3617,6 +3631,16 @@ __metadata: languageName: node linkType: hard +"@types/fs-extra@npm:>=11": + version: 11.0.4 + resolution: "@types/fs-extra@npm:11.0.4" + dependencies: + "@types/jsonfile": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/9e34f9b24ea464f3c0b18c3f8a82aefc36dc524cc720fc2b886e5465abc66486ff4e439ea3fb2c0acebf91f6d3f74e514f9983b1f02d4243706bdbb7511796ad + languageName: node + linkType: hard + "@types/glob@npm:*": version: 8.1.0 resolution: "@types/glob@npm:8.1.0" @@ -3678,6 +3702,15 @@ __metadata: languageName: node linkType: hard +"@types/jsonfile@npm:*": + version: 6.1.4 + resolution: "@types/jsonfile@npm:6.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/b12d068b021e4078f6ac4441353965769be87acf15326173e2aea9f3bf8ead41bd0ad29421df5bbeb0123ec3fc02eb0a734481d52903704a1454a1845896b9eb + languageName: node + linkType: hard + "@types/keyv@npm:^3.1.1": version: 3.1.4 resolution: "@types/keyv@npm:3.1.4" @@ -3747,6 +3780,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=20": + version: 22.10.2 + resolution: "@types/node@npm:22.10.2" + dependencies: + undici-types: "npm:~6.20.0" + checksum: 10c0/2c7b71a040f1ef5320938eca8ebc946e6905caa9bbf3d5665d9b3774a8d15ea9fab1582b849a6d28c7fc80756a62c5666bc66b69f42f4d5dafd1ccb193cdb4ac + languageName: node + linkType: hard + "@types/node@npm:^17.0.21": version: 17.0.45 resolution: "@types/node@npm:17.0.45" @@ -4113,11 +4155,13 @@ __metadata: "@subql/utils": "npm:^2.17.0" "@types/node": "npm:^17.0.21" bech32: "npm:^2.0.0" + execa: "npm:^9.5.2" js-sha256: "npm:^0.11.0" pino: "npm:^7.8.0" prettier: "npm:^3.4.2" starknet: "npm:6.11.0" typescript: "npm:^5.7.2" + zx: "npm:^8.2.4" languageName: unknown linkType: soft @@ -5892,6 +5936,26 @@ __metadata: languageName: node linkType: hard +"execa@npm:^9.5.2": + version: 9.5.2 + resolution: "execa@npm:9.5.2" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.3" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.0" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.0.0" + checksum: 10c0/94782a6282e03253224406c29068d18f9095cc251a45d1f19ac3d8f2a9db2cbe32fb8ceb039db1451d8fce3531135a6c0c559f76d634f85416268fc4a6995365 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -6047,6 +6111,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: "npm:^2.0.0" + checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 + languageName: node + linkType: hard + "file-uri-to-path@npm:1.0.0": version: 1.0.0 resolution: "file-uri-to-path@npm:1.0.0" @@ -6307,6 +6380,16 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": "npm:^0.4.1" + is-stream: "npm:^4.0.1" + checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -6604,6 +6687,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^8.0.0": + version: 8.0.0 + resolution: "human-signals@npm:8.0.0" + checksum: 10c0/e4dac4f7d3eb791ed04129fc6a85bd454a9102d3e3b76c911d0db7057ebd60b2956b435b5b5712aec18960488ede3c21ef7c56e42cdd70760c0d84d3c05cd92e + languageName: node + linkType: hard + "humanize-number@npm:0.0.2": version: 0.0.2 resolution: "humanize-number@npm:0.0.2" @@ -6913,6 +7003,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + "is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -6929,6 +7026,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + "is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -6943,6 +7047,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -8007,6 +8118,16 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-run-path@npm:6.0.0" + dependencies: + path-key: "npm:^4.0.0" + unicorn-magic: "npm:^0.3.0" + checksum: 10c0/b223c8a0dcd608abf95363ea5c3c0ccc3cd877daf0102eaf1b0f2390d6858d8337fbb7c443af2403b067a7d2c116d10691ecd22ab3c5273c44da1ff8d07753bd + languageName: node + linkType: hard + "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -8179,6 +8300,13 @@ __metadata: languageName: node linkType: hard +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 + languageName: node + linkType: hard + "parse-package-name@npm:1.0.0": version: 1.0.0 resolution: "parse-package-name@npm:1.0.0" @@ -8224,6 +8352,13 @@ __metadata: languageName: node linkType: hard +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -8481,6 +8616,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^9.0.0": + version: 9.2.0 + resolution: "pretty-ms@npm:9.2.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb + languageName: node + linkType: hard + "proc-log@npm:^5.0.0": version: 5.0.0 resolution: "proc-log@npm:5.0.0" @@ -9552,6 +9696,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff + languageName: node + linkType: hard + "strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" @@ -10043,6 +10194,13 @@ __metadata: languageName: node linkType: hard +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271 + languageName: node + linkType: hard + "unique-filename@npm:^4.0.0": version: 4.0.0 resolution: "unique-filename@npm:4.0.0" @@ -10664,6 +10822,13 @@ __metadata: languageName: node linkType: hard +"yoctocolors@npm:^2.0.0": + version: 2.1.1 + resolution: "yoctocolors@npm:2.1.1" + checksum: 10c0/85903f7fa96f1c70badee94789fade709f9d83dab2ec92753d612d84fcea6d34c772337a9f8914c6bed2f5fc03a428ac5d893e76fab636da5f1236ab725486d0 + languageName: node + linkType: hard + "zen-observable-ts@npm:^1.2.5": version: 1.2.5 resolution: "zen-observable-ts@npm:1.2.5" @@ -10679,3 +10844,20 @@ __metadata: checksum: 10c0/71cc2f2bbb537300c3f569e25693d37b3bc91f225cefce251a71c30bc6bb3e7f8e9420ca0eb57f2ac9e492b085b8dfa075fd1e8195c40b83c951dd59c6e4fbf8 languageName: node linkType: hard + +"zx@npm:^8.2.4": + version: 8.2.4 + resolution: "zx@npm:8.2.4" + dependencies: + "@types/fs-extra": "npm:>=11" + "@types/node": "npm:>=20" + dependenciesMeta: + "@types/fs-extra": + optional: true + "@types/node": + optional: true + bin: + zx: build/cli.js + checksum: 10c0/ae60ceef4eaf62695de0a24edab302efc770da10f2f4e79b7b8d50c2e7bee8c4b100e8722c6963a6f4badafe3f00d8d0fd50080c90745bf7bca90203c4aee59b + languageName: node + linkType: hard