diff --git a/README.md b/README.md index 223c5234d..01b31cdde 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,6 @@ Client Version: 2.0.6 AOS Version: 2.0.4 - - ## Requirements - [NodeJS](https://nodejs.org) version 20+ @@ -41,15 +39,14 @@ The aos console is a command-line application that provides an easy to use DX ex ### Setup -Use yarn to build the project and run. +Use npm to build the project and run. ```sh -yarn -yarn build -yarn start +npm install +npm run build +npm start ``` - ### Command-line options You can provide a name for a specific Process, if the Process does not exist aos will spawn the process, then every time you run `aos [name]` it will locate that process and interact with it. Alternatively, you can specify a process ID to connect to an existing process with `aos [process-id]`. @@ -60,31 +57,31 @@ aos [name/process-id] #### Flags -| Name | Description | Required | -| --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `--cron [Interval]` | The cron flag can only be used when spawning a process, it instructs the Process to generate messages every `Interval`. An Interval can be defined with a [n]-(period) for example: 1-minute, 10-minutes, 5-hours, 10-blocks, etc. | 0-1 | -| `--get-blueprints [dir]` | This command will grab blueprints from the `/blueprints` folder or a folder specified by the user. These blueprints are small lua files that can be applied to your process to automatically give it some functionality. | 0-1 | -| `--tag-name [name]` and `--tag-value [value]` | These flags are also only when aos is spawning a Process. You may add many of these combinations as you would like and they will appear on the Process tags object | 0-n | -| `--authority [authority]` | The authority flag will allow you to set your authority when spawning a Process. Can be a single address or a comma-separated list. | 0-1 | -| `--load [luaFile]` | The load command allows you to load lua source files from your local directory. | 0-n | -| `--run ""` | Evaluate a single Lua command once, print the result, exit without entering the interactive shell, and suppress the splash banner for cleaner stdout. | 0-1 | -| `--hyper` | Combine with `--run` to target hyper-aos without prompting. | 0-1 | -| `--gateway-url [url]` | The gateway-url flag allows you to specify a custom Gateway to connect to. | 0-1 | -| `--cu-url [url]` | The cu-url flag allows you to specify a custom Computer Unit to connect to. | 0-1 | -| `--mu-url [url]` | The mu-url flag allows you to specify a custom Memory Unit to connect to. | 0-1 | -| `--sqlite` | 0-1 | Use sqlite aos module when spawning new process | -| `--data [filepath]` | 0-1 | Set file contents as the data field of your Process. Will run when the process boots up if the On-Boot tag is set to Data, if On-Boot is set to Data make sure the file contains valid lua code | +| Name | Description | Required | +| --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--cron [Interval]` | The cron flag can only be used when spawning a process, it instructs the Process to generate messages every `Interval`. An Interval can be defined with a [n]-(period) for example: 1-minute, 10-minutes, 5-hours, 10-blocks, etc. | 0-1 | +| `--get-blueprints [dir]` | This command will grab blueprints from the `/blueprints` folder or a folder specified by the user. These blueprints are small lua files that can be applied to your process to automatically give it some functionality. | 0-1 | +| `--tag-name [name]` and `--tag-value [value]` | These flags are also only when aos is spawning a Process. You may add many of these combinations as you would like and they will appear on the Process tags object | 0-n | +| `--authority [authority]` | The authority flag will allow you to set your authority when spawning a Process. Can be a single address or a comma-separated list. | 0-1 | +| `--load [luaFile]` | The load command allows you to load lua source files from your local directory. | 0-n | +| `--run ""` | Evaluate a single Lua command once, print the result, exit without entering the interactive shell, and suppress the splash banner for cleaner stdout. | 0-1 | +| `--hyper` | Combine with `--run` to target hyper-aos without prompting. | 0-1 | +| `--gateway-url [url]` | The gateway-url flag allows you to specify a custom Gateway to connect to. | 0-1 | +| `--cu-url [url]` | The cu-url flag allows you to specify a custom Computer Unit to connect to. | 0-1 | +| `--mu-url [url]` | The mu-url flag allows you to specify a custom Memory Unit to connect to. | 0-1 | +| `--sqlite` | 0-1 | Use sqlite aos module when spawning new process | +| `--data [filepath]` | 0-1 | Set file contents as the data field of your Process. Will run when the process boots up if the On-Boot tag is set to Data, if On-Boot is set to Data make sure the file contains valid lua code | ### Commands When running the console, you can type `dot` commands to instruct the console to perform special instructions. -| Command | Description | -| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | -| `.editor` | This command opens a simple cli editor that you can type on multiple lines, and then you can type `.done` or `.cancel` to exit editor mode. | -| `.load` | This command allows you to load a lua source file from your local directory | -| `.load-blueprint [name]` | This command will grab a lua file from the blueprints directory and load it into your process. | -| `.exit` | This command will exit your console, but you can also do `Ctrl-C` or `Ctrl-D` | +| Command | Description | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | +| `.editor` | This command opens a simple cli editor that you can type on multiple lines, and then you can type `.done` or `.cancel` to exit editor mode. | +| `.load` | This command allows you to load a lua source file from your local directory | +| `.load-blueprint [name]` | This command will grab a lua file from the blueprints directory and load it into your process. | +| `.exit` | This command will exit your console, but you can also do `Ctrl-C` or `Ctrl-D` | ### Boot Loading @@ -112,8 +109,8 @@ license, or a traditional OSS license (GPLv3/v2, MIT, etc). ### Requirements -* Docker -* Nodejs +- Docker +- Nodejs ### Setup @@ -146,12 +143,11 @@ aos> .update Will load the current changes into a process. This workflow will allow you to make changes and update the os verify changes. Rinse Repeat. - ### Run AOS Tests ``` -yarn -yarn test +npm install +npm test ``` ### Deploy WASM Module @@ -160,7 +156,7 @@ yarn test > Add keyfile to $HOME/.wallet.json file ``` -yarn deploy +npm run deploy ``` ### Copy the new module id @@ -183,11 +179,9 @@ Update README.md with new Module ID and new Version ``` cd process docker run -v .:/src p3rmaw3b/aos-sqlite:0.0.0 emcc-lua -yarn -yarn test -yarn deploy-sqlite +npm install +npm test +npm run deploy-sqlite ``` copy module id to package.json and readme - - diff --git a/bin/aos.js b/bin/aos.js index dc3c598c9..6b2b907b5 100755 --- a/bin/aos.js +++ b/bin/aos.js @@ -6,8 +6,8 @@ import os from 'node:os' let __dirname = url.fileURLToPath(new URL('.', import.meta.url)) if (os.platform() === 'win32') { - __dirname = __dirname.replace(/\\/g, "/").replace(/^[A-Za-z]:\//, "/") + __dirname = __dirname.replace(/\\/g, '/').replace(/^[A-Za-z]:\//, '/') import(__dirname + '../src/index.js') } else { import(path.resolve(__dirname + '../src/index.js')) -} \ No newline at end of file +} diff --git a/extensions/weavedrive/build.js b/extensions/weavedrive/build.js index fa4bae8cf..0e9770589 100644 --- a/extensions/weavedrive/build.js +++ b/extensions/weavedrive/build.js @@ -1,9 +1,11 @@ const esbuild = require('esbuild') -esbuild.build({ - entryPoints: ['src/index.js'], - platform: 'node', - format: 'cjs', - bundle: true, - outfile: 'dist/index.cjs' -}).then(x => console.log('done')) +esbuild + .build({ + entryPoints: ['src/index.js'], + platform: 'node', + format: 'cjs', + bundle: true, + outfile: 'dist/index.cjs' + }) + .then(x => console.log('done')) diff --git a/extensions/weavedrive/client/README.md b/extensions/weavedrive/client/README.md index b83697e22..1b0aacf46 100644 --- a/extensions/weavedrive/client/README.md +++ b/extensions/weavedrive/client/README.md @@ -33,8 +33,7 @@ getTx takes a arweave txId and returns the transaction headers for that tx getDataItem takes a L2 or bundled txId and returns the MetaData for that `id` - -### getBlock(blockHeight) +### getBlock(blockHeight) getBlock takes a blockHeight and returns the blockHeight Headers @@ -232,4 +231,3 @@ getBlock takes a blockHeight and returns the blockHeight Headers npm i -g apm-tool apm publish ``` - diff --git a/extensions/weavedrive/client/apm.json b/extensions/weavedrive/client/apm.json index 09bbfae5b..6a12626e1 100644 --- a/extensions/weavedrive/client/apm.json +++ b/extensions/weavedrive/client/apm.json @@ -14,4 +14,4 @@ "installMessage": "" }, "dependencies": {} -} \ No newline at end of file +} diff --git a/extensions/weavedrive/src/index.js b/extensions/weavedrive/src/index.js index 8de44e3ac..1c7bedaed 100644 --- a/extensions/weavedrive/src/index.js +++ b/extensions/weavedrive/src/index.js @@ -6,15 +6,15 @@ const CACHE_SZ = 32 * KB const CHUNK_SZ = 128 * MB const NOTIFY_SZ = 512 * MB -module.exports = function weaveDrive (mod, FS) { +module.exports = function weaveDrive(mod, FS) { return { - reset (fd) { + reset(fd) { // console.log("WeaveDrive: Resetting fd: ", fd) FS.streams[fd].node.position = 0 FS.streams[fd].node.cache = new Uint8Array(0) }, - joinUrl ({ url, path }) { + joinUrl({ url, path }) { if (!path) return url if (path.startsWith('/')) return this.joinUrl({ url, path: path.slice(1) }) @@ -23,7 +23,7 @@ module.exports = function weaveDrive (mod, FS) { return url.toString() }, - async customFetch (path, options) { + async customFetch(path, options) { /** * mod.ARWEAVE may be a comma-delimited list of urls. * So we parse it into an array that we sequentially consume @@ -40,7 +40,7 @@ module.exports = function weaveDrive (mod, FS) { let p for (const url of urlList) { const res = fetch(this.joinUrl({ url, path }), options) - if (await res.then((r) => r.ok).catch(() => false)) return res + if (await res.then(r => r.ok).catch(() => false)) return res if (!p) p = res } @@ -51,10 +51,10 @@ module.exports = function weaveDrive (mod, FS) { return p }, - async create (id) { + async create(id) { const properties = { isDevice: false, contents: null } - if (!await this.checkAdmissible(id)) { + if (!(await this.checkAdmissible(id))) { // console.log("WeaveDrive: Arweave ID is not admissable! ", id) return 'HALT' } @@ -71,7 +71,10 @@ module.exports = function weaveDrive (mod, FS) { const node = FS.createFile('/', 'data/' + id, properties, true, false) // Set initial parameters - const response = await this.customFetch(`/${id}`, { method: 'HEAD', headers: { 'Accept-Encoding': 'identity' } }) + const response = await this.customFetch(`/${id}`, { + method: 'HEAD', + headers: { 'Accept-Encoding': 'identity' } + }) if (!response.ok) { return 'HALT' } @@ -81,7 +84,13 @@ module.exports = function weaveDrive (mod, FS) { node.position = 0 // Add a function that defers querying the file size until it is asked the first time. - Object.defineProperties(node, { usedBytes: { get: function () { return bytesLength } } }) + Object.defineProperties(node, { + usedBytes: { + get: function () { + return bytesLength + } + } + }) // Now we have created the file in the emscripten FS, we can open it as a stream const stream = FS.open('/data/' + id, 'r') @@ -89,10 +98,10 @@ module.exports = function weaveDrive (mod, FS) { // console.log("JS: Created file: ", id, " fd: ", stream.fd); return stream }, - async createBlockHeader (id) { + async createBlockHeader(id) { const customFetch = this.customFetch // todo: add a bunch of retries - async function retry (x) { + async function retry(x) { return new Promise(resolve => { setTimeout(function () { resolve(customFetch(`/block/height/${id}`)) @@ -100,10 +109,10 @@ module.exports = function weaveDrive (mod, FS) { }) } const result = await this.customFetch(`/block/height/${id}`) - .then(res => !res.ok ? retry(1) : res) - .then(res => !res.ok ? retry(2) : res) - .then(res => !res.ok ? retry(3) : res) - .then(res => !res.ok ? retry(4) : res) + .then(res => (!res.ok ? retry(1) : res)) + .then(res => (!res.ok ? retry(2) : res)) + .then(res => (!res.ok ? retry(3) : res)) + .then(res => (!res.ok ? retry(4) : res)) .then(res => res.text()) FS.createDataFile('/', 'block/' + id, Buffer.from(result, 'utf-8'), true, false) @@ -111,14 +120,14 @@ module.exports = function weaveDrive (mod, FS) { const stream = FS.open('/block/' + id, 'r') return stream }, - async createTxHeader (id) { + async createTxHeader(id) { const customFetch = this.customFetch - async function toAddress (owner) { + async function toAddress(owner) { return Arweave.utils.bufferTob64Url( await Arweave.crypto.hash(Arweave.utils.b64UrlToBuffer(owner)) ) } - async function retry (x) { + async function retry(x) { return new Promise(resolve => { setTimeout(function () { resolve(customFetch(`/tx/${id}`)) @@ -127,10 +136,10 @@ module.exports = function weaveDrive (mod, FS) { } // todo: add a bunch of retries const result = await this.customFetch(`/tx/${id}`) - .then(res => !res.ok ? retry(1) : res) - .then(res => !res.ok ? retry(2) : res) - .then(res => !res.ok ? retry(3) : res) - .then(res => !res.ok ? retry(4) : res) + .then(res => (!res.ok ? retry(1) : res)) + .then(res => (!res.ok ? retry(2) : res)) + .then(res => (!res.ok ? retry(3) : res)) + .then(res => (!res.ok ? retry(4) : res)) .then(res => res.json()) .then(async entry => ({ ...entry, ownerAddress: await toAddress(entry.owner) })) // .then(x => (console.error(x), x)) @@ -140,7 +149,7 @@ module.exports = function weaveDrive (mod, FS) { const stream = FS.open('/tx/' + id, 'r') return stream }, - async open (filename) { + async open(filename) { const pathCategory = filename.split('/')[1] const id = filename.split('/')[2] if (pathCategory === 'tx') { @@ -185,7 +194,7 @@ module.exports = function weaveDrive (mod, FS) { return 0 } }, - async read (fd, rawDstPtr, rawLength) { + async read(fd, rawDstPtr, rawLength) { // Note: The length and dstPtr are 53 bit integers in JS, so this _should_ be ok into a large memspace. let toRead = Number(rawLength) let dstPtr = Number(rawDstPtr) @@ -272,7 +281,11 @@ module.exports = function weaveDrive (mod, FS) { } if (bytesUntilNotify <= 0) { - console.log('WeaveDrive: Downloaded: ', downloadedBytes / stream.node.total_size * 100, '%') + console.log( + 'WeaveDrive: Downloaded: ', + (downloadedBytes / stream.node.total_size) * 100, + '%' + ) bytesUntilNotify = NOTIFY_SZ } } @@ -289,7 +302,7 @@ module.exports = function weaveDrive (mod, FS) { stream.lastReadPosition = stream.position return bytesRead }, - close (fd) { + close(fd) { let stream = 0 for (let i = 0; i < FS.streams.length; i++) { if (FS.streams[i].fd === fd) { @@ -300,7 +313,7 @@ module.exports = function weaveDrive (mod, FS) { }, // Readahead cache functions - readFromCache (stream, dstPtr, length) { + readFromCache(stream, dstPtr, length) { // Check if the cache has been invalidated by a seek if (stream.lastReadPosition !== stream.position) { // console.log("WeaveDrive: Invalidating cache for fd: ", stream.fd, " Current pos: ", stream.position, " Last read pos: ", stream.lastReadPosition) @@ -317,9 +330,12 @@ module.exports = function weaveDrive (mod, FS) { return cachePartLength }, - addChunksToCache (oldCache, chunks) { + addChunksToCache(oldCache, chunks) { // Make a new cache array of the old cache length + the sum of the chunk lengths, capped by the max cache size - const newCacheLength = Math.min(oldCache.length + chunks.reduce((acc, chunk) => acc + chunk.length, 0), CACHE_SZ) + const newCacheLength = Math.min( + oldCache.length + chunks.reduce((acc, chunk) => acc + chunk.length, 0), + CACHE_SZ + ) const newCache = new Uint8Array(newCacheLength) // Copy the old cache to the new cache newCache.set(oldCache, 0) @@ -335,7 +351,7 @@ module.exports = function weaveDrive (mod, FS) { }, // General helpder functions - async checkAdmissible (ID) { + async checkAdmissible(ID) { if (mod.mode && mod.mode === 'test') { // CAUTION: If the module is initiated with `mode = test` we don't check availability. return true @@ -344,7 +360,7 @@ module.exports = function weaveDrive (mod, FS) { // Check if we are attempting to load the On-Boot id, if so allow it // this was added for AOP 6 Boot loader See: https://github.com/permaweb/aos/issues/342 const bootTag = this.getTagValue('On-Boot', mod.spawn.tags) - if (bootTag && (bootTag === ID)) return true + if (bootTag && bootTag === ID) return true // Check that this module or process set the WeaveDrive tag on spawn const blockHeight = mod.blockHeight @@ -402,7 +418,8 @@ module.exports = function weaveDrive (mod, FS) { } } } - }`) + }` + ) if (assignmentsHaveID) { return true @@ -430,7 +447,8 @@ module.exports = function weaveDrive (mod, FS) { } } } - }`) + }` + ) if (individualsHaveID) { return true @@ -450,11 +468,11 @@ module.exports = function weaveDrive (mod, FS) { return false }, - serializeStringArr (arr = []) { - return `[${arr.map((s) => `"${s}"`).join(', ')}]` + serializeStringArr(arr = []) { + return `[${arr.map(s => `"${s}"`).join(', ')}]` }, - getTagValues (key, tags) { + getTagValues(key, tags) { const values = [] for (let i = 0; i < tags.length; i++) { if (tags[i].name === key) { @@ -464,18 +482,17 @@ module.exports = function weaveDrive (mod, FS) { return values }, - getTagValue (key, tags) { + getTagValue(key, tags) { const values = this.getTagValues(key, tags) return values.pop() }, - async queryHasResult (query, variables) { - const json = await this.gqlQuery(query, variables) - .then((res) => res.json()) + async queryHasResult(query, variables) { + const json = await this.gqlQuery(query, variables).then(res => res.json()) return !!json?.data?.transactions?.edges?.length }, - async gqlQuery (query, variables) { + async gqlQuery(query, variables) { const options = { method: 'POST', body: JSON.stringify({ query, variables }), diff --git a/extensions/weavedrive/test/index.test.js b/extensions/weavedrive/test/index.test.js index 4eded96bc..5d67d8d60 100644 --- a/extensions/weavedrive/test/index.test.js +++ b/extensions/weavedrive/test/index.test.js @@ -65,37 +65,47 @@ const drive = fs.readFileSync('./client/main.lua', 'utf-8') test('load client source', async () => { const handle = await AoLoader(wasm, options) - const result = await handle(memory, { - ...Msg, - Data: ` + const result = await handle( + memory, + { + ...Msg, + Data: ` local function _load() ${drive} end _G.package.loaded['WeaveDrive'] = _load() return "ok" ` - }, { Process, Module }) + }, + { Process, Module } + ) memory = result.Memory assert.ok(true) }) test('read block', async () => { const handle = await AoLoader(wasm, options) - const result = await handle(memory, { - ...Msg, - Data: ` + const result = await handle( + memory, + { + ...Msg, + Data: ` return #require('WeaveDrive').getBlock('1439783').txs ` - }, { Process, Module }) + }, + { Process, Module } + ) memory = result.Memory assert.equal(result.Output.data, '63') }) test('read tx', async () => { const handle = await AoLoader(wasm, options) - const result = await handle(memory, { - ...Msg, - Data: ` + const result = await handle( + memory, + { + ...Msg, + Data: ` local results = {} local drive = require('WeaveDrive') local txs = drive @@ -111,16 +121,20 @@ end return results ` - }, { Process, Module }) + }, + { Process, Module } + ) memory = result.Memory assert.ok(true) }) test('read twice', async function () { const handle = await AoLoader(wasm, options) - const result = await handle(memory, { - ...Msg, - Data: ` + const result = await handle( + memory, + { + ...Msg, + Data: ` local drive = require('WeaveDrive') function getTxs() local results = {} @@ -142,7 +156,9 @@ local results = getTxs() local results2 = getTxs() return require('json').encode({ A = #results, B = #results2 }) ` - }, { Process, Module }) + }, + { Process, Module } + ) memory = result.Memory const res = JSON.parse(result.Output.data) @@ -192,16 +208,20 @@ describe('Assignments mode', () => { }, mode }) - const result = await handle(null, { - ...Msg, - 'Block-Height': blockHeight + 2, - Data: ` + const result = await handle( + null, + { + ...Msg, + 'Block-Height': blockHeight + 2, + Data: ` local function _load() ${drive} end _G.package.loaded['WeaveDrive'] = _load() local drive = require('WeaveDrive') return drive.getData("${TX_ID_TO_LOAD}") ` - }, { Process: ProcessSchedulerAttested, Module }) + }, + { Process: ProcessSchedulerAttested, Module } + ) assert.equal(result.Output.data, 'hello from attested') }) @@ -225,16 +245,20 @@ describe('Assignments mode', () => { }, mode }) - const result = await handle(null, { - ...Msg, - 'Block-Height': blockHeight + 2, - Data: ` + const result = await handle( + null, + { + ...Msg, + 'Block-Height': blockHeight + 2, + Data: ` local function _load() ${drive} end _G.package.loaded['WeaveDrive'] = _load() local drive = require('WeaveDrive') return drive.getData("${TX_ID_TO_LOAD}") ` - }, { Process: ProcessAttestorAttested, Module }) + }, + { Process: ProcessAttestorAttested, Module } + ) assert.equal(result.Output.data, 'hello from attested') }) @@ -283,16 +307,20 @@ describe('Individual Mode', () => { }, mode }) - const result = await handle(null, { - ...Msg, - 'Block-Height': blockHeight + 2, - Data: ` + const result = await handle( + null, + { + ...Msg, + 'Block-Height': blockHeight + 2, + Data: ` local function _load() ${drive} end _G.package.loaded['WeaveDrive'] = _load() local drive = require('WeaveDrive') return drive.getData("${TX_ID_TO_LOAD}") ` - }, { Process: ProcessSchedulerAttested, Module }) + }, + { Process: ProcessSchedulerAttested, Module } + ) assert.equal(result.Output.data, '1234') }) @@ -306,12 +334,16 @@ describe('multi-url', () => { ...options, ARWEAVE: urls }) - const result = await handle(memory, { - ...Msg, - Data: ` + const result = await handle( + memory, + { + ...Msg, + Data: ` return #require('WeaveDrive').getBlock('1439784').txs ` - }, { Process, Module }) + }, + { Process, Module } + ) memory = result.Memory assert.equal(result.Output.data, '20') }) @@ -321,9 +353,11 @@ describe('multi-url', () => { ...options, ARWEAVE: urls }) - const result = await handle(memory, { - ...Msg, - Data: ` + const result = await handle( + memory, + { + ...Msg, + Data: ` local results = {} local drive = require('WeaveDrive') local txs = drive.getBlock('1439784').txs @@ -332,7 +366,9 @@ describe('multi-url', () => { end return results ` - }, { Process, Module }) + }, + { Process, Module } + ) memory = result.Memory assert.ok(true) }) @@ -369,9 +405,13 @@ test('boot loader set to Data', async function () { const optionsBootLoaderData = { ...options, mode: null } const handle = await AoLoader(bootLoaderWasm, optionsBootLoaderData) - const result = await handle(null, { - ...ProcessBootLoaderData - }, { Process: ProcessBootLoaderData, Module }) + const result = await handle( + null, + { + ...ProcessBootLoaderData + }, + { Process: ProcessBootLoaderData, Module } + ) assert.equal(result.Output.data, 'Test 1') }) @@ -410,21 +450,29 @@ test('boot loader set to tx id', async function () { } const handle = await AoLoader(bootLoaderWasm, optionsBootLoaderTx) - const { Memory } = await handle(null, { - ...ProcessBootLoaderTx - }, { Process: ProcessBootLoaderTx, Module }) + const { Memory } = await handle( + null, + { + ...ProcessBootLoaderTx + }, + { Process: ProcessBootLoaderTx, Module } + ) /** * Now access a value set by the On-Boot tx's * evaluation */ - const result = await handle(Memory, { - ...Msg, - Owner: 'PROCESS', - Target: 'PROCESS', - From: 'PROCESS', - Data: 'Ticker' - }, { Process: ProcessBootLoaderTx, Module }) + const result = await handle( + Memory, + { + ...Msg, + Owner: 'PROCESS', + Target: 'PROCESS', + From: 'PROCESS', + Data: 'Ticker' + }, + { Process: ProcessBootLoaderTx, Module } + ) assert.equal(result.Output.data, '') }) @@ -435,19 +483,49 @@ describe('joinUrl', () => { test('should return the url', () => { assert.equal(joinUrl({ url: 'https://arweave.net/graphql' }), 'https://arweave.net/graphql') - assert.equal(joinUrl({ url: 'https://arweave.net/graphql?foo=bar' }), 'https://arweave.net/graphql?foo=bar') - assert.equal(joinUrl({ url: 'https://arweave.net/graphql', path: undefined }), 'https://arweave.net/graphql') + assert.equal( + joinUrl({ url: 'https://arweave.net/graphql?foo=bar' }), + 'https://arweave.net/graphql?foo=bar' + ) + assert.equal( + joinUrl({ url: 'https://arweave.net/graphql', path: undefined }), + 'https://arweave.net/graphql' + ) }) test('should append the path', () => { - assert.equal(joinUrl({ url: 'https://arweave.net', path: 'graphql' }), 'https://arweave.net/graphql') - assert.equal(joinUrl({ url: 'https://arweave.net', path: '/graphql' }), 'https://arweave.net/graphql') - assert.equal(joinUrl({ url: 'https://arweave.net/', path: 'graphql' }), 'https://arweave.net/graphql') - assert.equal(joinUrl({ url: 'https://arweave.net/', path: '/graphql' }), 'https://arweave.net/graphql') - - assert.equal(joinUrl({ url: 'https://arweave.net?foo=bar', path: 'graphql' }), 'https://arweave.net/graphql?foo=bar') - assert.equal(joinUrl({ url: 'https://arweave.net?foo=bar', path: '/graphql' }), 'https://arweave.net/graphql?foo=bar') - assert.equal(joinUrl({ url: 'https://arweave.net/?foo=bar', path: 'graphql' }), 'https://arweave.net/graphql?foo=bar') - assert.equal(joinUrl({ url: 'https://arweave.net/?foo=bar', path: '/graphql' }), 'https://arweave.net/graphql?foo=bar') + assert.equal( + joinUrl({ url: 'https://arweave.net', path: 'graphql' }), + 'https://arweave.net/graphql' + ) + assert.equal( + joinUrl({ url: 'https://arweave.net', path: '/graphql' }), + 'https://arweave.net/graphql' + ) + assert.equal( + joinUrl({ url: 'https://arweave.net/', path: 'graphql' }), + 'https://arweave.net/graphql' + ) + assert.equal( + joinUrl({ url: 'https://arweave.net/', path: '/graphql' }), + 'https://arweave.net/graphql' + ) + + assert.equal( + joinUrl({ url: 'https://arweave.net?foo=bar', path: 'graphql' }), + 'https://arweave.net/graphql?foo=bar' + ) + assert.equal( + joinUrl({ url: 'https://arweave.net?foo=bar', path: '/graphql' }), + 'https://arweave.net/graphql?foo=bar' + ) + assert.equal( + joinUrl({ url: 'https://arweave.net/?foo=bar', path: 'graphql' }), + 'https://arweave.net/graphql?foo=bar' + ) + assert.equal( + joinUrl({ url: 'https://arweave.net/?foo=bar', path: '/graphql' }), + 'https://arweave.net/graphql?foo=bar' + ) }) }) diff --git a/hyper/README.md b/hyper/README.md index f9f2115f4..6afc237a5 100644 --- a/hyper/README.md +++ b/hyper/README.md @@ -2,11 +2,9 @@ hyper AOS is a hyperBEAM based implementation of AOS, focused to deliver lighting fast performance to the AO network. - ## Developer Setup - -* Install lua +- Install lua ```sh wget https://www.lua.org/ftp/lua-5.3.6.tar.gz @@ -30,7 +28,7 @@ make macosx sudo make install ``` -* Install luarocks +- Install luarocks ```sh wget https://luarocks.org/releases/luarocks-3.9.2.tar.gz @@ -44,19 +42,19 @@ make sudo make install ``` -* Init lua env +- Init lua env ```sh luarocks init ``` -* Install busted testing library +- Install busted testing library ```sh -luarocks install busted +luarocks install busted ``` -* Setup lua env +- Setup lua env ```sh eval $(luarocks path) @@ -64,14 +62,12 @@ eval $(luarocks path) ## Tests -* Running Tests +- Running Tests ```sh busted ``` -* Writing Tests +- Writing Tests Add your test in the `spec` folder and name the test ending with `_spec.lua` - - diff --git a/hyper/bundle.js b/hyper/bundle.js index 7d20a23ba..7dc49bed3 100644 --- a/hyper/bundle.js +++ b/hyper/bundle.js @@ -1,8 +1,8 @@ /** * os update - * - * this command will load all of the latest aos process modules into memory on an existing - * process. This should allow us to have a better devX experience when building the os, + * + * this command will load all of the latest aos process modules into memory on an existing + * process. This should allow us to have a better devX experience when building the os, * as well as make it easier for users to update their processes. */ import fs from 'node:fs' @@ -11,33 +11,44 @@ import os from 'node:os' import * as url from 'url' import figlet from 'figlet' - -let __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +let __dirname = url.fileURLToPath(new URL('.', import.meta.url)) if (os.platform() === 'win32') { - __dirname = __dirname.replace(/\\/g, "/").replace(/^[A-Za-z]:\//, "/") + __dirname = __dirname.replace(/\\/g, '/').replace(/^[A-Za-z]:\//, '/') } export function dry() { console.log('not implemented') - return "" - + return '' } export function update() { // let luaFiles = fs.readdirSync(__dirname) // .filter(n => /\.lua$/.test(n)) - let luaFiles = ['json.lua', 'string-ext.lua', 'stringify.lua', 'eval.lua', - 'utils.lua', 'handlers-utils.lua', 'handlers.lua', - 'dump.lua', 'pretty.lua', 'chance.lua', 'boot.lua', - 'default.lua', 'ao.lua', 'base64.lua', - 'state.lua', 'process.lua' ] + let luaFiles = [ + 'json.lua', + 'string-ext.lua', + 'stringify.lua', + 'eval.lua', + 'utils.lua', + 'handlers-utils.lua', + 'handlers.lua', + 'dump.lua', + 'pretty.lua', + 'chance.lua', + 'boot.lua', + 'default.lua', + 'ao.lua', + 'base64.lua', + 'state.lua', + 'process.lua' + ] .map(name => { const code = fs.readFileSync(__dirname + 'src/' + name, 'utf-8') - const mod = name.replace(/\.lua$/, "") + const mod = name.replace(/\.lua$/, '') return template(mod, code) }) .join('\n\n') - let main = fs.readFileSync(__dirname + 'src/' + "main.lua", "utf-8") + let main = fs.readFileSync(__dirname + 'src/' + 'main.lua', 'utf-8') luaFiles += '\n\n' + main let args = process.argv.slice(2) if (args[0]) { @@ -51,17 +62,12 @@ export function update() { function template(mod, code) { return ` -local function load_${mod.replace("-", "_")}() +local function load_${mod.replace('-', '_')}() ${code} end -_G.package.loaded[".${mod}"] = load_${mod.replace("-", "_")}() +_G.package.loaded[".${mod}"] = load_${mod.replace('-', '_')}() print("loaded ${mod}") ` } - -console.log( - update() -) - - +console.log(update()) diff --git a/lint-staged.config.cjs b/lint-staged.config.cjs index 9c4ee16da..a164875de 100644 --- a/lint-staged.config.cjs +++ b/lint-staged.config.cjs @@ -1,5 +1,6 @@ module.exports = { '**/*.js': [ + 'prettier --write', 'standard --fix' ], '**/*.lua': (allFiles) => { diff --git a/package-lock.json b/package-lock.json index 770528d15..9c54dabda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,13 +13,9 @@ "extensions/*" ], "dependencies": { - "@permaweb/aoconnect": "0.0.90", + "@permaweb/aoconnect": "0.0.93", "arweave": "1.15.1", - "chalk": "5.3.0", - "figlet": "1.7.0", "http-message-signatures": "1.0.4", - "https-proxy-agent": "7.0.4", - "hyper-async": "1.1.2", "minimist": "1.2.8", "node-cron": "3.0.3", "ora": "7.0.1", @@ -27,8 +23,7 @@ "prompts": "2.4.2", "semver": "7.5.4", "tar-stream": "3.1.7", - "undici": "7.8.0", - "yargs": "17.7.2" + "undici": "7.8.0" }, "bin": { "aos": "bin/aos.js" @@ -41,7 +36,7 @@ "husky": "9.1.6", "lint-staged": "15.2.10", "markdown-toc-gen": "1.1.0", - "shelljs": "0.9.2", + "prettier": "^3.7.2", "sort-package-json": "2.10.1", "standard": "17.1.2" } @@ -128,8 +123,6 @@ }, "extensions/weavedrive/node_modules/@esbuild/darwin-arm64": { "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -451,8 +444,6 @@ }, "extensions/weavedrive/node_modules/arweave": { "version": "1.15.7", - "resolved": "https://registry.npmjs.org/arweave/-/arweave-1.15.7.tgz", - "integrity": "sha512-F+Y4iWU1qea9IsKQ/YNmLsY4DHQVsaJBuhEbFxQn9cfGHOmtXE+bwo14oY8xqymsqSNf/e1PeIfLk7G7qN/hVA==", "license": "MIT", "dependencies": { "arconnect": "^0.4.2", @@ -466,8 +457,6 @@ }, "extensions/weavedrive/node_modules/esbuild": { "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -521,9 +510,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -552,13 +541,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/cli/node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, "node_modules/@commitlint/config-conventional": { "version": "19.5.0", "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.5.0.tgz", @@ -587,30 +569,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/config-validator/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@commitlint/ensure": { "version": "19.8.1", "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", @@ -760,6 +718,16 @@ "node": ">=v18" } }, + "node_modules/@commitlint/read/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@commitlint/resolve-extends": { "version": "19.8.1", "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", @@ -817,95 +785,6 @@ "node": ">=v18" } }, - "node_modules/@commitlint/top-level/node_modules/find-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", - "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.2.0", - "path-exists": "^5.0.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@commitlint/top-level/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@commitlint/types": { "version": "19.8.1", "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", @@ -1388,9 +1267,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1407,9 +1286,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -1440,6 +1319,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/js": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", @@ -1581,12 +1484,6 @@ "bn.js": "^5.2.1" } }, - "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "license": "MIT" - }, "node_modules/@ethersproject/bytes": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", @@ -1930,12 +1827,6 @@ "hash.js": "1.1.7" } }, - "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "license": "MIT" - }, "node_modules/@ethersproject/strings": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", @@ -2067,6 +1958,7 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2096,6 +1988,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, @@ -2182,6 +2075,19 @@ "node": ">= 8" } }, + "node_modules/@permaweb/ao-core-libs": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@permaweb/ao-core-libs/-/ao-core-libs-0.0.8.tgz", + "integrity": "sha512-td6JVLn/+jlqwPcxmmagYCdle3tEFSa2MDgughGmLRbc7fQ45e5qZkltjHu09Lqr6o5jXWdUEuEnkUbT1zhi6Q==", + "license": "ISC", + "dependencies": { + "@dha-team/arbundles": "^1.0.3", + "axios": "^1.11.0", + "constants-browserify": "^1.0.0", + "http-message-signatures": "^1.0.4", + "structured-headers": "^2.0.1" + } + }, "node_modules/@permaweb/ao-loader": { "version": "0.0.44", "resolved": "https://registry.npmjs.org/@permaweb/ao-loader/-/ao-loader-0.0.44.tgz", @@ -2194,9 +2100,9 @@ } }, "node_modules/@permaweb/ao-scheduler-utils": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.25.tgz", - "integrity": "sha512-b0UYSTgnLMIYLScrfNBgcqK7ZMmd78L3J0Jz4RIsIq2P5PtkdRqQ7fYqLlltg7bD1f3dvl4TkO1925ED4ei7LA==", + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.29.tgz", + "integrity": "sha512-tzuNsy2NUcATLMG+SKaO1PxbXaDpfoQikEfI7BABkNWk6AyQoBLy0Zwuu0eypGEHeNP6gugXEo1j8oZez/8fXA==", "dependencies": { "lru-cache": "^10.2.2", "ramda": "^0.30.0", @@ -2207,11 +2113,12 @@ } }, "node_modules/@permaweb/aoconnect": { - "version": "0.0.90", - "resolved": "https://registry.npmjs.org/@permaweb/aoconnect/-/aoconnect-0.0.90.tgz", - "integrity": "sha512-VKEkwKV5Lv6q2pai38gz/ngcRML4iApWsJc5B8X8ow9fJIXnd9UK8y0HMbrKUF/VB5Eb8r8lJhDr76yiL6QWAA==", + "version": "0.0.93", + "resolved": "https://registry.npmjs.org/@permaweb/aoconnect/-/aoconnect-0.0.93.tgz", + "integrity": "sha512-IWHOIC2qcLMNcg4XbW9kdE246EiyCt1tnVkjJbr7/lzBr7oKiQXxnxY8GihaVnQp+qeKSfZWhUzge7f9yM+01Q==", "dependencies": { "@dha-team/arbundles": "1.0.3", + "@permaweb/ao-core-libs": "0.0.8", "@permaweb/ao-scheduler-utils": "~0.0.25", "@permaweb/protocol-tag-utils": "~0.0.2", "axios": "^1.7.9", @@ -2229,16 +2136,6 @@ "node": ">=18" } }, - "node_modules/@permaweb/aoconnect/node_modules/structured-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-2.0.1.tgz", - "integrity": "sha512-6Rob3q8opLyWHNCPeDFZU9CmrxOWzfvYUnOPE6SWXtcqI1DqQKx39CqKuQq+WsyuLNOkKvz5rQ/54ycAMU6qOg==", - "license": "MIT", - "engines": { - "node": ">=18", - "npm": ">=6" - } - }, "node_modules/@permaweb/protocol-tag-utils": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@permaweb/protocol-tag-utils/-/protocol-tag-utils-0.0.2.tgz", @@ -2260,15 +2157,6 @@ "wasm2json": "bin/wasm2json" } }, - "node_modules/@permaweb/wasm-json-toolkit/node_modules/buffer-pipe": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.3.tgz", - "integrity": "sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA==", - "license": "MPL-2.0", - "dependencies": { - "safe-buffer": "^5.1.2" - } - }, "node_modules/@permaweb/wasm-metering": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@permaweb/wasm-metering/-/wasm-metering-0.2.2.tgz", @@ -2318,9 +2206,9 @@ "license": "MIT" }, "node_modules/@types/conventional-commits-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", - "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.2.tgz", + "integrity": "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==", "dev": true, "license": "MIT", "dependencies": { @@ -2335,13 +2223,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.16.0" } }, "node_modules/@ungap/structured-clone": { @@ -2380,24 +2268,17 @@ "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", "license": "MIT" }, - "node_modules/agent-base": { - "version": "7.1.3", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2437,9 +2318,9 @@ } }, "node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2453,9 +2334,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -2465,13 +2346,13 @@ } }, "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -2699,6 +2580,12 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -2732,21 +2619,29 @@ } }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/balanced-match": { "version": "1.0.2", @@ -2756,11 +2651,18 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", - "optional": true + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/base-x": { "version": "3.0.11", @@ -2817,9 +2719,9 @@ } }, "node_modules/bignumber.js": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", - "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", "engines": { "node": "*" @@ -2834,6 +2736,9 @@ "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" } }, "node_modules/bl": { @@ -2855,9 +2760,9 @@ "license": "MIT" }, "node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", "license": "MIT" }, "node_modules/brace-expansion": { @@ -2934,12 +2839,12 @@ } }, "node_modules/buffer-pipe": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.0.tgz", - "integrity": "sha512-PvKbsvQOH4dcUyUEvQQSs3CIkkuPcOHt3gKnXwf4HsPKFDxSN7bkmICVIWgOmW/jx/fAEGGn4mIayIJPLs7G8g==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.3.tgz", + "integrity": "sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA==", "license": "MPL-2.0", "dependencies": { - "safe-buffer": "^5.1.1" + "safe-buffer": "^5.1.2" } }, "node_modules/buffers": { @@ -3028,12 +2933,15 @@ "license": "MIT/X11", "dependencies": { "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -3043,15 +2951,16 @@ } }, "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3086,28 +2995,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -3122,6 +3014,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3131,6 +3024,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3142,10 +3036,43 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -3158,6 +3085,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -3175,6 +3103,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3187,6 +3116,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/colorette": { @@ -3236,6 +3166,12 @@ "dev": true, "license": "MIT" }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "license": "MIT" + }, "node_modules/conventional-changelog-angular": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", @@ -3316,13 +3252,13 @@ } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", - "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.2.0.tgz", + "integrity": "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==", "dev": true, "license": "MIT", "dependencies": { - "jiti": "^2.4.1" + "jiti": "^2.6.1" }, "engines": { "node": ">=v18" @@ -3379,16 +3315,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/dargs": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", @@ -3467,9 +3393,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3536,13 +3462,16 @@ } }, "node_modules/detect-indent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", - "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, "license": "MIT", "engines": { "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/detect-newline": { @@ -3582,16 +3511,16 @@ } }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dot-prop": { @@ -3692,21 +3621,17 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, "node_modules/env-paths": { "version": "2.2.1", @@ -3732,9 +3657,9 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3957,6 +3882,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3979,6 +3905,7 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -4109,9 +4036,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -4183,30 +4110,30 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -4226,6 +4153,19 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4311,6 +4251,19 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -4398,6 +4351,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -4441,17 +4411,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/glob-parent": { @@ -4467,6 +4441,71 @@ "node": ">=10.13.0" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4480,6 +4519,19 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -4551,92 +4603,43 @@ "dev": true, "license": "MIT" }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "license": "MIT", + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" + "bare-events": "^2.7.0" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "license": "Apache-2.0", "optional": true }, @@ -4685,9 +4688,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -4735,18 +4738,6 @@ "node": "^12.20 || >= 14.13" } }, - "node_modules/figlet": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", - "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", - "license": "MIT", - "bin": { - "figlet": "bin/index.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4774,17 +4765,18 @@ } }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4813,9 +4805,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -4849,9 +4841,9 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -4888,6 +4880,7 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -4904,6 +4897,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -4953,10 +4947,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -5026,16 +5031,16 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { @@ -5088,6 +5093,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -5341,17 +5347,14 @@ "structured-headers": "^1.0.1" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/http-message-signatures/node_modules/structured-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-1.0.1.tgz", + "integrity": "sha512-QYBxdBtA4Tl5rFPuqmbmdrS9kbtren74RTJTcs0VSQNVV5iRhJD4QlYTLD0+81SBwUQctjEQzjTRI3WG4DzICA==", "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, "engines": { - "node": ">= 14" + "node": ">= 14", + "npm": ">=6" } }, "node_modules/human-signals": { @@ -5381,10 +5384,13 @@ } }, "node_modules/hyper-async": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/hyper-async/-/hyper-async-1.1.2.tgz", - "integrity": "sha512-cnpOgKa+5FZOaccTtjduac1FrZuSc38/ftCp3vYJdUMt+7c+uvGDKLDK4MTNK8D3aFjIeveVrPcSgUPvzZLopg==", - "license": "MIT" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyper-async/-/hyper-async-1.2.0.tgz", + "integrity": "sha512-7wvJxzAEBREKotXGuHOSri8/J+D0oURqCbNmn8g7Ym8hVMJQkGCMMS9y2/GktMtRyxPVcw2xWFh2oPa970PmXQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/ieee754": { "version": "1.2.1", @@ -5444,9 +5450,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", "funding": { @@ -5468,6 +5474,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -5506,16 +5513,6 @@ "node": ">= 0.4" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -5685,23 +5682,28 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -5872,13 +5874,16 @@ } }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { @@ -6095,9 +6100,9 @@ } }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", "bin": { @@ -6132,9 +6137,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -6176,9 +6181,9 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -6289,6 +6294,21 @@ "buffer-pipe": "0.0.0" } }, + "node_modules/leb128/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/leb128/node_modules/buffer-pipe": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.0.tgz", + "integrity": "sha512-PvKbsvQOH4dcUyUEvQQSs3CIkkuPcOHt3gKnXwf4HsPKFDxSN7bkmICVIWgOmW/jx/fAEGGn4mIayIJPLs7G8g==", + "license": "MPL-2.0", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6351,6 +6371,19 @@ "url": "https://opencollective.com/lint-staged" } }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/lint-staged/node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -6369,96 +6402,6 @@ } } }, - "node_modules/lint-staged/node_modules/execa": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -6526,16 +6469,16 @@ } }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6640,20 +6583,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { @@ -6672,52 +6612,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", @@ -6821,19 +6715,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -6975,13 +6856,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" - }, "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -7004,6 +6878,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, "funding": [ { @@ -7051,16 +6926,32 @@ } }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^2.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/object-assign": { @@ -7259,6 +7150,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/ora/node_modules/string-width": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", @@ -7294,43 +7246,33 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7379,13 +7321,13 @@ } }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { @@ -7399,13 +7341,13 @@ } }, "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { @@ -7432,6 +7374,19 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", @@ -7552,7 +7507,23 @@ "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-file-tree": { @@ -7576,26 +7547,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, "node_modules/process": { "resolved": "process", "link": true @@ -7632,23 +7583,19 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7691,9 +7638,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, @@ -7711,18 +7658,6 @@ "node": ">= 6" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -7784,6 +7719,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7800,13 +7736,13 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7831,40 +7767,33 @@ } }, "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7892,6 +7821,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -8142,25 +8072,6 @@ "node": ">=8" } }, - "node_modules/shelljs": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", - "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "execa": "^1.0.0", - "fast-glob": "^3.3.2", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -8238,10 +8149,17 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sisteransi": { "version": "1.0.5", @@ -8279,17 +8197,17 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/sort-object-keys": { @@ -8453,16 +8371,14 @@ } }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -8485,44 +8401,21 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=18" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string.prototype.matchall": { @@ -8624,9 +8517,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -8648,16 +8541,6 @@ "node": ">=4" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -8685,12 +8568,12 @@ } }, "node_modules/structured-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-1.0.1.tgz", - "integrity": "sha512-QYBxdBtA4Tl5rFPuqmbmdrS9kbtren74RTJTcs0VSQNVV5iRhJD4QlYTLD0+81SBwUQctjEQzjTRI3WG4DzICA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-2.0.2.tgz", + "integrity": "sha512-IUul56vVHuMg2UxWhwDj9zVJE6ztYEQQkynr1FQ/NydPhivtk5+Qb2N1RS36owEFk2fNUriTguJ2R7htRObcdA==", "license": "MIT", "engines": { - "node": ">= 14", + "node": ">=18", "npm": ">=6" } }, @@ -8768,16 +8651,16 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "license": "MIT", "optional": true, "engines": { @@ -8819,7 +8702,10 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", "dev": true, - "license": "MIT/X11" + "license": "MIT/X11", + "engines": { + "node": "*" + } }, "node_modules/tsconfig-paths": { "version": "3.15.0", @@ -8989,9 +8875,9 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, @@ -9270,22 +9156,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrappy": { @@ -9330,6 +9211,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -9358,6 +9240,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -9376,28 +9259,84 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zod": { - "version": "3.25.64", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.64.tgz", - "integrity": "sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index c40536ed9..997f87450 100644 --- a/package.json +++ b/package.json @@ -14,21 +14,20 @@ ], "scripts": { "build-docs": "rm -rf process/docs && ldoc .", + "clean:install": "rm -rf node_modules package-lock.json || true && npm cache clean --force && npm install", + "format": "prettier --write \"**/*.{js,json,md}\"", + "format:check": "prettier --check \"**/*.{js,json,md}\"", "deploy": "npx -y ardrive-cli@2.0.4 upload-file --turbo --local-path=./$(npm pack) -w ~/.wallet.json -F 0d009773-ce2c-4539-8e0d-c331db9ab348 | jq .created[0].dataTxId", "generate-wallet": "node -e \"require('arweave').init({}).wallets.generate().then(JSON.stringify).then(console.log.bind(console))\" > wallet.json", "staged": "lint-staged", "start": "node src/index.js", "test": "node --test test", - "test-all": "yarn workspaces --parallel run test" + "test-all": "npm run test --workspaces" }, "dependencies": { - "@permaweb/aoconnect": "0.0.90", + "@permaweb/aoconnect": "0.0.93", "arweave": "1.15.1", - "chalk": "5.3.0", - "figlet": "1.7.0", "http-message-signatures": "1.0.4", - "https-proxy-agent": "7.0.4", - "hyper-async": "1.1.2", "minimist": "1.2.8", "node-cron": "3.0.3", "ora": "7.0.1", @@ -36,8 +35,7 @@ "prompts": "2.4.2", "semver": "7.5.4", "tar-stream": "3.1.7", - "undici": "7.8.0", - "yargs": "17.7.2" + "undici": "7.8.0" }, "devDependencies": { "@commitlint/cli": "19.5.0", @@ -47,7 +45,7 @@ "husky": "9.1.6", "lint-staged": "15.2.10", "markdown-toc-gen": "1.1.0", - "shelljs": "0.9.2", + "prettier": "^3.7.2", "sort-package-json": "2.10.1", "standard": "17.1.2" }, diff --git a/process/README.md b/process/README.md index f743efe12..45dd57378 100644 --- a/process/README.md +++ b/process/README.md @@ -1,17 +1,17 @@ -# aos +# aos This is the source code to the aos module, this module provides developers with the capability of designing and building process on the ao network in an interactive experience. When the design is complete the developer can transfer the ownership to a DAO process or brick the ownership so that the process can never be modified. ## Build ```sh -yarn build +npm run build ``` ## Testing ```sh -yarn test +npm test ``` ## Modules @@ -19,4 +19,3 @@ yarn test - [process](process.md) - [handlers](handlers.md) - [ao](ao.md) - diff --git a/process/crypto.md b/process/crypto.md index fee67362e..0fd62cf7d 100644 --- a/process/crypto.md +++ b/process/crypto.md @@ -5,6 +5,7 @@ The `crypto` module provides a set of cryptographic primitives like digests, ciphers and other cryptographic algorithms in pure Lua. It offers several functionalities to hash, encrypt and decrypt data, simplifying the development of secure communication and data storage. This document will guide you through the module's functionalities, installation, and usage. ### Version + 0.0.1 ## Installation @@ -77,7 +78,7 @@ Calculates the MD5 digest of a given message. - `asBytes()`: The digest as byte table. - `asHex()`: The digest as string in hexadecimal format. - `asString()`: The digest as string format. - + Example: ```lua @@ -112,7 +113,6 @@ Calculates the SHA2-256 digest of a given message. - **Parameters:** - `stream` (Stream): The message in form of stream - - **Returns:** A table containing functions to get digest in different formats. - `asBytes()`: The digest as byte table. - `asHex()`: The digest as string in hexadecimal format. @@ -132,7 +132,6 @@ Calculates the SHA2-512 digest of a given message. - **Parameters:** - `msg` (string): The message to calculate the digest - - **Returns:** A table containing functions to get digest in different formats. - `asBytes()`: The digest as byte table. - `asHex()`: The digest as string in hexadecimal format. @@ -201,6 +200,7 @@ crypto.digest.blake2b(str).asHex() -- 576701fd79a126f2c414ef94adf1117c88943700f3 crypto.digest.blake2b(str, 32).asHex() -- 7050811afc947ba7190bb3c0a7b79b4fba304a0de61d529c8a35bdcbbb5544f4 crypto.digest.blake2b(str, 32, "secret_key").asHex() -- 203c101980fdf6cf24d78879f2e3db86d73d91f7d60960b642022cd6f87408f8 ``` + --- # Ciphers @@ -241,7 +241,6 @@ Decrypts a given message using the AES algorithm. - `asHex()`: The decrypted data as string in hexadecimal format. - `asString()`: The decrypted data as string format. - Example: ```lua @@ -321,7 +320,6 @@ Example: crypto.cipher.issac.random(0, 100) -- 42 ``` - ## Morus Cipher MORUS is a high-performance authenticated encryption algorithm submitted to the CAESAR competition, and recently selected as a finalist. @@ -402,7 +400,6 @@ Decrypts a given message using the NORX cipher. - `asHex()`: The decrypted data as string in hexadecimal format. - `asString()`: The decrypted data as string format. - Example: ```lua @@ -441,8 +438,6 @@ Example: crypto.random.(0, 100, "seed") -- 42 ``` - - --- # MACs @@ -471,6 +466,7 @@ local key = crypto.utils.array.fromString("super_secret_key") crypto.mac.createHmac(data, key).asHex() -- 3966f45acb53f7a1a493bae15afecb1a204fa32d crypto.mac.createHmac(data, key, "sha256").asHex() -- 542da02a324155d688c7689669ff94c6a5f906892aa8eccd7284f210ac66e2a7 ``` + --- # KDFs @@ -535,7 +531,7 @@ arr.slice(arr.fromString("ao"), 0, 1) -- Array Returns the size of the array. -- **Parameters:** +- **Parameters:** - `arr` (Array): The array to get the size of. - **Returns:** The size of the array. @@ -601,7 +597,7 @@ Creates an array from a hexadecimal string. Converts an array to a hexadecimal string. -- **Parameters:** +- **Parameters:** - `arr` (Array): The array to convert to a hexadecimal string. - **Returns:** The array as a hexadecimal string. @@ -623,7 +619,6 @@ Truncates an array to a given length. - `newSize` (number): The new size of the array. - **Returns:** The truncated array. - ### `XOR` Performs a bitwise XOR operation on two arrays. @@ -693,7 +688,6 @@ stream.fromHex("616f") -- Stream stream.toHex(stream.fromHex("616f")) -- 616f ``` - ### `fromString` Creates a stream from a string. @@ -847,4 +841,4 @@ Resets the queue. ## License -MIT \ No newline at end of file +MIT diff --git a/process/handlers-utils.md b/process/handlers-utils.md index 430d6f801..7bd48b819 100644 --- a/process/handlers-utils.md +++ b/process/handlers-utils.md @@ -1,9 +1,11 @@ -# README for Lua Module: _utils (v0.0.1) +# README for Lua Module: \_utils (v0.0.1) ## Overview + The `_utils` module is a lightweight Lua utility library designed to provide common functionalities for handling and processing messages within the AOS computer system. It offers a set of functions to check message attributes and send replies, simplifying the development of more complex scripts and modules. This document will guide you through the module's functionalities, installation, and usage. ### Version + 0.0.1 ## Installation @@ -15,6 +17,7 @@ The `_utils` module is a lightweight Lua utility library designed to provide com ## Features ### hasMatchingTag(name, value) + Checks if a given message has a tag that matches the specified name and value. - **Parameters:** @@ -24,6 +27,7 @@ Checks if a given message has a tag that matches the specified name and value. - **Returns:** Function that takes a message object and returns `-1` if the tag matches, `0` otherwise. ### hasMatchingTagOf(name, values) + Checks if a given message has a tag that matches the specified name and one of the specified values. - **Parameters:** @@ -33,6 +37,7 @@ Checks if a given message has a tag that matches the specified name and one of t - **Returns:** Function that takes a message object and returns `-1` if the tag matches, `0` otherwise. ### hasMatchingData(value) + Checks if the message data matches the specified value. - **Parameters:** @@ -41,6 +46,7 @@ Checks if the message data matches the specified value. - **Returns:** Function that takes a message object and returns `-1` if the data matches, `0` otherwise. ### reply(input) + Sends a reply to the sender of a message. The reply can be a simple string or a table with more complex data and tags. - **Parameters:** @@ -49,6 +55,7 @@ Sends a reply to the sender of a message. The reply can be a simple string or a - **Returns:** Function that takes a message object and sends the specified reply. ### continue(pattern) + Inverts the provided pattern's result if it matches, so that it continues execution with the next matching handler. - **Parameters:** @@ -74,7 +81,7 @@ Inverts the provided pattern's result if it matches, so that it continues execut ``` 3. **Check for a specific tag with multiple possible values allowed:** - + ```lua local isNotUrgent = _utils.hasMatchingTagOf('priority', { 'trivial', 'unimportant' }) if isNotUrgent(message) == -1 then @@ -106,7 +113,7 @@ Inverts the provided pattern's result if it matches, so that it continues execut ``` 6. **Continue execution shortcut:** - + ```lua local isUrgent = _utils.continue(_utils.hasMatchingTag('priority', 'urgent')) if isUrgent(message) ~= 0 then @@ -117,10 +124,10 @@ Inverts the provided pattern's result if it matches, so that it continues execut ``` ## Conventions and Requirements + - This module assumes that the message objects provided to functions follow a specific structure with `Tags` and `Data` attributes. - Error handling is implemented using assertions. Ensure that your AOS environment appropriately handles or logs assertion failures. - ## License -MIT \ No newline at end of file +MIT diff --git a/process/handlers.md b/process/handlers.md index 3ce33fd0a..0c0bdd7ff 100644 --- a/process/handlers.md +++ b/process/handlers.md @@ -5,60 +5,77 @@ The Handlers library provides a flexible way to manage and execute a series of handlers based on patterns. Each handler consists of a pattern function, a handle function, and a name. This library is suitable for scenarios where different actions need to be taken based on varying input criteria. ## Module Structure + - `handlers._version`: String representing the version of the Handlers library. - `handlers.list`: Table storing the list of registered handlers. ## Functions ### `handlers.append(name, pattern, handle)` + Appends a new handler to the end of the handlers list. #### Parameters + - `pattern` (function): Function that determines if the handler should be executed. - `handle` (function): The handler function to execute. - `name` (string): A unique name for the handler. ### `handlers.prepend(name, pattern, handle)` + Prepends a new handler to the beginning of the handlers list. #### Parameters + - Same as `handlers.append`. ### `handlers.before(handleName)` + Returns an object that allows adding a new handler before a specified handler. #### Parameters + - `handleName` (string): The name of the handler before which the new handler will be added. #### Returns + - An object with an `add` method to insert the new handler. ### `handlers.after(handleName)` + Returns an object that allows adding a new handler after a specified handler. #### Parameters + - `handleName` (string): The name of the handler after which the new handler will be added. #### Returns + - An object with an `add` method to insert the new handler. ### `handlers.remove(name)` + Removes a handler from the handlers list by name. #### Parameters + - `name` (string): The name of the handler to be removed. ### `handlers.evaluate(msg, env)` + Evaluates each handler against a given message and environment. Handlers are called in the order they appear in the handlers list. #### Parameters + - `msg` (table): The message to be processed by the handlers. - `env` (table): The environment in which the handlers are executed. #### Returns + - `response` (varies): The response from the handler(s). Returns a default message if no handler matches. ## Usage Example + ```lua local handlers = require "handlers_module_path" @@ -79,6 +96,7 @@ local response = handlers.evaluate({ key = "value" }, { envKey = "envValue" }) ``` ## Notes + - Handlers are executed in the order they appear in `handlers.list`. - The pattern function should return `0` to skip the handler, `-1` to break after the handler is executed, or `1` to continue with the next handler. - The `evaluate` function can concatenate responses from multiple handlers. diff --git a/process/process.md b/process/process.md index e5756c562..105cf9abe 100644 --- a/process/process.md +++ b/process/process.md @@ -1,10 +1,13 @@ # Lua Library: Process (Version 0.1.2) ## Overview + The Process library provides an environment for managing and executing processes on the AO network. It includes capabilities for handling messages, spawning processes, and customizing the environment with programmable logic and handlers. ## Dependencies + This module requires several external libraries: + - `JSON`: For handling JSON data. - `pretty`: For pretty-printing tables. - `base64`: For encoding and decoding base64 strings. @@ -12,47 +15,60 @@ This module requires several external libraries: - `handlers`: For managing and executing custom handler functions. ## Module Structure + - `process._version`: String representing the version of the Process library. - `manpages`: A table storing manual pages for different functions or modules. ## Functions ### `prompt()` + Returns a custom command prompt string. #### Returns + - `string`: The command prompt. ### `initializeState(msg, env)` + Initializes or updates the state of the process based on the incoming message and environment. #### Parameters + - `msg` (table): The incoming message. - `env` (table): The environment in which the process is operating. ### `version()` + Prints the version of the Process library. ### `man(page)` + Returns the manual page for a given topic. #### Parameters + - `page` (string, optional): The name of the manual page. #### Returns + - `string`: The content of the manual page. ### `process.handle(msg, env)` + Main handler for processing incoming messages. It initializes the state, processes commands, and handles message evaluation and inbox management. #### Parameters + - `msg` (table): The message to be handled. - `env` (table): The environment of the process. #### Returns + - Varies: The response based on the processed message. ## Usage Example + ```lua local process = require "process_module_path" @@ -65,6 +81,7 @@ local response = process.handle(msg, env) ``` ## Notes + - The `process.handle` function is the core of this module, determining how messages are processed, including evaluating expressions, managing manual pages, and calling custom handlers. - This module is designed to be used within the AO network environment, leveraging the AO and Handlers libraries for communication and process management. - Manual pages (`manpages`) provide documentation and guidance for users of the aos system. diff --git a/process/repl.js b/process/repl.js index a8d6a5e1f..8a2f97769 100644 --- a/process/repl.js +++ b/process/repl.js @@ -1,4 +1,4 @@ -const readline = require("readline"); +const readline = require('readline') const AoLoader = require('@permaweb/ao-loader') const fs = require('fs') const wasm = fs.readFileSync('./process.wasm') @@ -6,7 +6,7 @@ const wasm = fs.readFileSync('./process.wasm') const rl = readline.createInterface({ input: process.stdin, output: process.stdout -}); +}) const env = { Process: { @@ -19,18 +19,18 @@ let prompt = 'aos' async function repl(state) { const handle = await AoLoader(wasm) - rl.question(prompt + "> ", async function (line) { + rl.question(prompt + '> ', async function (line) { // Exit the REPL if the user types "exit" - if (line === "exit") { - console.log("Exiting..."); - rl.close(); - return; + if (line === 'exit') { + console.log('Exiting...') + rl.close() + return } let response = {} // Evaluate the JavaScript code and print the result try { const message = createMessage(line) - response = handle(state, message, env); + response = handle(state, message, env) console.log(response.Output) if (response.Output.data.output) { console.log(response.Output.data.output) @@ -41,30 +41,26 @@ async function repl(state) { } // Continue the REPL - await repl(response.buffer); + await repl(response.buffer) } catch (err) { - console.log("Error:", err); + console.log('Error:', err) process.exit(0) } - - - }); + }) } - -repl(null); - +repl(null) function createMessage(expr) { return { Owner: 'TOM', Target: 'PROCESS', Tags: [ - { name: "Data-Protocol", value: "ao" }, - { name: "Variant", value: 'ao.TN.1' }, - { name: "Type", value: "message" }, - { name: "function", value: "eval" }, - { name: "expression", value: expr } + { name: 'Data-Protocol', value: 'ao' }, + { name: 'Variant', value: 'ao.TN.1' }, + { name: 'Type', value: 'message' }, + { name: 'function', value: 'eval' }, + { name: 'expression', value: expr } ] } } @@ -82,4 +78,4 @@ function createMessage(expr) { ] } - */ \ No newline at end of file + */ diff --git a/process/test/assignment.test.js b/process/test/assignment.test.js index fff7b652b..55f0b04b1 100644 --- a/process/test/assignment.test.js +++ b/process/test/assignment.test.js @@ -11,31 +11,31 @@ const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } describe('add the assignable MatchSpec', async () => { test('by name', async () => { const handle = await AoLoader(wasm, options) - + const Memory = await init(handle) const msg = { @@ -272,7 +272,10 @@ describe('determine whether the msg is an assignment or not', () => { } const result = await handle(Memory, msg, env) - assert.deepStrictEqual(JSON.parse(result.Messages[0].Data), { id: '1234xyxfoo', isAssignment: true }) + assert.deepStrictEqual(JSON.parse(result.Messages[0].Data), { + id: '1234xyxfoo', + isAssignment: true + }) }) test('is NOT an assignment', async () => { @@ -319,7 +322,10 @@ describe('determine whether the msg is an assignment or not', () => { const result = await handle(Memory, msg, env) - assert.deepStrictEqual(JSON.parse(result.Messages[0].Data), { id: '1234xyxfoo', isAssignment: false }) + assert.deepStrictEqual(JSON.parse(result.Messages[0].Data), { + id: '1234xyxfoo', + isAssignment: false + }) }) }) diff --git a/process/test/crypto/cipher/aes.test.js b/process/test/crypto/cipher/aes.test.js index daa9c3c1f..e0c65098e 100644 --- a/process/test/crypto/cipher/aes.test.js +++ b/process/test/crypto/cipher/aes.test.js @@ -1,54 +1,59 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15", computeLimit: 100247047330 } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15', computeLimit: 100247047330 } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run aes cipher successfully', async () => { - const handle = await AoLoader(wasm, options); - const start = await init(handle) - - const results = [ - // AES128 CBC Mode - "A3B9E6E1FBD9D46930E5F76807C84B8E", "616F0000000000000000000000000000", - // AES128 ECB Mode - "3FF54BD61AD1AA06BC367A10575CC7C5", "616F0000000000000000000000000000", - // AES128 CFB Mode - "1DA7169C093D6B23160B6785B28E4BED", "616F0000000000000000000000000000", - // AES128 OFB Mode - "1DA7169C093D6B23160B6785B28E4BED", "616F0000000000000000000000000000", - // AES128 CTR Mode - "1DA7169C093D6B23160B6785B28E4BED", "616F0000000000000000000000000000" - ] + const handle = await AoLoader(wasm, options) + const start = await init(handle) + + const results = [ + // AES128 CBC Mode + 'A3B9E6E1FBD9D46930E5F76807C84B8E', + '616F0000000000000000000000000000', + // AES128 ECB Mode + '3FF54BD61AD1AA06BC367A10575CC7C5', + '616F0000000000000000000000000000', + // AES128 CFB Mode + '1DA7169C093D6B23160B6785B28E4BED', + '616F0000000000000000000000000000', + // AES128 OFB Mode + '1DA7169C093D6B23160B6785B28E4BED', + '616F0000000000000000000000000000', + // AES128 CTR Mode + '1DA7169C093D6B23160B6785B28E4BED', + '616F0000000000000000000000000000' + ] - const data = ` + const data = ` local crypto = require(".crypto") local Hex = require(".crypto.util.hex") @@ -86,21 +91,21 @@ test('run aes cipher successfully', async () => { -- run(192, modes) -- run(256, modes) return table.concat(results, ", ") - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); + const result = await handle(start, msg, env) - assert.equal(result.Output?.data, results.join(', ')); - // assert.ok(result.GasUsed >= 3000000000) - assert.ok(true); -}); + assert.equal(result.Output?.data, results.join(', ')) + // assert.ok(result.GasUsed >= 3000000000) + assert.ok(true) +}) diff --git a/process/test/crypto/cipher/issac.test.js b/process/test/crypto/cipher/issac.test.js index 96d3e43a0..51d089a53 100644 --- a/process/test/crypto/cipher/issac.test.js +++ b/process/test/crypto/cipher/issac.test.js @@ -1,44 +1,43 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run issac cipher successfully', async () => { - const handle = await AoLoader(wasm, options); - const start = await init(handle) - + const handle = await AoLoader(wasm, options) + const start = await init(handle) - const results = ["7851", "ao"] + const results = ['7851', 'ao'] - const data = ` + const data = ` local crypto = require(".crypto"); local results = {}; @@ -55,19 +54,19 @@ test('run issac cipher successfully', async () => { results[2] = decrypted; return table.concat(results, ", "); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results.join(', ')); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results.join(', ')) + assert.ok(true) +}) diff --git a/process/test/crypto/cipher/morus.test.js b/process/test/crypto/cipher/morus.test.js index 1a7f19888..9f1507a76 100644 --- a/process/test/crypto/cipher/morus.test.js +++ b/process/test/crypto/cipher/morus.test.js @@ -1,44 +1,47 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); +const wasm = fs.readFileSync('./process.wasm') const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } test('run morus cipher successfully', async () => { - const handle = await AoLoader(wasm, options); - const start = await init(handle) - - - const results = ['514ed31473d8fb0b76c6cbb17af35ed01d0a', 'ao', '6164646974696f6e616c20646174616aae7a8b95c50047bea251c3b7133eec5fcc', 'ao'] + const handle = await AoLoader(wasm, options) + const start = await init(handle) + const results = [ + '514ed31473d8fb0b76c6cbb17af35ed01d0a', + 'ao', + '6164646974696f6e616c20646174616aae7a8b95c50047bea251c3b7133eec5fcc', + 'ao' + ] - const data = ` + const data = ` local crypto = require(".crypto"); local results = {}; @@ -68,19 +71,19 @@ test('run morus cipher successfully', async () => { results[4] = crypto.cipher.morus.decrypt(k, iv, e.asString(), #ad); return table.concat(results, ", "); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results.join(', ')); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results.join(', ')) + assert.ok(true) +}) diff --git a/process/test/crypto/cipher/norx.test.js b/process/test/crypto/cipher/norx.test.js index f669280a3..df35e49ce 100644 --- a/process/test/crypto/cipher/norx.test.js +++ b/process/test/crypto/cipher/norx.test.js @@ -1,51 +1,50 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); +const wasm = fs.readFileSync('./process.wasm') const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } test('run norx cipher successfully', async () => { - const handle = await AoLoader(wasm, options); - const start = await init(handle) - + const handle = await AoLoader(wasm, options) + const start = await init(handle) - const results = [ - // encrypted cipher - "0bb35a06938e6541eccd4440adb7b46118535f60b09b4adf378807a53df19fc4ea28", - // auth tag - "5a06938e6541eccd4440adb7b46118535f60b09b4adf378807a53df19fc4ea28", - // decrypted value - "ao" - ] + const results = [ + // encrypted cipher + '0bb35a06938e6541eccd4440adb7b46118535f60b09b4adf378807a53df19fc4ea28', + // auth tag + '5a06938e6541eccd4440adb7b46118535f60b09b4adf378807a53df19fc4ea28', + // decrypted value + 'ao' + ] - const data = ` + const data = ` local crypto = require(".crypto"); local Hex = require(".crypto.util.hex") @@ -71,19 +70,19 @@ test('run norx cipher successfully', async () => { results[3] = decrypted return table.concat(results, ", ") - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results.join(', ')); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results.join(', ')) + assert.ok(true) +}) diff --git a/process/test/crypto/digest/blake2b.test.js b/process/test/crypto/digest/blake2b.test.js index 37da52303..756441b00 100644 --- a/process/test/crypto/digest/blake2b.test.js +++ b/process/test/crypto/digest/blake2b.test.js @@ -1,46 +1,46 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run sha3 hash successfully', async () => { - const results = [ - '576701fd79a126f2c414ef94adf1117c88943700f312679d018c29c378b2c807a3412b4e8d51e191c48fb5f5f54bf1bca29a714dda166797b3baf9ead862ae1d', - '7050811afc947ba7190bb3c0a7b79b4fba304a0de61d529c8a35bdcbbb5544f4', - '203c101980fdf6cf24d78879f2e3db86d73d91f7d60960b642022cd6f87408f8' - ]; + const results = [ + '576701fd79a126f2c414ef94adf1117c88943700f312679d018c29c378b2c807a3412b4e8d51e191c48fb5f5f54bf1bca29a714dda166797b3baf9ead862ae1d', + '7050811afc947ba7190bb3c0a7b79b4fba304a0de61d529c8a35bdcbbb5544f4', + '203c101980fdf6cf24d78879f2e3db86d73d91f7d60960b642022cd6f87408f8' + ] - const handle = await AoLoader(wasm, options); - const start = await init(handle) - const data = ` + const handle = await AoLoader(wasm, options) + const start = await init(handle) + const data = ` local crypto = require(".crypto"); local results = {}; @@ -51,19 +51,19 @@ test('run sha3 hash successfully', async () => { return table.concat(results, ", "); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results.join(', ')); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results.join(', ')) + assert.ok(true) +}) diff --git a/process/test/crypto/digest/md2.test.js b/process/test/crypto/digest/md2.test.js index 420bd8805..2fe290699 100644 --- a/process/test/crypto/digest/md2.test.js +++ b/process/test/crypto/digest/md2.test.js @@ -1,78 +1,75 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); +const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run md2 hash successfully', async () => { - const cases = [ - ['', '8350e5a3e24c153df2275c9f80692773'], - ['ao', '0d4e80edd07bee6c7965b21b25a9b1ea'], - ['abc', 'da853b0d3f88d99b30283a69e6ded6bb'], - ['abcdefghijklmnopqrstuvwxyz', '4e8ddff3650292ab5a4108c3aa47940b'], - [ - 'Hello World!', - '315f7c67223f01fb7cab4b95100e872e', - ], - ]; - const handle = await AoLoader(wasm, options); - const start = await init(handle) - - const testCase = async (e) => { - const data = ` + const cases = [ + ['', '8350e5a3e24c153df2275c9f80692773'], + ['ao', '0d4e80edd07bee6c7965b21b25a9b1ea'], + ['abc', 'da853b0d3f88d99b30283a69e6ded6bb'], + ['abcdefghijklmnopqrstuvwxyz', '4e8ddff3650292ab5a4108c3aa47940b'], + ['Hello World!', '315f7c67223f01fb7cab4b95100e872e'] + ] + const handle = await AoLoader(wasm, options) + const start = await init(handle) + + const testCase = async e => { + const data = ` local crypto = require(".crypto"); local str = crypto.utils.stream.fromString("${e[0]}"); return crypto.digest.md2(str).asHex(); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, e[1]); - assert.ok(true); - } - await testCase(cases[0]) - await testCase(cases[1]) - await testCase(cases[2]) - await testCase(cases[3]) - await testCase(cases[4]) + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, e[1]) + assert.ok(true) + } + await testCase(cases[0]) + await testCase(cases[1]) + await testCase(cases[2]) + await testCase(cases[3]) + await testCase(cases[4]) - assert.ok(true) -}); + assert.ok(true) +}) diff --git a/process/test/crypto/digest/md4.test.js b/process/test/crypto/digest/md4.test.js index 026079557..7cea6f4dd 100644 --- a/process/test/crypto/digest/md4.test.js +++ b/process/test/crypto/digest/md4.test.js @@ -1,77 +1,73 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); +const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run md4 hash successfully', async () => { - const cases = [ - ['', '31d6cfe0d16ae931b73c59d7e0c089c0'], - ['ao', 'e068dfe3d8cb95311b58be566db66954'], - ['abc', 'a448017aaf21d8525fc10ae87aa6729d'], - ['abcdefghijklmnopqrstuvwxyz', 'd79e1c308aa5bbcdeea8ed63df412da9'], - [ - 'Hello World!', - 'b2a5cc34fc21a764ae2fad94d56fadf6', - ], - ]; - const handle = await AoLoader(wasm, options); - const start = await init(handle) - - const testCase = async (e) => { - const data = ` + const cases = [ + ['', '31d6cfe0d16ae931b73c59d7e0c089c0'], + ['ao', 'e068dfe3d8cb95311b58be566db66954'], + ['abc', 'a448017aaf21d8525fc10ae87aa6729d'], + ['abcdefghijklmnopqrstuvwxyz', 'd79e1c308aa5bbcdeea8ed63df412da9'], + ['Hello World!', 'b2a5cc34fc21a764ae2fad94d56fadf6'] + ] + const handle = await AoLoader(wasm, options) + const start = await init(handle) + + const testCase = async e => { + const data = ` local crypto = require(".crypto"); local str = crypto.utils.stream.fromString("${e[0]}"); return crypto.digest.md4(str).asHex(); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, e[1]); - assert.ok(true); - } - await testCase(cases[0]); - await testCase(cases[1]); - await testCase(cases[2]); - await testCase(cases[3]); - await testCase(cases[4]); - -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, e[1]) + assert.ok(true) + } + await testCase(cases[0]) + await testCase(cases[1]) + await testCase(cases[2]) + await testCase(cases[3]) + await testCase(cases[4]) +}) diff --git a/process/test/crypto/digest/md5.test.js b/process/test/crypto/digest/md5.test.js index cfefe948c..8688e9325 100644 --- a/process/test/crypto/digest/md5.test.js +++ b/process/test/crypto/digest/md5.test.js @@ -1,75 +1,72 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run md5 hash successfully', async () => { - const cases = [ - ['', 'd41d8cd98f00b204e9800998ecf8427e'], - ['ao', 'adac5e63f80f8629e9573527b25891d3'], - ['abc', '900150983cd24fb0d6963f7d28e17f72'], - ['abcdefghijklmnopqrstuvwxyz', 'c3fcd3d76192e4007dfb496cca67e13b'], - [ - 'Hello World!', - 'ed076287532e86365e841e92bfc50d8c', - ], - ]; - const handle = await AoLoader(wasm, options); - const start = await init(handle) + const cases = [ + ['', 'd41d8cd98f00b204e9800998ecf8427e'], + ['ao', 'adac5e63f80f8629e9573527b25891d3'], + ['abc', '900150983cd24fb0d6963f7d28e17f72'], + ['abcdefghijklmnopqrstuvwxyz', 'c3fcd3d76192e4007dfb496cca67e13b'], + ['Hello World!', 'ed076287532e86365e841e92bfc50d8c'] + ] + const handle = await AoLoader(wasm, options) + const start = await init(handle) - const testCase = async (e) => { - const data = ` + const testCase = async e => { + const data = ` local crypto = require(".crypto"); local str = crypto.utils.stream.fromString("${e[0]}"); return crypto.digest.md5(str).asHex(); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, e[1]); - assert.ok(true); - }; - await testCase(cases[0]); - await testCase(cases[1]); - await testCase(cases[2]); - await testCase(cases[3]); - await testCase(cases[4]); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, e[1]) + assert.ok(true) + } + await testCase(cases[0]) + await testCase(cases[1]) + await testCase(cases[2]) + await testCase(cases[3]) + await testCase(cases[4]) +}) diff --git a/process/test/crypto/digest/sha1.test.js b/process/test/crypto/digest/sha1.test.js index 13176910a..398a779a2 100644 --- a/process/test/crypto/digest/sha1.test.js +++ b/process/test/crypto/digest/sha1.test.js @@ -1,76 +1,71 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run sha1 hash successfully', async () => { - const cases = [ - ['', 'da39a3ee5e6b4b0d3255bfef95601890afd80709'], - ['ao', 'c29dd6c83b67a1d6d3b28588a1f068b68689aa1d'], - ['abc', 'a9993e364706816aba3e25717850c26c9cd0d89d'], - ['abcdefghijklmnopqrstuvwxyz', '32d10c7b8cf96570ca04ce37f2a19d84240d3a89'], - [ - 'Hello World!', - '2ef7bde608ce5404e97d5f042f95f89f1c232871', - ], - ]; - const handle = await AoLoader(wasm, options); - const start = await init(handle) - + const cases = [ + ['', 'da39a3ee5e6b4b0d3255bfef95601890afd80709'], + ['ao', 'c29dd6c83b67a1d6d3b28588a1f068b68689aa1d'], + ['abc', 'a9993e364706816aba3e25717850c26c9cd0d89d'], + ['abcdefghijklmnopqrstuvwxyz', '32d10c7b8cf96570ca04ce37f2a19d84240d3a89'], + ['Hello World!', '2ef7bde608ce5404e97d5f042f95f89f1c232871'] + ] + const handle = await AoLoader(wasm, options) + const start = await init(handle) - const testCase = async (e) => { - const data = ` + const testCase = async e => { + const data = ` local crypto = require(".crypto"); local str = crypto.utils.stream.fromString("${e[0]}"); return crypto.digest.sha1(str).asHex(); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, e[1]); - assert.ok(true); - }; - await testCase(cases[0]); - await testCase(cases[1]); - await testCase(cases[2]); - await testCase(cases[3]); - await testCase(cases[4]); - -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, e[1]) + assert.ok(true) + } + await testCase(cases[0]) + await testCase(cases[1]) + await testCase(cases[2]) + await testCase(cases[3]) + await testCase(cases[4]) +}) diff --git a/process/test/crypto/digest/sha2.test.js b/process/test/crypto/digest/sha2.test.js index b28532bf5..c47180d33 100644 --- a/process/test/crypto/digest/sha2.test.js +++ b/process/test/crypto/digest/sha2.test.js @@ -1,45 +1,45 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run sha2 hash successfully', async () => { - const results = [ - 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', - '6f36a696b17ce5a71efa700e8a7e47994f3e134a5e5f387b3e7c2c912abe94f94ee823f9b9dcae59af99e2e34c8b4fb0bd592260c6720ee49e5deaac2065c4b1', - ]; - const handle = await AoLoader(wasm, options); - const start = await init(handle) - - const data = ` + const results = [ + 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', + '6f36a696b17ce5a71efa700e8a7e47994f3e134a5e5f387b3e7c2c912abe94f94ee823f9b9dcae59af99e2e34c8b4fb0bd592260c6720ee49e5deaac2065c4b1' + ] + const handle = await AoLoader(wasm, options) + const start = await init(handle) + + const data = ` local crypto = require(".crypto"); local results = {}; @@ -52,19 +52,19 @@ test('run sha2 hash successfully', async () => { results[2] = crypto.digest.sha2_512(data2).asHex(); return table.concat(results, ", "); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results.join(', ')); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results.join(', ')) + assert.ok(true) +}) diff --git a/process/test/crypto/digest/sha3.test.js b/process/test/crypto/digest/sha3.test.js index 61290b8d5..cce4d4332 100644 --- a/process/test/crypto/digest/sha3.test.js +++ b/process/test/crypto/digest/sha3.test.js @@ -1,48 +1,48 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run sha3 hash successfully', async () => { - const results = [ - '1bbe785577db997a394d5b4555eec9159cb51f235aec07514872d2d436c6e985', - '0c29f053400cb1764ce2ec555f598f497e6fcd1d304ce0125faa03bb724f63f213538f41103072ff62ddee701b52c73e621ed4d2254a3e5e9a803d83435b704d', - '76da52eec05b749b99d6e62bb52333c1569fe75284e6c82f3de12a4618be00d6', - '046fbfad009a12cef9ff00c2aac361d004347b2991c1fa80fba5582251b8e0be8def0283f45f020d4b04ff03ead9f6e7c43cc3920810c05b33b4873b99affdea' - ]; + const results = [ + '1bbe785577db997a394d5b4555eec9159cb51f235aec07514872d2d436c6e985', + '0c29f053400cb1764ce2ec555f598f497e6fcd1d304ce0125faa03bb724f63f213538f41103072ff62ddee701b52c73e621ed4d2254a3e5e9a803d83435b704d', + '76da52eec05b749b99d6e62bb52333c1569fe75284e6c82f3de12a4618be00d6', + '046fbfad009a12cef9ff00c2aac361d004347b2991c1fa80fba5582251b8e0be8def0283f45f020d4b04ff03ead9f6e7c43cc3920810c05b33b4873b99affdea' + ] - const handle = await AoLoader(wasm, options); - const start = await init(handle) + const handle = await AoLoader(wasm, options) + const start = await init(handle) - const data = ` + const data = ` local crypto = require(".crypto"); local results = {}; @@ -53,19 +53,19 @@ test('run sha3 hash successfully', async () => { results[4] = crypto.digest.keccak512("ao").asHex(); return table.concat(results,", ") - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results.join(', ')); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results.join(', ')) + assert.ok(true) +}) diff --git a/process/test/crypto/kdf/pbkdf2.test.js b/process/test/crypto/kdf/pbkdf2.test.js index c88ebdcaa..01fb2c563 100644 --- a/process/test/crypto/kdf/pbkdf2.test.js +++ b/process/test/crypto/kdf/pbkdf2.test.js @@ -1,44 +1,42 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run pbkdf2 successfully', async () => { - const results = [ - 'C4C21BF2BBF61541408EC2A49C89B9C6', - ]; - const handle = await AoLoader(wasm, options); - const start = await init(handle) - - const data = ` + const results = ['C4C21BF2BBF61541408EC2A49C89B9C6'] + const handle = await AoLoader(wasm, options) + const start = await init(handle) + + const data = ` local crypto = require(".crypto"); local results = {}; @@ -51,19 +49,19 @@ test('run pbkdf2 successfully', async () => { local out = crypto.kdf.pbkdf2(password, salt, iterations, keyLen) return out.asHex() - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results) + assert.ok(true) +}) diff --git a/process/test/crypto/mac/hmac.test.js b/process/test/crypto/mac/hmac.test.js index d5dd19ced..7275d2646 100644 --- a/process/test/crypto/mac/hmac.test.js +++ b/process/test/crypto/mac/hmac.test.js @@ -1,43 +1,46 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run hmac successfully', async () => { - const handle = await AoLoader(wasm, options); - const start = await init(handle) + const handle = await AoLoader(wasm, options) + const start = await init(handle) - const results = ["3966f45acb53f7a1a493bae15afecb1a204fa32d", "542da02a324155d688c7689669ff94c6a5f906892aa8eccd7284f210ac66e2a7"] + const results = [ + '3966f45acb53f7a1a493bae15afecb1a204fa32d', + '542da02a324155d688c7689669ff94c6a5f906892aa8eccd7284f210ac66e2a7' + ] - const data = ` + const data = ` local crypto = require(".crypto") local data = crypto.utils.stream.fromString("ao") @@ -49,19 +52,19 @@ test('run hmac successfully', async () => { results[2] = crypto.mac.createHmac(data, key, "sha256").asHex() return table.concat(results, ", ") - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, results.join(', ')); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, results.join(', ')) + assert.ok(true) +}) diff --git a/process/test/crypto/random.test.js b/process/test/crypto/random.test.js index b2db8fdf9..bf164be4e 100644 --- a/process/test/crypto/random.test.js +++ b/process/test/crypto/random.test.js @@ -1,57 +1,57 @@ -import { test } from 'node:test'; -import * as assert from 'node:assert'; -import AoLoader from '@permaweb/ao-loader'; -import fs from 'fs'; +import { test } from 'node:test' +import * as assert from 'node:assert' +import AoLoader from '@permaweb/ao-loader' +import fs from 'fs' -const wasm = fs.readFileSync('./process.wasm'); -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const wasm = fs.readFileSync('./process.wasm') +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run random generator successfully', async () => { - const handle = await AoLoader(wasm, options); - const start = await init(handle) + const handle = await AoLoader(wasm, options) + const start = await init(handle) - const data = ` + const data = ` local crypto = require(".crypto") return crypto.random(); - `; - const msg = { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: '1000', - Id: '1234xyxfoo', - Module: 'WOOPAWOOPA', - Tags: [{ name: 'Action', value: 'Eval' }], - Data: data, - }; + ` + const msg = { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: data + } - const result = await handle(start, msg, env); - assert.equal(result.Output?.data, 532713800); - assert.ok(true); -}); + const result = await handle(start, msg, env) + assert.equal(result.Output?.data, 532713800) + assert.ok(true) +}) diff --git a/process/test/eval.test.js b/process/test/eval.test.js index 98e280ea9..825ac9786 100644 --- a/process/test/eval.test.js +++ b/process/test/eval.test.js @@ -4,69 +4,65 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('run evaluate action unsuccessfully', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "AOS", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: '100 < undefined' } const result = await handle(start, msg, env) - assert.ok(result.Error.includes("attempt to compare number with nil")) + assert.ok(result.Error.includes('attempt to compare number with nil')) assert.ok(true) }) test('run evaluate action successfully', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "AOS", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: '1 + 1' } const result = await handle(start, msg, env) @@ -77,46 +73,38 @@ test('run evaluate action successfully', async () => { test('print hello world', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "AOS", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: `print("Hello World")` - } const result = await handle(start, msg, env) - assert.equal(result.Output?.data, "Hello World") + assert.equal(result.Output?.data, 'Hello World') assert.ok(true) }) - test('create an Assignment', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "AOS", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'Assign({ Processes = { "pid-1", "pid-2" }, Message = "mid-1" })' } const result = await handle(start, msg, env) - assert.deepStrictEqual(result.Assignments, [ - { Processes: ['pid-1', 'pid-2'], Message: 'mid-1' } - ]) + assert.deepStrictEqual(result.Assignments, [{ Processes: ['pid-1', 'pid-2'], Message: 'mid-1' }]) assert.ok(true) -}) \ No newline at end of file +}) diff --git a/process/test/handlers.test.js b/process/test/handlers.test.js index 82b74fc3a..7cfbf8e14 100644 --- a/process/test/handlers.test.js +++ b/process/test/handlers.test.js @@ -4,30 +4,30 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } @@ -38,12 +38,10 @@ test('handlers receive', async () => { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` local msg = ao.send({Target = ao.id, Data = "Hello"}) local res = Handlers.receive({From = msg.Target, ['X-Reference'] = msg.Ref_}) @@ -61,9 +59,12 @@ return require('json').encode(res) Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [{ - name: 'X-Reference', value: '1' - }], + Tags: [ + { + name: 'X-Reference', + value: '1' + } + ], Data: 'test receive' } const result = await handle(Memory, m, env) @@ -74,17 +75,15 @@ return require('json').encode(res) test('resolvers', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.once("onetime", { @@ -104,9 +103,7 @@ Handlers.once("onetime", Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'Action', value: 'ping' } - ], + Tags: [{ name: 'Action', value: 'ping' }], Data: 'ping' } const result = await handle(Memory, ping, env) @@ -117,17 +114,15 @@ Handlers.once("onetime", test('handlers once', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.once("onetime", Handlers.utils.hasMatchingData("ping"), @@ -159,17 +154,15 @@ Handlers.once("onetime", test('ping pong', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("ping", Handlers.utils.hasMatchingData("ping"), @@ -197,17 +190,15 @@ Handlers.add("ping", test('handler pipeline', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("one", function (Msg) @@ -247,24 +238,25 @@ Handlers.add("three", Data: 'ping' } const result = await handle(Memory, ping, env) - assert.equal(result.Output.data, 'one\ntwo\n\x1B[90mNew Message From \x1B[32mFRE...RED\x1B[90m: \x1B[90mData = \x1B[34mping\x1B[0m') + assert.equal( + result.Output.data, + 'one\ntwo\n\x1B[90mNew Message From \x1B[32mFRE...RED\x1B[90m: \x1B[90mData = \x1B[34mping\x1B[0m' + ) assert.ok(true) }) test('timestamp', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("timestamp", Handlers.utils.hasMatchingData("timestamp"), @@ -277,7 +269,7 @@ Handlers.add("timestamp", // load handler const { Memory } = await handle(start, msg, env) // --- - const currentTimestamp = Date.now(); + const currentTimestamp = Date.now() const timestamp = { Target: 'AOS', From: 'FRED', @@ -287,24 +279,22 @@ Handlers.add("timestamp", Timestamp: currentTimestamp } const result = await handle(Memory, timestamp, env) - assert.equal(result.Output.data, "\x1B[32m" + currentTimestamp + "\x1B[0m") + assert.equal(result.Output.data, '\x1B[32m' + currentTimestamp + '\x1B[0m') assert.ok(true) }) test('test pattern, fn handler', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("Balance", function (msg) @@ -316,7 +306,7 @@ Handlers.add("Balance", // load handler const { Memory } = await handle(start, msg, env) // --- - const currentTimestamp = Date.now(); + const currentTimestamp = Date.now() const balance = { Target: 'AOS', From: 'FRED', @@ -326,6 +316,6 @@ Handlers.add("Balance", Timestamp: currentTimestamp } const result = await handle(Memory, balance, env) - assert.equal(result.Messages[0].Data, "1000") + assert.equal(result.Messages[0].Data, '1000') assert.ok(true) -}) \ No newline at end of file +}) diff --git a/process/test/inbox.test.js b/process/test/inbox.test.js index 5ad4e71c6..2e308d78f 100644 --- a/process/test/inbox.test.js +++ b/process/test/inbox.test.js @@ -4,44 +4,44 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test.skip('inbox unbounded', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', Data: 'Hello', Tags: [] } @@ -51,18 +51,21 @@ test.skip('inbox unbounded', async () => { const { Memory } = await handle(memory, msg, env) memory = Memory } - const count = await handle(memory, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [{ name: 'Action', value: 'Eval' }], - Data: '#Inbox' - }, env) + const count = await handle( + memory, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], + Data: '#Inbox' + }, + env + ) //assert.equal(count.Error, 'Error') - assert.equal(count.Output?.data, "10000") + assert.equal(count.Output?.data, '10000') assert.ok(true) }) - diff --git a/process/test/magic-table.test.js b/process/test/magic-table.test.js index ccbf96848..0e6f5d7d8 100644 --- a/process/test/magic-table.test.js +++ b/process/test/magic-table.test.js @@ -4,57 +4,58 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('magictable to wrap send to convert data to json', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'Send({ Target = "AOS", Data = { foo = "bar" }})' } const result = await handle(start, msg, env) assert.equal(result.Messages[0].Data, '{"foo":"bar"}') const msg2 = Object.assign({}, msg, result.Messages[0]) const tableResult = await handle(result.Memory, msg2, env) - + const inboxResult = await handle( tableResult.Memory, - Object.assign({}, msg, { Tags: [{ name: 'Action', value: 'Eval' }], Data: 'Inbox[2].Data.foo' }), + Object.assign({}, msg, { + Tags: [{ name: 'Action', value: 'Eval' }], + Data: 'Inbox[2].Data.foo' + }), env ) console.log(inboxResult) @@ -64,17 +65,15 @@ test('magictable to wrap send to convert data to json', async () => { test('magictable to wrap swap to convert data to json', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'Spawn("AWESOME_SAUCE", { Target = "TEST", Data = { foo = "bar" }})' } const result = await handle(start, msg, env) diff --git a/process/test/normalized-message.test.js b/process/test/normalized-message.test.js index 7fe3e6fba..c36337a9b 100644 --- a/process/test/normalized-message.test.js +++ b/process/test/normalized-message.test.js @@ -4,48 +4,46 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('message normalization - to title case', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Create an evaluation message that will inspect an incoming message const evalMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("inspect-normalized", function (msg) @@ -66,10 +64,10 @@ Handlers.add("inspect-normalized", ) ` } - + // Load the handler const { Memory } = await handle(start, evalMsg, env) - + // Test message with lowercase keys const testMsg = { Target: 'AOS', @@ -83,14 +81,12 @@ Handlers.add("inspect-normalized", ], Data: 'Test normalized message' } - + const { Output } = await handle(Memory, testMsg, env) - - + // Check if output contains the normalized values assert.ok(Output.data.includes('Type: test-event')) assert.ok(Output.data.includes('Data-Protocol: https://example.com/protocol')) assert.ok(Output.data.includes('Message: Hello, world!')) assert.ok(Output.data.includes('Action: test-action')) - -}) \ No newline at end of file +}) diff --git a/process/test/print.test.js b/process/test/print.test.js index f02d85ce1..a9d89741a 100644 --- a/process/test/print.test.js +++ b/process/test/print.test.js @@ -4,47 +4,45 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('multi print feature', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` print("one") print("two") @@ -63,18 +61,16 @@ test('multi print feature via handler', async () => { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'Handlers.add("ping", Handlers.utils.hasMatchingData("ping"), function (m) print(m.Data); print("pong") end)' } const { Memory } = await handle(start, msg, env) let msg2 = msg msg2.Tags = [] - msg2.Data = "ping" + msg2.Data = 'ping' const result = await handle(Memory, msg2, env) assert.equal(result.Output.data, 'ping\npong') assert.ok(true) @@ -83,24 +79,22 @@ test('multi print feature via handler', async () => { test('Typos for functions should generate errors', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'Handers.add("ping", Handlers.utils.hasMatchingData("ping"), function (m) print(m.Data); print("pong") end)' } const { Memory, Output, Error } = await handle(start, msg, env) let msg2 = msg msg2.Tags = [{ name: 'Action', value: 'Eval' }] - msg2.Data = "Errors" + msg2.Data = 'Errors' const result = await handle(Memory, msg2, env) assert.ok(result.Output.data.includes("attempt to index a nil value (global \'Handers\')")) }) @@ -108,24 +102,22 @@ test('Typos for functions should generate errors', async () => { test('Print Errors in Handlers', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'Handlers.add("ping", Handlers.utils.hasMatchingData("ping"), function (m) print(m.Data); print("pong" .. x) end)' } const { Memory, Output, Error } = await handle(null, msg, env) let msg2 = msg msg2.Tags = [] - msg2.Data = "ping" + msg2.Data = 'ping' const result = await handle(Memory, msg2, env) assert.ok(result.Error.includes('handling message')) diff --git a/process/test/random.test.js b/process/test/random.test.js index 22bd82e30..220123491 100644 --- a/process/test/random.test.js +++ b/process/test/random.test.js @@ -4,50 +4,48 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('generate random number', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'math.random(10)' } const result = await handle(start, msg, env) assert.equal(result.Output?.data, '2') assert.ok(true) -}) \ No newline at end of file +}) diff --git a/process/test/state.test.js b/process/test/state.test.js index 22df298fc..669b63081 100644 --- a/process/test/state.test.js +++ b/process/test/state.test.js @@ -4,30 +4,30 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } @@ -43,36 +43,38 @@ const envWithAuthorities = { } async function initWithAuthorities(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' }, - { name: 'Authority', value: 'FOO,BAR,FOOBAR,UNIQUE-ADDRESS' } - ] - }, envWithAuthorities) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [ + { name: 'Name', value: 'Thomas' }, + { name: 'Authority', value: 'FOO,BAR,FOOBAR,UNIQUE-ADDRESS' } + ] + }, + envWithAuthorities + ) return Memory } test('check state properties for aos', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', From: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'print("name: " .. Name .. ", owner: " .. Owner)' } const result = await handle(start, msg, env) @@ -84,17 +86,15 @@ test('check state properties for aos', async () => { test('test authorities', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', Owner: 'BEEP', From: 'BAM', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: '1 + 1' } const result = await handle(start, msg, env) @@ -104,18 +104,16 @@ test('test authorities', async () => { test('test multiple process tag authorities', async () => { const handle = await AoLoader(wasm, options) const start = await initWithAuthorities(handle) - + // Should be trusted (FOOBAR is in the authority list) const msg0 = { Target: 'AOS', Owner: 'FOOBAR', From: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo1", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo1', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: 'ao.authorities' } const result0 = await handle(start, msg0, envWithAuthorities) @@ -123,18 +121,16 @@ test('test multiple process tag authorities', async () => { assert.ok(result0.Output.data.includes('BAR')) assert.ok(result0.Output.data.includes('FOOBAR')) assert.ok(result0.Output.data.includes('UNIQUE-ADDRESS')) - + // Should be trusted (FOOBAR is in the authority list) - const msg1 = { + const msg1 = { Target: 'AOS', Owner: 'FOOBAR', From: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo1", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo1', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: '#ao.authorities' } const result1 = await handle(start, msg1, envWithAuthorities) @@ -144,65 +140,56 @@ test('test multiple process tag authorities', async () => { Target: 'AOS', Owner: 'FOO', From: 'FOO', - ['Block-Height']: "1000", - Id: "1234xyxfoo2", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Testing' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo2', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Testing' }], Data: 'Hello world!' } const result2 = await handle(start, msg2, envWithAuthorities) - assert.ok(result2.Output.data.includes("New Message From")) + assert.ok(result2.Output.data.includes('New Message From')) // Should reject (BAM1, BAM2 are not in the authority list) const msg3 = { Target: 'AOS', Owner: 'BAM1', From: 'BAM2', - ['Block-Height']: "1000", - Id: "1234xyxfoo3", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Testing' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo3', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Testing' }], Data: 'Hello world!' } const result3 = await handle(start, msg3, envWithAuthorities) - assert.ok(result3.Output.data.includes("Message is not trusted! From: BAM2 - Owner: BAM1")) + assert.ok(result3.Output.data.includes('Message is not trusted! From: BAM2 - Owner: BAM1')) // Should accept (FOO, UNIQUE-ADDRESS are in the authority list) const msg4 = { Target: 'AOS', Owner: 'FOO', From: 'UNIQUE-ADDRESS', - ['Block-Height']: "1000", - Id: "1234xyxfoo4", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Testing' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo4', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Testing' }], Data: 'Hello world!' } const result4 = await handle(start, msg4, envWithAuthorities) - assert.ok(result4.Output.data.includes("New Message From")) + assert.ok(result4.Output.data.includes('New Message From')) }) - test('test utils', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + const msg = { Target: 'AOS', Owner: 'FOOBAR', From: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` return require('.utils').capitalize("foo-bar") ` diff --git a/process/test/utils-matches-pattern.test.js b/process/test/utils-matches-pattern.test.js index 534d1759a..a9a3d3668 100644 --- a/process/test/utils-matches-pattern.test.js +++ b/process/test/utils-matches-pattern.test.js @@ -4,48 +4,46 @@ import AoLoader from '@permaweb/ao-loader' import fs from 'fs' const wasm = fs.readFileSync('./process.wasm') -const options = { format: "wasm64-unknown-emscripten-draft_2024_02_15" } +const options = { format: 'wasm64-unknown-emscripten-draft_2024_02_15' } const env = { Process: { Id: 'AOS', Owner: 'FOOBAR', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] + Tags: [{ name: 'Name', value: 'Thomas' }] } } async function init(handle) { - const {Memory} = await handle(null, { - Target: 'AOS', - From: 'FOOBAR', - Owner: 'FOOBAR', - 'Block-Height': '999', - Id: 'AOS', - Module: 'WOOPAWOOPA', - Tags: [ - { name: 'Name', value: 'Thomas' } - ] - }, env) + const { Memory } = await handle( + null, + { + Target: 'AOS', + From: 'FOOBAR', + Owner: 'FOOBAR', + 'Block-Height': '999', + Id: 'AOS', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Name', value: 'Thomas' }] + }, + env + ) return Memory } test('case-insensitive action matching', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that matches Action = "test-action" const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("test-action-handler", { Action = "test-action" }, @@ -55,20 +53,18 @@ Handlers.add("test-action-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test message with lowercase action const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'action', value: 'test-action' } - ], + Tags: [{ name: 'action', value: 'test-action' }], Data: 'test message' } - + const result = await handle(Memory, testMsg, env) assert.ok(result.Output.data.includes('Handler matched: Action = test-action')) }) @@ -76,18 +72,16 @@ Handlers.add("test-action-handler", test('case-insensitive data-protocol matching', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that matches Data-Protocol = "test-protocol" const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("test-protocol-handler", { ["Data-Protocol"] = "test-protocol" }, @@ -97,20 +91,18 @@ Handlers.add("test-protocol-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test message with different case protocol const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'data-protocol', value: 'test-protocol' } - ], + Tags: [{ name: 'data-protocol', value: 'test-protocol' }], Data: 'test message' } - + const result = await handle(Memory, testMsg, env) assert.ok(result.Output.data.includes('Handler matched: Data-Protocol = test-protocol')) }) @@ -118,18 +110,16 @@ Handlers.add("test-protocol-handler", test('case-insensitive content-type matching', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that matches Content-Type = "application/json" const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("test-content-type-handler", { ["Content-Type"] = "application/json" }, @@ -139,20 +129,18 @@ Handlers.add("test-content-type-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test message with different case content-type const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'content-type', value: 'application/json' } - ], + Tags: [{ name: 'content-type', value: 'application/json' }], Data: '{"test": "data"}' } - + const result = await handle(Memory, testMsg, env) assert.ok(result.Output.data.includes('Handler matched: Content-Type = application/json')) }) @@ -160,18 +148,16 @@ Handlers.add("test-content-type-handler", test('comprehensive case variations - ACTION, action, Action', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that matches Action = "test-action" const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("case-variation-handler", { Action = "test-action" }, @@ -181,62 +167,54 @@ Handlers.add("case-variation-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test 1: lowercase "action" const testMsg1 = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'action', value: 'test-action' } - ], + Tags: [{ name: 'action', value: 'test-action' }], Data: 'test message 1' } - + const result1 = await handle(Memory, testMsg1, env) assert.ok(result1.Output.data.includes('Handler matched with Action: test-action')) - + // Test 2: uppercase "ACTION" const testMsg2 = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'ACTION', value: 'test-action' } - ], + Tags: [{ name: 'ACTION', value: 'test-action' }], Data: 'test message 2' } - + const result2 = await handle(result1.Memory, testMsg2, env) assert.ok(result2.Output.data.includes('Handler matched with Action: test-action')) - + // Test 3: title case "Action" (should also work) const testMsg3 = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'Action', value: 'test-action' } - ], + Tags: [{ name: 'Action', value: 'test-action' }], Data: 'test message 3' } - + const result3 = await handle(result2.Memory, testMsg3, env) assert.ok(result3.Output.data.includes('Handler matched with Action: test-action')) - + // Test 4: mixed case "AcTiOn" const testMsg4 = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'AcTiOn', value: 'test-action' } - ], + Tags: [{ name: 'AcTiOn', value: 'test-action' }], Data: 'test message 4' } - + const result4 = await handle(result3.Memory, testMsg4, env) assert.ok(result4.Output.data.includes('Handler matched with Action: test-action')) }) @@ -244,18 +222,16 @@ Handlers.add("case-variation-handler", test('comprehensive protocol case variations', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that matches Data-Protocol const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("protocol-case-handler", { ["Data-Protocol"] = "test-protocol" }, @@ -265,37 +241,37 @@ Handlers.add("protocol-case-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test various case patterns for Data-Protocol (including underscores) const testCases = [ 'data-protocol', - 'DATA-PROTOCOL', + 'DATA-PROTOCOL', 'Data-Protocol', - 'data_protocol', // underscore should convert to dash - 'DATA_PROTOCOL', // underscore should convert to dash - 'Data_Protocol', // underscore should convert to dash - 'data_PROTOCOL', // mixed case with underscore - 'DATA-protocol' // mixed case with dash + 'data_protocol', // underscore should convert to dash + 'DATA_PROTOCOL', // underscore should convert to dash + 'Data_Protocol', // underscore should convert to dash + 'data_PROTOCOL', // mixed case with underscore + 'DATA-protocol' // mixed case with dash ] - + let currentMemory = Memory - + for (let i = 0; i < testCases.length; i++) { const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: testCases[i], value: 'test-protocol' } - ], + Tags: [{ name: testCases[i], value: 'test-protocol' }], Data: `test message ${i + 1}` } - + const result = await handle(currentMemory, testMsg, env) - assert.ok(result.Output.data.includes('Protocol handler matched: test-protocol'), - `Failed for case variation: ${testCases[i]}`) + assert.ok( + result.Output.data.includes('Protocol handler matched: test-protocol'), + `Failed for case variation: ${testCases[i]}` + ) currentMemory = result.Memory } }) @@ -303,18 +279,16 @@ Handlers.add("protocol-case-handler", test('multiple case-insensitive keys in single handler', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that matches multiple keys with different cases const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("multi-key-handler", { @@ -329,9 +303,9 @@ Handlers.add("multi-key-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Send message with various case patterns (simulating legacy vs mainnet differences) const migrationMsg = { Target: 'AOS', @@ -343,9 +317,9 @@ Handlers.add("multi-key-handler", ], Data: '{"migration": "test"}' } - + const result = await handle(Memory, migrationMsg, env) - + // Verify the handler was triggered and normalization worked assert.ok(result.Output.data.includes('Migration handler triggered!')) assert.ok(result.Output.data.includes('Action: migrate')) @@ -355,18 +329,16 @@ Handlers.add("multi-key-handler", test('backward compatibility - exact key matches still work', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler with exact case matching const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("exact-match-handler", { Action = "test-action" }, @@ -376,20 +348,18 @@ Handlers.add("exact-match-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test message with exact case match const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'Action', value: 'test-action' } - ], + Tags: [{ name: 'Action', value: 'test-action' }], Data: 'test message' } - + const result = await handle(Memory, testMsg, env) assert.ok(result.Output.data.includes('Exact match handler triggered: test-action')) }) @@ -397,18 +367,16 @@ Handlers.add("exact-match-handler", test('mixed case keys with underscores and dashes', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that matches normalized keys const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("mixed-case-handler", { @@ -421,22 +389,20 @@ Handlers.add("mixed-case-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test message with various case patterns const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'x-reference', value: 'test-ref' } - ], + Tags: [{ name: 'x-reference', value: 'test-ref' }], Data: 'test message' } - + const result = await handle(Memory, testMsg, env) - + assert.ok(result.Output.data.includes('Mixed case handler triggered!')) assert.ok(result.Output.data.includes('X-Reference: test-ref')) }) @@ -444,18 +410,16 @@ Handlers.add("mixed-case-handler", test('handler should not match when values differ', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that should NOT match const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("no-match-handler", { Action = "expected-action" }, @@ -465,20 +429,18 @@ Handlers.add("no-match-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test message with different action value const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: 'action', value: 'different-action' } - ], + Tags: [{ name: 'action', value: 'different-action' }], Data: 'test message' } - + const result = await handle(Memory, testMsg, env) // Should show default inbox message, not our handler assert.ok(result.Output.data.includes('New Message From')) @@ -488,18 +450,16 @@ Handlers.add("no-match-handler", test('underscore to dash conversion', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that expects dashes const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("underscore-dash-handler", { @@ -516,9 +476,9 @@ Handlers.add("underscore-dash-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test message with underscores that should be converted to dashes const testMsg = { Target: 'AOS', @@ -529,11 +489,11 @@ Handlers.add("underscore-dash-handler", { name: 'content_type', value: 'application/json' }, { name: 'reply_to', value: 'test-reply' } ], - Data: '{"test": "message"}' // Proper JSON since Content-Type is application/json + Data: '{"test": "message"}' // Proper JSON since Content-Type is application/json } - + const result = await handle(Memory, testMsg, env) - + // Verify the handler was triggered (underscores converted to dashes) assert.ok(result.Output.data.includes('Underscore conversion handler triggered!')) assert.ok(result.Output.data.includes('Data-Protocol: test-protocol')) @@ -544,18 +504,16 @@ Handlers.add("underscore-dash-handler", test('mixed underscores and dashes normalization', async () => { const handle = await AoLoader(wasm, options) const start = await init(handle) - + // Setup handler that expects consistent dash format const setupMsg = { Target: 'AOS', From: 'FOOBAR', Owner: 'FOOBAR', - ['Block-Height']: "1000", - Id: "1234xyxfoo", - Module: "WOOPAWOOPA", - Tags: [ - { name: 'Action', value: 'Eval' } - ], + ['Block-Height']: '1000', + Id: '1234xyxfoo', + Module: 'WOOPAWOOPA', + Tags: [{ name: 'Action', value: 'Eval' }], Data: ` Handlers.add("mixed-format-handler", { @@ -568,37 +526,39 @@ Handlers.add("mixed-format-handler", ) ` } - + const { Memory } = await handle(start, setupMsg, env) - + // Test various combinations of underscores and dashes const testCases = [ 'x_custom_header', - 'X_CUSTOM_HEADER', + 'X_CUSTOM_HEADER', 'x-custom-header', 'X-CUSTOM-HEADER', 'x_custom-header', 'X-custom_HEADER' ] - + let currentMemory = Memory - + for (let i = 0; i < testCases.length; i++) { const testMsg = { Target: 'AOS', From: 'FRED', Owner: 'FRED', - Tags: [ - { name: testCases[i], value: 'test-value' } - ], + Tags: [{ name: testCases[i], value: 'test-value' }], Data: `test message ${i + 1}` } - + const result = await handle(currentMemory, testMsg, env) - assert.ok(result.Output.data.includes('Mixed format handler triggered!'), - `Failed for case variation: ${testCases[i]}`) - assert.ok(result.Output.data.includes('X-Custom-Header: test-value'), - `Failed to normalize value for: ${testCases[i]}`) + assert.ok( + result.Output.data.includes('Mixed format handler triggered!'), + `Failed for case variation: ${testCases[i]}` + ) + assert.ok( + result.Output.data.includes('X-Custom-Header: test-value'), + `Failed to normalize value for: ${testCases[i]}` + ) currentMemory = result.Memory } -}) \ No newline at end of file +}) diff --git a/process/utils.md b/process/utils.md index a4f07b532..565c42770 100644 --- a/process/utils.md +++ b/process/utils.md @@ -1,11 +1,13 @@ # Lua Utils Module Documentation ## Module Overview + The Lua Utils module provides a collection of utility functions for functional programming in Lua. It includes functions for array manipulation such as concatenation, mapping, reduction, filtering, and finding elements, as well as a property equality checker. ## Module Functions ### 1. `concat` + Concatenates two arrays. - **Syntax:** `utils.concat(a)(b)` @@ -16,6 +18,7 @@ Concatenates two arrays. - **Example:** `utils.concat({1, 2})({3, 4}) -- returns {1, 2, 3, 4}` ### 2. `map` + Applies a function to each element of an array. - **Syntax:** `utils.map(fn)(t)` @@ -26,6 +29,7 @@ Applies a function to each element of an array. - **Example:** `utils.map(function(x) return x * 2 end)({1, 2, 3}) -- returns {2, 4, 6}` ### 3. `reduce` + Reduces an array to a single value by iteratively applying a function. - **Syntax:** `utils.reduce(fn)(initial)(t)` @@ -37,6 +41,7 @@ Reduces an array to a single value by iteratively applying a function. - **Example:** `utils.reduce(function(acc, x) return acc + x end)(0)({1, 2, 3}) -- returns 6` ### 4. `filter` + Filters an array based on a predicate function. - **Syntax:** `utils.filter(fn)(t)` @@ -47,6 +52,7 @@ Filters an array based on a predicate function. - **Example:** `utils.filter(function(x) return x > 1 end)({1, 2, 3}) -- returns {2, 3}` ### 5. `find` + Finds the first element in an array that satisfies a predicate function. - **Syntax:** `utils.find(fn)(t)` @@ -57,6 +63,7 @@ Finds the first element in an array that satisfies a predicate function. - **Example:** `utils.find(function(x) return x > 1 end)({1, 2, 3}) -- returns 2` ### 6. `propEq` + Checks if a specified property of an object equals a given value. - **Syntax:** `utils.propEq(propName)(value)(object)` @@ -68,13 +75,15 @@ Checks if a specified property of an object equals a given value. - **Example:** `utils.propEq("name")("Lua")({name = "Lua"}) -- returns true` ## Version + - The module is currently at version 0.0.1. ## Notes + - This module is designed for functional programming style in Lua. - It's important to ensure that inputs to these functions are of correct types as expected by each function. - The module does not modify the original arrays but returns new arrays or values. --- -This documentation provides a basic overview and examples for each function in the Utils module. Users should adapt the examples to their specific use cases. \ No newline at end of file +This documentation provides a basic overview and examples for each function in the Utils module. Users should adapt the examples to their specific use cases. diff --git a/src/commands/blueprints.js b/src/commands/blueprints.js index 354e232ef..bb15846d8 100644 --- a/src/commands/blueprints.js +++ b/src/commands/blueprints.js @@ -1,19 +1,18 @@ import fs from 'fs' import path from 'path' -import * as url from 'url'; -import chalk from 'chalk' +import * as url from 'url' +import { chalk } from '../utils/colors.js' - -const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) export function loadBlueprint(line) { let name = line.split(' ')[1] const luaFile = __dirname + '../../blueprints/' + name + '.lua' if (fs.existsSync(path.resolve(luaFile))) { const code = fs.readFileSync(luaFile, 'utf-8') - console.log(chalk.green('Loading... ', name)); + console.log(chalk.green('Loading... ', name)) return code } else { throw Error(chalk.red('ERROR: .load-blueprint function requires a valid blueprint')) } -} \ No newline at end of file +} diff --git a/src/commands/editor.js b/src/commands/editor.js index 70eac017a..5da574db3 100644 --- a/src/commands/editor.js +++ b/src/commands/editor.js @@ -1,16 +1,12 @@ let editorMode = false -let editorData = "" -let editorPrompt = "" +let editorData = '' +let editorPrompt = '' export function editor(line) { editorMode = true return editorMode } -export function done() { +export function done() {} -} - -export function cancel() { - -} \ No newline at end of file +export function cancel() {} diff --git a/src/commands/load.js b/src/commands/load.js index 60e0d5e25..0d261559a 100644 --- a/src/commands/load.js +++ b/src/commands/load.js @@ -1,24 +1,21 @@ import createFileTree from 'pretty-file-tree' -import { - createExecutableFromProject, - createProjectStructure -} from '../services/loading-files.js' -import chalk from 'chalk' +import { createExecutableFromProject, createProjectStructure } from '../services/loading-files.js' +import { chalk } from '../utils/colors.js' import path from 'path' import ora from 'ora' import fs from 'fs' export function load(line) { - // get filename - let fn = (line.split(' ')[1] || "").replace(/^("|')|("|')$/g, '') + // Get filename + let fn = (line.split(' ')[1] || '').replace(/^("|')|("|')$/g, '') if (/\.lua$/.test(fn)) { - let filePath = fn; + let filePath = fn if (!path.isAbsolute(filePath)) { filePath = path.resolve(path.join(process.cwd(), fn)) } if (!fs.existsSync(filePath)) { - throw Error(chalk.red('ERROR (200): file not found.')); + throw Error(chalk.red('ERROR (200): file not found.')) } console.log(chalk.green('Loading... ', fn)) @@ -38,17 +35,19 @@ export function load(line) { if (projectStructure.length > 0) { console.log(chalk.yellow('\nThe following files will be deployed:')) - console.log(chalk.dim(createFileTree(projectStructure.map((mod) => { - if (mod.path === filePath) { - mod.path += ' ' + chalk.reset(chalk.bgGreen(' MAIN ')) - } - - return mod.path - })))) + console.log( + createFileTree( + projectStructure.map(mod => { + return mod.path === filePath + ? `${mod.path} MAIN` + : mod.path + }) + ) + ) } return [line, modules] } else { throw Error(chalk.red('ERROR: .load function requires a *.lua file')) } -} \ No newline at end of file +} diff --git a/src/commands/monitor.js b/src/commands/monitor.js index 9154adff4..85cd3e20b 100644 --- a/src/commands/monitor.js +++ b/src/commands/monitor.js @@ -1,11 +1,12 @@ -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' export function monitor(jwk, id, services) { - return services.monitorProcess({ id, wallet: jwk }) - .map(x => (console.log("Request: ", chalk.blue(x)), x)) + return services + .monitorProcess({ id, wallet: jwk }) + .map(x => (console.log('Request: ', chalk.blue(x)), x)) .bimap( - _ => chalk.red("Could not start cron monitoring process."), - _ => chalk.green("Successfully started cron monitoring process.") + _ => chalk.red('Could not start cron monitoring process.'), + _ => chalk.green('Successfully started cron monitoring process.') ) .toPromise() -} \ No newline at end of file +} diff --git a/src/commands/os.js b/src/commands/os.js index 792a41614..2d191c8cb 100644 --- a/src/commands/os.js +++ b/src/commands/os.js @@ -1,35 +1,43 @@ /** * os update - * - * this command will load all of the latest aos process modules into memory on an existing - * process. This should allow us to have a better devX experience when building the os, + * + * this command will load all of the latest aos process modules into memory on an existing + * process. This should allow us to have a better devX experience when building the os, * as well as make it easier for users to update their processes. */ import fs from 'node:fs' import path from 'node:path' import os from 'node:os' import * as url from 'url' -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' - -let __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +let __dirname = url.fileURLToPath(new URL('.', import.meta.url)) if (os.platform() === 'win32') { - __dirname = __dirname.replace(/\\/g, "/").replace(/^[A-Za-z]:\//, "/") + __dirname = __dirname.replace(/\\/g, '/').replace(/^[A-Za-z]:\//, '/') } export function dry() { console.log('not implemented') - return "" - + return '' } export function update() { - // let luaFiles = fs.readdirSync(__dirname + "../../process") + // Let luaFiles = fs.readdirSync(__dirname + "../../process") // .filter(n => /\.lua$/.test(n)) - let luaFiles = ['stringify.lua', 'ao.lua', 'utils.lua', 'assignment.lua', 'handlers-utils.lua', 'handlers.lua', 'eval.lua', 'boot.lua', 'process.lua'] + let luaFiles = [ + 'stringify.lua', + 'ao.lua', + 'utils.lua', + 'assignment.lua', + 'handlers-utils.lua', + 'handlers.lua', + 'eval.lua', + 'boot.lua', + 'process.lua' + ] .map(name => { - const code = fs.readFileSync(__dirname + "../../process/" + name, 'utf-8') - const mod = name.replace(/\.lua$/, "") + const code = fs.readFileSync(__dirname + '../../process/' + name, 'utf-8') + const mod = name.replace(/\.lua$/, '') return template(mod, code) }) .concat(patch()) @@ -37,7 +45,8 @@ export function update() { .concat("print([[\nUpdated AOS to version ]] .. require('.process')._version)") .join('\n\n') - luaFiles = ` + luaFiles = + ` if not Utils.includes('.crypto.init', Utils.keys(_G.package.loaded)) then -- if crypto.init is not installed then return a noop @@ -50,13 +59,13 @@ Please run [.update] again ]] end - ` - + luaFiles - + ` + luaFiles luaFiles = luaFiles + '\n' - luaFiles = luaFiles + ` + luaFiles = + luaFiles + + ` -- set ao alias if ao does not exist if not _G.package.loaded['ao'] then _G.package.loaded['ao'] = _G.package.loaded['.ao'] @@ -68,17 +77,15 @@ end function template(mod, code) { return ` -local function load_${mod.replace("-", "_")}() +local function load_${mod.replace('-', '_')}() ${code} end -_G.package.loaded[".${mod}"] = load_${mod.replace("-", "_")}() +_G.package.loaded[".${mod}"] = load_${mod.replace('-', '_')}() -- print("loaded ${mod}") ` } -function patch3() { - -} +function patch3() {} function patch2() { return ` @@ -113,4 +120,4 @@ function patch() { end -- print("Added Patch Handler") ` -} \ No newline at end of file +} diff --git a/src/commands/pad.js b/src/commands/pad.js index bdbd30376..bd7e6d17b 100644 --- a/src/commands/pad.js +++ b/src/commands/pad.js @@ -5,40 +5,38 @@ import fs from 'node:fs' import crypto from 'node:crypto' export function pad(pid, callback) { - const tempFilePath = path.join(os.homedir(), `.pad-${pid}.lua`); + const tempFilePath = path.join(os.homedir(), `.pad-${pid}.lua`) let hash = null try { hash = getFileHash(tempFilePath) } catch (e) { - hash = "" + hash = '' } - const editor = process.env.EDITOR || (process.platform === 'win32' ? 'notepad' : 'vi'); + const editor = process.env.EDITOR || (process.platform === 'win32' ? 'notepad' : 'vi') const child = spawn(editor, [tempFilePath], { stdio: 'inherit', // This ensures the editor uses the same terminal - shell: true, // For Windows compatibility - }); + shell: true // For Windows compatibility + }) - child.on('exit', (exitCode) => { + child.on('exit', exitCode => { //console.log('Exit Code: ', exitCode) if (exitCode == 0) { - const editedContent = fs.readFileSync(tempFilePath, 'utf8'); + const editedContent = fs.readFileSync(tempFilePath, 'utf8') if (getFileHash(tempFilePath) !== hash) { - callback(null, editedContent); + callback(null, editedContent) } else { callback(new Error('no changes')) } } else { callback(new Error('exited')) } - }); + }) } - function getFileHash(filePath) { - const fileBuffer = fs.readFileSync(filePath); - const hashSum = crypto.createHash('sha256'); - hashSum.update(fileBuffer); - return hashSum.digest('hex'); + const fileBuffer = fs.readFileSync(filePath) + const hashSum = crypto.createHash('sha256') + hashSum.update(fileBuffer) + return hashSum.digest('hex') } - diff --git a/src/commands/patch.js b/src/commands/patch.js index b593e4e61..d73c9e6ec 100644 --- a/src/commands/patch.js +++ b/src/commands/patch.js @@ -20,4 +20,4 @@ end return "Added Patch Handler" ` return code -} \ No newline at end of file +} diff --git a/src/commands/unmonitor.js b/src/commands/unmonitor.js index 3ed2391c7..424d5e05f 100644 --- a/src/commands/unmonitor.js +++ b/src/commands/unmonitor.js @@ -1,12 +1,13 @@ -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' export function unmonitor(jwk, id, services) { - return services.unmonitorProcess({ id, wallet: jwk }) - .map(x => (console.log("Result: ", chalk.blue(x)), x)) + return services + .unmonitorProcess({ id, wallet: jwk }) + .map(x => (console.log('Result: ', chalk.blue(x)), x)) .bimap( - _ => chalk.red("Could not stop cron monitoring process."), - _ => chalk.green("Successfully stopped cron monitoring process.") + _ => chalk.red('Could not stop cron monitoring process.'), + _ => chalk.green('Successfully stopped cron monitoring process.') ) .toPromise() -} \ No newline at end of file +} diff --git a/src/config.js b/src/config.js new file mode 100644 index 000000000..9e8fc6f87 --- /dev/null +++ b/src/config.js @@ -0,0 +1,13 @@ +export const config = { + urls: { + DEFAULT_HB_NODE: 'https://push.forward.computer', + GATEWAY: 'https://ao-search-gateway.goldsky.com', + CU_DEV: 'https://ao-cu-0.ao-devnet.xyz', + MU_DEV: 'https://ao-mu-0.ao-devnet.xyz', + CU_TESTNET: 'https://cu.ao-testnet.xyz', + MU_TESTNET: 'https://mu.ao-testnet.xyz' + }, + addresses: { + SCHEDULER_MAINNET: 'n_XZJhUnmldNFo4dhajoPZWhBXuJk-OcQr5JQ49c4Zo' + } +} diff --git a/src/dry-eval.js b/src/dry-eval.js index 18935289f..977b712e6 100644 --- a/src/dry-eval.js +++ b/src/dry-eval.js @@ -1,40 +1,22 @@ -// like evaluate but it does not save memory -import { of } from 'hyper-async' +// Like evaluate but it does not save memory export async function dryEval(line, processId, wallet, services, spinner) { - return of() - .map(_ => { - if (process.env.DEBUG) console.time('Send') - return _ - }) - .chain(() => services.dryrun({ + if (process.env.DEBUG) console.time('Send') + + const result = await services.dryrun( + { processId: processId, - wallet: wallet, - tags: [ - { name: 'Action', value: 'Eval' } - ], + wallet: wallet, + tags: [{ name: 'Action', value: 'Eval' }], data: line - }, spinner)) - - // .map(x => { - // //console.log(x) - // if (process.env.DEBUG) { - // console.log("") - // console.timeEnd('Send') - // } - // spinner.suffixText = `${chalk.gray("[Computing")} ${chalk.green(x)}${chalk.gray("...]")}` - // if (process.env.DEBUG) console.time('Read') - // return x - // }) + }, + spinner + ) + if (process.env.DEBUG) { + console.log('') + console.timeEnd('Send') + } - .map(x => { - if (process.env.DEBUG) { - console.log("") - console.timeEnd('Send') - } - return x - }) - .toPromise() - //return { output: 'echo: ' + line, prompt: null } -} \ No newline at end of file + return result +} diff --git a/src/errors.js b/src/errors.js index 05f7265d6..96ffd31df 100644 --- a/src/errors.js +++ b/src/errors.js @@ -1,4 +1,4 @@ export const errors = { - 100: "Unknown Error", - 200: "File Not Found!" -} \ No newline at end of file + 100: 'Unknown Error', + 200: 'File Not Found!' +} diff --git a/src/evaluate.js b/src/evaluate.js index e415bfe94..aa5d144c5 100644 --- a/src/evaluate.js +++ b/src/evaluate.js @@ -1,69 +1,45 @@ /** * Evaluate.js * - * This module exports the `evaluate` function, which processes a given input - * line by asynchronously sending it to a Hyperbeam or legacy Mu service and - * retrieving the computed result. It employs functional programming - * constructs from `hyper-async` to manage asynchronous flows effectively. - * Utility functions handle spinner updates, debugging logs, error handling, - * and conditional result fetching to streamline interactions with external services. + * This module exports the `evaluate` function, which processes a given input + * line by asynchronously sending it to a Hyperbeam or legacy Mu service and + * retrieving the computed result. Uses async/await for clearer control flow. */ -import { of, fromPromise, Resolved } from 'hyper-async' -import chalk from 'chalk' +import { chalk } from './utils/colors.js' export async function evaluate(line, processId, wallet, services, spinner, swallowError = false) { - return of({ processId, wallet, tags: [{ name: 'Action', value: 'Eval' }], data: line }) - .map(tStart('Send')) - .chain(pushMessage) - .map(tEnd('Send')) - .map(changeSpinner) - .map(tStart('Read')) - .chain(readResult) - .map(tEnd('Read')) - .toPromise().catch(logError) + try { + const msg = { processId, wallet, tags: [{ name: 'Action', value: 'Eval' }], data: line } - // send message to hyperbeam or legacy mu - function pushMessage(msg) { - return services.sendMessage(msg, spinner) - } - - // read the result unless it is provided. - function readResult(message) { - return message.Output || message.Error - ? of(message) - : services.readResult({ message, process: processId }) - } + // Send message + if (process.env.DEBUG) console.time('Send') + const messageId = await services.sendMessage(msg, spinner) - // change spinner description - function changeSpinner(ctx) { - spinner.suffixText = `${chalk.gray("[Computing")} ${chalk.green(ctx)}${chalk.gray("...]")}` - return ctx - } - // common time start console tap function - function tStart(name) { - return _ => { - if (process.env.DEBUG) { - console.time(name) - } - return _ + if (process.env.DEBUG) { + console.log('\n>>>>>>>>>') + console.timeEnd('Send') + console.log('>>>>>>>>>\n') } - } - // common time end console tap function - function tEnd(name) { - return _ => { - if (process.env.DEBUG) { - console.log("\n>>>>>>>>>") - console.timeEnd(name) - console.log(">>>>>>>>>\n") - } - return _ + // Update spinner + spinner.suffixText = `${chalk.gray('[Computing')} ${chalk.green(messageId)}${chalk.gray('...]')}` + + // Read result if not already provided + if (process.env.DEBUG) console.time('Read') + const result = + messageId?.Output || messageId?.Error + ? messageId + : await services.readResult({ message: messageId, process: processId }) + + if (process.env.DEBUG) { + console.log('\n>>>>>>>>>') + console.timeEnd('Read') + console.log('>>>>>>>>>\n') } - } - - // log error of promise return empty obj - function logError(err) { + + return result + } catch (err) { if (!swallowError) console.log(err) return {} } diff --git a/src/index.js b/src/index.js index 204ec104b..4bfa42e59 100644 --- a/src/index.js +++ b/src/index.js @@ -3,25 +3,21 @@ import './services/dev.js' import readline from 'readline' import minimist from 'minimist' import ora from 'ora' -import chalk from 'chalk' +import { chalk } from './utils/colors.js' import path from 'path' import * as url from 'url' import process from 'node:process' -import prompts from 'prompts' -import { resolveProcessTypeFromFlags, shouldShowSplash, shouldSuppressVersionBanner } from './services/process-type.js' +import { shouldShowSplash, shouldSuppressVersionBanner } from './services/process-type.js' -import { of, fromPromise, Rejected, Resolved } from 'hyper-async' - -// actions +// Actions import { evaluate } from './evaluate.js' import { register } from './register.js' import { dryEval } from './dry-eval.js' -// services +// Services import { getWallet, getWalletFromArgs } from './services/wallets.js' import { address, isAddress } from './services/address.js' import * as connectSvc from './services/connect.js' -import * as relaySvc from './services/relay.js' import * as mainnetSvc from './services/mainnet.js' import { blueprints } from './services/blueprints.js' import { gql } from './services/gql.js' @@ -30,7 +26,7 @@ import { checkForUpdate, installUpdate, version } from './services/version.js' import { getErrorOrigin, outputError, parseError } from './services/errors.js' import { getPkg } from './services/get-pkg.js' -// commands +// Commands import { load } from './commands/load.js' import { monitor } from './commands/monitor.js' import { checkLoadArgs } from './services/loading-files.js' @@ -41,6 +37,8 @@ import { list } from './services/list.js' import * as os from './commands/os.js' import { readHistory, writeHistory } from './services/history-service.js' import { pad } from './commands/pad.js' +import { config } from './config.js' +import { printWithFormat } from './utils/print.js' const argv = minimist(process.argv.slice(2)) const splashEnabled = shouldShowSplash(argv) @@ -48,21 +46,24 @@ const suppressVersionBanner = shouldSuppressVersionBanner(argv) let dryRunMode = false let luaData = '' -let relayMode = false let { - spawnProcess, sendMessage, readResult, monitorProcess, unmonitorProcess, live, printLive, dryrun + spawnProcess, + sendMessage, + readResult, + monitorProcess, + unmonitorProcess, + live, + printLive, + dryrun } = connectSvc let { - spawnProcessRelay, sendMessageRelay, readResultRelay, - monitorProcessRelay, unmonitorProcessRelay, liveRelay, printLiveRelay, - dryrunRelay -} = relaySvc - -let { - spawnProcessMainnet, sendMessageMainnet, - monitorProcessMainnet, unmonitorProcessMainnet, liveMainnet, printLiveMainnet, + spawnProcessMainnet, + sendMessageMainnet, + readResultMainnet, + liveMainnet, + printLiveMainnet, handleNodeTopup } = mainnetSvc @@ -71,11 +72,9 @@ if (!process.stdin.isTTY) { luaData = luaData + chunk } process.stdin.on('data', onData) - // process.stdin.on('end', onEnd) } globalThis.alerts = {} -// make prompt global :( globalThis.prompt = 'aos> ' if (argv['get-blueprints']) { @@ -118,123 +117,139 @@ let cron = null if (argv.watch && argv.watch.length === 43) { live(argv.watch, true).then(res => { - process.stdout.write('\n' + '\u001b[0G' + chalk.green('Watching: ') + chalk.blue(argv.watch) + '\n') + process.stdout.write( + '\n' + '\u001b[0G' + chalk.green('Watching: ') + chalk.blue(argv.watch) + '\n' + ) cron = res }) } -if (splashEnabled) { - splash() +if (argv['gateway-url']) { + process.env.GATEWAY_URL = argv['gateway-url'] } -if (argv['scheduler']) { - process.env.SCHEDULER = argv['scheduler'] +if (argv['cu-url']) { + process.env.CU_URL = argv['cu-url'] +} + +if (argv['mu-url']) { + process.env.MU_URL = argv['mu-url'] } if (argv['authority']) { process.env.AUTHORITY = argv['authority'] } -if (argv['url']) { - process.env.AO_URL = argv['url'] +if (argv['scheduler']) { + process.env.SCHEDULER = argv['scheduler'] +} + +// Mainnet mode is the default behavior unless --legacy flag is used +if (!argv['legacy']) { + try { + // Use --url flag if provided, otherwise use DEFAULT_HB_NODE from config + process.env.AO_URL = argv['url'] || config.urls.DEFAULT_HB_NODE + + // Get scheduler if in mainnet mode + process.env.SCHEDULER = process.env.SCHEDULER ?? config.addresses.SCHEDULER_MAINNET + + // Replace services to use mainnet service + sendMessage = sendMessageMainnet + spawnProcess = spawnProcessMainnet + readResult = () => null + live = liveMainnet + printLive = printLiveMainnet + dryrun = () => null + } catch (e) { + console.error(e) + console.error(chalk.red('Error connecting to ' + (argv['url'] || config.urls.DEFAULT_HB_NODE))) + process.exit(1) + } } +// Support --mainnet flag for backwards compatibility if (argv['mainnet']) { if (typeof argv['mainnet'] !== 'string' || argv['mainnet'].trim() === '') { - console.error(chalk.red('The --mainnet flag requires a value, e.g. --mainnet ')); - process.exit(1); + console.error(chalk.red('The --mainnet flag requires a value, e.g. --mainnet ')) + process.exit(1) } try { - console.log(chalk.magentaBright('Using Mainnet: ') + chalk.magenta(argv['mainnet'])) process.env.AO_URL = argv['mainnet'] - // get scheduler if in mainnetmode - // process.env.SCHEDULER = process.env.SCHEDULER ?? await fetch(`${process.env.AO_URL}/~scheduler@1.0/status/address`).then(res => res.text()) - process.env.SCHEDULER = process.env.SCHEDULER ?? await fetch(`${process.env.AO_URL}/~meta@1.0/info/address`).then(res => res.text()) - process.env.AUTHORITY = process.env.SCHEDULER - //process.env.AUTHORITY = await fetch(`${process.env.AO_URL}/~meta@1.0/info/recommended/authority`).then(res => res.text()) - // TODO: Need to allow these to be overridden if set via CLI and also need to - // fallback to scheduler@1.0 for both - // process.env.EXECUTION_DEVICE = await prompts({ - // type: 'select', - // name: 'device', - // message: 'Please select a device', - // choices: [{ title: 'lua@5.3a', value: 'lua@5.3a'}, {title: 'genesis-wasm@1.0', value: 'genesis-wasm@1.0'}], - // instructions: false - // }).then(res => res.device).catch(e => "genesis-wasm@1.0") - - // replace services to use mainnet service + process.env.SCHEDULER = process.env.SCHEDULER ?? config.addresses.SCHEDULER_MAINNET + sendMessage = sendMessageMainnet spawnProcess = spawnProcessMainnet readResult = () => null - // monitorProcess = monitorProcessMainnet - // unmonitorProcess = unmonitorProcessMainnet live = liveMainnet printLive = printLiveMainnet dryrun = () => null - - relayMode = true - } - catch (e) { - console.error(chalk.red('Error connecting to ' + argv['mainnet'])); - process.exit(1); + } catch (e) { + console.error(e) + console.error(chalk.red('Error connecting to ' + argv['mainnet'])) + process.exit(1) } } -if (argv['gateway-url']) { - console.log(chalk.yellow('Using Gateway: ') + chalk.blue(argv['gateway-url'])) - process.env.GATEWAY_URL = argv['gateway-url'] -} -if (argv['cu-url']) { - console.log(chalk.yellow('Using CU: ') + chalk.blue(argv['cu-url'])) - process.env.CU_URL = argv['cu-url'] -} - -if (argv['mu-url']) { - console.log(chalk.yellow('Using MU: ') + chalk.blue(argv['mu-url'])) - process.env.MU_URL = argv['mu-url'] -} - -if (argv['authority']) { - console.log(chalk.yellow('Using Authority: ') + chalk.blue(argv['authority'].split(',').join(', '))) - process.env.AUTHORITY = argv['authority'] -} async function runProcess() { + const jwk = argv.wallet ? await getWalletFromArgs(argv.wallet) : await getWallet() + if (!argv.watch) { - of() - .chain(fromPromise(() => argv.wallet ? getWalletFromArgs(argv.wallet) : getWallet())) - .chain(jwk => { - // make wallet available to services if relay mode - if (argv['relay'] || argv['mainnet']) { - process.env.WALLET = JSON.stringify(jwk) - } - // handle list option, need jwk in order to do it. - if (argv.list) { - return list(jwk, { address, gql }).chain(Rejected) - } - return Resolved(jwk) - }) - .chain(jwk => register(jwk, { address, isAddress, spawnProcess, gql, spawnProcessMainnet }) - .map(id => ({ jwk, id })) - ) - .toPromise() - .then(async ({ jwk, id }) => { + try { + if (argv.list) { + await list(jwk, { address, gql }) + process.exit(0) + } + + if (argv['mainnet'] || !argv['legacy']) { + process.env.WALLET = JSON.stringify(jwk) + } + + const { id, variant } = await register(jwk, { address, isAddress, spawnProcess, gql, spawnProcessMainnet }) + + let isLegacyMode = argv['legacy']; + + if (variant === 'ao.TN.1') { + sendMessage = connectSvc.sendMessage + spawnProcess = connectSvc.spawnProcess + readResult = connectSvc.readResult + live = connectSvc.live + printLive = connectSvc.printLive + dryrun = connectSvc.dryrun + process.env.AO_URL = 'undefined' + isLegacyMode = true + } + + if (splashEnabled && !suppressVersionBanner) { + const walletAddress = await address(jwk) + + splash({ + walletAddress: walletAddress, + mainnetUrl: argv['mainnet'] || (!argv['legacy'] ? (argv['url'] || config.urls.DEFAULT_HB_NODE) : undefined), + gatewayUrl: argv['gateway-url'], + cuUrl: argv['cu-url'], + muUrl: argv['mu-url'], + authority: argv['authority'], + scheduler: (argv['scheduler'] ?? config.addresses.SCHEDULER_MAINNET) && !argv['legacy'] ? process.env.SCHEDULER ?? config.addresses.SCHEDULER_MAINNET : undefined, + legacy: isLegacyMode + }) + } + + { let editorMode = false let editorData = '' const history = readHistory(id) - - // this can be improved, but for now if ao-url is set - // we will use hyper mode - if (process.env.AO_URL !== "undefined") { + + if (process.env.AO_URL !== 'undefined') { process.env.WALLET = JSON.stringify(jwk) sendMessage = sendMessageMainnet - readResult = () => null + readResult = readResultMainnet live = liveMainnet printLive = printLiveMainnet } - if (argv.mainnet && argv.topup) { - await handleNodeTopup(jwk, false); + if ((argv.mainnet || !argv.legacy) && argv.topup) { + await handleNodeTopup(jwk, false) } if (!argv.run && luaData.length > 0 && argv.load) { @@ -244,13 +259,13 @@ async function runProcess() { }) spinner.start() - spinner.suffixText = chalk.gray('[Connecting to process...]') + spinner.suffixText = chalk.gray('[Connecting To Process...]') const result = await evaluate(luaData, id, jwk, { sendMessage, readResult }, spinner) spinner.stop() if (result.Output?.data) { - console.log(result.Output?.data) + printWithFormat(result.Output?.data) } process.exit(0) } @@ -259,15 +274,17 @@ async function runProcess() { console.error(chalk.red('Error! Could not find process ID.')) process.exit(0) } - version(id, { suppressOutput: suppressVersionBanner }) - // kick start monitor if monitor option + const variantDisplay = variant ? ` ${chalk.gray(`${variant}`)}` : '' + printWithFormat(`Your AOS Process: ${chalk.green(id)}${variantDisplay}`) + + // Kick start monitor if monitor option if (argv.monitor) { const result = await monitor(jwk, id, { monitorProcess }) - console.log(chalk.green(result)) + printWithFormat(chalk.green(result)) } - // check for update and install if needed + // Check for update and install if needed const update = await checkForUpdate() if (update.available && !process.env.DEBUG) { const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) @@ -287,7 +304,7 @@ async function runProcess() { }) spinner.start() - spinner.suffixText = chalk.gray('[Connecting to process...]') + spinner.suffixText = chalk.gray('[Connecting To Process...]') const { ok } = await evaluateAndPrint({ line: argv.run, @@ -304,7 +321,8 @@ async function runProcess() { globalThis.prompt = await connect(jwk, id, luaData) if (process.env.DEBUG) console.timeEnd(chalk.gray('Connecting')) - // check loading files flag + + // Check loading files flag await handleLoadArgs(jwk, id) cron = await live(id) @@ -324,55 +342,92 @@ async function runProcess() { historySize: 100, prompt: globalThis.prompt }) - globalThis.setPrompt = (p) => { + + // Make readline interface globally available for printLiveMainnet + globalThis.rl = rl + + globalThis.setPrompt = p => { rl.setPrompt(p) } - // async function repl() { - - // process.stdin.on('keypress', (str, key) => { - // if (ct) { - // ct.stop() - // } - // }) + // Override prompt + const originalPrompt = rl.prompt.bind(rl) + rl.prompt = (preserveCursor) => { + originalPrompt(preserveCursor) + } rl.on('history', e => { history.concat(e) }) - // rl.question(editorMode ? "" : globalThis.prompt, async function (line) { + // Handle backspace in editor mode to delete previous line when current line is empty + rl.input.on('keypress', (char, key) => { + if (editorMode && key && key.name === 'backspace') { + const currentLine = rl.line + if (currentLine === '' && editorData.length > 0) { + // Remove the last line from editorData + const lines = editorData.split('\n') + lines.pop() // Remove empty string from trailing newline + const lastLine = lines.pop() || '' + editorData = lines.join('\n') + (lines.length > 0 ? '\n' : '') + + // Move cursor up and clear that line + readline.moveCursor(process.stdout, 0, -1) + readline.clearLine(process.stdout, 0) + readline.cursorTo(process.stdout, 0) + + // Set the current line to the last line content so user can continue editing it + rl.line = lastLine + rl.cursor = lastLine.length + rl._refreshLine() + } + } + }) + rl.setPrompt(globalThis.prompt) if (!editorMode) rl.prompt(true) rl.on('line', async line => { + // If empty input, just redisplay prompt if (!editorMode && line.trim() === '') { - console.log(undefined) - // rl.close() - // repl() + printWithFormat() rl.prompt(true) return } + if (!editorMode) { + // Calculate how many lines the prompt + input took (accounting for line wrapping) + const terminalWidth = process.stdout.columns || 80 + const promptLength = rl.getPrompt().replace(/\x1b\[[0-9;]*m/g, '').length + const totalLength = promptLength + line.length + const linesUsed = Math.ceil(totalLength / terminalWidth) + + // Clear all the lines (prompt + wrapped lines) + for (let i = 0; i < linesUsed; i++) { + process.stdout.write('\x1b[1A\r\x1b[K') // Move up and clear line + } + + // Log user input + printWithFormat((chalk.gray('> ') + chalk.green(line))) + } + if (!editorMode && line === '.help') { replHelp() - // rl.close() - // repl() rl.prompt(true) return } + // Continue live if (!editorMode && line === '.live') { - // printLive() + printWithFormat('=== Starting Live Feed ===') cron.start() - // rl.close() - // repl() rl.prompt(true) return } - // pause live + + // Pause live if (!editorMode && line === '.pause') { - console.log("=== pausing live feed ===") - // pause live feed + printWithFormat('=== Pausing Live Feed ===') cron.stop() rl.prompt(true) return @@ -381,10 +436,10 @@ async function runProcess() { if (!editorMode && line === '.dryrun') { dryRunMode = !dryRunMode if (dryRunMode) { - console.log(chalk.green('dryrun mode engaged')) + printWithFormat(chalk.green('Dryrun Mode Engaged')) rl.setPrompt((dryRunMode ? chalk.red('*') : '') + globalThis.prompt) } else { - console.log(chalk.red('dryrun mode disengaged')) + printWithFormat(chalk.red('Dryrun Mode Disengaged')) rl.setPrompt(globalThis.prompt.replace('*', '')) } rl.prompt(true) @@ -392,53 +447,50 @@ async function runProcess() { } if (!editorMode && line === '.monitor') { - const result = await monitor(jwk, id, { monitorProcess }).catch(_ => chalk.gray('⚡️ could not monitor process!')) - console.log(chalk.green(result)) - // rl.close() - // repl() + const result = await monitor(jwk, id, { monitorProcess }).catch(_ => + chalk.gray('Could not monitor process!') + ) + printWithFormat(chalk.green(result)) rl.prompt(true) return } if (!editorMode && line === '.unmonitor') { - const result = await unmonitor(jwk, id, { unmonitorProcess }).catch(_ => chalk.gray('⚡️ monitor not found!')) - console.log(chalk.green(result)) - // rl.close() - // repl() + const result = await unmonitor(jwk, id, { unmonitorProcess }).catch(_ => + chalk.gray('Monitor not found!') + ) + printWithFormat(chalk.green(result)) rl.prompt(true) return } if (/^\.load-blueprint/.test(line)) { - try { line = loadBlueprint(line) } catch (e) { - console.log(e.message) - // rl.close() - // repl() + try { + line = loadBlueprint(line) + } catch (e) { + printWithFormat(e.message) rl.prompt(true) return } } - // modules loaded + // Modules loaded /** @type {Module[]} */ let loadedModules = [] if (/^\.load/.test(line)) { - try { [line, loadedModules] = load(line) } catch (e) { - console.log(e.message) - // rl.close() - // repl() + try { + ;[line, loadedModules] = load(line) + } catch (e) { + printWithFormat(e.message) rl.prompt(true) return } } if (line === '.editor') { - console.log(" use '.done' to submit or '.cancel' to cancel") + printWithFormat(` use '.done' to submit or '.cancel' to cancel`, { lineOnly: true }) editorMode = true rl.setPrompt('') - - // rl.close() - // repl() rl.prompt(true) return @@ -448,6 +500,7 @@ async function runProcess() { line = editorData editorData = '' editorMode = false + printWithFormat('') rl.setPrompt((dryRunMode ? chalk.red('*') : '') + globalThis.prompt) } @@ -468,10 +521,9 @@ async function runProcess() { } if (editorMode && line === '.print') { - console.log(editorData) + printWithFormat(editorData) editorData = '' editorMode = false - // rl.setPrompt(globalThis.prompt) rl.setPrompt((dryRunMode ? chalk.red('*') : '') + globalThis.prompt) rl.prompt(true) return @@ -480,11 +532,7 @@ async function runProcess() { if (editorMode && line === '.cancel') { editorData = '' editorMode = false - // rl.setPrompt(globalThis.prompt) rl.setPrompt(dryRunMode ? chalk.red('*') : '' + globalThis.prompt) - - // rl.close() - // repl() rl.prompt(true) return @@ -492,9 +540,6 @@ async function runProcess() { if (editorMode) { editorData += line + '\n' - - // rl.close() - // repl() rl.prompt(true) return @@ -504,7 +549,6 @@ async function runProcess() { rl.pause() pad(id, async (err, content) => { if (!err) { - // console.log(content) await doEvaluate(content, id, jwk, spinner, rl, loadedModules, dryRunMode) } rl.resume() @@ -515,8 +559,9 @@ async function runProcess() { if (line === '.exit') { cron.stop() - console.log('Exiting...') + printWithFormat(chalk.gray('Exiting...')) rl.close() + process.exit(0) return } @@ -532,63 +577,38 @@ async function runProcess() { if (process.env.DEBUG) { console.timeEnd(chalk.gray('Elapsed')) } - - // if (cron) { - // cron.start() - // } - - // rl.close() - // repl() rl.prompt(true) }) process.on('SIGINT', function () { - // save the input history when the user exits + // Clear the line to hide ^C + readline.clearLine(process.stdout, 0) + readline.cursorTo(process.stdout, 0) + + // Save the input history when the user exits if (id) { writeHistory(id, history) } process.exit(0) }) - - // } - - // repl() - }) - .catch(async e => { - if (argv.list) { - console.log(e) + } + } catch (e) { + if (argv.list) { + printWithFormat(e) + } else { + if (process.env.DEBUG) { + printWithFormat(e) + } + if (argv.load) { + printWithFormat(e.message) } else { - if (argv.mainnet) { - let jwk; - if (process.env.WALLET) { - try { - jwk = JSON.parse(process.env.WALLET); - } catch (err) { - console.error('Error parsing WALLET from environment:', err); - } - } - - try { - const topupSuccess = await handleNodeTopup(jwk, true); - if (topupSuccess) { - return runProcess(); - } - } catch (topupError) { - console.error('Error handling node topup:', topupError); - process.exit(1); - } - } - if (process.env.DEBUG) { - console.log(e) - } - if (argv.load) { - console.log(e.message) - } else { - console.log(chalk.red('\nAn Error occurred trying to contact your AOS process. Please check your access points, and if the problem persists contact support.')) - process.exit(1) - } + printWithFormat( + chalk.red('An Error occurred trying to contact your AOS process. Please check your access points, and if the problem persists contact support.') + ) + process.exit(1) } - }) + } + } } } @@ -601,24 +621,34 @@ async function connect(jwk, id) { }) spinner.start() - spinner.suffixText = chalk.gray('[Connecting to process...]') + spinner.suffixText = chalk.gray('[Connecting To Process...]') - // TODO: remove swallow first error let promptResult = undefined let _prompt = undefined - // need to check if a process is registered or create a process - promptResult = await evaluate("require('.process')._version", id, jwk, { sendMessage, readResult }, spinner, true) + // Need to check if a process is registered or create a process + promptResult = await evaluate( + `require('.process')._version`, + id, + jwk, + { sendMessage, readResult }, + spinner, + true + ) _prompt = promptResult?.Output?.prompt || promptResult?.Output?.data?.prompt for (let i = 0; i < 50; i++) { if (_prompt === undefined) { if (i === 0) { - spinner.suffixText = chalk.gray('[Connecting to process...]') + spinner.suffixText = chalk.gray('[Connecting To Process...]') } else { - spinner.suffixText = chalk.red('[Connecting to process...]') + spinner.suffixText = chalk.red('[Connecting To Process...]') } - // await new Promise(resolve => setTimeout(resolve, 10 * i)) - promptResult = await evaluate("require('.process')._version", id, jwk, { sendMessage, readResult }, spinner) - // console.log({ promptResult }) + promptResult = await evaluate( + `require('.process')._version`, + id, + jwk, + { sendMessage, readResult }, + spinner + ) _prompt = promptResult?.Output?.prompt || promptResult?.Output?.data?.prompt } else { break @@ -626,30 +656,34 @@ async function connect(jwk, id) { } spinner.stop() if (_prompt === undefined) { - console.log('Could not connect to process! Exiting...') + printWithFormat('Could not connect to process! Exiting...') process.exit(1) } const aosVersion = getPkg().aos.version if (promptResult.Output.data?.output !== aosVersion && promptResult.Output.data !== aosVersion) { - // only prompt for updates if version is not eq to dev - if (promptResult.Output.data !== "dev") { - console.log(chalk.blue('A new AOS update is available. run [.update] to install.')) + // Only prompt for updates if version is not eq to dev + if (promptResult.Output.data !== 'dev') { + printWithFormat(chalk.green('A new AOS update is available. run [.update] to install.')) } } return _prompt } async function handleLoadArgs(jwk, id) { - const loadCode = checkLoadArgs().map(f => `.load ${f}`).map(line => load(line)[0]).join('\n') + const loadCode = checkLoadArgs() + .map(f => `.load ${f}`) + .map(line => load(line)[0]) + .join('\n') if (loadCode) { const spinner = ora({ spinner: 'dots', suffixText: '' }) spinner.start() - spinner.suffixText = chalk.gray('[Signing message and sequencing...]') - await evaluate(loadCode, id, jwk, { sendMessage, readResult }, spinner) - .catch(err => ({ Output: JSON.stringify({ data: { output: err.message } }) })) + spinner.suffixText = chalk.gray('[Signing Message and Sequencing...]') + await evaluate(loadCode, id, jwk, { sendMessage, readResult }, spinner).catch(err => ({ + Output: JSON.stringify({ data: { output: err.message } }) + })) spinner.stop() } @@ -666,15 +700,16 @@ async function evaluateAndPrint({ }) { if (spinner) { spinner.start() - spinner.suffixText = chalk.gray('[Dispatching message...]') + spinner.suffixText = chalk.gray('[Dispatching Message...]') } const evaluator = dryRunMode ? () => dryEval(line, id, jwk, { dryrun }, spinner) : () => evaluate(line, id, jwk, { sendMessage, readResult }, spinner) - const result = await evaluator() - .catch(err => ({ Output: JSON.stringify({ data: { output: err.message } }) })) + const result = await evaluator().catch(err => ({ + Output: JSON.stringify({ data: { output: err.message } }) + })) if (spinner) { spinner.stop() @@ -701,7 +736,7 @@ function handleEvaluationResult({ line, result, loadedModules, dryRunMode, setPr const errorOrigin = getErrorOrigin(loadedModules, error.lineNumber) outputError(line, error, errorOrigin) } else { - console.log(chalk.red(errorPayload)) + printWithFormat(chalk.red(errorPayload)) } return { ok: false } @@ -709,11 +744,11 @@ function handleEvaluationResult({ line, result, loadedModules, dryRunMode, setPr if (output?.data) { if (Object.prototype.hasOwnProperty.call(output.data, 'output')) { - console.log(output.data.output) + printWithFormat(output.data.output) } else if (Object.prototype.hasOwnProperty.call(output.data, 'prompt')) { - console.log('') + printWithFormat('') } else { - console.log(output.data) + printWithFormat(output.data) } const nextPrompt = Object.prototype.hasOwnProperty.call(output.data, 'prompt') @@ -731,16 +766,16 @@ function handleEvaluationResult({ line, result, loadedModules, dryRunMode, setPr } if (!output) { - console.log(chalk.red('An unknown error occurred.')) + printWithFormat(chalk.red('An unknown error occurred.')) return { ok: false } } if (typeof output === 'string') { - console.log(output) + printWithFormat(output) return { ok: true, prompt: globalThis.prompt } } - console.log(output) + printWithFormat(output) return { ok: true, prompt: globalThis.prompt } } @@ -752,7 +787,7 @@ async function doEvaluate(line, id, jwk, spinner, rl, loadedModules, dryRunMode) spinner, loadedModules, dryRunMode, - setPrompt: (prompt) => rl.setPrompt(prompt) + setPrompt: prompt => rl.setPrompt(prompt) }) if (dryRunMode) { rl.setPrompt(chalk.red('*') + globalThis.prompt) diff --git a/src/register.js b/src/register.js index 0c158f6c8..e46ad2967 100644 --- a/src/register.js +++ b/src/register.js @@ -5,27 +5,102 @@ * - Finds existing processes/modules via GraphQL queries. * - Interactively prompts CLI users when multiple results are found. * - Creates AO processes with optional data payloads, cron schedules, and tags. - * - * Built with functional async (`hyper-async`), minimist (CLI args), prompts - * (interactive selection), and file-system utilities for enhanced flexibility. */ -import { of, Resolved, Rejected, fromPromise } from 'hyper-async' -import * as utils from './hyper-utils.js' +import * as utils from './utils/hyper-utils.js' import prompts from 'prompts' import minimist from 'minimist' import { getPkg } from './services/get-pkg.js' import fs from 'fs' import path from 'path' +import os from 'os' import { resolveProcessTypeFromFlags } from './services/process-type.js' +import { config } from './config.js' +import ora from 'ora' +import { chalk } from './utils/colors.js' + +// Local cache for process IDs and transaction data +const PROCESS_CACHE_FILE = path.join(os.homedir(), '.aos-process-cache.json') +const TX_CACHE_FILE = path.join(os.homedir(), '.aos-tx-cache.json') + +function loadProcessCache() { + try { + if (fs.existsSync(PROCESS_CACHE_FILE)) { + const data = fs.readFileSync(PROCESS_CACHE_FILE, 'utf-8') + return JSON.parse(data) + } + } catch (e) { + // Ignore cache errors + } + return {} +} + +function saveProcessCache(cache) { + try { + fs.writeFileSync(PROCESS_CACHE_FILE, JSON.stringify(cache, null, 2)) + } catch (e) { + // Ignore cache errors + } +} + +function getCachedProcess(address, name) { + const cache = loadProcessCache() + const key = `${address}:${name}` + return cache[key] +} + +function cacheProcess(address, name, processId, isMainnet = false) { + const cache = loadProcessCache() + const key = `${address}:${name}` + cache[key] = { + processId, + isMainnet, + timestamp: Date.now() + } + saveProcessCache(cache) +} -const promptUser = (results) => { +function loadTxCache() { + try { + if (fs.existsSync(TX_CACHE_FILE)) { + const data = fs.readFileSync(TX_CACHE_FILE, 'utf-8') + return JSON.parse(data) + } + } catch (e) { + // Ignore cache errors + } + return {} +} + +function saveTxCache(cache) { + try { + fs.writeFileSync(TX_CACHE_FILE, JSON.stringify(cache, null, 2)) + } catch (e) { + // Ignore cache errors + } +} + +function getCachedTx(txId) { + const cache = loadTxCache() + return cache[txId] +} + +function cacheTx(txId, tags) { + const cache = loadTxCache() + cache[txId] = { + tags, + timestamp: Date.now() + } + saveTxCache(cache) +} + +const promptUser = results => { const choices = results.map((res, i) => { - const format = res.node.tags.find((t) => t.name === 'Module-Format')?.value ?? 'Unknown Format' + const format = res.node.tags.find(t => t.name === 'Module-Format')?.value ?? 'Unknown Format' const date = new Date(res.node.block.timestamp * 1000) const title = `${i + 1} - ${format} - ${res.node.id} - ${date.toLocaleString()}` - return {title, value: res.node.id} + return { title, value: res.node.id } }) return prompts({ @@ -39,242 +114,252 @@ const promptUser = (results) => { .catch(() => Promise.reject({ ok: false, error: 'No module selected' })) } -export function register(jwk, services) { - const getAddress = ctx => services.address(ctx.jwk).map(address => ({ address, ...ctx })) - const findProcess = (ctx) => { - const { address, name } = ctx - const argv = minimist(process.argv.slice(2)) - const gqlQueryError = _ => Rejected({ ok: false, error: 'GRAPHQL Error trying to locate process.' }) - const handleQueryResults = results => results?.length > 0 - ? Resolved(results.reverse()) - : Rejected({ ...ctx, ok: true }) - - return services - .gql(queryForAOS(name), { owners: [address, argv.address || ""] }) - .map(utils.path(['data', 'transactions', 'edges'])) - .bichain(gqlQueryError, handleQueryResults) - } - - const getResultId = results => results.length === 1 - ? Resolved(results[0].node.id) - : Rejected(results) - - const selectModule = (results) => - of(results).chain((results) => !results?.length - ? Rejected({ ok: false, error: 'No module found with provided name.' }) - : of(results) - .chain(getResultId) - .bichain(fromPromise(promptUser), Resolved) - ) - - const findModule = ctx => { - const AOS_MODULE = process.env.AOS_MODULE; - const AOS_MODULE_NAME = process.env.AOS_MODULE_NAME; - - if (!AOS_MODULE && !AOS_MODULE_NAME) return Resolved({ ...ctx, module: getPkg().aos.module }); - if (AOS_MODULE) return Resolved({ ...ctx, module: AOS_MODULE }); - - return services - .gql(findAoModuleByName(), { name: ctx.module }) - .map(utils.path(['data', 'transactions', 'edges'])) - .chain(selectModule) - .map((moduleId) => ({ ...ctx, ok: true, module: moduleId })) - } - - // pick the process type for new process, it can be either aos or hyper-aos - const pickProcessType = fromPromise(async function (ctx) { - const argv = minimist(process.argv.slice(2)) - const resolved = resolveProcessTypeFromFlags(argv) - - if (resolved) { - ctx.processType = resolved - return ctx - } - - const processOS = await prompts({ - type: 'select', - name: 'device', - message: 'Please select', - choices: [{ title: 'aos', value: 'aos' }, { title: 'hyper-aos (experimental - DO NOT USE FOR PRODUCTION)', value: 'hyper' }], - instructions: false - }).then(res => res.device).catch(() => 'aos') - ctx.processType = processOS - return ctx - }) +export async function register(jwk, services) { + const argv = minimist(process.argv.slice(2)) + const name = argv._[0] || 'default' - const createProcess = (ctx) => { - const { ok, name, spawnTags, module, error } = ctx - if (!ok) { - return Rejected({ error: error || 'Unknown error occured' }) - } - let appName = "aos" - if (process.env.AO_URL !== "undefined") { - appName = "hyper-aos" - } - let data = "" - let tags = [ - { name: 'App-Name', value: appName }, - { name: 'Name', value: name }, - { name: 'Authority', value: 'fcoN_xJeisVsPXA-trzVAuIiqO3ydLQxM-L4XbrQKzY' }, - ...(spawnTags || []) + let spawnTags = Array.isArray(argv['tag-name']) + ? argv['tag-name'].map((name, i) => ({ + name: String(name || ''), + value: String(argv['tag-value'][i] || '') + })) + : [] + if (spawnTags.length === 0 && typeof argv['tag-name'] === 'string') { + spawnTags = [ + { + name: String(argv['tag-name'] || ''), + value: String(argv['tag-value'] || '') + } ] - const argv = minimist(process.argv.slice(2)) - const cronExp = /^\d+\-(second|seconds|minute|minutes|hour|hours|day|days|month|months|year|years|block|blocks|Second|Seconds|Minute|Minutes|Hour|Hours|Day|Days|Month|Months|Year|Years|Block|Blocks)$/ + } - if (argv.cron) { - if (cronExp.test(argv.cron)) { - tags = [...tags, - { name: 'Cron-Interval', value: argv.cron }, - { name: 'Cron-Tag-Action', value: 'Cron' } - ] + // Handle direct address lookup + if (services.isAddress(name)) { + try { + // Check cache first + const cachedTx = getCachedTx(name) + let tags + let variant + + if (cachedTx) { + tags = cachedTx.tags + const variantTag = tags.find(tag => tag.name.toLowerCase() === 'variant') + variant = variantTag?.value } else { - throw Error('Invalid cron flag!') + // Fetch from gateway if not cached + const gqlUrl = config.urls.GATEWAY + const res = await fetch(`${gqlUrl}/graphql`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + query: `query ($id: ID!) { transaction(id: $id) { tags { name value } } }`, + variables: { id: name } + }) + }) + + if (res.ok) { + const data = await res.json() + tags = data.data.transaction.tags + const variantTag = tags.find(tag => tag.name.toLowerCase() === 'variant') + variant = variantTag?.value + + // Cache the transaction data + cacheTx(name, tags) + } else { + return { id: name, variant: null } + } } - } - if (argv.data) { - if (fs.existsSync(path.resolve(argv.data))) { - data = fs.readFileSync(path.resolve(argv.data), 'utf-8') + if (variant === 'ao.N.1' && (!process.env.AO_URL || process.env.AO_URL === 'undefined')) { + process.env.AO_URL = config.urls.DEFAULT_HB_NODE } + + return { id: name, variant } + } catch (error) { + // If lookup fails, just return the name + return { id: name, variant: null } } + } - // if process type is hyper then lets spawn a process - // using mainnet for pure hyperbeam aos - if (ctx.processType === "hyper") { - if (process.env.AO_URL === "undefined") { - process.env.AO_URL = "https://forward.computer" - process.env.SCHEDULER = "NoZH3pueH0Cih6zjSNu_KRAcmg4ZJV1aGHKi0Pi5_Hc" - process.env.AUTHORITY = "undefined" - } - return services.spawnProcessMainnet({ - wallet: jwk, - src: module, - tags, - data, - isHyper: true + // Main registration flow + try { + // Get wallet address + const address = await services.address(jwk) + + // Find existing process + let processId + try { + // No process found - create new one + const spinner = ora({ + spinner: 'dots', + suffixText: '' }) - } + spinner.start() + spinner.suffixText = chalk.gray('[Starting AOS...]') - return services.spawnProcess({ - wallet: jwk, - src: module, - tags, - data - }) - } + const gqlResult = await services.gql(queryForAOS(name), { + owners: [address, argv.address || ''] + }) + const edges = utils.path(['data', 'transactions', 'edges'])(gqlResult) - const alreadyRegistered = async (results) => { - if (results.length == 1) { - // this handles the case when a user enters a process name - // we can check to see if it is a hyper-aos process - if (process.env.AO_URL === "undefined") { - const appName = results[0].node.tags.find(t => t.name == "App-Name")?.value || 'aos' - if (appName === "hyper-aos") { - process.env.AO_URL = "https://forward.computer" - } + spinner.stop() + + if (edges && edges.length > 0) { + // Process found - handle selection + const result = await handleExistingProcess(edges.reverse()) + return result } - return Promise.resolve(results[0].node.id) + } catch (gqlError) { + // GQL error or no process found - proceed to create new process } - const processes = results.map((r, i) => { - const version = r.node.tags.find(t => t.name == "aos-Version")?.value - return { - title: `${i + 1} - ${version} - ${r.node.id}`, - value: r.node.id - } + // No process found - create new one + const spinner = ora({ + spinner: 'dots', + suffixText: '' }) - return prompts({ - type: 'select', - name: 'process', - message: 'Please select a process', - choices: processes, - instructions: false - }) - .then(r => r.process) - .then(id => { - // TODO: we need to locate this process and check to see if the process - // is a hyper-aos process then set the AO_URL if not already set - }) - .catch(() => Promise.reject({ ok: false, error: 'Error selecting process' })) - } + spinner.start() + spinner.suffixText = chalk.gray('[Spawning New Process...]') - const argv = minimist(process.argv.slice(2)) - const name = argv._[0] || 'default' + const module = await findModule(services, argv.module) + processId = await createProcess(jwk, name, spawnTags, module, services) + + spinner.stop() + + return { id: processId, variant: null } + } catch (error) { + throw error + } +} - let spawnTags = Array.isArray(argv["tag-name"]) ? - argv["tag-name"].map((name, i) => ({ - name: String(name || ""), - value: String(argv["tag-value"][i] || "") - })) : []; - if (spawnTags.length === 0 && typeof argv["tag-name"] === "string") { - spawnTags = [{ - name: String(argv["tag-name"] || ""), - value: String(argv["tag-value"] || "") - }] +async function handleExistingProcess(results) { + if (results.length === 1) { + // Single process found + const variant = results[0].node.tags.find(t => t.name.toLowerCase() === 'variant')?.value + return { id: results[0].node.id, variant } } - const getvariant = (url) => fromPromise(async (id) => { - return await fetch(`${url}/${id}/variant`) - .then(res => res.text()) - .catch(err => Promise.rejected(id)) + // Multiple processes found - prompt user + const processes = results.map((r, i) => { + const version = r.node.tags.find(t => t.name.toLowerCase() === 'aos-version')?.value + const variant = r.node.tags.find(t => t.name.toLowerCase() === 'variant')?.value + return { + title: `${i + 1} - ${r.node.id} - ${variant} - v${version}`, + value: r.node.id, + variant + } }) - const queryGetVariant = (url) => fromPromise(async (id) => { - // return Promise.resolve({ name: "variant", value: "ao.TN.1" }) - const res = await fetch(`${url}/graphql`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - query: `query ($id: ID!) { transaction(id: $id) { tags { name value } } }`, - variables: { id } - }) - }) - if (!res.ok) throw new Error('Failed') - const data = await res.json() - const tags = data.data.transaction.tags - const variantTag = tags.find(tag => tag.name.toLowerCase() === 'variant') - return variantTag?.value || null + const response = await prompts({ + type: 'select', + name: 'process', + message: 'Select A Process', + choices: processes, + instructions: false }) - if (services.isAddress(name)) { - return of(name) - .chain(getvariant('https://cache.forward.computer')) - .bichain(queryGetVariant('https://arweave-search.goldsky.com'), Resolved) - .map((variant) => { - if (variant === 'ao.N.1') { - if (!process.env.AO_URL || process.env.AO_URL === "undefined") { - process.env.AO_URL = "https://forward.computer" - } - return name - } else { - return name - } - }) + if (!response.process) { + throw new Error('No process selected') + } + + const selectedProcess = processes.find(p => p.value === response.process) + return { id: response.process, variant: selectedProcess?.variant } +} + +async function findModule(services, moduleArg) { + const AOS_MODULE = process.env.AOS_MODULE + const AOS_MODULE_NAME = process.env.AOS_MODULE_NAME + + // Use default module + if (!AOS_MODULE && !AOS_MODULE_NAME) { + return getPkg().aos.module } - // if (services.isAddress(name)) { - // return of(name) - // // need to get the process from - // // https://cache.forward.computer or - // // https://arweave.net in a fall back mode - // // check if variant is ao.N.1 and if so - // // we need to put console into hyperbeam mode - // // by setting the - // } - const doRegister = ctx => !ctx.ok ? Rejected(ctx) : findModule(ctx) - .chain(pickProcessType) - .chain(createProcess) - - const resolveId = fromPromise(alreadyRegistered) - - return of({ jwk, name, spawnTags, module: argv.module }) - .chain(getAddress) - .chain(findProcess) - .bichain(doRegister, resolveId) - + // Use specified module ID + if (AOS_MODULE) { + return AOS_MODULE + } + + // Look up module by name + try { + const gqlResult = await services.gql(findAoModuleByName(), { name: moduleArg }) + const edges = utils.path(['data', 'transactions', 'edges'], gqlResult) + + if (!edges || edges.length === 0) { + throw new Error('No module found with provided name.') + } + + // Single module found + if (edges.length === 1) { + return edges[0].node.id + } + + // Multiple modules - prompt user + const moduleId = await promptUser(edges) + return moduleId + } catch (error) { + throw new Error(error.message || 'Error finding module') + } +} + +async function createProcess(jwk, name, spawnTags, module, services) { + let appName = 'aos' + + let data = '' + let tags = [ + { name: 'App-Name', value: appName }, + { name: 'Name', value: name }, + ...(spawnTags || []) + ] + + const argv = minimist(process.argv.slice(2)) + const cronExp = + /^\d+\-(second|seconds|minute|minutes|hour|hours|day|days|month|months|year|years|block|blocks|Second|Seconds|Minute|Minutes|Hour|Hours|Day|Days|Month|Months|Year|Years|Block|Blocks)$/ + + if (argv.cron) { + if (cronExp.test(argv.cron)) { + tags = [ + ...tags, + { name: 'Cron-Interval', value: argv.cron }, + { name: 'Cron-Tag-Action', value: 'Cron' } + ] + } else { + throw Error('Invalid cron flag!') + } + } + + if (argv.data) { + if (fs.existsSync(path.resolve(argv.data))) { + data = fs.readFileSync(path.resolve(argv.data), 'utf-8') + } + } + + // Use appropriate spawn service + const processType = resolveProcessTypeFromFlags(argv) + + if (processType === 'mainnet') { + return await services.spawnProcessMainnet({ + wallet: jwk, + src: module, + tags, + data, + isHyper: true + }) + } + + else { + tags.push({ name: 'Authority', value: 'fcoN_xJeisVsPXA-trzVAuIiqO3ydLQxM-L4XbrQKzY' }); + + return await services.spawnProcess({ + wallet: jwk, + src: module, + tags, + data + }) + } } function queryForAOS(name) { diff --git a/src/services/address.js b/src/services/address.js index d7e41572e..ee8e02c3f 100644 --- a/src/services/address.js +++ b/src/services/address.js @@ -1,4 +1,3 @@ -import { fromPromise } from 'hyper-async' import Arweave from 'arweave' const ARWEAVE_HOST = process.env.ARWEAVE_HOST || 'arweave.net' @@ -11,10 +10,10 @@ const arweave = Arweave.init({ protocol: ARWEAVE_PROTOCOL }) -export function address(jwk) { - return fromPromise(() => arweave.wallets.jwkToAddress(jwk))() +export async function address(jwk) { + return await arweave.wallets.jwkToAddress(jwk) } export function isAddress(candidate) { - return (/^([a-zA-Z0-9_-]{43})$/).test(candidate) + return /^([a-zA-Z0-9_-]{43})$/.test(candidate) } diff --git a/src/services/blueprints.js b/src/services/blueprints.js index effd2d797..536015234 100644 --- a/src/services/blueprints.js +++ b/src/services/blueprints.js @@ -2,27 +2,27 @@ import fs from 'node:fs' import path from 'node:path' import os from 'node:os' import * as url from 'url' -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' - -let __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +let __dirname = url.fileURLToPath(new URL('.', import.meta.url)) if (os.platform() === 'win32') { - __dirname = __dirname.replace(/\\/g, "/").replace(/^[A-Za-z]:\//, "/") + __dirname = __dirname.replace(/\\/g, '/').replace(/^[A-Za-z]:\//, '/') } export function blueprints(dir) { try { - const blueprintsDir = __dirname + "../../blueprints" + const blueprintsDir = __dirname + '../../blueprints' const outputDir = process.cwd() + '/' + (dir === true ? '' : dir) let prints = fs.readdirSync(path.resolve(blueprintsDir)) - prints.map(n => { - return [n, fs.readFileSync(path.resolve(blueprintsDir + '/' + n), 'utf-8')] - }).map(([n, lua]) => { - fs.writeFileSync(path.resolve(outputDir + '/' + n), lua) - }) + prints + .map(n => { + return [n, fs.readFileSync(path.resolve(blueprintsDir + '/' + n), 'utf-8')] + }) + .map(([n, lua]) => { + fs.writeFileSync(path.resolve(outputDir + '/' + n), lua) + }) } catch (e) { console.error(chalk.red('BLUEPRINT ERROR: Having trouble finding directory or reading files!')) } - -} \ No newline at end of file +} diff --git a/src/services/connect.js b/src/services/connect.js index cc56b8196..4609a297e 100644 --- a/src/services/connect.js +++ b/src/services/connect.js @@ -1,6 +1,5 @@ -import { connect, createDataItemSigner } from "@permaweb/aoconnect" -import { fromPromise, Resolved, Rejected } from 'hyper-async' -import chalk from 'chalk' +import { connect, createDataItemSigner } from '@permaweb/aoconnect' +import { chalk } from '../utils/colors.js' import { getPkg } from './get-pkg.js' import cron from 'node-cron' import fs from 'fs' @@ -11,7 +10,6 @@ import Arweave from 'arweave' const arweave = Arweave.init({}) - const pkg = getPkg() const getInfo = () => ({ GATEWAY_URL: process.env.GATEWAY_URL, @@ -19,99 +17,91 @@ const getInfo = () => ({ MU_URL: process.env.MU_URL }) -const retryAsync = (fn, left, right, retries = 3) => - fn().bichain( - err => (retries > 0 ? retryAsync(fn, retries - 1) : left(err)), - res => right(res) - ); - - -export function readResult(params) { - - return fromPromise(() => - new Promise((resolve) => setTimeout(() => resolve(params), 500)) - )().chain(fromPromise(() => connect(getInfo()).result(params))) - // log the error messages most seem related to 503 - // .bimap(_ => (console.log(_), _), _ => (console.log(_), _)) - .bichain(fromPromise(() => - new Promise((resolve, reject) => setTimeout(() => reject(params), 500)) - ), - Resolved - ) +// Helper function to retry with delay +async function retryWithDelay( + fn, + maxRetries = 21, + delayMs = 500, + spinner = null, + initialRetries = '.' +) { + let retries = initialRetries + let lastError + + for (let attempt = 0; attempt < maxRetries; attempt++) { + try { + if (attempt > 0) { + await new Promise(r => setTimeout(r, delayMs)) + if (spinner) { + spinner.suffixText = chalk.gray('[Processing' + retries + ']') + } else { + console.log(chalk.gray('.')) + } + retries += '.' + } + return await fn() + } catch (error) { + lastError = error + if (attempt === maxRetries - 1) { + throw lastError + } + } + } + throw lastError } -export function dryrun({ processId, wallet, tags, data }, spinnner) { - return fromPromise(() => - arweave.wallets.jwkToAddress(wallet).then(Owner => - connect(getInfo()).dryrun({ process: processId, Owner, tags, data }) - ) - )() +export async function readResult(params) { + await new Promise(resolve => setTimeout(resolve, 500)) + + try { + return await connect(getInfo()).result(params) + } catch (error) { + await new Promise(resolve => setTimeout(resolve, 500)) + throw params + } } -export function sendMessage({ processId, wallet, tags, data }, spinner) { - let retries = "." - const signer = createDataItemSigner(wallet) +export async function dryrun({ processId, wallet, tags, data }, spinner) { + const Owner = await arweave.wallets.jwkToAddress(wallet) + return await connect(getInfo()).dryrun({ process: processId, Owner, tags, data }) +} - const retry = () => fromPromise(() => new Promise(r => setTimeout(r, 500)))() - .map(_ => { - spinner ? spinner.suffixText = chalk.gray('[Processing' + retries + ']') : console.log(chalk.gray('.')) - retries += "." - return _ - }) - .chain(fromPromise(() => connect(getInfo()).message({ process: processId, signer, tags, data }))) - - return fromPromise(() => connect(getInfo()).message({ process: processId, signer, tags, data }))() - //.bimap(function (e) { console.log(e); return e }, function (a) { console.log(a); return a; }) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - //.map(result => (console.log(result), result)) +export async function sendMessage({ processId, wallet, tags, data }, spinner) { + const signer = createDataItemSigner(wallet) + return await retryWithDelay( + () => connect(getInfo()).message({ process: processId, signer, tags, data }), + 21, + 500, + spinner + ) } -export function spawnProcess({ wallet, src, tags, data }) { - const SCHEDULER = process.env.SCHEDULER || "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA" +export async function spawnProcess({ wallet, src, tags, data }) { + const SCHEDULER = process.env.SCHEDULER || '_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA' const signer = createDataItemSigner(wallet) tags = tags.concat([{ name: 'aos-Version', value: pkg.version }]) - return fromPromise(() => connect(getInfo()).spawn({ - module: src, scheduler: SCHEDULER, signer, tags, data + const result = await connect(getInfo()).spawn({ + module: src, + scheduler: SCHEDULER, + signer, + tags, + data }) - .then(result => new Promise((resolve) => setTimeout(() => resolve(result), 500))) - )() + await new Promise(resolve => setTimeout(resolve, 500)) + return result } -export function monitorProcess({ id, wallet }) { +export async function monitorProcess({ id, wallet }) { const signer = createDataItemSigner(wallet) - return fromPromise(() => connect(getInfo()).monitor({ process: id, signer }))() - //.map(result => (console.log(result), result)) - + return await connect(getInfo()).monitor({ process: id, signer }) } -export function unmonitorProcess({ id, wallet }) { +export async function unmonitorProcess({ id, wallet }) { const signer = createDataItemSigner(wallet) - return fromPromise(() => connect(getInfo()).unmonitor({ process: id, signer }))() - //.map(result => (console.log(result), result)) - + return await connect(getInfo()).unmonitor({ process: id, signer }) } let _watch = false @@ -122,19 +112,17 @@ export function printLive() { globalThis.alerts[k].print = false if (!_watch) { - process.stdout.write("\u001b[2K"); + process.stdout.write('\u001b[2K') } else { process.stdout.write('\n') } - process.stdout.write("\u001b[0G" + globalThis.alerts[k].data) - - globalThis.prompt = globalThis.alerts[k].prompt || "aos> " - globalThis.setPrompt(globalThis.prompt || "aos> ") - process.stdout.write('\n' + globalThis.prompt || "aos> ") + process.stdout.write('\u001b[0G' + globalThis.alerts[k].data + '\n') + globalThis.prompt = globalThis.alerts[k].prompt || 'aos> ' + globalThis.setPrompt(globalThis.prompt || 'aos> ') + process.stdout.write('\n' + globalThis.prompt || 'aos> ') } }) - } export async function live(id, watch) { @@ -152,7 +140,10 @@ export async function live(id, watch) { if (ct && !stopped) { ct.stop() stopped = true - setTimeout(() => { ct.start(); stopped = false }, 60000) + setTimeout(() => { + ct.start() + stopped = false + }, 60000) } }) @@ -160,43 +151,45 @@ export async function live(id, watch) { const checkLive = async () => { if (!isJobRunning) { - try { - isJobRunning = true; + isJobRunning = true let params = { process: id, limit: 1000 } if (cursor) { - params["from"] = cursor + params['from'] = cursor } else { - params["limit"] = 5 - params["sort"] = "DESC" + params['limit'] = 5 + params['sort'] = 'DESC' } const results = await connect(getInfo()).results(params) - let edges = uniqBy(prop('cursor'))(results.edges.filter(function (e) { - if (e.node?.Output?.print === true) { - return true - } - if (e.cursor === cursor) { + let edges = uniqBy(prop('cursor'))( + results.edges.filter(function (e) { + if (e.node?.Output?.print === true) { + return true + } + if (e.cursor === cursor) { + return false + } return false - } - return false - })) + }) + ) // Sort the edges by ordinate value to ensure they are printed in the correct order. // TODO: Handle sorting with Cron jobs, considering nonces and timestamps. Review cursor usage for compatibility with future CU implementations. - edges = edges.sort((a, b) => JSON.parse(atob(a.cursor)).ordinate - JSON.parse(atob(b.cursor)).ordinate); + edges = edges.sort( + (a, b) => JSON.parse(atob(a.cursor)).ordinate - JSON.parse(atob(b.cursor)).ordinate + ) // --- peek on previous line and if delete line if last prompt. - // --- key event can detect - // count !== null && + // --- key event can detect + // Count !== null && if (edges.length > 0) { edges.map(e => { if (!globalThis.alerts[e.cursor]) { globalThis.alerts[e.cursor] = e.node?.Output } }) - } count = edges.length if (results.edges.length > 0) { @@ -204,10 +197,8 @@ export async function live(id, watch) { fs.writeFileSync(cursorFile, cursor) } //process.nextTick(() => null) - } catch (e) { - // surpress error messages #195 - + // Surpress error messages #195 // console.log(chalk.red('An error occurred with live updates...')) // console.log('Message: ', chalk.gray(e.message)) } finally { @@ -217,8 +208,6 @@ export async function live(id, watch) { } await cron.schedule('*/2 * * * * *', checkLive) - - ct = await cron.schedule('*/2 * * * * *', printLive) return ct } diff --git a/src/services/dev.js b/src/services/dev.js index cf52331d0..63519439d 100644 --- a/src/services/dev.js +++ b/src/services/dev.js @@ -1,22 +1,23 @@ import minimist from 'minimist' +import { config } from '../config.js' const argv = minimist(process.argv.slice(2)) if (argv['dev']) { console.log('*** DEV ENVIRONMENT ***') - process.env.GATEWAY_URL = 'https://arweave-search.goldsky.com' - process.env.CU_URL = 'https://ao-cu-0.ao-devnet.xyz' - process.env.MU_URL = 'https://ao-mu-0.ao-devnet.xyz' + process.env.GATEWAY_URL = config.urls.GATEWAY + process.env.CU_URL = config.urls.CU_DEV + process.env.MU_URL = config.urls.MU_DEV process.env.SCHEDULER = 'gCpQfnG6nWLlKs8jYgV8oUfe38GYrPLv59AC7LCtCGg' - + console.log('GATEWAY_URL', process.env.GATEWAY_URL) console.log('CU', process.env.CU_URL) console.log('MU', process.env.MU_URL) console.log('SCHEDULER', process.env.SCHEDULER) } else { - process.env.GATEWAY_URL ||= 'https://ao-search-gateway.goldsky.com' - process.env.CU_URL ||= 'https://cu.ao-testnet.xyz' - process.env.MU_URL ||= 'https://mu.ao-testnet.xyz' + process.env.GATEWAY_URL ||= config.urls.GATEWAY + process.env.CU_URL ||= config.urls.CU_TESTNET + process.env.MU_URL ||= config.urls.MU_TESTNET } export function dev() { diff --git a/src/services/errors.js b/src/services/errors.js index 28e7cc54d..b7ad89bfe 100644 --- a/src/services/errors.js +++ b/src/services/errors.js @@ -1,4 +1,4 @@ -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' import path from 'path' /** @@ -13,18 +13,15 @@ import path from 'path' * @returns {AOSError} */ export function parseError(error) { - // if we have not been given any error information, return a generic message + // If we have not been given any error information, return a generic message if (!error || Object.keys(error).length === 0) { - return { lineNumber: 0, errorMessage: "No message given by process." } + return { lineNumber: 0, errorMessage: 'No message given by process.' } } - // parse error message - const errorMessage = error.replace( - /\[string "[a-zA-Z0-9_.-]*"\]:[0-9]*: /g, - '' - ) + // Parse error message + const errorMessage = error.replace(/\[string "[a-zA-Z0-9_.-]*"\]:[0-9]*: /g, '') - // parse line number + // Parse line number const lineNumbers = error.match(/:([0-9]*):/g) if (!lineNumbers) return undefined if (lineNumbers.length === 1) { @@ -54,7 +51,7 @@ export function parseError(error) { /** * Get error origin file and actual line number - * @param {Module[]} loadedModules + * @param {Module[]} loadedModules * @param {number} lineNumber * @returns {ErrorOrigin|undefined} */ @@ -70,7 +67,7 @@ export function getErrorOrigin(loadedModules, lineNumber) { // Each loaded module begins with \n\n. // After the first module, the first '\n' will be appended on the end of the previous module, - // creating net one new line. However, for the first module, there is no previous module, + // Creating net one new line. However, for the first module, there is no previous module, // and two new lines are created. This is why we begin at one and offset by one per module. let currentLine = 1 @@ -92,7 +89,7 @@ export function getErrorOrigin(loadedModules, lineNumber) { * This adds 5 lines to the loaded module. * The loaded modules will always appear first in the array (ie the main module will be last) */ - + const isPrimaryModule = i == loadedModules.length - 1 if (currentLine + lineCount >= lineNumber) { const originLineNumber = lineNumber - currentLine @@ -116,19 +113,19 @@ export function getErrorOrigin(loadedModules, lineNumber) { * @param {ErrorOrigin|undefined} origin */ export function outputError(line, error, origin) { - const lineNumber = (origin?.line || error.lineNumber) - const lineContent = (origin?.lineContent || line.split('\n')[lineNumber - 1]) + const lineNumber = origin?.line || error.lineNumber + const lineContent = origin?.lineContent || line.split('\n')[lineNumber - 1] const lineNumberPlaceholder = ' '.repeat(lineNumber.toString().length) console.log( '\n' + - chalk.bold(error.errorMessage) + - '\n' + - (origin ? chalk.dim(` in ${origin.file}\n`) : "") + - chalk.blue(` ${lineNumberPlaceholder} |\n ${lineNumber} | `) + - lineContent + - '\n' + - chalk.blue(` ${lineNumberPlaceholder} |\n`) + - chalk.dim('This error occurred while aos was evaluating the submitted code.') + chalk.bold(error.errorMessage) + + '\n' + + (origin ? chalk.dim(` in ${origin.file}\n`) : '') + + chalk.blue(` ${lineNumberPlaceholder} |\n ${lineNumber} | `) + + lineContent + + '\n' + + chalk.blue(` ${lineNumberPlaceholder} |\n`) + + chalk.dim('This error occurred while aos was evaluating the submitted code.') ) } diff --git a/src/services/get-pkg.js b/src/services/get-pkg.js index 2f06f6b58..177a775a9 100644 --- a/src/services/get-pkg.js +++ b/src/services/get-pkg.js @@ -1,16 +1,16 @@ import fs from 'node:fs' import path from 'node:path' import os from 'node:os' -import * as url from 'url'; +import * as url from 'url' -let __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +let __dirname = url.fileURLToPath(new URL('.', import.meta.url)) if (os.platform() === 'win32') { - __dirname = __dirname.replace(/\\/g, "/") + __dirname = __dirname.replace(/\\/g, '/') } const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname + '../../package.json'))) export function getPkg() { return pkg -} \ No newline at end of file +} diff --git a/src/services/gql.js b/src/services/gql.js index 0d89f1f2d..c0c7d7436 100644 --- a/src/services/gql.js +++ b/src/services/gql.js @@ -1,47 +1,29 @@ -/** -gql service +import { config } from '../config.js' -This service should call the following graphql services and wire them together +const ARWEAVE_GRAPHQL = + process.env.ARWEAVE_GRAPHQL || + (process.env.GATEWAY_URL ? new URL('/graphql', process.env.GATEWAY_URL) : config.urls.GATEWAY) -* node2.bundlr.network/graphql -* arweave.net/graphql -* arweave-search.goldsky.com/graphql -*/ +export async function gql(query, variables) { + const body = { query, variables } -import { of, fromPromise } from 'hyper-async' - - -export function gql(query, variables) { - return of({ query, variables }) - .chain(queryArweave) -} - -const ARWEAVE_GRAPHQL = process.env.ARWEAVE_GRAPHQL || ( - process.env.GATEWAY_URL ? new URL('/graphql', process.env.GATEWAY_URL) : 'https://ao-search-gateway.goldsky.com' -) -function queryArweave(body) { - return fromPromise(() => fetch(ARWEAVE_GRAPHQL, { + const res = await fetch(ARWEAVE_GRAPHQL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }) - .then(res => { - if (!res.ok) { - throw new Error(`(${res.status}) ${res.statusText} - GQL ERROR`) - } - return res - }) - .then(result => { - if (result.data === null) { - throw new Error(`(${result.status}) ${result.statusText} - GQL ERROR`) - } - return result - - }) - .then(res => res.json()) + if (!res.ok) { + throw new Error(`(${res.status}) ${res.statusText} - GQL ERROR`) + } + + const result = await res.json() + + if (result.data === null) { + throw new Error(`GQL ERROR - No data returned`) + } - )() + return result } diff --git a/src/services/help.js b/src/services/help.js index 95d4afc64..4ef3a43e2 100644 --- a/src/services/help.js +++ b/src/services/help.js @@ -1,56 +1,65 @@ -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' +import { printWithBorder } from '../utils/print.js' export function replHelp() { - console.log(` -${chalk.green('AOS Client Functions')} - -${chalk.blue('Documentation:')} https://cookbook_ao.g8way.io - -${chalk.green('Client commands:')} - - ${chalk.green('.load [file]')} Loads local Lua file into the process - ${chalk.green('.load-blueprint [blueprint]')} Loads a blueprint from the blueprints repository - ${chalk.green('.monitor')} Starts monitoring cron messages for this process - ${chalk.green('.unmonitor')} Stops monitoring cron messages for this process - ${chalk.green('.editor')} Simple code editor for writing multi-line Lua expressions - ${chalk.green('.dryrun')} Toggle dryrun mode that sends every command as a dryrun and never saves memory - ${chalk.green('.exit')} Close the client - ${chalk.green('.help')} Print this help screen - `) + printWithBorder([ + chalk.gray('AOS Client Functions'), + 'newline', + chalk.gray('Documentation: ') + chalk.green('https://cookbook_ao.g8way.io'), + 'newline', + chalk.gray('Client Commands:'), + 'newline', + chalk.green('.load [file]') + ' Loads local Lua file into the process', + chalk.green('.load-blueprint [blueprint]') + ' Loads a blueprint from the blueprints repository', + chalk.green('.monitor') + ' Starts monitoring cron messages for this process', + chalk.green('.unmonitor') + ' Stops monitoring cron messages for this process', + chalk.green('.editor') + ' Simple code editor for writing multi-line Lua expressions', + chalk.green('.dryrun') + ' Toggle dryrun mode that sends every command as a dryrun and never saves memory', + chalk.green('.exit') + ' Close the client', + chalk.green('.help') + ' Print this help screen', + 'newline', + ], { + title: 'Help', + borderColor: chalk.gray, + titleColor: chalk.green, + truncate: true + }) } export function help() { - console.log(` -${chalk.green('Welcome to the AOS client! AOS allows you to build and interact with AO processes.')} - -${chalk.blue('Full AOS documentation:')} https://cookbook_ao.g8way.io - -${chalk.green('Usage:')} aos [name] [options] - -${chalk.green('Options:')} - - ${chalk.green('[name]')} The name of the process you want to spawn or connect to. If you do not specify a name then "default" will be used. - ${chalk.green('--wallet [file]')} Set the wallet to interact with your process. By Default one is created for you at ~/.aos.json - ${chalk.green('--mainnet [mainnet-node-url]')} Set the AO Mainnet (HyperBEAM) URL to connect to. - ${chalk.green('--topup')} Topup balance on an AO Mainnet (HyperBEAM) node (must be used alongside --mainnet). - ${chalk.green('--watch=[process]')} Watch the console of a process, even if you are not the owner. - ${chalk.green('--load [file]')} Load Lua source file(s) into your process. - ${chalk.green('--run ""')} Execute a single Lua expression non-interactively and exit (suppressing splash output). - ${chalk.green('--hyper')} Prefer hyper-aos when used with --run for non-interactive execution. - ${chalk.green('--list')} Lists the processes for your wallet. - ${chalk.green('--data [file]')} Set a file as the data when spawning a new process. - ${chalk.green('--tag-name [name]')} Set a tag name for your process when spawning. Pair with --tag-value. - ${chalk.green('--tag-value [value]')} Set a tag value for your process when spawning. Pair with --tag-name. - ${chalk.green('--module=[TXID]')} The module ID to use when spawning a process. - ${chalk.green('--cron [frequency]-[unit]')} Setup automated messages for your process for a given interval. For example: 1-minute, 30-second. - ${chalk.green('--monitor')} Monitor and push cron outbox messages and spawns. - ${chalk.green('--get-blueprints [dir]')} Download blueprint Lua scripts to your current working directory. - ${chalk.green('--gateway-url')} Set Arweave gateway location. - ${chalk.green('--cu-url')} Set Compute Unit location. - ${chalk.green('--mu-url')} Set Messenger Unit location - ${chalk.green('--sqlite')} Spawn AOS process using sqlite3 AOS Module ie [[ aos [name] --sqlite ]] - ${chalk.green('--version')} Show AOS client version number - ${chalk.green('--help')} Shows this help page. -`) - -} \ No newline at end of file + printWithBorder([ + chalk.gray('Welcome to the AOS client! AOS allows you to build and interact with AO processes.'), + 'newline', + chalk.gray('Documentation: ') + chalk.green('https://cookbook_ao.g8way.io'), + 'newline', + chalk.gray('Options:'), + 'newline', + chalk.green('[name]') + ' The name of the process you want to spawn or connect to. If you do not specify a name then "default" will be used.', + 'newline', + chalk.green('--wallet [file]') + ' Set the wallet to interact with your process. By Default one is created for you at ~/.aos.json', + chalk.green('--mainnet [mainnet-node-url]') + ' Set the AO Mainnet (HyperBEAM) URL to connect to.', + chalk.green('--watch=[process]') + ' Watch the console of a process, even if you are not the owner.', + chalk.green('--load [file]') + ' Load Lua source file(s) into your process.', + chalk.green('--run ""') + ' Execute a single Lua expression non-interactively and exit (suppressing splash output).', + chalk.green('--list') + ' Lists the processes for your wallet.', + chalk.green('--data [file]') + ' Set a file as the data when spawning a new process.', + chalk.green('--tag-name [name]') + ' Set a tag name for your process when spawning. Pair with --tag-value.', + chalk.green('--tag-value [value]') + ' Set a tag value for your process when spawning. Pair with --tag-name.', + chalk.green('--module=[TXID]') + ' The module ID to use when spawning a process.', + chalk.green('--cron [frequency]-[unit]') + ' Setup automated messages for your process for a given interval. For example: 1-minute, 30-seconds.', + chalk.green('--monitor') + ' Monitor and push cron outbox messages and spawns.', + chalk.green('--get-blueprints [dir]') + ' Download blueprint Lua scripts to your current working directory.', + chalk.green('--gateway-url') + ' Set Arweave gateway location.', + chalk.green('--cu-url') + ' Set Compute Unit location.', + chalk.green('--mu-url') + ' Set Messenger Unit location', + chalk.green('--sqlite') + ' Spawn AOS process using sqlite3 AOS Module ie [[ aos [name] --sqlite ]]', + chalk.green('--version') + ' Show AOS client version number', + chalk.green('--help') + ' Shows this help page.', + 'newline', + ], { + title: 'AOS Help', + borderColor: chalk.gray, + titleColor: chalk.green, + truncate: true + }) +} diff --git a/src/services/history-service.js b/src/services/history-service.js index 18eb5bf77..192cd8b25 100644 --- a/src/services/history-service.js +++ b/src/services/history-service.js @@ -1,26 +1,26 @@ -import fs from 'fs'; -import path from 'path'; -import os from 'os'; +import fs from 'fs' +import path from 'path' +import os from 'os' -const historyFilePath = (processId) => { - return path.join(os.homedir(), `.${processId}.history`); -}; +const historyFilePath = processId => { + return path.join(os.homedir(), `.${processId}.history`) +} -export const readHistory = (processId) => { - const filePath = historyFilePath(processId); +export const readHistory = processId => { + const filePath = historyFilePath(processId) if (fs.existsSync(filePath)) { - return JSON.parse(fs.readFileSync(filePath, 'utf8')); + return JSON.parse(fs.readFileSync(filePath, 'utf8')) } - return []; -}; + return [] +} export const writeHistory = (processId, history) => { - const filePath = historyFilePath(processId); + const filePath = historyFilePath(processId) - try { - const historyToSave = history.slice(-100); // Only save the last 100 commands - fs.writeFileSync(filePath, JSON.stringify(historyToSave, null, 2)); - } catch (err) { - console.error('Error writing history file:', err); - } -}; \ No newline at end of file + try { + const historyToSave = history.slice(-100) // Only save the last 100 commands + fs.writeFileSync(filePath, JSON.stringify(historyToSave, null, 2)) + } catch (err) { + console.error('Error writing history file:', err) + } +} diff --git a/src/services/list.js b/src/services/list.js index 5bfc9134d..6f05b8331 100644 --- a/src/services/list.js +++ b/src/services/list.js @@ -1,35 +1,31 @@ -import { of } from 'hyper-async' import { map, find } from 'ramda' import minimist from 'minimist' -import * as utils from '../hyper-utils.js' -import { getPkg } from './get-pkg.js' +import * as utils from '../utils/hyper-utils.js' +import { printWithBorder } from '../utils/print.js' +import { chalk } from '../utils/colors.js' -export function list(jwk, services) { +export async function list(jwk, services) { const argv = minimist(process.argv.slice(2)) - const AOS_MODULE = process.env.AOS_MODULE || argv.module || getPkg().aos.module - const getAddress = ctx => services.address(ctx.jwk).map(address => ({ address, ...ctx })) - const listProcesses = ({ address }) => { - return services.gql(queryForAOSs(), { owners: [address] }) - .map(utils.path(['data', 'transactions', 'edges'])) - //.map(_ => (console.log(JSON.stringify(_, null, 2)), _)) - } - return of({ jwk }) - .chain(getAddress) + const address = await services.address(jwk) + const gqlResult = await services.gql(queryForAOSs(), { owners: [address] }) + const edges = utils.path(['data', 'transactions', 'edges'])(gqlResult) - .chain(listProcesses) + const processList = map(({ node }) => { + const pid = node.id + const name = find(t => t.name === 'Name', node.tags)?.value + const version = find(t => t.name.toLowerCase() === 'aos-version', node.tags)?.value + return `${`${name}`} - ${chalk.green(pid)} ${chalk.gray(`(v${version})`)}` + }, edges) - .map(map(({ node }) => { - const pid = node.id - const name = find(t => t.name == "Name", node.tags)?.value - const version = find(t => t.name == "aos-Version", node.tags)?.value - return `${name}:v${version || 'unknown'} - ${pid}` - })) - .map(list => ` - Your Processes: - - ${list.join('\n ')} - `) + printWithBorder([ + ...processList + ], { + title: 'Your Processes', + borderColor: chalk.gray, + titleColor: chalk.green, + truncate: true + }) } function queryForAOSs() { diff --git a/src/services/loading-files.js b/src/services/loading-files.js index cd1ba5495..8c015a07f 100644 --- a/src/services/loading-files.js +++ b/src/services/loading-files.js @@ -24,22 +24,25 @@ export function checkLoadArgs() { */ /** - * @param {Module[]} project + * @param {Module[]} project * @returns {[string, Module[]]} */ export function createExecutableFromProject(project) { - const getModFnName = (name) => name.replace(/\.|-/g, '_').replace(/^_/, '') + const getModFnName = name => name.replace(/\.|-/g, '_').replace(/^_/, '') /** @type {Module[]} */ const contents = [] - // filter out repeated modules with different import names + // Filter out repeated modules with different import names // and construct the executable Lua code // (the main file content is handled separately) for (let i = 0; i < project.length - 1; i++) { const mod = project[i] - const existing = contents.find((m) => m.path === mod.path) - const moduleContent = (!existing && `-- module: "${mod.name}"\nlocal function _loaded_mod_${getModFnName(mod.name)}()\n${mod.content}\nend\n`) || '' + const existing = contents.find(m => m.path === mod.path) + const moduleContent = + (!existing && + `-- module: "${mod.name}"\nlocal function _loaded_mod_${getModFnName(mod.name)}()\n${mod.content}\nend\n`) || + '' const requireMapper = `\n_G.package.loaded["${mod.name}"] = _loaded_mod_${getModFnName(existing?.name || mod.name)}()` contents.push({ @@ -48,13 +51,10 @@ export function createExecutableFromProject(project) { }) } - // finally, add the main file + // Finally, add the main file contents.push(project[project.length - 1]) - return [ - contents.reduce((acc, con) => acc + '\n\n' + con.content, ''), - contents - ] + return [contents.reduce((acc, con) => acc + '\n\n' + con.content, ''), contents] } /** @@ -66,33 +66,28 @@ export function createProjectStructure(mainFile) { const sorted = [] const cwd = path.dirname(mainFile) - // checks if the sorted module list already includes a node - const isSorted = (node) => sorted.find( - (sortedNode) => sortedNode.path === node.path - ) + // Checks if the sorted module list already includes a node + const isSorted = node => sorted.find(sortedNode => sortedNode.path === node.path) - // recursive dfs algorithm + // Recursive dfs algorithm function dfs(currentNode) { - const unvisitedChildNodes = exploreNodes(currentNode, cwd).filter( - (node) => !isSorted(node) - ) + const unvisitedChildNodes = exploreNodes(currentNode, cwd).filter(node => !isSorted(node)) for (let i = 0; i < unvisitedChildNodes.length; i++) { dfs(unvisitedChildNodes[i]) } - if (!isSorted(currentNode)) - sorted.push(currentNode) + if (!isSorted(currentNode)) sorted.push(currentNode) } - // run DFS from the main file + // Run DFS from the main file dfs({ path: mainFile }) return sorted.filter( - // modules that were not read don't exist locally + // Modules that were not read don't exist locally // aos assumes that these modules have already been // loaded into the process, or they're default modules - (mod) => mod.content !== undefined + mod => mod.content !== undefined ) } @@ -105,20 +100,19 @@ export function createProjectStructure(mainFile) { function exploreNodes(node, cwd) { if (!fs.existsSync(node.path)) return [] - // set content + // Set content node.content = fs.readFileSync(node.path, 'utf-8') // Don't include requires that are commented (start with --) const requirePattern = /(? { + const requiredModules = + node.content.match(requirePattern)?.map(mod => { return { name: mod, path: path.join(cwd, mod.replace(/\./g, '/') + '.lua'), content: undefined } - } - ) || [] + }) || [] return requiredModules } diff --git a/src/services/mainnet.js b/src/services/mainnet.js index acfaa01fd..fb9b33777 100644 --- a/src/services/mainnet.js +++ b/src/services/mainnet.js @@ -5,199 +5,165 @@ * Permaweb via the mainnet environment. It enables sending messages * (`sendMessageMainnet`), spawning new AO processes (`spawnProcessMainnet`), * and monitoring live process outputs (`liveMainnet`, `printLiveMainnet`). It - * leverages functional asynchronous patterns (`hyper-async`), AO Connect SDK - * (`@permaweb/aoconnect`), and scheduled tasks (`node-cron`) to facilitate - * robust and continuous interactions with the Permaweb and AO network. + * uses async/await for clearer control flow. */ import { connect, createSigner } from '@permaweb/aoconnect' -import { of, fromPromise, Resolved, Rejected } from 'hyper-async' -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' import { getPkg } from './get-pkg.js' import cron from 'node-cron' import fs from 'fs' import path from 'path' import os from 'os' import ora from 'ora' -import readline from 'readline'; -import { uniqBy, prop, keys } from 'ramda' +import readline from 'readline' +import { keys } from 'ramda' +import { config } from '../config.js' import Arweave from 'arweave' -import prompts from 'prompts' +import { printWithoutDisruption } from '../utils/terminal.js' const arweave = Arweave.init({}) const pkg = getPkg() -const setupMainnet = (wallet) => { + +const setupMainnet = wallet => { const options = { MODE: 'mainnet', - device: 'process@1.0', signer: createSigner(wallet), GATEWAY_URL: process.env.GATEWAY_URL, - URL: process.env.AO_URL + URL: process.env.AO_URL, + SCHEDULER: process.env.SCHEDULER ?? config.addresses.SCHEDULER_MAINNET } return connect(options) } -const assoc = (k, v, o) => { - o[k] = v - return o -} - -const parseWasmBody = (body) => { +const parseWasmBody = body => { try { return JSON.parse(body) } catch (e) { - return ({ Error: 'Could not parse result!' }) + return { Error: 'Could not parse result!' } } } -const handleResults = (resBody) => - resBody.info === 'hyper-aos' - ? ({ Output: resBody.output, Error: resBody.error }) - : parseWasmBody(resBody.json?.body) - -export function sendMessageMainnet({ processId, wallet, tags, data }, spinner) { - const { request } = setupMainnet(wallet) - const submitRequest = fromPromise(request) - const params = { - type: 'Message', - path: `/${processId}/push`, - method: 'POST', - ...tags.reduce((a, t) => assoc(t.name.toLowerCase(), t.value, a), {}), - 'data-protocol': 'ao', - target: processId, - "signing-format": "ANS-104", - accept: 'application/json' +const resolveAuthority = async () => { + if (process.env.AUTHORITY) return process.env.AUTHORITY; + else { + const authority = await fetch(`${process.env.AO_URL}/~meta@1.0/info/address`).then(res => res.text()); + return authority; } - // set data if needed - if (data) { - params.data = data - } - return of(params) - .chain(submitRequest) - .map(prop('body')) - .map(JSON.parse) - .map(handleResults) } -const setScheduler = fromPromise(async function (ctx) { - let scheduler = process.env.SCHEDULER - if (scheduler === "undefined" || scheduler === undefined) { - let schedulerUrl = process.env.AO_URL - if (schedulerUrl === 'https://forward.computer') { - schedulerUrl = 'https://scheduler.forward.computer' - } - scheduler = await fetch(schedulerUrl + '/~meta@1.0/info/address') - .then(r => r.text()) - } - ctx['scheduler'] = scheduler - - return ctx - -}) - -const setAuthority = fromPromise(async function (ctx) { - let authority = process.env.AUTHORITY - - // https://forward.computer/~meta@1.0/info/node_processes/router/trusted - // or https://forward.computer/~meta@1.0/info/node_processes/router/trusted - if (authority === "undefined" || authority === undefined ) { - if (process.env.AO_URL === 'https://forward.computer') { - authority = "QWg43UIcJhkdZq6ourr1VbnkwcP762Lppd569bKWYKY" - } else { - authority = await fetch(process.env.AO_URL + '/~meta@1.0/info/address') - .then(r => r.text()) - } - authority = authority + ',fcoN_xJeisVsPXA-trzVAuIiqO3ydLQxM-L4XbrQKzY' - } - // ctx['authority'] = authority - ctx['authority'] = authority - - return ctx -}) - -export function spawnProcessMainnet({ wallet, src, tags, data, isHyper }) { - // const SCHEDULER = process.env.SCHEDULER || "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA" - // const AUTHORITY = process.env.AUTHORITY || SCHEDULER - - const { request } = setupMainnet(wallet) - const submitRequest = fromPromise(request) - - const getExecutionDevice = fromPromise(async function (params) { - const executionDevice = await prompts({ - type: 'select', - name: 'device', - message: 'Please select a device', - choices: [{ title: 'genesis-wasm@1.0', value: 'genesis-wasm@1.0' }, { title: 'lua@5.3a (experimental)', value: 'lua@5.3a' }], - instructions: false - }).then(res => res.device).catch(e => "genesis-wasm@1.0") - params['execution-device'] = executionDevice - return Promise.resolve(params) - }) +export async function spawnProcessMainnet({ wallet, src, tags, data }) { + const { spawn } = setupMainnet(wallet) + try { + const authority = await resolveAuthority(); - const params = { - path: '/push', - method: 'POST', - type: 'Process', - device: 'process@1.0', - 'scheduler-device': 'scheduler@1.0', - 'push-device': 'push@1.0', - 'execution-device': 'lua@5.3a', - // 'execution-device': 'stack@1.0', - // 'device-stack/1': 'dedup@1.0', - // 'device-stack/2': 'lua@5.3a', - 'data-protocol': 'ao', - variant: 'ao.N.1', - ...tags.reduce((a, t) => assoc(t.name.toLowerCase(), t.value, a), {}), - 'aos-version': pkg.version, - 'signing-format': 'ANS-104' - } - if (data) { - params.data = data + const processId = await spawn({ + tags: [ + ...tags, + { name: 'aos-version', value: pkg.version }, + { name: 'process-timestamp', value: Date.now().toString() } + ], + authority: authority, + module: src, + data: data + }) + return processId + } catch (e) { + console.error(e) + throw new Error(e.message ?? 'Error spawning process') } - return of(params) - .chain(setScheduler) - .chain(setAuthority) - .chain(params => isHyper ? of(params) : getExecutionDevice(params)) - .map(p => { - //if (p['execution-device'] === 'stack@1.0') { - if (p['execution-device'] === 'lua@5.3a') { - p.module = process.env.AOS_MODULE || pkg.hyper.module - } else { - p.module = src - } - return p +} + +export async function sendMessageMainnet({ processId, wallet, tags, data }) { + const { message, result } = setupMainnet(wallet) + try { + // Pause cron jobs to prevent race conditions + _cronPaused = true + + const slot = await message({ + process: processId, + tags: [...tags, { name: 'message-timestamp', value: Date.now().toString() }], + data: data + }) + + // Fetch the result + const resultData = await result({ + slot: slot, + process: processId }) - .chain(submitRequest) - .map(prop('process')) - + // Update cursor file and mark slot as processed to prevent liveMainnet from re-processing this result + const cursorFile = path.resolve(os.homedir() + `/.${processId}.txt`) + fs.writeFileSync(cursorFile, slot.toString()) + + // Mark this slot as already processed + _processedSlots.add(parseInt(slot)) + + // Resume cron jobs + _cronPaused = false + + return resultData + } catch (e) { + // Resume cron jobs even on error + _cronPaused = false + console.error(e) + throw new Error(e.message ?? 'Error sending message') + } +} + +export async function readResultMainnet({ message, process: processId }) { + const wallet = + typeof process.env.WALLET == 'string' ? JSON.parse(process.env.WALLET) : process.env.WALLET + const { result } = setupMainnet(wallet) + + try { + return await result({ + message: message, + process: processId + }) + } catch (e) { + throw new Error(e.message ?? 'Error reading result') + } } let _watch = false +let _processedSlots = new Set() +let _cronPaused = false export function printLiveMainnet() { + // Don't print if cron is paused (during sendMessageMainnet) + if (_cronPaused) return + keys(globalThis.alerts).map(k => { - // if (globalThis.alerts[k]) { - // console.log(globalThis.alerts[k]) - // } if (globalThis.alerts[k] && globalThis.alerts[k].print) { + // Double-check we haven't already printed this slot + const slotNum = parseInt(k) + if (_processedSlots.has(slotNum)) { + globalThis.alerts[k].print = false + return + } + globalThis.alerts[k].print = false + _processedSlots.add(slotNum) - if (!_watch) { - process.stdout.write("\u001b[2K"); - } else { - process.stdout.write('\n') + // Update prompt if needed + if (globalThis.alerts[k].prompt) { + globalThis.prompt = globalThis.alerts[k].prompt + if (globalThis.setPrompt) { + globalThis.setPrompt(globalThis.prompt) + } } - process.stdout.write("\u001b[0G" + globalThis.alerts[k].data) - - globalThis.prompt = globalThis.alerts[k].prompt || "aos> " - globalThis.setPrompt(globalThis.prompt || "aos> ") - process.stdout.write('\n' + globalThis.prompt || "aos> ") + // Print without disrupting user input (don't show separator - it's handled by prompt) + if (globalThis.rl) { + printWithoutDisruption(globalThis.alerts[k].data, globalThis.rl, false) + } else { + // Fallback if readline not available + process.stdout.write('\n' + globalThis.alerts[k].data + '\n') + } } }) - } export async function liveMainnet(id, watch) { @@ -212,221 +178,249 @@ export async function liveMainnet(id, watch) { let isJobRunning = false const checkLive = async () => { - const wallet = typeof process.env.WALLET == 'string' ? JSON.parse(process.env.WALLET) : process.env.WALLET - const { request } = setupMainnet(wallet) + // Don't run if cron is paused (during sendMessageMainnet) + if (_cronPaused) return + + const wallet = + typeof process.env.WALLET == 'string' ? JSON.parse(process.env.WALLET) : process.env.WALLET + + const { results } = setupMainnet(wallet) + if (!isJobRunning) { try { - isJobRunning = true; - // Get the current slot - const currentSlotPath = `/${id}/slot/current` // LIVE PARAMS - const currentSlotParams = { - path: currentSlotPath, - method: 'GET' - } - const currentSlot = await request(currentSlotParams) - .then(res => Number(res.body || '0')) + isJobRunning = true - if (isNaN(cursor)) { - cursor = currentSlot + 1 - } - // Eval up to the current slot - while (cursor <= currentSlot) { - const path = `/${id}/compute=${cursor}` // LIVE PARAMS - const params = { - path, - method: 'GET', - accept: 'application/json', - 'accept-bundle': 'true' - } - const results = await request(params) - .then(res => res.body) - .then(JSON.parse) - .then(prop('results')) - .then(handleResults) - // .catch(e => ({ Output: {}})) - - // If results, add to alerts - if (!globalThis.alerts[cursor]) { - globalThis.alerts[cursor] = results.Output || results.Error + const resultsData = await results({ process: id }) + + if (resultsData?.edges?.length > 0) { + const edge = resultsData.edges[0] + const currentSlot = parseInt(edge.cursor) + const resultNode = edge.node + + if (isNaN(cursor)) { + cursor = currentSlot } - // Update cursor - if (results.Output || results.Error) { - cursor++ + // Only process if current slot is greater than our cursor AND hasn't been processed yet + // Cursor represents the last slot we've already processed + if (currentSlot > cursor && !_processedSlots.has(currentSlot)) { + // Add to alerts (will be printed by printLiveMainnet) + if (!globalThis.alerts[currentSlot]) { + globalThis.alerts[currentSlot] = { + data: resultNode.Output?.data?.output || resultNode.Output?.data || '', + prompt: resultNode.Output?.data?.prompt || resultNode.Output?.prompt, + print: true + } + } + + // Update cursor (don't add to _processedSlots yet - that happens when printed) + cursor = currentSlot fs.writeFileSync(cursorFile, cursor.toString()) } } - } catch (e) { - // surpress error messages #195 - - // console.log(chalk.red('An error occurred with live updates...'), { e }) - // console.log('Message: ', chalk.gray(e.message)) - } finally { + } catch (e) {} finally { isJobRunning = false } } } ct = await cron.schedule('*/2 * * * * *', checkLive) + // Also print on a schedule to show async messages from other processes await cron.schedule('*/2 * * * * *', printLiveMainnet) return ct } function formatTopupAmount(num) { - let fixed = num.toFixed(12); - fixed = fixed.replace(/(\.\d*?[1-9])0+$/, '$1'); // trim trailing zeros - fixed = fixed.replace(/\.0+$/, ''); // remove trailing .0 if no decimals - return fixed; + let fixed = num.toFixed(12) + fixed = fixed.replace(/(\.\d*?[1-9])0+$/, '$1') // trim trailing zeros + fixed = fixed.replace(/\.0+$/, '') // remove trailing .0 if no decimals + return fixed } function fromDenominatedAmount(num) { - const result = num / Math.pow(10, 12); - return result.toFixed(12).replace(/\.?0+$/, ''); + const result = num / Math.pow(10, 12) + return result.toFixed(12).replace(/\.?0+$/, '') } export async function handleNodeTopup(jwk, insufficientBalance) { - const aoLegacy = connect({ MODE: 'legacy' }); - const aoMainnet = connect({ MODE: 'mainnet', signer: createSigner(jwk), URL: process.env.AO_URL }); + const aoLegacy = connect({ MODE: 'legacy' }) + const aoMainnet = connect({ MODE: 'mainnet', signer: createSigner(jwk), URL: process.env.AO_URL }) const PAYMENT = { token: '0syT13r0s0tgPmIed95bJnuSqaD29HQNN8D3ElLSrsc', subledger: 'iVplXcMZwiu5mn0EZxY-PxAkz_A9KOU0cmRE0rwej3E', ticker: 'AO' - }; + } const walletAddress = await arweave.wallets.getAddress(jwk) - console.log(`\n${chalk.gray('Wallet Address:')} ${chalk.yellow(walletAddress)}\n`); + console.log(`\n${chalk.gray('Wallet Address:')} ${chalk.yellow(walletAddress)}\n`) - if (insufficientBalance) console.log(chalk.gray(`You must transfer some ${PAYMENT.ticker} to this node in order to start sending messages.`)); + if (insufficientBalance) + console.log( + chalk.gray( + `You must transfer some ${PAYMENT.ticker} to this node in order to start sending messages.` + ) + ) let spinner = ora({ spinner: 'dots', suffixText: chalk.gray(`[Getting your ${PAYMENT.ticker} balance...]`) - }); - spinner.start(); + }) + spinner.start() - let balanceResponse; + let balanceResponse try { balanceResponse = await aoLegacy.dryrun({ process: PAYMENT.token, tags: [ { name: 'Action', value: 'Balance' }, - { name: 'Recipient', value: walletAddress }, + { name: 'Recipient', value: walletAddress } ] - }); - spinner.stop(); - } - catch (e) { - spinner.stop(); - console.log(chalk.red('Error getting your balance')); - process.exit(1); + }) + spinner.stop() + } catch (e) { + spinner.stop() + console.log(chalk.red('Error getting your balance')) + process.exit(1) } - const balance = balanceResponse?.Messages?.[0]?.Data; + const balance = balanceResponse?.Messages?.[0]?.Data if (balance) { - const getChalk = balance > 0 ? chalk.green : chalk.yellow; - console.log(chalk.gray('Current balance in wallet: ' + getChalk(`${fromDenominatedAmount(balance)} ${PAYMENT.ticker}`))); + const getChalk = balance > 0 ? chalk.green : chalk.yellow + console.log( + chalk.gray( + 'Current balance in wallet: ' + + getChalk(`${fromDenominatedAmount(balance)} ${PAYMENT.ticker}`) + ) + ) if (balance <= 0) { - console.log(chalk.red(`This wallet must hold some ${PAYMENT.ticker} in order to transfer to the relay.`)); - process.exit(1); + console.log( + chalk.red(`This wallet must hold some ${PAYMENT.ticker} in order to transfer to the relay.`) + ) + process.exit(1) } } const rl = readline.createInterface({ input: process.stdin, output: process.stdout - }); + }) - const ask = (question) => new Promise(resolve => rl.question(question, answer => resolve(answer))); + const ask = question => new Promise(resolve => rl.question(question, answer => resolve(answer))) - let continueWithTopup = true; + let continueWithTopup = true - console.log(chalk.gray('\nGetting current balance in node...')); - let currentNodeBalance; + console.log(chalk.gray('\nGetting current balance in node...')) + let currentNodeBalance try { - const balanceRes = await fetch(`${process.env.AO_URL}/ledger~node-process@1.0/now/balance/${walletAddress}`); + const balanceRes = await fetch( + `${process.env.AO_URL}/ledger~node-process@1.0/now/balance/${walletAddress}` + ) if (balanceRes.ok) { - const balance = await balanceRes.text(); - currentNodeBalance = Number.isNaN(balance) ? 0 : balance; - } - else { - currentNodeBalance = 0; + const balance = await balanceRes.text() + currentNodeBalance = Number.isNaN(balance) ? 0 : balance + } else { + currentNodeBalance = 0 } - console.log(chalk.gray('Current balance in node: ' + chalk.green(`${fromDenominatedAmount(currentNodeBalance)} ${PAYMENT.ticker}\n`))); - + console.log( + chalk.gray( + 'Current balance in node: ' + + chalk.green(`${fromDenominatedAmount(currentNodeBalance)} ${PAYMENT.ticker}\n`) + ) + ) } catch (e) { - console.error(e); - process.exit(1); + console.error(e) + process.exit(1) } if (insufficientBalance) { - const answer = await ask(chalk.gray('Insufficient funds. Would you like to top up? (Y/N): ')); - continueWithTopup = answer.trim().toLowerCase().startsWith('y'); + const answer = await ask(chalk.gray('Insufficient funds. Would you like to top up? (Y/N): ')) + continueWithTopup = answer.trim().toLowerCase().startsWith('y') } if (continueWithTopup) { - let topupAmount = 0.0000001; - - if (insufficientBalance) console.log(chalk.gray('Minimum amount required: ' + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}`))); - const amountAnswer = await ask(chalk.gray(`Enter topup amount (leave blank for ${chalk.green(formatTopupAmount(topupAmount))} ${PAYMENT.ticker}): `)); - if (amountAnswer?.length) topupAmount = parseFloat(amountAnswer); + let topupAmount = 0.0000001 + + if (insufficientBalance) + console.log( + chalk.gray( + 'Minimum amount required: ' + + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}`) + ) + ) + const amountAnswer = await ask( + chalk.gray( + `Enter topup amount (leave blank for ${chalk.green(formatTopupAmount(topupAmount))} ${PAYMENT.ticker}): ` + ) + ) + if (amountAnswer?.length) topupAmount = parseFloat(amountAnswer) if (isNaN(topupAmount) || topupAmount <= 0) { - console.log(chalk.red('Invalid topup amount provided. Topup cancelled.')); - process.exit(1); + console.log(chalk.red('Invalid topup amount provided. Topup cancelled.')) + process.exit(1) } - console.log(chalk.gray('Topping up with amount: ' + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}\n`))); + console.log( + chalk.gray( + 'Topping up with amount: ' + + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}\n`) + ) + ) - rl.close(); + rl.close() spinner = ora({ spinner: 'dots', suffixText: chalk.gray('[Transferring balance to node...]') - }); - spinner.start(); + }) + spinner.start() - const sendQuantity = (topupAmount * Math.pow(10, 12)).toString(); + const sendQuantity = (topupAmount * Math.pow(10, 12)).toString() - const currentBetaGZAOBalance = (await aoLegacy.dryrun({ - process: PAYMENT.subledger, - tags: [ - { name: 'Action', value: 'Balance' }, - { name: 'Recipient', value: walletAddress } - ] - })).Messages[0].Data; + const currentBetaGZAOBalance = ( + await aoLegacy.dryrun({ + process: PAYMENT.subledger, + tags: [ + { name: 'Action', value: 'Balance' }, + { name: 'Recipient', value: walletAddress } + ] + }) + ).Messages[0].Data const transferId = await aoLegacy.message({ process: PAYMENT.token, tags: [ { name: 'Action', value: 'Transfer' }, { name: 'Quantity', value: sendQuantity }, - { name: 'Recipient', value: PAYMENT.subledger }, + { name: 'Recipient', value: PAYMENT.subledger } ], signer: createSigner(jwk) - }); + }) await aoLegacy.result({ process: PAYMENT.token, message: transferId - }); + }) - let updatedBetaGZAOBalance; + let updatedBetaGZAOBalance do { - await new Promise((r) => setTimeout(r, 2000)); - updatedBetaGZAOBalance = (await aoLegacy.dryrun({ - process: PAYMENT.subledger, - tags: [ - { name: 'Action', value: 'Balance' }, - { name: 'Recipient', value: walletAddress } - ] - })).Messages[0].Data; - } - while (updatedBetaGZAOBalance === currentBetaGZAOBalance) - - const ledgerAddressRes = await fetch(`${process.env.AO_URL}/ledger~node-process@1.0/commitments/keys/1`); - const ledgerAddress = await ledgerAddressRes.text(); + await new Promise(r => setTimeout(r, 2000)) + updatedBetaGZAOBalance = ( + await aoLegacy.dryrun({ + process: PAYMENT.subledger, + tags: [ + { name: 'Action', value: 'Balance' }, + { name: 'Recipient', value: walletAddress } + ] + }) + ).Messages[0].Data + } while (updatedBetaGZAOBalance === currentBetaGZAOBalance) + + const ledgerAddressRes = await fetch( + `${process.env.AO_URL}/ledger~node-process@1.0/commitments/keys/1` + ) + const ledgerAddress = await ledgerAddressRes.text() const transferParams = { type: 'Message', @@ -442,38 +436,41 @@ export async function handleNodeTopup(jwk, insufficientBalance) { quantity: sendQuantity } - const transferRes = await aoMainnet.request(transferParams); + const transferRes = await aoMainnet.request(transferParams) if (transferRes.status === '200') { - let updatedNodeBalance; + let updatedNodeBalance do { try { - const balanceRes = await fetch(`${process.env.AO_URL}/ledger~node-process@1.0/now/balance/${walletAddress}`); + const balanceRes = await fetch( + `${process.env.AO_URL}/ledger~node-process@1.0/now/balance/${walletAddress}` + ) if (balanceRes.ok) { - const balance = await balanceRes.text(); - updatedNodeBalance = Number.isNaN(balance) ? 0 : balance; - } - else { - updatedNodeBalance = 0; + const balance = await balanceRes.text() + updatedNodeBalance = Number.isNaN(balance) ? 0 : balance + } else { + updatedNodeBalance = 0 } if (currentNodeBalance !== updatedNodeBalance) { - spinner.stop(); - console.log(chalk.gray('Updated balance in node: ' + chalk.green(`${fromDenominatedAmount(updatedNodeBalance)} ${PAYMENT.ticker}`))); + spinner.stop() + console.log( + chalk.gray( + 'Updated balance in node: ' + + chalk.green(`${fromDenominatedAmount(updatedNodeBalance)} ${PAYMENT.ticker}`) + ) + ) } - } catch (e) { - console.error(e); - process.exit(1); + console.error(e) + process.exit(1) } - } - while (currentNodeBalance === updatedNodeBalance); + } while (currentNodeBalance === updatedNodeBalance) - return true; - } - else { - console.log(chalk.red('Error handling node topup.')); - process.exit(1); + return true + } else { + console.log(chalk.red('Error handling node topup.')) + process.exit(1) } } } diff --git a/src/services/process-type.js b/src/services/process-type.js index 2e385926c..68e60ea64 100644 --- a/src/services/process-type.js +++ b/src/services/process-type.js @@ -1,4 +1,5 @@ export function resolveProcessTypeFromFlags(argv = {}) { + if (!argv.legacy) return 'mainnet' if (argv.hyper) return 'hyper' if (argv.run) return 'aos' return null diff --git a/src/services/proxy.js b/src/services/proxy.js index 6beda19e6..05adafef1 100644 --- a/src/services/proxy.js +++ b/src/services/proxy.js @@ -1,9 +1,9 @@ -import { ProxyAgent } from 'undici'; +import { ProxyAgent } from 'undici' if (process.env.HTTPS_PROXY) { - const proxyAgent = new ProxyAgent(process.env.HTTPS_PROXY); + const proxyAgent = new ProxyAgent(process.env.HTTPS_PROXY) const nodeFetch = globalThis.fetch globalThis.fetch = function (url, options) { return nodeFetch(url, { ...options, dispatcher: proxyAgent }) } -} \ No newline at end of file +} diff --git a/src/services/relay.js b/src/services/relay.js index e21698065..c0b2d2c76 100644 --- a/src/services/relay.js +++ b/src/services/relay.js @@ -1,9 +1,8 @@ import { createPrivateKey } from 'node:crypto' import { connect } from '@permaweb/aoconnect' -import { fromPromise, Resolved, Rejected } from 'hyper-async' -import readline from 'readline'; +import readline from 'readline' import ora from 'ora' -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' import { getPkg } from './get-pkg.js' import cron from 'node-cron' import fs from 'fs' @@ -19,7 +18,7 @@ const arweave = Arweave.init({}) const pkg = getPkg() -const setupRelay = (wallet) => { +const setupRelay = wallet => { const info = { GATEWAY_URL: process.env.GATEWAY_URL, CU_URL: 'http://cu.s451-comm3-main.xyz', @@ -34,92 +33,102 @@ const setupRelay = (wallet) => { }) } -export function readResultRelay(params) { +// Helper function to retry with delay +async function retryWithDelay( + fn, + maxRetries = 10, + delayMs = 500, + spinner = null, + initialRetries = '.' +) { + let retries = initialRetries + let lastError + + for (let attempt = 0; attempt < maxRetries; attempt++) { + try { + if (attempt > 0) { + await new Promise(r => setTimeout(r, delayMs)) + if (spinner) { + spinner.suffixText = chalk.gray('[Processing' + retries + ']') + } else { + console.log(chalk.gray('.')) + } + retries += '.' + } + return await fn() + } catch (error) { + lastError = error + if (attempt === maxRetries - 1) { + throw lastError + } + } + } + throw lastError +} + +export async function readResultRelay(params) { const wallet = JSON.parse(process.env.WALLET) const { result } = setupRelay(wallet) - return fromPromise(() => - new Promise((resolve) => setTimeout(() => resolve(params), 1000)) - )() - .chain(fromPromise(() => result(params))) - .bichain(fromPromise(() => - new Promise((resolve, reject) => setTimeout(() => reject(params), 500)) - ), - Resolved - ) + + await new Promise(resolve => setTimeout(resolve, 1000)) + + try { + return await result(params) + } catch (error) { + await new Promise(resolve => setTimeout(resolve, 500)) + throw params + } } -export function dryrunRelay({ processId, wallet, tags, data }, spinnner) { +export async function dryrunRelay({ processId, wallet, tags, data }, spinner) { const { dryrun } = setupRelay(wallet) - return fromPromise(() => - arweave.wallets.jwkToAddress(wallet).then(Owner => - dryrun({ process: processId, Owner, tags, data }) - ) - )() + const Owner = await arweave.wallets.jwkToAddress(wallet) + return await dryrun({ process: processId, Owner, tags, data }) } - -export function sendMessageRelay({ processId, wallet, tags, data }, spinner) { - let retries = "." +export async function sendMessageRelay({ processId, wallet, tags, data }, spinner) { const { message, createDataItemSigner } = setupRelay(wallet) - const retry = () => fromPromise(() => new Promise(r => setTimeout(r, 500)))() - .map(_ => { - spinner ? spinner.suffixText = chalk.gray('[Processing' + retries + ']') : console.log(chalk.gray('.')) - retries += "." - return _ - }) - .chain(fromPromise(() => message({ process: processId, signer: createDataItemSigner(), tags, data }))) - - return fromPromise(() => - new Promise((resolve) => setTimeout(() => resolve(), 500)) - )().chain(fromPromise(() => - message({ process: processId, signer: createDataItemSigner(), tags, data }) - )) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) - .bichain(retry, Resolved) + // Initial delay + await new Promise(resolve => setTimeout(resolve, 500)) + return await retryWithDelay( + () => message({ process: processId, signer: createDataItemSigner(), tags, data }), + 10, + 500, + spinner + ) } -export function spawnProcessRelay({ wallet, src, tags, data }) { - // const SCHEDULER = process.env.SCHEDULER || "_GQ33BkPtZrqxA84vM8Zk-N2aO0toNNu_C-l-rawrBA" - const SCHEDULER = "eyhFer638JG-fJFEC3X3Q5kAl78aTe1eljYDiQo0vuU" +export async function spawnProcessRelay({ wallet, src, tags, data }) { + const SCHEDULER = 'eyhFer638JG-fJFEC3X3Q5kAl78aTe1eljYDiQo0vuU' const { spawn, createDataItemSigner } = setupRelay(wallet) - tags = tags.concat([ { name: 'aos-Version', value: pkg.version }, { name: 'Authority', value: 'tYRUqrx6zuFFiix3MoSBYSPP3nMzi5EKf-lVYDEQz8A' } ]) - return fromPromise(() => spawn({ - module: src, scheduler: SCHEDULER, signer: createDataItemSigner(), tags, data + + const result = await spawn({ + module: src, + scheduler: SCHEDULER, + signer: createDataItemSigner(), + tags, + data }) - .then(result => new Promise((resolve) => setTimeout(() => resolve(result), 500))) - )() + await new Promise(resolve => setTimeout(resolve, 500)) + return result } -export function monitorProcessRelay({ id, wallet }) { +export async function monitorProcessRelay({ id, wallet }) { const { monitor, createDataItemSigner } = setupRelay(wallet) - - return fromPromise(() => monitor({ process: id, signer: createDataItemSigner() }))() - //.map(result => (console.log(result), result)) - + return await monitor({ process: id, signer: createDataItemSigner() }) } -export function unmonitorProcessRelay({ id, wallet }) { +export async function unmonitorProcessRelay({ id, wallet }) { const { unmonitor, createDataItemSigner } = setupRelay(wallet) - - return fromPromise(() => unmonitor({ process: id, signer: createDataItemSigner() }))() - //.map(result => (console.log(result), result)) - + return await unmonitor({ process: id, signer: createDataItemSigner() }) } let _watch = false @@ -130,19 +139,17 @@ export function printLiveRelay() { globalThis.alerts[k].print = false if (!_watch) { - process.stdout.write("\u001b[2K"); + process.stdout.write('\u001b[2K') } else { process.stdout.write('\n') } - process.stdout.write("\u001b[0G" + globalThis.alerts[k].data) - - globalThis.prompt = globalThis.alerts[k].prompt || "aos> " - globalThis.setPrompt(globalThis.prompt || "aos> ") - process.stdout.write('\n' + globalThis.prompt || "aos> ") + process.stdout.write('\u001b[0G' + globalThis.alerts[k].data) + globalThis.prompt = globalThis.alerts[k].prompt || 'aos> ' + globalThis.setPrompt(globalThis.prompt || 'aos> ') + process.stdout.write('\n' + globalThis.prompt || 'aos> ') } }) - } export async function liveRelay(id, watch) { @@ -160,7 +167,10 @@ export async function liveRelay(id, watch) { if (ct && !stopped) { ct.stop() stopped = true - setTimeout(() => { ct.start(); stopped = false }, 60000) + setTimeout(() => { + ct.start() + stopped = false + }, 60000) } }) @@ -170,43 +180,45 @@ export async function liveRelay(id, watch) { const wallet = process.env.WALLET const { results } = setupRelay(wallet) if (!isJobRunning) { - try { - isJobRunning = true; + isJobRunning = true let params = { process: id, limit: 1000 } if (cursor) { - params["from"] = cursor + params['from'] = cursor } else { - params["limit"] = 5 - params["sort"] = "DESC" + params['limit'] = 5 + params['sort'] = 'DESC' } const _relayResults = await results(params) - let edges = uniqBy(prop('cursor'))(_relayResults.edges.filter(function (e) { - if (e.node?.Output?.print === true) { - return true - } - if (e.cursor === cursor) { + let edges = uniqBy(prop('cursor'))( + _relayResults.edges.filter(function (e) { + if (e.node?.Output?.print === true) { + return true + } + if (e.cursor === cursor) { + return false + } return false - } - return false - })) + }) + ) // Sort the edges by ordinate value to ensure they are printed in the correct order. // TODO: Handle sorting with Cron jobs, considering nonces and timestamps. Review cursor usage for compatibility with future CU implementations. - edges = edges.sort((a, b) => JSON.parse(atob(a.cursor)).ordinate - JSON.parse(atob(b.cursor)).ordinate); + edges = edges.sort( + (a, b) => JSON.parse(atob(a.cursor)).ordinate - JSON.parse(atob(b.cursor)).ordinate + ) // --- peek on previous line and if delete line if last prompt. - // --- key event can detect - // count !== null && + // --- key event can detect + // Count !== null && if (edges.length > 0) { edges.map(e => { if (!globalThis.alerts[e.cursor]) { globalThis.alerts[e.cursor] = e.node?.Output } }) - } count = edges.length if (results.edges.length > 0) { @@ -214,10 +226,8 @@ export async function liveRelay(id, watch) { fs.writeFileSync(cursorFile, cursor) } //process.nextTick(() => null) - } catch (e) { - // surpress error messages #195 - + // Surpress error messages #195 // console.log(chalk.red('An error occurred with live updates...')) // console.log('Message: ', chalk.gray(e.message)) } finally { @@ -239,157 +249,187 @@ function httpSigName(address) { } function formatTopupAmount(num) { - let fixed = num.toFixed(12); - fixed = fixed.replace(/(\.\d*?[1-9])0+$/, '$1'); // trim trailing zeros - fixed = fixed.replace(/\.0+$/, ''); // remove trailing .0 if no decimals - return fixed; + let fixed = num.toFixed(12) + fixed = fixed.replace(/(\.\d*?[1-9])0+$/, '$1') // trim trailing zeros + fixed = fixed.replace(/\.0+$/, '') // remove trailing .0 if no decimals + return fixed } function fromDenominatedAmount(num) { - const result = num / Math.pow(10, 12); - return result.toFixed(12).replace(/\.?0+$/, ''); + const result = num / Math.pow(10, 12) + return result.toFixed(12).replace(/\.?0+$/, '') } export async function handleRelayTopup(jwk, insufficientBalance) { const RELAY = { url: `${process.env.RELAY_URL}/~simple-pay@1.0/balance` - }; + } const PAYMENT = { address: '0syT13r0s0tgPmIed95bJnuSqaD29HQNN8D3ElLSrsc', ticker: 'AO' - }; + } try { - const relayAddressResponse = await fetch(`${process.env.RELAY_URL}/~meta@1.0/info/address`); - RELAY.address = await relayAddressResponse.text(); - } - catch (e) { - console.log(chalk.red('Error getting relay information')); - process.exit(1); + const relayAddressResponse = await fetch(`${process.env.RELAY_URL}/~meta@1.0/info/address`) + RELAY.address = await relayAddressResponse.text() + } catch (e) { + console.log(chalk.red('Error getting relay information')) + process.exit(1) } - const { dryrun, message, createDataItemSigner } = connect({ MODE: 'legacy' }); + const { dryrun, message, createDataItemSigner } = connect({ MODE: 'legacy' }) const walletAddress = await arweave.wallets.getAddress(jwk) - console.log(`${chalk.gray('Wallet Address:')} ${chalk.yellow(walletAddress)}\n`); - - if (insufficientBalance) console.log(chalk.gray(`You must transfer some ${PAYMENT.ticker} to this relay in order to start sending messages.`)); + console.log(`${chalk.gray('Wallet Address:')} ${chalk.yellow(walletAddress)}\n`) + + if (insufficientBalance) + console.log( + chalk.gray( + `You must transfer some ${PAYMENT.ticker} to this relay in order to start sending messages.` + ) + ) let spinner = ora({ spinner: 'dots', suffixText: chalk.gray(`[Getting your ${PAYMENT.ticker} balance...]`) - }); - spinner.start(); + }) + spinner.start() - let balanceResponse; + let balanceResponse try { balanceResponse = await dryrun({ process: PAYMENT.address, tags: [ { name: 'Action', value: 'Balance' }, - { name: 'Recipient', value: walletAddress }, + { name: 'Recipient', value: walletAddress } ] - }); - spinner.stop(); - } - catch (e) { - spinner.stop(); - console.log(chalk.red('Error getting your balance')); - process.exit(1); + }) + spinner.stop() + } catch (e) { + spinner.stop() + console.log(chalk.red('Error getting your balance')) + process.exit(1) } - const balance = balanceResponse?.Messages?.[0]?.Data; + const balance = balanceResponse?.Messages?.[0]?.Data if (balance) { - const getChalk = balance > 0 ? chalk.green : chalk.yellow; - console.log(chalk.gray('Current balance in wallet: ' + getChalk(`${fromDenominatedAmount(balance)} ${PAYMENT.ticker}`))); + const getChalk = balance > 0 ? chalk.green : chalk.yellow + console.log( + chalk.gray( + 'Current balance in wallet: ' + + getChalk(`${fromDenominatedAmount(balance)} ${PAYMENT.ticker}`) + ) + ) if (balance <= 0) { - console.log(chalk.red(`This wallet must hold some ${PAYMENT.ticker} in order to transfer to the relay.`)); - process.exit(1); + console.log( + chalk.red(`This wallet must hold some ${PAYMENT.ticker} in order to transfer to the relay.`) + ) + process.exit(1) } } - const address = await arweave.wallets.getAddress(jwk); - const privateKey = createPrivateKey({ key: jwk, format: 'jwk' }); - const signer = createSigner(privateKey, 'rsa-pss-sha512', address); - const params = ['alg', 'keyid'].sort(); - - const relayUrl = new URL(RELAY.url); - const request = { - url: relayUrl, - method: 'GET', - headers: { - 'path': relayUrl.pathname, - } - }; + const address = await arweave.wallets.getAddress(jwk) + const privateKey = createPrivateKey({ key: jwk, format: 'jwk' }) + const signer = createSigner(privateKey, 'rsa-pss-sha512', address) + const params = ['alg', 'keyid'].sort() + + const relayUrl = new URL(RELAY.url) + const request = { + url: relayUrl, + method: 'GET', + headers: { + path: relayUrl.pathname + } + } - const { method, headers } = await signMessage({ + const { method, headers } = await signMessage( + { key: signer, fields: [...Object.keys(request.headers)].sort(), name: httpSigName(address), params - }, request); + }, + request + ) const rl = readline.createInterface({ input: process.stdin, output: process.stdout - }); + }) + + const ask = question => new Promise(resolve => rl.question(question, answer => resolve(answer))) - const ask = (question) => new Promise(resolve => rl.question(question, answer => resolve(answer))); + let continueWithTopup = true - let continueWithTopup = true; - - let currentRelayBalance; + let currentRelayBalance if (insufficientBalance) { - const answer = await ask(chalk.gray('Insufficient funds. Would you like to top up? (Y/N): ')); - continueWithTopup = answer.trim().toLowerCase().startsWith('y'); - } - else { + const answer = await ask(chalk.gray('Insufficient funds. Would you like to top up? (Y/N): ')) + continueWithTopup = answer.trim().toLowerCase().startsWith('y') + } else { try { - const response = await fetch(RELAY.url, { method, headers }); - const balance = parseInt(await response.text(), 10); - currentRelayBalance = Number.isNaN(balance) ? 0 : balance; - console.log(chalk.gray('Current balance in relay: ' + chalk.green(`${fromDenominatedAmount(currentRelayBalance)} ${PAYMENT.ticker}\n`))); - + const response = await fetch(RELAY.url, { method, headers }) + const balance = parseInt(await response.text(), 10) + currentRelayBalance = Number.isNaN(balance) ? 0 : balance + console.log( + chalk.gray( + 'Current balance in relay: ' + + chalk.green(`${fromDenominatedAmount(currentRelayBalance)} ${PAYMENT.ticker}\n`) + ) + ) } catch (e) { - console.error('Error fetching balance endpoint:', e); + console.error('Error fetching balance endpoint:', e) } } if (continueWithTopup) { - let topupAmount = 0.0000001; // TODO: Get minimum amount - const maxBalanceRetries = 20; - - if (insufficientBalance) console.log(chalk.gray('Minimum amount required: ' + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}`))); - const amountAnswer = await ask(chalk.gray(`Enter topup amount (leave blank for ${chalk.green(formatTopupAmount(topupAmount))} ${PAYMENT.ticker}): `)); - if (amountAnswer?.length) topupAmount = parseFloat(amountAnswer); + let topupAmount = 0.0000001 // TODO: Get minimum amount + const maxBalanceRetries = 20 + + if (insufficientBalance) + console.log( + chalk.gray( + 'Minimum amount required: ' + + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}`) + ) + ) + const amountAnswer = await ask( + chalk.gray( + `Enter topup amount (leave blank for ${chalk.green(formatTopupAmount(topupAmount))} ${PAYMENT.ticker}): ` + ) + ) + if (amountAnswer?.length) topupAmount = parseFloat(amountAnswer) if (isNaN(topupAmount) || topupAmount <= 0) { - console.log(chalk.red('Invalid topup amount provided. Topup cancelled.')); - rl.close(); - process.exit(1); + console.log(chalk.red('Invalid topup amount provided. Topup cancelled.')) + rl.close() + process.exit(1) } - console.log(chalk.gray('Topping up with amount: ' + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}\n`))); + console.log( + chalk.gray( + 'Topping up with amount: ' + + chalk.green(`${formatTopupAmount(topupAmount)} ${PAYMENT.ticker}\n`) + ) + ) spinner = ora({ spinner: 'dots', suffixText: chalk.gray('[Transferring balance to relay...]') - }); - spinner.start(); + }) + spinner.start() - if (!currentRelayBalance) { try { - const response = await fetch(RELAY.url, { method, headers }); - const balance = parseInt(await response.text(), 10); - currentRelayBalance = Number.isNaN(balance) ? 0 : balance; + const response = await fetch(RELAY.url, { method, headers }) + const balance = parseInt(await response.text(), 10) + currentRelayBalance = Number.isNaN(balance) ? 0 : balance } catch (e) { - console.error(chalk.red('Error fetching initial balance:'), e); + console.error(chalk.red('Error fetching initial balance:'), e) } } - const sendQuantity = (topupAmount * Math.pow(10, 12)).toString(); + const sendQuantity = (topupAmount * Math.pow(10, 12)).toString() try { await message({ @@ -398,44 +438,44 @@ export async function handleRelayTopup(jwk, insufficientBalance) { tags: [ { name: 'Action', value: 'Transfer' }, { name: 'Recipient', value: RELAY.address }, - { name: 'Quantity', value: sendQuantity }, + { name: 'Quantity', value: sendQuantity } ] - }); + }) } catch (e) { - console.error(chalk.red('Error sending transfer message:'), e); + console.error(chalk.red('Error sending transfer message:'), e) } - let balanceUpdated = false; + let balanceUpdated = false for (let attempt = 1; attempt <= maxBalanceRetries; attempt++) { try { - const response = await fetch(RELAY.url, { method, headers }); - const balance = parseInt(await response.text(), 10); - const newBalance = Number.isNaN(balance) ? 0 : balance; + const response = await fetch(RELAY.url, { method, headers }) + const balance = parseInt(await response.text(), 10) + const newBalance = Number.isNaN(balance) ? 0 : balance if (newBalance > currentRelayBalance) { - balanceUpdated = true; - spinner.stop(); + balanceUpdated = true + spinner.stop() console.log( chalk.gray( `Relay balance updated from ${chalk.green(fromDenominatedAmount(currentRelayBalance))} to ${chalk.green(fromDenominatedAmount(newBalance))} ${chalk.green(PAYMENT.ticker)}` ) - ); - break; + ) + break } } catch (e) { - console.error('Error fetching balance endpoint:', e); + console.error('Error fetching balance endpoint:', e) } - await new Promise(resolve => setTimeout(resolve, 2000)); + await new Promise(resolve => setTimeout(resolve, 2000)) } - rl.close(); + rl.close() if (!balanceUpdated) { - console.error(chalk.red('Balance did not update after topup.')); - process.exit(1); + console.error(chalk.red('Balance did not update after topup.')) + process.exit(1) } - return true; + return true } else { - console.log(chalk.gray('Topup cancelled')); - rl.close(); - process.exit(1); + console.log(chalk.gray('Topup cancelled')) + rl.close() + process.exit(1) } -} \ No newline at end of file +} diff --git a/src/services/splash.js b/src/services/splash.js index 76dbb8a13..bfb57d55a 100644 --- a/src/services/splash.js +++ b/src/services/splash.js @@ -1,15 +1,57 @@ -import chalk from 'chalk' -import figlet from 'figlet' - -export function splash() { - console.log(figlet.textSync("aOS", { - font: "Alpha", - horizontalLayout: "full", - verticalLayout: "full", - width: 80, - whitespaceBreak: true, - })) - console.log(chalk.green('Welcome to AOS: Your operating system for AO, the decentralized open access supercomputer.')) - console.log(chalk.gray('Type ".load-blueprint chat" to join the community chat and ask questions!')) +import { chalk } from '../utils/colors.js' +import { printWithBorder } from '../utils/print.js' +import { getPkg } from './get-pkg.js' +export function splash(options = {}) { + const pkg = getPkg() + + const lines = [ + 'Welcome to AOS: Your operating system for AO, the decentralized open access supercomputer.', + 'newline', + `Client Version: ${pkg.version}. 2025`, + ] + + if (options.walletAddress) { + lines.push('newline') + lines.push(('Wallet Address: ') + chalk.green(options.walletAddress)) + } + + if (Object.values(options).some(value => value)) { + lines.push('newline') + lines.push('divider') + } + + lines.push(('Network: ') + chalk.green(options.legacy ? 'Legacynet' : 'Mainnet')) + + if (options.mainnetUrl) { + lines.push(('Node: ') + chalk.green(options.mainnetUrl)) + } + + if (options.gatewayUrl) { + lines.push(('Gateway: ') + chalk.green(options.gatewayUrl)) + } + + if (options.cuUrl) { + lines.push(('CU: ') + chalk.green(options.cuUrl)) + } + + if (options.muUrl) { + lines.push(('MU: ') + chalk.green(options.muUrl)) + } + + if (options.authority) { + lines.push(('Authority: ') + chalk.green(options.authority)) + } + + if (options.scheduler) { + lines.push(('Scheduler: ') + chalk.green(options.scheduler)) + } + + lines.push('newline') + + printWithBorder(lines, { + title: 'AOS', + borderColor: chalk.gray, + titleColor: chalk.green, + }) } \ No newline at end of file diff --git a/src/services/version.js b/src/services/version.js index c7238bd36..ceeb57521 100644 --- a/src/services/version.js +++ b/src/services/version.js @@ -2,7 +2,7 @@ import semverCompare from 'semver/functions/compare.js' import { createGunzip } from 'zlib' import { Readable } from 'stream' import tar from 'tar-stream' -import chalk from 'chalk' +import { chalk } from '../utils/colors.js' import readline from 'readline/promises' import { getPkg } from './get-pkg.js' import path from 'path' @@ -16,78 +16,79 @@ export function version(id, options = {}) { return } - console.log(chalk.gray(` -AOS Client Version: ${pkg.version}. 2025`)) + console.log( + chalk.gray(` +AOS Client Version: ${pkg.version}. 2025`) + ) if (id) { console.log(chalk.gray('Type "Ctrl-C" twice to exit\n')) - console.log(`${chalk.gray("Your AOS process: ")} ${chalk.green(id)}`) + console.log(`${chalk.gray('Your AOS process: ')} ${chalk.green(id)}`) console.log('') } } -export const checkForUpdate = () => new Promise(async (resolve, reject) => { - try { - const res = await fetch(UPDATE_URL) - const data = [] - const extract = tar.extract() - - if (res.status === 404) { - return resolve({ available: false }) - } +export const checkForUpdate = () => + new Promise(async (resolve, reject) => { + try { + const res = await fetch(UPDATE_URL) + const data = [] + const extract = tar.extract() - if (res.status >= 500) { - if (process.env.DEBUG) { - console.log(chalk.yellow(`Warning: The update server (${UPDATE_URL}) responded with a ${res.status} status code\n`)) + if (res.status === 404) { + return resolve({ available: false }) } - return resolve({ available: false }) - } - - Readable.fromWeb(res.body).pipe(createGunzip()).pipe(extract) - - extract.on('entry', (header, stream, next) => { - const file = [] - - stream.on('data', (chunk) => { - file.push(chunk); - }) - stream.on('end', () => { - data.push({ - name: header.name, - data: new TextDecoder().decode( - Buffer.concat(file) + if (res.status >= 500) { + if (process.env.DEBUG) { + console.log( + chalk.yellow( + `Warning: The update server (${UPDATE_URL}) responded with a ${res.status} status code\n` + ) ) - }) - next() - }) - - stream.resume() + } - }) - extract.on('finish', () => { - - const packageJson = JSON.parse( - data.find((f) => f.name === 'package/package.json')?.data || '{}' - ) - - if (!pkg.version) { - console.log(chalk.red('ERROR: Could not check for update')) return resolve({ available: false }) } - resolve({ - available: semverCompare(pkg.version, packageJson.version) === -1, - version: packageJson.version, - data - }) - }) + Readable.fromWeb(res.body).pipe(createGunzip()).pipe(extract) + extract.on('entry', (header, stream, next) => { + const file = [] - } catch { - console.log(chalk.red('ERROR: Could not fetch update')) - resolve({ available: false }) - } -}) + stream.on('data', chunk => { + file.push(chunk) + }) + stream.on('end', () => { + data.push({ + name: header.name, + data: new TextDecoder().decode(Buffer.concat(file)) + }) + next() + }) + + stream.resume() + }) + extract.on('finish', () => { + const packageJson = JSON.parse( + data.find(f => f.name === 'package/package.json')?.data || '{}' + ) + + if (!pkg.version) { + console.log(chalk.red('ERROR: Could not check for update')) + return resolve({ available: false }) + } + + resolve({ + available: semverCompare(pkg.version, packageJson.version) === -1, + version: packageJson.version, + data + }) + }) + } catch { + console.log(chalk.red('ERROR: Could not fetch update')) + resolve({ available: false }) + } + }) export async function installUpdate(update, rootDir) { const rl = readline.createInterface({ @@ -108,22 +109,14 @@ export async function installUpdate(update, rootDir) { try { for (const file of update.data) { - const localPath = path.join( - rootDir, - file.name.replace(/^(\/)?package/, '') - ) + const localPath = path.join(rootDir, file.name.replace(/^(\/)?package/, '')) - // create path if it does not exist yet + // Create path if it does not exist yet fs.mkdirSync(path.dirname(localPath), { recursive: true }) - fs.writeFileSync( - localPath, - new TextEncoder().encode(file.data) - ) + fs.writeFileSync(localPath, new TextEncoder().encode(file.data)) } - console.log(chalk.green( - 'Updated ' + pkg.version + ' → ' + update.version - )) + console.log(chalk.green('Updated ' + pkg.version + ' → ' + update.version)) console.log(chalk.green('Restart your client to start using the new version.')) process.exit(0) } catch { diff --git a/src/services/wallets.js b/src/services/wallets.js index fba1c7cca..fb554bd1c 100644 --- a/src/services/wallets.js +++ b/src/services/wallets.js @@ -18,10 +18,10 @@ export async function getWallet() { export async function getWalletFromArgs(walletPath) { try { - const jwk = await fs.readFileSync(walletPath, 'utf8'); - return JSON.parse(jwk); + const jwk = await fs.readFileSync(walletPath, 'utf8') + return JSON.parse(jwk) } catch (error) { - console.error(`Error reading wallet file: ${error.message}`); - throw error; + console.error(`Error reading wallet file: ${error.message}`) + throw error } -} \ No newline at end of file +} diff --git a/src/utils/colors.js b/src/utils/colors.js new file mode 100644 index 000000000..98635a3b0 --- /dev/null +++ b/src/utils/colors.js @@ -0,0 +1,49 @@ +const colors = { + reset: '\x1b[0m', + bold: '\x1b[1m', + dim: '\x1b[2m', + italic: '\x1b[3m', + underline: '\x1b[4m', + inverse: '\x1b[7m', + strikethrough: '\x1b[9m', + + black: '\x1b[30m', + red: '\x1b[31m', + green: '\x1b[32m', + yellow: '\x1b[33m', + blue: '\x1b[34m', + magenta: '\x1b[35m', + cyan: '\x1b[36m', + white: '\x1b[37m', + gray: '\x1b[90m', + grey: '\x1b[90m', + + blackBright: '\x1b[90m', + redBright: '\x1b[91m', + greenBright: '\x1b[92m', + yellowBright: '\x1b[93m', + blueBright: '\x1b[94m', + magentaBright: '\x1b[95m', + cyanBright: '\x1b[96m', + whiteBright: '\x1b[97m', + + bgBlack: '\x1b[40m', + bgRed: '\x1b[41m', + bgGreen: '\x1b[42m', + bgYellow: '\x1b[43m', + bgBlue: '\x1b[44m', + bgMagenta: '\x1b[45m', + bgCyan: '\x1b[46m', + bgWhite: '\x1b[47m', + bgBlackBright: '\x1b[100m' +} + +const createColorFunction = (code) => (text) => `${code}${text}${colors.reset}` + +export const chalk = Object.keys(colors).reduce((acc, key) => { + if (key === 'reset') return acc + acc[key] = createColorFunction(colors[key]) + return acc +}, {}) + +chalk.highlight = (text) => `${colors.bgBlack}${colors.white}${`${text} `}${colors.reset}` diff --git a/src/hyper-utils.js b/src/utils/hyper-utils.js similarity index 50% rename from src/hyper-utils.js rename to src/utils/hyper-utils.js index 438b9a094..bda845bba 100644 --- a/src/hyper-utils.js +++ b/src/utils/hyper-utils.js @@ -1,8 +1,8 @@ // import * as R from 'ramda' - // export const path = R.path // export const identity = R.identity -export const path = props => obj => props.reduce((acc, key) => (acc && acc[key] !== undefined) ? acc[key] : undefined, obj) +export const path = props => obj => + props.reduce((acc, key) => (acc && acc[key] !== undefined ? acc[key] : undefined), obj) export const identity = x => x diff --git a/src/utils/print.js b/src/utils/print.js new file mode 100644 index 000000000..bffe235c7 --- /dev/null +++ b/src/utils/print.js @@ -0,0 +1,119 @@ +import { chalk } from './colors.js' + +function wrapLine(text, maxWidth) { + const plainText = text.replace(/\x1b\[[0-9;]*m/g, '') + + if (plainText.length <= maxWidth) { + return [text] + } + + // For lines with ANSI codes, we need to be more careful + // For now, just wrap plain text and accept we might lose some formatting + const words = plainText.split(' ') + const wrappedLines = [] + let currentLine = '' + + for (const word of words) { + if ((currentLine + word).length <= maxWidth) { + currentLine += (currentLine ? ' ' : '') + word + } else { + if (currentLine) { + wrappedLines.push(currentLine) + } + currentLine = word + } + } + + if (currentLine) { + wrappedLines.push(currentLine) + } + + return wrappedLines.length > 0 ? wrappedLines : [plainText.substring(0, maxWidth)] +} + +export function printWithBorder(lines, { title = '', titleColor = chalk.gray, borderColor = chalk.gray, width, truncate = false } = {}) { + // Use terminal width if not specified + const terminalWidth = process.stdout.columns || 175 + const defaultWidth = Math.min(175, Math.max(40, terminalWidth - 2)) + const boxWidth = width || defaultWidth + const maxLineWidth = boxWidth - 4 // Account for "│ " and " │" + + const titleStr = title ? ` ${title} ` : '' + const border = '─'.repeat(boxWidth - titleStr.length - 1) + + console.log('') + console.log(borderColor(`╭─`) + titleColor(titleStr) + borderColor(border + `╮`)) + console.log(borderColor(`│${' '.repeat(boxWidth)}│`)) + + for (const line of lines) { + if (line === 'newline') { + console.log(borderColor(`│${' '.repeat(boxWidth)}│`)) + continue + } + + if (line === 'divider') { + console.log(borderColor(`│ ${'─'.repeat(maxLineWidth)} │`)) + console.log(borderColor(`│${' '.repeat(boxWidth)}│`)) + continue + } + + if (truncate) { + const plainText = line.replace(/\x1b\[[0-9;]*m/g, '') + + if (plainText.length > maxLineWidth) { + // Truncate while preserving ANSI codes + let visibleLength = 0 + let truncatedLine = '' + let i = 0 + + while (i < line.length && visibleLength < maxLineWidth - 3) { + // Check for ANSI escape sequence + if (line[i] === '\x1b' && line[i + 1] === '[') { + // Find the end of the escape sequence + let j = i + 2 + while (j < line.length && line[j] !== 'm') { + j++ + } + // Include the entire escape sequence + truncatedLine += line.substring(i, j + 1) + i = j + 1 + } else { + truncatedLine += line[i] + visibleLength++ + i++ + } + } + + truncatedLine += '...' + const padding = Math.max(0, maxLineWidth - (plainText.substring(0, visibleLength).length + 3)) + console.log(borderColor(`│ `) + truncatedLine + borderColor(' '.repeat(padding) + ' │')) + } else { + const padding = Math.max(0, maxLineWidth - plainText.length) + console.log(borderColor(`│ `) + line + borderColor(' '.repeat(padding) + ' │')) + } + } else { + const wrappedLines = wrapLine(line, maxLineWidth) + + for (const wrappedLine of wrappedLines) { + const plainText = wrappedLine.replace(/\x1b\[[0-9;]*m/g, '') + const padding = Math.max(0, maxLineWidth - plainText.length) + console.log(borderColor(`│ `) + wrappedLine + borderColor(' '.repeat(padding) + ' │')) + } + } + } + + console.log(borderColor(`╰${'─'.repeat(boxWidth)}╯`)) + console.log(''); +} + +export function printWithFormat(lineObj, opts) { + if (lineObj) { + if (Array.isArray(lineObj)) { + for (const line of lineObj) { + console.log(line) + } + } + else console.log(lineObj) + } + if (!opts?.lineOnly) console.log('') +} diff --git a/src/utils/terminal.js b/src/utils/terminal.js new file mode 100644 index 000000000..3d24186cc --- /dev/null +++ b/src/utils/terminal.js @@ -0,0 +1,51 @@ +/** + * Terminal utility for preserving user input while printing output + * Uses ANSI escape codes to save/restore cursor and clear lines + */ + +let savedInput = '' +let savedCursorPosition = 0 + +/** + * Save the current input line and cursor position + * Should be called before printing any async output + */ +export function saveInput(rl) { + if (!rl) return + + savedInput = rl.line || '' + savedCursorPosition = rl.cursor || 0 + + // Clear the current line (prompt + input) + process.stdout.write('\r\x1b[K') +} + +/** + * Restore the saved input line and cursor position + * Should be called after printing async output + */ +export function restoreInput(rl, showSeparator = false) { + if (!rl) return + + // Add newline before prompt for spacing + process.stdout.write('\n') + + // Rewrite the prompt and saved input + process.stdout.write(rl.getPrompt() + savedInput) + + // Move cursor back to saved position + if (savedCursorPosition < savedInput.length) { + const charsToMoveBack = savedInput.length - savedCursorPosition + process.stdout.write(`\x1b[${charsToMoveBack}D`) + } +} + +/** + * Print output without disrupting user input + * This saves the current input, prints the output, then restores input + */ +export function printWithoutDisruption(text, rl, showSeparator = true) { + saveInput(rl) + process.stdout.write(text + '\n') + restoreInput(rl, showSeparator) +} diff --git a/test/index.test.js b/test/index.test.js index 45ffa2b8c..f4b6fd6b5 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -2,32 +2,36 @@ import { test } from 'node:test' import * as assert from 'node:assert' import { spawn } from 'node:child_process' -test('aos', async (done) => { - let repl; - let output = ''; +test('aos', async done => { + let repl + let output = '' repl = spawn('node', ['src/index.js', 'club-random']) - repl.stdout.on('data', (data => { - output += data.toString(); - })) + repl.stdout.on('data', data => { + output += data.toString() + }) repl.stdin.write('1 + 1\n') - const res = await new Promise(r => setTimeout(() => { - const lines = output.split('\n') - output = "" - r(lines[lines.length - 2]) - }, 10000)) + const res = await new Promise(r => + setTimeout(() => { + const lines = output.split('\n') + output = '' + r(lines[lines.length - 2]) + }, 10000) + ) assert.equal(res.trim(), '\x1B[33m2\x1B[39m') repl.stdin.write('print("Hello World")\n') - const res2 = await new Promise(r => setTimeout(() => { - const lines = output.split('\n') - r(lines[lines.length - 2]) - }, 2000)) + const res2 = await new Promise(r => + setTimeout(() => { + const lines = output.split('\n') + r(lines[lines.length - 2]) + }, 2000) + ) assert.equal(res2.trim(), 'Hello World') @@ -35,5 +39,4 @@ test('aos', async (done) => { repl.kill('SIGINT') repl.kill('SIGINT') - -}) \ No newline at end of file +}) diff --git a/test/run-mode.test.js b/test/run-mode.test.js index efc298f20..57302a154 100644 --- a/test/run-mode.test.js +++ b/test/run-mode.test.js @@ -10,7 +10,7 @@ const defaultArgs = { _: ['default'] } mock.method(process, 'exit', () => {}) -const captureLogs = (fn) => { +const captureLogs = fn => { const logs = [] const originalLog = console.log console.log = (...args) => logs.push(args.join(' ')) @@ -42,7 +42,7 @@ test('version suppressOutput option prevents logging', () => { assert.deepStrictEqual(suppressedLogs, []) const normalLogs = captureLogs(() => version('process-id', { suppressOutput: false })) - assert.ok(normalLogs.some((line) => /Client Version/i.test(line))) - assert.ok(normalLogs.some((line) => /Type "Ctrl-C" twice/i.test(line))) - assert.ok(normalLogs.some((line) => /Your AOS process:/i.test(line))) + assert.ok(normalLogs.some(line => /Client Version/i.test(line))) + assert.ok(normalLogs.some(line => /Type "Ctrl-C" twice/i.test(line))) + assert.ok(normalLogs.some(line => /Your AOS process:/i.test(line))) }) diff --git a/test/services/version.test.js b/test/services/version.test.js index ed4c7d9d7..b2bf036d6 100644 --- a/test/services/version.test.js +++ b/test/services/version.test.js @@ -3,7 +3,7 @@ import * as assert from 'node:assert' import { checkForUpdate } from '../../src/services/version.js' import { STATUS_CODES } from 'node:http' -test('checkForUpdate() handles 404 response', async (context) => { +test('checkForUpdate() handles 404 response', async context => { fetch = context.mock.fn(fetch, () => { return { status: 404 @@ -14,26 +14,25 @@ test('checkForUpdate() handles 404 response', async (context) => { assert.deepEqual(actual, { available: false }) }) -test('checkForUpdate() handles 5xx responses', async (context) => { - const statusCodes = Object - .keys(STATUS_CODES) - .filter((statusCode) => +statusCode >= 500 ) - .map((statusCode) => +statusCode) +test('checkForUpdate() handles 5xx responses', async context => { + const statusCodes = Object.keys(STATUS_CODES) + .filter(statusCode => +statusCode >= 500) + .map(statusCode => +statusCode) - const statusContexts = statusCodes.map((statusCode) => { + const statusContexts = statusCodes.map(statusCode => { return { status: statusCode, - expected: { available: false }, + expected: { available: false } } - }); + }) for (const statusContext of statusContexts) { fetch = context.mock.fn(fetch, () => { return { - status: statusContext.status, + status: statusContext.status } }) - + const actual = await checkForUpdate() assert.deepEqual(actual, statusContext.expected) } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 6fff7c392..000000000 --- a/yarn.lock +++ /dev/null @@ -1,4600 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - -"@commitlint/cli@19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-19.5.0.tgz" - integrity sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ== - dependencies: - "@commitlint/format" "^19.5.0" - "@commitlint/lint" "^19.5.0" - "@commitlint/load" "^19.5.0" - "@commitlint/read" "^19.5.0" - "@commitlint/types" "^19.5.0" - tinyexec "^0.3.0" - yargs "^17.0.0" - -"@commitlint/config-conventional@19.5.0": - version "19.5.0" - resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.5.0.tgz" - integrity sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg== - dependencies: - "@commitlint/types" "^19.5.0" - conventional-changelog-conventionalcommits "^7.0.2" - -"@commitlint/config-validator@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz" - integrity sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ== - dependencies: - "@commitlint/types" "^19.8.1" - ajv "^8.11.0" - -"@commitlint/ensure@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz" - integrity sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw== - dependencies: - "@commitlint/types" "^19.8.1" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - lodash.snakecase "^4.1.1" - lodash.startcase "^4.4.0" - lodash.upperfirst "^4.3.1" - -"@commitlint/execute-rule@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz" - integrity sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA== - -"@commitlint/format@^19.5.0": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz" - integrity sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw== - dependencies: - "@commitlint/types" "^19.8.1" - chalk "^5.3.0" - -"@commitlint/is-ignored@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz" - integrity sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg== - dependencies: - "@commitlint/types" "^19.8.1" - semver "^7.6.0" - -"@commitlint/lint@^19.5.0": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz" - integrity sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw== - dependencies: - "@commitlint/is-ignored" "^19.8.1" - "@commitlint/parse" "^19.8.1" - "@commitlint/rules" "^19.8.1" - "@commitlint/types" "^19.8.1" - -"@commitlint/load@^19.5.0": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz" - integrity sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A== - dependencies: - "@commitlint/config-validator" "^19.8.1" - "@commitlint/execute-rule" "^19.8.1" - "@commitlint/resolve-extends" "^19.8.1" - "@commitlint/types" "^19.8.1" - chalk "^5.3.0" - cosmiconfig "^9.0.0" - cosmiconfig-typescript-loader "^6.1.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - lodash.uniq "^4.5.0" - -"@commitlint/message@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz" - integrity sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg== - -"@commitlint/parse@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz" - integrity sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw== - dependencies: - "@commitlint/types" "^19.8.1" - conventional-changelog-angular "^7.0.0" - conventional-commits-parser "^5.0.0" - -"@commitlint/read@^19.5.0": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz" - integrity sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ== - dependencies: - "@commitlint/top-level" "^19.8.1" - "@commitlint/types" "^19.8.1" - git-raw-commits "^4.0.0" - minimist "^1.2.8" - tinyexec "^1.0.0" - -"@commitlint/resolve-extends@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz" - integrity sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg== - dependencies: - "@commitlint/config-validator" "^19.8.1" - "@commitlint/types" "^19.8.1" - global-directory "^4.0.1" - import-meta-resolve "^4.0.0" - lodash.mergewith "^4.6.2" - resolve-from "^5.0.0" - -"@commitlint/rules@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz" - integrity sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw== - dependencies: - "@commitlint/ensure" "^19.8.1" - "@commitlint/message" "^19.8.1" - "@commitlint/to-lines" "^19.8.1" - "@commitlint/types" "^19.8.1" - -"@commitlint/to-lines@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz" - integrity sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg== - -"@commitlint/top-level@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz" - integrity sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw== - dependencies: - find-up "^7.0.0" - -"@commitlint/types@^19.5.0", "@commitlint/types@^19.8.1": - version "19.8.1" - resolved "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz" - integrity sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw== - dependencies: - "@types/conventional-commits-parser" "^5.0.0" - chalk "^5.3.0" - -"@dha-team/arbundles@1.0.3": - version "1.0.3" - resolved "https://registry.npmjs.org/@dha-team/arbundles/-/arbundles-1.0.3.tgz" - integrity sha512-/XelOo5V/1o1M8VchCQ+F7N5kxwirWh5jD5zg1KECaV80Qld6aKBSgG19VLlBsRUXbRUfjM+LDRPJm9Hjfmycg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/providers" "^5.7.2" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wallet" "^5.7.0" - "@noble/ed25519" "^1.6.1" - arweave "^1.15.7" - base64url "^3.0.1" - bs58 "^4.0.1" - keccak "^3.0.2" - secp256k1 "^5.0.0" - optionalDependencies: - "@randlabs/myalgo-connect" "^1.1.2" - algosdk "^1.13.1" - arweave-stream-tx "^1.1.0" - multistream "^4.1.0" - tmp-promise "^3.0.2" - -"@esbuild/darwin-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz" - integrity sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA== - -"@esbuild/darwin-arm64@0.24.2": - version "0.24.2" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz" - integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.7.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.6.1": - version "4.12.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== - -"@ethersproject/abstract-provider@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz" - integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/networks" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/web" "^5.8.0" - -"@ethersproject/abstract-signer@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz" - integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== - dependencies: - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - -"@ethersproject/address@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz" - integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - -"@ethersproject/base64@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz" - integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== - dependencies: - "@ethersproject/bytes" "^5.8.0" - -"@ethersproject/basex@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz" - integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - -"@ethersproject/bignumber@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz" - integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz" - integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/constants@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz" - integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - -"@ethersproject/hash@^5.7.0", "@ethersproject/hash@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz" - integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== - dependencies: - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/base64" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@ethersproject/hdnode@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz" - integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== - dependencies: - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/basex" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/pbkdf2" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/sha2" "^5.8.0" - "@ethersproject/signing-key" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/wordlists" "^5.8.0" - -"@ethersproject/json-wallets@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz" - integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== - dependencies: - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/hdnode" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/pbkdf2" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/random" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz" - integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== - dependencies: - "@ethersproject/bytes" "^5.8.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz" - integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== - -"@ethersproject/networks@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz" - integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/pbkdf2@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz" - integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/sha2" "^5.8.0" - -"@ethersproject/properties@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz" - integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/providers@^5.7.2": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz" - integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== - dependencies: - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/base64" "^5.8.0" - "@ethersproject/basex" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/networks" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/random" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - "@ethersproject/sha2" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/web" "^5.8.0" - bech32 "1.1.4" - ws "8.18.0" - -"@ethersproject/random@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz" - integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/rlp@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz" - integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/sha2@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz" - integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz" - integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - bn.js "^5.2.1" - elliptic "6.6.1" - hash.js "1.1.7" - -"@ethersproject/strings@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz" - integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz" - integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== - dependencies: - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - "@ethersproject/signing-key" "^5.8.0" - -"@ethersproject/wallet@^5.7.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz" - integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== - dependencies: - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/hdnode" "^5.8.0" - "@ethersproject/json-wallets" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/random" "^5.8.0" - "@ethersproject/signing-key" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/wordlists" "^5.8.0" - -"@ethersproject/web@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz" - integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== - dependencies: - "@ethersproject/base64" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@ethersproject/wordlists@^5.8.0": - version "5.8.0" - resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz" - integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== - dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@johnnymorganz/stylua-bin@0.20.0": - version "0.20.0" - resolved "https://registry.npmjs.org/@johnnymorganz/stylua-bin/-/stylua-bin-0.20.0.tgz" - integrity sha512-CjsdrDNhUHivkm7xvT+LK0E+aOzD2RbLy0jiD1s/x5RoTq8tqXenhZN7ao2NeuLctwrKCOk26xAv5oP4JmGoPw== - dependencies: - axios "^1.6.0" - node-fetch "^3.2.10" - rimraf "^3.0.2" - unzipper "^0.10.11" - -"@noble/ed25519@^1.6.1": - version "1.7.5" - resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.5.tgz" - integrity sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@permaweb/ao-loader@^0.0.44": - version "0.0.44" - resolved "https://registry.npmjs.org/@permaweb/ao-loader/-/ao-loader-0.0.44.tgz" - integrity sha512-O/5XuwqxCD9dTIN/jZ6x4rmqIA/Css0bqaXScOrXc0xTz7VjYseM+PNXFf8vAXiOgnNFmrZzDJ0or94cjmqhZA== - dependencies: - "@permaweb/wasm-metering" "^0.2.2" - -"@permaweb/ao-scheduler-utils@~0.0.25": - version "0.0.25" - resolved "https://registry.npmjs.org/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.25.tgz" - integrity sha512-b0UYSTgnLMIYLScrfNBgcqK7ZMmd78L3J0Jz4RIsIq2P5PtkdRqQ7fYqLlltg7bD1f3dvl4TkO1925ED4ei7LA== - dependencies: - lru-cache "^10.2.2" - ramda "^0.30.0" - zod "^3.23.5" - -"@permaweb/aoconnect@0.0.90": - version "0.0.90" - resolved "https://registry.npmjs.org/@permaweb/aoconnect/-/aoconnect-0.0.90.tgz" - integrity sha512-VKEkwKV5Lv6q2pai38gz/ngcRML4iApWsJc5B8X8ow9fJIXnd9UK8y0HMbrKUF/VB5Eb8r8lJhDr76yiL6QWAA== - dependencies: - "@dha-team/arbundles" "1.0.3" - "@permaweb/ao-scheduler-utils" "~0.0.25" - "@permaweb/protocol-tag-utils" "~0.0.2" - axios "^1.7.9" - base64url "^3.0.1" - buffer "^6.0.3" - debug "^4.4.0" - http-message-signatures "^1.0.4" - hyper-async "^1.1.2" - mnemonist "^0.39.8" - ramda "^0.30.1" - structured-headers "^2.0.0" - zod "^3.24.1" - -"@permaweb/protocol-tag-utils@~0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@permaweb/protocol-tag-utils/-/protocol-tag-utils-0.0.2.tgz" - integrity sha512-2IiKu71W7pkHKIzxabCGQ5q8DSppZaE/sPcPF2hn+OWwfe04M7b5X5LHRXQNPRuxHWuioieGdPQb3F7apOlffQ== - -"@permaweb/wasm-json-toolkit@^0.2.9": - version "0.2.9" - resolved "https://registry.npmjs.org/@permaweb/wasm-json-toolkit/-/wasm-json-toolkit-0.2.9.tgz" - integrity sha512-CGCeUwS+UeqUdvORiyG0LykkQXLTwS5TWc590CUkDfOYyBUSPv8pse0sJStvTC9LKAzuNx3ELBvmqHCI4muUAA== - dependencies: - buffer-pipe "0.0.3" - leb128 "0.0.4" - safe-buffer "^5.1.2" - -"@permaweb/wasm-metering@^0.2.2": - version "0.2.2" - resolved "https://registry.npmjs.org/@permaweb/wasm-metering/-/wasm-metering-0.2.2.tgz" - integrity sha512-xM2MbPkHc4rzhTR6VH5eXtfC+liaYSuNCa0kPRaqSZO2gr1SirJWnzUBDa5VOfTBTgIlIVv5RW+Mkbt/VuK+oA== - dependencies: - "@permaweb/wasm-json-toolkit" "^0.2.9" - leb128 "^0.0.4" - -"@permaweb/weavedrive@file:/Users/rakis/aos-projects/aos/extensions/weavedrive": - version "0.0.18" - resolved "file:extensions/weavedrive" - dependencies: - arweave "^1.15.5" - -"@randlabs/communication-bridge@1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz" - integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg== - -"@randlabs/myalgo-connect@^1.1.2": - version "1.4.2" - resolved "https://registry.npmjs.org/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz" - integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA== - dependencies: - "@randlabs/communication-bridge" "1.0.1" - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@types/conventional-commits-parser@^5.0.0": - version "5.0.1" - resolved "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz" - integrity sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ== - dependencies: - "@types/node" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@*": - version "24.0.3" - resolved "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz" - integrity sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg== - dependencies: - undici-types "~7.8.0" - -"@ungap/structured-clone@^1.2.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: - version "8.15.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - -agent-base@^7.0.2: - version "7.1.3" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.11.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -algo-msgpack-with-bigint@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz" - integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== - -algosdk@^1.13.1: - version "1.24.1" - resolved "https://registry.npmjs.org/algosdk/-/algosdk-1.24.1.tgz" - integrity sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww== - dependencies: - algo-msgpack-with-bigint "^2.1.1" - buffer "^6.0.2" - cross-fetch "^3.1.5" - hi-base32 "^0.5.1" - js-sha256 "^0.9.0" - js-sha3 "^0.8.0" - js-sha512 "^0.8.0" - json-bigint "^1.0.0" - tweetnacl "^1.0.3" - vlq "^2.0.4" - -ansi-escapes@^7.0.0: - version "7.1.1" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz" - integrity sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q== - dependencies: - environment "^1.0.0" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0, ansi-styles@^6.2.1: - version "6.2.3" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== - -arconnect@^0.4.2: - version "0.4.2" - resolved "https://registry.npmjs.org/arconnect/-/arconnect-0.4.2.tgz" - integrity sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw== - dependencies: - arweave "^1.10.13" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -array-includes@^3.1.6, array-includes@^3.1.8: - version "3.1.9" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz" - integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.0" - es-object-atoms "^1.1.1" - get-intrinsic "^1.3.0" - is-string "^1.1.1" - math-intrinsics "^1.1.0" - -array.prototype.findlast@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.5: - version "1.2.6" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.tosorted@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz" - integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - is-array-buffer "^3.0.4" - -arweave-stream-tx@^1.1.0: - version "1.2.2" - resolved "https://registry.npmjs.org/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz" - integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ== - dependencies: - exponential-backoff "^3.1.0" - -arweave@^1.10.0, arweave@^1.10.13, arweave@1.15.1: - version "1.15.1" - resolved "https://registry.npmjs.org/arweave/-/arweave-1.15.1.tgz" - integrity sha512-rT7FOwqdudd5npqp4xOYdDT2035LtpcqePjwirh4wjRiEtVsz1FZkRiM2Yj+fOAwYzOm/hNG0GDOipDSaiEGGQ== - dependencies: - arconnect "^0.4.2" - asn1.js "^5.4.1" - base64-js "^1.5.1" - bignumber.js "^9.0.2" - -arweave@^1.15.5: - version "1.15.7" - resolved "https://registry.npmjs.org/arweave/-/arweave-1.15.7.tgz" - integrity sha512-F+Y4iWU1qea9IsKQ/YNmLsY4DHQVsaJBuhEbFxQn9cfGHOmtXE+bwo14oY8xqymsqSNf/e1PeIfLk7G7qN/hVA== - dependencies: - arconnect "^0.4.2" - asn1.js "^5.4.1" - base64-js "^1.5.1" - bignumber.js "^9.0.2" - -arweave@^1.15.7: - version "1.15.7" - resolved "https://registry.npmjs.org/arweave/-/arweave-1.15.7.tgz" - integrity sha512-F+Y4iWU1qea9IsKQ/YNmLsY4DHQVsaJBuhEbFxQn9cfGHOmtXE+bwo14oY8xqymsqSNf/e1PeIfLk7G7qN/hVA== - dependencies: - arconnect "^0.4.2" - asn1.js "^5.4.1" - base64-js "^1.5.1" - bignumber.js "^9.0.2" - -asn1.js@^5.4.1: - version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^1.6.0, axios@^1.7.9: - version "1.10.0" - resolved "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz" - integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -b4a@^1.6.4: - version "1.6.7" - resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz" - integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -bare-events@^2.2.0: - version "2.5.4" - resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz" - integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== - -base-x@^3.0.2: - version "3.0.11" - resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz" - integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base64url@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz" - integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -big-integer@^1.6.17: - version "1.6.52" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - -bignumber.js@^9.0.0, bignumber.js@^9.0.2: - version "9.3.0" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz" - integrity sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA== - -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" - integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -bl@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" - integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" - integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== - -bn.js@^4.0.0, bn.js@^4.11.6, bn.js@^4.11.9: - version "4.12.2" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz" - integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== - -bn.js@^5.2.1: - version "5.2.2" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz" - integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== - -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - -buffer-pipe@0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.0.tgz" - integrity sha512-PvKbsvQOH4dcUyUEvQQSs3CIkkuPcOHt3gKnXwf4HsPKFDxSN7bkmICVIWgOmW/jx/fAEGGn4mIayIJPLs7G8g== - dependencies: - safe-buffer "^5.1.1" - -buffer-pipe@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/buffer-pipe/-/buffer-pipe-0.0.3.tgz" - integrity sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA== - dependencies: - safe-buffer "^5.1.2" - -buffer@^6.0.2, buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" - integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== - -builtins@^5.0.1: - version "5.1.0" - resolved "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz" - integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== - dependencies: - semver "^7.0.0" - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" - integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.0.0, chalk@^5.3.0, chalk@~5.3.0, chalk@5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - -cli-cursor@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" - integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== - dependencies: - restore-cursor "^5.0.0" - -cli-spinners@^2.9.0: - version "2.9.2" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" - integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== - dependencies: - slice-ansi "^5.0.0" - string-width "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@~12.1.0: - version "12.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -conventional-changelog-angular@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz" - integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== - dependencies: - compare-func "^2.0.0" - -conventional-changelog-conventionalcommits@^7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz" - integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== - dependencies: - compare-func "^2.0.0" - -conventional-commits-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" - integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== - dependencies: - is-text-path "^2.0.0" - JSONStream "^1.3.5" - meow "^12.0.1" - split2 "^4.0.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig-typescript-loader@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz" - integrity sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g== - dependencies: - jiti "^2.4.1" - -cosmiconfig@^9.0.0, cosmiconfig@>=9: - version "9.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - -cross-fetch@^3.1.5: - version "3.2.0" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz" - integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== - dependencies: - node-fetch "^2.7.0" - -cross-spawn@^6.0.0: - version "6.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz" - integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -dargs@^8.0.0: - version "8.1.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz" - integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== - -data-uri-to-buffer@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" - integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== - -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.4.0, debug@4: - version "4.4.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -debug@~4.3.6: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-indent@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz" - integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g== - -detect-newline@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz" - integrity sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" - integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== - dependencies: - readable-stream "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -elliptic@^6.5.7, elliptic@6.6.1: - version "6.6.1" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz" - integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^10.2.1, emoji-regex@^10.3.0: - version "10.4.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz" - integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.5" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz" - integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== - dependencies: - once "^1.4.0" - -env-paths@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -environment@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" - integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0: - version "1.24.0" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz" - integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== - dependencies: - array-buffer-byte-length "^1.0.2" - arraybuffer.prototype.slice "^1.0.4" - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - data-view-buffer "^1.0.2" - data-view-byte-length "^1.0.2" - data-view-byte-offset "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-set-tostringtag "^2.1.0" - es-to-primitive "^1.3.0" - function.prototype.name "^1.1.8" - get-intrinsic "^1.3.0" - get-proto "^1.0.1" - get-symbol-description "^1.1.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - internal-slot "^1.1.0" - is-array-buffer "^3.0.5" - is-callable "^1.2.7" - is-data-view "^1.0.2" - is-negative-zero "^2.0.3" - is-regex "^1.2.1" - is-set "^2.0.3" - is-shared-array-buffer "^1.0.4" - is-string "^1.1.1" - is-typed-array "^1.1.15" - is-weakref "^1.1.1" - math-intrinsics "^1.1.0" - object-inspect "^1.13.4" - object-keys "^1.1.1" - object.assign "^4.1.7" - own-keys "^1.0.1" - regexp.prototype.flags "^1.5.4" - safe-array-concat "^1.1.3" - safe-push-apply "^1.0.0" - safe-regex-test "^1.1.0" - set-proto "^1.0.0" - stop-iteration-iterator "^1.1.0" - string.prototype.trim "^1.2.10" - string.prototype.trimend "^1.0.9" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.3" - typed-array-byte-length "^1.0.3" - typed-array-byte-offset "^1.0.4" - typed-array-length "^1.0.7" - unbox-primitive "^1.1.0" - which-typed-array "^1.1.19" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz" - integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.6" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - iterator.prototype "^1.1.4" - safe-array-concat "^1.1.3" - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" - integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== - dependencies: - is-callable "^1.2.7" - is-date-object "^1.0.5" - is-symbol "^1.0.4" - -esbuild@^0.24.0: - version "0.24.2" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz" - integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.24.2" - "@esbuild/android-arm" "0.24.2" - "@esbuild/android-arm64" "0.24.2" - "@esbuild/android-x64" "0.24.2" - "@esbuild/darwin-arm64" "0.24.2" - "@esbuild/darwin-x64" "0.24.2" - "@esbuild/freebsd-arm64" "0.24.2" - "@esbuild/freebsd-x64" "0.24.2" - "@esbuild/linux-arm" "0.24.2" - "@esbuild/linux-arm64" "0.24.2" - "@esbuild/linux-ia32" "0.24.2" - "@esbuild/linux-loong64" "0.24.2" - "@esbuild/linux-mips64el" "0.24.2" - "@esbuild/linux-ppc64" "0.24.2" - "@esbuild/linux-riscv64" "0.24.2" - "@esbuild/linux-s390x" "0.24.2" - "@esbuild/linux-x64" "0.24.2" - "@esbuild/netbsd-arm64" "0.24.2" - "@esbuild/netbsd-x64" "0.24.2" - "@esbuild/openbsd-arm64" "0.24.2" - "@esbuild/openbsd-x64" "0.24.2" - "@esbuild/sunos-x64" "0.24.2" - "@esbuild/win32-arm64" "0.24.2" - "@esbuild/win32-ia32" "0.24.2" - "@esbuild/win32-x64" "0.24.2" - -esbuild@0.20.1: - version "0.20.1" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz" - integrity sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.20.1" - "@esbuild/android-arm" "0.20.1" - "@esbuild/android-arm64" "0.20.1" - "@esbuild/android-x64" "0.20.1" - "@esbuild/darwin-arm64" "0.20.1" - "@esbuild/darwin-x64" "0.20.1" - "@esbuild/freebsd-arm64" "0.20.1" - "@esbuild/freebsd-x64" "0.20.1" - "@esbuild/linux-arm" "0.20.1" - "@esbuild/linux-arm64" "0.20.1" - "@esbuild/linux-ia32" "0.20.1" - "@esbuild/linux-loong64" "0.20.1" - "@esbuild/linux-mips64el" "0.20.1" - "@esbuild/linux-ppc64" "0.20.1" - "@esbuild/linux-riscv64" "0.20.1" - "@esbuild/linux-s390x" "0.20.1" - "@esbuild/linux-x64" "0.20.1" - "@esbuild/netbsd-x64" "0.20.1" - "@esbuild/openbsd-x64" "0.20.1" - "@esbuild/sunos-x64" "0.20.1" - "@esbuild/win32-arm64" "0.20.1" - "@esbuild/win32-ia32" "0.20.1" - "@esbuild/win32-x64" "0.20.1" - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-standard-jsx@^11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz" - integrity sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ== - -eslint-config-standard@17.1.0: - version "17.1.0" - resolved "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz" - integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.0: - version "2.12.0" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz" - integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz" - integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.27.5: - version "2.31.0" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz" - integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.8" - array.prototype.findlastindex "^1.2.5" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.0" - hasown "^2.0.2" - is-core-module "^2.15.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.0" - semver "^6.3.1" - string.prototype.trimend "^1.0.8" - tsconfig-paths "^3.15.0" - -"eslint-plugin-n@^15.0.0 || ^16.0.0 ", eslint-plugin-n@^15.7.0: - version "15.7.0" - resolved "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz" - integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== - dependencies: - builtins "^5.0.1" - eslint-plugin-es "^4.1.0" - eslint-utils "^3.0.0" - ignore "^5.1.1" - is-core-module "^2.11.0" - minimatch "^3.1.2" - resolve "^1.22.1" - semver "^7.3.8" - -eslint-plugin-promise@^6.0.0, eslint-plugin-promise@^6.1.1: - version "6.6.0" - resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz" - integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== - -eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.36.1: - version "7.37.5" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz" - integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.3" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.2.1" - estraverse "^5.3.0" - hasown "^2.0.2" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.9" - object.fromentries "^2.0.8" - object.values "^1.2.1" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.12" - string.prototype.repeat "^1.0.0" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0 || ^9.0.0", eslint@^8.0.1, eslint@^8.41.0, eslint@^8.8.0, eslint@>=4.19.1, eslint@>=5, eslint@>=7.0.0: - version "8.57.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.6.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@~8.0.1: - version "8.0.1" - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -exponential-backoff@^3.1.0: - version "3.1.2" - resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz" - integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-fifo@^1.2.0, fast-fifo@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - -fast-glob@^3.3.0, fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.2.0" - resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" - integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== - dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" - -figlet@1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz" - integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz" - integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== - dependencies: - locate-path "^7.2.0" - path-exists "^5.0.0" - unicorn-magic "^0.1.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -for-each@^0.3.3, for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -form-data@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz" - integrity sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.1.8" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" - integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - functions-have-names "^1.2.3" - hasown "^2.0.2" - is-callable "^1.2.7" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: - version "1.4.0" - resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz" - integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-stdin@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz" - integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - -git-hooks-list@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.2.0.tgz" - integrity sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ== - -git-raw-commits@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz" - integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== - dependencies: - dargs "^8.0.0" - meow "^12.0.1" - split2 "^4.0.0" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^13.1.2: - version "13.2.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hi-base32@^0.5.1: - version "0.5.1" - resolved "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz" - integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -http-message-signatures@^1.0.4, http-message-signatures@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/http-message-signatures/-/http-message-signatures-1.0.4.tgz" - integrity sha512-gavCQWnxHFg0BVlKs6CmYK7hNSH1o0x0mHTC68yBAHYOYuTVXPv52mEE7QuT5TenfiagTdOa/zPJzen4lEX7Rg== - dependencies: - structured-headers "^1.0.1" - -https-proxy-agent@7.0.4: - version "7.0.4" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -husky@9.1.6: - version "9.1.6" - resolved "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz" - integrity sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A== - -hyper-async@^1.1.2, hyper-async@1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/hyper-async/-/hyper-async-1.1.2.tgz" - integrity sha512-cnpOgKa+5FZOaccTtjduac1FrZuSc38/ftCp3vYJdUMt+7c+uvGDKLDK4MTNK8D3aFjIeveVrPcSgUPvzZLopg== - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.1" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-meta-resolve@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz" - integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3, inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - dependencies: - async-function "^1.0.0" - call-bound "^1.0.3" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.0.5, is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-fullwidth-code-point@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz" - integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== - dependencies: - get-east-asian-width "^1.3.1" - -is-generator-function@^1.0.10: - version "1.1.0" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== - dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" - integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.0.4, is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-text-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== - dependencies: - text-extensions "^2.0.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-unicode-supported@^1.1.0, is-unicode-supported@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz" - integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -iterator.prototype@^1.1.4: - version "1.1.5" - resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz" - integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== - dependencies: - define-data-property "^1.1.4" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - get-proto "^1.0.0" - has-symbols "^1.1.0" - set-function-name "^2.0.2" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jiti@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" - integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-sha3@^0.8.0, js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-sha512@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz" - integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -"jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.5" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keccak@^3.0.2: - version "3.0.4" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz" - integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leb128@^0.0.4, leb128@0.0.4: - version "0.0.4" - resolved "https://registry.npmjs.org/leb128/-/leb128-0.0.4.tgz" - integrity sha512-2zejk0fCIgY8RVcc/KzvyfpDio5Oo8HgPZmkrOmdwmbk0KpKpgD+JKwikxKk8cZYkANIhwHK50SNukkCm3XkCQ== - dependencies: - bn.js "^4.11.6" - buffer-pipe "0.0.0" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" - integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@15.2.10: - version "15.2.10" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz" - integrity sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg== - dependencies: - chalk "~5.3.0" - commander "~12.1.0" - debug "~4.3.6" - execa "~8.0.1" - lilconfig "~3.1.2" - listr2 "~8.2.4" - micromatch "~4.0.8" - pidtree "~0.6.0" - string-argv "~0.3.2" - yaml "~2.5.0" - -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" - integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== - -listr2@~8.2.4: - version "8.2.5" - resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz" - integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.1.0" - rfdc "^1.4.1" - wrap-ansi "^9.0.0" - -load-json-file@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== - dependencies: - graceful-fs "^4.1.15" - parse-json "^4.0.0" - pify "^4.0.1" - strip-bom "^3.0.0" - type-fest "^0.3.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -locate-path@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash.upperfirst@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz" - integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== - -log-symbols@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz" - integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== - dependencies: - chalk "^5.0.0" - is-unicode-supported "^1.1.0" - -log-update@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" - integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== - dependencies: - ansi-escapes "^7.0.0" - cli-cursor "^5.0.0" - slice-ansi "^7.1.0" - strip-ansi "^7.1.0" - wrap-ansi "^9.0.0" - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.2: - version "10.4.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -markdown-toc-gen@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/markdown-toc-gen/-/markdown-toc-gen-1.1.0.tgz" - integrity sha512-0ej77tAVqxXBzvKYJ0FQ+vVY5BLUK5xASPDscpaOU9Q9vQ+tvzcyQUV1y6wqDkK4A8mcUYD6yT+EqzcVso43ZA== - dependencies: - jest-diff "^29.7.0" - yargs "^17.7.2" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -meow@^12.0.1: - version "12.1.1" - resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz" - integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.8, micromatch@~4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8, minimist@1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"mkdirp@>=0.5 0": - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mnemonist@^0.39.8: - version "0.39.8" - resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz" - integrity sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ== - dependencies: - obliterator "^2.0.1" - -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multistream@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz" - integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== - dependencies: - once "^1.4.0" - readable-stream "^3.6.0" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-addon-api@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz" - integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== - -node-cron@3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz" - integrity sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A== - dependencies: - uuid "8.3.2" - -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-fetch@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^3.2.10: - version "3.3.2" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz" - integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" - -node-gyp-build@^4.2.0: - version "4.8.4" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz" - integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.3, object-inspect@^1.13.4: - version "1.13.4" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -object.entries@^1.1.9: - version "1.1.9" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz" - integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -obliterator@^2.0.1: - version "2.0.5" - resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz" - integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== - dependencies: - mimic-function "^5.0.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz" - integrity sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw== - dependencies: - chalk "^5.3.0" - cli-cursor "^4.0.0" - cli-spinners "^2.9.0" - is-interactive "^2.0.0" - is-unicode-supported "^1.3.0" - log-symbols "^5.1.0" - stdin-discarder "^0.1.0" - string-width "^6.1.0" - strip-ansi "^7.1.0" - -own-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" - integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== - dependencies: - get-intrinsic "^1.2.6" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@~0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-conf@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz" - integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== - dependencies: - find-up "^3.0.0" - load-json-file "^5.2.0" - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -pretty-file-tree@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/pretty-file-tree/-/pretty-file-tree-1.0.1.tgz" - integrity sha512-w6uf7qIl6GTx8QjPKuhz62AjVJIg6/YD8aiblq7oXbl4XhdZqtarKMftFVxWoII4JSxS20CUK9ixoTVsJLDIZg== - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -"process@file:/Users/rakis/aos-projects/aos/process": - version "1.0.0" - resolved "file:process" - dependencies: - "@permaweb/ao-loader" "^0.0.44" - -prompts@2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -pump@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz" - integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -ramda@^0.30.0, ramda@^0.30.1: - version "0.30.1" - resolved "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz" - integrity sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw== - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -readable-stream@^2.0.2: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.7" - get-proto "^1.0.1" - which-builtin-type "^1.2.1" - -regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: - version "1.5.4" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-errors "^1.3.0" - get-proto "^1.0.1" - gopd "^1.2.0" - set-function-name "^2.0.2" - -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.1.6, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.10" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" - integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== - dependencies: - onetime "^7.0.0" - signal-exit "^4.1.0" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rfdc@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@2: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" - integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - has-symbols "^1.1.0" - isarray "^2.0.5" - -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz" - integrity sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA== - dependencies: - elliptic "^6.5.7" - node-addon-api "^5.0.0" - node-gyp-build "^4.2.0" - -semver@^5.5.0: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.0.0, semver@^7.3.8, semver@7.5.4: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.6.0: - version "7.7.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" - integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - -setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shelljs@0.9.2: - version "0.9.2" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz" - integrity sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw== - dependencies: - execa "^1.0.0" - fast-glob "^3.3.2" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slice-ansi@^7.1.0: - version "7.1.2" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz" - integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== - dependencies: - ansi-styles "^6.2.1" - is-fullwidth-code-point "^5.0.0" - -sort-object-keys@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz" - integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== - -sort-package-json@2.10.1: - version "2.10.1" - resolved "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.10.1.tgz" - integrity sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w== - dependencies: - detect-indent "^7.0.1" - detect-newline "^4.0.0" - get-stdin "^9.0.0" - git-hooks-list "^3.0.0" - globby "^13.1.2" - is-plain-obj "^4.1.0" - semver "^7.6.0" - sort-object-keys "^1.1.3" - -split2@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -standard-engine@^15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz" - integrity sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw== - dependencies: - get-stdin "^8.0.0" - minimist "^1.2.6" - pkg-conf "^3.1.0" - xdg-basedir "^4.0.0" - -standard@17.1.2: - version "17.1.2" - resolved "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz" - integrity sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA== - dependencies: - eslint "^8.41.0" - eslint-config-standard "17.1.0" - eslint-config-standard-jsx "^11.0.0" - eslint-plugin-import "^2.27.5" - eslint-plugin-n "^15.7.0" - eslint-plugin-promise "^6.1.1" - eslint-plugin-react "^7.36.1" - standard-engine "^15.1.0" - version-guard "^1.1.1" - -stdin-discarder@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz" - integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== - dependencies: - bl "^5.0.0" - -stop-iteration-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" - integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== - dependencies: - es-errors "^1.3.0" - internal-slot "^1.1.0" - -streamx@^2.15.0: - version "2.22.1" - resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz" - integrity sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA== - dependencies: - fast-fifo "^1.3.2" - text-decoder "^1.1.0" - optionalDependencies: - bare-events "^2.2.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -string-argv@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz" - integrity sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^10.2.1" - strip-ansi "^7.0.1" - -string-width@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" - integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -string.prototype.matchall@^4.0.12: - version "4.0.12" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz" - integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - gopd "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - regexp.prototype.flags "^1.5.3" - set-function-name "^2.0.2" - side-channel "^1.1.0" - -string.prototype.repeat@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz" - integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trim@^1.2.10: - version "1.2.10" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" - integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-data-property "^1.1.4" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-object-atoms "^1.0.0" - has-property-descriptors "^1.0.2" - -string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" - integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1, strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -structured-headers@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/structured-headers/-/structured-headers-1.0.1.tgz" - integrity sha512-QYBxdBtA4Tl5rFPuqmbmdrS9kbtren74RTJTcs0VSQNVV5iRhJD4QlYTLD0+81SBwUQctjEQzjTRI3WG4DzICA== - -structured-headers@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/structured-headers/-/structured-headers-2.0.1.tgz" - integrity sha512-6Rob3q8opLyWHNCPeDFZU9CmrxOWzfvYUnOPE6SWXtcqI1DqQKx39CqKuQq+WsyuLNOkKvz5rQ/54ycAMU6qOg== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar-stream@3.1.7: - version "3.1.7" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - -text-decoder@^1.1.0: - version "1.2.3" - resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz" - integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== - dependencies: - b4a "^1.6.4" - -text-extensions@^2.0.0: - version "2.4.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz" - integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tinyexec@^0.3.0: - version "0.3.2" - resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz" - integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== - -tinyexec@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz" - integrity sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw== - -tmp-promise@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz" - integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== - dependencies: - tmp "^0.2.0" - -tmp@^0.2.0: - version "0.2.3" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" - integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - dependencies: - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.14" - -typed-array-byte-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" - integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.15" - reflect.getprototypeof "^1.0.9" - -typed-array-length@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" - integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - reflect.getprototypeof "^1.0.6" - -typescript@>=4.9.5, typescript@>=5: - version "5.9.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== - -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - -undici-types@~7.8.0: - version "7.8.0" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz" - integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== - -undici@7.8.0: - version "7.8.0" - resolved "https://registry.npmjs.org/undici/-/undici-7.8.0.tgz" - integrity sha512-vFv1GA99b7eKO1HG/4RPu2Is3FBTWBrmzqzO0mz+rLxN3yXkE4mqRcb8g8fHxzX4blEysrNZLqg5RbJLqX5buA== - -unicorn-magic@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz" - integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== - -unzipper@^0.10.11: - version "0.10.14" - resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz" - integrity sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -version-guard@^1.1.1: - version "1.1.3" - resolved "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz" - integrity sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ== - -vlq@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz" - integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA== - -web-streams-polyfill@^3.0.3: - version "3.3.3" - resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - dependencies: - is-bigint "^1.1.0" - is-boolean-object "^1.2.1" - is-number-object "^1.1.1" - is-string "^1.1.1" - is-symbol "^1.1.1" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - dependencies: - call-bound "^1.0.2" - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.1.0" - is-finalizationregistry "^1.1.0" - is-generator-function "^1.0.10" - is-regex "^1.2.1" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.1.0" - which-collection "^1.0.2" - which-typed-array "^1.1.16" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.19: - version "1.1.19" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^9.0.0: - version "9.0.2" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz" - integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@8.18.0: - version "8.18.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@~2.5.0: - version "2.5.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz" - integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.0.0, yargs@^17.7.2, yargs@17.7.2: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.2.1" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz" - integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== - -zod@^3.23.5, zod@^3.24.1: - version "3.25.64" - resolved "https://registry.npmjs.org/zod/-/zod-3.25.64.tgz" - integrity sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g==